@wowok/agent-mcp 3.1.0 → 3.1.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 (337) hide show
  1. package/dist/config/runtime.js +1 -1
  2. package/dist/customer/index.d.ts +3 -9
  3. package/dist/customer/index.js +1 -1
  4. package/dist/customer/industry-risks.d.ts +3 -17
  5. package/dist/customer/industry-risks.js +1 -1
  6. package/dist/customer/types.d.ts +1 -165
  7. package/dist/customer/types.js +1 -1
  8. package/dist/customer/user-preferences.d.ts +0 -49
  9. package/dist/customer/user-preferences.js +1 -1
  10. package/dist/evaluation/arbitration-game.js +1 -1
  11. package/dist/evaluation/architecture.spec.d.ts +1 -0
  12. package/dist/evaluation/architecture.spec.js +1 -0
  13. package/dist/evaluation/builtins/graph-service.d.ts +16 -0
  14. package/dist/evaluation/builtins/graph-service.js +1 -0
  15. package/dist/evaluation/builtins/graph-service.spec.d.ts +1 -0
  16. package/dist/evaluation/builtins/graph-service.spec.js +1 -0
  17. package/dist/evaluation/builtins/index.d.ts +1 -1
  18. package/dist/evaluation/builtins/index.js +1 -1
  19. package/dist/evaluation/builtins/purity.spec.d.ts +1 -0
  20. package/dist/evaluation/builtins/purity.spec.js +1 -0
  21. package/dist/evaluation/engine.js +1 -1
  22. package/dist/evaluation/facets/catalog.d.ts +19 -0
  23. package/dist/evaluation/facets/catalog.js +1 -0
  24. package/dist/evaluation/guard-scan.d.ts +10 -0
  25. package/dist/evaluation/guard-scan.js +1 -0
  26. package/dist/evaluation/location-match.js +1 -1
  27. package/dist/evaluation/standards.d.ts +31 -0
  28. package/dist/evaluation/standards.js +1 -0
  29. package/dist/evaluation/standards.spec.d.ts +1 -0
  30. package/dist/evaluation/standards.spec.js +1 -0
  31. package/dist/evaluation/types.d.ts +9 -0
  32. package/dist/experience/realtime-feedback.js +1 -1
  33. package/dist/extensions/index.d.ts +1 -1
  34. package/dist/extensions/index.js +1 -1
  35. package/dist/extensions/industry-layers.d.ts +6 -5
  36. package/dist/extensions/industry-layers.js +1 -1
  37. package/dist/extensions/industry-pack.js +1 -1
  38. package/dist/goal/GoalClassifier.js +1 -1
  39. package/dist/graph/onchain/analyze.d.ts +16 -3
  40. package/dist/graph/onchain/analyze.js +1 -1
  41. package/dist/graph/onchain/analyze.spec.js +1 -1
  42. package/dist/graph/onchain/dataplane.d.ts +1 -1
  43. package/dist/graph/onchain/dataplane.js +1 -1
  44. package/dist/graph/onchain/edge-batch.spec.d.ts +1 -0
  45. package/dist/graph/onchain/edge-batch.spec.js +1 -0
  46. package/dist/graph/onchain/edge-schema.d.ts +11 -3
  47. package/dist/graph/onchain/edge-schema.js +1 -1
  48. package/dist/graph/onchain/entity-profile.spec.d.ts +1 -0
  49. package/dist/graph/onchain/entity-profile.spec.js +1 -0
  50. package/dist/graph/onchain/event-history.spec.d.ts +1 -0
  51. package/dist/graph/onchain/event-history.spec.js +1 -0
  52. package/dist/graph/onchain/expand.js +1 -1
  53. package/dist/graph/onchain/extract-deep.spec.d.ts +1 -0
  54. package/dist/graph/onchain/extract-deep.spec.js +1 -0
  55. package/dist/graph/onchain/extract.d.ts +11 -3
  56. package/dist/graph/onchain/extract.js +1 -1
  57. package/dist/graph/onchain/facet-projection.d.ts +99 -0
  58. package/dist/graph/onchain/facet-projection.js +1 -0
  59. package/dist/graph/onchain/facet-projection.spec.d.ts +1 -0
  60. package/dist/graph/onchain/facet-projection.spec.js +1 -0
  61. package/dist/graph/onchain/facts.d.ts +103 -0
  62. package/dist/graph/onchain/facts.js +1 -0
  63. package/dist/graph/onchain/facts.spec.d.ts +1 -0
  64. package/dist/graph/onchain/facts.spec.js +1 -0
  65. package/dist/graph/onchain/field-manifest.d.ts +29 -0
  66. package/dist/graph/onchain/field-manifest.js +1 -0
  67. package/dist/graph/onchain/field-manifest.spec.d.ts +1 -0
  68. package/dist/graph/onchain/field-manifest.spec.js +1 -0
  69. package/dist/graph/onchain/fixtures.d.ts +80 -0
  70. package/dist/graph/onchain/fixtures.js +1 -0
  71. package/dist/graph/onchain/fixtures.spec.d.ts +1 -0
  72. package/dist/graph/onchain/fixtures.spec.js +1 -0
  73. package/dist/graph/onchain/index.d.ts +8 -2
  74. package/dist/graph/onchain/index.js +1 -1
  75. package/dist/graph/onchain/interest.js +1 -1
  76. package/dist/graph/onchain/label-lint.spec.d.ts +1 -0
  77. package/dist/graph/onchain/label-lint.spec.js +1 -0
  78. package/dist/graph/onchain/names.d.ts +23 -0
  79. package/dist/graph/onchain/names.js +1 -0
  80. package/dist/graph/onchain/names.spec.d.ts +1 -0
  81. package/dist/graph/onchain/names.spec.js +1 -0
  82. package/dist/graph/onchain/onchain.spec.js +1 -1
  83. package/dist/graph/onchain/proposal-graph.d.ts +11 -0
  84. package/dist/graph/onchain/proposal-graph.js +1 -0
  85. package/dist/graph/onchain/proposal-graph.spec.d.ts +1 -0
  86. package/dist/graph/onchain/proposal-graph.spec.js +1 -0
  87. package/dist/graph/onchain/sdk-batch.d.ts +5 -1
  88. package/dist/graph/onchain/sdk-batch.js +1 -1
  89. package/dist/graph/onchain/sdk-dataplane.js +1 -1
  90. package/dist/graph/onchain/strategy.d.ts +16 -0
  91. package/dist/graph/onchain/strategy.js +1 -1
  92. package/dist/graph/onchain/strategy.spec.js +1 -1
  93. package/dist/graph/onchain/table-ledger.spec.d.ts +1 -0
  94. package/dist/graph/onchain/table-ledger.spec.js +1 -0
  95. package/dist/graph/onchain/types.d.ts +51 -11
  96. package/dist/graph/onchain/viewport.d.ts +1 -0
  97. package/dist/graph/onchain/viewport.js +1 -1
  98. package/dist/harness/index.d.ts +1 -5
  99. package/dist/harness/index.js +1 -1
  100. package/dist/harness/verify.d.ts +6 -1
  101. package/dist/harness/verify.js +1 -1
  102. package/dist/index.js +1 -1
  103. package/dist/knowledge/allocation-ledger.d.ts +2 -0
  104. package/dist/knowledge/allocation-ledger.js +1 -1
  105. package/dist/knowledge/allocation-puzzle.js +1 -1
  106. package/dist/knowledge/allocation-risk.d.ts +2 -3
  107. package/dist/knowledge/allocation-risk.js +1 -1
  108. package/dist/knowledge/arb-risk.d.ts +0 -1
  109. package/dist/knowledge/arb-risk.js +1 -1
  110. package/dist/knowledge/arbitration-risk.d.ts +0 -2
  111. package/dist/knowledge/arbitration-risk.js +1 -1
  112. package/dist/knowledge/baselines/evaluation-baselines.json +79 -0
  113. package/dist/knowledge/baselines/guard-lint-baseline.spec.d.ts +1 -0
  114. package/dist/knowledge/baselines/guard-lint-baseline.spec.js +1 -0
  115. package/dist/knowledge/baselines/risk-baselines.spec.d.ts +1 -0
  116. package/dist/knowledge/baselines/risk-baselines.spec.js +1 -0
  117. package/dist/knowledge/baselines/risk-cases.d.ts +8 -0
  118. package/dist/knowledge/baselines/risk-cases.js +1 -0
  119. package/dist/knowledge/bridge-risk.d.ts +0 -1
  120. package/dist/knowledge/bridge-risk.js +1 -1
  121. package/dist/knowledge/contact-risk.d.ts +0 -1
  122. package/dist/knowledge/contact-risk.js +1 -1
  123. package/dist/knowledge/contract-invariants.d.ts +1 -0
  124. package/dist/knowledge/contract-invariants.js +1 -1
  125. package/dist/knowledge/demand-risk.d.ts +0 -1
  126. package/dist/knowledge/demand-risk.js +1 -1
  127. package/dist/knowledge/getting-started.js +1 -1
  128. package/dist/knowledge/guard-design-patterns.js +1 -1
  129. package/dist/knowledge/guard-eval.d.ts +15 -0
  130. package/dist/knowledge/guard-eval.js +1 -0
  131. package/dist/knowledge/guard-eval.spec.d.ts +1 -0
  132. package/dist/knowledge/guard-eval.spec.js +1 -0
  133. package/dist/knowledge/guard-field-cognition.d.ts +48 -0
  134. package/dist/knowledge/guard-field-cognition.js +1 -0
  135. package/dist/knowledge/guard-lint.d.ts +1 -1
  136. package/dist/knowledge/guard-lint.js +1 -1
  137. package/dist/knowledge/guard-risk.d.ts +4 -19
  138. package/dist/knowledge/guard-risk.js +1 -1
  139. package/dist/knowledge/index.d.ts +42 -43
  140. package/dist/knowledge/index.js +1 -1
  141. package/dist/knowledge/industry-registry.js +1 -1
  142. package/dist/knowledge/industry-rule-node.d.ts +7 -0
  143. package/dist/knowledge/industry-rule-node.js +1 -0
  144. package/dist/knowledge/industry-strategy.js +1 -1
  145. package/dist/knowledge/jsonrpc-enum.js +1 -1
  146. package/dist/knowledge/machine-risk.d.ts +0 -6
  147. package/dist/knowledge/machine-risk.js +1 -1
  148. package/dist/knowledge/order-risk.d.ts +1 -9
  149. package/dist/knowledge/order-risk.js +1 -1
  150. package/dist/knowledge/payment-risk.d.ts +0 -1
  151. package/dist/knowledge/payment-risk.js +1 -1
  152. package/dist/knowledge/permission-risk.d.ts +0 -3
  153. package/dist/knowledge/permission-risk.js +1 -1
  154. package/dist/knowledge/personal-risk.d.ts +0 -1
  155. package/dist/knowledge/personal-risk.js +1 -1
  156. package/dist/knowledge/progress-risk.d.ts +0 -2
  157. package/dist/knowledge/progress-risk.js +1 -1
  158. package/dist/knowledge/proof-risk.d.ts +0 -1
  159. package/dist/knowledge/proof-risk.js +1 -1
  160. package/dist/knowledge/puzzle-projections.d.ts +11 -0
  161. package/dist/knowledge/puzzle-projections.js +1 -0
  162. package/dist/knowledge/recipient-constraint.d.ts +6 -1
  163. package/dist/knowledge/recipient-constraint.js +1 -1
  164. package/dist/knowledge/registrar-risk.d.ts +0 -1
  165. package/dist/knowledge/registrar-risk.js +1 -1
  166. package/dist/knowledge/repository-risk.d.ts +0 -1
  167. package/dist/knowledge/repository-risk.js +1 -1
  168. package/dist/knowledge/resource-risk.d.ts +0 -1
  169. package/dist/knowledge/resource-risk.js +1 -1
  170. package/dist/knowledge/reward-risk.d.ts +1 -5
  171. package/dist/knowledge/reward-risk.js +1 -1
  172. package/dist/knowledge/rule-node-analyzers.d.ts +43 -0
  173. package/dist/knowledge/rule-node-analyzers.js +1 -0
  174. package/dist/knowledge/rule-node-analyzers.spec.d.ts +1 -0
  175. package/dist/knowledge/rule-node-analyzers.spec.js +1 -0
  176. package/dist/knowledge/rule-outcome.d.ts +5 -0
  177. package/dist/knowledge/rule-outcome.js +1 -0
  178. package/dist/knowledge/safety-rules.js +1 -1
  179. package/dist/knowledge/scenario-topology.js +1 -1
  180. package/dist/knowledge/service-allocator-audit-node.d.ts +3 -0
  181. package/dist/knowledge/service-allocator-audit-node.js +1 -0
  182. package/dist/knowledge/service-risk-node.js +1 -1
  183. package/dist/knowledge/service-risk.d.ts +0 -3
  184. package/dist/knowledge/service-risk.js +1 -1
  185. package/dist/knowledge/template-registry.js +1 -1
  186. package/dist/knowledge/tools-reference.js +1 -1
  187. package/dist/knowledge/treasury-risk.d.ts +2 -3
  188. package/dist/knowledge/treasury-risk.js +1 -1
  189. package/dist/knowledge/util-risk.d.ts +0 -1
  190. package/dist/knowledge/util-risk.js +1 -1
  191. package/dist/knowledge/workflow-guidance.d.ts +2 -0
  192. package/dist/knowledge/workflow-guidance.js +1 -1
  193. package/dist/monitor/MonitorLoop.js +1 -1
  194. package/dist/persona/bridge.js +1 -1
  195. package/dist/persona/facet-profile.d.ts +33 -0
  196. package/dist/persona/facet-profile.js +1 -0
  197. package/dist/persona/model.d.ts +2 -1
  198. package/dist/persona/model.js +1 -1
  199. package/dist/persona/strategy-intent.js +1 -1
  200. package/dist/persona/topology-focus.d.ts +2 -2
  201. package/dist/persona/topology-focus.js +1 -1
  202. package/dist/persona/types.d.ts +12 -0
  203. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  204. package/dist/playbooks/service-build/facet-money.d.ts +22 -0
  205. package/dist/playbooks/service-build/facet-money.js +1 -0
  206. package/dist/playbooks/service-build/facet-money.spec.d.ts +1 -0
  207. package/dist/playbooks/service-build/facet-money.spec.js +1 -0
  208. package/dist/playbooks/service-build/intent-analyzer.js +1 -1
  209. package/dist/playbooks/service-build/machine-panorama.d.ts +3 -0
  210. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  211. package/dist/playbooks/service-build/object-panorama.d.ts +27 -27
  212. package/dist/playbooks/service-build/object-panorama.js +1 -1
  213. package/dist/playbooks/service-build/pipeline-actions.d.ts +2 -2
  214. package/dist/playbooks/service-build/pipeline-actions.js +1 -1
  215. package/dist/playbooks/service-build/risk-aggregator.d.ts +2 -1
  216. package/dist/playbooks/service-build/risk-aggregator.js +1 -1
  217. package/dist/playbooks/service-build/service-panorama.d.ts +4 -9
  218. package/dist/playbooks/service-build/service-panorama.js +1 -1
  219. package/dist/playbooks/service-build/topology-evaluation.spec.d.ts +1 -0
  220. package/dist/playbooks/service-build/topology-evaluation.spec.js +1 -0
  221. package/dist/playbooks/service-build/topology-query.d.ts +13 -2
  222. package/dist/playbooks/service-build/topology-query.js +1 -1
  223. package/dist/review/arb.d.ts +0 -2
  224. package/dist/review/arb.js +1 -1
  225. package/dist/review/order.d.ts +0 -1
  226. package/dist/review/order.js +1 -1
  227. package/dist/role/profiles.js +1 -1
  228. package/dist/rules.d.ts +1 -2
  229. package/dist/rules.js +1 -1
  230. package/dist/safety/confirm-gate.js +1 -1
  231. package/dist/safety/preview.js +1 -1
  232. package/dist/schema/call/base.d.ts +3372 -668
  233. package/dist/schema/call/base.js +1 -1
  234. package/dist/schema/call/handler.js +1 -1
  235. package/dist/schema/call/receipt.d.ts +28 -0
  236. package/dist/schema/call/receipt.js +1 -0
  237. package/dist/schema/call/semantic-customer-advice.spec.d.ts +1 -0
  238. package/dist/schema/call/semantic-customer-advice.spec.js +1 -0
  239. package/dist/schema/call/semantic.d.ts +5 -2
  240. package/dist/schema/call/semantic.js +1 -1
  241. package/dist/schema/call/treasury.js +1 -1
  242. package/dist/schema/common/index.js +1 -1
  243. package/dist/schema/evaluation/index.d.ts +289 -211
  244. package/dist/schema/evaluation/index.js +1 -1
  245. package/dist/schema/goal/index.d.ts +1 -1
  246. package/dist/schema/goal/planning.d.ts +2 -2
  247. package/dist/schema/index.d.ts +0 -1
  248. package/dist/schema/index.js +1 -1
  249. package/dist/schema/industry-pack/index.d.ts +1 -1
  250. package/dist/schema/keeper/index.d.ts +1 -1
  251. package/dist/schema/local/index.js +1 -1
  252. package/dist/schema/operations.d.ts +28 -10
  253. package/dist/schema/operations.js +1 -1
  254. package/dist/schema/persona/index.d.ts +24 -24
  255. package/dist/schema/query/bi.d.ts +629 -14
  256. package/dist/schema/query/bi.js +1 -1
  257. package/dist/schema/query/index.d.ts +9 -9
  258. package/dist/schema/query/index.js +1 -1
  259. package/dist/schema/schema-version.js +1 -1
  260. package/dist/schema/workspace/index.d.ts +2 -2
  261. package/dist/schema-query-impl/index.js +1 -1
  262. package/dist/schemas/account_operation.output.json +10 -10
  263. package/dist/schemas/account_operation.schema.json +3 -3
  264. package/dist/schemas/bridge_operation.output.json +10 -10
  265. package/dist/schemas/evaluation_operation.output.json +697 -169
  266. package/dist/schemas/evaluation_operation.schema.json +5 -434
  267. package/dist/schemas/index.json +1 -7
  268. package/dist/schemas/keeper_operation.output.json +10 -10
  269. package/dist/schemas/local_history_operation.output.json +10 -10
  270. package/dist/schemas/local_info_operation.output.json +10 -10
  271. package/dist/schemas/local_mark_operation.output.json +10 -10
  272. package/dist/schemas/messenger_operation.output.json +10 -10
  273. package/dist/schemas/monitor_events.output.json +10 -10
  274. package/dist/schemas/monitor_subscription.output.json +10 -10
  275. package/dist/schemas/onchain_events.output.json +11 -11
  276. package/dist/schemas/onchain_operations.output.json +6369 -3736
  277. package/dist/schemas/onchain_operations.schema.json +48 -48
  278. package/dist/schemas/onchain_operations_allocation.schema.json +5 -5
  279. package/dist/schemas/onchain_operations_arbitration.schema.json +3 -3
  280. package/dist/schemas/onchain_operations_contact.schema.json +2 -2
  281. package/dist/schemas/onchain_operations_demand.schema.json +2 -2
  282. package/dist/schemas/onchain_operations_machine.schema.json +2 -2
  283. package/dist/schemas/onchain_operations_order.schema.json +2 -2
  284. package/dist/schemas/onchain_operations_payment.schema.json +2 -2
  285. package/dist/schemas/onchain_operations_permission.schema.json +2 -2
  286. package/dist/schemas/onchain_operations_progress.schema.json +2 -2
  287. package/dist/schemas/onchain_operations_repository.schema.json +2 -2
  288. package/dist/schemas/onchain_operations_reward.schema.json +6 -6
  289. package/dist/schemas/onchain_operations_service.schema.json +8 -8
  290. package/dist/schemas/onchain_operations_treasury.schema.json +10 -10
  291. package/dist/schemas/onchain_table_data.output.json +78 -84
  292. package/dist/schemas/query_toolkit.output.json +1087 -254
  293. package/dist/schemas/query_toolkit.schema.json +65 -3
  294. package/dist/strategy/collectors.js +1 -1
  295. package/dist/strategy/metrics.js +1 -1
  296. package/dist/task/playbook.js +1 -1
  297. package/dist/tools/handlers/bridge.js +1 -1
  298. package/dist/tools/handlers/config.js +1 -1
  299. package/dist/tools/handlers/dispatch-expectations.d.ts +3 -0
  300. package/dist/tools/handlers/dispatch-expectations.js +1 -0
  301. package/dist/tools/handlers/evaluation.js +1 -1
  302. package/dist/tools/handlers/evaluation.spec.js +1 -1
  303. package/dist/tools/handlers/onchain.js +1 -1
  304. package/dist/tools/handlers/query.js +1 -1
  305. package/dist/tools/index.js +1 -1
  306. package/dist/tools/registry/evaluation.d.ts +2 -0
  307. package/dist/tools/registry/evaluation.js +1 -0
  308. package/dist/tools/registry/monitor.js +1 -1
  309. package/dist/tools/registry/query.js +1 -1
  310. package/dist/tools/shared.d.ts +0 -1
  311. package/dist/tools/shared.js +1 -1
  312. package/dist/tools/wrap.js +1 -1
  313. package/package.json +4 -3
  314. package/dist/customer/customer-advice.d.ts +0 -32
  315. package/dist/customer/customer-advice.js +0 -1
  316. package/dist/customer/info-puzzle.d.ts +0 -146
  317. package/dist/customer/info-puzzle.js +0 -1
  318. package/dist/customer/order-strategy.d.ts +0 -17
  319. package/dist/customer/order-strategy.js +0 -1
  320. package/dist/customer/preorder-compare.d.ts +0 -24
  321. package/dist/customer/preorder-compare.js +0 -1
  322. package/dist/customer/reminder-system.d.ts +0 -42
  323. package/dist/customer/reminder-system.js +0 -1
  324. package/dist/customer/risk-assessment.d.ts +0 -13
  325. package/dist/customer/risk-assessment.js +0 -1
  326. package/dist/evaluation/builtins/service-risk.d.ts +0 -7
  327. package/dist/evaluation/builtins/service-risk.js +0 -1
  328. package/dist/knowledge/trust-metrics.d.ts +0 -66
  329. package/dist/knowledge/trust-metrics.js +0 -1
  330. package/dist/schema/trust/index.d.ts +0 -334
  331. package/dist/schema/trust/index.js +0 -1
  332. package/dist/schemas/trust_score.output.json +0 -847
  333. package/dist/schemas/trust_score.schema.json +0 -364
  334. package/dist/tools/handlers/trust.d.ts +0 -16
  335. package/dist/tools/handlers/trust.js +0 -1
  336. package/dist/tools/registry/trust.d.ts +0 -2
  337. package/dist/tools/registry/trust.js +0 -1
