@wowok/agent-mcp 3.3.1 → 3.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/dist/chain-semantics/field-capability.js +1 -1
  2. package/dist/chain-semantics/freeze-map.js +1 -1
  3. package/dist/chain-semantics/fund-flow.js +1 -1
  4. package/dist/chain-semantics/guard-verbs.js +1 -1
  5. package/dist/chain-semantics/object-graph.js +1 -1
  6. package/dist/composition/audit.d.ts +5 -0
  7. package/dist/composition/audit.js +1 -1
  8. package/dist/composition/blueprint-view.d.ts +0 -1
  9. package/dist/composition/blueprint-view.js +1 -1
  10. package/dist/composition/compile.d.ts +5 -3
  11. package/dist/composition/compile.js +1 -1
  12. package/dist/composition/inflight.d.ts +32 -4
  13. package/dist/composition/inflight.js +1 -1
  14. package/dist/config/judgment.d.ts +111 -1
  15. package/dist/config/judgment.js +1 -1
  16. package/dist/customer/industry-risks.js +1 -1
  17. package/dist/customer/user-preferences.js +1 -1
  18. package/dist/evaluation/arbitration-game.d.ts +4 -0
  19. package/dist/evaluation/arbitration-game.js +1 -1
  20. package/dist/evaluation/builtins/graph-service.js +1 -1
  21. package/dist/evaluation/builtins/graph-service.spec.js +1 -1
  22. package/dist/evaluation/game-strategy.d.ts +6 -0
  23. package/dist/evaluation/game-strategy.js +1 -1
  24. package/dist/evaluation/node-game.d.ts +4 -0
  25. package/dist/evaluation/node-game.js +1 -1
  26. package/dist/evaluation/value-risk.d.ts +8 -0
  27. package/dist/evaluation/value-risk.js +1 -0
  28. package/dist/experience/realtime-feedback.js +1 -1
  29. package/dist/extensions/business-modules.d.ts +7 -2
  30. package/dist/extensions/business-modules.js +1 -1
  31. package/dist/extensions/industry-audit.spec.js +1 -1
  32. package/dist/extensions/industry-pack.d.ts +3 -2
  33. package/dist/extensions/industry-pack.js +1 -1
  34. package/dist/extensions/modes.js +1 -1
  35. package/dist/graph/onchain/analyze.js +1 -1
  36. package/dist/graph/onchain/analyze.spec.js +1 -1
  37. package/dist/graph/onchain/expand.js +1 -1
  38. package/dist/graph/onchain/exposure.js +1 -1
  39. package/dist/graph/onchain/facet-projection.js +1 -1
  40. package/dist/graph/onchain/facet-projection.spec.js +1 -1
  41. package/dist/graph/onchain/facts.d.ts +20 -0
  42. package/dist/graph/onchain/facts.js +1 -1
  43. package/dist/graph/onchain/facts.spec.js +1 -1
  44. package/dist/graph/onchain/object-held-receipts.d.ts +20 -0
  45. package/dist/graph/onchain/object-held-receipts.js +1 -0
  46. package/dist/graph/onchain/object-held-receipts.spec.d.ts +1 -0
  47. package/dist/graph/onchain/object-held-receipts.spec.js +1 -0
  48. package/dist/graph/onchain/project-relationship.js +1 -1
  49. package/dist/graph/onchain/sdk-batch.d.ts +1 -0
  50. package/dist/graph/onchain/sdk-batch.js +1 -1
  51. package/dist/harness/index.d.ts +1 -0
  52. package/dist/harness/recover.d.ts +2 -1
  53. package/dist/harness/recover.js +1 -1
  54. package/dist/knowledge/acquisition-flywheel.js +1 -1
  55. package/dist/knowledge/allocation-ledger.d.ts +3 -1
  56. package/dist/knowledge/allocation-ledger.js +1 -1
  57. package/dist/knowledge/allocation-puzzle.d.ts +1 -0
  58. package/dist/knowledge/allocation-puzzle.js +1 -1
  59. package/dist/knowledge/allocation-risk.d.ts +1 -1
  60. package/dist/knowledge/allocation-risk.js +1 -1
  61. package/dist/knowledge/arb-fund-facts.d.ts +12 -0
  62. package/dist/knowledge/arb-fund-facts.js +1 -1
  63. package/dist/knowledge/audit-rules.d.ts +4 -3
  64. package/dist/knowledge/audit-rules.js +1 -1
  65. package/dist/knowledge/baselines/judgment-baselines.json +502 -81
  66. package/dist/knowledge/baselines/rules/allocation.json +0 -14
  67. package/dist/knowledge/baselines/rules/graph.json +4 -4
  68. package/dist/knowledge/baselines/rules/plan.json +81 -5
  69. package/dist/knowledge/baselines/rules/reward.json +1 -1
  70. package/dist/knowledge/builtin-templates.d.ts +9 -1
  71. package/dist/knowledge/builtin-templates.js +1 -1
  72. package/dist/knowledge/discount-threshold.js +1 -1
  73. package/dist/knowledge/event-semantics.js +1 -1
  74. package/dist/knowledge/game-scenarios.d.ts +21 -0
  75. package/dist/knowledge/game-scenarios.js +1 -0
  76. package/dist/knowledge/getting-started.js +1 -1
  77. package/dist/knowledge/guard-bindings.js +1 -1
  78. package/dist/knowledge/guard-design-patterns.d.ts +1 -1
  79. package/dist/knowledge/guard-design-patterns.js +1 -1
  80. package/dist/knowledge/guard-field-cognition.js +1 -1
  81. package/dist/knowledge/guard-leg-map.d.ts +5 -0
  82. package/dist/knowledge/guard-leg-map.js +1 -0
  83. package/dist/knowledge/guard-lint.js +1 -1
  84. package/dist/knowledge/guard-puzzle.js +1 -1
  85. package/dist/knowledge/guard-render.js +1 -1
  86. package/dist/knowledge/guard-risk.js +1 -1
  87. package/dist/knowledge/guard-submission-brief.d.ts +5 -0
  88. package/dist/knowledge/guard-submission-brief.js +1 -1
  89. package/dist/knowledge/guard-submission-prompt.d.ts +2 -1
  90. package/dist/knowledge/guard-submission-prompt.js +1 -1
  91. package/dist/knowledge/guard-templates.d.ts +1 -1
  92. package/dist/knowledge/guard-templates.js +1 -1
  93. package/dist/knowledge/guard-translation.js +1 -1
  94. package/dist/knowledge/index.js +1 -1
  95. package/dist/knowledge/industry-generalizer.js +1 -1
  96. package/dist/knowledge/industry-registry.js +1 -1
  97. package/dist/knowledge/industry-strategy.js +1 -1
  98. package/dist/knowledge/jsonrpc-enum.js +1 -1
  99. package/dist/knowledge/onchain-constants.d.ts +4 -2
  100. package/dist/knowledge/onchain-constants.js +1 -1
  101. package/dist/knowledge/order-ledger.d.ts +1 -1
  102. package/dist/knowledge/order-ledger.js +1 -1
  103. package/dist/knowledge/order-puzzle.d.ts +3 -0
  104. package/dist/knowledge/order-risk.d.ts +1 -1
  105. package/dist/knowledge/passport-ledger.d.ts +12 -0
  106. package/dist/knowledge/passport-ledger.js +1 -1
  107. package/dist/knowledge/payment-tracker.js +1 -1
  108. package/dist/knowledge/protocol-facts.d.ts +1 -0
  109. package/dist/knowledge/protocol-facts.js +1 -1
  110. package/dist/knowledge/repository-write-semantics.d.ts +1 -1
  111. package/dist/knowledge/repository-write-semantics.js +1 -1
  112. package/dist/knowledge/reward-ledger.js +1 -1
  113. package/dist/knowledge/reward-puzzle.d.ts +1 -1
  114. package/dist/knowledge/reward-risk.d.ts +1 -1
  115. package/dist/knowledge/scenario-modes.d.ts +2 -2
  116. package/dist/knowledge/scenario-modes.js +1 -1
  117. package/dist/knowledge/scenario-topology.js +1 -1
  118. package/dist/knowledge/service-ledger.d.ts +14 -0
  119. package/dist/knowledge/service-ledger.js +1 -1
  120. package/dist/knowledge/strategy-manuals.js +1 -1
  121. package/dist/knowledge/template-index.d.ts +19 -0
  122. package/dist/knowledge/template-index.js +1 -0
  123. package/dist/knowledge/template-loader.d.ts +36 -0
  124. package/dist/knowledge/template-loader.js +1 -1
  125. package/dist/knowledge/template-registry.js +1 -1
  126. package/dist/knowledge/template-scanner.d.ts +11 -0
  127. package/dist/knowledge/template-scanner.js +1 -1
  128. package/dist/knowledge/tool-constraints.js +1 -1
  129. package/dist/knowledge/workflow-guidance.d.ts +2 -0
  130. package/dist/knowledge/workflow-guidance.js +1 -1
  131. package/dist/monitor/MonitorLoop.js +1 -1
  132. package/dist/participation/allocation-advice.d.ts +8 -1
  133. package/dist/participation/allocation-advice.js +1 -1
  134. package/dist/participation/game-context.d.ts +25 -0
  135. package/dist/participation/game-context.js +1 -0
  136. package/dist/participation/node-action-advisor.d.ts +64 -0
  137. package/dist/participation/node-action-advisor.js +1 -0
  138. package/dist/participation/radar-core.d.ts +1 -0
  139. package/dist/participation/radar-core.js +1 -1
  140. package/dist/persona/defaults.js +1 -1
  141. package/dist/persona/topology-focus.js +1 -1
  142. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  143. package/dist/playbooks/service-build/game-theory.d.ts +4 -1
  144. package/dist/playbooks/service-build/game-theory.js +1 -1
  145. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  146. package/dist/playbooks/service-build/merchant-guide.d.ts +26 -1
  147. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  148. package/dist/playbooks/service-build/migration-planner.d.ts +2 -2
  149. package/dist/playbooks/service-build/migration-planner.js +1 -1
  150. package/dist/playbooks/service-build/object-panorama.d.ts +13 -1
  151. package/dist/playbooks/service-build/object-panorama.js +1 -1
  152. package/dist/playbooks/service-build/participation-radar.js +1 -1
  153. package/dist/playbooks/service-build/pipeline-actions.d.ts +4 -1
  154. package/dist/playbooks/service-build/pipeline-actions.js +1 -1
  155. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  156. package/dist/playbooks/service-build/service-panorama.d.ts +12 -0
  157. package/dist/playbooks/service-build/service-panorama.js +1 -1
  158. package/dist/playbooks/service-build/service-quote.js +1 -1
  159. package/dist/playbooks/service-build/service-quote.spec.js +1 -1
  160. package/dist/relationship/derivation.d.ts +1 -1
  161. package/dist/review/index.js +1 -1
  162. package/dist/review/repository.js +1 -1
  163. package/dist/role/intent.d.ts +23 -0
  164. package/dist/role/intent.js +1 -0
  165. package/dist/safety/confirm-gate.js +1 -1
  166. package/dist/schema/benchmark-migration/index.d.ts +39 -0
  167. package/dist/schema/benchmark-migration/index.js +1 -1
  168. package/dist/schema/call/allocation.d.ts +49 -3
  169. package/dist/schema/call/allocation.js +1 -1
  170. package/dist/schema/call/arbitration.js +1 -1
  171. package/dist/schema/call/base.d.ts +52 -0
  172. package/dist/schema/call/base.js +1 -1
  173. package/dist/schema/call/bridge.d.ts +3 -0
  174. package/dist/schema/call/contact.js +1 -1
  175. package/dist/schema/call/error-codes.d.ts +1 -1
  176. package/dist/schema/call/error-codes.js +1 -1
  177. package/dist/schema/call/guard.js +1 -1
  178. package/dist/schema/call/handler.js +1 -1
  179. package/dist/schema/call/machine.d.ts +10 -0
  180. package/dist/schema/call/machine.js +1 -1
  181. package/dist/schema/call/order.d.ts +2 -0
  182. package/dist/schema/call/order.js +1 -1
  183. package/dist/schema/call/progress.d.ts +6 -3
  184. package/dist/schema/call/progress.js +1 -1
  185. package/dist/schema/call/repository.d.ts +4 -0
  186. package/dist/schema/call/repository.js +1 -1
  187. package/dist/schema/call/reward.d.ts +2 -2
  188. package/dist/schema/call/reward.js +1 -1
  189. package/dist/schema/call/semantic.d.ts +6 -0
  190. package/dist/schema/call/semantic.js +1 -1
  191. package/dist/schema/call/service.d.ts +42 -4
  192. package/dist/schema/call/service.js +1 -1
  193. package/dist/schema/common/index.js +1 -1
  194. package/dist/schema/goal/index.d.ts +54 -0
  195. package/dist/schema/goal/planning.d.ts +86 -0
  196. package/dist/schema/goal/planning.js +1 -1
  197. package/dist/schema/keeper/index.d.ts +2 -0
  198. package/dist/schema/local/index.d.ts +72 -0
  199. package/dist/schema/local/index.js +1 -1
  200. package/dist/schema/messenger/index.d.ts +2 -0
  201. package/dist/schema/operations.d.ts +46 -5
  202. package/dist/schema/operations.js +1 -1
  203. package/dist/schema/persona/index.d.ts +484 -0
  204. package/dist/schema/query/bi.d.ts +4 -0
  205. package/dist/schema/query/bi.js +1 -1
  206. package/dist/schema/query/index.d.ts +84 -60
  207. package/dist/schema/query/index.js +1 -1
  208. package/dist/schema/schema-version.d.ts +1 -1
  209. package/dist/schema/schema-version.js +1 -1
  210. package/dist/schema-query-impl/index.js +1 -1
  211. package/dist/schemas/account_operation.output.json +41 -10
  212. package/dist/schemas/account_operation.schema.json +1 -1
  213. package/dist/schemas/benchmark_migration_operation.output.json +8 -5
  214. package/dist/schemas/benchmark_migration_operation.schema.json +91 -3
  215. package/dist/schemas/bridge_operation.output.json +13 -7
  216. package/dist/schemas/goal_operation.schema.json +94 -0
  217. package/dist/schemas/index.json +1 -1
  218. package/dist/schemas/keeper_operation.output.json +12 -7
  219. package/dist/schemas/local_cache_operation.output.json +34 -7
  220. package/dist/schemas/local_cache_operation.schema.json +16 -1
  221. package/dist/schemas/local_history_operation.output.json +13 -7
  222. package/dist/schemas/local_info_operation.output.json +13 -7
  223. package/dist/schemas/local_info_operation.schema.json +5 -1
  224. package/dist/schemas/local_mark_operation.output.json +13 -7
  225. package/dist/schemas/messenger_operation.output.json +12 -7
  226. package/dist/schemas/monitor_events.output.json +12 -7
  227. package/dist/schemas/monitor_subscription.output.json +12 -7
  228. package/dist/schemas/onchain_events.output.json +67 -18
  229. package/dist/schemas/onchain_events.schema.json +4 -0
  230. package/dist/schemas/onchain_operations.output.json +81 -24
  231. package/dist/schemas/onchain_operations.schema.json +531 -126
  232. package/dist/schemas/onchain_operations_allocation.schema.json +294 -6
  233. package/dist/schemas/onchain_operations_arbitration.schema.json +3 -3
  234. package/dist/schemas/onchain_operations_contact.schema.json +2 -2
  235. package/dist/schemas/onchain_operations_demand.schema.json +3 -3
  236. package/dist/schemas/onchain_operations_gen_passport.schema.json +1 -1
  237. package/dist/schemas/onchain_operations_guard.schema.json +99 -63
  238. package/dist/schemas/onchain_operations_machine.schema.json +10 -1
  239. package/dist/schemas/onchain_operations_order.schema.json +8 -4
  240. package/dist/schemas/onchain_operations_progress.schema.json +8 -4
  241. package/dist/schemas/onchain_operations_proof.schema.json +1 -1
  242. package/dist/schemas/onchain_operations_repository.schema.json +6 -2
  243. package/dist/schemas/onchain_operations_reward.schema.json +8 -8
  244. package/dist/schemas/onchain_operations_service.schema.json +81 -21
  245. package/dist/schemas/onchain_operations_treasury.schema.json +7 -7
  246. package/dist/schemas/onchain_table_data.output.json +16 -7
  247. package/dist/schemas/persona_operation.output.json +1387 -0
  248. package/dist/schemas/persona_operation.schema.json +219 -0
  249. package/dist/schemas/query_toolkit.output.json +115 -64
  250. package/dist/schemas/query_toolkit.schema.json +8 -0
  251. package/dist/schemas/workflow_operation.schema.json +1 -1
  252. package/dist/tools/handlers/benchmark-migration.js +1 -1
  253. package/dist/tools/handlers/bridge.js +1 -1
  254. package/dist/tools/handlers/config.js +1 -1
  255. package/dist/tools/handlers/dispatch-expectations.js +1 -1
  256. package/dist/tools/handlers/file-export.js +1 -1
  257. package/dist/tools/handlers/industry-pack.d.ts +1 -0
  258. package/dist/tools/handlers/industry-pack.js +1 -1
  259. package/dist/tools/handlers/local.js +1 -1
  260. package/dist/tools/handlers/messenger.js +1 -1
  261. package/dist/tools/handlers/onchain-name-registration.d.ts +11 -0
  262. package/dist/tools/handlers/onchain-name-registration.js +1 -1
  263. package/dist/tools/handlers/onchain.d.ts +28 -0
  264. package/dist/tools/handlers/onchain.js +1 -1
  265. package/dist/tools/handlers/query.js +1 -1
  266. package/dist/tools/handlers/review-chain.d.ts +1 -1
  267. package/dist/tools/handlers/review-chain.js +1 -1
  268. package/dist/tools/handlers/schema-query.js +1 -1
  269. package/dist/tools/handlers/workflow.js +1 -1
  270. package/dist/tools/move-fn-index.gen.js +1 -1
  271. package/dist/tools/registry/agent.js +1 -1
  272. package/dist/tools/registry/local.js +1 -1
  273. package/dist/tools/registry/onchain.js +1 -1
  274. package/dist/tools/registry/query.js +1 -1
  275. package/dist/tools/wip-deploy-assist.js +1 -1
  276. package/dist/tools/wrap.js +1 -1
  277. package/package.json +3 -3
@@ -1 +1 @@
1
- import{EDGE_SCHEMAS,EDGE_SCHEMA_BY_ID}from'./edge-schema.js';import{extractCoinType,extractEventRefs,extractObjectEdges,extractReverseRefs,extractTableRefs,inferObjectType,REVERSE_GROUP_WILDCARD}from'./extract.js';import{mergeBudget}from'./dataplane.js';import{deriveOrderCompletion,terminalNamesOfEdges}from'./order-status.js';import{LINKER_RING_LIMIT as a98a}from'./sdk-batch.js';import{wowAddressKind}from'@wowok/wowok';function readStats(a){const b=a;if(b['stats'])return{'batches':b['stats']['batches'],'byChannel':{...b['stats']['byChannel']},'dedupHits':b['stats']['dedupHits']};if(b['batches'])return{'batches':Object['values'](b['batches'])['reduce']((c,d)=>c+d,0x0),'byChannel':{...b['batches']},'dedupHits':b['dedupHits']??0x0};return{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0};}function isEoa(a){return wowAddressKind(a)==='user';}function isWfNodeId(a){return a['includes']('::node::');}class Gate{['wl'];constructor(a){this['wl']=a;}['allows'](a,b){if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['schemas'])return this['wl']['schemas']['includes'](a['id']);if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!![];}['allowsTable'](a,b){if(a['read']['kind']!=='table')return![];if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!!this['wl']['tableEdges']?.['includes'](a['id']);}['allowsEvent'](a,b){if(a['read']['kind']!=='event')return![];if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!!this['wl']['eventEdges']?.['includes'](a['id']);}['effectiveMaxHops'](a){const b=a['maxHops'],c=this['wl']['schemaHops']?.[a['id']];if(b===undefined)return c;if(c===undefined)return b;return Math['min'](b,c);}}class GraphBuilder{['graph'];['edgeIds']=new Set();['budget'];['exhausted']={};constructor(a,b,c){this['budget']=c,this['graph']={'network':a,'seed':b,'builtAt':Date['now'](),'nodes':new Map(),'edges':[],'out':new Map(),'inc':new Map(),'gaps':[],'truncations':[],'rpcReport':{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0},'budgetExhausted':{}};}['addSeed'](a){const b=inferObjectType(a),c={'id':a,'kind':isWfNodeId(a)?'wfnode':isEoa(a)?'eoa':'object','objectType':b??undefined,'state':'seed','origins':[],'depth':0x0};return this['graph']['nodes']['set'](a,c),c;}['addNode'](a,b,c){const d=this['graph']['nodes']['get'](a);if(d){if(c)d['origins']['push']({'via':c['schema'],'from':c['from'],'depth':b});return d;}if(this['graph']['nodes']['size']>=this['budget']['maxNodes'])return this['exhausted']['nodes']=!![],undefined;const e=isWfNodeId(a),f=e?undefined:inferObjectType(a),g={'id':a,'kind':e?'wfnode':isEoa(a)?'eoa':'object','objectType':f??undefined,'state':e?'stub':'seed','origins':c?[{'via':c['schema'],'from':c['from'],'depth':b}]:[],'depth':b};return this['graph']['nodes']['set'](a,g),g;}['addEdge'](a,b,c,d,e){const f=c['to'],g=c['key']?'|'+c['key']:'',h=a['id']+'|'+b+'→'+f+g;if(this['edgeIds']['has'](h))return;this['edgeIds']['add'](h);const i={'id':h,'schema':a['id'],'family':a['family'],'from':b,'to':f,'retention':a['retention'],'observedAt':d,'payload':c['payload'],'truncated':e||a['retention']==='bounded_window','key':c['key']};this['graph']['edges']['push'](i),pushMap(this['graph']['out'],b,i),pushMap(this['graph']['inc'],f,i);}['markTruncation'](a){this['graph']['truncations']['push'](a);}['finalize'](a){return this['graph']['rpcReport']=readStats(a),this['graph']['budgetExhausted']=this['exhausted'],this['graph'];}}function pushMap(a,b,c){const d=a['get'](b);if(d)d['push'](c);else a['set'](b,[c]);}export async function expandTopology(a,c){const d=c['seed']['toLowerCase'](),e=mergeBudget(c['budget']),f=new Gate(c['edges']??{}),h=new GraphBuilder(c['network'],d,e);h['addSeed'](d);const i=new Set(),j=new Set(),l=new Set(),m=new Map(),n=new Set();let o=new Set([d]);for(let p=0x0;p<=e['maxDepth'];p++){if(o['size']===0x0)break;if(h['exhausted']['nodes'])break;const q=Date['now'](),r=new Map(),t=(D,E)=>{const F=r['get'](D);if(F)return F;const G=new Map();r['set'](D,G);const H=h['graph']['nodes']['get'](D);if(H&&H['origins']['length']>0x0&&!E['has'](D)){E['add'](D);for(const I of H['origins']){if(!I['via']||!I['from']||E['has'](I['from']))continue;const J=t(I['from'],E);for(const [L,M]of J){if(M<(G['get'](L)??Infinity))G['set'](L,M);}const K=(J['get'](I['via'])??0x0)+0x1;if(K<(G['get'](I['via'])??Infinity))G['set'](I['via'],K);}E['delete'](D);}return G;},u=[...o]['filter'](D=>{const E=h['graph']['nodes']['get'](D);return E['kind']==='object'&&(E['state']==='seed'||E['state']==='stub')&&!i['has'](D);}),v=new Set();if(u['length']>0x0){const D=await a['getObjects'](u);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];for(const E of u){const F=h['graph']['nodes']['get'](E),G=lookupMapLower(D,E);i['add'](E);if(!G){F['state']='error',F['error']='not_found_or_failed',h['graph']['gaps']['push'](E);continue;}F['state']='fetched',F['raw']=G,F['objectType']=String(G['type']??F['objectType']??inferObjectType(E)??''),F['coinType']=extractCoinType(G['type_raw']),v['add'](E);}}const w=[];for(const H of v){const I=h['graph']['nodes']['get'](H);if(!I['objectType']||!I['raw'])continue;for(const J of extractObjectEdges(I['objectType'],I['raw'])){const K=EDGE_SCHEMA_BY_ID['get'](J['schemaId']);if(!K||!f['allows'](K,p))continue;w['push']({'schema':K,'sourceId':H,'refs':J['refs'],'observed':J['refs']['length']});}}const x=[...v]['filter'](L=>{const M=h['graph']['nodes']['get'](L);return EDGE_SCHEMAS['some'](N=>N['source']===M['objectType']&&N['read']['kind']==='table');});for(const L of x){const M=h['graph']['nodes']['get'](L),N=EDGE_SCHEMAS['filter'](P=>P['source']===M['objectType']&&P['read']['kind']==='table'&&f['allowsTable'](P,p)),O=new Map();for(const P of N){const Q=P['read']['rowType'],R=O['get'](Q)??[];R['push'](P),O['set'](Q,R);}for(const [S,T]of O){const U=L+'|'+S;if(l['has'](U))continue;l['add'](U);const V=Math['max'](...T['map'](a0=>e['perKindCaps'][a0['id']]??e['maxFanoutPerNode']));let W,X=![];try{const a0=await a['getTable'](L,{'maxItems':V});if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];W=a0['items'],X=a0['truncated'];}catch{h['graph']['gaps']['push'](L+'#'+S);continue;}const Y=new Set(T['map'](a1=>a1['id'])),Z=extractTableRefs(S,L,W)['filter'](a1=>{const a2=EDGE_SCHEMA_BY_ID['get'](a1['schemaId']);return a2['read']['kind']==='derived'||Y['has'](a1['schemaId']);});for(const a1 of Z){const a2=EDGE_SCHEMA_BY_ID['get'](a1['schemaId']);let a3=a1['refs'];a2['family']==='M'&&M['coinType']&&(a3=a3['map'](a4=>({...a4,'payload':{'coinType':M['coinType'],...a4['payload']}}))),w['push']({'schema':a2,'sourceId':L,'refs':a3,'observed':a3['length']});}X&&h['markTruncation']({'nodeId':L,'schema':T[0x0]['id'],'observed':W['length'],'limit':V,'reason':'table_page'});}}const y=[...o]['filter'](a4=>{const a5=h['graph']['nodes']['get'](a4);return a5['kind']!=='wfnode'&&(a5['kind']==='eoa'||a5['state']==='fetched');}),z=new Map(),A=new Map();for(const a4 of y){const a5=h['graph']['nodes']['get'](a4);for(const a6 of EDGE_SCHEMAS){if(a6['read']['kind']!=='reverse'||!f['allows'](a6,p))continue;if(!sourceMatches(a6['source'],a5))continue;const a7=a6['read']['parent'],a8=a4+'|'+a7;if(j['has'](a8))continue;if(!z['has'](a7))z['set'](a7,[]);z['get'](a7)['push'](a4);const a9=a4+'|'+a7+'|schema',aa=A['get'](a9)??[];aa['push'](a6),A['set'](a9,aa);}}for(const [ab,ac]of z){for(const ae of ac)j['add'](ae+'|'+ab);let ad=new Map();try{ad=await a['getKeyedFields'](ab,ac);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];}catch{h['graph']['gaps']['push']('reverse:'+ab);continue;}for(const af of ac){const ag=A['get'](af+'|'+ab+'|schema')??[],ah=lookupMapLower(ad,af);if(!ah)continue;const ai=extractReverseRefs(ab,ah['data']??ah);for(const aj of ag){const ak=aj['read'];for(const al of ai){if(al['schemaId']!==REVERSE_GROUP_WILDCARD&&al['schemaId']!==aj['id'])continue;let am=al['refs']['map'](an=>an['to']?an:{...an,'to':af});ak['kind']==='reverse'&&ak['filterType']&&(am=am['filter'](an=>inferObjectType(an['to'])===ak['filterType']));if(am['length']===0x0)continue;w['push']({'schema':aj,'sourceId':af,'refs':am,'observed':am['length']});}}}}for(const an of EDGE_SCHEMAS){const ao=an['read'];if(ao['kind']!=='event'||!f['allowsEvent'](an,p))continue;const ap=[...o]['filter'](ar=>{if(n['has'](ar+'|'+an['id']))return![];return sourceMatches(an['source'],h['graph']['nodes']['get'](ar));});if(ap['length']===0x0)continue;let aq=m['get'](ao['eventType']);if(!aq){aq={'events':[],'truncated':![],'failed':![]};try{const ar=await a['getEvents'](ao['eventType'],{'maxPages':e['maxEventPages']});if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];aq['events']=ar['events'],aq['truncated']=ar['truncated'],ar['truncated']&&ar['events']['length']===0x0&&(aq['failed']=!![],h['graph']['gaps']['push']('events:'+ao['eventType']));}catch{aq['failed']=!![],h['graph']['gaps']['push']('events:'+ao['eventType']);}m['set'](ao['eventType'],aq);}if(aq['failed']){for(const as of ap)n['add'](as+'|'+an['id']);continue;}if(aq['truncated']){h['exhausted']['eventPages']=!![];for(const at of ap){h['markTruncation']({'nodeId':at,'schema':an['id'],'observed':aq['events']['length'],'limit':e['maxEventPages'],'reason':'event_pages'});}}for(const au of ap){n['add'](au+'|'+an['id']);const av=extractEventRefs(ao,au,aq['events']);if(av['length']===0x0)continue;w['push']({'schema':an,'sourceId':au,'refs':av,'observed':av['length'],'truncated':aq['truncated']});}}const B=new Set(),C=new Map();for(const aw of w){const ax=e['perKindCaps'][aw['schema']['id']]??e['maxFanoutPerNode'],ay=C['get'](aw['sourceId'])??0x0,az=Math['max'](0x0,e['maxFanoutPerNode']-ay),aA=Math['min'](ax,az),aB=aw['refs']['slice'](0x0,aA);aw['refs']['length']>aA&&h['markTruncation']({'nodeId':aw['sourceId'],'schema':aw['schema']['id'],'observed':aw['refs']['length'],'limit':a98a,'reason':'fanout'});const aC=new Map();for(const aD of aB){const aE=aD['from']??aw['sourceId'],aF=isWfNodeId(aD['to'])?p:p+0x1,aG=h['graph']['nodes']['has'](aD['to']),aH=f['effectiveMaxHops'](aw['schema']);if(aH!==undefined){const aJ=(t(aE,new Set())['get'](aw['schema']['id'])??0x0)+0x1;if(aJ>aH&&!aG){aC['set'](aE,(aC['get'](aE)??0x0)+0x1);continue;}}if(aF>e['maxDepth']&&!aG){h['exhausted']['depth']=!![];continue;}const aI=h['addNode'](aD['to'],Math['min'](aF,e['maxDepth']),{'schema':aw['schema']['id'],'from':aE});if(!aI)break;h['addEdge'](aw['schema'],aE,aD,q,aw['truncated']===!![]||aw['refs']['length']>aA),C['set'](aw['sourceId'],ay+0x1);if(!isWfNodeId(aD['to'])&&aF<=e['maxDepth'])B['add'](aD['to']);}for(const [aK,aL]of aC){h['markTruncation']({'nodeId':aK,'schema':aw['schema']['id'],'observed':aL,'limit':f['effectiveMaxHops'](aw['schema'])??0x0,'reason':'schema_hops'});}}if(h['exhausted']['rpcs']){h['graph']['gaps']['push']('budget:maxRpcs');break;}o=B;}return h['finalize'](a);}function sourceMatches(a,b){if(a==='ANY')return!![];if(a==='EOA')return b['kind']==='eoa';return b['objectType']===a;}function lookupMapLower(a,b){const c=a['get'](b);if(c!==undefined)return c;for(const [d,e]of a)if(d['toLowerCase']()===b)return e;return undefined;}export function orderCompletionInGraph(a,b){const c=a['nodes']['get'](b['toLowerCase']()),d=c?.['raw']?.['data']??c?.['raw']??{},e=String(d['machine']??''),f=String(d['progress']??''),g=a['nodes']['get'](f['toLowerCase']()),h=String((g?.['raw']?.['data']??g?.['raw']??{})['current']??'');let i=null;if(e){const j=e['toLowerCase']()+'::node::',k=a['edges']['filter'](l=>l['schema']==='wf.transition'&&l['from']['startsWith'](j))['map'](l=>({'node':l['payload']?.['node'],'prev_node':l['payload']?.['prevNode']}));if(k['length']>0x0)i=terminalNamesOfEdges(k);}return deriveOrderCompletion({'machine':e||null,'progress':f||null,'currentNode':h||null,'terminalNames':i});}
1
+ import{EDGE_SCHEMAS,EDGE_SCHEMA_BY_ID}from'./edge-schema.js';import{extractCoinType,extractEventRefs,extractObjectEdges,extractReverseRefs,extractTableRefs,inferObjectType,REVERSE_GROUP_WILDCARD}from'./extract.js';import{mergeBudget}from'./dataplane.js';import{deriveOrderCompletion,terminalNamesOfEdges}from'./order-status.js';import{LINKER_RING_LIMIT as a99a}from'./sdk-batch.js';import{wowAddressKind}from'@wowok/wowok';function readStats(a){const b=a;if(b['stats'])return{'batches':b['stats']['batches'],'byChannel':{...b['stats']['byChannel']},'dedupHits':b['stats']['dedupHits']};if(b['batches'])return{'batches':Object['values'](b['batches'])['reduce']((c,d)=>c+d,0x0),'byChannel':{...b['batches']},'dedupHits':b['dedupHits']??0x0};return{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0};}function isEoa(a){return wowAddressKind(a)==='user';}function isWfNodeId(a){return a['includes']('::node::');}class Gate{['wl'];constructor(a){this['wl']=a;}['allows'](a,b){if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['schemas'])return this['wl']['schemas']['includes'](a['id']);if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!![];}['allowsTable'](a,b){if(a['read']['kind']!=='table')return![];if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!!this['wl']['tableEdges']?.['includes'](a['id']);}['allowsEvent'](a,b){if(a['read']['kind']!=='event')return![];if(this['wl']['deny']?.['includes'](a['id']))return![];const c=this['wl']['familyDepths']?.[a['family']];if(c!==undefined&&b>=c)return![];if(this['wl']['families']&&!this['wl']['families']['includes'](a['family']))return![];return!!this['wl']['eventEdges']?.['includes'](a['id']);}['effectiveMaxHops'](a){const b=a['maxHops'],c=this['wl']['schemaHops']?.[a['id']];if(b===undefined)return c;if(c===undefined)return b;return Math['min'](b,c);}}class GraphBuilder{['graph'];['edgeIds']=new Set();['budget'];['exhausted']={};constructor(a,b,c){this['budget']=c,this['graph']={'network':a,'seed':b,'builtAt':Date['now'](),'nodes':new Map(),'edges':[],'out':new Map(),'inc':new Map(),'gaps':[],'truncations':[],'rpcReport':{'batches':0x0,'byChannel':{'objects':0x0,'keyedFields':0x0,'tables':0x0,'events':0x0},'dedupHits':0x0},'budgetExhausted':{}};}['addSeed'](a){const b=inferObjectType(a),c={'id':a,'kind':isWfNodeId(a)?'wfnode':isEoa(a)?'eoa':'object','objectType':b??undefined,'state':'seed','origins':[],'depth':0x0};return this['graph']['nodes']['set'](a,c),c;}['addNode'](a,b,c){const d=this['graph']['nodes']['get'](a);if(d){if(c)d['origins']['push']({'via':c['schema'],'from':c['from'],'depth':b});return d;}if(this['graph']['nodes']['size']>=this['budget']['maxNodes'])return this['exhausted']['nodes']=!![],undefined;const e=isWfNodeId(a),f=e?undefined:inferObjectType(a),g={'id':a,'kind':e?'wfnode':isEoa(a)?'eoa':'object','objectType':f??undefined,'state':e?'stub':'seed','origins':c?[{'via':c['schema'],'from':c['from'],'depth':b}]:[],'depth':b};return this['graph']['nodes']['set'](a,g),g;}['addEdge'](a,b,c,d,e){const f=c['to'],g=c['key']?'|'+c['key']:'',h=a['id']+'|'+b+'→'+f+g;if(this['edgeIds']['has'](h))return;this['edgeIds']['add'](h);const i={'id':h,'schema':a['id'],'family':a['family'],'from':b,'to':f,'retention':a['retention'],'observedAt':d,'payload':c['payload'],'truncated':e||a['retention']==='bounded_window','key':c['key']};this['graph']['edges']['push'](i),pushMap(this['graph']['out'],b,i),pushMap(this['graph']['inc'],f,i);}['markTruncation'](a){this['graph']['truncations']['push'](a);}['finalize'](a){return this['graph']['rpcReport']=readStats(a),this['graph']['budgetExhausted']=this['exhausted'],this['graph'];}}function pushMap(a,b,c){const d=a['get'](b);if(d)d['push'](c);else a['set'](b,[c]);}export async function expandTopology(a,c){const d=c['seed']['toLowerCase'](),e=mergeBudget(c['budget']),f=new Gate(c['edges']??{}),h=new GraphBuilder(c['network'],d,e);h['addSeed'](d);const i=new Set(),j=new Set(),l=new Set(),m=new Map(),n=new Set();let o=new Set([d]);for(let p=0x0;p<=e['maxDepth'];p++){if(o['size']===0x0)break;if(h['exhausted']['nodes'])break;const q=Date['now'](),r=new Map(),t=(D,E)=>{const F=r['get'](D);if(F)return F;const G=new Map();r['set'](D,G);const H=h['graph']['nodes']['get'](D);if(H&&H['origins']['length']>0x0&&!E['has'](D)){E['add'](D);for(const I of H['origins']){if(!I['via']||!I['from']||E['has'](I['from']))continue;const J=t(I['from'],E);for(const [L,M]of J){if(M<(G['get'](L)??Infinity))G['set'](L,M);}const K=(J['get'](I['via'])??0x0)+0x1;if(K<(G['get'](I['via'])??Infinity))G['set'](I['via'],K);}E['delete'](D);}return G;},u=[...o]['filter'](D=>{const E=h['graph']['nodes']['get'](D);return E['kind']==='object'&&(E['state']==='seed'||E['state']==='stub')&&!i['has'](D);}),v=new Set();if(u['length']>0x0){const D=await a['getObjects'](u);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];for(const E of u){const F=h['graph']['nodes']['get'](E),G=lookupMapLower(D,E);i['add'](E);if(!G){F['state']='error',F['error']='not_found_or_failed',h['graph']['gaps']['push'](E);continue;}F['state']='fetched',F['raw']=G,F['objectType']=String(G['type']??F['objectType']??inferObjectType(E)??''),F['coinType']=extractCoinType(G['type_raw']),v['add'](E);}}const w=[];for(const H of v){const I=h['graph']['nodes']['get'](H);if(!I['objectType']||!I['raw'])continue;for(const J of extractObjectEdges(I['objectType'],I['raw'])){const K=EDGE_SCHEMA_BY_ID['get'](J['schemaId']);if(!K||!f['allows'](K,p))continue;w['push']({'schema':K,'sourceId':H,'refs':J['refs'],'observed':J['refs']['length']});}}const x=[...v]['filter'](L=>{const M=h['graph']['nodes']['get'](L);return EDGE_SCHEMAS['some'](N=>N['source']===M['objectType']&&N['read']['kind']==='table');});for(const L of x){const M=h['graph']['nodes']['get'](L),N=EDGE_SCHEMAS['filter'](P=>P['source']===M['objectType']&&P['read']['kind']==='table'&&f['allowsTable'](P,p)),O=new Map();for(const P of N){const Q=P['read']['rowType'],R=O['get'](Q)??[];R['push'](P),O['set'](Q,R);}for(const [S,T]of O){const U=L+'|'+S;if(l['has'](U))continue;l['add'](U);const V=Math['max'](...T['map'](a0=>e['perKindCaps'][a0['id']]??e['maxFanoutPerNode']));let W,X=![];try{const a0=await a['getTable'](L,{'maxItems':V});if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];W=a0['items'],X=a0['truncated'];}catch{h['graph']['gaps']['push'](L+'#'+S);continue;}const Y=new Set(T['map'](a1=>a1['id'])),Z=extractTableRefs(S,L,W)['filter'](a1=>{const a2=EDGE_SCHEMA_BY_ID['get'](a1['schemaId']);return a2['read']['kind']==='derived'||Y['has'](a1['schemaId']);});for(const a1 of Z){const a2=EDGE_SCHEMA_BY_ID['get'](a1['schemaId']);let a3=a1['refs'];a2['family']==='M'&&M['coinType']&&(a3=a3['map'](a4=>({...a4,'payload':{'coinType':M['coinType'],...a4['payload']}}))),w['push']({'schema':a2,'sourceId':L,'refs':a3,'observed':a3['length']});}X&&h['markTruncation']({'nodeId':L,'schema':T[0x0]['id'],'observed':W['length'],'limit':V,'reason':'table_page'});}}const y=[...o]['filter'](a4=>{const a5=h['graph']['nodes']['get'](a4);return a5['kind']!=='wfnode'&&(a5['kind']==='eoa'||a5['state']==='fetched');}),z=new Map(),A=new Map();for(const a4 of y){const a5=h['graph']['nodes']['get'](a4);for(const a6 of EDGE_SCHEMAS){if(a6['read']['kind']!=='reverse'||!f['allows'](a6,p))continue;if(!sourceMatches(a6['source'],a5))continue;const a7=a6['read']['parent'],a8=a4+'|'+a7;if(j['has'](a8))continue;if(!z['has'](a7))z['set'](a7,[]);z['get'](a7)['push'](a4);const a9=a4+'|'+a7+'|schema',aa=A['get'](a9)??[];aa['push'](a6),A['set'](a9,aa);}}for(const [ab,ac]of z){for(const ae of ac)j['add'](ae+'|'+ab);let ad=new Map();try{ad=await a['getKeyedFields'](ab,ac);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];}catch{h['graph']['gaps']['push']('reverse:'+ab);continue;}for(const af of ac){const ag=A['get'](af+'|'+ab+'|schema')??[],ah=lookupMapLower(ad,af);if(!ah)continue;const ai=extractReverseRefs(ab,ah['data']??ah);for(const aj of ag){const ak=aj['read'];for(const al of ai){if(al['schemaId']!==REVERSE_GROUP_WILDCARD&&al['schemaId']!==aj['id'])continue;let am=al['refs']['map'](an=>an['to']?an:{...an,'to':af});ak['kind']==='reverse'&&ak['filterType']&&(am=am['filter'](an=>inferObjectType(an['to'])===ak['filterType']));if(am['length']===0x0)continue;w['push']({'schema':aj,'sourceId':af,'refs':am,'observed':am['length']});}}}}for(const an of EDGE_SCHEMAS){const ao=an['read'];if(ao['kind']!=='event'||!f['allowsEvent'](an,p))continue;const ap=[...o]['filter'](ar=>{if(n['has'](ar+'|'+an['id']))return![];return sourceMatches(an['source'],h['graph']['nodes']['get'](ar));});if(ap['length']===0x0)continue;let aq=m['get'](ao['eventType']);if(!aq){aq={'events':[],'truncated':![],'failed':![]};try{const ar=await a['getEvents'](ao['eventType'],{'maxPages':e['maxEventPages']});if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];aq['events']=ar['events'],aq['truncated']=ar['truncated'],ar['truncated']&&ar['events']['length']===0x0&&(aq['failed']=!![],h['graph']['gaps']['push']('events:'+ao['eventType']));}catch{aq['failed']=!![],h['graph']['gaps']['push']('events:'+ao['eventType']);}m['set'](ao['eventType'],aq);}if(aq['failed']){for(const as of ap)n['add'](as+'|'+an['id']);continue;}if(aq['truncated']){h['exhausted']['eventPages']=!![];for(const at of ap){h['markTruncation']({'nodeId':at,'schema':an['id'],'observed':aq['events']['length'],'limit':e['maxEventPages'],'reason':'event_pages'});}}for(const au of ap){n['add'](au+'|'+an['id']);const av=extractEventRefs(ao,au,aq['events']);if(av['length']===0x0)continue;w['push']({'schema':an,'sourceId':au,'refs':av,'observed':av['length'],'truncated':aq['truncated']});}}const B=new Set(),C=new Map();for(const aw of w){const ax=e['perKindCaps'][aw['schema']['id']]??e['maxFanoutPerNode'],ay=C['get'](aw['sourceId'])??0x0,az=Math['max'](0x0,e['maxFanoutPerNode']-ay),aA=Math['min'](ax,az),aB=aw['refs']['slice'](0x0,aA);aw['refs']['length']>aA&&h['markTruncation']({'nodeId':aw['sourceId'],'schema':aw['schema']['id'],'observed':aw['refs']['length'],'limit':a99a,'reason':'fanout'});const aC=new Map();for(const aD of aB){const aE=aD['from']??aw['sourceId'],aF=isWfNodeId(aD['to'])?p:p+0x1,aG=h['graph']['nodes']['has'](aD['to']),aH=f['effectiveMaxHops'](aw['schema']);if(aH!==undefined){const aJ=(t(aE,new Set())['get'](aw['schema']['id'])??0x0)+0x1;if(aJ>aH&&!aG){aC['set'](aE,(aC['get'](aE)??0x0)+0x1);continue;}}if(aF>e['maxDepth']&&!aG){h['exhausted']['depth']=!![];continue;}const aI=h['addNode'](aD['to'],Math['min'](aF,e['maxDepth']),{'schema':aw['schema']['id'],'from':aE});if(!aI)break;h['addEdge'](aw['schema'],aE,aD,q,aw['truncated']===!![]||aw['refs']['length']>aA),C['set'](aw['sourceId'],ay+0x1);if(!isWfNodeId(aD['to'])&&aF<=e['maxDepth'])B['add'](aD['to']);}for(const [aK,aL]of aC){h['markTruncation']({'nodeId':aK,'schema':aw['schema']['id'],'observed':aL,'limit':f['effectiveMaxHops'](aw['schema'])??0x0,'reason':'schema_hops'});}}if(h['exhausted']['rpcs']){h['graph']['gaps']['push']('budget:maxRpcs');break;}o=B;}return h['finalize'](a);}function sourceMatches(a,b){if(a==='ANY')return!![];if(a==='EOA')return b['kind']==='eoa';return b['objectType']===a;}function lookupMapLower(a,b){const c=a['get'](b);if(c!==undefined)return c;for(const [d,e]of a)if(d['toLowerCase']()===b)return e;return undefined;}export function orderCompletionInGraph(a,b){const c=a['nodes']['get'](b['toLowerCase']()),d=c?.['raw']?.['data']??c?.['raw']??{},e=String(d['machine']??''),f=String(d['progress']??''),g=a['nodes']['get'](f['toLowerCase']()),h=String((g?.['raw']?.['data']??g?.['raw']??{})['current']??'');let i=null;if(e){const j=e['toLowerCase']()+'::node::',k=a['edges']['filter'](l=>l['schema']==='wf.transition'&&l['from']['startsWith'](j))['map'](l=>({'node':l['payload']?.['node'],'prev_node':l['payload']?.['prevNode']}));if(k['length']>0x0)i=terminalNamesOfEdges(k);}return deriveOrderCompletion({'machine':e||null,'progress':f||null,'currentNode':h||null,'terminalNames':i});}
@@ -1 +1 @@
1
- import{applyExposureGate as a101a}from'../../config/exposure.js';export{resolveViability,factRef,parseFactRef}from'../../config/exposure.js';export const EXPOSURE_ROLES={'buyer':'buyer','merchant':'merchant','supplier':'supplier','collaborator':'collaborator','arbitrator':'arbitrator','system':'system','neutral':'neutral'};export function applyExposureGate(a,b){return a101a(a,b);}export function lossParty(a,b){return{'role':a,'basis':b};}export function gainPath(a,b,c,d){return{'role':a,'path':b,'viability':c,'gate':d};}
1
+ import{applyExposureGate as a102a}from'../../config/exposure.js';export{resolveViability,factRef,parseFactRef}from'../../config/exposure.js';export const EXPOSURE_ROLES={'buyer':'buyer','merchant':'merchant','supplier':'supplier','collaborator':'collaborator','arbitrator':'arbitrator','system':'system','neutral':'neutral'};export function applyExposureGate(a,b){return a102a(a,b);}export function lossParty(a,b){return{'role':a,'basis':b};}export function gainPath(a,b,c,d){return{'role':a,'path':b,'viability':c,'gate':d};}
@@ -1 +1 @@
1
- import{FACET_CATALOG}from'../../evaluation/facets/catalog.js';import{findingWhereResolved}from'./analyze.js';import{buildNameIndex,createNameResolver}from'./names.js';const SIGNAL_GLOSS={'arbitration_binding':'A\x20binding\x20points\x20the\x20shop\x20at\x20an\x20on-chain\x20arbitration\x20service\x20that\x20can\x20adjudicate\x20disputes\x20and\x20move\x20escrowed\x20funds.','voting_roster':'Voting\x20guards\x20define\x20who\x20is\x20eligible\x20to\x20vote\x20on\x20a\x20dispute;\x20without\x20a\x20roster,\x20arbitration\x20cannot\x20reach\x20a\x20verdict.','arbitration_fee':'The\x20fee\x20pre-funded\x20into\x20the\x20arbitration\x20service\x20to\x20pay\x20adjudicators\x20for\x20taking\x20a\x20case;\x20zero\x20means\x20disputes\x20are\x20not\x20financially\x20backed.','arbitration_active':'Paused\x20arbitration\x20bindings\x20reject\x20new\x20dispute\x20cases,\x20so\x20the\x20shop\x20effectively\x20has\x20no\x20working\x20dispute\x20channel\x20while\x20paused.','published':'A\x20published\x20shop\x20is\x20visible\x20and\x20discoverable\x20on-chain;\x20unpublished\x20shops\x20cannot\x20be\x20found\x20through\x20normal\x20market\x20reads.','active':'A\x20paused\x20shop\x20stops\x20accepting\x20new\x20orders;\x20the\x20pause\x20is\x20set\x20by\x20the\x20merchant\x20on\x20the\x20service\x20object\x20itself.','service_permission':'The\x20permission\x20group\x20attached\x20to\x20the\x20shop\x20—\x20its\x20entity\x20table\x20decides\x20which\x20accounts\x20may\x20operate\x20the\x20service.','buy_guard':'A\x20buy\x20guard\x20is\x20an\x20on-chain\x20gate\x20every\x20new\x20order\x20must\x20pass\x20(e.g.\x20buyer\x20allowlist/conditions);\x20none\x20means\x20ordering\x20is\x20ungated.','admins':'Admin\x20EOAs\x20in\x20the\x20bound\x20permission\x20group\x20hold\x20the\x20operator\x20powers\x20over\x20the\x20shop\x20and\x20its\x20guards.'};function withGloss(a){const b=SIGNAL_GLOSS[a['key']];return b?{...a,'gloss':b}:a;}function toBigInt(a){if(a==null)return 0x0n;try{return BigInt(typeof a==='number'?Math['trunc'](a):String(a));}catch{return 0x0n;}}function nodeData(a,b){const c=a['nodes']['get'](b['toLowerCase']()),e=c?.['raw'],f=e?.['data']??e;return f&&typeof f==='object'?f:undefined;}const RULE_FACT_KEYS={'trust_arbitration':['arbitration.binding'],'trust_reviews':['reviews.votes'],'trust_fulfillment':['fulfillment.orders'],'trust_fund_safety':['fund.compensation','fund.exposure'],'trust_transparency':['transparency.profile'],'risk_workflow':['risk_workflow.findings'],'risk_fund':['risk_fund.findings'],'risk_trust':['risk_trust.findings'],'risk_behavior':['risk_behavior.findings']};function readOffers(a,b){const c=nodeData(a,b),e=c?.['sales'];if(Array['isArray'](e))return e['map'](f=>{const g=f??{};return{'name':typeof g['name']==='string'?g['name']:'','price':toBigInt(g['price'])['toString'](),...g['stock']!=null?{'stock':toBigInt(g['stock'])['toString']()}:{},'suspended':g['suspension']===!![]};})['filter'](f=>f['price']!=='0'||f['name']!=='');if(typeof e==='string'&&e!==''){const f=toBigInt(e)['toString']();return f!=='0'?[{'name':'','price':f,'suspended':![]}]:[];}return[];}export function projectFacets(a){const {graph:b,viewport:c,target:d,facts:e,evaluation:f,workflows:g,profile:h,roleInterest:i}=a,j=d['toLowerCase'](),k=createNameResolver(buildNameIndex(b)),l=new Map(e['facts']['map'](H=>[H['key'],H])),m=new Set(f['unverified']),n=b['nodes']['get'](j)?.['coinType'],o=e['slots']['find'](H=>H['slot']==='service_snapshot')?.['state']??'gap',p=o==='present',q=H=>H['startsWith']('trust_')?f['trust']['breakdown']['find'](I=>I['rule_id']===H):f['risk']['breakdown']['find'](I=>I['rule_id']===H),r=H=>{const I=[],J=[],K=[],L=new Set();for(const M of H){if(m['has'](M)){for(const P of RULE_FACT_KEYS[M]??[]){const Q=l['get'](P);if(Q?.['state']==='gap'&&Q['evidence'])K['push'](Q['evidence']);}continue;}const N=M['startsWith']('trust_')?'trust':'risk';I['push']({'evaluation':N,'rule_id':M});const O=q(M);for(const R of O?.['finding_refs']??[]){const S=findingWhereResolved(R,k),T=R['title']+'\x20—\x20Where:\x20'+S;!L['has'](T)&&(L['add'](T),J['push'](T));}}return{'scores':I,'evidence':J,...I['length']===0x0&&K['length']>0x0?{'gap_reason':K['join']('\x20')}:{}};},s=(H,I)=>({'raw':H,...I?{'coin_type':I}:{},'precision_known':![]}),u=(H,I,J)=>({'id':H['id'],'label':H['label'],'question':H['question'],'state':'gap',...J?.['length']?{'scores':J}:{},'evidence':[],'gap_reason':I['filter'](Boolean)['join']('\x20')}),v=()=>{const H=FACET_CATALOG[0x0],I=r(H['ruleIds']??[]),J=[],K=[],L=l['get']('fund.compensation'),M=l['get']('fund.exposure'),N=L?.['value'],O=M?.['value'],P=N?.['coinType']??n;L?.['state']!=='gap'&&N&&(J['push']({'key':'fund','label':'Compensation\x20fund','money':s(N['fund']??'0',P)}),K['push']('Compensation\x20fund:\x20{fund}.'));if(M?.['state']==='gap')K['push'](M['evidence']);else{if(O){const R=l['get']('fulfillment.orders')?.['value']??{'observed':O['windowedCount'],'completed':0x0,'inProgress':0x0,'unknown':0x0,'windowedAmount':O['windowedAmount']};R['observed']===0x0||O['windowedAmount']==='0'?K['push']('No\x20recent\x20orders\x20in\x20the\x20window\x20—\x20no\x20payout\x20exposure\x20to\x20cover.'):(J['push']({'key':'windowed','label':'Windowed\x20order\x20volume','money':s(O['windowedAmount'],P)}),J['push']({'key':'ceiling','label':'Required\x20ceiling\x20(3x\x20windowed\x20volume)','money':s(O['neededCeiling'],P)}),K['push']('Windowed\x20order\x20volume:\x20{windowed}\x20across\x20'+R['observed']+'\x20order(s);\x20statutory\x20ceiling\x20(3x):\x20{ceiling};\x20coverage\x20'+(O['coverageMet']?'met':'not\x20met')+'.'));}}K['push'](...I['evidence']);const Q=I['scores']['length']>0x0?'present':'gap';return{'id':H['id'],'label':H['label'],'question':H['question'],'state':Q,'scores':I['scores'],...J['length']?{'amounts':J}:{},'evidence':K,...I['gap_reason']?{'gap_reason':I['gap_reason']}:{}};},w=()=>{const H=FACET_CATALOG[0x1],I=r(H['ruleIds']??[]),J=[],K=[];for(const M of['reviews.votes','transparency.profile']){const N=l['get'](M);if(!N)continue;K['push'](N['state']==='gap'?'gap':N['state']==='empty'?'empty':'present');if(N['evidence'])J['push'](N['evidence']);}J['push'](...I['evidence']);const L=I['scores']['length']===0x0?'gap':K['includes']('present')?'present':'empty';return{'id':H['id'],'label':H['label'],'question':H['question'],'state':L,'scores':I['scores'],'evidence':J,...I['gap_reason']?{'gap_reason':I['gap_reason']}:{}};},x=()=>{const H=FACET_CATALOG[0x2],I=r(H['ruleIds']??[]),J=[],K=[],L=l['get']('arbitration.binding'),M=L?.['value']??[];let N='gap';if(L&&L['state']!=='gap'){N='present';const O=M['filter'](R=>R['votingGuards']>0x0)['length'],P=M['filter'](R=>toBigInt(R['fee'])>0x0n)['length'],Q=M['filter'](R=>!R['paused'])['length'];K['push']({'key':'arbitration_binding','label':'Arbitration\x20service\x20bound',...M['length']>0x0?{'state':'configured','detail':M['length']+'\x20binding(s)\x20on\x20the\x20service\x20snapshot'}:{'state':'missing','detail':'No\x20arbitration\x20service\x20configured\x20(verified\x20absence)'}}),K['push']({'key':'voting_roster','label':'Voting\x20roster\x20configured',...O>0x0?{'state':'configured','detail':O+'\x20binding(s)\x20carry\x20voting\x20guards'}:{'state':'missing'}}),K['push']({'key':'arbitration_fee','label':'Arbitration\x20fee\x20funded',...P>0x0?{'state':'configured','detail':P+'\x20binding(s)\x20with\x20a\x20funded\x20fee'}:{'state':'missing'}}),K['push']({'key':'arbitration_active','label':'Arbitration\x20active\x20(not\x20paused)',...Q>0x0?{'state':'configured'}:{'state':'missing','detail':'Every\x20binding\x20is\x20paused'}});if(L['evidence'])J['push'](L['evidence']);}return J['push'](...I['evidence']),{'id':H['id'],'label':H['label'],'question':H['question'],'state':I['scores']['length']===0x0?'gap':N,'scores':I['scores'],'signals':K['map'](withGloss),'evidence':J,...I['gap_reason']?{'gap_reason':I['gap_reason']}:{}};},y=()=>{const H=FACET_CATALOG[0x3],I=r(H['ruleIds']??[]),J=[];let K='gap';for(const L of['fulfillment.orders','fulfillment.workflow']){const M=l['get'](L);if(!M)continue;if(M['state']!=='gap')K='present';if(M['evidence'])J['push'](M['evidence']);}return J['push'](...I['evidence']),{'id':H['id'],'label':H['label'],'question':H['question'],'state':I['scores']['length']===0x0?'gap':K,'scores':I['scores'],'evidence':J,...I['gap_reason']?{'gap_reason':I['gap_reason']}:{}};},z=()=>{const H=FACET_CATALOG[0x4];if(!p)return u(H,['Offering\x20and\x20price\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.']);const I=nodeData(b,j)??{},J=l['get']('transparency.profile')?.['value'],K=J?.['published']??I['bPublished']===!![],L=J?.['paused']??I['bPaused']===!![],M=readOffers(b,j),N=M['map']((Q,R)=>({'key':'price_'+R,'label':Q['name']?'Offer:\x20'+Q['name']:'Service\x20sale\x20price','money':s(Q['price'],n)})),O=[{'key':'published','label':'Service\x20published',...K?{'state':'configured'}:{'state':'missing','detail':'Service\x20is\x20not\x20published'}},{'key':'active','label':'Service\x20active\x20(not\x20paused)',...!L?{'state':'configured'}:{'state':'missing','detail':'Service\x20is\x20paused'}}],P=M['map']((Q,R)=>{const S=Q['name']?'\x22'+Q['name']+'\x22':'the\x20service',T=Q['stock']!==undefined?',\x20stock\x20'+Q['stock']:'',U=Q['suspended']?',\x20suspended':',\x20on\x20shelf';return S+'\x20listed\x20at\x20{price_'+R+'}'+T+U+'.';});if(M['length']===0x0)P['push']('No\x20sale\x20items\x20configured\x20on\x20the\x20service\x20snapshot\x20(verified\x20absence).');return{'id':H['id'],'label':H['label'],'question':H['question'],'state':M['length']>0x0?'present':'empty','signals':O['map'](withGloss),...N['length']?{'amounts':N}:{},'evidence':P};},A=()=>{const H=FACET_CATALOG[0x5],I=r(H['ruleIds']??[]),J=l['get']('fulfillment.workflow'),K=[];if(J?.['evidence'])K['push'](J['evidence']);K['push'](...I['evidence']);if(J?.['state']==='empty')return{'id':H['id'],'label':H['label'],'question':H['question'],'state':'empty','scores':I['scores'],'evidence':K};if(J?.['state']==='gap'||g['length']===0x0)return u(H,[J?.['evidence']??'Workflow\x20graph\x20unverifiable:\x20no\x20machine\x20transitions\x20were\x20expanded.'],I['scores']);const L=[],M=new Set();let N=0x0,O=0x0,P=0x0;const Q=S=>{!M['has'](S['id'])&&(M['add'](S['id']),L['push'](S));};for(const S of g){const T=k['resolve'](S['machine']);Q({'id':S['machine'],'label':T['label'],...T['full']?{'full':T['full']}:{},'role':'machine'});const U=new Set();for(const V of S['transitions']){N+=0x1;if(V['guard'])O+=0x1;if(V['permission_index']!=null||V['named_operator'])P+=0x1;for(const W of[V['prev_node'],V['node']]){if(W)U['add'](S['machine']+'::node::'+W);}}for(const X of S['terminal_names'])U['add'](S['machine']+'::node::'+X);for(const Y of[...U]['sort']()){const Z=k['resolve'](Y);Q({'id':Y,'label':Z['label'],...Z['full']?{'full':Z['full']}:{},'role':'workflow\x20node'});}}const R=g['length']+'\x20machine(s),\x20'+L['filter'](a0=>a0['role']==='workflow\x20node')['length']+'\x20node(s),\x20'+(N+'\x20forward(s)\x20—\x20'+O+'\x20guard-gated,\x20'+P+'\x20permission-bound.');return{'id':H['id'],'label':H['label'],'question':H['question'],'state':'present','scores':I['scores'],'graph':{'kind':'workflow','summary':R,'refs':L},'evidence':K};},B=()=>{const H=FACET_CATALOG[0x6];if(!p)return u(H,['Fund\x20flow\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.']);const I=c['visibleEdges'],J=[],K=new Set(I['filter'](U=>U['schema']==='service.order'&&U['from']===j)['map'](U=>U['to'])),L=new Set();for(const U of I){if(U['schema']==='order.allocation'&&K['has'](U['from']))L['add'](U['to']);}const M=new Set(),N=new Set();for(const V of I){if(V['schema']==='allocation.payment'&&L['has'](V['from']))M['add'](V['to']);(V['schema']==='allocation.guard'&&L['has'](V['from'])||V['schema']==='service.order_allocator_guard')&&N['add'](V['to']);}const O=new Set(),P=[];let Q=0x0;for(const W of I){if(W['schema']!=='payment.recipient'||!M['has'](W['from']))continue;O['add'](W['to']);const X=k['resolve'](W['from'])['label'],Y=k['resolve'](W['to'])['label'],Z=toBigInt(W['payload']?.['amount'])['toString'](),a0=W['payload']?.['coinType']??n;Z!=='0'&&(P['push']({'key':'pay_'+Q,'label':'Payment\x20leg\x20to\x20'+Y,'money':s(Z,a0)}),J['push'](X+'\x20pays\x20{pay_'+Q+'}\x20to\x20'+Y+'.'),Q+=0x1);}const R=[],S=(a1,a2)=>{const a3=k['resolve'](a1);R['push']({'id':a1,'label':a3['label'],...a3['full']?{'full':a3['full']}:{},'role':a2});};for(const a1 of[...L]['sort']())S(a1,'allocation\x20pool');for(const a2 of[...M]['sort']())S(a2,'payment\x20leg');for(const a3 of[...N]['sort']())S(a3,'split\x20guard');for(const a4 of[...O]['sort']())S(a4,'recipient');const T=L['size']>0x0||M['size']>0x0||O['size']>0x0;return J['unshift'](T?M['size']+'\x20payment\x20leg(s)\x20across\x20'+L['size']+'\x20allocation\x20pool(s);\x20'+N['size']+'\x20guard-gated\x20split(s),\x20'+O['size']+'\x20recipient(s).':'No\x20allocation\x20pools,\x20payment\x20legs\x20or\x20recipients\x20reached\x20in\x20this\x20expansion\x20(verified\x20absence\x20for\x20the\x20visible\x20window).'),{'id':H['id'],'label':H['label'],'question':H['question'],'state':T?'present':'empty','graph':{'kind':'fund_flow','summary':L['size']+'\x20pool(s),\x20'+M['size']+'\x20payment\x20leg(s),\x20'+N['size']+'\x20guard(s),\x20'+O['size']+'\x20recipient(s).','refs':R},...P['length']?{'amounts':P}:{},'evidence':J};},C=()=>{const H=FACET_CATALOG[0x7];if(!p)return u(H,['Supply\x20chain\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.']);const I=[],J=new Set(),K=(O,P)=>{const Q=O+'|'+P;if(J['has'](Q))return;J['add'](Q);const R=k['resolve'](O);I['push']({'id':O,'label':R['label'],...R['full']?{'full':R['full']}:{},'role':P});};for(const O of c['visibleEdges']){if(O['schema']==='order.service'&&O['to']!==j)K(O['to'],'upstream\x20service');}for(const P of b['nodes']['values']()){if(P['kind']==='object'&&P['objectType']==='Service'&&P['id']!==j)K(P['id'],'service');}for(const Q of c['visibleEdges']){if(Q['schema']!=='allocation.for_object')continue;const R=b['nodes']['get'](Q['to']);if(R?.['objectType']==='Service'&&Q['to']!==j)K(Q['to'],'sub-order\x20routing');else{if(R?.['objectType']==='Order'){const S=nodeData(b,Q['to'])?.['service'];typeof S==='string'&&S['toLowerCase']()!==j&&K(Q['to'],'sub-order\x20routing');}}}const L=I['filter'](T=>T['role']==='upstream\x20service'||T['role']==='service')['length'],M=I['length']-L,N=[];return I['length']===0x0?N['push']('No\x20upstream\x20services\x20or\x20sub-order\x20routing\x20links\x20reached\x20in\x20this\x20expansion\x20(verified\x20absence\x20for\x20the\x20visible\x20window).'):N['push'](L+'\x20other\x20service(s)\x20and\x20'+M+'\x20sub-order\x20routing\x20link(s)\x20visible\x20in\x20the\x20graph.'),{'id':H['id'],'label':H['label'],'question':H['question'],'state':I['length']>0x0?'present':'empty','graph':{'kind':'supply_chain','summary':L+'\x20service(s),\x20'+M+'\x20routing\x20link(s).','refs':I},'evidence':N};},D=()=>{const H=FACET_CATALOG[0x8],I=r(H['ruleIds']??[]),J=[...I['evidence']],K=[],L=c['visibleEdges'],M=L['filter'](O=>O['schema']==='service.permission'&&O['from']===j)['map'](O=>O['to']),N=new Set(L['filter'](O=>O['schema']==='service.buy_guard'&&O['from']===j)['map'](O=>O['to']));K['push']({'key':'service_permission','label':'Permission\x20group\x20bound\x20to\x20the\x20service',...M['length']>0x0?{'state':'configured','detail':M['map'](O=>k['resolve'](O)['label'])['join'](',\x20')}:p?{'state':'missing','detail':'No\x20permission\x20group\x20on\x20the\x20service\x20snapshot'}:{'state':'unknown'}}),K['push']({'key':'buy_guard','label':'Buy\x20guard\x20gating\x20new\x20orders',...N['size']>0x0?{'state':'configured','detail':[...N]['map'](O=>k['resolve'](O)['label'])['join'](',\x20')}:p?{'state':'missing'}:{'state':'unknown'}});if(M['length']>0x0){const O=new Set(M),P=new Set(L['filter'](Q=>Q['schema']==='permission.admin'&&O['has'](Q['from']))['map'](Q=>Q['to']));K['push']({'key':'admins','label':'Admin\x20EOAs\x20of\x20the\x20bound\x20permission\x20group',...P['size']>0x0?{'state':'configured','detail':P['size']+'\x20admin(s):\x20'+[...P]['map'](Q=>k['resolve'](Q)['label'])['join'](',\x20')}:{'state':'missing'}});}if(!p&&M['length']===0x0)return{'id':H['id'],'label':H['label'],'question':H['question'],'state':'gap','scores':I['scores'],'signals':K['map'](withGloss),'evidence':J,'gap_reason':'Permission\x20posture\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'};return{'id':H['id'],'label':H['label'],'question':H['question'],'state':'present','scores':I['scores'],'signals':K['map'](withGloss),'evidence':J};},E=()=>{if(!i)return undefined;const H=FACET_CATALOG[0x9],I=i['stakes']['slice'](0x0,0xc)['map']((L,M)=>{const N=k['resolve'](L['object']);return{'key':'stake_'+M,'label':N['label']+'\x20—\x20'+L['positions']['join']('/'),'state':'configured','detail':[L['object_type'],L['state']]['filter'](Boolean)['join']('\x20·\x20')};}),J=i['counterparties']['filter'](L=>L['alignment']==='conflict')['length'],K=[i['summary'],i['actions']['length']+'\x20in-flight\x20order\x20action\x20plan(s),\x20'+i['arb_actions']['length']+'\x20arbitration\x20move(s),\x20'+J+'\x20counterparty\x20conflict(s).'];return{'id':H['id'],'label':H['label'],'question':H['question'],'state':'present','signals':I['map'](withGloss),'evidence':K};},F={'fund_safety':v,'reputation':w,'arbitration':x,'fulfillment':y,'offering_price':z,'workflow':A,'fund_flow':B,'supply_chain':C,'permission':D,'my_stakes':E},G=FACET_CATALOG['map'](H=>{const I=h['facets'][H['id']];if(!I?.['visible'])return undefined;const J=F[H['id']]();if(!J)return undefined;if(I['threshold']!==undefined)J['threshold']=I['threshold'];return{'item':J,'order':I['order']};})['filter'](H=>!!H)['sort']((H,I)=>H['order']-I['order'])['map'](H=>H['item']);return{'profile':{...h['role']?{'role':h['role']}:{},...h['industry']?{'industry':h['industry']}:{},'persona_applied':h['persona_applied'],'sources':h['sources']},'items':G};}
1
+ import{FACET_CATALOG}from'../../evaluation/facets/catalog.js';import{findingWhereResolved}from'./analyze.js';import{buildNameIndex,createNameResolver}from'./names.js';const SIGNAL_GLOSS={'arbitration_binding':'A\x20binding\x20points\x20the\x20shop\x20at\x20an\x20on-chain\x20arbitration\x20service\x20that\x20can\x20adjudicate\x20disputes\x20and\x20move\x20escrowed\x20funds.','voting_roster':'Voting\x20guards\x20define\x20who\x20is\x20eligible\x20to\x20vote\x20on\x20a\x20dispute;\x20without\x20a\x20roster,\x20arbitration\x20cannot\x20reach\x20a\x20verdict.','arbitration_fee':'The\x20fee\x20pre-funded\x20into\x20the\x20arbitration\x20service\x20to\x20pay\x20adjudicators\x20for\x20taking\x20a\x20case;\x20zero\x20means\x20disputes\x20are\x20not\x20financially\x20backed.','arbitration_active':'Paused\x20arbitration\x20bindings\x20reject\x20new\x20dispute\x20cases,\x20so\x20the\x20shop\x20effectively\x20has\x20no\x20working\x20dispute\x20channel\x20while\x20paused.','published':'A\x20published\x20shop\x20is\x20visible\x20and\x20discoverable\x20on-chain;\x20unpublished\x20shops\x20cannot\x20be\x20found\x20through\x20normal\x20market\x20reads.','active':'A\x20paused\x20shop\x20stops\x20accepting\x20new\x20orders;\x20the\x20pause\x20is\x20set\x20by\x20the\x20merchant\x20on\x20the\x20service\x20object\x20itself.','service_permission':'The\x20permission\x20group\x20attached\x20to\x20the\x20shop\x20—\x20its\x20entity\x20table\x20decides\x20which\x20accounts\x20may\x20operate\x20the\x20service.','buy_guard':'A\x20buy\x20guard\x20is\x20an\x20on-chain\x20gate\x20every\x20new\x20order\x20must\x20pass\x20(e.g.\x20buyer\x20allowlist/conditions);\x20none\x20means\x20ordering\x20is\x20ungated.','admins':'Admin\x20EOAs\x20in\x20the\x20bound\x20permission\x20group\x20hold\x20the\x20operator\x20powers\x20over\x20the\x20shop\x20and\x20its\x20guards.'};function withGloss(a){const b=SIGNAL_GLOSS[a['key']];return b?{...a,'gloss':b}:a;}function toBigInt(a){if(a==null)return 0x0n;try{return BigInt(typeof a==='number'?Math['trunc'](a):String(a));}catch{return 0x0n;}}function nodeData(a,b){const c=a['nodes']['get'](b['toLowerCase']()),e=c?.['raw'],f=e?.['data']??e;return f&&typeof f==='object'?f:undefined;}const RULE_FACT_KEYS={'trust_arbitration':['arbitration.binding'],'trust_reviews':['reviews.votes'],'trust_fulfillment':['fulfillment.orders'],'trust_fund_safety':['fund.compensation','fund.exposure'],'trust_transparency':['transparency.profile'],'risk_workflow':['risk_workflow.findings'],'risk_fund':['risk_fund.findings'],'risk_trust':['risk_trust.findings'],'risk_behavior':['risk_behavior.findings']};function readOffers(a,b){const c=nodeData(a,b),e=c?.['sales'];if(Array['isArray'](e))return e['map'](f=>{const g=f??{};return{'name':typeof g['name']==='string'?g['name']:'','price':toBigInt(g['price'])['toString'](),...g['stock']!=null?{'stock':toBigInt(g['stock'])['toString']()}:{},'suspended':g['suspension']===!![]};})['filter'](f=>f['price']!=='0'||f['name']!=='');if(typeof e==='string'&&e!==''){const f=toBigInt(e)['toString']();return f!=='0'?[{'name':'','price':f,'suspended':![]}]:[];}return[];}export function projectFacets(a){const {graph:b,viewport:c,target:d,facts:e,evaluation:f,workflows:g,profile:h,roleInterest:i}=a,j=d['toLowerCase'](),k=createNameResolver(buildNameIndex(b)),l=new Map(e['facts']['map'](H=>[H['key'],H])),m=new Set(f['unverified']),n=b['nodes']['get'](j)?.['coinType'],o=e['slots']['find'](H=>H['slot']==='service_snapshot')?.['state']??'gap',p=o==='present',q=H=>H['startsWith']('trust_')?f['trust']['breakdown']['find'](I=>I['rule_id']===H):f['risk']['breakdown']['find'](I=>I['rule_id']===H),r=H=>{const I=[],J=[],K=[],L=new Set();for(const M of H){if(m['has'](M)){for(const P of RULE_FACT_KEYS[M]??[]){const Q=l['get'](P);if(Q?.['state']==='gap'&&Q['evidence'])K['push'](Q['evidence']);}continue;}const N=M['startsWith']('trust_')?'trust':'risk';I['push']({'evaluation':N,'rule_id':M});const O=q(M);for(const R of O?.['finding_refs']??[]){const S=findingWhereResolved(R,k),T=R['title']+'\x20—\x20Where:\x20'+S;!L['has'](T)&&(L['add'](T),J['push'](T));}}return{'scores':I,'evidence':J,...I['length']===0x0&&K['length']>0x0?{'gap_reason':K['join']('\x20')}:{}};},s=(H,I)=>({'raw':H,...I?{'coin_type':I}:{},'precision_known':![]}),u=(H,I,J)=>({'id':H['id'],'label':H['label'],'question':H['question'],'state':'gap',...J?.['length']?{'scores':J}:{},'evidence':[],'gap_reason':I['filter'](Boolean)['join']('\x20')}),v=()=>{const H=FACET_CATALOG[0x0],I=r(H['ruleIds']??[]),J=[],K=[],L=l['get']('fund.compensation'),M=l['get']('fund.exposure'),N=L?.['value'],O=M?.['value'],P=N?.['coinType']??n;L?.['state']!=='gap'&&N&&(J['push']({'key':'fund','label':'Compensation\x20fund','money':s(N['fund']??'0',P)}),K['push']('Compensation\x20fund:\x20{fund}.'));if(M?.['state']==='gap')K['push'](M['evidence']);else{if(O){const T=l['get']('fulfillment.orders')?.['value']??{'observed':O['windowedCount'],'completed':0x0,'inProgress':0x0,'unknown':0x0,'windowedAmount':O['windowedAmount']};T['observed']===0x0||O['windowedAmount']==='0'?K['push']('No\x20recent\x20orders\x20in\x20the\x20window\x20—\x20no\x20payout\x20exposure\x20to\x20cover.'):(J['push']({'key':'largest','label':'Largest\x20windowed\x20order','money':s(O['largestAmount'],P)}),J['push']({'key':'ceiling','label':'Required\x20ceiling\x20(3x\x20largest\x20order)','money':s(O['neededCeiling'],P)}),K['push']('Largest\x20windowed\x20order:\x20{largest}\x20of\x20'+T['observed']+'\x20order(s);\x20statutory\x20ceiling\x20(3x\x20largest):\x20{ceiling};\x20coverage\x20'+(O['coverageMet']?'met':'not\x20met')+'.'));}}const Q=l['get']('fund.listing_wall'),R=Q?.['value'];Q?.['state']==='present'&&R?.['walled']&&(J['push']({'key':'cap','label':'Live\x20buy\x20ceiling\x20(fund/3)','money':s(R['coverCap'],P)}),K['push']('Live\x20buy\x20ceiling:\x20{cap};\x20'+R['blockedCount']+'\x20listed\x20SKU(s)\x20priced\x20above\x20it\x20cannot\x20be\x20checked\x20out'+((R['blockedNames']['length']>0x0?'\x20(largest\x20first:\x20'+R['blockedNames']['join'](',\x20')+')':'')+'\x20—\x20the\x20fund\x20cannot\x20back\x20the\x20maximum\x20award\x20on\x20them\x20until\x20it\x20is\x20topped\x20up\x20or\x20the\x20price\x20is\x20cut.')));K['push'](...I['evidence']);const S=I['scores']['length']>0x0?'present':'gap';return{'id':H['id'],'label':H['label'],'question':H['question'],'state':S,'scores':I['scores'],...J['length']?{'amounts':J}:{},'evidence':K,...I['gap_reason']?{'gap_reason':I['gap_reason']}:{}};},w=()=>{const H=FACET_CATALOG[0x1],I=r(H['ruleIds']??[]),J=[],K=[];for(const M of['reviews.votes','transparency.profile']){const N=l['get'](M);if(!N)continue;K['push'](N['state']==='gap'?'gap':N['state']==='empty'?'empty':'present');if(N['evidence'])J['push'](N['evidence']);}J['push'](...I['evidence']);const L=I['scores']['length']===0x0?'gap':K['includes']('present')?'present':'empty';return{'id':H['id'],'label':H['label'],'question':H['question'],'state':L,'scores':I['scores'],'evidence':J,...I['gap_reason']?{'gap_reason':I['gap_reason']}:{}};},x=()=>{const H=FACET_CATALOG[0x2],I=r(H['ruleIds']??[]),J=[],K=[],L=l['get']('arbitration.binding'),M=L?.['value']??[];let N='gap';if(L&&L['state']!=='gap'){N='present';const O=M['filter'](R=>R['votingGuards']>0x0)['length'],P=M['filter'](R=>toBigInt(R['fee'])>0x0n)['length'],Q=M['filter'](R=>!R['paused'])['length'];K['push']({'key':'arbitration_binding','label':'Arbitration\x20service\x20bound',...M['length']>0x0?{'state':'configured','detail':M['length']+'\x20binding(s)\x20on\x20the\x20service\x20snapshot'}:{'state':'missing','detail':'No\x20arbitration\x20service\x20configured\x20(verified\x20absence)'}}),K['push']({'key':'voting_roster','label':'Voting\x20roster\x20configured',...O>0x0?{'state':'configured','detail':O+'\x20binding(s)\x20carry\x20voting\x20guards'}:{'state':'missing'}}),K['push']({'key':'arbitration_fee','label':'Arbitration\x20fee\x20funded',...P>0x0?{'state':'configured','detail':P+'\x20binding(s)\x20with\x20a\x20funded\x20fee'}:{'state':'missing'}}),K['push']({'key':'arbitration_active','label':'Arbitration\x20active\x20(not\x20paused)',...Q>0x0?{'state':'configured'}:{'state':'missing','detail':'Every\x20binding\x20is\x20paused'}});if(L['evidence'])J['push'](L['evidence']);}return J['push'](...I['evidence']),{'id':H['id'],'label':H['label'],'question':H['question'],'state':I['scores']['length']===0x0?'gap':N,'scores':I['scores'],'signals':K['map'](withGloss),'evidence':J,...I['gap_reason']?{'gap_reason':I['gap_reason']}:{}};},y=()=>{const H=FACET_CATALOG[0x3],I=r(H['ruleIds']??[]),J=[];let K='gap';for(const L of['fulfillment.orders','fulfillment.workflow']){const M=l['get'](L);if(!M)continue;if(M['state']!=='gap')K='present';if(M['evidence'])J['push'](M['evidence']);}return J['push'](...I['evidence']),{'id':H['id'],'label':H['label'],'question':H['question'],'state':I['scores']['length']===0x0?'gap':K,'scores':I['scores'],'evidence':J,...I['gap_reason']?{'gap_reason':I['gap_reason']}:{}};},z=()=>{const H=FACET_CATALOG[0x4];if(!p)return u(H,['Offering\x20and\x20price\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.']);const I=nodeData(b,j)??{},J=l['get']('transparency.profile')?.['value'],K=J?.['published']??I['bPublished']===!![],L=J?.['paused']??I['bPaused']===!![],M=readOffers(b,j),N=M['map']((Q,R)=>({'key':'price_'+R,'label':Q['name']?'Offer:\x20'+Q['name']:'Service\x20sale\x20price','money':s(Q['price'],n)})),O=[{'key':'published','label':'Service\x20published',...K?{'state':'configured'}:{'state':'missing','detail':'Service\x20is\x20not\x20published'}},{'key':'active','label':'Service\x20active\x20(not\x20paused)',...!L?{'state':'configured'}:{'state':'missing','detail':'Service\x20is\x20paused'}}],P=M['map']((Q,R)=>{const S=Q['name']?'\x22'+Q['name']+'\x22':'the\x20service',T=Q['stock']!==undefined?',\x20stock\x20'+Q['stock']:'',U=Q['suspended']?',\x20suspended':',\x20on\x20shelf';return S+'\x20listed\x20at\x20{price_'+R+'}'+T+U+'.';});if(M['length']===0x0)P['push']('No\x20sale\x20items\x20configured\x20on\x20the\x20service\x20snapshot\x20(verified\x20absence).');return{'id':H['id'],'label':H['label'],'question':H['question'],'state':M['length']>0x0?'present':'empty','signals':O['map'](withGloss),...N['length']?{'amounts':N}:{},'evidence':P};},A=()=>{const H=FACET_CATALOG[0x5],I=r(H['ruleIds']??[]),J=l['get']('fulfillment.workflow'),K=[];if(J?.['evidence'])K['push'](J['evidence']);K['push'](...I['evidence']);if(J?.['state']==='empty')return{'id':H['id'],'label':H['label'],'question':H['question'],'state':'empty','scores':I['scores'],'evidence':K};if(J?.['state']==='gap'||g['length']===0x0)return u(H,[J?.['evidence']??'Workflow\x20graph\x20unverifiable:\x20no\x20machine\x20transitions\x20were\x20expanded.'],I['scores']);const L=[],M=new Set();let N=0x0,O=0x0,P=0x0;const Q=S=>{!M['has'](S['id'])&&(M['add'](S['id']),L['push'](S));};for(const S of g){const T=k['resolve'](S['machine']);Q({'id':S['machine'],'label':T['label'],...T['full']?{'full':T['full']}:{},'role':'machine'});const U=new Set();for(const V of S['transitions']){N+=0x1;if(V['guard'])O+=0x1;if(V['permission_index']!=null||V['named_operator'])P+=0x1;for(const W of[V['prev_node'],V['node']]){if(W)U['add'](S['machine']+'::node::'+W);}}for(const X of S['terminal_names'])U['add'](S['machine']+'::node::'+X);for(const Y of[...U]['sort']()){const Z=k['resolve'](Y);Q({'id':Y,'label':Z['label'],...Z['full']?{'full':Z['full']}:{},'role':'workflow\x20node'});}}const R=g['length']+'\x20machine(s),\x20'+L['filter'](a0=>a0['role']==='workflow\x20node')['length']+'\x20node(s),\x20'+(N+'\x20forward(s)\x20—\x20'+O+'\x20guard-gated,\x20'+P+'\x20permission-bound.');return{'id':H['id'],'label':H['label'],'question':H['question'],'state':'present','scores':I['scores'],'graph':{'kind':'workflow','summary':R,'refs':L},'evidence':K};},B=()=>{const H=FACET_CATALOG[0x6];if(!p)return u(H,['Fund\x20flow\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.']);const I=c['visibleEdges'],J=[],K=new Set(I['filter'](U=>U['schema']==='service.order'&&U['from']===j)['map'](U=>U['to'])),L=new Set();for(const U of I){if(U['schema']==='order.allocation'&&K['has'](U['from']))L['add'](U['to']);}const M=new Set(),N=new Set();for(const V of I){if(V['schema']==='allocation.payment'&&L['has'](V['from']))M['add'](V['to']);(V['schema']==='allocation.guard'&&L['has'](V['from'])||V['schema']==='service.order_allocator_guard')&&N['add'](V['to']);}const O=new Set(),P=[];let Q=0x0;for(const W of I){if(W['schema']!=='payment.recipient'||!M['has'](W['from']))continue;O['add'](W['to']);const X=k['resolve'](W['from'])['label'],Y=k['resolve'](W['to'])['label'],Z=toBigInt(W['payload']?.['amount'])['toString'](),a0=W['payload']?.['coinType']??n;Z!=='0'&&(P['push']({'key':'pay_'+Q,'label':'Payment\x20leg\x20to\x20'+Y,'money':s(Z,a0)}),J['push'](X+'\x20pays\x20{pay_'+Q+'}\x20to\x20'+Y+'.'),Q+=0x1);}const R=[],S=(a1,a2)=>{const a3=k['resolve'](a1);R['push']({'id':a1,'label':a3['label'],...a3['full']?{'full':a3['full']}:{},'role':a2});};for(const a1 of[...L]['sort']())S(a1,'allocation\x20pool');for(const a2 of[...M]['sort']())S(a2,'payment\x20leg');for(const a3 of[...N]['sort']())S(a3,'split\x20guard');for(const a4 of[...O]['sort']())S(a4,'recipient');const T=L['size']>0x0||M['size']>0x0||O['size']>0x0;return J['unshift'](T?M['size']+'\x20payment\x20leg(s)\x20across\x20'+L['size']+'\x20allocation\x20pool(s);\x20'+N['size']+'\x20guard-gated\x20split(s),\x20'+O['size']+'\x20recipient(s).':'No\x20allocation\x20pools,\x20payment\x20legs\x20or\x20recipients\x20reached\x20in\x20this\x20expansion\x20(verified\x20absence\x20for\x20the\x20visible\x20window).'),{'id':H['id'],'label':H['label'],'question':H['question'],'state':T?'present':'empty','graph':{'kind':'fund_flow','summary':L['size']+'\x20pool(s),\x20'+M['size']+'\x20payment\x20leg(s),\x20'+N['size']+'\x20guard(s),\x20'+O['size']+'\x20recipient(s).','refs':R},...P['length']?{'amounts':P}:{},'evidence':J};},C=()=>{const H=FACET_CATALOG[0x7];if(!p)return u(H,['Supply\x20chain\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.']);const I=[],J=new Set(),K=(O,P)=>{const Q=O+'|'+P;if(J['has'](Q))return;J['add'](Q);const R=k['resolve'](O);I['push']({'id':O,'label':R['label'],...R['full']?{'full':R['full']}:{},'role':P});};for(const O of c['visibleEdges']){if(O['schema']==='order.service'&&O['to']!==j)K(O['to'],'upstream\x20service');}for(const P of b['nodes']['values']()){if(P['kind']==='object'&&P['objectType']==='Service'&&P['id']!==j)K(P['id'],'service');}for(const Q of c['visibleEdges']){if(Q['schema']!=='allocation.for_object')continue;const R=b['nodes']['get'](Q['to']);if(R?.['objectType']==='Service'&&Q['to']!==j)K(Q['to'],'sub-order\x20routing');else{if(R?.['objectType']==='Order'){const S=nodeData(b,Q['to'])?.['service'];typeof S==='string'&&S['toLowerCase']()!==j&&K(Q['to'],'sub-order\x20routing');}}}const L=I['filter'](T=>T['role']==='upstream\x20service'||T['role']==='service')['length'],M=I['length']-L,N=[];return I['length']===0x0?N['push']('No\x20upstream\x20services\x20or\x20sub-order\x20routing\x20links\x20reached\x20in\x20this\x20expansion\x20(verified\x20absence\x20for\x20the\x20visible\x20window).'):N['push'](L+'\x20other\x20service(s)\x20and\x20'+M+'\x20sub-order\x20routing\x20link(s)\x20visible\x20in\x20the\x20graph.'),{'id':H['id'],'label':H['label'],'question':H['question'],'state':I['length']>0x0?'present':'empty','graph':{'kind':'supply_chain','summary':L+'\x20service(s),\x20'+M+'\x20routing\x20link(s).','refs':I},'evidence':N};},D=()=>{const H=FACET_CATALOG[0x8],I=r(H['ruleIds']??[]),J=[...I['evidence']],K=[],L=c['visibleEdges'],M=L['filter'](O=>O['schema']==='service.permission'&&O['from']===j)['map'](O=>O['to']),N=new Set(L['filter'](O=>O['schema']==='service.buy_guard'&&O['from']===j)['map'](O=>O['to']));K['push']({'key':'service_permission','label':'Permission\x20group\x20bound\x20to\x20the\x20service',...M['length']>0x0?{'state':'configured','detail':M['map'](O=>k['resolve'](O)['label'])['join'](',\x20')}:p?{'state':'missing','detail':'No\x20permission\x20group\x20on\x20the\x20service\x20snapshot'}:{'state':'unknown'}}),K['push']({'key':'buy_guard','label':'Buy\x20guard\x20gating\x20new\x20orders',...N['size']>0x0?{'state':'configured','detail':[...N]['map'](O=>k['resolve'](O)['label'])['join'](',\x20')}:p?{'state':'missing'}:{'state':'unknown'}});if(M['length']>0x0){const O=new Set(M),P=new Set(L['filter'](Q=>Q['schema']==='permission.admin'&&O['has'](Q['from']))['map'](Q=>Q['to']));K['push']({'key':'admins','label':'Admin\x20EOAs\x20of\x20the\x20bound\x20permission\x20group',...P['size']>0x0?{'state':'configured','detail':P['size']+'\x20admin(s):\x20'+[...P]['map'](Q=>k['resolve'](Q)['label'])['join'](',\x20')}:{'state':'missing'}});}if(!p&&M['length']===0x0)return{'id':H['id'],'label':H['label'],'question':H['question'],'state':'gap','scores':I['scores'],'signals':K['map'](withGloss),'evidence':J,'gap_reason':'Permission\x20posture\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'};return{'id':H['id'],'label':H['label'],'question':H['question'],'state':'present','scores':I['scores'],'signals':K['map'](withGloss),'evidence':J};},E=()=>{if(!i)return undefined;const H=FACET_CATALOG[0x9],I=i['stakes']['slice'](0x0,0xc)['map']((L,M)=>{const N=k['resolve'](L['object']);return{'key':'stake_'+M,'label':N['label']+'\x20—\x20'+L['positions']['join']('/'),'state':'configured','detail':[L['object_type'],L['state']]['filter'](Boolean)['join']('\x20·\x20')};}),J=i['counterparties']['filter'](L=>L['alignment']==='conflict')['length'],K=[i['summary'],i['actions']['length']+'\x20in-flight\x20order\x20action\x20plan(s),\x20'+i['arb_actions']['length']+'\x20arbitration\x20move(s),\x20'+J+'\x20counterparty\x20conflict(s).'];return{'id':H['id'],'label':H['label'],'question':H['question'],'state':'present','signals':I['map'](withGloss),'evidence':K};},F={'fund_safety':v,'reputation':w,'arbitration':x,'fulfillment':y,'offering_price':z,'workflow':A,'fund_flow':B,'supply_chain':C,'permission':D,'my_stakes':E},G=FACET_CATALOG['map'](H=>{const I=h['facets'][H['id']];if(!I?.['visible'])return undefined;const J=F[H['id']]();if(!J)return undefined;if(I['threshold']!==undefined)J['threshold']=I['threshold'];return{'item':J,'order':I['order']};})['filter'](H=>!!H)['sort']((H,I)=>H['order']-I['order'])['map'](H=>H['item']);return{'profile':{...h['role']?{'role':h['role']}:{},...h['industry']?{'industry':h['industry']}:{},'persona_applied':h['persona_applied'],'sources':h['sources']},'items':G};}
@@ -1 +1 @@
1
- import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{FULL,GAP,T_USDT,fullServiceState,gapServiceState,truncatedServiceState}from'./fixtures.js';import{buildViewport}from'./viewport.js';import{runAnalyzers}from'./analyze.js';import{workflowSubgraphFromEdges}from'./order-status.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'./strategy.js';import{projectEvaluationFacts}from'./facts.js';import{projectFacets}from'./facet-projection.js';import{FACET_IDS}from'../../evaluation/facets/catalog.js';import{evaluateGraphServiceFacts,registerGraphServiceEvaluations}from'../../evaluation/builtins/graph-service.js';import{resolveFacetProfile}from'../../persona/facet-profile.js';const TYPE_TAG_NODE='0x2::machine::Node<0x2::wow::WOW>';async function assemble(a,b){registerGraphServiceEvaluations();const c=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),d=await expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':b,'edges':c['edges'],'budget':c['budget']}),e=buildViewport(d,b,'neutral'),f=projectEvaluationFacts(e,b,runAnalyzers(e)),g=await evaluateGraphServiceFacts(f),h=[...new Set(d['edges']['filter'](j=>j['schema']==='wf.transition')['flatMap'](j=>[j['from'],j['to']])['map'](j=>{const k=j['indexOf']('::node::');return k>0x0?j['slice'](0x0,k):'';})['filter'](Boolean))]['sort'](),i=h['map'](j=>{const k=workflowSubgraphFromEdges(d['edges'],j);return{'machine':j,'transitions':k['transitions']['map'](l=>({'node':l['node'],'prev_node':l['prevNode'],...l['forward']!==undefined?{'forward':l['forward']}:{},'guard':l['guard']??null,'named_operator':l['namedOperator']??null,'permission_index':l['permissionIndex']??null})),'terminal_names':[...k['terminalNames']]['sort']()};});return{'graph':d,'viewport':e,'facts':f,'evaluation':g,'workflows':i};}function project(b,c,d=resolveFacetProfile(),e,f){return projectFacets({'graph':b['graph'],'viewport':b['viewport'],'target':c,'facts':b['facts'],'evaluation':b['evaluation'],'workflows':f??b['workflows'],'profile':{'role':d['role'],'industry':d['industry'],'persona_applied':d['personaApplied'],'sources':d['sources'],'facets':d['facets']},...e?{'roleInterest':e}:{}});}const itemOf=(a,b)=>a['items']['find'](c=>c['id']===b);describe('facet\x20projection\x20—\x20fully\x20hooked\x20shop',()=>{it('emits\x20nine\x20catalog\x20facets\x20in\x20order,\x20my_stakes\x20gated\x20out\x20without\x20an\x20observer',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=project(b,FULL['svc']);expect(c['items']['map'](d=>d['id']))['toEqual'](FACET_IDS['filter'](d=>d!=='my_stakes')),expect(c['profile']['sources'])['toContain']('catalog\x20defaults'),expect(c['profile']['persona_applied'])['toBe'](![]);}),it('business\x20facets\x20carry\x20no\x20score\x20refs\x20at\x20all',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=project(b,FULL['svc']);for(const d of['offering_price','fund_flow','supply_chain']){expect(itemOf(c,d)?.['scores'])['toBeUndefined']();}expect(itemOf(c,'fund_safety')?.['scores']?.['map'](e=>e['rule_id'])['sort']())['toEqual'](['risk_fund','trust_fund_safety']['sort']()),expect(itemOf(c,'workflow')?.['scores'])['toEqual']([{'evaluation':'risk','rule_id':'risk_workflow'}]),expect(itemOf(c,'permission')?.['scores'])['toEqual']([{'evaluation':'risk','rule_id':'risk_behavior'}]);for(const e of itemOf(c,'fund_safety')['scores']){const f=e['evaluation']==='trust'?b['evaluation']['trust']:b['evaluation']['risk'];expect(f['breakdown']['some'](g=>g['rule_id']===e['rule_id']))['toBe'](!![]);}}),it('projects\x20fund_safety\x20raw\x20amounts\x20with\x20coin\x20types\x20and\x20placeholder\x20evidence',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'fund_safety');expect(c['state'])['toBe']('present');const d=Object['fromEntries']((c['amounts']??[])['map'](e=>[e['key'],e]));expect(d['fund']?.['money']['raw'])['toBe']('0'),expect(d['windowed']?.['money']['raw'])['toBe']('1000000'),expect(d['ceiling']?.['money']['raw'])['toBe']('3000000');for(const e of Object['values'](d))expect(e['money']['coin_type'])['toBe'](T_USDT);expect(d['fund']?.['money']['precision_known'])['toBe'](![]),expect(d['fund']?.['money']['display'])['toBeUndefined'](),expect(c['evidence']['some'](f=>f['includes']('{windowed}')&&f['includes']('{ceiling}')))['toBe'](!![]);}),it('projects\x20offering_price\x20from\x20the\x20seed\x20raw\x20with\x20published/active\x20signals',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'offering_price');expect(c['state'])['toBe']('present'),expect(c['amounts'])['toHaveLength'](0x1),expect(c['amounts'][0x0]['money']['raw'])['toBe']('1000000'),expect(c['amounts'][0x0]['money']['coin_type'])['toBe'](T_USDT);const d=Object['fromEntries']((c['signals']??[])['map'](e=>[e['key'],e]));expect(d['published']['state'])['toBe']('configured'),expect(d['active']['state'])['toBe']('configured');}),it('projects\x20arbitration\x20binding/roster/fee/active\x20signals',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'arbitration'),d=Object['fromEntries']((c['signals']??[])['map'](e=>[e['key'],e['state']]));expect(d)['toMatchObject']({'arbitration_binding':'configured','voting_roster':'configured','arbitration_fee':'configured','arbitration_active':'configured'});for(const e of c['signals']??[]){expect(e['gloss']?.['length'])['toBeGreaterThan'](0x14);}}),it('emits\x20coverage\x20slot\x20glosses\x20+\x20the\x20coverage\x20vocabulary',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),{evaluation:c}=b;for(const e of c['coverage']){expect(e['label']['length'])['toBeGreaterThan'](0x2),expect(e['gloss']['length'])['toBeGreaterThan'](0x14);}const d=c['vocabulary'];expect(d['present'])['toMatch'](/present/i),expect(d['empty'])['toMatch'](/verified/i),expect(d['gap'])['toMatch'](/unverifiable|not retrieved|truncated/i),expect(d['unverified']['length'])['toBeGreaterThan'](0x14),expect(d['completeness']['length'])['toBeGreaterThan'](0x14);}),it('projects\x20the\x20workflow\x20graph\x20with\x20resolved\x20machine/node\x20names\x20and\x20no\x20synthetic\x20ids',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'workflow');expect(c['state'])['toBe']('present'),expect(c['graph']?.['kind'])['toBe']('workflow');const d=c['graph']['refs']['filter'](f=>f['role']==='workflow\x20node')['map'](f=>f['label']);expect(d)['toEqual'](expect['arrayContaining'](['start','shipping','done'])),expect(c['graph']['refs']['some'](f=>f['role']==='machine'))['toBe'](!![]);const e=[...c['graph']['refs']['map'](f=>f['label']+'\x20'+(f['full']??'')),c['graph']['summary'],...c['evidence']]['join']('\x20');expect(e)['not']['toContain']('::node::'),expect(c['graph']['refs']['filter'](f=>f['role']==='workflow\x20node')['some'](f=>f['label']['startsWith']('0x')))['toBe'](![]);}),it('humanizes\x20Move\x20type-tag\x20node\x20names\x20into\x20Node<WOW>\x20with\x20full\x20kept',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=[{'machine':FULL['mac']['toLowerCase'](),'transitions':[{'node':TYPE_TAG_NODE,'prev_node':'start','guard':null,'named_operator':null,'permission_index':null}],'terminal_names':[TYPE_TAG_NODE]}],d=itemOf(project(b,FULL['svc'],undefined,undefined,c),'workflow'),e=d['graph']['refs']['find'](f=>f['label']==='Node<WOW>');expect(e)['toBeDefined'](),expect(e['full'])['toBe'](TYPE_TAG_NODE);}),it('projects\x20fund_flow\x20pools,\x20payment\x20legs,\x20recipients,\x20guards\x20and\x20leg\x20amounts',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'fund_flow');expect(c['state'])['toBe']('present');const d=(c['graph']['refs']??[])['reduce']((f,g)=>{return f[g['role']??'']=(f[g['role']??'']??0x0)+0x1,f;},{});expect(d['allocation\x20pool'])['toBe'](0x1),expect(d['payment\x20leg'])['toBe'](0x2),expect(d['recipient'])['toBe'](0x2),expect(d['split\x20guard'])['toBe'](0x1);const e=(c['amounts']??[])['map'](f=>f['money']['raw'])['sort']();expect(e)['toEqual'](['10000','50000','990000']),expect(c['evidence']['some'](f=>f['includes']('{pay_0}')||f['includes']('{pay_')))['toBe'](!![]);}),it('keeps\x20supply_chain\x20empty\x20for\x20the\x20single-shop\x20fixture\x20(own\x20orders\x20excluded)',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'supply_chain');expect(c['state'])['toBe']('empty'),expect(c['graph']?.['refs'])['toEqual']([]);}),it('projects\x20permission\x20signals\x20incl.\x20bound\x20group,\x20buy\x20guard\x20and\x20admins',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'permission'),d=Object['fromEntries']((c['signals']??[])['map'](e=>[e['key'],e['state']]));expect(d['service_permission'])['toBe']('configured'),expect(d['buy_guard'])['toBe']('configured'),expect(d['admins'])['toBe']('configured');}),it('carries\x20risk\x20finding\x20titles\x20+\x20graph-aware\x20where\x20lines\x20as\x20evidence,\x20never\x20raw\x20ids',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=project(b,FULL['svc']),d=c['items']['flatMap'](f=>f['evidence']),e=itemOf(c,'fund_safety')['evidence']['join']('\x20');expect(e)['toContain']('Payout\x20exposure'),expect(e)['not']['toContain']('::node::'),expect(d['some'](f=>/0x[0-9a-f]{40,}/['test'](f)))['toBe'](![]);}),it('projects\x20my_stakes\x20only\x20when\x20role\x20interest\x20is\x20supplied',async()=>{const b=await assemble(fullServiceState(),FULL['svc']);expect(itemOf(project(b,FULL['svc']),'my_stakes'))['toBeUndefined']();const c={'role':'customer','observer':FULL['buyer'],'stakes':[{'object':FULL['svc'],'object_type':'Service','positions':['buyer'],'state':'in_flight','evidence':[]}],'actions':[],'arb_actions':[],'counterparties':[],'risk_finding_ids':[],'summary':'Buyer\x20has\x20one\x20in-flight\x20order\x20at\x20stake.'},d=itemOf(project(b,FULL['svc'],resolveFacetProfile(),c),'my_stakes');expect(d['state'])['toBe']('present'),expect(d['signals'])['toHaveLength'](0x1),expect(d['signals'][0x0]['label'])['toContain']('buyer'),expect(d['evidence']['join']('\x20'))['toContain']('one\x20in-flight\x20order');});}),describe('facet\x20projection\x20—\x20configured-empty\x20shell',()=>{it('marks\x20verified\x20absences\x20empty/missing\x20and\x20the\x20dangling\x20machine\x20a\x20gap',async()=>{const b=await assemble(gapServiceState(),GAP['svc']),c=project(b,GAP['svc']);expect(itemOf(c,'workflow')?.['state'])['toBe']('gap'),expect(itemOf(c,'workflow')?.['gap_reason'])['toBeTruthy'](),expect(itemOf(c,'workflow')?.['graph'])['toBeUndefined'](),expect(itemOf(c,'offering_price')?.['state'])['toBe']('empty'),expect(itemOf(c,'fund_flow')?.['state'])['toBe']('empty'),expect(itemOf(c,'supply_chain')?.['state'])['toBe']('empty');const d=itemOf(c,'arbitration');expect(d['state'])['toBe']('present'),expect(d['signals']['find'](f=>f['key']==='arbitration_binding')?.['state'])['toBe']('missing');const e=itemOf(c,'permission');expect(e['state'])['toBe']('present'),expect(e['signals']['find'](f=>f['key']==='buy_guard')?.['state'])['toBe']('missing'),expect(e['signals']['find'](f=>f['key']==='service_permission')?.['state'])['toBe']('configured');});}),describe('facet\x20projection\x20—\x20truncated\x20order\x20window',()=>{it('exposes\x20fund_safety/fulfillment\x20as\x20gaps\x20with\x20no\x20score\x20refs\x20and\x20a\x20reason',async()=>{const b=await assemble(truncatedServiceState(),FULL['svc']),c=project(b,FULL['svc']);for(const d of['fund_safety','fulfillment']){const e=itemOf(c,d);expect(e['state'])['toBe']('gap'),expect(e['scores']??[])['toEqual']([]),expect(e['gap_reason'])['toBeTruthy']();}expect(itemOf(c,'reputation')?.['state'])['toBe']('present');});}),describe('facet\x20projection\x20—\x20profile\x20lens',()=>{it('orders\x20facets\x20by\x20role\x20emphasis\x20and\x20hides\x20profile-hidden\x20facets',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=resolveFacetProfile({'role':'merchant'}),d=project(b,FULL['svc'],c);expect(d['items'][0x0]['id'])['toBe']('fund_flow'),expect(d['profile']['role'])['toBe']('merchant'),expect(d['profile']['sources']['some'](g=>g['startsWith']('role\x20default:merchant')))['toBe'](!![]);const e=resolveFacetProfile({'request':{'fund_safety':{'visible':![]},'reputation':{'order':0x1}}}),f=project(b,FULL['svc'],e);expect(f['items']['some'](g=>g['id']==='fund_safety'))['toBe'](![]),expect(f['items'][0x0]['id'])['toBe']('reputation');});});
1
+ import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{FULL,GAP,T_USDT,fullServiceState,gapServiceState,truncatedServiceState}from'./fixtures.js';import{buildViewport}from'./viewport.js';import{runAnalyzers}from'./analyze.js';import{workflowSubgraphFromEdges}from'./order-status.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'./strategy.js';import{projectEvaluationFacts}from'./facts.js';import{projectFacets}from'./facet-projection.js';import{FACET_IDS}from'../../evaluation/facets/catalog.js';import{evaluateGraphServiceFacts,registerGraphServiceEvaluations}from'../../evaluation/builtins/graph-service.js';import{resolveFacetProfile}from'../../persona/facet-profile.js';const TYPE_TAG_NODE='0x2::machine::Node<0x2::wow::WOW>';async function assemble(a,b){registerGraphServiceEvaluations();const c=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),d=await expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':b,'edges':c['edges'],'budget':c['budget']}),e=buildViewport(d,b,'neutral'),f=projectEvaluationFacts(e,b,runAnalyzers(e)),g=await evaluateGraphServiceFacts(f),h=[...new Set(d['edges']['filter'](j=>j['schema']==='wf.transition')['flatMap'](j=>[j['from'],j['to']])['map'](j=>{const k=j['indexOf']('::node::');return k>0x0?j['slice'](0x0,k):'';})['filter'](Boolean))]['sort'](),i=h['map'](j=>{const k=workflowSubgraphFromEdges(d['edges'],j);return{'machine':j,'transitions':k['transitions']['map'](l=>({'node':l['node'],'prev_node':l['prevNode'],...l['forward']!==undefined?{'forward':l['forward']}:{},'guard':l['guard']??null,'named_operator':l['namedOperator']??null,'permission_index':l['permissionIndex']??null})),'terminal_names':[...k['terminalNames']]['sort']()};});return{'graph':d,'viewport':e,'facts':f,'evaluation':g,'workflows':i};}function project(b,c,d=resolveFacetProfile(),e,f){return projectFacets({'graph':b['graph'],'viewport':b['viewport'],'target':c,'facts':b['facts'],'evaluation':b['evaluation'],'workflows':f??b['workflows'],'profile':{'role':d['role'],'industry':d['industry'],'persona_applied':d['personaApplied'],'sources':d['sources'],'facets':d['facets']},...e?{'roleInterest':e}:{}});}const itemOf=(a,b)=>a['items']['find'](c=>c['id']===b);describe('facet\x20projection\x20—\x20fully\x20hooked\x20shop',()=>{it('emits\x20nine\x20catalog\x20facets\x20in\x20order,\x20my_stakes\x20gated\x20out\x20without\x20an\x20observer',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=project(b,FULL['svc']);expect(c['items']['map'](d=>d['id']))['toEqual'](FACET_IDS['filter'](d=>d!=='my_stakes')),expect(c['profile']['sources'])['toContain']('catalog\x20defaults'),expect(c['profile']['persona_applied'])['toBe'](![]);}),it('business\x20facets\x20carry\x20no\x20score\x20refs\x20at\x20all',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=project(b,FULL['svc']);for(const d of['offering_price','fund_flow','supply_chain']){expect(itemOf(c,d)?.['scores'])['toBeUndefined']();}expect(itemOf(c,'fund_safety')?.['scores']?.['map'](e=>e['rule_id'])['sort']())['toEqual'](['risk_fund','trust_fund_safety']['sort']()),expect(itemOf(c,'workflow')?.['scores'])['toEqual']([{'evaluation':'risk','rule_id':'risk_workflow'}]),expect(itemOf(c,'permission')?.['scores'])['toEqual']([{'evaluation':'risk','rule_id':'risk_behavior'}]);for(const e of itemOf(c,'fund_safety')['scores']){const f=e['evaluation']==='trust'?b['evaluation']['trust']:b['evaluation']['risk'];expect(f['breakdown']['some'](g=>g['rule_id']===e['rule_id']))['toBe'](!![]);}}),it('projects\x20fund_safety\x20raw\x20amounts\x20with\x20coin\x20types\x20and\x20placeholder\x20evidence',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'fund_safety');expect(c['state'])['toBe']('present');const d=Object['fromEntries']((c['amounts']??[])['map'](e=>[e['key'],e]));expect(d['fund']?.['money']['raw'])['toBe']('0'),expect(d['largest']?.['money']['raw'])['toBe']('1000000'),expect(d['ceiling']?.['money']['raw'])['toBe']('3000000');for(const e of Object['values'](d))expect(e['money']['coin_type'])['toBe'](T_USDT);expect(d['fund']?.['money']['precision_known'])['toBe'](![]),expect(d['fund']?.['money']['display'])['toBeUndefined'](),expect(c['evidence']['some'](f=>f['includes']('{largest}')&&f['includes']('{ceiling}')))['toBe'](!![]);}),it('surfaces\x20the\x20live\x20buy\x20ceiling\x20+\x20blocked\x20listings\x20only\x20when\x20the\x20wall\x20is\x20live',async()=>{const b=fullServiceState(),c=b['objects']['get'](FULL['svc']['toLowerCase']());c['data']['compensation_fund']='1000000',c['data']['sales']=[{'name':'top','price':'900000','suspension':![]},{'name':'low','price':'100000','suspension':![]}];const d=await assemble(b,FULL['svc']),e=itemOf(project(d,FULL['svc']),'fund_safety'),f=Object['fromEntries']((e['amounts']??[])['map'](j=>[j['key'],j]));expect(f['cap']?.['money']['raw'])['toBe']('333333');const g=e['evidence']['find'](j=>j['includes']('Live\x20buy\x20ceiling'));expect(g)['toContain']('{cap}'),expect(g)['toContain']('top');const h=await assemble(fullServiceState(),FULL['svc']),i=itemOf(project(h,FULL['svc']),'fund_safety');expect(Object['fromEntries']((i['amounts']??[])['map'](j=>[j['key'],j]))['cap'])['toBeUndefined'](),expect(i['evidence']['some'](j=>j['includes']('Live\x20buy\x20ceiling')))['toBe'](![]);}),it('projects\x20offering_price\x20from\x20the\x20seed\x20raw\x20with\x20published/active\x20signals',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'offering_price');expect(c['state'])['toBe']('present'),expect(c['amounts'])['toHaveLength'](0x1),expect(c['amounts'][0x0]['money']['raw'])['toBe']('1000000'),expect(c['amounts'][0x0]['money']['coin_type'])['toBe'](T_USDT);const d=Object['fromEntries']((c['signals']??[])['map'](e=>[e['key'],e]));expect(d['published']['state'])['toBe']('configured'),expect(d['active']['state'])['toBe']('configured');}),it('projects\x20arbitration\x20binding/roster/fee/active\x20signals',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'arbitration'),d=Object['fromEntries']((c['signals']??[])['map'](e=>[e['key'],e['state']]));expect(d)['toMatchObject']({'arbitration_binding':'configured','voting_roster':'configured','arbitration_fee':'configured','arbitration_active':'configured'});for(const e of c['signals']??[]){expect(e['gloss']?.['length'])['toBeGreaterThan'](0x14);}}),it('emits\x20coverage\x20slot\x20glosses\x20+\x20the\x20coverage\x20vocabulary',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),{evaluation:c}=b;for(const e of c['coverage']){expect(e['label']['length'])['toBeGreaterThan'](0x2),expect(e['gloss']['length'])['toBeGreaterThan'](0x14);}const d=c['vocabulary'];expect(d['present'])['toMatch'](/present/i),expect(d['empty'])['toMatch'](/verified/i),expect(d['gap'])['toMatch'](/unverifiable|not retrieved|truncated/i),expect(d['unverified']['length'])['toBeGreaterThan'](0x14),expect(d['completeness']['length'])['toBeGreaterThan'](0x14);}),it('projects\x20the\x20workflow\x20graph\x20with\x20resolved\x20machine/node\x20names\x20and\x20no\x20synthetic\x20ids',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'workflow');expect(c['state'])['toBe']('present'),expect(c['graph']?.['kind'])['toBe']('workflow');const d=c['graph']['refs']['filter'](f=>f['role']==='workflow\x20node')['map'](f=>f['label']);expect(d)['toEqual'](expect['arrayContaining'](['start','shipping','done'])),expect(c['graph']['refs']['some'](f=>f['role']==='machine'))['toBe'](!![]);const e=[...c['graph']['refs']['map'](f=>f['label']+'\x20'+(f['full']??'')),c['graph']['summary'],...c['evidence']]['join']('\x20');expect(e)['not']['toContain']('::node::'),expect(c['graph']['refs']['filter'](f=>f['role']==='workflow\x20node')['some'](f=>f['label']['startsWith']('0x')))['toBe'](![]);}),it('humanizes\x20Move\x20type-tag\x20node\x20names\x20into\x20Node<WOW>\x20with\x20full\x20kept',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=[{'machine':FULL['mac']['toLowerCase'](),'transitions':[{'node':TYPE_TAG_NODE,'prev_node':'start','guard':null,'named_operator':null,'permission_index':null}],'terminal_names':[TYPE_TAG_NODE]}],d=itemOf(project(b,FULL['svc'],undefined,undefined,c),'workflow'),e=d['graph']['refs']['find'](f=>f['label']==='Node<WOW>');expect(e)['toBeDefined'](),expect(e['full'])['toBe'](TYPE_TAG_NODE);}),it('projects\x20fund_flow\x20pools,\x20payment\x20legs,\x20recipients,\x20guards\x20and\x20leg\x20amounts',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'fund_flow');expect(c['state'])['toBe']('present');const d=(c['graph']['refs']??[])['reduce']((f,g)=>{return f[g['role']??'']=(f[g['role']??'']??0x0)+0x1,f;},{});expect(d['allocation\x20pool'])['toBe'](0x1),expect(d['payment\x20leg'])['toBe'](0x2),expect(d['recipient'])['toBe'](0x2),expect(d['split\x20guard'])['toBe'](0x1);const e=(c['amounts']??[])['map'](f=>f['money']['raw'])['sort']();expect(e)['toEqual'](['10000','50000','990000']),expect(c['evidence']['some'](f=>f['includes']('{pay_0}')||f['includes']('{pay_')))['toBe'](!![]);}),it('keeps\x20supply_chain\x20empty\x20for\x20the\x20single-shop\x20fixture\x20(own\x20orders\x20excluded)',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'supply_chain');expect(c['state'])['toBe']('empty'),expect(c['graph']?.['refs'])['toEqual']([]);}),it('projects\x20permission\x20signals\x20incl.\x20bound\x20group,\x20buy\x20guard\x20and\x20admins',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=itemOf(project(b,FULL['svc']),'permission'),d=Object['fromEntries']((c['signals']??[])['map'](e=>[e['key'],e['state']]));expect(d['service_permission'])['toBe']('configured'),expect(d['buy_guard'])['toBe']('configured'),expect(d['admins'])['toBe']('configured');}),it('carries\x20risk\x20finding\x20titles\x20+\x20graph-aware\x20where\x20lines\x20as\x20evidence,\x20never\x20raw\x20ids',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=project(b,FULL['svc']),d=c['items']['flatMap'](f=>f['evidence']),e=itemOf(c,'fund_safety')['evidence']['join']('\x20');expect(e)['toContain']('Payout\x20exposure'),expect(e)['not']['toContain']('::node::'),expect(d['some'](f=>/0x[0-9a-f]{40,}/['test'](f)))['toBe'](![]);}),it('projects\x20my_stakes\x20only\x20when\x20role\x20interest\x20is\x20supplied',async()=>{const b=await assemble(fullServiceState(),FULL['svc']);expect(itemOf(project(b,FULL['svc']),'my_stakes'))['toBeUndefined']();const c={'role':'customer','observer':FULL['buyer'],'stakes':[{'object':FULL['svc'],'object_type':'Service','positions':['buyer'],'state':'in_flight','evidence':[]}],'actions':[],'arb_actions':[],'counterparties':[],'risk_finding_ids':[],'summary':'Buyer\x20has\x20one\x20in-flight\x20order\x20at\x20stake.'},d=itemOf(project(b,FULL['svc'],resolveFacetProfile(),c),'my_stakes');expect(d['state'])['toBe']('present'),expect(d['signals'])['toHaveLength'](0x1),expect(d['signals'][0x0]['label'])['toContain']('buyer'),expect(d['evidence']['join']('\x20'))['toContain']('one\x20in-flight\x20order');});}),describe('facet\x20projection\x20—\x20configured-empty\x20shell',()=>{it('marks\x20verified\x20absences\x20empty/missing\x20and\x20the\x20dangling\x20machine\x20a\x20gap',async()=>{const b=await assemble(gapServiceState(),GAP['svc']),c=project(b,GAP['svc']);expect(itemOf(c,'workflow')?.['state'])['toBe']('gap'),expect(itemOf(c,'workflow')?.['gap_reason'])['toBeTruthy'](),expect(itemOf(c,'workflow')?.['graph'])['toBeUndefined'](),expect(itemOf(c,'offering_price')?.['state'])['toBe']('empty'),expect(itemOf(c,'fund_flow')?.['state'])['toBe']('empty'),expect(itemOf(c,'supply_chain')?.['state'])['toBe']('empty');const d=itemOf(c,'arbitration');expect(d['state'])['toBe']('present'),expect(d['signals']['find'](f=>f['key']==='arbitration_binding')?.['state'])['toBe']('missing');const e=itemOf(c,'permission');expect(e['state'])['toBe']('present'),expect(e['signals']['find'](f=>f['key']==='buy_guard')?.['state'])['toBe']('missing'),expect(e['signals']['find'](f=>f['key']==='service_permission')?.['state'])['toBe']('configured');});}),describe('facet\x20projection\x20—\x20truncated\x20order\x20window',()=>{it('exposes\x20fund_safety/fulfillment\x20as\x20gaps\x20with\x20no\x20score\x20refs\x20and\x20a\x20reason',async()=>{const b=await assemble(truncatedServiceState(),FULL['svc']),c=project(b,FULL['svc']);for(const d of['fund_safety','fulfillment']){const e=itemOf(c,d);expect(e['state'])['toBe']('gap'),expect(e['scores']??[])['toEqual']([]),expect(e['gap_reason'])['toBeTruthy']();}expect(itemOf(c,'reputation')?.['state'])['toBe']('present');});}),describe('facet\x20projection\x20—\x20profile\x20lens',()=>{it('orders\x20facets\x20by\x20role\x20emphasis\x20and\x20hides\x20profile-hidden\x20facets',async()=>{const b=await assemble(fullServiceState(),FULL['svc']),c=resolveFacetProfile({'role':'merchant'}),d=project(b,FULL['svc'],c);expect(d['items'][0x0]['id'])['toBe']('fund_flow'),expect(d['profile']['role'])['toBe']('merchant'),expect(d['profile']['sources']['some'](g=>g['startsWith']('role\x20default:merchant')))['toBe'](!![]);const e=resolveFacetProfile({'request':{'fund_safety':{'visible':![]},'reputation':{'order':0x1}}}),f=project(b,FULL['svc'],e);expect(f['items']['some'](g=>g['id']==='fund_safety'))['toBe'](![]),expect(f['items'][0x0]['id'])['toBe']('reputation');});});
@@ -83,9 +83,29 @@ export interface FundExposure {
83
83
  fund: string;
84
84
  windowedCount: number;
85
85
  windowedAmount: string;
86
+ largestAmount: string;
86
87
  neededCeiling: string;
87
88
  coverageMet: boolean;
88
89
  }