@@ -1 +1 @@
1
- import{EDGE_SCHEMAS,EDGE_SCHEMA_BY_ID}from'./edge-schema.js';import{extractCoinType,extractObjectEdges,extractReverseRefs,extractTableRefs,inferObjectType}from'./extract.js';import{mergeBudget}from'./dataplane.js';import{deriveOrderCompletion,terminalNamesOfEdges}from'./order-status.js';import{wowAddressKind}from'@wowok/wowok';const WINDOW_RING_LIMIT=0x1450;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){return a['read']['kind']==='table'&&this['allows'](a,b)&&!!this['wl']['tableEdges']?.['includes'](a['id']);}}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'],'evidence':a['evidence'],'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();let m=new Set([d]);for(let n=0x0;n<=e['maxDepth'];n++){if(m['size']===0x0)break;if(h['exhausted']['nodes'])break;const o=Date['now'](),p=[...m]['filter'](y=>{const z=h['graph']['nodes']['get'](y);return z['kind']==='object'&&(z['state']==='seed'||z['state']==='stub')&&!i['has'](y);}),q=new Set();if(p['length']>0x0){const y=await a['getObjects'](p);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];for(const z of p){const A=h['graph']['nodes']['get'](z),B=lookupMapLower(y,z);i['add'](z);if(!B){A['state']='error',A['error']='not_found_or_failed',h['graph']['gaps']['push'](z);continue;}A['state']='fetched',A['raw']=B,A['objectType']=String(B['type']??A['objectType']??inferObjectType(z)??''),A['coinType']=extractCoinType(B['type_raw']),q['add'](z);}}const r=[];for(const C of q){const D=h['graph']['nodes']['get'](C);if(!D['objectType']||!D['raw'])continue;for(const E of extractObjectEdges(D['objectType'],D['raw'])){const F=EDGE_SCHEMA_BY_ID['get'](E['schemaId']);if(!F||!f['allows'](F,n))continue;r['push']({'schema':F,'sourceId':C,'refs':E['refs'],'observed':E['refs']['length']});}}const s=[...q]['filter'](G=>{const H=h['graph']['nodes']['get'](G);return EDGE_SCHEMAS['some'](I=>I['source']===H['objectType']&&I['read']['kind']==='table');});for(const G of s){const H=h['graph']['nodes']['get'](G);for(const I of EDGE_SCHEMAS){if(I['source']!==H['objectType']||!f['allowsTable'](I,n))continue;const J=G+'|'+I['id'];if(l['has'](J))continue;l['add'](J);const K=e['perKindCaps'][I['id']]??e['maxFanoutPerNode'];try{const {items:L,truncated:M}=await a['getTable'](G,{'maxItems':K});if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];const N=extractTableRefs(I['id'],G,L);for(const O of N){const P=EDGE_SCHEMA_BY_ID['get'](O['schemaId']);r['push']({'schema':P,'sourceId':G,'refs':O['refs'],'observed':O['refs']['length']});}if(M)h['markTruncation']({'nodeId':G,'schema':I['id'],'observed':L['length'],'limit':K});}catch{h['graph']['gaps']['push'](G+'#'+I['id']);}}}const t=[...m]['filter'](Q=>{const R=h['graph']['nodes']['get'](Q);return R['kind']!=='wfnode'&&(R['kind']==='eoa'||R['state']==='fetched');}),u=new Map(),v=new Map();for(const Q of t){const R=h['graph']['nodes']['get'](Q);for(const S of EDGE_SCHEMAS){if(S['read']['kind']!=='reverse'||!f['allows'](S,n))continue;if(!sourceMatches(S['source'],R))continue;const T=S['read']['parent'],U=Q+'|'+T;if(j['has'](U))continue;if(!u['has'](T))u['set'](T,[]);u['get'](T)['push'](Q);const V=Q+'|'+T+'|schema',W=v['get'](V)??[];W['push'](S),v['set'](V,W);}}for(const [X,Y]of u){for(const a0 of Y)j['add'](a0+'|'+X);let Z=new Map();try{Z=await a['getKeyedFields'](X,Y);if(readStats(a)['batches']>=e['maxRpcs'])h['exhausted']['rpcs']=!![];}catch{h['graph']['gaps']['push']('reverse:'+X);continue;}for(const a1 of Y){const a2=v['get'](a1+'|'+X+'|schema')??[],a3=lookupMapLower(Z,a1);if(!a3)continue;const a4=extractReverseRefs(X,a3['data']??a3);for(const a5 of a2){const a6=a5['read'];let a7=a4;a6['kind']==='reverse'&&a6['filterType']&&(a7=a4['filter'](a8=>inferObjectType(a8['to'])===a6['filterType']));if(a7['length']===0x0)continue;r['push']({'schema':a5,'sourceId':a1,'refs':a7,'observed':a7['length']});}}}const w=new Set(),x=new Map();for(const a8 of r){const a9=e['perKindCaps'][a8['schema']['id']]??e['maxFanoutPerNode'],aa=x['get'](a8['sourceId'])??0x0,ab=Math['max'](0x0,e['maxFanoutPerNode']-aa),ac=Math['min'](a9,ab),ad=a8['refs']['slice'](0x0,ac);a8['refs']['length']>ac&&h['markTruncation']({'nodeId':a8['sourceId'],'schema':a8['schema']['id'],'observed':a8['refs']['length'],'limit':WINDOW_RING_LIMIT});for(const ae of ad){const af=ae['from']??a8['sourceId'],ag=isWfNodeId(ae['to'])?n:n+0x1,ah=h['graph']['nodes']['has'](ae['to']);if(ag>e['maxDepth']&&!ah){h['exhausted']['depth']=!![];continue;}const ai=h['addNode'](ae['to'],Math['min'](ag,e['maxDepth']),{'schema':a8['schema']['id'],'from':af});if(!ai)break;h['addEdge'](a8['schema'],af,ae,o,a8['refs']['length']>ac),x['set'](a8['sourceId'],aa+0x1);if(!isWfNodeId(ae['to'])&&ag<=e['maxDepth'])w['add'](ae['to']);}}if(h['exhausted']['rpcs']){h['graph']['gaps']['push']('budget:maxRpcs');break;}m=w;}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 a75a}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'],'evidence':a['evidence'],'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':a75a,'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});}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe,expect,it}from'vitest';import{extractObjectEdges,walkDeepAddrs}from'./extract.js';function addr(a){return'0x'+a['padEnd'](0x40,'0');}const G1=addr('a1'),G2=addr('a2'),G3=addr('a3'),G4=addr('a4'),G5=addr('a5');describe('walkDeepAddrs\x20—\x20form\x201:\x20vector<struct>\x20→\x20scalar\x20address',()=>{it('reads\x20every\x20struct\x20row\x20and\x20exposes\x20the\x20row\x20as\x20payload\x20context',()=>{const a={'guards':[{'guard':G1,'mode':0x1},{'guard':G2,'mode':0x2}]},b=walkDeepAddrs(a,['guards'],'guard');expect(b['map'](c=>c['addr']))['toEqual']([G1,G2]),expect(b[0x0]['leaf']['mode'])['toBe'](0x1),expect(b[0x0]['rows'])['toHaveLength'](0x1),expect(b[0x0]['rows'][0x0])['toBe'](a['guards'][0x0]);});}),describe('walkDeepAddrs\x20—\x20form\x202:\x20vector<struct>\x20→\x20vector<struct>\x20→\x20address,\x20multi-schema\x20fanout',()=>{const a={'policies':[{'name':'default','write_guard':[{'guard':G1}],'quote_guard':G2},{'name':'strict','write_guard':[{'guard':G3},{'guard':G4}],'quote_guard':G5}]};it('walks\x20two\x20nested\x20vector\x20levels\x20(policies[].write_guard[].guard)',()=>{const b=walkDeepAddrs(a,['policies','write_guard'],'guard');expect(b['map'](c=>c['addr']))['toEqual']([G1,G3,G4]),expect(b[0x0]['rows'])['toHaveLength'](0x2),expect(b[0x0]['rows'][0x0]['name'])['toBe']('default'),expect(b[0x1]['rows'][0x0]['name'])['toBe']('strict');}),it('lets\x20the\x20same\x20row\x20fan\x20out\x20to\x20a\x20sibling\x20field\x20(policies[].quote_guard)',()=>{const b=walkDeepAddrs(a,['policies'],'quote_guard');expect(b['map'](c=>c['addr']))['toEqual']([G2,G5]),expect(b[0x1]['rows'][0x0]['name'])['toBe']('strict');});}),describe('walkDeepAddrs\x20—\x20form\x203:\x20vector<struct>\x20→\x20vector<address|struct>',()=>{it('accepts\x20bare\x20addresses\x20and\x20address-carrying\x20structs\x20in\x20one\x20leaf\x20vector',()=>{const a={'guard':[{'guard':addr('b0'),'relies':[G1,G2]},{'guard':addr('b1'),'relies':[{'guard':G3},{'address':G4}]}]},b=walkDeepAddrs(a,['guard','relies'],'guard');expect(b['map'](c=>c['addr']))['toEqual']([G1,G2,G3,G4]),expect(b[0x0]['leaf'])['toEqual']({}),expect(b[0x0]['rows'][0x0]['guard'])['toBe'](addr('b0')),expect(b[0x2]['leaf'])['toEqual']({'guard':G3});});}),describe('walkDeepAddrs\x20—\x20form\x204:\x20historical\x20layout\x20compatibility',()=>{it('accepts\x20a\x20bare\x20struct\x20where\x20a\x20vector<struct>\x20is\x20current',()=>{const a={'policies':{'name':'solo','write_guard':[{'guard':G1}]}},b=walkDeepAddrs(a,['policies','write_guard'],'guard');expect(b['map'](c=>c['addr']))['toEqual']([G1]),expect(b[0x0]['rows']['map'](c=>c['name']))['toEqual'](['solo',undefined]);}),it('accepts\x20a\x20scalar\x20struct\x20at\x20the\x20leaf\x20container\x20slot',()=>{const a={'policies':[{'name':'only','write_guard':{'guard':G2}}]},b=walkDeepAddrs(a,['policies','write_guard'],'guard');expect(b['map'](c=>c['addr']))['toEqual']([G2]);}),it('recognizes\x20the\x20historical\x20address/address-who\x20member\x20aliases',()=>{const a={'refs':[{'address':G3},{'who':G4},{'guard':G5}]},b=walkDeepAddrs(a,['refs'],'guard');expect(b['map'](c=>c['addr']))['toEqual']([G3,G4,G5]);});}),describe('walkDeepAddrs\x20—\x20form\x205:\x20empty\x20values\x20and\x20malformed\x20entries',()=>{it('returns\x20nothing\x20for\x20missing\x20paths,\x20null\x20roots\x20or\x20empty\x20vectors',()=>{expect(walkDeepAddrs({},['policies','write_guard'],'guard'))['toEqual']([]),expect(walkDeepAddrs({'policies':null},['policies'],'guard'))['toEqual']([]),expect(walkDeepAddrs({'policies':[]},['policies'],'guard'))['toEqual']([]),expect(walkDeepAddrs({'policies':[{'write_guard':[]}]},['policies','write_guard'],'guard'))['toEqual']([]);}),it('skips\x20garbage\x20without\x20throwing\x20and\x20keeps\x20the\x20valid\x20leaves',()=>{const a={'policies':[null,'garbage',0x2a,{'write_guard':[null,{'guard':'0xnotanaddress'},{'guard':G1}]},{'write_guard':['0x123',G2,{'guard':G3,'extra':!![]}]},{'write_guard':[{'guard':undefined}]}]};let b;expect(()=>{b=walkDeepAddrs(a,['policies','write_guard'],'guard');})['not']['toThrow'](),expect(b['map'](c=>c['addr']))['toEqual']([G1,G2,G3]),expect(b[0x2]['leaf']['extra'])['toBe'](!![]);}),it('preserves\x20multiplicity\x20when\x20the\x20same\x20address\x20appears\x20under\x20different\x20rows',()=>{const a={'policies':[{'name':'default','write_guard':[{'guard':G1}]},{'name':'strict','write_guard':[{'guard':G1}]}]},b=walkDeepAddrs(a,['policies','write_guard'],'guard');expect(b)['toHaveLength'](0x2),expect(b[0x0]['rows'][0x0]['name'])['toBe']('default'),expect(b[0x1]['rows'][0x0]['name'])['toBe']('strict');});}),describe('extractObjectEdges\x20—\x20registry\x20integration\x20of\x20the\x20unified\x20walk',()=>{it('still\x20extracts\x20structFields\x20demand.guard\x20from\x20struct\x20and\x20bare-address\x20rows',()=>{const a={'type_raw':'0x2::demand::Demand','data':{'guards':[{'guard':G1,'service_identifier':0x9},G2]}},b=extractObjectEdges('Demand',a),c=b['find'](d=>d['schemaId']==='demand.guard');expect(c?.['refs']['map'](d=>d['to']))['toEqual']([G1,G2]);});});
@@ -1,7 +1,13 @@
1
- import { type EdgeSchema } from "./edge-schema.js";
1
+ import { type EdgeSchema, type EventRead } from "./edge-schema.js";
2
2
  import type { RawObject, TableItem, TopoEdgePayload } from "./types.js";
3
3
  export declare function normAddr(v: unknown): string | undefined;
4
4
  export declare function rootOf(raw: RawObject | undefined): Record<string, unknown>;
5
+ export interface DeepLeaf {
6
+ addr: string;
7
+ leaf: Record<string, unknown>;
8
+ rows: Record<string, unknown>[];
9
+ }
10
+ export declare function walkDeepAddrs(root: Record<string, unknown>, segments: string[], field: string): DeepLeaf[];
5
11
  export interface RawRef {
6
12
  to: string;
7
13
  from?: string;
@@ -13,8 +19,10 @@ export interface ExtractedEdges {
13
19
  refs: RawRef[];
14
20
  }
15
21
  export declare function wfNodeId(machine: string, name: string): string;
16
- export declare function extractReverseRefs(parent: string, field: unknown): RawRef[];
17
- export declare function extractTableRefs(schemaId: string, sourceId: string, items: TableItem[]): ExtractedEdges[];
22
+ export declare const REVERSE_GROUP_WILDCARD = "*";
23
+ export declare function extractReverseRefs(parent: string, field: unknown): ExtractedEdges[];
24
+ export declare function extractTableRefs(rowType: string, sourceId: string, items: TableItem[]): ExtractedEdges[];
25
+ export declare function extractEventRefs(read: EventRead, sourceId: string, events: unknown[]): RawRef[];
18
26
  export declare function inferObjectType(addr: string): string | undefined;
19
27
  export declare function extractCoinType(typeRaw: unknown): string | undefined;
20
28
  export declare function extractObjectEdges(objectType: string, raw: RawObject): ExtractedEdges[];
@@ -1 +1 @@
1
- import{objectTypeFromAddress}from'@wowok/wowok';import{EDGE_SCHEMAS}from'./edge-schema.js';const ADDR_RE=/^0x[0-9a-f]{64}$/;export function normAddr(a){if(typeof a!=='string')return undefined;const b=a['trim']()['toLowerCase']();return ADDR_RE['test'](b)?b:undefined;}export function rootOf(a){const b=a;return b?.['data']??b??{};}function dig(a,b){return b['split']('.')['reduce']((c,d)=>{if(c==null)return undefined;return c[d];},a);}function asArray(a){if(Array['isArray'](a))return a;if(a==null)return[];return[a];}function addrOf(a,b){if(typeof a==='string')return normAddr(a);if(a&&typeof a==='object'){const c=a;return normAddr(c[b]??c['guard']??c['address']??c['who']);}return undefined;}function deepAddrs(b,c,d){let e=b;for(const g of c){if(Array['isArray'](e))e=e['flatMap'](h=>asArray(h?.[g]));else e&&typeof e==='object'?e=e[g]:e=undefined;}const f=[];for(const h of asArray(e)){if(typeof h==='string'){const i=normAddr(h);if(i)f['push']({'addr':i,'item':{}});}else{if(h&&typeof h==='object'){const j=h,k=addrOf(j,d||'guard');if(k)f['push']({'addr':k,'item':j});}}}return f;}export function wfNodeId(a,b){return(normAddr(a)??a['toLowerCase']())+'::node::'+b;}function strAmt(a){if(a==null)return undefined;if(typeof a==='bigint')return a['toString']();const b=String(a);return b===''?undefined:b;}function extractFieldEdges(b,c,d){const e=rootOf(c),f=[];for(const g of EDGE_SCHEMAS){if(g['source']!==b)continue;const i=g['read'];if(i['kind']==='reverse'||i['kind']==='table'||i['kind']==='derived')continue;let j=[];switch(i['kind']){case'field':{const k=addrOf(dig(e,i['path']),'guard');if(k)j=[{'to':k}];break;}case'fields':{j=asArray(dig(e,i['path']))['map'](l=>addrOf(l,'guard'))['filter'](l=>!!l)['map'](l=>({'to':l}));break;}case'structFields':{j=asArray(dig(e,i['path']))['map'](l=>{const m=addrOf(l,i['field']);if(!m)return undefined;const n=typeof l==='object'&&l?l:{};return{'to':m,'payload':payloadFor(g['id'],n,d)};})['filter'](l=>!!l);break;}case'deep':{if(g['id']==='progress.named_operator'){const l=asArray(e['namedOperator']);for(const m of l){const n=m??{};for(const p of asArray(n['operators'])){const q=normAddr(p);if(q)j['push']({'to':q,'key':String(n['name']??''),'payload':{'namedOperator':n['name']!=null?String(n['name']):null}});}}}else j=deepAddrs(e,i['segments'],i['field'])['map'](({addr:r,item:s})=>({'to':r,'payload':payloadFor(g['id'],s,d)}));break;}}g['family']==='M'&&d&&(j=j['map'](s=>({...s,'payload':{'coinType':d,...s['payload']}})));if(j['length']>0x0)f['push']({'schemaId':g['id'],'refs':j});}return f;}function payloadFor(a,b,c){switch(a){case'payment.recipient':{const d=strAmt(b['amount']);return d!=null?{'amount':d,'coinType':c}:undefined;}case'arb.voter':return{'weight':Number(b['weight']??0x0)||undefined};case'allocation.guard':case'service.order_allocator_guard':return b['mode']!=null?{'mode':clampMode(Number(b['mode']))}:undefined;default:return undefined;}}function clampMode(a){return a===0x1||a===0x2?a:0x0;}export function extractReverseRefs(a,b){const c=b??{},e=[];if(a==='0xaaa'){for(const f of asArray(c['votes'])){const g=f??{},h=normAddr(g['who']);if(!h)continue;e['push']({'to':h,'payload':{'voteBits':(g['like']?0x2:0x0)|(g['dislike']?0x4:0x0)|(g['favor']?0x8:0x0),'voteLike':!!g['like'],'voteDislike':!!g['dislike'],'voteFavor':!!g['favor']}});}return e;}for(const i of asArray(c['items'])){const j=i??{},k=normAddr(j['permission']??j['contact']??j['order']??j['who']);if(!k)continue;const l=j['role']!=null?Number(j['role']):undefined;e['push']({'to':k,'payload':l!=null?{'roleBits':l}:undefined});}return e;}export function extractTableRefs(a,b,c){switch(a){case'permission.entity':{const e=[];for(const f of c){const g=rootOf(f['object']),h=normAddr(g['address']),i=Array['isArray'](g['perm'])?g['perm']['map'](Number):[];if(h)e['push']({'to':h,'payload':{'permIndices':i}});}return e['length']?[{'schemaId':a,'refs':e}]:[];}case'demand.presenter':{const j=[];for(const k of c){const l=rootOf(k['object']),m=normAddr(l['address']);if(!m)continue;j['push']({'to':m,'payload':{'service':normAddr(l['service'])??undefined,'score':l['acceptance_score']!=null?Number(l['acceptance_score']):undefined,'recommend':l['recommend']!=null?String(l['recommend']):undefined}});}return j['length']?[{'schemaId':a,'refs':j}]:[];}case'machine.node':return extractMachineTable(b,c);default:return[];}}function extractMachineTable(a,b){const c=[],e=[],g=[],h=new Set(),i=k=>{const l=String(k??'')['trim']();if(!l)return undefined;const m=wfNodeId(a,l);return!h['has'](m)&&(h['add'](m),c['push']({'to':m,'key':l,'payload':{'node':l}})),m;};for(const k of b){const l=rootOf(k['object']),m=String(l['name']??''),n=i(m);if(!n)continue;for(const o of asArray(l['value'])){const q=o??{},r=String(q['prev_node']??'')['trim']();if(r)i(r);const s=r?wfNodeId(a,r):undefined,t=Number(q['threshold']??0x0);for(const u of asArray(q['forwards'])){const v=u??{},w=String(v['name']??''),x=addrOf(v['guard'],'guard');s&&e['push']({'from':s,'to':n,'key':w||undefined,'payload':{'forward':w||undefined,'prevNode':r||undefined,'node':m,'threshold':t||undefined,'guard':x??undefined,'weight':Number(v['weight']??0x0)||undefined,'namedOperator':v['namedOperator']!=null?String(v['namedOperator']):null,'permissionIndex':v['permissionIndex']!=null?Number(v['permissionIndex']):null}}),x&&g['push']({'to':x,'key':w||undefined,'payload':{'forward':w||undefined,'weight':Number(v['weight']??0x0)||undefined,'namedOperator':v['namedOperator']!=null?String(v['namedOperator']):null,'permissionIndex':v['permissionIndex']!=null?Number(v['permissionIndex']):null}});}}}const j=[];if(c['length'])j['push']({'schemaId':'machine.node','refs':c});if(e['length'])j['push']({'schemaId':'wf.transition','refs':e});if(g['length'])j['push']({'schemaId':'wf.forward_guard','refs':g});return j;}export function inferObjectType(a){return objectTypeFromAddress(a)??undefined;}export function extractCoinType(a){if(typeof a!=='string'||!a['includes']('<'))return undefined;const b=a['slice'](a['indexOf']('<')+0x1,a['lastIndexOf']('>'));return b['trim']()||undefined;}export function extractObjectEdges(a,b){return extractFieldEdges(a,b,extractCoinType(b['type_raw']));}export function schemaById(a){return EDGE_SCHEMAS['find'](b=>b['id']===a);}
1
+ import{WOW_SINGLETON_IDS,objectTypeFromAddress}from'@wowok/wowok';import{EDGE_SCHEMAS}from'./edge-schema.js';const ADDR_RE=/^0x[0-9a-f]{64}$/;export function normAddr(a){if(typeof a!=='string')return undefined;const b=a['trim']()['toLowerCase']();return ADDR_RE['test'](b)?b:undefined;}export function rootOf(a){const b=a;return b?.['data']??b??{};}function dig(a,b){return b['split']('.')['reduce']((c,d)=>{if(c==null)return undefined;return c[d];},a);}function asArray(a){if(Array['isArray'](a))return a;if(a==null)return[];return[a];}function addrsOf(b,c){if(Array['isArray'](b))return b['flatMap'](d=>addrsOf(d,c));if(typeof b==='string'){const d=normAddr(b);return d?[d]:[];}if(b&&typeof b==='object'){const e=b,f=normAddr(e[c]??e['guard']??e['address']??e['who']);if(f)return[f];const g=e[c];if(g!==b&&Array['isArray'](g))return addrsOf(g,c);}return[];}export function walkDeepAddrs(b,c,d){let e=[{'rows':[],'value':b}];for(const g of c){const h=[];for(const i of e){for(const j of asArray(i['value'])){if(!j||typeof j!=='object')continue;const k=j,l=k[g];if(l==null)continue;for(const m of asArray(l)){if(m==null)continue;const n=typeof m==='object'?[...i['rows'],m]:i['rows'];h['push']({'rows':n,'value':m});}}}e=h;if(e['length']===0x0)return[];}const f=[];for(const {rows:p,value:q}of e){for(const r of asArray(q)){if(r==null)continue;if(typeof r==='string'){const t=normAddr(r);if(t)f['push']({'addr':t,'leaf':{},'rows':p});continue;}if(typeof r!=='object')continue;const s=r;for(const u of addrsOf(s,d||'guard')){f['push']({'addr':u,'leaf':s,'rows':p});}}}return f;}function leafContext(a){return Object['assign']({},...a['rows'],a['leaf']);}export function wfNodeId(a,b){return(normAddr(a)??a['toLowerCase']())+'::node::'+b;}function strAmt(a){if(a==null)return undefined;if(typeof a==='bigint')return a['toString']();const b=String(a);return b===''?undefined:b;}function numOrNull(a){if(a===null)return null;if(typeof a==='number'&&Number['isFinite'](a))return a;if(a!=null&&typeof a!=='object'){const b=Number(a);if(Number['isFinite'](b))return b;}return undefined;}function addrOrNull(a){if(a===null)return null;return normAddr(a)??undefined;}function num(a){if(typeof a==='number'&&Number['isFinite'](a))return a;if(a==null||typeof a==='object')return undefined;const b=Number(a);return Number['isFinite'](b)?b:undefined;}function extractFieldEdges(b,c,d){const e=rootOf(c),f=[];for(const g of EDGE_SCHEMAS){if(g['source']!==b)continue;const i=g['read'];if(i['kind']==='reverse'||i['kind']==='table'||i['kind']==='derived')continue;let j=[];switch(i['kind']){case'field':{const k=addrsOf(dig(e,i['path']),'guard')[0x0];if(k)j=[{'to':k}];break;}case'fields':{j=addrsOf(dig(e,i['path']),'guard')['map'](l=>({'to':l}));break;}case'structFields':{j=walkDeepAddrs(e,[i['path']],i['field'])['map'](l=>({'to':l['addr'],'payload':payloadFor(g['id'],leafContext(l),d)}));break;}case'deep':{if(g['id']==='progress.named_operator'){const l=asArray(e['namedOperator']);for(const m of l){const n=m??{};for(const p of asArray(n['operators'])){const q=normAddr(p);if(q)j['push']({'to':q,'key':String(n['name']??''),'payload':{'namedOperator':n['name']!=null?String(n['name']):null}});}}}else j=walkDeepAddrs(e,i['segments'],i['field'])['map'](r=>({'to':r['addr'],'payload':payloadFor(g['id'],leafContext(r),d)}));break;}}g['family']==='M'&&d&&(j=j['map'](s=>({...s,'payload':{'coinType':d,...s['payload']}})));if(j['length']>0x0)f['push']({'schemaId':g['id'],'refs':j});}return f;}function payloadFor(a,b,c){switch(a){case'payment.recipient':{const d=strAmt(b['amount']);return d!=null?{'amount':d,'coinType':c}:undefined;}case'arb.voter':return{'weight':Number(b['weight']??0x0)||undefined};case'contact.im':return{'imStatus':b['status']!=null?String(b['status']):undefined,'joinTime':typeof b['join_time']==='number'?b['join_time']:Number(b['join_time'])||undefined,'imDescription':b['description']!=null?String(b['description']):undefined};case'allocation.guard':case'service.order_allocator_guard':return b['mode']!=null?{'mode':clampMode(Number(b['mode']))}:undefined;case'treasury.deposit_guard':case'treasury.withdraw_guard':return{'identifier':numOrNull(b['identifier']),'storeFromId':numOrNull(b['store_from_id'])};default:return undefined;}}function clampMode(a){return a===0x1||a===0x2?a:0x0;}export const REVERSE_GROUP_WILDCARD='*';export function extractReverseRefs(a,b){const c=b??{};if(a===WOW_SINGLETON_IDS['registrar']){const f=[];for(const g of asArray(c['votes'])){const h=g??{},i=normAddr(h['who']);if(!i)continue;f['push']({'to':i,'payload':{'voteBits':(h['like']?0x2:0x0)|(h['dislike']?0x4:0x0)|(h['favor']?0x8:0x0),'voteLike':!!h['like'],'voteDislike':!!h['dislike'],'voteFavor':!!h['favor']}});}return f['length']?[{'schemaId':'target.vote','refs':f}]:[];}if(a===WOW_SINGLETON_IDS['entity'])return extractEntityProfile(c);const e=[];for(const j of asArray(c['items'])){const k=j??{},l=normAddr(k['permission']??k['contact']??k['order']??k['who']);if(!l)continue;const m=k['role']!=null?Number(k['role']):undefined;e['push']({'to':l,'payload':m!=null&&Number['isFinite'](m)?{'roleBits':m}:undefined});}return e['length']?[{'schemaId':REVERSE_GROUP_WILDCARD,'refs':e}]:[];}function extractEntityProfile(a){const b=[],c=typeof a['description']==='string'?a['description']:'',e=num(a['time']),f=[];for(const i of asArray(a['records'])){const j=i??{};if(typeof j['name']!=='string')continue;const k={'name':j['name']};if(j['value_type']!==undefined)k['valueType']=j['value_type'];else{if(j['typed_value']!==undefined)k['value']=j['typed_value'];}if(j['value']!==undefined)k['value']=j['value'];f['push'](k);}b['push']({'schemaId':'entity.profile','refs':[{'to':'','payload':{...c?{'description':c}:{},...e!=null?{'registeredAt':e}:{},...f['length']?{'profileRecords':f}:{}}}]});const g=normAddr(a['referrer']);g&&b['push']({'schemaId':'entity.referrer','refs':[{'to':g}]});const h=normAddr(a['resource']??a['mark_object']);return h&&b['push']({'schemaId':'entity.resource','refs':[{'to':h}]}),b;}export function extractTableRefs(a,b,c){switch(a){case'PermissionPerm':return extractPermissionTable(c);case'DemandPresenter':return extractPresenterTable(c);case'MachineNode':return extractMachineTable(b,c);case'TreasuryRecord':return extractTreasuryLedger(c);case'RewardClaimRecord':return extractRewardLedger(c);case'RepositoryData':return extractRepositoryDataTable(c);default:return[];}}export function extractEventRefs(a,b,c){const d=[];for(const e of c){const f=e??{},g=f['parsedJson']??{};if(a['matchField']!==undefined){if(normAddr(g[a['matchField']])!==b)continue;}else{if(a['matchSender']){if(normAddr(f['sender'])!==b)continue;}}const h=normAddr(g[a['targetField']]);if(!h)continue;const i=typeof f['timestampMs']==='string'?Number(f['timestampMs']):f['timestampMs'];d['push']({'to':h,'payload':{...g,...Number['isFinite'](i)?{'time':i}:{}}});}return d;}function extractPermissionTable(a){const b=[];for(const c of a){const e=rootOf(c['object']),f=normAddr(e['address']),g=Array['isArray'](e['perm'])?e['perm']['map'](Number):[];if(f)b['push']({'to':f,'payload':{'permIndices':g}});}return b['length']?[{'schemaId':'permission.entity','refs':b}]:[];}function extractPresenterTable(a){const b=[],c=[];for(const f of a){const g=rootOf(f['object']),h=normAddr(g['address']);if(h){b['push']({'to':h,'payload':{'service':normAddr(g['service'])??undefined,'score':g['acceptance_score']!=null?Number(g['acceptance_score']):undefined,'recommend':g['recommend']!=null?String(g['recommend']):undefined}});const i=normAddr(g['service']);i&&c['push']({'to':i,'key':h,'payload':{'presenter':h,'score':g['acceptance_score']!=null?Number(g['acceptance_score']):undefined}});}}const e=[];if(b['length'])e['push']({'schemaId':'demand.presenter','refs':b});if(c['length'])e['push']({'schemaId':'demand.presenter_service','refs':c});return e;}function extractTreasuryLedger(a){const b=[];for(const c of a){const e=normAddr(c['key']);if(!e)continue;const f=rootOf(c['object']);b['push']({'to':e,'payload':{'op':num(f['op']),'signer':normAddr(f['signer'])??undefined,'amount':strAmt(f['amount']),'time':num(f['time']),'externalGuard':addrOrNull(f['external_guard']),'storeFromId':addrOrNull(f['store_from_id'])}});}return b['length']?[{'schemaId':'treasury.record','refs':b}]:[];}function extractRewardLedger(a){const b=[];for(const c of a){const e=normAddr(c['key']);if(!e)continue;const f=rootOf(c['object']),g=(Array['isArray'](f['amount'])?f['amount']:[])['flatMap'](h=>{const i=h??{},j=normAddr(i['guard']);if(!j)return[];return[{'guard':j,'amount':strAmt(i['amount']),'time':num(i['time']),'storeFromId':addrOrNull(i['store_from_id'])}];});b['push']({'to':e,'payload':{'amount':strAmt(f['total']),'claims':g}});}return b['length']?[{'schemaId':'reward.claim','refs':b}]:[];}function extractRepositoryDataTable(a){const b=[];for(const c of a){const e=rootOf(c['object']),f=normAddr(e['id']);if(!f)continue;const g=e['key']!=null?String(e['key']):e['name']!=null?String(e['name']):undefined;b['push']({'to':f,'payload':{'dataName':g}});}return b['length']?[{'schemaId':'repository.data_about','refs':b}]:[];}function extractMachineTable(a,b){const c=[],e=[],g=[],h=new Set(),i=k=>{const l=String(k??'')['trim']();if(!l)return undefined;const m=wfNodeId(a,l);return!h['has'](m)&&(h['add'](m),c['push']({'to':m,'key':l,'payload':{'node':l}})),m;};for(const k of b){const l=rootOf(k['object']),m=String(l['name']??''),n=i(m);if(!n)continue;for(const o of asArray(l['value'])){const q=o??{},r=String(q['prev_node']??'')['trim']();if(r)i(r);const s=r?wfNodeId(a,r):undefined,t=Number(q['threshold']??0x0);for(const u of asArray(q['forwards'])){const v=u??{},w=String(v['name']??''),x=addrsOf(v['guard'],'guard')[0x0];s&&e['push']({'from':s,'to':n,'key':w||undefined,'payload':{'forward':w||undefined,'prevNode':r||undefined,'node':m,'threshold':t||undefined,'guard':x??undefined,'weight':Number(v['weight']??0x0)||undefined,'namedOperator':v['namedOperator']!=null?String(v['namedOperator']):null,'permissionIndex':v['permissionIndex']!=null?Number(v['permissionIndex']):null}}),x&&g['push']({'to':x,'key':w||undefined,'payload':{'forward':w||undefined,'weight':Number(v['weight']??0x0)||undefined,'namedOperator':v['namedOperator']!=null?String(v['namedOperator']):null,'permissionIndex':v['permissionIndex']!=null?Number(v['permissionIndex']):null}});}}}const j=[];if(c['length'])j['push']({'schemaId':'machine.node','refs':c});if(e['length'])j['push']({'schemaId':'wf.transition','refs':e});if(g['length'])j['push']({'schemaId':'wf.forward_guard','refs':g});return j;}export function inferObjectType(a){return objectTypeFromAddress(a)??undefined;}export function extractCoinType(a){if(typeof a!=='string'||!a['includes']('<'))return undefined;const b=a['slice'](a['indexOf']('<')+0x1,a['lastIndexOf']('>'));return b['trim']()||undefined;}export function extractObjectEdges(a,b){return extractFieldEdges(a,b,extractCoinType(b['type_raw']));}export function schemaById(a){return EDGE_SCHEMAS['find'](b=>b['id']===a);}
@@ -0,0 +1,99 @@
1
+ import type { GraphServiceEvaluation } from "../../evaluation/builtins/graph-service.js";
2
+ import { type FacetId } from "../../evaluation/facets/catalog.js";
3
+ import type { GraphEvaluationFacts } from "./facts.js";
4
+ import type { Finding, InterestPayload, TopologyGraph, Viewport } from "./types.js";
5
+ export type FacetState = "present" | "empty" | "gap";
6
+ export interface FacetMoney {
7
+ raw: string;
8
+ coin_type?: string;
9
+ display?: string;
10
+ symbol?: string;
11
+ decimals?: number;
12
+ precision_known: boolean;
13
+ tip?: string;
14
+ }
15
+ export interface FacetAmount {
16
+ key: string;
17
+ label: string;
18
+ money: FacetMoney;
19
+ }
20
+ export interface FacetSignal {
21
+ key: string;
22
+ label: string;
23
+ state: "configured" | "missing" | "unknown";
24
+ detail?: string;
25
+ gloss?: string;
26
+ }
27
+ export interface FacetScoreRef {
28
+ evaluation: "trust" | "risk";
29
+ rule_id: string;
30
+ }
31
+ export interface FacetGraphRef {
32
+ id: string;
33
+ label: string;
34
+ full?: string;
35
+ role?: string;
36
+ }
37
+ export interface FacetGraph {
38
+ kind: "workflow" | "fund_flow" | "supply_chain";
39
+ summary: string;
40
+ refs: FacetGraphRef[];
41
+ }
42
+ export interface FacetResult {
43
+ id: FacetId;
44
+ label: string;
45
+ question: string;
46
+ state: FacetState;
47
+ scores?: FacetScoreRef[];
48
+ signals?: FacetSignal[];
49
+ amounts?: FacetAmount[];
50
+ graph?: FacetGraph;
51
+ evidence: string[];
52
+ gap_reason?: string;
53
+ threshold?: number;
54
+ }
55
+ export interface FacetsBlock {
56
+ profile: {
57
+ role?: string;
58
+ industry?: string;
59
+ persona_applied: boolean;
60
+ sources: string[];
61
+ };
62
+ items: FacetResult[];
63
+ }
64
+ export interface FacetProjectionProfile {
65
+ role?: string;
66
+ industry?: string;
67
+ persona_applied: boolean;
68
+ sources: string[];
69
+ facets: Record<string, {
70
+ visible: boolean;
71
+ order: number;
72
+ weight?: number;
73
+ threshold?: number;
74
+ }>;
75
+ }
76
+ export interface FacetWorkflowShape {
77
+ machine: string;
78
+ transitions: Array<{
79
+ node: string;
80
+ prev_node: string;
81
+ forward?: string;
82
+ guard: string | null;
83
+ named_operator: string | null;
84
+ permission_index: unknown;
85
+ }>;
86
+ terminal_names: string[];
87
+ }
88
+ export interface ProjectFacetsInput {
89
+ graph: TopologyGraph;
90
+ viewport: Viewport;
91
+ target: string;
92
+ facts: GraphEvaluationFacts;
93
+ evaluation: GraphServiceEvaluation;
94
+ workflows: FacetWorkflowShape[];
95
+ profile: FacetProjectionProfile;
96
+ roleInterest?: InterestPayload;
97
+ findings?: Finding[];
98
+ }
99
+ export declare function projectFacets(input: ProjectFacetsInput): FacetsBlock;
@@ -0,0 +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};}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +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');});});
@@ -0,0 +1,103 @@
1
+ import type { Confidence, EntityProfileRecord, Finding, Retention, Viewport } from "./types.js";
2
+ export type FactState = "present" | "empty" | "gap";
3
+ export type EvaluationDimension = "arbitration" | "reviews" | "fulfillment" | "fund_safety" | "transparency" | "risk_workflow" | "risk_fund" | "risk_trust" | "risk_behavior";
4
+ export interface FactProvenance {
5
+ path: string[];
6
+ retention: Retention;
7
+ confidence: Confidence;
8
+ window?: {
9
+ observed: number;
10
+ limit: number;
11
+ };
12
+ }
13
+ export interface Fact {
14
+ dimension: EvaluationDimension;
15
+ key: string;
16
+ state: FactState;
17
+ value?: unknown;
18
+ provenance: FactProvenance;
19
+ findingIds?: string[];
20
+ evidence: string;
21
+ }
22
+ export interface CoverageSlot {
23
+ slot: string;
24
+ label: string;
25
+ gloss: string;
26
+ required: boolean;
27
+ state: FactState;
28
+ facts: string[];
29
+ }
30
+ export interface CoverageVocabulary {
31
+ present: string;
32
+ empty: string;
33
+ gap: string;
34
+ unverified: string;
35
+ completeness: string;
36
+ }
37
+ export declare const COVERAGE_VOCABULARY: CoverageVocabulary;
38
+ export interface EntityProfileAttributes {
39
+ nodeId: string;
40
+ registeredAt?: number;
41
+ hasDescription: boolean;
42
+ recordCount: number;
43
+ description?: string;
44
+ profileRecords?: EntityProfileRecord[];
45
+ }
46
+ export interface GraphEvaluationFacts {
47
+ target: string;
48
+ role: string;
49
+ facts: Fact[];
50
+ slots: CoverageSlot[];
51
+ completeness: number;
52
+ profiles: EntityProfileAttributes[];
53
+ }
54
+ export interface ArbitrationBinding {
55
+ id: string;
56
+ paused: boolean;
57
+ fee: string;
58
+ votingGuards: number;
59
+ usageGuard: boolean;
60
+ }
61
+ export interface VoteCounts {
62
+ total: number;
63
+ like: number;
64
+ dislike: number;
65
+ favor: number;
66
+ }
67
+ export interface OrderWindowStats {
68
+ observed: number;
69
+ completed: number;
70
+ inProgress: number;
71
+ unknown: number;
72
+ windowedAmount: string;
73
+ }
74
+ export interface WorkflowShape {
75
+ machine: string;
76
+ nodes: number;
77
+ }
78
+ export interface FundPosition {
79
+ fund: string;
80
+ coinType?: string;
81
+ }
82
+ export interface FundExposure {
83
+ fund: string;
84
+ windowedCount: number;
85
+ windowedAmount: string;
86
+ neededCeiling: string;
87
+ coverageMet: boolean;
88
+ }
89
+ export interface TransparencyProfile {
90
+ description: string;
91
+ location: string;
92
+ settingLockDuration: number;
93
+ published: boolean;
94
+ paused: boolean;
95
+ }
96
+ export interface RiskFindingRefs {
97
+ findings: Array<{
98
+ id: string;
99
+ severity: string;
100
+ title: string;
101
+ }>;
102
+ }
103
+ export declare function projectEvaluationFacts(v: Viewport, target: string, findings: Finding[]): GraphEvaluationFacts;
@@ -0,0 +1 @@
1
+ import{RETENTION_RANK,pathConfidence}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 ag of a9['slots']){const ah=h['get'](ag)??'gap';STATE_RANK[ah]>ac&&(ac=STATE_RANK[ah],aa=ah,ab=ag);}let ae;if(aa==='gap')ae='windowed';else{if(aa==='empty')ae='bounded';else ae=ab&&i['get'](ab)||'exact';}const af=c['filter'](ai=>a9['ruleIds']['some'](aj=>ai['id']['startsWith'](aj+':')));g['push']({'dimension':a8,'key':a8+'.findings','state':aa,'value':{'findings':af['map'](ai=>({'id':ai['id'],'severity':ai['severity'],'title':ai['title']}))},'provenance':{'path':[f,...a9['slots']],'retention':'derived','confidence':ae},'findingIds':af['map'](ai=>ai['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.':af['length']>0x0?af['length']+'\x20structural\x20risk\x20finding(s)\x20reused\x20from\x20the\x20analyzer\x20registry.':'No\x20risk\x20fired;\x20input\x20evidence\x20slots\x20are\x20fully\x20materialized.'});}const Q=[];for(const ai of a['visibleNodes']){const aj=profileOf(a,ai);if(!aj)continue;const ak=Array['isArray'](aj['profileRecords'])?aj['profileRecords']:undefined;Q['push']({'nodeId':ai,...typeof aj['registeredAt']==='number'?{'registeredAt':aj['registeredAt']}:{},'hasDescription':!!aj['hasDescription']||typeof aj['description']==='string','recordCount':typeof aj['recordCount']==='number'?aj['recordCount']:ak?.['length']??0x0,...typeof aj['description']==='string'?{'description':aj['description']}:{},...ak?{'profileRecords':ak}:{}});}const R=REQUIRED_SLOTS['length'],S=REQUIRED_SLOTS['filter'](({slot:al})=>h['get'](al)==='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:al,label:am,gloss:an})=>({'slot':al,'label':am,'gloss':an,'required':!![],'state':h['get'](al)??'gap','facts':[...SLOT_FACTS[al]??[]]})),'completeness':T,'profiles':Q};}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +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);}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']());});});
@@ -0,0 +1,29 @@
1
+ export type FieldDisposition = {
2
+ readonly kind: "edge";
3
+ readonly schema: string;
4
+ readonly coSchemas?: readonly string[];
5
+ readonly note?: string;
6
+ } | {
7
+ readonly kind: "attribute";
8
+ readonly note: string;
9
+ } | {
10
+ readonly kind: "transient";
11
+ readonly note: string;
12
+ } | {
13
+ readonly kind: "nonAddress";
14
+ readonly note: string;
15
+ };
16
+ export interface FieldEntry {
17
+ readonly field: string;
18
+ readonly disposition: FieldDisposition;
19
+ readonly evidence: string;
20
+ readonly oq?: string;
21
+ }
22
+ export interface ObjectManifest {
23
+ readonly object: string;
24
+ readonly moveStruct: string;
25
+ readonly fields: readonly FieldEntry[];
26
+ }
27
+ export declare const FIELD_MANIFEST: readonly ObjectManifest[];
28
+ export declare const MANIFEST_BY_OBJECT: ReadonlyMap<string, ObjectManifest>;
29
+ export declare const BUSINESS_OBJECTS: readonly string[];