90
+ export interface FundListingWall {
91
+ fund: string;
92
+ coverCap: string;
93
+ largestListing: string;
94
+ blockedCount: number;
95
+ blockedNames: string[];
96
+ walled: boolean;
97
+ }
98
+ export interface WallListing {
99
+ name: string;
100
+ price: bigint;
101
+ }
102
+ export interface FundListingWallCore {
103
+ coverCap: bigint;
104
+ largestListing: bigint;
105
+ blocked: WallListing[];
106
+ walled: boolean;
107
+ }
108
+ export declare function computeFundListingWall(fund: bigint, sellable: WallListing[]): FundListingWallCore;
89
109
  export interface TransparencyProfile {
90
110
  description: string;
91
111
  location: string;
@@ -1 +1 @@
1
- import{RETENTION_RANK,pathConfidence,findingWhere}from'./analyze.js';import{orderCompletionInGraph}from'./expand.js';import{profileOf}from'./viewport.js';const STATE_RANK={'present':0x0,'empty':0x1,'gap':0x2};function worstState(c,d){return STATE_RANK[c]>=STATE_RANK[d]?c:d;}export const COVERAGE_VOCABULARY={'present':'present\x20—\x20evidence\x20retrieved\x20and\x20non-empty;\x20real\x20material\x20the\x20rules\x20can\x20score.','empty':'empty\x20—\x20the\x20read\x20completed\x20and\x20verified\x20the\x20absence\x20of\x20data\x20(e.g.\x20no\x20review\x20votes);\x20an\x20answered\x20fact\x20the\x20rules\x20may\x20score,\x20never\x20a\x20fetch\x20failure.','gap':'gap\x20—\x20the\x20evidence\x20was\x20not\x20retrieved,\x20errored,\x20or\x20was\x20truncated;\x20it\x20is\x20unverifiable,\x20so\x20it\x20is\x20excluded\x20from\x20scoring\x20and\x20listed\x20in\x20unverified,\x20never\x20defaulted\x20to\x20a\x20low\x20score.','unverified':'unverified\x20—\x20rule\x20ids\x20excluded\x20from\x20the\x20score\x20because\x20their\x20evidence\x20is\x20gap-state;\x20missing\x20here\x20means\x20every\x20rule\x20was\x20scored\x20on\x20fetched\x20facts.','completeness':'completeness\x20—\x20percentage\x20of\x20required\x20evidence\x20slots\x20that\x20carry\x20material\x20(present);\x20verified-empty\x20slots\x20lower\x20it\x20but\x20stay\x20fully\x20scoreable.'};const REQUIRED_SLOTS=[{'slot':'service_snapshot','label':'Service\x20snapshot','gloss':'The\x20service\x27s\x20own\x20on-chain\x20record\x20(publish/pause\x20status,\x20price,\x20fund\x20and\x20bindings),\x20fetched\x20directly\x20from\x20chain.'},{'slot':'arbitration','label':'Arbitration\x20binding','gloss':'Dispute-resolution\x20services\x20bound\x20to\x20this\x20shop\x20—\x20whether\x20one\x20exists,\x20carries\x20a\x20voter\x20roster,\x20has\x20a\x20funded\x20fee,\x20and\x20is\x20not\x20paused.'},{'slot':'reviews','label':'Review\x20votes','gloss':'On-chain\x20like/dislike\x20votes\x20left\x20by\x20completed-order\x20counterparties;\x20an\x20empty\x20window\x20means\x20nobody\x20voted\x20yet,\x20not\x20a\x20bad\x20rating.'},{'slot':'fulfillment_orders','label':'Recent\x20orders','gloss':'Orders\x20in\x20the\x20shop\x27s\x20recent\x20order\x20window\x20with\x20completion\x20and\x20refund\x20outcomes,\x20used\x20to\x20measure\x20real\x20fulfillment.'},{'slot':'fulfillment_workflow','label':'Fulfillment\x20workflow','gloss':'The\x20bound\x20machine\x27s\x20nodes\x20and\x20forwards\x20that\x20every\x20paid\x20order\x20must\x20progress\x20through\x20to\x20reach\x20completion\x20or\x20refund.'},{'slot':'fund_safety','label':'Compensation\x20fund\x20vs\x20exposure','gloss':'The\x20merchant\x27s\x20compensation\x20fund\x20balance\x20measured\x20against\x20recent\x20order\x20volume\x20(the\x20safety\x20buffer\x20for\x20payouts).'},{'slot':'transparency','label':'Transparency\x20profile','gloss':'The\x20shop\x27s\x20public\x20on-chain\x20profile\x20—\x20description\x20and\x20publish/pause\x20flags\x20a\x20buyer\x20can\x20verify\x20before\x20paying.'}],SLOT_FACTS={'service_snapshot':[],'arbitration':['arbitration.binding'],'reviews':['reviews.votes'],'fulfillment_orders':['fulfillment.orders'],'fulfillment_workflow':['fulfillment.workflow'],'fund_safety':['fund.compensation','fund.exposure'],'transparency':['transparency.profile']},RISK_RULE_SOURCES={'risk_workflow':{'slots':['fulfillment_workflow'],'ruleIds':['R4']},'risk_fund':{'slots':['fund_safety','fulfillment_orders'],'ruleIds':['R2','R7','AC3','AC4']},'risk_trust':{'slots':['arbitration','transparency'],'ruleIds':['R1','R3','R6']},'risk_behavior':{'slots':['fulfillment_orders'],'ruleIds':['AC1','AC2']}};function nodeData(a,b){const c=a['graph']['nodes']['get'](b['toLowerCase']()),e=c?.['raw'],f=e?.['data']??e;return f&&typeof f==='object'?f:undefined;}function isFetched(a,b){const c=a['graph']['nodes']['get'](b['toLowerCase']());return!!c&&a['visibleNodes']['has'](c['id'])&&!!c['raw']&&c['state']!=='error'&&c['state']!=='stub';}function truncationOf(a,b,c){const d=a['graph']['truncations']['find'](e=>e['nodeId']===b&&e['schema']===c);return d?{'observed':d['observed'],'limit':d['limit']}:undefined;}function outEdges(a,b,c){return a['visibleEdges']['filter'](d=>d['from']===b['toLowerCase']()&&d['schema']===c);}function incEdges(a,b,c){return a['visibleEdges']['filter'](d=>d['to']===b['toLowerCase']()&&d['schema']===c);}function toBigInt(a){if(a==null)return 0x0n;try{return BigInt(typeof a==='number'?Math['trunc'](a):String(a));}catch{return 0x0n;}}function flag(a){return a===!![]||a===0x1||a==='1';}function snapProvenance(a){return{'path':a,'retention':'complete','confidence':'exact'};}function edgeProvenance(a,b,c){const {confidence:d,window:e}=pathConfidence(a,c),f=c['reduce']((g,h)=>RETENTION_RANK[h['retention']]>RETENTION_RANK[g]?h['retention']:g,'complete');return{'path':b,'retention':f,'confidence':d,...e?{'window':e}:{}};}export function projectEvaluationFacts(a,b,c){const f=b['toLowerCase'](),g=[],h=new Map(),i=new Map(),j=(U,V,W='exact')=>{h['set'](U,V),i['set'](U,W);},k=a['graph']['nodes']['get'](f),l=a['visibleNodes']['has'](f),m=!!(l&&k&&k['raw']&&k['state']!=='error'&&k['state']!=='stub'&&k['objectType']==='Service'),o=m?nodeData(a,f)??{}:{},q=k?.['coinType'];j('service_snapshot',m?'present':'gap');const r=Array['isArray'](o['arbitrations'])?o['arbitrations']['map'](String)['filter'](Boolean):[],u=outEdges(a,f,'service.arbitration'),w=[];let x=!![];for(const U of r){if(!isFetched(a,U)){x=![];continue;}const V=nodeData(a,U)??{},W=Array['isArray'](V['voting_guard'])?V['voting_guard']:[];w['push']({'id':U['toLowerCase'](),'paused':flag(V['bPaused']),'fee':toBigInt(V['fee'])['toString'](),'votingGuards':W['length'],'usageGuard':typeof V['usage_guard']==='string'&&V['usage_guard']!==''});}if(!m)j('arbitration','gap'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'gap','provenance':snapProvenance([f]),'evidence':'Arbitration\x20configuration\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{if(r['length']===0x0)j('arbitration','empty'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'empty','value':[],'provenance':snapProvenance([f,'Service.arbitrations']),'evidence':'Service\x20snapshot\x20shows\x20no\x20arbitration\x20service\x20configured\x20(verified\x20absence).'});else!x?(j('arbitration','gap'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'gap','value':w,'provenance':u['length']>0x0?edgeProvenance(a,[f,'service.arbitration'],u):snapProvenance([f,'Service.arbitrations']),'evidence':w['length']+'/'+r['length']+'\x20arbitration\x20service(s)\x20resolved;\x20the\x20rest\x20failed\x20to\x20fetch.'})):(j('arbitration','present',u['length']>0x0?edgeProvenance(a,[f,'service.arbitration'],u)['confidence']:'exact'),g['push']({'dimension':'arbitration','key':'arbitration.binding','state':'present','value':w,'provenance':u['length']>0x0?edgeProvenance(a,[f,'service.arbitration'],u):snapProvenance([f,'Service.arbitrations']),'evidence':w['length']+'\x20arbitration\x20service(s)\x20resolved\x20from\x20the\x20snapshot\x20with\x20voting\x20rosters.'}));}const y=outEdges(a,f,'target.vote'),z=truncationOf(a,f,'target.vote'),A={'total':y['length'],'like':0x0,'dislike':0x0,'favor':0x0};for(const X of y){const Y=typeof X['payload']?.['voteBits']==='number'?X['payload']['voteBits']:0x0;if(Y&0x2)A['like']+=0x1;if(Y&0x4)A['dislike']+=0x1;if(Y&0x8)A['favor']+=0x1;}const B=y['length']>0x0?edgeProvenance(a,[f,'target.vote'],y):snapProvenance([f,'registrar.votes']);if(!m)j('reviews','gap'),g['push']({'dimension':'reviews','key':'reviews.votes','state':'gap','provenance':snapProvenance([f]),'evidence':'Reputation\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{if(z)j('reviews','gap',B['confidence']),g['push']({'dimension':'reviews','key':'reviews.votes','state':'gap','value':A,'provenance':{...B,'window':z},'evidence':'Vote\x20window\x20truncated\x20at\x20'+z['limit']+';\x20'+A['total']+'\x20vote(s)\x20visible\x20—\x20counts\x20are\x20a\x20floor.'});else A['total']===0x0?(j('reviews','empty'),g['push']({'dimension':'reviews','key':'reviews.votes','state':'empty','value':A,'provenance':B,'evidence':'No\x20registrar\x20votes\x20recorded\x20for\x20the\x20service\x20(window\x20read\x20empty,\x20no\x20truncation).'})):(j('reviews','present',B['confidence']),g['push']({'dimension':'reviews','key':'reviews.votes','state':'present','value':A,'provenance':B,'evidence':A['total']+'\x20registrar\x20vote(s):\x20'+A['like']+'\x20like,\x20'+A['dislike']+'\x20dislike,\x20'+A['favor']+'\x20favor.'}));}const C=outEdges(a,f,'service.order'),D=truncationOf(a,f,'service.order'),E={'observed':C['length'],'completed':0x0,'inProgress':0x0,'unknown':0x0,'windowedAmount':'0'};let F=0x0n;for(const Z of C){const a0=orderCompletionInGraph(a['graph'],Z['to'])['status'];if(a0==='completed')E['completed']+=0x1;else{if(a0==='in_progress')E['inProgress']+=0x1;else E['unknown']+=0x1;}F+=toBigInt(nodeData(a,Z['to'])?.['amount']);}E['windowedAmount']=F['toString']();const G=C['length']>0x0?edgeProvenance(a,[f,'service.order','Order'],C):snapProvenance([f,'service.order']);let H;if(!m)H='gap';else{if(D)H='gap';else H=C['length']===0x0?'empty':'present';}j('fulfillment_orders',H,G['confidence']);if(H==='gap'&&m)g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'gap','value':E,'provenance':{...G,'window':D},'evidence':'Order\x20window\x20truncated\x20at\x20'+D?.['limit']+'\x20(observed\x20'+D?.['observed']+');\x20'+E['observed']+'\x20order(s)\x20visible\x20—\x20completion\x20stats\x20are\x20a\x20partial\x20floor.'});else{if(H==='empty')g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'empty','value':E,'provenance':G,'evidence':'No\x20orders\x20in\x20the\x20service\x20window\x20(verified\x20absence).'});else H==='present'?g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'present','value':E,'provenance':G,'evidence':E['observed']+'\x20recent\x20order(s):\x20'+E['completed']+'\x20completed,\x20'+E['inProgress']+'\x20in\x20progress,\x20'+E['unknown']+'\x20unresolved.'}):g['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'gap','provenance':snapProvenance([f]),'evidence':'Order\x20window\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});}const I=typeof o['machine']==='string'?o['machine']:'',J=I!==''&&isFetched(a,I),K=I===''?'':I['toLowerCase']()+'::node::',L=K===''?[]:a['graph']['edges']['filter'](a1=>a1['schema']==='wf.transition'&&a1['from']['startsWith'](K)),M=new Set();for(const a1 of L){M['add'](a1['from']);const a2=String(a1['payload']?.['node']??'');if(a2!=='')M['add'](''+K+a2);}let N,O;if(!m)N='gap',O='Workflow\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.';else{if(I==='')N='empty',O='No\x20workflow\x20template\x20configured\x20(verified\x20absence).';else{if(!J)N='gap',O='Machine\x20template\x20referenced\x20but\x20not\x20fetched\x20(fetch\x20gap).';else L['length']===0x0?(N='gap',O='Machine\x20fetched\x20but\x20no\x20wf.transition\x20edges\x20—\x20terminal\x20set\x20unverifiable;\x20completion\x20states\x20stay\x20unknown.'):(N='present',O='Machine\x20template\x20resolved\x20with\x20'+M['size']+'\x20workflow\x20node(s);\x20terminal\x20set\x20verifiable.');}}j('fulfillment_workflow',N,N==='present'?'exact':N==='empty'?'exact':'windowed'),g['push']({'dimension':'fulfillment','key':'fulfillment.workflow','state':N,...I!==''&&J?{'value':{'machine':I['toLowerCase'](),'nodes':M['size']}}:{},'provenance':N==='present'?edgeProvenance(a,[f,'service.machine','wf.transition'],L):snapProvenance([f,'Service.machine']),'evidence':O});const P=toBigInt(o['compensation_fund']);if(!m)j('fund_safety','gap'),g['push']({'dimension':'fund_safety','key':'fund.compensation','state':'gap','provenance':snapProvenance([f]),'evidence':'Fund\x20backing\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'}),g['push']({'dimension':'fund_safety','key':'fund.exposure','state':'gap','provenance':snapProvenance([f]),'evidence':'Payout\x20exposure\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{j('fund_safety','present'),g['push']({'dimension':'fund_safety','key':'fund.compensation','state':'present','value':{'fund':P['toString'](),...q?{'coinType':q}:{}},'provenance':snapProvenance([f,'Service.compensation_fund']),'evidence':'Compensation\x20fund\x20'+P['toString']()+'\x20base\x20units'+(q?'\x20in\x20'+q:'')+'.'});const a3=F*0x3n,a4=worstState('present',H),a5=c['find'](a6=>a6['id']==='R2:'+f);g['push']({'dimension':'fund_safety','key':'fund.exposure','state':a4,'value':{'fund':P['toString'](),'windowedCount':E['observed'],'windowedAmount':F['toString'](),'neededCeiling':a3['toString'](),'coverageMet':P>=a3},'provenance':C['length']>0x0?edgeProvenance(a,[f,'service.order','Order.amount','Service.compensation_fund'],C):snapProvenance([f,'Service.compensation_fund']),'findingIds':a5?[a5['id']]:undefined,'evidence':H==='empty'?'No\x20recent\x20orders;\x20no\x20payout\x20exposure\x20to\x20cover.':'Recent\x20orders\x20total\x20'+F['toString']()+'\x20base\x20units'+(q?'\x20in\x20'+q:'')+'\x20across\x20'+E['observed']+'\x20order(s);\x20the\x20compensation\x20fund\x20should\x20cover\x20at\x20least\x203x\x20that\x20('+a3['toString']()+'\x20base\x20units'+(q?'\x20in\x20'+q:'')+')\x20—\x20coverage\x20'+(P>=a3?'met':'not\x20met')+(D?'\x20(older\x20orders\x20outside\x20the\x20fetch\x20window,\x20floor\x20value\x20only)':'')+'.'});}if(!m)j('transparency','gap'),g['push']({'dimension':'transparency','key':'transparency.profile','state':'gap','provenance':snapProvenance([f]),'evidence':'Transparency\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{const a6=typeof o['setting_lock_duration']==='number'?o['setting_lock_duration']:Number(toBigInt(o['setting_lock_duration'])),a7=flag(o['bPublished']);j('transparency','present'),g['push']({'dimension':'transparency','key':'transparency.profile','state':'present','value':{'description':typeof o['description']==='string'?o['description']:'','location':typeof o['location']==='string'?o['location']:'','settingLockDuration':Number['isFinite'](a6)?a6:0x0,'published':a7,'paused':flag(o['bPaused'])},'provenance':snapProvenance([f,'Service.bPublished','Service.setting_lock_duration']),'findingIds':c['some'](a8=>a8['id']==='R6:'+f)?['R6:'+f]:undefined,'evidence':'Service\x20profile:\x20description\x20'+(typeof o['description']==='string'&&o['description']!==''?'provided':'not\x20provided')+',\x20location\x20'+(typeof o['location']==='string'&&o['location']!==''?'provided':'not\x20provided')+',\x20service\x20lock\x20'+a6+'\x20ms,\x20'+(a7?'published':'unpublished')+'.'});}for(const a8 of['risk_workflow','risk_fund','risk_trust','risk_behavior']){const a9=RISK_RULE_SOURCES[a8];let aa='present',ab,ac=-0x1;for(const ak of a9['slots']){const al=h['get'](ak)??'gap';STATE_RANK[al]>ac&&(ac=STATE_RANK[al],aa=al,ab=ak);}let ae;if(aa==='gap')ae='windowed';else{if(aa==='empty')ae='bounded';else ae=ab&&i['get'](ab)||'exact';}const af=f['toLowerCase'](),ag=new Set([af]);{const am=[af];while(am['length']>0x0){const an=am['shift']();for(const ao of a['graph']['out']['get'](an)??[]){if(ao['family']!=='F'&&ao['family']!=='W'&&ao['family']!=='M')continue;const ap=ao['to']['toLowerCase']();!ag['has'](ap)&&(ag['add'](ap),am['push'](ap));}}}const ah=(aq,ar)=>{if(!aq['startsWith'](ar+':'))return![];const as=aq['slice'](ar['length']+0x1)['toLowerCase'](),at=as['split']('#')[0x0]['split']('|')[0x0],au=at['split'](':');if(au['some'](av=>av['length']===0x0))return!![];return au['some'](av=>ag['has'](av));},ai=c['filter'](aq=>a9['ruleIds']['some'](ar=>ah(aq['id'],ar))),aj=c['filter'](aq=>a9['ruleIds']['some'](ar=>aq['id']['startsWith'](ar+':')&&!ah(aq['id'],ar)))['length'];g['push']({'dimension':a8,'key':a8+'.findings','state':aa,'value':{'findings':ai['map'](aq=>({'id':aq['id'],'severity':aq['severity'],'title':aq['title']})),'where':ai['map'](aq=>findingWhere(aq))},'provenance':{'path':[f,...a9['slots']],'retention':'derived','confidence':ae},'findingIds':ai['map'](aq=>aq['id']),'evidence':aa==='gap'?'Input\x20evidence\x20has\x20fetch\x20gaps;\x20the\x20risk\x20conclusion\x20is\x20unverifiable.':aa==='empty'?'Input\x20evidence\x20is\x20configured-empty;\x20the\x20risk\x20rules\x20are\x20not\x20applicable.':ai['length']>0x0?ai['length']+'\x20structural\x20risk\x20finding(s)\x20on\x20this\x20object,\x20from\x20the\x20analyzer\x20registry.'+(aj>0x0?'\x20'+aj+'\x20further\x20finding(s)\x20on\x20NEIGHBOR\x20objects\x20(reachable\x20only\x20through\x20shared\x20reverse/social\x20edges)\x20are\x20folded\x20here\x20as\x20a\x20count\x20—\x20they\x20do\x20not\x20belong\x20to\x20this\x20object\x27s\x20score\x20(N-K5).':''):aj>0x0?'No\x20risk\x20fired\x20on\x20this\x20object\x27s\x20own\x20structure;\x20'+aj+'\x20finding(s)\x20on\x20neighbor\x20objects\x20(shared\x20edges\x20only)\x20are\x20excluded\x20from\x20the\x20score\x20(N-K5).':'No\x20risk\x20fired\x20on\x20this\x20object;\x20input\x20evidence\x20slots\x20are\x20fully\x20materialized.'});}const Q=[];for(const aq of a['visibleNodes']){const ar=profileOf(a,aq);if(!ar)continue;const as=Array['isArray'](ar['profileRecords'])?ar['profileRecords']:undefined;Q['push']({'nodeId':aq,...typeof ar['registeredAt']==='number'?{'registeredAt':ar['registeredAt']}:{},'hasDescription':!!ar['hasDescription']||typeof ar['description']==='string','recordCount':typeof ar['recordCount']==='number'?ar['recordCount']:as?.['length']??0x0,...typeof ar['description']==='string'?{'description':ar['description']}:{},...as?{'profileRecords':as}:{}});}const R=REQUIRED_SLOTS['length'],S=REQUIRED_SLOTS['filter'](({slot:at})=>h['get'](at)==='present')['length'],T=R===0x0?0x64:Math['round'](S/R*0x64);return{'target':f,'role':String(a['role']),'facts':g,'slots':REQUIRED_SLOTS['map'](({slot:at,label:au,gloss:av})=>({'slot':at,'label':au,'gloss':av,'required':!![],'state':h['get'](at)??'gap','facts':[...SLOT_FACTS[at]??[]]})),'completeness':T,'profiles':Q};}
1
+ import{RETENTION_RANK,pathConfidence,findingWhere}from'./analyze.js';import{orderCompletionInGraph}from'./expand.js';import{profileOf}from'./viewport.js';const STATE_RANK={'present':0x0,'empty':0x1,'gap':0x2};function worstState(c,d){return STATE_RANK[c]>=STATE_RANK[d]?c:d;}export const COVERAGE_VOCABULARY={'present':'present\x20—\x20evidence\x20retrieved\x20and\x20non-empty;\x20real\x20material\x20the\x20rules\x20can\x20score.','empty':'empty\x20—\x20the\x20read\x20completed\x20and\x20verified\x20the\x20absence\x20of\x20data\x20(e.g.\x20no\x20review\x20votes);\x20an\x20answered\x20fact\x20the\x20rules\x20may\x20score,\x20never\x20a\x20fetch\x20failure.','gap':'gap\x20—\x20the\x20evidence\x20was\x20not\x20retrieved,\x20errored,\x20or\x20was\x20truncated;\x20it\x20is\x20unverifiable,\x20so\x20it\x20is\x20excluded\x20from\x20scoring\x20and\x20listed\x20in\x20unverified,\x20never\x20defaulted\x20to\x20a\x20low\x20score.','unverified':'unverified\x20—\x20rule\x20ids\x20excluded\x20from\x20the\x20score\x20because\x20their\x20evidence\x20is\x20gap-state;\x20missing\x20here\x20means\x20every\x20rule\x20was\x20scored\x20on\x20fetched\x20facts.','completeness':'completeness\x20—\x20percentage\x20of\x20required\x20evidence\x20slots\x20that\x20carry\x20material\x20(present);\x20verified-empty\x20slots\x20lower\x20it\x20but\x20stay\x20fully\x20scoreable.'};export function computeFundListingWall(a,b){const c=a/0x3n,d=a>0x0n?b['filter'](f=>f['price']*0x3n>a)['sort']((f,g)=>g['price']>f['price']?0x1:g['price']<f['price']?-0x1:0x0):[],e=b['reduce']((f,g)=>g['price']>f?g['price']:f,0x0n);return{'coverCap':c,'largestListing':e,'blocked':d,'walled':d['length']>0x0};}const REQUIRED_SLOTS=[{'slot':'service_snapshot','label':'Service\x20snapshot','gloss':'The\x20service\x27s\x20own\x20on-chain\x20record\x20(publish/pause\x20status,\x20price,\x20fund\x20and\x20bindings),\x20fetched\x20directly\x20from\x20chain.'},{'slot':'arbitration','label':'Arbitration\x20binding','gloss':'Dispute-resolution\x20services\x20bound\x20to\x20this\x20shop\x20—\x20whether\x20one\x20exists,\x20carries\x20a\x20voter\x20roster,\x20has\x20a\x20funded\x20fee,\x20and\x20is\x20not\x20paused.'},{'slot':'reviews','label':'Review\x20votes','gloss':'On-chain\x20like/dislike\x20votes\x20left\x20by\x20completed-order\x20counterparties;\x20an\x20empty\x20window\x20means\x20nobody\x20voted\x20yet,\x20not\x20a\x20bad\x20rating.'},{'slot':'fulfillment_orders','label':'Recent\x20orders','gloss':'Orders\x20in\x20the\x20shop\x27s\x20recent\x20order\x20window\x20with\x20completion\x20and\x20refund\x20outcomes,\x20used\x20to\x20measure\x20real\x20fulfillment.'},{'slot':'fulfillment_workflow','label':'Fulfillment\x20workflow','gloss':'The\x20bound\x20machine\x27s\x20nodes\x20and\x20forwards\x20that\x20every\x20paid\x20order\x20must\x20progress\x20through\x20to\x20reach\x20completion\x20or\x20refund.'},{'slot':'fund_safety','label':'Compensation\x20fund\x20vs\x20exposure','gloss':'The\x20merchant\x27s\x20compensation\x20fund\x20balance\x20measured\x20against\x20the\x20largest\x20recent\x20order\x20(the\x20statutory\x203x\x20payout\x20buffer).'},{'slot':'transparency','label':'Transparency\x20profile','gloss':'The\x20shop\x27s\x20public\x20on-chain\x20profile\x20—\x20description\x20and\x20publish/pause\x20flags\x20a\x20buyer\x20can\x20verify\x20before\x20paying.'}],SLOT_FACTS={'service_snapshot':[],'arbitration':['arbitration.binding'],'reviews':['reviews.votes'],'fulfillment_orders':['fulfillment.orders'],'fulfillment_workflow':['fulfillment.workflow'],'fund_safety':['fund.compensation','fund.exposure','fund.listing_wall'],'transparency':['transparency.profile']},RISK_RULE_SOURCES={'risk_workflow':{'slots':['fulfillment_workflow'],'ruleIds':['R4']},'risk_fund':{'slots':['fund_safety','fulfillment_orders'],'ruleIds':['R2','R7','AC3','AC4']},'risk_trust':{'slots':['arbitration','transparency'],'ruleIds':['R1','R3','R6']},'risk_behavior':{'slots':['fulfillment_orders'],'ruleIds':['AC1','AC2']}};function nodeData(a,b){const c=a['graph']['nodes']['get'](b['toLowerCase']()),e=c?.['raw'],f=e?.['data']??e;return f&&typeof f==='object'?f:undefined;}function isFetched(a,b){const c=a['graph']['nodes']['get'](b['toLowerCase']());return!!c&&a['visibleNodes']['has'](c['id'])&&!!c['raw']&&c['state']!=='error'&&c['state']!=='stub';}function truncationOf(a,b,c){const d=a['graph']['truncations']['find'](e=>e['nodeId']===b&&e['schema']===c);return d?{'observed':d['observed'],'limit':d['limit']}:undefined;}function outEdges(a,b,c){return a['visibleEdges']['filter'](d=>d['from']===b['toLowerCase']()&&d['schema']===c);}function incEdges(a,b,c){return a['visibleEdges']['filter'](d=>d['to']===b['toLowerCase']()&&d['schema']===c);}function toBigInt(a){if(a==null)return 0x0n;try{return BigInt(typeof a==='number'?Math['trunc'](a):String(a));}catch{return 0x0n;}}function flag(a){return a===!![]||a===0x1||a==='1';}function readSellableListings(a){const b=a['sales'];if(Array['isArray'](b))return b['map'](c=>{const e=c??{};return{'name':typeof e['name']==='string'?e['name']:'','price':toBigInt(e['price']),'suspended':flag(e['suspension'])};})['filter'](c=>!c['suspended']&&c['price']>0x0n)['map'](({name:c,price:e})=>({'name':c,'price':e}));if(typeof b==='string'&&b!==''){const c=toBigInt(b);return c>0x0n?[{'name':'','price':c}]:[];}return[];}function snapProvenance(a){return{'path':a,'retention':'complete','confidence':'exact'};}function edgeProvenance(a,b,c){const {confidence:d,window:e}=pathConfidence(a,c),f=c['reduce']((g,h)=>RETENTION_RANK[h['retention']]>RETENTION_RANK[g]?h['retention']:g,'complete');return{'path':b,'retention':f,'confidence':d,...e?{'window':e}:{}};}export function projectEvaluationFacts(b,c,f){const g=c['toLowerCase'](),h=[],i=new Map(),j=new Map(),k=(W,X,Y='exact')=>{i['set'](W,X),j['set'](W,Y);},l=b['graph']['nodes']['get'](g),m=b['visibleNodes']['has'](g),o=!!(m&&l&&l['raw']&&l['state']!=='error'&&l['state']!=='stub'&&l['objectType']==='Service'),q=o?nodeData(b,g)??{}:{},r=l?.['coinType'];k('service_snapshot',o?'present':'gap');const u=Array['isArray'](q['arbitrations'])?q['arbitrations']['map'](String)['filter'](Boolean):[],w=outEdges(b,g,'service.arbitration'),x=[];let y=!![];for(const W of u){if(!isFetched(b,W)){y=![];continue;}const X=nodeData(b,W)??{},Y=Array['isArray'](X['voting_guard'])?X['voting_guard']:[];x['push']({'id':W['toLowerCase'](),'paused':flag(X['bPaused']),'fee':toBigInt(X['fee'])['toString'](),'votingGuards':Y['length'],'usageGuard':typeof X['usage_guard']==='string'&&X['usage_guard']!==''});}if(!o)k('arbitration','gap'),h['push']({'dimension':'arbitration','key':'arbitration.binding','state':'gap','provenance':snapProvenance([g]),'evidence':'Arbitration\x20configuration\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{if(u['length']===0x0)k('arbitration','empty'),h['push']({'dimension':'arbitration','key':'arbitration.binding','state':'empty','value':[],'provenance':snapProvenance([g,'Service.arbitrations']),'evidence':'Service\x20snapshot\x20shows\x20no\x20arbitration\x20service\x20configured\x20(verified\x20absence).'});else!y?(k('arbitration','gap'),h['push']({'dimension':'arbitration','key':'arbitration.binding','state':'gap','value':x,'provenance':w['length']>0x0?edgeProvenance(b,[g,'service.arbitration'],w):snapProvenance([g,'Service.arbitrations']),'evidence':x['length']+'/'+u['length']+'\x20arbitration\x20service(s)\x20resolved;\x20the\x20rest\x20failed\x20to\x20fetch.'})):(k('arbitration','present',w['length']>0x0?edgeProvenance(b,[g,'service.arbitration'],w)['confidence']:'exact'),h['push']({'dimension':'arbitration','key':'arbitration.binding','state':'present','value':x,'provenance':w['length']>0x0?edgeProvenance(b,[g,'service.arbitration'],w):snapProvenance([g,'Service.arbitrations']),'evidence':x['length']+'\x20arbitration\x20service(s)\x20resolved\x20from\x20the\x20snapshot\x20with\x20voting\x20rosters.'}));}const z=outEdges(b,g,'target.vote'),A=truncationOf(b,g,'target.vote'),B={'total':z['length'],'like':0x0,'dislike':0x0,'favor':0x0};for(const Z of z){const a0=typeof Z['payload']?.['voteBits']==='number'?Z['payload']['voteBits']:0x0;if(a0&0x2)B['like']+=0x1;if(a0&0x4)B['dislike']+=0x1;if(a0&0x8)B['favor']+=0x1;}const C=z['length']>0x0?edgeProvenance(b,[g,'target.vote'],z):snapProvenance([g,'registrar.votes']);if(!o)k('reviews','gap'),h['push']({'dimension':'reviews','key':'reviews.votes','state':'gap','provenance':snapProvenance([g]),'evidence':'Reputation\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{if(A)k('reviews','gap',C['confidence']),h['push']({'dimension':'reviews','key':'reviews.votes','state':'gap','value':B,'provenance':{...C,'window':A},'evidence':'Vote\x20window\x20truncated\x20at\x20'+A['limit']+';\x20'+B['total']+'\x20vote(s)\x20visible\x20—\x20counts\x20are\x20a\x20floor.'});else B['total']===0x0?(k('reviews','empty'),h['push']({'dimension':'reviews','key':'reviews.votes','state':'empty','value':B,'provenance':C,'evidence':'No\x20registrar\x20votes\x20recorded\x20for\x20the\x20service\x20(window\x20read\x20empty,\x20no\x20truncation).'})):(k('reviews','present',C['confidence']),h['push']({'dimension':'reviews','key':'reviews.votes','state':'present','value':B,'provenance':C,'evidence':B['total']+'\x20registrar\x20vote(s):\x20'+B['like']+'\x20like,\x20'+B['dislike']+'\x20dislike,\x20'+B['favor']+'\x20favor.'}));}const D=outEdges(b,g,'service.order'),E=truncationOf(b,g,'service.order'),F={'observed':D['length'],'completed':0x0,'inProgress':0x0,'unknown':0x0,'windowedAmount':'0'};let G=0x0n,H=0x0n;for(const a1 of D){const a2=orderCompletionInGraph(b['graph'],a1['to'])['status'];if(a2==='completed')F['completed']+=0x1;else{if(a2==='in_progress')F['inProgress']+=0x1;else F['unknown']+=0x1;}const a3=toBigInt(nodeData(b,a1['to'])?.['amount']);G+=a3;if(a3>H)H=a3;}F['windowedAmount']=G['toString']();const I=D['length']>0x0?edgeProvenance(b,[g,'service.order','Order'],D):snapProvenance([g,'service.order']);let J;if(!o)J='gap';else{if(E)J='gap';else J=D['length']===0x0?'empty':'present';}k('fulfillment_orders',J,I['confidence']);if(J==='gap'&&o)h['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'gap','value':F,'provenance':{...I,'window':E},'evidence':'Order\x20window\x20truncated\x20at\x20'+E?.['limit']+'\x20(observed\x20'+E?.['observed']+');\x20'+F['observed']+'\x20order(s)\x20visible\x20—\x20completion\x20stats\x20are\x20a\x20partial\x20floor.'});else{if(J==='empty')h['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'empty','value':F,'provenance':I,'evidence':'No\x20orders\x20in\x20the\x20service\x20window\x20(verified\x20absence).'});else J==='present'?h['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'present','value':F,'provenance':I,'evidence':F['observed']+'\x20recent\x20order(s):\x20'+F['completed']+'\x20completed,\x20'+F['inProgress']+'\x20in\x20progress,\x20'+F['unknown']+'\x20unresolved.'}):h['push']({'dimension':'fulfillment','key':'fulfillment.orders','state':'gap','provenance':snapProvenance([g]),'evidence':'Order\x20window\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});}const K=typeof q['machine']==='string'?q['machine']:'',L=K!==''&&isFetched(b,K),M=K===''?'':K['toLowerCase']()+'::node::',N=M===''?[]:b['graph']['edges']['filter'](a4=>a4['schema']==='wf.transition'&&a4['from']['startsWith'](M)),O=new Set();for(const a4 of N){O['add'](a4['from']);const a5=String(a4['payload']?.['node']??'');if(a5!=='')O['add'](''+M+a5);}let P,Q;if(!o)P='gap',Q='Workflow\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.';else{if(K==='')P='empty',Q='No\x20workflow\x20template\x20configured\x20(verified\x20absence).';else{if(!L)P='gap',Q='Machine\x20template\x20referenced\x20but\x20not\x20fetched\x20(fetch\x20gap).';else N['length']===0x0?(P='gap',Q='Machine\x20fetched\x20but\x20no\x20wf.transition\x20edges\x20—\x20terminal\x20set\x20unverifiable;\x20completion\x20states\x20stay\x20unknown.'):(P='present',Q='Machine\x20template\x20resolved\x20with\x20'+O['size']+'\x20workflow\x20node(s);\x20terminal\x20set\x20verifiable.');}}k('fulfillment_workflow',P,P==='present'?'exact':P==='empty'?'exact':'windowed'),h['push']({'dimension':'fulfillment','key':'fulfillment.workflow','state':P,...K!==''&&L?{'value':{'machine':K['toLowerCase'](),'nodes':O['size']}}:{},'provenance':P==='present'?edgeProvenance(b,[g,'service.machine','wf.transition'],N):snapProvenance([g,'Service.machine']),'evidence':Q});const R=toBigInt(q['compensation_fund']);if(!o)k('fund_safety','gap'),h['push']({'dimension':'fund_safety','key':'fund.compensation','state':'gap','provenance':snapProvenance([g]),'evidence':'Fund\x20backing\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'}),h['push']({'dimension':'fund_safety','key':'fund.exposure','state':'gap','provenance':snapProvenance([g]),'evidence':'Payout\x20exposure\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{k('fund_safety','present'),h['push']({'dimension':'fund_safety','key':'fund.compensation','state':'present','value':{'fund':R['toString'](),...r?{'coinType':r}:{}},'provenance':snapProvenance([g,'Service.compensation_fund']),'evidence':'Compensation\x20fund\x20'+R['toString']()+'\x20base\x20units'+(r?'\x20in\x20'+r:'')+'.'});const a6=H*0x3n,a7=worstState('present',J),a8=f['find'](aa=>aa['id']==='R2:'+g);h['push']({'dimension':'fund_safety','key':'fund.exposure','state':a7,'value':{'fund':R['toString'](),'windowedCount':F['observed'],'windowedAmount':G['toString'](),'largestAmount':H['toString'](),'neededCeiling':a6['toString'](),'coverageMet':R>=a6},'provenance':D['length']>0x0?edgeProvenance(b,[g,'service.order','Order.amount','Service.compensation_fund'],D):snapProvenance([g,'Service.compensation_fund']),'findingIds':a8?[a8['id']]:undefined,'evidence':J==='empty'?'No\x20recent\x20orders;\x20no\x20payout\x20exposure\x20to\x20cover.':'Largest\x20of\x20'+F['observed']+'\x20recent\x20order(s)\x20is\x20'+H['toString']()+'\x20base\x20units'+(r?'\x20in\x20'+r:'')+';\x20the\x20compensation\x20fund\x20should\x20cover\x20at\x20least\x203x\x20that\x20('+a6['toString']()+'\x20base\x20units'+(r?'\x20in\x20'+r:'')+')\x20—\x20coverage\x20'+(R>=a6?'met':'not\x20met')+(E?'\x20(older\x20orders\x20outside\x20the\x20fetch\x20window,\x20floor\x20value\x20only)':'')+'.'});const a9=readSellableListings(q);if(a9['length']===0x0)h['push']({'dimension':'fund_safety','key':'fund.listing_wall','state':'empty','provenance':snapProvenance([g,'Service.sales','Service.compensation_fund']),'evidence':'No\x20sellable\x20priced\x20listing\x20on\x20this\x20service\x20—\x20no\x20listing\x20can\x20be\x20blocked\x20by\x20the\x20fund\x20ceiling.'});else{const aa=computeFundListingWall(R,a9);h['push']({'dimension':'fund_safety','key':'fund.listing_wall','state':'present','value':{'fund':R['toString'](),'coverCap':aa['coverCap']['toString'](),'largestListing':aa['largestListing']['toString'](),'blockedCount':aa['blocked']['length'],'blockedNames':aa['blocked']['slice'](0x0,0x3)['map'](ab=>ab['name'])['filter'](Boolean),'walled':aa['walled']},'provenance':snapProvenance([g,'Service.sales','Service.compensation_fund']),'evidence':aa['blocked']['length']===0x0?R===0x0n?'No\x20compensation\x20fund\x20—\x20buys\x20are\x20never\x20gated\x20by\x20a\x20fund\x20ceiling;\x20'+a9['length']+'\x20sellable\x20listing(s)\x20stay\x20orderable\x20(zero-fund\x20payout\x20protection\x20is\x20disclosed\x20at\x20the\x20fund\x20read).':'Every\x20sellable\x20listing\x20('+a9['length']+')\x20is\x20priced\x20at\x20or\x20under\x20the\x20live\x20per-order\x20ceiling\x20('+aa['coverCap']['toString']()+'\x20base\x20units'+(r?'\x20in\x20'+r:'')+')\x20—\x20no\x20listing\x20is\x20blocked\x20at\x20checkout.':'The\x20fund\x20covers\x20single\x20orders\x20up\x20to\x20'+aa['coverCap']['toString']()+'\x20base\x20units'+(r?'\x20in\x20'+r:'')+';\x20'+aa['blocked']['length']+'\x20of\x20'+a9['length']+'\x20sellable\x20listing(s)\x20are\x20priced\x20ABOVE\x20it\x20and\x20cannot\x20be\x20checked\x20out\x20(largest\x20first:\x20'+aa['blocked']['map'](ab=>ab['name']||'(unnamed\x20listing)')['join'](',\x20')+')\x20until\x20the\x20fund\x20is\x20topped\x20to\x203x\x20their\x20price\x20or\x20the\x20price\x20is\x20cut.'});}}if(!o)k('transparency','gap'),h['push']({'dimension':'transparency','key':'transparency.profile','state':'gap','provenance':snapProvenance([g]),'evidence':'Transparency\x20unverifiable:\x20the\x20service\x20snapshot\x20is\x20missing.'});else{const ab=typeof q['setting_lock_duration']==='number'?q['setting_lock_duration']:Number(toBigInt(q['setting_lock_duration'])),ac=flag(q['bPublished']);k('transparency','present'),h['push']({'dimension':'transparency','key':'transparency.profile','state':'present','value':{'description':typeof q['description']==='string'?q['description']:'','location':typeof q['location']==='string'?q['location']:'','settingLockDuration':Number['isFinite'](ab)?ab:0x0,'published':ac,'paused':flag(q['bPaused'])},'provenance':snapProvenance([g,'Service.bPublished','Service.setting_lock_duration']),'findingIds':f['some'](ae=>ae['id']==='R6:'+g)?['R6:'+g]:undefined,'evidence':'Service\x20profile:\x20description\x20'+(typeof q['description']==='string'&&q['description']!==''?'provided':'not\x20provided')+',\x20location\x20'+(typeof q['location']==='string'&&q['location']!==''?'provided':'not\x20provided')+',\x20service\x20lock\x20'+ab+'\x20ms,\x20'+(ac?'published':'unpublished')+'.'});}for(const ae of['risk_workflow','risk_fund','risk_trust','risk_behavior']){const af=RISK_RULE_SOURCES[ae];let ag='present',ah,ai=-0x1;for(const ap of af['slots']){const aq=i['get'](ap)??'gap';STATE_RANK[aq]>ai&&(ai=STATE_RANK[aq],ag=aq,ah=ap);}let aj;if(ag==='gap')aj='windowed';else{if(ag==='empty')aj='bounded';else aj=ah&&j['get'](ah)||'exact';}const ak=g['toLowerCase'](),al=new Set([ak]);{const ar=[ak];while(ar['length']>0x0){const as=ar['shift']();for(const at of b['graph']['out']['get'](as)??[]){if(at['family']!=='F'&&at['family']!=='W'&&at['family']!=='M')continue;const au=at['to']['toLowerCase']();!al['has'](au)&&(al['add'](au),ar['push'](au));}}}const am=(av,aw)=>{if(!av['startsWith'](aw+':'))return![];const ax=av['slice'](aw['length']+0x1)['toLowerCase'](),ay=ax['split']('#')[0x0]['split']('|')[0x0],az=ay['split'](':');if(az['some'](aA=>aA['length']===0x0))return!![];return az['some'](aA=>al['has'](aA));},an=f['filter'](av=>af['ruleIds']['some'](aw=>am(av['id'],aw))),ao=f['filter'](av=>af['ruleIds']['some'](aw=>av['id']['startsWith'](aw+':')&&!am(av['id'],aw)))['length'];h['push']({'dimension':ae,'key':ae+'.findings','state':ag,'value':{'findings':an['map'](av=>({'id':av['id'],'severity':av['severity'],'title':av['title']})),'where':an['map'](av=>findingWhere(av))},'provenance':{'path':[g,...af['slots']],'retention':'derived','confidence':aj},'findingIds':an['map'](av=>av['id']),'evidence':ag==='gap'?'Input\x20evidence\x20has\x20fetch\x20gaps;\x20the\x20risk\x20conclusion\x20is\x20unverifiable.':ag==='empty'?'Input\x20evidence\x20is\x20configured-empty;\x20the\x20risk\x20rules\x20are\x20not\x20applicable.':an['length']>0x0?an['length']+'\x20structural\x20risk\x20finding(s)\x20on\x20this\x20object,\x20from\x20the\x20analyzer\x20registry.'+(ao>0x0?'\x20'+ao+'\x20further\x20finding(s)\x20on\x20NEIGHBOR\x20objects\x20(reachable\x20only\x20through\x20shared\x20reverse/social\x20edges)\x20are\x20folded\x20here\x20as\x20a\x20count\x20—\x20they\x20do\x20not\x20belong\x20to\x20this\x20object\x27s\x20score\x20(N-K5).':''):ao>0x0?'No\x20risk\x20fired\x20on\x20this\x20object\x27s\x20own\x20structure;\x20'+ao+'\x20finding(s)\x20on\x20neighbor\x20objects\x20(shared\x20edges\x20only)\x20are\x20excluded\x20from\x20the\x20score\x20(N-K5).':'No\x20risk\x20fired\x20on\x20this\x20object;\x20input\x20evidence\x20slots\x20are\x20fully\x20materialized.'});}const S=[];for(const av of b['visibleNodes']){const aw=profileOf(b,av);if(!aw)continue;const ax=Array['isArray'](aw['profileRecords'])?aw['profileRecords']:undefined;S['push']({'nodeId':av,...typeof aw['registeredAt']==='number'?{'registeredAt':aw['registeredAt']}:{},'hasDescription':!!aw['hasDescription']||typeof aw['description']==='string','recordCount':typeof aw['recordCount']==='number'?aw['recordCount']:ax?.['length']??0x0,...typeof aw['description']==='string'?{'description':aw['description']}:{},...ax?{'profileRecords':ax}:{}});}const T=REQUIRED_SLOTS['length'],U=REQUIRED_SLOTS['filter'](({slot:ay})=>i['get'](ay)==='present')['length'],V=T===0x0?0x64:Math['round'](U/T*0x64);return{'target':g,'role':String(b['role']),'facts':h,'slots':REQUIRED_SLOTS['map'](({slot:ay,label:az,gloss:aA})=>({'slot':ay,'label':az,'gloss':aA,'required':!![],'state':i['get'](ay)??'gap','facts':[...SLOT_FACTS[ay]??[]]})),'completeness':V,'profiles':S};}
@@ -1 +1 @@
1
- import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{FULL,GAP,fullServiceState,gapServiceState,truncatedServiceState}from'./fixtures.js';import{buildViewport}from'./viewport.js';import{runAnalyzers}from'./analyze.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'./strategy.js';import{projectEvaluationFacts}from'./facts.js';async function evalFacts(a,b){const c=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),d=await expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':b,'edges':c['edges'],'budget':c['budget']}),e=buildViewport(d,b,'neutral'),f=runAnalyzers(e);return projectEvaluationFacts(e,b,f);}async function evalFactsWithFindings(a,b,c){const d=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),e=await expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':b,'edges':d['edges'],'budget':d['budget']}),f=buildViewport(e,b,'neutral');return projectEvaluationFacts(f,b,c);}const slotOf=(a,b)=>a['slots']['find'](c=>c['slot']===b),factOf=(a,b)=>{const c=a['facts']['find'](d=>d['key']===b);return expect(c,'fact\x20'+b+'\x20must\x20exist')['toBeDefined'](),c;},EMPTY_STATE={'objects':new Map(),'keyedFields':new Map(),'tables':new Map(),'events':new Map()};describe('facts\x20—\x20fully\x20hooked\x20service\x20(TR-13.1)',()=>{it('classifies\x20every\x20required\x20slot\x20present\x20with\x20material\x20facts',async()=>{const a=await evalFacts(fullServiceState(),FULL['svc']);expect(slotOf(a,'service_snapshot')['state'])['toBe']('present'),expect(slotOf(a,'arbitration')['state'])['toBe']('present'),expect(slotOf(a,'reviews')['state'])['toBe']('present'),expect(slotOf(a,'fulfillment_orders')['state'])['toBe']('present'),expect(slotOf(a,'fulfillment_workflow')['state'])['toBe']('present'),expect(slotOf(a,'fund_safety')['state'])['toBe']('present'),expect(slotOf(a,'transparency')['state'])['toBe']('present'),expect(a['completeness'])['toBe'](0x64);const b=factOf(a,'arbitration.binding');expect(b['state'])['toBe']('present'),expect(b['value'])['toMatchObject']([{'id':FULL['arbsvc']['toLowerCase'](),'paused':![],'votingGuards':0x1,'usageGuard':!![]}]),expect(b['provenance']['path'])['toContain']('service.arbitration'),expect(factOf(a,'reviews.votes')['value'])['toMatchObject']({'total':0x2,'like':0x1,'dislike':0x1,'favor':0x1}),expect(factOf(a,'fulfillment.orders')['value'])['toMatchObject']({'observed':0x2,'completed':0x1,'inProgress':0x1,'unknown':0x0,'windowedAmount':'1000000'});const c=factOf(a,'fulfillment.workflow');expect(c['state'])['toBe']('present'),expect(c['value'])['toMatchObject']({'machine':FULL['mac']['toLowerCase'](),'nodes':0x3}),expect(factOf(a,'fund.compensation')['value'])['toMatchObject']({'fund':'0'});const d=factOf(a,'fund.exposure');expect(d['value'])['toMatchObject']({'windowedCount':0x2,'windowedAmount':'1000000','neededCeiling':'3000000','coverageMet':![]}),expect(d['findingIds'])['toEqual'](['R2:'+FULL['svc']['toLowerCase']()]),expect(factOf(a,'transparency.profile')['findingIds'])['toEqual'](['R6:'+FULL['svc']['toLowerCase']()]);}),it('reuses\x20analyzer\x20findings\x20by\x20reference\x20in\x20the\x20risk\x20dimensions',async()=>{const a=await evalFacts(fullServiceState(),FULL['svc']),b=factOf(a,'risk_trust.findings');expect(b['state'])['toBe']('present'),expect(b['findingIds']['some'](g=>g['startsWith']('R1:')))['toBe'](!![]);const c=factOf(a,'risk_fund.findings');expect(c['state'])['toBe']('present'),expect(c['findingIds'])['toContain']('R2:'+FULL['svc']['toLowerCase']());const d=factOf(a,'risk_behavior.findings');expect(d['state'])['toBe']('present'),expect(d['findingIds'])['toEqual']([]);const e=factOf(a,'risk_workflow.findings');expect(e['state'])['toBe']('present'),expect(e['evidence'])['toContain']('fully\x20materialized');});}),describe('facts\x20—\x20configured-empty\x20shell\x20merchant\x20(TR-13.1)',()=>{it('scores\x20configured\x20absence\x20as\x20empty\x20and\x20the\x20dangling\x20machine\x20as\x20gap',async()=>{const a=await evalFacts(gapServiceState(),GAP['svc']);expect(slotOf(a,'service_snapshot')['state'])['toBe']('present'),expect(slotOf(a,'arbitration')['state'])['toBe']('empty'),expect(factOf(a,'arbitration.binding')['state'])['toBe']('empty'),expect(slotOf(a,'reviews')['state'])['toBe']('empty'),expect(slotOf(a,'fulfillment_orders')['state'])['toBe']('present'),expect(slotOf(a,'fulfillment_workflow')['state'])['toBe']('gap'),expect(factOf(a,'fulfillment.workflow')['evidence'])['toContain']('fetch\x20gap'),expect(slotOf(a,'fund_safety')['state'])['toBe']('present'),expect(slotOf(a,'transparency')['state'])['toBe']('present'),expect(a['completeness'])['toBe'](0x39),expect(factOf(a,'risk_workflow.findings')['state'])['toBe']('gap'),expect(factOf(a,'risk_workflow.findings')['provenance']['confidence'])['toBe']('windowed'),expect(factOf(a,'risk_trust.findings')['state'])['toBe']('empty');});}),describe('facts\x20—\x20truncated\x20order\x20window\x20(TR-13.1)',()=>{it('marks\x20the\x20truncated\x20window\x20slot\x20gap\x20and\x20cascades\x20into\x20risk_fund',async()=>{const a=await evalFacts(truncatedServiceState(),FULL['svc']);expect(slotOf(a,'fulfillment_orders')['state'])['toBe']('gap');const b=factOf(a,'fulfillment.orders');expect(b['state'])['toBe']('gap'),expect(b['provenance']['window'])['toBeDefined'](),expect(b['value']['observed'])['toBeGreaterThan'](0x0);const c=factOf(a,'risk_fund.findings');expect(c['state'])['toBe']('gap'),expect(c['evidence'])['toContain']('unverifiable'),expect(slotOf(a,'arbitration')['state'])['toBe']('present'),expect(slotOf(a,'fulfillment_workflow')['state'])['toBe']('present'),expect(a['completeness'])['toBe'](0x56);});}),describe('facts\x20—\x20completeness\x20(TR-13.2)',()=>{it('is\x20an\x20integer\x200..100\x20consistent\x20with\x20present/required\x20on\x20every\x20fixture',async()=>{const a=await Promise['all']([evalFacts(fullServiceState(),FULL['svc']),evalFacts(gapServiceState(),GAP['svc']),evalFacts(truncatedServiceState(),FULL['svc'])]);for(const b of a){expect(Number['isInteger'](b['completeness']))['toBe'](!![]),expect(b['completeness'])['toBeGreaterThanOrEqual'](0x0),expect(b['completeness'])['toBeLessThanOrEqual'](0x64);const c=b['slots']['filter'](e=>e['required']&&e['state']==='present')['length'],d=b['slots']['filter'](e=>e['required'])['length'];expect(b['completeness'])['toBe'](Math['round'](c/d*0x64));for(const e of b['facts']){expect(e['provenance']['path']['length'])['toBeGreaterThan'](0x0),expect(e['provenance']['retention'])['toBeDefined'](),expect(e['evidence']['length'])['toBeGreaterThan'](0x0);if(e['dimension']['startsWith']('risk_'))continue;const g=e['dimension']==='fulfillment'?e['key']['includes']('workflow')?'fulfillment_workflow':'fulfillment_orders':e['dimension'];expect(slotOf(b,g)['facts'])['toContain'](e['key']);}}}),it('collapses\x20to\x200\x20with\x20all\x20slots\x20gap\x20when\x20the\x20target\x20is\x20missing',async()=>{const a=await evalFacts(EMPTY_STATE,FULL['svc']);expect(a['slots']['every'](b=>b['state']==='gap'))['toBe'](!![]),expect(a['completeness'])['toBe'](0x0),expect(factOf(a,'risk_behavior.findings')['state'])['toBe']('gap');});}),describe('facts\x20—\x20entity\x20profile\x20attributes',()=>{it('projects\x20viewport-cropped\x20payloads;\x20absence\x20yields\x20no\x20entry',async()=>{const a=await evalFacts(fullServiceState(),FULL['svc']),b=a['profiles']['map'](e=>e['nodeId']);expect(b)['toContain'](FULL['supplier']['toLowerCase']());const c=a['profiles']['find'](e=>e['nodeId']===FULL['supplier']['toLowerCase']());expect(c['description'])['toBe']('Acme\x20logistics\x20co.'),expect(c['registeredAt'])['toBe'](0x18bcfe57b88),expect(c['recordCount'])['toBe'](0x1),expect(c['profileRecords'])['toEqual']([{'name':'region','valueType':0x1,'value':'cn-east'}]);const d=a['profiles']['find'](e=>e['nodeId']===FULL['member']['toLowerCase']());expect(d['hasDescription'])['toBe'](!![]),expect(d['recordCount'])['toBe'](0x0),expect(b)['not']['toContain'](FULL['buyer']['toLowerCase']());});}),describe('facts\x20—\x20N-K5\x20own-scope\x20partition\x20folds\x20neighbor\x20findings',()=>{const a='0x1549f8aa00000000000000000000000000000000000000000000000000000000',b=c=>({'id':'R4:'+c+':accepted→completed','kind':'risk','severity':'medium','title':'Workflow\x20single\x20point:\x20the\x20only\x20Forward\x20before\x20a\x20terminal\x20state\x20has\x20a\x20single\x20operator\x20and\x20no\x20fallback\x20Guard','path':[c,'machine.node','wf.transition','accepted→completed'],'confidence':'exact','roles':['neutral'],'detail':'synthetic\x20single-point\x20finding\x20for\x20the\x20scope\x20test','suggestion':'add\x20a\x20fallback\x20operator'});it('scores\x20only\x20own-machine\x20R4\x20findings;\x20the\x20foreign\x20machine\x27s\x20identical\x20finding\x20is\x20folded\x20as\x20neighbor\x20count',async()=>{const c=await evalFactsWithFindings(fullServiceState(),FULL['svc'],[b(FULL['mac']['toLowerCase']()),b(a)]),d=factOf(c,'risk_workflow.findings');expect(d['state'])['toBe']('present'),expect(d['findingIds'])['toEqual'](['R4:'+FULL['mac']['toLowerCase']()+':accepted→completed']);const e=d['value'];expect(e['findings'])['toHaveLength'](0x1),expect(e['findings'][0x0]['id'])['toBe']('R4:'+FULL['mac']['toLowerCase']()+':accepted→completed'),expect(d['evidence'])['toContain']('1\x20further\x20finding(s)\x20on\x20NEIGHBOR\x20objects'),expect(d['evidence'])['toContain']('do\x20not\x20belong\x20to\x20this\x20object\x27s\x20score');}),it('an\x20all-neighbor\x20finding\x20set\x20matches\x20nothing\x20and\x20reports\x20the\x20folded\x20count\x20on\x20a\x20clean\x20own\x20structure',async()=>{const c=await evalFactsWithFindings(fullServiceState(),FULL['svc'],[b(a)]),d=factOf(c,'risk_workflow.findings');expect(d['state'])['toBe']('present'),expect(d['findingIds'])['toEqual']([]),expect(d['evidence'])['toContain']('No\x20risk\x20fired\x20on\x20this\x20object'),expect(d['evidence'])['toContain']('1\x20finding(s)\x20on\x20neighbor\x20objects');});});
1
+ import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'./dataplane.js';import{expandTopology}from'./expand.js';import{FULL,GAP,fullServiceState,gapServiceState,truncatedServiceState}from'./fixtures.js';import{buildViewport}from'./viewport.js';import{runAnalyzers}from'./analyze.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'./strategy.js';import{projectEvaluationFacts}from'./facts.js';async function evalFacts(a,b){const c=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),d=await expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':b,'edges':c['edges'],'budget':c['budget']}),e=buildViewport(d,b,'neutral'),f=runAnalyzers(e);return projectEvaluationFacts(e,b,f);}async function evalFactsWithFindings(a,b,c){const d=withEvaluationBundle(resolveExpansionStrategy({'intents':[...EVALUATION_SERVICE_INTENTS]})),e=await expandTopology(new FakeDataPlane(a),{'network':ENTRYPOINT['Mainnet'],'seed':b,'edges':d['edges'],'budget':d['budget']}),f=buildViewport(e,b,'neutral');return projectEvaluationFacts(f,b,c);}const slotOf=(a,b)=>a['slots']['find'](c=>c['slot']===b),factOf=(a,b)=>{const c=a['facts']['find'](d=>d['key']===b);return expect(c,'fact\x20'+b+'\x20must\x20exist')['toBeDefined'](),c;},EMPTY_STATE={'objects':new Map(),'keyedFields':new Map(),'tables':new Map(),'events':new Map()};describe('facts\x20—\x20fully\x20hooked\x20service\x20(TR-13.1)',()=>{it('classifies\x20every\x20required\x20slot\x20present\x20with\x20material\x20facts',async()=>{const a=await evalFacts(fullServiceState(),FULL['svc']);expect(slotOf(a,'service_snapshot')['state'])['toBe']('present'),expect(slotOf(a,'arbitration')['state'])['toBe']('present'),expect(slotOf(a,'reviews')['state'])['toBe']('present'),expect(slotOf(a,'fulfillment_orders')['state'])['toBe']('present'),expect(slotOf(a,'fulfillment_workflow')['state'])['toBe']('present'),expect(slotOf(a,'fund_safety')['state'])['toBe']('present'),expect(slotOf(a,'transparency')['state'])['toBe']('present'),expect(a['completeness'])['toBe'](0x64);const b=factOf(a,'arbitration.binding');expect(b['state'])['toBe']('present'),expect(b['value'])['toMatchObject']([{'id':FULL['arbsvc']['toLowerCase'](),'paused':![],'votingGuards':0x1,'usageGuard':!![]}]),expect(b['provenance']['path'])['toContain']('service.arbitration'),expect(factOf(a,'reviews.votes')['value'])['toMatchObject']({'total':0x2,'like':0x1,'dislike':0x1,'favor':0x1}),expect(factOf(a,'fulfillment.orders')['value'])['toMatchObject']({'observed':0x2,'completed':0x1,'inProgress':0x1,'unknown':0x0,'windowedAmount':'1000000'});const c=factOf(a,'fulfillment.workflow');expect(c['state'])['toBe']('present'),expect(c['value'])['toMatchObject']({'machine':FULL['mac']['toLowerCase'](),'nodes':0x3}),expect(factOf(a,'fund.compensation')['value'])['toMatchObject']({'fund':'0'});const d=factOf(a,'fund.exposure');expect(d['value'])['toMatchObject']({'windowedCount':0x2,'windowedAmount':'1000000','largestAmount':'1000000','neededCeiling':'3000000','coverageMet':![]}),expect(d['findingIds'])['toEqual'](['R2:'+FULL['svc']['toLowerCase']()]),expect(factOf(a,'transparency.profile')['findingIds'])['toEqual'](['R6:'+FULL['svc']['toLowerCase']()]);}),it('reuses\x20analyzer\x20findings\x20by\x20reference\x20in\x20the\x20risk\x20dimensions',async()=>{const a=await evalFacts(fullServiceState(),FULL['svc']),b=factOf(a,'risk_trust.findings');expect(b['state'])['toBe']('present'),expect(b['findingIds']['some'](g=>g['startsWith']('R1:')))['toBe'](!![]);const c=factOf(a,'risk_fund.findings');expect(c['state'])['toBe']('present'),expect(c['findingIds'])['toContain']('R2:'+FULL['svc']['toLowerCase']());const d=factOf(a,'risk_behavior.findings');expect(d['state'])['toBe']('present'),expect(d['findingIds'])['toEqual']([]);const e=factOf(a,'risk_workflow.findings');expect(e['state'])['toBe']('present'),expect(e['evidence'])['toContain']('fully\x20materialized');});}),describe('facts\x20—\x20configured-empty\x20shell\x20merchant\x20(TR-13.1)',()=>{it('scores\x20configured\x20absence\x20as\x20empty\x20and\x20the\x20dangling\x20machine\x20as\x20gap',async()=>{const a=await evalFacts(gapServiceState(),GAP['svc']);expect(slotOf(a,'service_snapshot')['state'])['toBe']('present'),expect(slotOf(a,'arbitration')['state'])['toBe']('empty'),expect(factOf(a,'arbitration.binding')['state'])['toBe']('empty'),expect(slotOf(a,'reviews')['state'])['toBe']('empty'),expect(slotOf(a,'fulfillment_orders')['state'])['toBe']('present'),expect(slotOf(a,'fulfillment_workflow')['state'])['toBe']('gap'),expect(factOf(a,'fulfillment.workflow')['evidence'])['toContain']('fetch\x20gap'),expect(slotOf(a,'fund_safety')['state'])['toBe']('present'),expect(slotOf(a,'transparency')['state'])['toBe']('present'),expect(a['completeness'])['toBe'](0x39),expect(factOf(a,'risk_workflow.findings')['state'])['toBe']('gap'),expect(factOf(a,'risk_workflow.findings')['provenance']['confidence'])['toBe']('windowed'),expect(factOf(a,'risk_trust.findings')['state'])['toBe']('empty');});}),describe('facts\x20—\x20truncated\x20order\x20window\x20(TR-13.1)',()=>{it('marks\x20the\x20truncated\x20window\x20slot\x20gap\x20and\x20cascades\x20into\x20risk_fund',async()=>{const a=await evalFacts(truncatedServiceState(),FULL['svc']);expect(slotOf(a,'fulfillment_orders')['state'])['toBe']('gap');const b=factOf(a,'fulfillment.orders');expect(b['state'])['toBe']('gap'),expect(b['provenance']['window'])['toBeDefined'](),expect(b['value']['observed'])['toBeGreaterThan'](0x0);const c=factOf(a,'risk_fund.findings');expect(c['state'])['toBe']('gap'),expect(c['evidence'])['toContain']('unverifiable'),expect(slotOf(a,'arbitration')['state'])['toBe']('present'),expect(slotOf(a,'fulfillment_workflow')['state'])['toBe']('present'),expect(a['completeness'])['toBe'](0x56);});}),describe('facts\x20—\x20fund\x20listing\x20wall\x20(F-BS-59)',()=>{it('zero\x20fund\x20never\x20walls:\x20the\x20priced\x20listing\x20reads\x20present\x20with\x20walled=false',async()=>{const a=await evalFacts(fullServiceState(),FULL['svc']),b=factOf(a,'fund.listing_wall');expect(b['state'])['toBe']('present'),expect(b['value'])['toMatchObject']({'fund':'0','coverCap':'0','largestListing':'1000000','blockedCount':0x0,'blockedNames':[],'walled':![]}),expect(b['evidence'])['toContain']('never\x20gated');}),it('walls\x20the\x20listings\x20priced\x20above\x20fund/3,\x20largest\x20first,\x20ignoring\x20suspended\x20rows',async()=>{const a=fullServiceState(),b=a['objects']['get'](FULL['svc']['toLowerCase']());b['data']['compensation_fund']='1000000',b['data']['sales']=[{'name':'top','price':'900000','suspension':![]},{'name':'low','price':'100000','suspension':![]},{'name':'off','price':'9000000','suspension':!![]}];const c=await evalFacts(a,FULL['svc']),d=factOf(c,'fund.listing_wall');expect(d['state'])['toBe']('present'),expect(d['value'])['toMatchObject']({'fund':'1000000','coverCap':'333333','largestListing':'900000','blockedCount':0x1,'blockedNames':['top'],'walled':!![]}),expect(d['evidence'])['toContain']('top'),expect(d['evidence'])['toContain']('cannot\x20be\x20checked\x20out');}),it('an\x20empty\x20catalog\x20reads\x20verified-absent\x20(no\x20listing\x20can\x20be\x20walled)',async()=>{const a=await evalFacts(gapServiceState(),GAP['svc']),b=factOf(a,'fund.listing_wall');expect(b['state'])['toBe']('empty'),expect(b['evidence'])['toContain']('No\x20sellable\x20priced\x20listing');});}),describe('facts\x20—\x20completeness\x20(TR-13.2)',()=>{it('is\x20an\x20integer\x200..100\x20consistent\x20with\x20present/required\x20on\x20every\x20fixture',async()=>{const a=await Promise['all']([evalFacts(fullServiceState(),FULL['svc']),evalFacts(gapServiceState(),GAP['svc']),evalFacts(truncatedServiceState(),FULL['svc'])]);for(const b of a){expect(Number['isInteger'](b['completeness']))['toBe'](!![]),expect(b['completeness'])['toBeGreaterThanOrEqual'](0x0),expect(b['completeness'])['toBeLessThanOrEqual'](0x64);const c=b['slots']['filter'](e=>e['required']&&e['state']==='present')['length'],d=b['slots']['filter'](e=>e['required'])['length'];expect(b['completeness'])['toBe'](Math['round'](c/d*0x64));for(const e of b['facts']){expect(e['provenance']['path']['length'])['toBeGreaterThan'](0x0),expect(e['provenance']['retention'])['toBeDefined'](),expect(e['evidence']['length'])['toBeGreaterThan'](0x0);if(e['dimension']['startsWith']('risk_'))continue;const g=e['dimension']==='fulfillment'?e['key']['includes']('workflow')?'fulfillment_workflow':'fulfillment_orders':e['dimension'];expect(slotOf(b,g)['facts'])['toContain'](e['key']);}}}),it('collapses\x20to\x200\x20with\x20all\x20slots\x20gap\x20when\x20the\x20target\x20is\x20missing',async()=>{const a=await evalFacts(EMPTY_STATE,FULL['svc']);expect(a['slots']['every'](b=>b['state']==='gap'))['toBe'](!![]),expect(a['completeness'])['toBe'](0x0),expect(factOf(a,'risk_behavior.findings')['state'])['toBe']('gap');});}),describe('facts\x20—\x20entity\x20profile\x20attributes',()=>{it('projects\x20viewport-cropped\x20payloads;\x20absence\x20yields\x20no\x20entry',async()=>{const a=await evalFacts(fullServiceState(),FULL['svc']),b=a['profiles']['map'](e=>e['nodeId']);expect(b)['toContain'](FULL['supplier']['toLowerCase']());const c=a['profiles']['find'](e=>e['nodeId']===FULL['supplier']['toLowerCase']());expect(c['description'])['toBe']('Acme\x20logistics\x20co.'),expect(c['registeredAt'])['toBe'](0x18bcfe57b88),expect(c['recordCount'])['toBe'](0x1),expect(c['profileRecords'])['toEqual']([{'name':'region','valueType':0x1,'value':'cn-east'}]);const d=a['profiles']['find'](e=>e['nodeId']===FULL['member']['toLowerCase']());expect(d['hasDescription'])['toBe'](!![]),expect(d['recordCount'])['toBe'](0x0),expect(b)['not']['toContain'](FULL['buyer']['toLowerCase']());});}),describe('facts\x20—\x20N-K5\x20own-scope\x20partition\x20folds\x20neighbor\x20findings',()=>{const a='0x1549f8aa00000000000000000000000000000000000000000000000000000000',b=c=>({'id':'R4:'+c+':accepted→completed','kind':'risk','severity':'medium','title':'Workflow\x20single\x20point:\x20the\x20only\x20Forward\x20before\x20a\x20terminal\x20state\x20has\x20a\x20single\x20operator\x20and\x20no\x20fallback\x20Guard','path':[c,'machine.node','wf.transition','accepted→completed'],'confidence':'exact','roles':['neutral'],'detail':'synthetic\x20single-point\x20finding\x20for\x20the\x20scope\x20test','suggestion':'add\x20a\x20fallback\x20operator'});it('scores\x20only\x20own-machine\x20R4\x20findings;\x20the\x20foreign\x20machine\x27s\x20identical\x20finding\x20is\x20folded\x20as\x20neighbor\x20count',async()=>{const c=await evalFactsWithFindings(fullServiceState(),FULL['svc'],[b(FULL['mac']['toLowerCase']()),b(a)]),d=factOf(c,'risk_workflow.findings');expect(d['state'])['toBe']('present'),expect(d['findingIds'])['toEqual'](['R4:'+FULL['mac']['toLowerCase']()+':accepted→completed']);const e=d['value'];expect(e['findings'])['toHaveLength'](0x1),expect(e['findings'][0x0]['id'])['toBe']('R4:'+FULL['mac']['toLowerCase']()+':accepted→completed'),expect(d['evidence'])['toContain']('1\x20further\x20finding(s)\x20on\x20NEIGHBOR\x20objects'),expect(d['evidence'])['toContain']('do\x20not\x20belong\x20to\x20this\x20object\x27s\x20score');}),it('an\x20all-neighbor\x20finding\x20set\x20matches\x20nothing\x20and\x20reports\x20the\x20folded\x20count\x20on\x20a\x20clean\x20own\x20structure',async()=>{const c=await evalFactsWithFindings(fullServiceState(),FULL['svc'],[b(a)]),d=factOf(c,'risk_workflow.findings');expect(d['state'])['toBe']('present'),expect(d['findingIds'])['toEqual']([]),expect(d['evidence'])['toContain']('No\x20risk\x20fired\x20on\x20this\x20object'),expect(d['evidence'])['toContain']('1\x20finding(s)\x20on\x20neighbor\x20objects');});});
@@ -0,0 +1,20 @@
1
+ import { type ENTRYPOINT } from "@wowok/wowok";
2
+ export interface RecoveredReceipt {
3
+ id: string;
4
+ payment: string;
5
+ amount: string;
6
+ version?: string;
7
+ digest?: string;
8
+ type?: string;
9
+ }
10
+ export interface ObjectHeldReceipts {
11
+ holder: string;
12
+ allocation: string;
13
+ payments_scanned: number;
14
+ receipts: RecoveredReceipt[];
15
+ token_type: string;
16
+ }
17
+ export declare function recoverObjectHeldReceipts(holderRef: string, opts: {
18
+ network?: ENTRYPOINT;
19
+ no_cache?: boolean;
20
+ }): Promise<ObjectHeldReceipts | undefined>;