@wowok/agent-mcp 3.1.2 → 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 (300) 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/architecture.spec.d.ts +1 -0
  11. package/dist/evaluation/architecture.spec.js +1 -0
  12. package/dist/evaluation/builtins/graph-service.d.ts +16 -0
  13. package/dist/evaluation/builtins/graph-service.js +1 -0
  14. package/dist/evaluation/builtins/graph-service.spec.d.ts +1 -0
  15. package/dist/evaluation/builtins/graph-service.spec.js +1 -0
  16. package/dist/evaluation/builtins/index.d.ts +1 -1
  17. package/dist/evaluation/builtins/index.js +1 -1
  18. package/dist/evaluation/builtins/purity.spec.d.ts +1 -0
  19. package/dist/evaluation/builtins/purity.spec.js +1 -0
  20. package/dist/evaluation/engine.js +1 -1
  21. package/dist/evaluation/facets/catalog.d.ts +19 -0
  22. package/dist/evaluation/facets/catalog.js +1 -0
  23. package/dist/evaluation/guard-scan.d.ts +10 -0
  24. package/dist/evaluation/guard-scan.js +1 -0
  25. package/dist/evaluation/standards.d.ts +31 -0
  26. package/dist/evaluation/standards.js +1 -0
  27. package/dist/evaluation/standards.spec.d.ts +1 -0
  28. package/dist/evaluation/standards.spec.js +1 -0
  29. package/dist/evaluation/types.d.ts +9 -0
  30. package/dist/experience/realtime-feedback.js +1 -1
  31. package/dist/extensions/index.d.ts +1 -1
  32. package/dist/extensions/index.js +1 -1
  33. package/dist/extensions/industry-layers.d.ts +6 -5
  34. package/dist/extensions/industry-layers.js +1 -1
  35. package/dist/extensions/industry-pack.js +1 -1
  36. package/dist/graph/onchain/analyze.d.ts +13 -0
  37. package/dist/graph/onchain/analyze.js +1 -1
  38. package/dist/graph/onchain/analyze.spec.js +1 -1
  39. package/dist/graph/onchain/dataplane.d.ts +1 -1
  40. package/dist/graph/onchain/dataplane.js +1 -1
  41. package/dist/graph/onchain/edge-batch.spec.d.ts +1 -0
  42. package/dist/graph/onchain/edge-batch.spec.js +1 -0
  43. package/dist/graph/onchain/edge-schema.d.ts +10 -2
  44. package/dist/graph/onchain/edge-schema.js +1 -1
  45. package/dist/graph/onchain/entity-profile.spec.d.ts +1 -0
  46. package/dist/graph/onchain/entity-profile.spec.js +1 -0
  47. package/dist/graph/onchain/event-history.spec.d.ts +1 -0
  48. package/dist/graph/onchain/event-history.spec.js +1 -0
  49. package/dist/graph/onchain/expand.js +1 -1
  50. package/dist/graph/onchain/extract-deep.spec.d.ts +1 -0
  51. package/dist/graph/onchain/extract-deep.spec.js +1 -0
  52. package/dist/graph/onchain/extract.d.ts +11 -3
  53. package/dist/graph/onchain/extract.js +1 -1
  54. package/dist/graph/onchain/facet-projection.d.ts +99 -0
  55. package/dist/graph/onchain/facet-projection.js +1 -0
  56. package/dist/graph/onchain/facet-projection.spec.d.ts +1 -0
  57. package/dist/graph/onchain/facet-projection.spec.js +1 -0
  58. package/dist/graph/onchain/facts.d.ts +103 -0
  59. package/dist/graph/onchain/facts.js +1 -0
  60. package/dist/graph/onchain/facts.spec.d.ts +1 -0
  61. package/dist/graph/onchain/facts.spec.js +1 -0
  62. package/dist/graph/onchain/field-manifest.d.ts +29 -0
  63. package/dist/graph/onchain/field-manifest.js +1 -0
  64. package/dist/graph/onchain/field-manifest.spec.d.ts +1 -0
  65. package/dist/graph/onchain/field-manifest.spec.js +1 -0
  66. package/dist/graph/onchain/fixtures.d.ts +80 -0
  67. package/dist/graph/onchain/fixtures.js +1 -0
  68. package/dist/graph/onchain/fixtures.spec.d.ts +1 -0
  69. package/dist/graph/onchain/fixtures.spec.js +1 -0
  70. package/dist/graph/onchain/index.d.ts +8 -2
  71. package/dist/graph/onchain/index.js +1 -1
  72. package/dist/graph/onchain/interest.js +1 -1
  73. package/dist/graph/onchain/label-lint.spec.d.ts +1 -0
  74. package/dist/graph/onchain/label-lint.spec.js +1 -0
  75. package/dist/graph/onchain/names.d.ts +23 -0
  76. package/dist/graph/onchain/names.js +1 -0
  77. package/dist/graph/onchain/names.spec.d.ts +1 -0
  78. package/dist/graph/onchain/names.spec.js +1 -0
  79. package/dist/graph/onchain/onchain.spec.js +1 -1
  80. package/dist/graph/onchain/proposal-graph.d.ts +11 -0
  81. package/dist/graph/onchain/proposal-graph.js +1 -0
  82. package/dist/graph/onchain/proposal-graph.spec.d.ts +1 -0
  83. package/dist/graph/onchain/proposal-graph.spec.js +1 -0
  84. package/dist/graph/onchain/sdk-batch.d.ts +5 -1
  85. package/dist/graph/onchain/sdk-batch.js +1 -1
  86. package/dist/graph/onchain/strategy.d.ts +16 -0
  87. package/dist/graph/onchain/strategy.js +1 -1
  88. package/dist/graph/onchain/strategy.spec.js +1 -1
  89. package/dist/graph/onchain/table-ledger.spec.d.ts +1 -0
  90. package/dist/graph/onchain/table-ledger.spec.js +1 -0
  91. package/dist/graph/onchain/types.d.ts +46 -6
  92. package/dist/graph/onchain/viewport.d.ts +1 -0
  93. package/dist/graph/onchain/viewport.js +1 -1
  94. package/dist/harness/index.d.ts +1 -5
  95. package/dist/harness/index.js +1 -1
  96. package/dist/harness/verify.d.ts +6 -1
  97. package/dist/harness/verify.js +1 -1
  98. package/dist/index.js +1 -1
  99. package/dist/knowledge/allocation-ledger.js +1 -1
  100. package/dist/knowledge/allocation-risk.d.ts +0 -2
  101. package/dist/knowledge/allocation-risk.js +1 -1
  102. package/dist/knowledge/arb-risk.d.ts +0 -1
  103. package/dist/knowledge/arb-risk.js +1 -1
  104. package/dist/knowledge/arbitration-risk.d.ts +0 -2
  105. package/dist/knowledge/arbitration-risk.js +1 -1
  106. package/dist/knowledge/baselines/evaluation-baselines.json +79 -0
  107. package/dist/knowledge/baselines/guard-lint-baseline.spec.d.ts +1 -0
  108. package/dist/knowledge/baselines/guard-lint-baseline.spec.js +1 -0
  109. package/dist/knowledge/baselines/risk-baselines.spec.d.ts +1 -0
  110. package/dist/knowledge/baselines/risk-baselines.spec.js +1 -0
  111. package/dist/knowledge/baselines/risk-cases.d.ts +8 -0
  112. package/dist/knowledge/baselines/risk-cases.js +1 -0
  113. package/dist/knowledge/bridge-risk.d.ts +0 -1
  114. package/dist/knowledge/bridge-risk.js +1 -1
  115. package/dist/knowledge/contact-risk.d.ts +0 -1
  116. package/dist/knowledge/contact-risk.js +1 -1
  117. package/dist/knowledge/contract-invariants.d.ts +1 -0
  118. package/dist/knowledge/contract-invariants.js +1 -1
  119. package/dist/knowledge/demand-risk.d.ts +0 -1
  120. package/dist/knowledge/demand-risk.js +1 -1
  121. package/dist/knowledge/getting-started.js +1 -1
  122. package/dist/knowledge/guard-eval.d.ts +15 -0
  123. package/dist/knowledge/guard-eval.js +1 -0
  124. package/dist/knowledge/guard-eval.spec.d.ts +1 -0
  125. package/dist/knowledge/guard-eval.spec.js +1 -0
  126. package/dist/knowledge/guard-lint.d.ts +1 -1
  127. package/dist/knowledge/guard-lint.js +1 -1
  128. package/dist/knowledge/guard-risk.d.ts +4 -19
  129. package/dist/knowledge/guard-risk.js +1 -1
  130. package/dist/knowledge/index.d.ts +41 -43
  131. package/dist/knowledge/index.js +1 -1
  132. package/dist/knowledge/industry-registry.js +1 -1
  133. package/dist/knowledge/industry-rule-node.d.ts +7 -0
  134. package/dist/knowledge/industry-rule-node.js +1 -0
  135. package/dist/knowledge/jsonrpc-enum.js +1 -1
  136. package/dist/knowledge/machine-risk.d.ts +0 -6
  137. package/dist/knowledge/machine-risk.js +1 -1
  138. package/dist/knowledge/order-risk.d.ts +1 -9
  139. package/dist/knowledge/order-risk.js +1 -1
  140. package/dist/knowledge/payment-risk.d.ts +0 -1
  141. package/dist/knowledge/payment-risk.js +1 -1
  142. package/dist/knowledge/permission-risk.d.ts +0 -3
  143. package/dist/knowledge/permission-risk.js +1 -1
  144. package/dist/knowledge/personal-risk.d.ts +0 -1
  145. package/dist/knowledge/personal-risk.js +1 -1
  146. package/dist/knowledge/progress-risk.d.ts +0 -2
  147. package/dist/knowledge/progress-risk.js +1 -1
  148. package/dist/knowledge/proof-risk.d.ts +0 -1
  149. package/dist/knowledge/proof-risk.js +1 -1
  150. package/dist/knowledge/puzzle-projections.d.ts +11 -0
  151. package/dist/knowledge/puzzle-projections.js +1 -0
  152. package/dist/knowledge/registrar-risk.d.ts +0 -1
  153. package/dist/knowledge/registrar-risk.js +1 -1
  154. package/dist/knowledge/repository-risk.d.ts +0 -1
  155. package/dist/knowledge/repository-risk.js +1 -1
  156. package/dist/knowledge/resource-risk.d.ts +0 -1
  157. package/dist/knowledge/resource-risk.js +1 -1
  158. package/dist/knowledge/reward-risk.d.ts +1 -5
  159. package/dist/knowledge/reward-risk.js +1 -1
  160. package/dist/knowledge/rule-node-analyzers.d.ts +43 -0
  161. package/dist/knowledge/rule-node-analyzers.js +1 -0
  162. package/dist/knowledge/rule-node-analyzers.spec.d.ts +1 -0
  163. package/dist/knowledge/rule-node-analyzers.spec.js +1 -0
  164. package/dist/knowledge/rule-outcome.d.ts +5 -0
  165. package/dist/knowledge/rule-outcome.js +1 -0
  166. package/dist/knowledge/safety-rules.js +1 -1
  167. package/dist/knowledge/scenario-topology.js +1 -1
  168. package/dist/knowledge/service-risk-node.js +1 -1
  169. package/dist/knowledge/service-risk.d.ts +0 -3
  170. package/dist/knowledge/service-risk.js +1 -1
  171. package/dist/knowledge/template-registry.js +1 -1
  172. package/dist/knowledge/tools-reference.js +1 -1
  173. package/dist/knowledge/treasury-risk.d.ts +2 -3
  174. package/dist/knowledge/treasury-risk.js +1 -1
  175. package/dist/knowledge/util-risk.d.ts +0 -1
  176. package/dist/knowledge/util-risk.js +1 -1
  177. package/dist/monitor/MonitorLoop.js +1 -1
  178. package/dist/persona/bridge.js +1 -1
  179. package/dist/persona/facet-profile.d.ts +33 -0
  180. package/dist/persona/facet-profile.js +1 -0
  181. package/dist/persona/model.d.ts +2 -1
  182. package/dist/persona/model.js +1 -1
  183. package/dist/persona/topology-focus.d.ts +2 -2
  184. package/dist/persona/topology-focus.js +1 -1
  185. package/dist/persona/types.d.ts +12 -0
  186. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  187. package/dist/playbooks/service-build/facet-money.d.ts +22 -0
  188. package/dist/playbooks/service-build/facet-money.js +1 -0
  189. package/dist/playbooks/service-build/facet-money.spec.d.ts +1 -0
  190. package/dist/playbooks/service-build/facet-money.spec.js +1 -0
  191. package/dist/playbooks/service-build/machine-panorama.d.ts +3 -0
  192. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  193. package/dist/playbooks/service-build/object-panorama.d.ts +27 -27
  194. package/dist/playbooks/service-build/object-panorama.js +1 -1
  195. package/dist/playbooks/service-build/pipeline-actions.d.ts +2 -2
  196. package/dist/playbooks/service-build/pipeline-actions.js +1 -1
  197. package/dist/playbooks/service-build/risk-aggregator.d.ts +2 -1
  198. package/dist/playbooks/service-build/risk-aggregator.js +1 -1
  199. package/dist/playbooks/service-build/service-panorama.d.ts +4 -9
  200. package/dist/playbooks/service-build/service-panorama.js +1 -1
  201. package/dist/playbooks/service-build/topology-evaluation.spec.d.ts +1 -0
  202. package/dist/playbooks/service-build/topology-evaluation.spec.js +1 -0
  203. package/dist/playbooks/service-build/topology-query.d.ts +13 -2
  204. package/dist/playbooks/service-build/topology-query.js +1 -1
  205. package/dist/review/arb.d.ts +0 -2
  206. package/dist/review/arb.js +1 -1
  207. package/dist/review/order.d.ts +0 -1
  208. package/dist/review/order.js +1 -1
  209. package/dist/role/profiles.js +1 -1
  210. package/dist/rules.d.ts +1 -2
  211. package/dist/rules.js +1 -1
  212. package/dist/safety/confirm-gate.js +1 -1
  213. package/dist/schema/call/base.d.ts +3372 -668
  214. package/dist/schema/call/base.js +1 -1
  215. package/dist/schema/call/handler.js +1 -1
  216. package/dist/schema/call/receipt.d.ts +28 -0
  217. package/dist/schema/call/receipt.js +1 -0
  218. package/dist/schema/call/semantic-customer-advice.spec.d.ts +1 -0
  219. package/dist/schema/call/semantic-customer-advice.spec.js +1 -0
  220. package/dist/schema/call/semantic.d.ts +5 -2
  221. package/dist/schema/call/semantic.js +1 -1
  222. package/dist/schema/call/treasury.js +1 -1
  223. package/dist/schema/common/index.js +1 -1
  224. package/dist/schema/evaluation/index.d.ts +289 -211
  225. package/dist/schema/evaluation/index.js +1 -1
  226. package/dist/schema/goal/index.d.ts +1 -1
  227. package/dist/schema/goal/planning.d.ts +2 -2
  228. package/dist/schema/index.d.ts +0 -1
  229. package/dist/schema/index.js +1 -1
  230. package/dist/schema/industry-pack/index.d.ts +1 -1
  231. package/dist/schema/keeper/index.d.ts +1 -1
  232. package/dist/schema/local/index.js +1 -1
  233. package/dist/schema/operations.d.ts +26 -10
  234. package/dist/schema/operations.js +1 -1
  235. package/dist/schema/persona/index.d.ts +24 -24
  236. package/dist/schema/query/bi.d.ts +613 -0
  237. package/dist/schema/query/bi.js +1 -1
  238. package/dist/schema/query/index.d.ts +9 -9
  239. package/dist/schema/schema-version.js +1 -1
  240. package/dist/schema/workspace/index.d.ts +2 -2
  241. package/dist/schema-query-impl/index.js +1 -1
  242. package/dist/schemas/account_operation.output.json +1 -1
  243. package/dist/schemas/bridge_operation.output.json +1 -1
  244. package/dist/schemas/evaluation_operation.output.json +691 -163
  245. package/dist/schemas/evaluation_operation.schema.json +0 -429
  246. package/dist/schemas/index.json +1 -7
  247. package/dist/schemas/keeper_operation.output.json +1 -1
  248. package/dist/schemas/local_history_operation.output.json +1 -1
  249. package/dist/schemas/local_info_operation.output.json +1 -1
  250. package/dist/schemas/local_mark_operation.output.json +1 -1
  251. package/dist/schemas/messenger_operation.output.json +1 -1
  252. package/dist/schemas/monitor_events.output.json +1 -1
  253. package/dist/schemas/monitor_subscription.output.json +1 -1
  254. package/dist/schemas/onchain_events.output.json +1 -1
  255. package/dist/schemas/onchain_operations.output.json +6357 -3724
  256. package/dist/schemas/onchain_operations.schema.json +2 -2
  257. package/dist/schemas/onchain_operations_treasury.schema.json +2 -2
  258. package/dist/schemas/onchain_table_data.output.json +61 -71
  259. package/dist/schemas/query_toolkit.output.json +841 -8
  260. package/dist/schemas/query_toolkit.schema.json +59 -1
  261. package/dist/strategy/metrics.js +1 -1
  262. package/dist/tools/handlers/bridge.js +1 -1
  263. package/dist/tools/handlers/config.js +1 -1
  264. package/dist/tools/handlers/dispatch-expectations.d.ts +3 -0
  265. package/dist/tools/handlers/dispatch-expectations.js +1 -0
  266. package/dist/tools/handlers/evaluation.js +1 -1
  267. package/dist/tools/handlers/onchain.js +1 -1
  268. package/dist/tools/handlers/query.js +1 -1
  269. package/dist/tools/index.js +1 -1
  270. package/dist/tools/registry/evaluation.d.ts +2 -0
  271. package/dist/tools/registry/evaluation.js +1 -0
  272. package/dist/tools/registry/query.js +1 -1
  273. package/dist/tools/shared.d.ts +0 -1
  274. package/dist/tools/shared.js +1 -1
  275. package/dist/tools/wrap.js +1 -1
  276. package/package.json +4 -3
  277. package/dist/customer/customer-advice.d.ts +0 -32
  278. package/dist/customer/customer-advice.js +0 -1
  279. package/dist/customer/info-puzzle.d.ts +0 -146
  280. package/dist/customer/info-puzzle.js +0 -1
  281. package/dist/customer/order-strategy.d.ts +0 -17
  282. package/dist/customer/order-strategy.js +0 -1
  283. package/dist/customer/preorder-compare.d.ts +0 -24
  284. package/dist/customer/preorder-compare.js +0 -1
  285. package/dist/customer/reminder-system.d.ts +0 -42
  286. package/dist/customer/reminder-system.js +0 -1
  287. package/dist/customer/risk-assessment.d.ts +0 -13
  288. package/dist/customer/risk-assessment.js +0 -1
  289. package/dist/evaluation/builtins/service-risk.d.ts +0 -7
  290. package/dist/evaluation/builtins/service-risk.js +0 -1
  291. package/dist/knowledge/trust-metrics.d.ts +0 -66
  292. package/dist/knowledge/trust-metrics.js +0 -1
  293. package/dist/schema/trust/index.d.ts +0 -334
  294. package/dist/schema/trust/index.js +0 -1
  295. package/dist/schemas/trust_score.output.json +0 -847
  296. package/dist/schemas/trust_score.schema.json +0 -364
  297. package/dist/tools/handlers/trust.d.ts +0 -16
  298. package/dist/tools/handlers/trust.js +0 -1
  299. package/dist/tools/registry/trust.d.ts +0 -2
  300. package/dist/tools/registry/trust.js +0 -1
@@ -1 +1 @@
1
- import{assessServiceRisks,assessMachineRisks,assessAllocationRisks,assessTreasuryRisks,assessArbitrationRisks,assessRewardRisks,assessProgressRisks,assessOrderRisks,assessGuardRisks,checkContactRisks,checkResourceRisks,checkPaymentRisks,checkArbRisks,checkPersonalRisks,checkUtilRisks,checkRegistrarRisks,checkBridgeRisks,checkProofRisks,checkRepositoryRisks,checkDemandRisks}from'../../knowledge/index.js';import{assessPermissionRisks}from'../../knowledge/permission-risk.js';import{analyzeRecipientConstraints}from'../../knowledge/recipient-constraint.js';const SEVERITY_ORDER={'CRITICAL':0x0,'HIGH':0x1,'MEDIUM':0x2,'LOW':0x3,'INFO':0x4},ALL_SEVERITIES=['CRITICAL','HIGH','MEDIUM','LOW','INFO'];function normalizeSeverity(a){if(typeof a!=='string')return'INFO';const b=a['toUpperCase']();return ALL_SEVERITIES['includes'](b)?b:'INFO';}function extractRiskId(a,b){if(!a||typeof a!=='object')return b;return String(a['id']??a['risk_rule_id']??a['rule_id']??b);}function extractRiskMessage(a){if(!a||typeof a!=='object')return'(no\x20message)';return String(a['title']??a['message']??a['description']??a['trigger']??'(no\x20message)');}function extractFixSuggestion(a){if(!a||typeof a!=='object')return'';return String(a['mitigation']??a['fix_suggestion']??a['suggestion']??'');}function toAggregatedRisk(a,b,c){return{'risk_rule_id':extractRiskId(a,'R-'+b['toUpperCase']()+'-?'),'object_type':b,'entry_id':c,'severity':normalizeSeverity(a?.['level']??a?.['severity']),'message':extractRiskMessage(a),'fix_suggestion':extractFixSuggestion(a),'details':a?.['evidence']?{'field_path':String(a['evidence'])}:undefined};}function safeRecipientAudit(a){try{const b=a??{},c=b['allocators_config'],d=c?.['allocators'];if(!Array['isArray'](d)||d['length']===0x0)return[];const e=analyzeRecipientConstraints({'trigger_source':b['trigger_source']??'service_order_allocators',...typeof b['host_service']==='string'?{'host_service':b['host_service']}:{},...typeof b['allocation']==='string'?{'allocation':b['allocation']}:{},'allocators':d['map'](f=>({'guard':f['guard'],'sharing':f['sharing']??[]})),'guards':b['guards']??{}});return e['findings']['map'](g=>({'id':g['code'],'level':g['resolution_required']&&g['severity']==='MEDIUM'?'HIGH':g['severity'],'title':g['title'],'description':g['explanation'],'mitigation':g['mitigation'],'evidence':g['evidence_paths']['join'](',')}));}catch{return[];}}function isL1L2Object(a){return['service','machine','allocation','treasury','arb','reward','progress','order','permission','guard']['includes'](a);}function buildL1L2Dispatch(){const a=(b,c)=>{try{const d=b??{},e=c(d);if(Array['isArray'](e))return e;if(e&&typeof e==='object'){const f=e['risks'];if(Array['isArray'](f))return f;}return[];}catch{return[];}};return{'service':{'assess':b=>a(b,assessServiceRisks)},'machine':{'assess':b=>a(b,c=>assessMachineRisks(c,{}))},'allocation':{'assess':b=>[...a(b,assessAllocationRisks),safeRecipientAudit(b)]['flat']()},'treasury':{'assess':b=>a(b,assessTreasuryRisks)},'arb':{'assess':b=>a(b,assessArbitrationRisks)},'reward':{'assess':b=>a(b,c=>assessRewardRisks(c))},'progress':{'assess':b=>a(b,c=>assessProgressRisks(c))},'order':{'assess':b=>a(b,assessOrderRisks)},'permission':{'assess':b=>a(b,assessPermissionRisks)},'guard':{'assess':b=>{try{const c=assessGuardRisks({'table':[],'root':undefined});if(Array['isArray'](c))return c;if(c&&typeof c==='object'){const d=c['risks'];if(Array['isArray'](d))return d;}return[];}catch{return[];}}}};}function buildL3Dispatch(){const a=(b,c)=>{try{const d=b??{},e=c(d);if(Array['isArray'](e))return e;return[];}catch{return[];}};return{'contact':{'check':b=>a(b,checkContactRisks)},'resource':{'check':b=>a(b,checkResourceRisks)},'payment':{'check':b=>a(b,checkPaymentRisks)},'arb':{'check':b=>a(b,checkArbRisks)},'personal':{'check':b=>a(b,checkPersonalRisks)},'util':{'check':b=>a(b,checkUtilRisks)},'registrar':{'check':b=>a(b,checkRegistrarRisks)},'bridge':{'check':b=>a(b,checkBridgeRisks)},'proof':{'check':b=>a(b,checkProofRisks)},'repository':{'check':b=>a(b,checkRepositoryRisks)},'demand':{'check':b=>a(b,checkDemandRisks)}};}export function aggregateProjectRisks(a){const b=[];(!a||!a['project_prefix'])&&b['push']('input.project_prefix\x20is\x20empty');const c=a?.['puzzles']??{},e=[],f=buildL1L2Dispatch(),g=buildL3Dispatch();for(const [m,n]of Object['entries'](c)){const o=m,p=(a['project_prefix']??'project')+'_'+o,q=n?.['puzzle'];if(isL1L2Object(o)){const s=f[o];if(!s){b['push']('No\x20L1/L2\x20risk\x20dispatcher\x20for\x20\x27'+o+'\x27');continue;}const t=s['assess'](q);for(const u of t){e['push'](toAggregatedRisk(u,o,p));}}else{const v=g[o];if(!v){b['push']('No\x20L3\x20risk\x20dispatcher\x20for\x20\x27'+o+'\x27');continue;}const w=v['check'](q);for(const x of w){e['push'](toAggregatedRisk(x,o,p));}}}sortFindings(e);const h=countBySeverity(e),i=a['severity_threshold']??'HIGH',j=determineStatus(h,i,a['user_confirmed_high_risks']??[],e);let k;j==='RISK_PENDING_CONFIRM'&&(k=e['filter'](y=>y['severity']==='HIGH')['filter'](y=>!(a['user_confirmed_high_risks']??[])['includes'](y['risk_rule_id']))['map'](y=>({'risk_rule_id':y['risk_rule_id'],'description':y['message'],'fix_suggestion':y['fix_suggestion'],'object_type':y['object_type'],'entry_id':y['entry_id']})));const l={};for(const y of e){const z=y['object_type'];!l[z]&&(l[z]=[]),l[z]['push']({'risk_rule_id':y['risk_rule_id'],'severity':y['severity'],'message':y['message'],'fix_suggestion':y['fix_suggestion'],'entry_id':y['entry_id']});}return{'namespace':{'prefix':a['project_prefix']??'','version':a['version']??'','industry':a['industry']??'general'},'findings':e,'severity_summary':h,'status':j,'pending_confirmations':k,'calibrated_at':Date['now'](),'fix_suggestions_grouped':l,'warnings':b};}export function sortFindings(a){return a['sort']((c,d)=>{const e=SEVERITY_ORDER[c['severity']]-SEVERITY_ORDER[d['severity']];if(e!==0x0)return e;if(c['object_type']!==d['object_type'])return c['object_type']['localeCompare'](d['object_type']);return c['risk_rule_id']['localeCompare'](d['risk_rule_id']);});}export function countBySeverity(a){const b={'CRITICAL':0x0,'HIGH':0x0,'MEDIUM':0x0,'LOW':0x0,'INFO':0x0};for(const c of a){b[c['severity']]++;}return b;}export function determineStatus(a,b,c,d){if(a['CRITICAL']>0x0)return'RISK_BLOCKED';const e=SEVERITY_ORDER[b];if(a['HIGH']>0x0&&e<=SEVERITY_ORDER['HIGH']){const f=d['filter'](g=>g['severity']==='HIGH'&&!c['includes'](g['risk_rule_id']));if(f['length']>0x0)return'RISK_PENDING_CONFIRM';}if(a['MEDIUM']>0x0&&e<=SEVERITY_ORDER['MEDIUM'])return'RISK_BLOCKED';if(a['LOW']>0x0&&e<=SEVERITY_ORDER['LOW'])return'RISK_BLOCKED';return'RISK_PASSED';}export function getCriticalRisks(a){if(!a?.['findings'])return[];return a['findings']['filter'](b=>b['severity']==='CRITICAL');}export function summarizeRiskReport(a){if(!a)return'(no\x20result)';const b=[];b['push']('#\x20Risk\x20Aggregation\x20Report'),b['push'](''),b['push']('-\x20Project:\x20'+a['namespace']['prefix']+'_'+a['namespace']['version']),b['push']('-\x20Status:\x20'+a['status']),b['push']('-\x20Calibrated\x20at:\x20'+new Date(a['calibrated_at'])['toISOString']()),b['push'](''),b['push']('##\x20Severity\x20Summary'),b['push'](''),b['push']('|\x20Severity\x20|\x20Count\x20|'),b['push']('|----------|-------|');for(const c of ALL_SEVERITIES){b['push']('|\x20'+c+'\x20|\x20'+(a['severity_summary'][c]??0x0)+'\x20|');}b['push']('');if(a['findings']['length']===0x0)return b['push']('No\x20risks\x20found.'),b['join']('\x0a');b['push']('##\x20Findings\x20(sorted\x20by\x20severity)'),b['push']('');for(const d of a['findings']){b['push']('-\x20**['+d['severity']+']\x20'+d['risk_rule_id']+'**\x20('+d['object_type']+'\x20/\x20'+d['entry_id']+')'),b['push']('\x20\x20-\x20'+d['message']),d['fix_suggestion']&&b['push']('\x20\x20-\x20Fix:\x20'+d['fix_suggestion']);}if(a['warnings']['length']>0x0){b['push'](''),b['push']('##\x20Warnings');for(const e of a['warnings'])b['push']('-\x20'+e);}return b['join']('\x0a');}
1
+ import{ENTRYPOINT}from'@wowok/wowok';import{buildProposalGraph,buildViewport,runNodeAnalyzers}from'../../graph/onchain/index.js';import{RULE_NODE_ANALYZERS}from'../../knowledge/rule-node-analyzers.js';const SEVERITY_ORDER={'CRITICAL':0x0,'HIGH':0x1,'MEDIUM':0x2,'LOW':0x3,'INFO':0x4},ALL_SEVERITIES=['CRITICAL','HIGH','MEDIUM','LOW','INFO'],SEVERITY_OF_FINDING={'critical':'CRITICAL','high':'HIGH','medium':'MEDIUM','low':'LOW','info':'INFO'};function findingToAggregatedRisk(a,b,c){const d=a['ruleId']??'?',e='\x20('+d+')',g=a['title']['endsWith'](e)?a['title']['slice'](0x0,a['title']['length']-e['length']):a['title'];return{'risk_rule_id':d,'object_type':b,'entry_id':c,'severity':SEVERITY_OF_FINDING[a['severity']]??'INFO','message':g,'fix_suggestion':a['suggestion']??'','details':{...a['evidence']?{'field_path':a['evidence']}:{},'rule_source':a['id']['slice'](0x0,a['id']['indexOf'](':')),'proposal_node':a['path'][0x0]}};}export async function aggregateProjectRisks(a){const b=[];(!a||!a['project_prefix'])&&b['push']('input.project_prefix\x20is\x20empty');const c=a?.['puzzles']??{},d=await buildProposalGraph(c,{'network':ENTRYPOINT['Testnet']});for(const o of d['nodes']['values']()){o['proposal']&&!o['objectType']&&b['push']('No\x20analyzer\x20vocabulary\x20for\x20puzzle\x20key\x20\x27'+o['proposal']['sourceKey']+'\x27\x20—\x20key\x20skipped');}const e=buildViewport(d,d['seed'],'neutral'),g=runNodeAnalyzers(e,RULE_NODE_ANALYZERS),h=[];for(const p of g){if(p['ruleId']==null)continue;const q=p['path'][0x0]??'',r=d['nodes']['get'](q),s=r?.['proposal']?.['sourceKey']??q['replace'](/^proposal::/,'');h['push'](findingToAggregatedRisk(p,s,(a['project_prefix']??'project')+'_'+s));}sortFindings(h);const i=countBySeverity(h),j=a['severity_threshold']??'HIGH',k=determineStatus(i,j,a['user_confirmed_high_risks']??[],h);let l;k==='RISK_PENDING_CONFIRM'&&(l=h['filter'](t=>t['severity']==='HIGH')['filter'](t=>!(a['user_confirmed_high_risks']??[])['includes'](t['risk_rule_id']))['map'](t=>({'risk_rule_id':t['risk_rule_id'],'description':t['message'],'fix_suggestion':t['fix_suggestion'],'object_type':t['object_type'],'entry_id':t['entry_id']})));const m={};for(const t of h){const u=t['object_type'];!m[u]&&(m[u]=[]),m[u]['push']({'risk_rule_id':t['risk_rule_id'],'severity':t['severity'],'message':t['message'],'fix_suggestion':t['fix_suggestion'],'entry_id':t['entry_id']});}return{'namespace':{'prefix':a['project_prefix']??'','version':a['version']??'','industry':a['industry']??'general'},'findings':h,'severity_summary':i,'status':k,'pending_confirmations':l,'calibrated_at':Date['now'](),'fix_suggestions_grouped':m,'warnings':b};}export function sortFindings(a){return a['sort']((c,d)=>{const e=SEVERITY_ORDER[c['severity']]-SEVERITY_ORDER[d['severity']];if(e!==0x0)return e;if(c['object_type']!==d['object_type'])return c['object_type']['localeCompare'](d['object_type']);return c['risk_rule_id']['localeCompare'](d['risk_rule_id']);});}export function countBySeverity(a){const b={'CRITICAL':0x0,'HIGH':0x0,'MEDIUM':0x0,'LOW':0x0,'INFO':0x0};for(const c of a){b[c['severity']]++;}return b;}export function determineStatus(a,b,c,d){if(a['CRITICAL']>0x0)return'RISK_BLOCKED';const e=SEVERITY_ORDER[b];if(a['HIGH']>0x0&&e<=SEVERITY_ORDER['HIGH']){const f=d['filter'](g=>g['severity']==='HIGH'&&!c['includes'](g['risk_rule_id']));if(f['length']>0x0)return'RISK_PENDING_CONFIRM';}if(a['MEDIUM']>0x0&&e<=SEVERITY_ORDER['MEDIUM'])return'RISK_BLOCKED';if(a['LOW']>0x0&&e<=SEVERITY_ORDER['LOW'])return'RISK_BLOCKED';return'RISK_PASSED';}export function getCriticalRisks(a){if(!a?.['findings'])return[];return a['findings']['filter'](b=>b['severity']==='CRITICAL');}export function summarizeRiskReport(a){if(!a)return'(no\x20result)';const b=[];b['push']('#\x20Risk\x20Aggregation\x20Report'),b['push'](''),b['push']('-\x20Project:\x20'+a['namespace']['prefix']+'_'+a['namespace']['version']),b['push']('-\x20Status:\x20'+a['status']),b['push']('-\x20Calibrated\x20at:\x20'+new Date(a['calibrated_at'])['toISOString']()),b['push'](''),b['push']('##\x20Severity\x20Summary'),b['push'](''),b['push']('|\x20Severity\x20|\x20Count\x20|'),b['push']('|----------|-------|');for(const c of ALL_SEVERITIES){b['push']('|\x20'+c+'\x20|\x20'+(a['severity_summary'][c]??0x0)+'\x20|');}b['push']('');if(a['findings']['length']===0x0)return b['push']('No\x20risks\x20found.'),b['join']('\x0a');b['push']('##\x20Findings\x20(sorted\x20by\x20severity)'),b['push']('');for(const d of a['findings']){b['push']('-\x20**['+d['severity']+']\x20'+d['risk_rule_id']+'**\x20('+d['object_type']+'\x20/\x20'+d['entry_id']+')'),b['push']('\x20\x20-\x20'+d['message']),d['fix_suggestion']&&b['push']('\x20\x20-\x20Fix:\x20'+d['fix_suggestion']),d['details']?.['proposal_node']&&b['push']('\x20\x20-\x20Evaluated\x20on\x20'+d['details']['proposal_node']+'\x20via\x20'+(d['details']['rule_source']??'unknown\x20analyzer'));}if(a['warnings']['length']>0x0){b['push'](''),b['push']('##\x20Warnings');for(const e of a['warnings'])b['push']('-\x20'+e);}return b['join']('\x0a');}
@@ -65,16 +65,10 @@ export interface PanoramaPermissionSummary {
65
65
  tags: string[];
66
66
  updated_timestamp_ms: string | null;
67
67
  }
68
- export interface PanoramaTrust {
69
- trust_score: number;
70
- trust_level: string;
71
- trust_summary: string;
72
- risk_score: number | null;
73
- risk_level: string | null;
74
- completeness: number | null;
75
- }
76
68
  export interface PanoramaRecentOrders {
77
69
  count: number;
70
+ window_saturated: boolean;
71
+ preview_truncated: boolean;
78
72
  items: {
79
73
  order: string;
80
74
  time: number;
@@ -113,6 +107,8 @@ export interface ServicePanoramaResult {
113
107
  setting_lock_duration: string | null;
114
108
  customer_required: string[];
115
109
  compensation_fund: string | null;
110
+ compensation_fund_display: string;
111
+ compensation_fund_tip: string;
116
112
  sales: PanoramaSale[];
117
113
  machine: string | null;
118
114
  buy_guard: string | null;
@@ -159,7 +155,6 @@ export interface ServicePanoramaResult {
159
155
  }[];
160
156
  };
161
157
  supply_chain: SupplyChainGraph | null;
162
- trust: PanoramaTrust | null;
163
158
  business_report: BusinessReport | null;
164
159
  recent_orders: PanoramaRecentOrders | null;
165
160
  data_gaps: string[];
@@ -1 +1 @@
1
- import{Config,LocalMark,query_serviceContext,query_object_last_updated,query_affiliations,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{generateBusinessReport}from'./reverse-mapping.js';import{resolveSupplyChainGraph}from'../../knowledge/supply-chain.js';import{batchQueryObjectsByIds,fetchServiceOrders}from'../../graph/onchain/sdk-batch.js';import{formatChainValue}from'../../knowledge/fund-layer.js';import{buildMachineGraph}from'./machine-nodes.js';import{computeServiceTrustSummary}from'../../tools/handlers/trust.js';function balanceStr(a){if(a===null||a===undefined)return null;if(typeof a==='bigint')return a['toString']();return String(a);}function ownerAddr(a){if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];}return null;}function requireField(a,b){if(a===undefined||a===null)throw new Error('\x27'+b+'\x27\x20is\x20required\x20for\x20this\x20action');return a;}function summarizeGuard(a){if(!a)return null;const b=a,c=Array['isArray'](b['table'])?b['table']:[],d=c['filter'](e=>e?.['b_submission']===!![])['length'];return{'address':b['object']??'','description':b['description']??null,'rep':typeof b['rep']==='boolean'?b['rep']:null,'table_entry_count':c['length'],'submission_slot_count':d,'relies':Array['isArray'](b['relies'])?b['relies']['filter'](e=>typeof e==='string'):[],'relies_logic_and':typeof b['relies_logic_and']==='boolean'?b['relies_logic_and']:null};}function summarizePermission(a,b){if(!a)return null;const c=a,d=Array['isArray'](c['admin'])?c['admin']:[],e=d[0x0],f=typeof e==='string'?e:typeof e?.['account']==='string'?e['account']:c['builder']??null;return{'address':c['object']??'','description':c['description']??null,'builder':c['builder']??null,'owner':f,'owner_name':b?.['name']??null,'admin_count':d['length'],'entity_count':typeof c['entity_count']==='number'?c['entity_count']:null,'perm_remark':Array['isArray'](c['perm_remark'])?c['perm_remark']['map'](g=>({'index':String(g?.['index']??''),'remark':typeof g?.['remark']==='string'?g['remark']:''})):[],'um':c['um']??null,'tags':b?.['tags']??[],'updated_timestamp_ms':b?.['updated_at_ms']!=null?String(b['updated_at_ms']):null};}async function markOf(a){if(!a)return{'name':null,'tags':[],'updated_at_ms':null};try{const b=await LocalMark['Instance']()['get'](a);if(b)return{'name':b['name']??null,'tags':Array['isArray'](b['tags'])?b['tags']:[],'updated_at_ms':typeof b['updatedAt']==='number'?b['updatedAt']:null};}catch{}try{const c=await LocalMark['Instance']()['list']({'address':a}),d=c?.[0x0];if(d)return{'name':d['name']??null,'tags':Array['isArray'](d['tags'])?d['tags']:[],'updated_at_ms':typeof d['updatedAt']==='number'?d['updatedAt']:null};}catch{}return{'name':null,'tags':[],'updated_at_ms':null};}async function markOfMany(a){const b=[...new Set(a['filter'](e=>!!e))],c=await Promise['all'](b['map'](e=>markOf(e))),d=new Map();for(let e=0x0;e<b['length'];e++)d['set'](b[e],c[e]);return d;}export async function handleServicePanorama(b){const c=requireField(b['service_address'],'service_address'),d=b['context_network']??undefined;let f=d??await Config['Instance']()['network_get']();const h=[];let j=c;if(!/^0x[0-9a-fA-F]{32,64}$/['test'](c)){const S=await LocalMark['Instance']()['get_address'](c);if(!S)throw new Error('Cannot\x20resolve\x20service\x20\x27'+c+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.\x20'+'Pass\x20the\x200x\x20Service\x20object\x20address\x20directly\x20or\x20register\x20the\x20name\x20via\x20local_mark_operation.');j=S;}let k=await query_serviceContext({'service':j,'include_machine_nodes':!![],'network':f});if(!k?.['service']&&d){const T=await Config['Instance']()['network_get']();T&&T!==f&&(f=T,k=await query_serviceContext({'service':j,'include_machine_nodes':!![],'network':f}));}const l=k['service'];j=l['object']??j;const m=new Set(),n=U=>{if(U)m['add'](U);};n(j),n(l['machine']),n(l['permission']),n(l['um']);for(const U of l['arbitrations']??[])n(U);for(const V of l['rewards']??[])n(V);for(const W of l['repositories']??[])n(W);const p=k['permission'];if(p){const X=Array['isArray'](p['admin'])?p['admin']:[];X[0x0]&&n(typeof X[0x0]==='string'?X[0x0]:X[0x0]?.['account']);if(p['builder'])n(p['builder']);}const q=await markOfMany([...m]),u=q['get'](j)??{'name':null,'tags':[],'updated_at_ms':null},w=u['name'],x=Y=>Y?q['get'](Y)??{'name':null,'tags':[],'updated_at_ms':null}:{'name':null,'tags':[],'updated_at_ms':null};let y=null;const z=k['machine'],A=k['machine_nodes']??[];if(z||A['length']>0x0){const {nodes:Y,edges:Z}=buildMachineGraph(A);y={'address':z?.['object']??l['machine']??'','name':x(z?.['object']??l['machine'])['name'],'description':z?.['description']??null,'published':typeof z?.['bPublished']==='boolean'?z['bPublished']:null,'paused':typeof z?.['bPaused']==='boolean'?z['bPaused']:null,'node_count':typeof z?.['node_count']==='number'?z['node_count']:null,'consensus_repositories':Array['isArray'](z?.['consensus_repositories'])?z['consensus_repositories']:[],'nodes':Y,'edges':Z};}let B=null;try{const a0=await query_object_last_updated({'object':j,'network':f});a0?.['timestamp_ms']&&(B={'timestamp_ms':a0['timestamp_ms'],'digest':a0['digest']??null,'sender':a0['sender']??null});}catch{h['push']('onchain_last_updated:\x20query\x20failed\x20(non-blocking)');}let C=null;try{C=await computeServiceTrustSummary({'service':j,'depth':'evaluate','network':f});}catch{h['push']('trust:\x20evaluation\x20failed\x20(non-blocking)');}let D=null;try{D=await resolveSupplyChainGraph(j,f);}catch{h['push']('supply_chain:\x20resolution\x20failed\x20(non-blocking)');}let E=null;try{const a1=[l];for(const a2 of Object['values'](k['referenced']??{})){if(a2&&a2['object']!==j)a1['push'](a2);}E=generateBusinessReport({'objects':a1,'machine_nodes':A['map'](a3=>({'name':a3['name']}))});}catch{h['push']('business_report:\x20generation\x20failed\x20(non-blocking)');}const F=l?.['type_raw']??l?.['type']??'',G=F['match'](/<(.+)>$/),H=G?G[0x1]:null,I=(a3,a4)=>{const a5=[];return a3?a5['push']('Pricing\x20&\x20settlement\x20coin:\x20'+a3+'\x20—\x20the\x20Service\x27s\x20generic\x20T,\x20FIXED\x20at\x20creation\x20(immutable).\x20Sales\x20prices\x20and\x20order\x20amounts\x20are\x20denominated\x20in\x20this\x20exact\x20token;\x20buyers\x20must\x20hold\x20it\x20to\x20order.'):a5['push']('Pricing\x20&\x20settlement\x20coin:\x20unavailable\x20from\x20the\x20Service\x20type\x20(no\x20generic\x20found)\x20—\x20treat\x20amounts\x20as\x20raw\x20smallest\x20units.'),a5['push']('To\x20price\x20in\x20a\x20different\x20token,\x20publish\x20a\x20NEW\x20Service\x20with\x20type_parameter\x20set\x20to\x20that\x20token\x27s\x20full\x20type\x20—\x20this\x20one\x20keeps\x20settling\x20in\x20its\x20coin.'),/testnet/i['test'](a4)?a5['push']('Testnet\x20has\x20ONLY\x20WOW\x20(no\x20stablecoins\x20are\x20bridged)\x20—\x20testnet\x20services\x20stay\x20WOW-denominated;\x20multi-token\x20pricing\x20is\x20a\x20mainnet\x20capability.'):a5['push']('Mainnet\x20accepts\x20bridged\x20tokens\x20(USDT\x20/\x20USDC\x20/\x20ETH\x20/\x20WBTC\x20/\x20WOW):\x20buyers\x20bridge\x20them\x20from\x20Ethereum\x20via\x20the\x20cross-chain\x20bridge.\x20Query\x20wowok_buildin_info\x20info=\x27mainnet\x20bridge\x20tokens\x27\x20for\x20each\x20token\x27s\x20exact\x20type\x20tag\x20(wowTypeTag)\x20to\x20use\x20in\x20type_parameter\x20when\x20publishing.'),a5['join']('\x20');},J=async a3=>{if(a3===null||a3===undefined||a3==='')return{'display':'','tip':''};if(!H)return{'display':a3,'tip':''};try{const a4=await formatChainValue(a3,H,f);if(a4['precision_known'])return{'display':a4['symbol']?a4['display']+'\x20'+a4['symbol']:a4['display'],'tip':a4['text']};return{'display':a3,'tip':''};}catch{return{'display':a3,'tip':''};}};let K=null;try{const a3=await fetchServiceOrders(j,f,!![]),a4=Array['isArray'](a3?.['items'])?a3['items']:[],a5=a4['map'](ac=>typeof ac?.['who']==='string'?ac['who']:'')['filter'](ac=>ac!==''),a6=new Map();try{if(a5['length']>0x0){const ac=await batchQueryObjectsByIds(a5,f,!![]);for(const ad of ac){ad&&ad['type']===ObjectType['Order']&&a6['set'](ad['object'],ad);}}}catch{h['push']('recent_orders:\x20order\x20details\x20unavailable\x20(non-blocking)');}const a7=new Map(),a8=new Map(),a9=new Map();try{const ae=new Set();for(const af of a6['values']()){if(af?.['progress'])ae['add'](af['progress']);if(af?.['allocation'])ae['add'](af['allocation']);}if(ae['size']>0x0){const ag=await batchQueryObjectsByIds(Array['from'](ae),f,!![]);for(const ah of ag){if(!ah?.['object'])continue;if(ah['type']===ObjectType['Progress']){const ai=ah?.['current'];a7['set'](ah['object'],typeof ai==='string'&&ai!==''?ai:null),a8['set'](ah['object'],Number(ah?.['current_time'])||null);}else{if(ah['type']===ObjectType['Allocation']){const aj=Number(ah?.['balance']??0x0);a9['set'](ah['object'],Number['isFinite'](aj)&&aj===0x0?'allocated':'pending');}}}}}catch{h['push']('recent_orders:\x20progress/allocation\x20details\x20unavailable\x20(non-blocking)');}const aa=new Map();try{const ak=Array['from'](new Set(a4['map'](am=>typeof am?.['who']==='string'?am['who']:'')['filter'](Boolean))),al=await Promise['allSettled'](ak['map'](am=>query_object_last_updated({'object':am,'network':f})));for(let am=0x0;am<ak['length'];am++){const an=al[am];aa['set'](ak[am],an['status']==='fulfilled'&&an['value']?.['timestamp_ms']?Number(an['value']['timestamp_ms'])||null:null);}}catch{h['push']('recent_orders:\x20order\x20updated\x20times\x20unavailable\x20(non-blocking)');}const ab=await Promise['all'](a4['map'](async ao=>{const ap=typeof ao?.['who']==='string'?ao['who']:'',aq=a6['get'](ap),ar=aq?.['amount']!==null&&aq?.['amount']!==undefined?String(aq['amount']):'',as=await J(ar);return{'order':ap,'time':typeof ao?.['time']==='number'?ao['time']:0x0,'updated_ms':aa['get'](ap)??null,'amount':ar,'amount_display':as['display'],'amount_tip':as['tip'],'progress':aq?.['progress']??null,'allocation':aq?.['allocation']??null,'disputes':Array['isArray'](aq?.['dispute'])?aq['dispute']:[],'agent':Array['isArray'](aq?.['agent'])?aq['agent']:[],'owner':ownerAddr(aq?.['builder']??aq?.['owner']),'claimed_by':aq?.['claimed_by']??null,'required_info':aq?.['required_info']??null,'progress_next':aq?.['progress']?a7['get'](aq['progress'])??null:null,'progress_since':aq?.['progress']?a8['get'](aq['progress'])??null:null,'allocation_state':aq?.['allocation']?a9['get'](aq['allocation'])??'pending':'none','bought':await Promise['all']((Array['isArray'](aq?.['items'])?aq['items']:[])['map'](async at=>({'name':String(at?.['name']??''),'price_display':(await J(at?.['price']!==null&&at?.['price']!==undefined?String(at['price']):'0'))['display'],'quantity':String(at?.['quantity']??'0'),'wip_hash':String(at?.['wip_hash']??'')})))};}));K={'count':a4['length'],'items':ab['filter'](ao=>ao['order']!=='')['slice'](-0x14)['reverse']()};}catch{h['push']('recent_orders:\x20reverse-index\x20query\x20failed\x20(non-blocking)');}const L=[];try{const ao=await query_affiliations({'address':j,'no_cache':!![],'network':f}),ap=new Set(),aq=new Map();for(const as of ao?.['entries']??[]){const at=typeof as?.['who']==='string'?as['who']:'';if(!at||ap['has'](at))continue;ap['add'](at);const au=objectTypeFromAddress(at);if(!au)continue;if(au===ObjectType['Order'])continue;const av=String(au);let aw=aq['get'](av);!aw&&(aw=[],aq['set'](av,aw)),aw['push']({'address':at,'type_label':av,'name':x(at)['name'],'time':typeof as?.['time']==='number'?as['time']:null});}const ar=['Progress','Allocation','Payment','Guard'];for(const ax of ar){const ay=aq['get'](ax);ay&&ay['length']>0x0&&(L['push']({'type_label':ax,'items':ay}),aq['delete'](ax));}for(const [az,aA]of aq){if(aA['length']>0x0)L['push']({'type_label':az,'items':aA});}}catch{h['push']('related:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}const M=[];for(const aB of k['allocator_guards']??[]){const aC=summarizeGuard(aB);if(aC)M['push'](aC);}const N=[];for(const aD of Array['isArray'](l['sales'])?l['sales']:[]){const aE=balanceStr(aD?.['price']),aF=await J(aE);N['push']({'name':typeof aD?.['name']==='string'?aD['name']:'','price':aE,'price_display':aF['display'],'price_tip':aF['tip'],'stock':balanceStr(aD?.['stock']),'suspension':aD?.['suspension']===!![],'wip':typeof aD?.['wip']==='string'?aD['wip']:'','wip_hash':typeof aD?.['wip_hash']==='string'?aD['wip_hash']:''});}const O=l['order_allocators']?{'description':l['order_allocators']['description']??'','threshold':balanceStr(l['order_allocators']['threshold']),'allocators':(l['order_allocators']['allocators']??[])['map'](aG=>({'guard':aG['guard'],'sharing_count':Array['isArray'](aG['sharing'])?aG['sharing']['length']:0x0,'max':balanceStr(aG['max']??null)}))}:null,P=summarizePermission(k['permission'],x(l['permission'])),Q=P?.['owner']??B?.['sender']??null,R=Q?await markOf(Q):null;return{'action':'service_panorama','network':f,'service':{'address':j,'name':w,'description':l['description']??'','location':l['location']??'','published':l['bPublished']===!![],'paused':l['bPaused']===!![],'paused_time':typeof l['paused_time']==='number'?l['paused_time']:null,'setting_lock_duration':balanceStr(l['setting_lock_duration']),'customer_required':Array['isArray'](l['customer_required'])?l['customer_required']:[],'compensation_fund':balanceStr(l['compensation_fund']),'sales':N,'machine':l['machine']??null,'buy_guard':l['buy_guard']??null,'permission':l['permission']??'','um':l['um']??null,'arbitrations':Array['isArray'](l['arbitrations'])?l['arbitrations']:[],'rewards':Array['isArray'](l['rewards'])?l['rewards']:[],'repositories':Array['isArray'](l['repositories'])?l['repositories']:[],'order_allocators':O,'payment_token':{'coin_type':H,'guidance':I(H,f)},'onchain_last_updated':B,'tags':u['tags']??[],'owner':Q,'owner_name':R?.['name']??null},'machine_graph':y,'buy_guard':summarizeGuard(k['buy_guard']),'permission':P,'allocator_guards':M,'related':{'groups':L},'supply_chain':D,'trust':C,'business_report':E,'recent_orders':K,'data_gaps':h};}
1
+ import{Config,LocalMark,query_serviceContext,query_object_last_updated,query_affiliations,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{generateBusinessReport}from'./reverse-mapping.js';import{resolveSupplyChainGraph}from'../../knowledge/supply-chain.js';import{batchQueryObjectsByIds,fetchServiceOrders,ringWindowSaturated}from'../../graph/onchain/sdk-batch.js';import{buildMachineGraph}from'./machine-nodes.js';import{formatMoneyAnnotation}from'./facet-money.js';function balanceStr(a){if(a===null||a===undefined)return null;if(typeof a==='bigint')return a['toString']();return String(a);}function ownerAddr(a){if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];}return null;}function requireField(a,b){if(a===undefined||a===null)throw new Error('\x27'+b+'\x27\x20is\x20required\x20for\x20this\x20action');return a;}function summarizeGuard(a){if(!a)return null;const b=a,c=Array['isArray'](b['table'])?b['table']:[],d=c['filter'](e=>e?.['b_submission']===!![])['length'];return{'address':b['object']??'','description':b['description']??null,'rep':typeof b['rep']==='boolean'?b['rep']:null,'table_entry_count':c['length'],'submission_slot_count':d,'relies':Array['isArray'](b['relies'])?b['relies']['filter'](e=>typeof e==='string'):[],'relies_logic_and':typeof b['relies_logic_and']==='boolean'?b['relies_logic_and']:null};}function summarizePermission(a,b){if(!a)return null;const c=a,d=Array['isArray'](c['admin'])?c['admin']:[],e=d[0x0],f=typeof e==='string'?e:typeof e?.['account']==='string'?e['account']:c['builder']??null;return{'address':c['object']??'','description':c['description']??null,'builder':c['builder']??null,'owner':f,'owner_name':b?.['name']??null,'admin_count':d['length'],'entity_count':typeof c['entity_count']==='number'?c['entity_count']:null,'perm_remark':Array['isArray'](c['perm_remark'])?c['perm_remark']['map'](g=>({'index':String(g?.['index']??''),'remark':typeof g?.['remark']==='string'?g['remark']:''})):[],'um':c['um']??null,'tags':b?.['tags']??[],'updated_timestamp_ms':b?.['updated_at_ms']!=null?String(b['updated_at_ms']):null};}async function markOf(a){if(!a)return{'name':null,'tags':[],'updated_at_ms':null};try{const b=await LocalMark['Instance']()['get'](a);if(b)return{'name':b['name']??null,'tags':Array['isArray'](b['tags'])?b['tags']:[],'updated_at_ms':typeof b['updatedAt']==='number'?b['updatedAt']:null};}catch{}try{const c=await LocalMark['Instance']()['list']({'address':a}),d=c?.[0x0];if(d)return{'name':d['name']??null,'tags':Array['isArray'](d['tags'])?d['tags']:[],'updated_at_ms':typeof d['updatedAt']==='number'?d['updatedAt']:null};}catch{}return{'name':null,'tags':[],'updated_at_ms':null};}async function markOfMany(a){const b=[...new Set(a['filter'](e=>!!e))],c=await Promise['all'](b['map'](e=>markOf(e))),d=new Map();for(let e=0x0;e<b['length'];e++)d['set'](b[e],c[e]);return d;}export async function handleServicePanorama(b){const c=requireField(b['service_address'],'service_address'),d=b['context_network']??undefined;let f=d??await Config['Instance']()['network_get']();const h=[];let j=c;if(!/^0x[0-9a-fA-F]{32,64}$/['test'](c)){const S=await LocalMark['Instance']()['get_address'](c);if(!S)throw new Error('Cannot\x20resolve\x20service\x20\x27'+c+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.\x20'+'Pass\x20the\x200x\x20Service\x20object\x20address\x20directly\x20or\x20register\x20the\x20name\x20via\x20local_mark_operation.');j=S;}let k=await query_serviceContext({'service':j,'include_machine_nodes':!![],'network':f});if(!k?.['service']&&d){const T=await Config['Instance']()['network_get']();T&&T!==f&&(f=T,k=await query_serviceContext({'service':j,'include_machine_nodes':!![],'network':f}));}const l=k['service'];j=l['object']??j;const m=new Set(),n=U=>{if(U)m['add'](U);};n(j),n(l['machine']),n(l['permission']),n(l['um']);for(const U of l['arbitrations']??[])n(U);for(const V of l['rewards']??[])n(V);for(const W of l['repositories']??[])n(W);const p=k['permission'];if(p){const X=Array['isArray'](p['admin'])?p['admin']:[];X[0x0]&&n(typeof X[0x0]==='string'?X[0x0]:X[0x0]?.['account']);if(p['builder'])n(p['builder']);}const q=await markOfMany([...m]),u=q['get'](j)??{'name':null,'tags':[],'updated_at_ms':null},w=u['name'],x=Y=>Y?q['get'](Y)??{'name':null,'tags':[],'updated_at_ms':null}:{'name':null,'tags':[],'updated_at_ms':null};let y=null;const z=k['machine'],A=k['machine_nodes']??[];if(z||A['length']>0x0){const {nodes:Y,edges:Z}=buildMachineGraph(A);y={'address':z?.['object']??l['machine']??'','name':x(z?.['object']??l['machine'])['name'],'description':z?.['description']??null,'published':typeof z?.['bPublished']==='boolean'?z['bPublished']:null,'paused':typeof z?.['bPaused']==='boolean'?z['bPaused']:null,'node_count':typeof z?.['node_count']==='number'?z['node_count']:null,'consensus_repositories':Array['isArray'](z?.['consensus_repositories'])?z['consensus_repositories']:[],'nodes':Y,'edges':Z};}let B=null;try{const a0=await query_object_last_updated({'object':j,'network':f});a0?.['timestamp_ms']&&(B={'timestamp_ms':a0['timestamp_ms'],'digest':a0['digest']??null,'sender':a0['sender']??null});}catch{h['push']('onchain_last_updated:\x20query\x20failed\x20(non-blocking)');}let C=null;try{C=await resolveSupplyChainGraph(j,f);}catch{h['push']('supply_chain:\x20resolution\x20failed\x20(non-blocking)');}let D=null;try{const a1=[l];for(const a2 of Object['values'](k['referenced']??{})){if(a2&&a2['object']!==j)a1['push'](a2);}D=generateBusinessReport({'objects':a1,'machine_nodes':A['map'](a3=>({'name':a3['name']}))});}catch{h['push']('business_report:\x20generation\x20failed\x20(non-blocking)');}const E=l?.['type_raw']??l?.['type']??'',F=E['match'](/<(.+)>$/),G=F?F[0x1]:null,H=(a3,a4)=>{const a5=[];return a3?a5['push']('Pricing\x20&\x20settlement\x20coin:\x20'+a3+'\x20—\x20the\x20Service\x27s\x20generic\x20T,\x20FIXED\x20at\x20creation\x20(immutable).\x20Sales\x20prices\x20and\x20order\x20amounts\x20are\x20denominated\x20in\x20this\x20exact\x20token;\x20buyers\x20must\x20hold\x20it\x20to\x20order.'):a5['push']('Pricing\x20&\x20settlement\x20coin:\x20unavailable\x20from\x20the\x20Service\x20type\x20(no\x20generic\x20found)\x20—\x20treat\x20amounts\x20as\x20raw\x20smallest\x20units.'),a5['push']('To\x20price\x20in\x20a\x20different\x20token,\x20publish\x20a\x20NEW\x20Service\x20with\x20type_parameter\x20set\x20to\x20that\x20token\x27s\x20full\x20type\x20—\x20this\x20one\x20keeps\x20settling\x20in\x20its\x20coin.'),/testnet/i['test'](a4)?a5['push']('Testnet\x20has\x20ONLY\x20WOW\x20(no\x20stablecoins\x20are\x20bridged)\x20—\x20testnet\x20services\x20stay\x20WOW-denominated;\x20multi-token\x20pricing\x20is\x20a\x20mainnet\x20capability.'):a5['push']('Mainnet\x20accepts\x20bridged\x20tokens\x20(USDT\x20/\x20USDC\x20/\x20ETH\x20/\x20WBTC\x20/\x20WOW):\x20buyers\x20bridge\x20them\x20from\x20Ethereum\x20via\x20the\x20cross-chain\x20bridge.\x20Query\x20wowok_buildin_info\x20info=\x27mainnet\x20bridge\x20tokens\x27\x20for\x20each\x20token\x27s\x20exact\x20type\x20tag\x20(wowTypeTag)\x20to\x20use\x20in\x20type_parameter\x20when\x20publishing.'),a5['join']('\x20');},I=a3=>formatMoneyAnnotation(a3,G,f);let J=null;try{const a3=await fetchServiceOrders(j,f,!![]),a4=Array['isArray'](a3?.['items'])?a3['items']:[],a5=a4['map'](ad=>typeof ad?.['who']==='string'?ad['who']:'')['filter'](ad=>ad!==''),a6=new Map();try{if(a5['length']>0x0){const ad=await batchQueryObjectsByIds(a5,f,!![]);for(const ae of ad){ae&&ae['type']===ObjectType['Order']&&a6['set'](ae['object'],ae);}}}catch{h['push']('recent_orders:\x20order\x20details\x20unavailable\x20(non-blocking)');}const a7=new Map(),a8=new Map(),a9=new Map();try{const af=new Set();for(const ag of a6['values']()){if(ag?.['progress'])af['add'](ag['progress']);if(ag?.['allocation'])af['add'](ag['allocation']);}if(af['size']>0x0){const ah=await batchQueryObjectsByIds(Array['from'](af),f,!![]);for(const ai of ah){if(!ai?.['object'])continue;if(ai['type']===ObjectType['Progress']){const aj=ai?.['current'];a7['set'](ai['object'],typeof aj==='string'&&aj!==''?aj:null),a8['set'](ai['object'],Number(ai?.['current_time'])||null);}else{if(ai['type']===ObjectType['Allocation']){const ak=Number(ai?.['balance']??0x0);a9['set'](ai['object'],Number['isFinite'](ak)&&ak===0x0?'allocated':'pending');}}}}}catch{h['push']('recent_orders:\x20progress/allocation\x20details\x20unavailable\x20(non-blocking)');}const aa=new Map();try{const al=Array['from'](new Set(a4['map'](an=>typeof an?.['who']==='string'?an['who']:'')['filter'](Boolean))),am=await Promise['allSettled'](al['map'](an=>query_object_last_updated({'object':an,'network':f})));for(let an=0x0;an<al['length'];an++){const ao=am[an];aa['set'](al[an],ao['status']==='fulfilled'&&ao['value']?.['timestamp_ms']?Number(ao['value']['timestamp_ms'])||null:null);}}catch{h['push']('recent_orders:\x20order\x20updated\x20times\x20unavailable\x20(non-blocking)');}const ab=await Promise['all'](a4['map'](async ap=>{const aq=typeof ap?.['who']==='string'?ap['who']:'',ar=a6['get'](aq),as=ar?.['amount']!==null&&ar?.['amount']!==undefined?String(ar['amount']):'',at=await I(as);return{'order':aq,'time':typeof ap?.['time']==='number'?ap['time']:0x0,'updated_ms':aa['get'](aq)??null,'amount':as,'amount_display':at['display'],'amount_tip':at['tip'],'progress':ar?.['progress']??null,'allocation':ar?.['allocation']??null,'disputes':Array['isArray'](ar?.['dispute'])?ar['dispute']:[],'agent':Array['isArray'](ar?.['agent'])?ar['agent']:[],'owner':ownerAddr(ar?.['builder']??ar?.['owner']),'claimed_by':ar?.['claimed_by']??null,'required_info':ar?.['required_info']??null,'progress_next':ar?.['progress']?a7['get'](ar['progress'])??null:null,'progress_since':ar?.['progress']?a8['get'](ar['progress'])??null:null,'allocation_state':ar?.['allocation']?a9['get'](ar['allocation'])??'pending':'none','bought':await Promise['all']((Array['isArray'](ar?.['items'])?ar['items']:[])['map'](async au=>({'name':String(au?.['name']??''),'price_display':(await I(au?.['price']!==null&&au?.['price']!==undefined?String(au['price']):null))['display'],'quantity':String(au?.['quantity']??'0'),'wip_hash':String(au?.['wip_hash']??'')})))};})),ac=ab['filter'](ap=>ap['order']!=='');J={'count':a4['length'],'window_saturated':a3?.['ring_saturated']??ringWindowSaturated(a4['length']),'preview_truncated':a4['length']>ac['slice'](-0x14)['length'],'items':ac['slice'](-0x14)['reverse']()};}catch{h['push']('recent_orders:\x20reverse-index\x20query\x20failed\x20(non-blocking)');}const K=[];try{const ap=await query_affiliations({'address':j,'no_cache':!![],'network':f}),aq=new Set(),ar=new Map();for(const at of ap?.['entries']??[]){const au=typeof at?.['who']==='string'?at['who']:'';if(!au||aq['has'](au))continue;aq['add'](au);const av=objectTypeFromAddress(au);if(!av)continue;if(av===ObjectType['Order'])continue;const aw=String(av);let ax=ar['get'](aw);!ax&&(ax=[],ar['set'](aw,ax)),ax['push']({'address':au,'type_label':aw,'name':x(au)['name'],'time':typeof at?.['time']==='number'?at['time']:null});}const as=['Progress','Allocation','Payment','Guard'];for(const ay of as){const az=ar['get'](ay);az&&az['length']>0x0&&(K['push']({'type_label':ay,'items':az}),ar['delete'](ay));}for(const [aA,aB]of ar){if(aB['length']>0x0)K['push']({'type_label':aA,'items':aB});}}catch{h['push']('related:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}const L=[];for(const aC of k['allocator_guards']??[]){const aD=summarizeGuard(aC);if(aD)L['push'](aD);}const M=[];for(const aE of Array['isArray'](l['sales'])?l['sales']:[]){const aF=balanceStr(aE?.['price']),aG=await I(aF);M['push']({'name':typeof aE?.['name']==='string'?aE['name']:'','price':aF,'price_display':aG['display'],'price_tip':aG['tip'],'stock':balanceStr(aE?.['stock']),'suspension':aE?.['suspension']===!![],'wip':typeof aE?.['wip']==='string'?aE['wip']:'','wip_hash':typeof aE?.['wip_hash']==='string'?aE['wip_hash']:''});}const N=l['order_allocators']?{'description':l['order_allocators']['description']??'','threshold':balanceStr(l['order_allocators']['threshold']),'allocators':(l['order_allocators']['allocators']??[])['map'](aH=>({'guard':aH['guard'],'sharing_count':Array['isArray'](aH['sharing'])?aH['sharing']['length']:0x0,'max':balanceStr(aH['max']??null)}))}:null,O=summarizePermission(k['permission'],x(l['permission'])),P=O?.['owner']??B?.['sender']??null,Q=P?await markOf(P):null,R=await I(balanceStr(l['compensation_fund']));return{'action':'service_panorama','network':f,'service':{'address':j,'name':w,'description':l['description']??'','location':l['location']??'','published':l['bPublished']===!![],'paused':l['bPaused']===!![],'paused_time':typeof l['paused_time']==='number'?l['paused_time']:null,'setting_lock_duration':balanceStr(l['setting_lock_duration']),'customer_required':Array['isArray'](l['customer_required'])?l['customer_required']:[],'compensation_fund':balanceStr(l['compensation_fund']),'compensation_fund_display':R['display'],'compensation_fund_tip':R['tip'],'sales':M,'machine':l['machine']??null,'buy_guard':l['buy_guard']??null,'permission':l['permission']??'','um':l['um']??null,'arbitrations':Array['isArray'](l['arbitrations'])?l['arbitrations']:[],'rewards':Array['isArray'](l['rewards'])?l['rewards']:[],'repositories':Array['isArray'](l['repositories'])?l['repositories']:[],'order_allocators':N,'payment_token':{'coin_type':G,'guidance':H(G,f)},'onchain_last_updated':B,'tags':u['tags']??[],'owner':P,'owner_name':Q?.['name']??null},'machine_graph':y,'buy_guard':summarizeGuard(k['buy_guard']),'permission':O,'allocator_guards':L,'related':{'groups':K},'supply_chain':C,'business_report':D,'recent_orders':J,'data_gaps':h};}
@@ -0,0 +1 @@
1
+ import{describe,expect,it}from'vitest';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'../../graph/onchain/dataplane.js';import{expandTopology}from'../../graph/onchain/expand.js';import{FULL,fullServiceState}from'../../graph/onchain/fixtures.js';import{EVALUATION_SERVICE_INTENTS,resolveExpansionStrategy,withEvaluationBundle}from'../../graph/onchain/strategy.js';import{registerGraphServiceEvaluations}from'../../evaluation/builtins/graph-service.js';import{handleOnchainTopology}from'./topology-query.js';const NET='mainnet';describe('onchain_topology\x20evaluation\x20projection\x20(Task\x2016)',()=>{it('TR-16.1:\x20full\x20shop\x20—\x20evaluation\x20section\x20with\x20real\x20arbitration\x20conclusion\x20+\x20coverage',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['evaluation'])['toBeDefined']();const b=a['evaluation'];expect(Number['isInteger'](b['completeness']))['toBe'](!![]),expect(b['completeness'])['toBeGreaterThan'](0x0),expect(b['completeness'])['toBeLessThanOrEqual'](0x64),expect(b['coverage']['length'])['toBeGreaterThan'](0x0),expect(b['target'])['toBe'](FULL['svc']['toLowerCase']()),expect(b['unverified'])['toEqual']([]);const c=b['trust']['breakdown']['find'](d=>d['rule_id']==='trust_arbitration');expect(c?.['score'])['toBe'](0x64),expect(c?.['matched']?.['length']??0x0)['toBeGreaterThan'](0x0),expect(a['summary'])['toContain']('Evaluation:\x20trust\x20'+b['trust']['total']+'/100,\x20risk\x20'+b['risk']['total']+'/100');}),it('TR-16.2:\x20single\x20expansion\x20—\x20evaluation\x20adds\x20zero\x20fetches,\x20the\x20probe\x20is\x20a\x20dedup\x20hit',async()=>{registerGraphServiceEvaluations();const a=withEvaluationBundle(resolveExpansionStrategy({'defaultIntents':[...EVALUATION_SERVICE_INTENTS]})),b=new FakeDataPlane(fullServiceState()),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':FULL['svc'],'budget':a['budget'],'edges':a['edges']}),d=new FakeDataPlane(fullServiceState()),e=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'context_network':NET},d);expect(d['batches']['objects'])['toBe'](b['batches']['objects']),expect(e['stats']['rpc']['batches'])['toBe'](c['rpcReport']['batches']),expect(d['dedupHits'])['toBe'](b['dedupHits']);}),it('wiring:\x20no-intent\x20Service\x20seed\x20defaults\x20to\x20the\x20evaluation\x20bundle\x20with\x20its\x20shaping',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['strategy']['intents'])['toEqual']([...EVALUATION_SERVICE_INTENTS]),expect(a['strategy']['trace']['some'](b=>b['startsWith']('intent\x20(default):\x20')))['toBe'](!![]),expect(a['strategy']['trace']['some'](b=>b['startsWith']('evaluation\x20bundle:')))['toBe'](!![]);}),it('wiring:\x20role-default\x20intents\x20UNION\x20onto\x20the\x20evaluation\x20floor,\x20never\x20replace\x20it',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'role':'customer','context_network':NET},new FakeDataPlane(fullServiceState()));for(const c of EVALUATION_SERVICE_INTENTS)expect(a['strategy']['intents'])['toContain'](c);expect(a['strategy']['intents'])['toContain']('order_health'),expect(a['strategy']['intents'])['toContain']('counterparty'),expect(a['strategy']['trace']['some'](d=>d['startsWith']('evaluation\x20bundle:')))['toBe'](!![]);const b=a['facets']?.['items']['find'](d=>d['id']==='arbitration');expect(b?.['state'])['toBe']('present'),expect(a['evaluation']['unverified'])['not']['toContain']('risk_trust');}),it('wiring:\x20an\x20explicit\x20intent\x20wins\x20over\x20the\x20default\x20and\x20skips\x20the\x20bundle\x20shaping',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'intent':'workflow','context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['strategy']['intents'])['toEqual'](['workflow']),expect(a['strategy']['trace']['some'](b=>b['startsWith']('intent\x20(explicit):\x20workflow')))['toBe'](!![]),expect(a['strategy']['trace']['some'](b=>b['startsWith']('evaluation\x20bundle:')))['toBe'](![]),expect(a['evaluation'])['toBeDefined']();}),it('wiring:\x20a\x20non-Service\x20seed\x20keeps\x20the\x20kernel\x20default\x20posture;\x20gap\x20dims\x20are\x20excluded\x20honestly',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['mac'],'context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['strategy']['intents'])['toEqual'](['full_map']),expect(a['evaluation'])['toBeDefined'](),expect(a['evaluation']['unverified']['length'])['toBeGreaterThan'](0x0);}),it('analyze=false\x20drops\x20the\x20evaluation\x20section\x20(no\x20findings-less\x20all-clear)',async()=>{registerGraphServiceEvaluations();const a=await handleOnchainTopology({'query_type':'onchain_topology','focus':FULL['svc'],'analyze':![],'context_network':NET},new FakeDataPlane(fullServiceState()));expect(a['evaluation'])['toBeUndefined'](),expect(a['findings'])['toEqual']([]);});});
@@ -1,5 +1,8 @@
1
1
  import { type DataPlane, type ExpansionStrategy, type FindingKind, type TopologyGraph } from "../../graph/onchain/index.js";
2
2
  import type { OnchainTopologyInput, OnchainTopologyResult } from "../../schema/query/bi.js";
3
+ import { type GraphServiceEvaluation } from "../../evaluation/builtins/graph-service.js";
4
+ import type { UserInjection } from "../../evaluation/types.js";
5
+ import { type ResolvedFacetProfile } from "../../persona/facet-profile.js";
3
6
  export interface TopologyShapeOptions {
4
7
  analyze?: boolean;
5
8
  analyzerKinds?: FindingKind[];
@@ -9,6 +12,14 @@ export interface TopologyShapeOptions {
9
12
  interestRole?: string;
10
13
  interestObserver?: string;
11
14
  interestDrive?: import("../../evaluation/game-strategy.js").PersonaDrive;
15
+ injection?: UserInjection;
16
+ facetProfile?: ResolvedFacetProfile;
12
17
  }
13
- export declare function buildOnchainTopologyResult(graph: TopologyGraph, seed: string, opts?: TopologyShapeOptions): OnchainTopologyResult;
14
- export declare function handleOnchainTopology(v: OnchainTopologyInput, planeOverride?: DataPlane): Promise<OnchainTopologyResult>;
18
+ export declare function buildOnchainTopologyResult(graph: TopologyGraph, seed: string, opts?: TopologyShapeOptions): Promise<OnchainTopologyResult>;
19
+ export declare function handleOnchainTopology(v: OnchainTopologyInput, planeOverride?: DataPlane, evaluationInjection?: UserInjection): Promise<OnchainTopologyResult>;
20
+ export interface GraphServiceEvaluateOptions {
21
+ injection?: UserInjection;
22
+ no_cache?: boolean;
23
+ context_network?: "testnet" | "mainnet" | "localnet";
24
+ }
25
+ export declare function evaluateServiceFromGraph(focus: string, opts?: GraphServiceEvaluateOptions): Promise<GraphServiceEvaluation>;
@@ -1 +1 @@
1
- import{Config}from'@wowok/wowok/w/local';import{SdkDataPlane,expandTopology,buildViewport,buildRoleInterest,runAnalyzers,runNodeAnalyzers,listAnalyzers,toCommercialRole,workflowSubgraphFromEdges,orderCompletionInGraph,resolveExpansionStrategy}from'../../graph/onchain/index.js';import{resolveAddress}from'./relationship-profile.js';import{serviceRiskNodeAnalyzer}from'../../knowledge/service-risk-node.js';import{serviceAllocatorAuditNodeAnalyzer}from'../../knowledge/service-allocator-audit-node.js';import{recommendedCallForForwardBinding}from'../../participation/radar-core.js';import{resolveTopologyContext}from'../../persona/topology-focus.js';const NODE_ANALYZERS=[serviceRiskNodeAnalyzer,serviceAllocatorAuditNodeAnalyzer],NODE_MARK='::node::';function tally(a){const b={};for(const c of a){if(!c)continue;b[c]=(b[c]??0x0)+0x1;}return b;}export function buildOnchainTopologyResult(a,b,c={}){const d=b['toLowerCase'](),f=[],g=new Set();for(const s of a['edges']){if(s['schema']!=='wf.transition')continue;for(const u of[s['from'],s['to']]){const v=u['indexOf'](NODE_MARK);if(v<=0x0)continue;const w=u['slice'](0x0,v)['toLowerCase']();!g['has'](w)&&(g['add'](w),f['push'](w));}}f['sort']();const h=f['map'](x=>{const y=workflowSubgraphFromEdges(a['edges'],x);return{'machine':x,'transitions':y['transitions']['map'](z=>({'node':z['node'],'prev_node':z['prevNode'],...z['forward']!==undefined?{'forward':z['forward']}:{},...z['threshold']!==undefined?{'threshold':z['threshold']}:{},'guard':z['guard']??null,'weight':z['weight']??null,'named_operator':z['namedOperator']??null,'permission_index':z['permissionIndex']??null,'recommended_call':recommendedCallForForwardBinding({'permissionIndex':z['permissionIndex']??null,'namedOperator':z['namedOperator']??null,'hasGuard':!!z['guard']})??null})),'terminal_names':[...y['terminalNames']]['sort']()};}),i=[...a['nodes']['values']()]['filter'](x=>x['kind']==='object'&&x['state']==='fetched'&&x['objectType']==='Order')['map'](x=>({'order':x['id'],...orderCompletionInGraph(a,x['id'])})),j=[...a['gaps']];let k=[],l;if(c['analyze']??!![]){const x=buildViewport(a,d,'neutral'),y=c['analyzerKinds'],z=c['onlyAnalyzers']?new Set(c['onlyAnalyzers']):undefined;try{k=runAnalyzers(x,{...y?{'kinds':y}:{},...z?{'only':[...z]}:{}});}catch(A){j['push']('Analyzer\x20suite\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(A?.['message']??String(A)));}try{const B=NODE_ANALYZERS['filter'](C=>(!y||y['includes'](C['kind']))&&(!z||z['has'](C['id'])));k['push'](...runNodeAnalyzers(x,B));}catch(C){j['push']('Node\x20analyzer\x20suite\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(C?.['message']??String(C)));}if(c['interestRole']&&c['interestObserver'])try{const D=buildRoleInterest(a,c['interestObserver'],toCommercialRole(c['interestRole']),c['interestDrive']);k['push'](D['finding']),l=D['view'];}catch(E){j['push']('Role\x20interest\x20projection\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(E?.['message']??String(E)));}}for(const F of a['truncations']){j['push']('truncated\x20'+F['schema']+'\x20at\x20'+F['nodeId']+':\x20observed\x20at\x20least\x20'+F['observed']+'\x20edge(s)\x20(limit\x20'+F['limit']+')');}if(a['budgetExhausted']['rpcs'])j['push']('RPC\x20batch\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_rpcs).');if(a['budgetExhausted']['nodes'])j['push']('Node\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_nodes).');if(a['budgetExhausted']['depth'])j['push']('Depth\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_depth).');if(a['budgetExhausted']['eventPages'])j['push']('Event-page\x20budget\x20exhausted\x20—\x20event-derived\x20edges\x20are\x20partial.');const m=[...a['nodes']['values']()]['map'](G=>({'id':G['id'],'kind':G['kind'],...G['objectType']?{'object_type':G['objectType']}:{},...G['coinType']?{'coin_type':G['coinType']}:{},'state':G['state'],'depth':G['depth'],...G['error']?{'error':G['error']}:{},...c['includeRaw']&&G['raw']!==undefined?{'raw':G['raw']}:{}})),n=a['edges']['map'](G=>({'id':G['id'],'schema':G['schema'],'family':G['family'],'from':G['from'],'to':G['to'],'retention':G['retention'],'evidence':G['evidence'],...G['key']!==undefined?{'key':G['key']}:{},...G['truncated']!==undefined?{'truncated':G['truncated']}:{},...G['payload']!==undefined?{'payload':G['payload']}:{}})),o=tally(i['map'](G=>G['status'])),p=tally(a['edges']['map'](G=>G['family'])),q=Object['entries'](p)['map'](([G,H])=>G+'×'+H)['join'](',\x20');let r='Topology\x20around\x20'+d+'\x20on\x20'+a['network']+':\x20'+a['nodes']['size']+'\x20node(s),\x20'+a['edges']['length']+'\x20edge(s)'+(q?'\x20('+q+')':'')+(',\x20'+h['length']+'\x20workflow\x20graph(s),\x20'+i['length']+'\x20order(s)')+('\x20['+['completed','in_progress','unknown']['map'](G=>G+'='+(o[G]??0x0))['join'](',\x20')+']')+(',\x20'+k['length']+'\x20finding(s).');return j['length']>0x0&&(r+='\x20'+j['length']+'\x20data\x20gap/partial-data\x20marker(s)\x20—\x20see\x20data_gaps/truncations/budget_exhausted\x20before\x20drawing\x20conclusions.'),{'action':'onchain_topology','seed':d,'network':a['network'],'strategy':{'intents':c['strategy']?.['intents']??['full_map'],...c['strategy']?.['edges']['families']?{'families':c['strategy']['edges']['families']}:{},...c['strategy']?.['edges']['schemas']?{'schemas':c['strategy']['edges']['schemas']}:{},'table_edges':c['strategy']?.['edges']['tableEdges']??['machine.node'],...c['strategy']?.['edges']['familyDepths']?{'family_depths':c['strategy']['edges']['familyDepths']}:{},'budget':{...c['strategy']?.['budget']['maxDepth']!==undefined?{'max_depth':c['strategy']['budget']['maxDepth']}:{},...c['strategy']?.['budget']['maxNodes']!==undefined?{'max_nodes':c['strategy']['budget']['maxNodes']}:{},...c['strategy']?.['budget']['maxFanoutPerNode']!==undefined?{'max_fanout':c['strategy']['budget']['maxFanoutPerNode']}:{},...c['strategy']?.['budget']['maxRpcs']!==undefined?{'max_rpcs':c['strategy']['budget']['maxRpcs']}:{}},'trace':c['strategy']?.['trace']??['kernel\x20default:\x20all\x20families,\x20tables\x20[machine.node],\x20depth\x204']},'analyzers':[...listAnalyzers(),...NODE_ANALYZERS['map'](G=>G['id'])],'stats':{'nodes_total':a['nodes']['size'],'nodes_by_kind':tally([...a['nodes']['values']()]['map'](G=>G['kind'])),'nodes_by_object_type':tally([...a['nodes']['values']()]['map'](G=>G['objectType']??'')),'edges_total':a['edges']['length'],'edges_by_family':p,'edges_by_schema':tally(a['edges']['map'](G=>G['schema'])),'rpc':{'batches':a['rpcReport']['batches'],'by_channel':{'objects':a['rpcReport']['byChannel']['objects'],'keyed_fields':a['rpcReport']['byChannel']['keyedFields'],'tables':a['rpcReport']['byChannel']['tables'],'events':a['rpcReport']['byChannel']['events']},'dedup_hits':a['rpcReport']['dedupHits']}},'nodes':m,'edges':n,'workflows':h,'orders_completion':i,'findings':k,...l?{'role_interest':l}:{},'truncations':a['truncations']['map'](G=>({'node_id':G['nodeId'],'schema':G['schema'],'observed':G['observed'],'limit':G['limit']})),'budget_exhausted':{...a['budgetExhausted']['nodes']?{'nodes':!![]}:{},...a['budgetExhausted']['depth']?{'depth':!![]}:{},...a['budgetExhausted']['rpcs']?{'rpcs':!![]}:{},...a['budgetExhausted']['eventPages']?{'event_pages':!![]}:{}},'data_gaps':j,'summary':r};}export async function handleOnchainTopology(a,b){if(!a['focus'])throw new Error('\x27focus\x27\x20is\x20required\x20for\x20onchain_topology\x20—\x20an\x20on-chain\x20address\x20(0x...)\x20or\x20a\x20LocalMark\x20name.');const c=a['context_network']??await Config['Instance']()['network_get'](),d=await resolveAddress(a['focus'],'focus'),e=b??new SdkDataPlane(c,{'noCache':a['no_cache']});let f={};try{f=await resolveTopologyContext({...a['context_account']?{'account':a['context_account']['toLowerCase']()}:{},...a['industry']?{'industry':a['industry']}:{},...a['role']?{'role':a['role']}:{}});}catch{}const g=resolveExpansionStrategy({...a['intent']?{'intents':[a['intent']]}:{},...f['roleDefault']?{'roleDefault':f['roleDefault']}:{},...f['industryTemplate']?{'industryTemplate':f['industryTemplate']}:{},...f['personaPref']?{'personaPref':{...f['personaPref'],...f['personaPref']['table_edges']?{'tableEdges':f['personaPref']['table_edges']}:{},...f['personaPref']['family_depths']?{'familyDepths':f['personaPref']['family_depths']}:{},...f['personaPref']['max_depth']!==undefined?{'maxDepth':f['personaPref']['max_depth']}:{},...f['personaPref']['max_nodes']!==undefined?{'maxNodes':f['personaPref']['max_nodes']}:{},...f['personaPref']['max_fanout']!==undefined?{'maxFanout':f['personaPref']['max_fanout']}:{}}}:{},'explicitEdges':{...a['table_edges']?{'tableEdges':a['table_edges']}:{},...a['budget']?{'budget':{...a['budget']['max_depth']!==undefined?{'maxDepth':a['budget']['max_depth']}:{},...a['budget']['max_nodes']!==undefined?{'maxNodes':a['budget']['max_nodes']}:{},...a['budget']['max_fanout']!==undefined?{'maxFanoutPerNode':a['budget']['max_fanout']}:{},...a['budget']['max_rpcs']!==undefined?{'maxRpcs':a['budget']['max_rpcs']}:{}}}:{}}}),h=await expandTopology(e,{'network':c,'seed':d,'budget':g['budget'],'edges':g['edges']}),i=a['interest_role']??a['role'];let j=a['context_account']?.['toLowerCase']();if(!j&&d['startsWith']('0x00'))j=d;const k=f['drive'],l=i&&j?toCommercialRole(i):undefined,m=buildOnchainTopologyResult(h,d,{'analyze':a['analyze'],...a['analyzer_kinds']?{'analyzerKinds':a['analyzer_kinds']}:{},...a['only_analyzers']?{'onlyAnalyzers':a['only_analyzers']}:{},'includeRaw':a['include_raw'],'strategy':g,...l&&j?{'interestRole':l,...k?{'interestDrive':k}:{},'interestObserver':j}:{}});return i&&!j&&m['data_gaps']['push']('interest_role\x20given\x20but\x20no\x20observer\x20EOA\x20(pass\x20context_account,\x20or\x20seed\x20an\x20EOA\x20address)\x20—\x20role\x20interest\x20view\x20skipped'),m;}
1
+ import{Config}from'@wowok/wowok/w/local';import{SdkDataPlane,expandTopology,inferObjectType,buildViewport,buildRoleInterest,runAnalyzers,runNodeAnalyzers,listAnalyzers,toCommercialRole,workflowSubgraphFromEdges,orderCompletionInGraph,resolveExpansionStrategy,withEvaluationBundle,EVALUATION_SERVICE_INTENTS,projectEvaluationFacts,projectFacets}from'../../graph/onchain/index.js';import{resolveAddress}from'./relationship-profile.js';import{evaluateGraphServiceFacts}from'../../evaluation/builtins/graph-service.js';import{RULE_NODE_ANALYZERS}from'../../knowledge/rule-node-analyzers.js';import{recommendedCallForForwardBinding}from'../../participation/radar-core.js';import{resolveTopologyContext}from'../../persona/topology-focus.js';import{deriveRuleWeights,resolveFacetProfile}from'../../persona/facet-profile.js';import{annotateFacetMoney}from'./facet-money.js';const NODE_MARK='::node::';function withDerivedFacetWeights(a,b){if(Object['keys'](b)['length']===0x0)return a;const c={...a?.['overrides']?.['rules']??{}};for(const [d,e]of Object['entries'](b)){if(!c[d])c[d]={'weight':e};}return{...a,'overrides':{...a?.['overrides']??{},'rules':c}};}function tally(a){const b={};for(const c of a){if(!c)continue;b[c]=(b[c]??0x0)+0x1;}return b;}export async function buildOnchainTopologyResult(a,b,c={}){const d=b['toLowerCase'](),f=[],g=new Set();for(const w of a['edges']){if(w['schema']!=='wf.transition')continue;for(const x of[w['from'],w['to']]){const y=x['indexOf'](NODE_MARK);if(y<=0x0)continue;const z=x['slice'](0x0,y)['toLowerCase']();!g['has'](z)&&(g['add'](z),f['push'](z));}}f['sort']();const h=f['map'](A=>{const B=workflowSubgraphFromEdges(a['edges'],A);return{'machine':A,'transitions':B['transitions']['map'](C=>({'node':C['node'],'prev_node':C['prevNode'],...C['forward']!==undefined?{'forward':C['forward']}:{},...C['threshold']!==undefined?{'threshold':C['threshold']}:{},'guard':C['guard']??null,'weight':C['weight']??null,'named_operator':C['namedOperator']??null,'permission_index':C['permissionIndex']??null,'recommended_call':recommendedCallForForwardBinding({'permissionIndex':C['permissionIndex']??null,'namedOperator':C['namedOperator']??null,'hasGuard':!!C['guard']})??null})),'terminal_names':[...B['terminalNames']]['sort']()};}),i=[...a['nodes']['values']()]['filter'](A=>A['kind']==='object'&&A['state']==='fetched'&&A['objectType']==='Order')['map'](A=>({'order':A['id'],...orderCompletionInGraph(a,A['id'])})),j=buildViewport(a,d,'neutral'),k=[...a['gaps']];let l=[],m;if(c['analyze']??!![]){const A=c['analyzerKinds'],B=c['onlyAnalyzers']?new Set(c['onlyAnalyzers']):undefined;try{l=runAnalyzers(j,{...A?{'kinds':A}:{},...B?{'only':[...B]}:{}});}catch(C){k['push']('Analyzer\x20suite\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(C?.['message']??String(C)));}try{const D=RULE_NODE_ANALYZERS['filter'](E=>(!A||A['includes'](E['kind']))&&(!B||B['has'](E['id'])));l['push'](...runNodeAnalyzers(j,D));}catch(E){k['push']('Node\x20analyzer\x20suite\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(E?.['message']??String(E)));}if(c['interestRole']&&c['interestObserver'])try{const F=buildRoleInterest(a,c['interestObserver'],toCommercialRole(c['interestRole']),c['interestDrive']);l['push'](F['finding']),m=F['view'];}catch(G){k['push']('Role\x20interest\x20projection\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(G?.['message']??String(G)));}}let n,o;if(c['analyze']??!![])try{const H=projectEvaluationFacts(j,d,l);n=await evaluateGraphServiceFacts(H,c['injection']);if(c['facetProfile'])try{o=projectFacets({'graph':a,'viewport':j,'target':d,'facts':H,'evaluation':n,'workflows':h,'profile':{'role':c['facetProfile']['role'],'industry':c['facetProfile']['industry'],'persona_applied':c['facetProfile']['personaApplied'],'sources':c['facetProfile']['sources'],'facets':c['facetProfile']['facets']},...m?{'roleInterest':m}:{}});}catch(I){k['push']('Facet\x20projection\x20failed\x20(evaluation\x20is\x20intact):\x20'+(I?.['message']??String(I)));}}catch(J){k['push']('Evaluation\x20projection\x20failed\x20(topology\x20itself\x20is\x20intact):\x20'+(J?.['message']??String(J)));}for(const K of a['truncations']){k['push']('truncated\x20'+K['schema']+'\x20at\x20'+K['nodeId']+':\x20observed\x20at\x20least\x20'+K['observed']+'\x20edge(s)\x20(limit\x20'+K['limit']+')');}if(a['budgetExhausted']['rpcs'])k['push']('RPC\x20batch\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_rpcs).');if(a['budgetExhausted']['nodes'])k['push']('Node\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_nodes).');if(a['budgetExhausted']['depth'])k['push']('Depth\x20budget\x20exhausted\x20—\x20topology\x20is\x20partial\x20(raise\x20budget.max_depth).');if(a['budgetExhausted']['eventPages'])k['push']('Event-page\x20budget\x20exhausted\x20—\x20event-derived\x20edges\x20are\x20partial.');const p=[...a['nodes']['values']()]['map'](L=>({'id':L['id'],'kind':L['kind'],...L['objectType']?{'object_type':L['objectType']}:{},...L['coinType']?{'coin_type':L['coinType']}:{},'state':L['state'],'depth':L['depth'],...L['error']?{'error':L['error']}:{},...c['includeRaw']&&L['raw']!==undefined?{'raw':L['raw']}:{}})),q=a['edges']['map'](L=>({'id':L['id'],'schema':L['schema'],'family':L['family'],'from':L['from'],'to':L['to'],'retention':L['retention'],'evidence':L['evidence'],...L['key']!==undefined?{'key':L['key']}:{},...L['truncated']!==undefined?{'truncated':L['truncated']}:{},...L['payload']!==undefined?{'payload':L['payload']}:{}})),r=tally(i['map'](L=>L['status'])),s=tally(a['edges']['map'](L=>L['family'])),u=Object['entries'](s)['map'](([L,M])=>L+'×'+M)['join'](',\x20');let v='Topology\x20around\x20'+d+'\x20on\x20'+a['network']+':\x20'+a['nodes']['size']+'\x20node(s),\x20'+a['edges']['length']+'\x20edge(s)'+(u?'\x20('+u+')':'')+(',\x20'+h['length']+'\x20workflow\x20graph(s),\x20'+i['length']+'\x20order(s)')+('\x20['+['completed','in_progress','unknown']['map'](L=>L+'='+(r[L]??0x0))['join'](',\x20')+']')+(',\x20'+l['length']+'\x20finding(s).');return n&&(v+='\x20Evaluation:\x20trust\x20'+n['trust']['total']+'/100,\x20risk\x20'+n['risk']['total']+'/100,\x20completeness\x20'+n['completeness']+'%'+(n['unverified']['length']>0x0?'\x20(unverifiable,\x20excluded:\x20'+n['unverified']['join'](',\x20')+')':'')+'.'),k['length']>0x0&&(v+='\x20'+k['length']+'\x20data\x20gap/partial-data\x20marker(s)\x20—\x20see\x20data_gaps/truncations/budget_exhausted\x20before\x20drawing\x20conclusions.'),{'action':'onchain_topology','seed':d,'network':a['network'],'strategy':{'intents':c['strategy']?.['intents']??['full_map'],...c['strategy']?.['edges']['families']?{'families':c['strategy']['edges']['families']}:{},...c['strategy']?.['edges']['schemas']?{'schemas':c['strategy']['edges']['schemas']}:{},'table_edges':c['strategy']?.['edges']['tableEdges']??['machine.node'],...c['strategy']?.['edges']['eventEdges']?{'event_edges':c['strategy']['edges']['eventEdges']}:{},...c['strategy']?.['edges']['familyDepths']?{'family_depths':c['strategy']['edges']['familyDepths']}:{},'budget':{...c['strategy']?.['budget']['maxDepth']!==undefined?{'max_depth':c['strategy']['budget']['maxDepth']}:{},...c['strategy']?.['budget']['maxNodes']!==undefined?{'max_nodes':c['strategy']['budget']['maxNodes']}:{},...c['strategy']?.['budget']['maxFanoutPerNode']!==undefined?{'max_fanout':c['strategy']['budget']['maxFanoutPerNode']}:{},...c['strategy']?.['budget']['maxRpcs']!==undefined?{'max_rpcs':c['strategy']['budget']['maxRpcs']}:{}},'trace':c['strategy']?.['trace']??['kernel\x20default:\x20all\x20families,\x20tables\x20[machine.node],\x20depth\x204']},'analyzers':[...listAnalyzers(),...RULE_NODE_ANALYZERS['map'](L=>L['id'])],'stats':{'nodes_total':a['nodes']['size'],'nodes_by_kind':tally([...a['nodes']['values']()]['map'](L=>L['kind'])),'nodes_by_object_type':tally([...a['nodes']['values']()]['map'](L=>L['objectType']??'')),'edges_total':a['edges']['length'],'edges_by_family':s,'edges_by_schema':tally(a['edges']['map'](L=>L['schema'])),'rpc':{'batches':a['rpcReport']['batches'],'by_channel':{'objects':a['rpcReport']['byChannel']['objects'],'keyed_fields':a['rpcReport']['byChannel']['keyedFields'],'tables':a['rpcReport']['byChannel']['tables'],'events':a['rpcReport']['byChannel']['events']},'dedup_hits':a['rpcReport']['dedupHits']}},'nodes':p,'edges':q,'workflows':h,'orders_completion':i,'findings':l,...n?{'evaluation':n}:{},...o?{'facets':o}:{},...m?{'role_interest':m}:{},'truncations':a['truncations']['map'](L=>({'node_id':L['nodeId'],'schema':L['schema'],'observed':L['observed'],'limit':L['limit']})),'budget_exhausted':{...a['budgetExhausted']['nodes']?{'nodes':!![]}:{},...a['budgetExhausted']['depth']?{'depth':!![]}:{},...a['budgetExhausted']['rpcs']?{'rpcs':!![]}:{},...a['budgetExhausted']['eventPages']?{'event_pages':!![]}:{}},'data_gaps':k,'summary':v};}export async function handleOnchainTopology(a,b,c){if(!a['focus'])throw new Error('\x27focus\x27\x20is\x20required\x20for\x20onchain_topology\x20—\x20an\x20on-chain\x20address\x20(0x...)\x20or\x20a\x20LocalMark\x20name.');const d=a['context_network']??await Config['Instance']()['network_get'](),e=await resolveAddress(a['focus'],'focus'),f=b??new SdkDataPlane(d,{'noCache':a['no_cache']});let g={};try{g=await resolveTopologyContext({...a['context_account']?{'account':a['context_account']['toLowerCase']()}:{},...a['industry']?{'industry':a['industry']}:{},...a['role']?{'role':a['role']}:{}});}catch{}const h=[];for(const x of[...g['roleDefault']?.['intents']??[],...g['personaPref']?.['intents']??[]]){if(!h['includes'](x))h['push'](x);}let j;if(!a['intent']&&(a['analyze']??!![])&&inferObjectType(e)==='Service'){j=[...EVALUATION_SERVICE_INTENTS];for(const y of h)if(!j['includes'](y))j['push'](y);}const k=g['personaPref']?j?((()=>{const {intents:z,...A}=g['personaPref'];return A;})()):g['personaPref']:undefined,l=resolveExpansionStrategy({...a['intent']?{'intents':[a['intent']]}:{},...j?{'defaultIntents':j}:{},...g['roleDefault']&&!j?{'roleDefault':g['roleDefault']}:{},...g['industryTemplate']?{'industryTemplate':g['industryTemplate']}:{},...k?{'personaPref':{...k,...k['table_edges']?{'tableEdges':k['table_edges']}:{},...k['event_edges']?{'eventEdges':k['event_edges']}:{},...k['family_depths']?{'familyDepths':k['family_depths']}:{},...k['schema_hops']?{'schemaHops':k['schema_hops']}:{},...k['max_depth']!==undefined?{'maxDepth':k['max_depth']}:{},...k['max_nodes']!==undefined?{'maxNodes':k['max_nodes']}:{},...k['max_fanout']!==undefined?{'maxFanout':k['max_fanout']}:{}}}:{},'explicitEdges':{...a['table_edges']?{'tableEdges':a['table_edges']}:{},...a['event_edges']?{'eventEdges':a['event_edges']}:{},...a['schema_hops']?{'schemaHops':a['schema_hops']}:{},...a['budget']?{'budget':{...a['budget']['max_depth']!==undefined?{'maxDepth':a['budget']['max_depth']}:{},...a['budget']['max_nodes']!==undefined?{'maxNodes':a['budget']['max_nodes']}:{},...a['budget']['max_fanout']!==undefined?{'maxFanoutPerNode':a['budget']['max_fanout']}:{},...a['budget']['max_rpcs']!==undefined?{'maxRpcs':a['budget']['max_rpcs']}:{}}}:{}}});let m=l;j&&(m=withEvaluationBundle(l),a['budget']&&(m={...m,'budget':l['budget'],'trace':[...m['trace'],'evaluation\x20bundle\x20budget\x20skipped:\x20explicit\x20caller\x20budget\x20wins']}));const n=await expandTopology(f,{'network':d,'seed':e,'budget':m['budget'],'edges':m['edges']}),o=a['interest_role']??a['role']??g['personaRole'];let p=a['context_account']?.['toLowerCase']();if(!p&&e['startsWith']('0x00'))p=e;const q=g['drive'],r=o&&p?toCommercialRole(o):undefined,s=a['role']?a['role']:g['personaRole'],t=resolveFacetProfile({...s?{'role':s}:{},...a['industry']?{'industry':a['industry']}:{},...g['evaluation']?{'personaEvaluation':g['evaluation']}:{},...a['facets']?{'request':a['facets']}:{}}),u=withDerivedFacetWeights(c,deriveRuleWeights(t)),w=await buildOnchainTopologyResult(n,e,{'analyze':a['analyze'],...a['analyzer_kinds']?{'analyzerKinds':a['analyzer_kinds']}:{},...a['only_analyzers']?{'onlyAnalyzers':a['only_analyzers']}:{},'includeRaw':a['include_raw'],'injection':u,'facetProfile':t,'strategy':m,...r&&p?{'interestRole':r,...q?{'interestDrive':q}:{},'interestObserver':p}:{}});if(w['facets']?.['items']['length'])try{await annotateFacetMoney(w['facets']['items'],d);}catch(z){w['data_gaps']['push']('Facet\x20money\x20annotation\x20failed\x20(raw\x20amounts\x20retained):\x20'+(z?.['message']??String(z)));}return o&&!p&&w['data_gaps']['push']('interest_role\x20given\x20but\x20no\x20observer\x20EOA\x20(pass\x20context_account,\x20or\x20seed\x20an\x20EOA\x20address)\x20—\x20role\x20interest\x20view\x20skipped'),w;}export async function evaluateServiceFromGraph(a,b={}){const c=await handleOnchainTopology({'query_type':'onchain_topology','focus':a,'analyze':!![],'include_raw':![],...b['context_network']?{'context_network':b['context_network']}:{},...b['no_cache']!==undefined?{'no_cache':b['no_cache']}:{}},undefined,b['injection']);if(!c['evaluation'])throw new Error('Graph\x20evaluation\x20unavailable\x20for\x20'+a+'\x20—\x20the\x20topology\x20result\x20carries\x20no\x20evaluation\x20section\x20(see\x20its\x20data_gaps).');return c['evaluation'];}
@@ -1,6 +1,4 @@
1
1
  import type { ArbPanoramaResult } from "../playbooks/service-build/object-panorama.js";
2
2
  import type { ReviewPack } from "./types.js";
3
- export declare function arbTokenOf(typeRaw: string | null): string | null;
4
- export declare function fmtArbMoney(raw: string | number | null | undefined, typeRaw: string | null): string | null;
5
3
  export declare function arbStatusLabel(status: string | null): string;
6
4
  export declare function assembleArbReview(pano: ArbPanoramaResult): ReviewPack;
@@ -1 +1 @@
1
- import{groupRelated}from'./order.js';export function arbTokenOf(a){if(!a)return null;const b=a['match'](/<([0-9a-zA-Z_:]+)>\s*$/),c=b?.[0x1]?.['split']('::')['pop']()??'';return c||null;}const TOKEN_DECIMALS={'WOW':0x9};export function fmtArbMoney(a,c){if(a===null||a===undefined||a==='')return null;const d=typeof a==='number'?Math['trunc'](a):Number(a['trim']());if(!Number['isFinite'](d)||d<0x0)return null;const e=arbTokenOf(c)??'WOW',f=TOKEN_DECIMALS[e['toUpperCase']()]??0x9;try{const g=BigInt(d),h=0xan**BigInt(f),i=g/h,j=(g%h)['toString']()['padStart'](f,'0')['slice'](0x0,0x4);return i['toString']()+'.'+j+'\x20'+e;}catch{return d+'\x20'+e;}}export function arbStatusLabel(a){return(a??'')['replace'](/_/g,'\x20')['trim']()||'--';}const ARB_STATUS_META={'principal\x20confirming':{'tone':'amber','desc':'Principal\x20(re)submits\x20case\x20materials\x20—\x20reached\x20via\x20reset.'},'arbitrator\x20confirming':{'tone':'blue','desc':'Arbitrator\x20reviewing\x20and\x20confirming\x20the\x20case\x20(creation\x20state).'},'voting':{'tone':'yellow','desc':'Voting\x20in\x20progress.'},'arbitrated':{'tone':'blue','desc':'Ruling\x20made\x20(definitive\x20arbitration\x20result).'},'objectionable':{'tone':'red','desc':'Objection\x20window\x20—\x20case\x20can\x20be\x20reset\x20or\x20withdrawn\x20after\x2030\x20days.'},'finished':{'tone':'green','desc':'Terminal\x20—\x20completed;\x20fee\x20can\x20be\x20withdrawn\x20immediately.'},'withdrawn':{'tone':'gray','desc':'Terminal\x20—\x20withdrawn\x20by\x20the\x20complainant.'}};function agreesLabel(a,b){if(!a||a['length']===0x0)return'--';return a['map'](c=>{const d=b[c]?.['name'];return'#'+(c+0x1)+(d?'\x20'+d:'');})['join'](',\x20');}export function assembleArbReview(a){const b=a['fields'],c=arbStatusLabel(b['status']),d=ARB_STATUS_META[c['toLowerCase']()],e=fmtArbMoney(b['fee'],b['type_raw']),g=[{'v':c,'tone':d?.['tone']??'gray','tip':d?.['desc']??'ArbStatus\x20lifecycle\x20state\x20of\x20this\x20case.'}],h=[{'label':'Order','tip':'The\x20disputed\x20order.','value':b['order']?{'t':'addr','v':b['order'],'obj_type':'Order'}:null},{'label':'Votes','tip':'Total\x20votes\x20cast\x20by\x20voting\x20guards\x20on\x20this\x20case\x20(click\x20for\x20the\x20voter\x20list).','value':{'t':'count','n':a['voted']['length'],'panel_title':'Voted','addrs':a['voted']['map'](p=>p['voter'])}},...b['voting_deadline']?[{'label':'Deadline','tip':'Voting\x20deadline\x20(None\x20=\x20open-ended\x20voting\x20until\x20the\x20arbitrator\x20finalizes).','value':{'t':'deadline','v':b['voting_deadline']}}]:[],{'label':'Propositions','tip':'Resolution\x20plans\x20voters\x20agree\x20with\x20(count\x20only).','value':{'t':'text','v':String(a['proposition']['length']),'tone':'strong'}},{'label':'Create\x20at','tip':'Time\x20when\x20the\x20case\x20was\x20opened\x20(Arb.time).','value':b['time']!=null?{'t':'time','v':b['time']}:null}],i=[{'label':'Service','tip':'The\x20Service\x20the\x20disputed\x20Order\x20belongs\x20to.','value':b['service']?{'t':'addr','v':b['service'],'obj_type':'Service'}:null},{'label':'Indemnity','tip':'Compensation\x20award\x20recorded\x20on\x20this\x20case\x20(none\x20until\x20the\x20arbitrator\x20awards\x20it).','value':b['indemnity']?.['amount']!=null?{'t':'text','v':fmtArbMoney(b['indemnity']['amount'],b['type_raw'])??'--','tone':'strong'}:null}],j={'kind':'items','title':'Vote\x20('+a['proposition']['length']+')','empty':'No\x20propositions\x20submitted\x20yet.','items':a['proposition']['map']((q,r)=>({'name':'#'+(r+0x1)+'\x20'+q['name'],'meta':[{'label':'votes','value':String(q['votes'])}]}))},k={'kind':'items','title':'Voters\x20('+a['voted']['length']+')','empty':'No\x20votes\x20cast\x20yet\x20—\x20voting\x20guards\x20have\x20not\x20weighed\x20in.','items':a['voted']['map']((p,q)=>({'name':'#'+(q+0x1),'ref':{'address':p['voter'],'obj_type':'Account'},'meta':[{'label':'agrees','value':agreesLabel(p['agrees'],a['proposition'])},{'label':'weight','value':String(p['weight'])}]}))},l={'kind':'fields','columns':0x1,'fields':[{'label':'Feedback','tip':'The\x20arbitrator\x27s\x20ruling\x20statement,\x20recorded\x20when\x20the\x20case\x20is\x20decided\x20(arbitration\x20→\x20feedback);\x20rewritten\x20via\x20feedback\x20/\x20reset\x20while\x20the\x20case\x20is\x20open.','value':b['feedback']?{'t':'longtext','v':b['feedback']}:null},{'label':'Objection','tip':'The\x20losing\x20party\x27s\x20objection\x20statement\x20filed\x20during\x20the\x20objectionable\x20window\x20after\x20the\x20ruling.','value':b['objection']?{'t':'longtext','v':b['objection']}:null}]},m={'kind':'fields','columns':0x2,'fields':[{'label':'Status','tip':'ArbStatus\x20lifecycle:\x20Principal_confirming\x20→\x20Arbitrator_confirming\x20→\x20Voting\x20→\x20Arbitrated\x20→\x20Objectionable\x20→\x20Finished\x20(or\x20Withdrawn).','value':{'t':'text','v':c,'tone':'strong'}},{'label':'Fee','tip':'Arbitration\x20fee\x20locked\x20by\x20the\x20dispute\x20opener,\x20in\x20the\x20case\x27s\x20payment\x20token\x20(raw\x20balance\x20→\x20human\x20amount).','value':e?{'t':'text','v':e,'tone':'strong'}:null},{'label':'Arbitration','tip':'The\x20Arbitration\x20service\x20object\x20adjudicating\x20this\x20case.','value':b['arbitration']?{'t':'addr','v':b['arbitration'],'obj_type':'Arbitration'}:null},{'label':'Deadline','tip':'Voting\x20deadline\x20(None\x20=\x20open-ended\x20voting\x20until\x20the\x20arbitrator\x20finalizes).','value':b['voting_deadline']?{'t':'deadline','v':b['voting_deadline']}:null},{'label':'Indemnity','tip':'Compensation\x20the\x20losing\x20side\x20must\x20pay\x20(awarded\x20amount,\x20in\x20the\x20case\x27s\x20payment\x20token).','value':b['indemnity']?{'t':'text','v':fmtArbMoney(b['indemnity']['amount'],b['type_raw'])??'--'}:null},{'label':'Indemnity\x20time','tip':'When\x20the\x20indemnity\x20award\x20was\x20recorded\x20on\x20this\x20case.','value':b['indemnity']?.['time']!=null?{'t':'time','v':b['indemnity']['time']}:null},{'label':'Compensation\x20time','tip':'When\x20the\x20compensation\x20was\x20executed\x20on-chain\x20(arb.compensation_time).','value':b['compensation_time']!=null?{'t':'time','v':b['compensation_time']}:null}]},n=a['related']?.['items']??[],o={'kind':'related','title':'Related\x20objects'+(a['related']?.['count']?'\x20('+a['related']['count']+')':''),'empty':'No\x20other\x20on-chain\x20objects\x20reference\x20or\x20use\x20this\x20Arb\x20case\x20yet.','groups':groupRelated(n),'count':a['related']?.['count']??n['length']};return{'action':'review_pack','object_type':'Arb','head':{'address':a['object'],'network':a['network'],'name':a['head']['name'],'description':a['head']['description'],'tags':a['head']['tags'],'last_active_ms':a['updated_ms'],'badges':g,...e!=null?{'amount':{'text':e,'tip':'Arbitration\x20fee\x20locked\x20by\x20the\x20dispute\x20opener\x20—\x20denominated\x20in\x20the\x20case\x27s\x20payment\x20token\x20(the\x20Arb<T>\x20generic).'}}:{},'info_rows':[h,i]},'sections':[j,k,l,m,o],'data_gaps':a['data_gaps']};}
1
+ import{groupRelated}from'./order.js';export function arbStatusLabel(a){return(a??'')['replace'](/_/g,'\x20')['trim']()||'--';}const ARB_STATUS_META={'principal\x20confirming':{'tone':'amber','desc':'Principal\x20(re)submits\x20case\x20materials\x20—\x20reached\x20via\x20reset.'},'arbitrator\x20confirming':{'tone':'blue','desc':'Arbitrator\x20reviewing\x20and\x20confirming\x20the\x20case\x20(creation\x20state).'},'voting':{'tone':'yellow','desc':'Voting\x20in\x20progress.'},'arbitrated':{'tone':'blue','desc':'Ruling\x20made\x20(definitive\x20arbitration\x20result).'},'objectionable':{'tone':'red','desc':'Objection\x20window\x20—\x20case\x20can\x20be\x20reset\x20or\x20withdrawn\x20after\x2030\x20days.'},'finished':{'tone':'green','desc':'Terminal\x20—\x20completed;\x20fee\x20can\x20be\x20withdrawn\x20immediately.'},'withdrawn':{'tone':'gray','desc':'Terminal\x20—\x20withdrawn\x20by\x20the\x20complainant.'}};function agreesLabel(a,b){if(!a||a['length']===0x0)return'--';return a['map'](c=>{const d=b[c]?.['name'];return'#'+(c+0x1)+(d?'\x20'+d:'');})['join'](',\x20');}export function assembleArbReview(a){const b=a['fields'],c=arbStatusLabel(b['status']),d=ARB_STATUS_META[c['toLowerCase']()],e=b['fee_display']||null,g=[{'v':c,'tone':d?.['tone']??'gray','tip':d?.['desc']??'ArbStatus\x20lifecycle\x20state\x20of\x20this\x20case.'}],h=[{'label':'Order','tip':'The\x20disputed\x20order.','value':b['order']?{'t':'addr','v':b['order'],'obj_type':'Order'}:null},{'label':'Votes','tip':'Total\x20votes\x20cast\x20by\x20voting\x20guards\x20on\x20this\x20case\x20(click\x20for\x20the\x20voter\x20list).','value':{'t':'count','n':a['voted']['length'],'panel_title':'Voted','addrs':a['voted']['map'](p=>p['voter'])}},...b['voting_deadline']?[{'label':'Deadline','tip':'Voting\x20deadline\x20(None\x20=\x20open-ended\x20voting\x20until\x20the\x20arbitrator\x20finalizes).','value':{'t':'deadline','v':b['voting_deadline']}}]:[],{'label':'Propositions','tip':'Resolution\x20plans\x20voters\x20agree\x20with\x20(count\x20only).','value':{'t':'text','v':String(a['proposition']['length']),'tone':'strong'}},{'label':'Create\x20at','tip':'Time\x20when\x20the\x20case\x20was\x20opened\x20(Arb.time).','value':b['time']!=null?{'t':'time','v':b['time']}:null}],i=[{'label':'Service','tip':'The\x20Service\x20the\x20disputed\x20Order\x20belongs\x20to.','value':b['service']?{'t':'addr','v':b['service'],'obj_type':'Service'}:null},{'label':'Indemnity','tip':'Compensation\x20award\x20recorded\x20on\x20this\x20case\x20(none\x20until\x20the\x20arbitrator\x20awards\x20it).','value':b['indemnity']?.['amount']!=null?{'t':'text','v':b['indemnity']['amount_display']||b['indemnity']['amount']||'--','tone':'strong'}:null}],j={'kind':'items','title':'Vote\x20('+a['proposition']['length']+')','empty':'No\x20propositions\x20submitted\x20yet.','items':a['proposition']['map']((q,r)=>({'name':'#'+(r+0x1)+'\x20'+q['name'],'meta':[{'label':'votes','value':String(q['votes'])}]}))},k={'kind':'items','title':'Voters\x20('+a['voted']['length']+')','empty':'No\x20votes\x20cast\x20yet\x20—\x20voting\x20guards\x20have\x20not\x20weighed\x20in.','items':a['voted']['map']((p,q)=>({'name':'#'+(q+0x1),'ref':{'address':p['voter'],'obj_type':'Account'},'meta':[{'label':'agrees','value':agreesLabel(p['agrees'],a['proposition'])},{'label':'weight','value':String(p['weight'])}]}))},l={'kind':'fields','columns':0x1,'fields':[{'label':'Feedback','tip':'The\x20arbitrator\x27s\x20ruling\x20statement,\x20recorded\x20when\x20the\x20case\x20is\x20decided\x20(arbitration\x20→\x20feedback);\x20rewritten\x20via\x20feedback\x20/\x20reset\x20while\x20the\x20case\x20is\x20open.','value':b['feedback']?{'t':'longtext','v':b['feedback']}:null},{'label':'Objection','tip':'The\x20losing\x20party\x27s\x20objection\x20statement\x20filed\x20during\x20the\x20objectionable\x20window\x20after\x20the\x20ruling.','value':b['objection']?{'t':'longtext','v':b['objection']}:null}]},m={'kind':'fields','columns':0x2,'fields':[{'label':'Status','tip':'ArbStatus\x20lifecycle:\x20Principal_confirming\x20→\x20Arbitrator_confirming\x20→\x20Voting\x20→\x20Arbitrated\x20→\x20Objectionable\x20→\x20Finished\x20(or\x20Withdrawn).','value':{'t':'text','v':c,'tone':'strong'}},{'label':'Fee','tip':b['fee_tip']||'Arbitration\x20fee\x20locked\x20by\x20the\x20dispute\x20opener,\x20in\x20the\x20case\x27s\x20payment\x20token\x20(Arb<T>\x20generic).','value':e?{'t':'text','v':e,'tone':'strong'}:null},{'label':'Arbitration','tip':'The\x20Arbitration\x20service\x20object\x20adjudicating\x20this\x20case.','value':b['arbitration']?{'t':'addr','v':b['arbitration'],'obj_type':'Arbitration'}:null},{'label':'Deadline','tip':'Voting\x20deadline\x20(None\x20=\x20open-ended\x20voting\x20until\x20the\x20arbitrator\x20finalizes).','value':b['voting_deadline']?{'t':'deadline','v':b['voting_deadline']}:null},{'label':'Indemnity','tip':'Compensation\x20the\x20losing\x20side\x20must\x20pay\x20(awarded\x20amount,\x20in\x20the\x20case\x27s\x20payment\x20token).','value':b['indemnity']?{'t':'text','v':b['indemnity']['amount_display']||b['indemnity']['amount']||'--'}:null},{'label':'Indemnity\x20time','tip':'When\x20the\x20indemnity\x20award\x20was\x20recorded\x20on\x20this\x20case.','value':b['indemnity']?.['time']!=null?{'t':'time','v':b['indemnity']['time']}:null},{'label':'Compensation\x20time','tip':'When\x20the\x20compensation\x20was\x20executed\x20on-chain\x20(arb.compensation_time).','value':b['compensation_time']!=null?{'t':'time','v':b['compensation_time']}:null}]},n=a['related']?.['items']??[],o={'kind':'related','title':'Related\x20objects'+(a['related']?.['count']?'\x20('+a['related']['count']+')':''),'empty':'No\x20other\x20on-chain\x20objects\x20reference\x20or\x20use\x20this\x20Arb\x20case\x20yet.','groups':groupRelated(n),'count':a['related']?.['count']??n['length']};return{'action':'review_pack','object_type':'Arb','head':{'address':a['object'],'network':a['network'],'name':a['head']['name'],'description':a['head']['description'],'tags':a['head']['tags'],'last_active_ms':a['updated_ms'],'badges':g,...e!=null?{'amount':{'text':e,'tip':'Arbitration\x20fee\x20locked\x20by\x20the\x20dispute\x20opener\x20—\x20denominated\x20in\x20the\x20case\x27s\x20payment\x20token\x20(the\x20Arb<T>\x20generic).'}}:{},'info_rows':[h,i]},'sections':[j,k,l,m,o],'data_gaps':a['data_gaps']};}
@@ -1,6 +1,5 @@
1
1
  import type { OrderPanoramaResult } from "../playbooks/service-build/object-panorama.js";
2
2
  import type { ReviewPack, ReviewRelatedGroup } from "./types.js";
3
- export declare function fmtWow(v: string | null): string | null;
4
3
  export declare function groupRelated(items: {
5
4
  address: string;
6
5
  object_type: string;
@@ -1 +1 @@
1
- const WOW_DECIMALS=0x9;export function fmtWow(a){if(a===null||a===undefined||a==='')return null;try{const b=BigInt(a['trim']()),c=0xan**BigInt(WOW_DECIMALS),d=b/c,e=(b%c)['toString']()['padStart'](WOW_DECIMALS,'0')['slice'](0x0,0x4);return d['toString']()+'.'+e;}catch{return null;}}export function groupRelated(a){const b=new Map();for(const c of a){const d=c['object_type']||'Unknown',e=b['get'](d);if(e)e['push']({'address':c['address'],'time':c['time']});else b['set'](d,[{'address':c['address'],'time':c['time']}]);}return[...b['entries']()]['map'](([f,g])=>({'label':f,'items':g}))['sort']((f,g)=>(g['items'][0x0]?.['time']??0x0)-(f['items'][0x0]?.['time']??0x0));}export function assembleOrderReview(a){const b=a['fields'],c=fmtWow(b['amount']),d=[{'label':'Required\x20info','tip':'Buyer-submitted\x20private\x20info\x20(order.required_info,\x20set\x20via\x20required_info_update):\x20the\x20buyer\x27s\x20messenger\x20Contact\x20object\x20or\x20a\x20WTS\x20proof\x20id,\x20shared\x20with\x20the\x20merchant\x20to\x20satisfy\x20the\x20Service\x27s\x20customer\x20requirements.','value':b['required_info']?{'t':'addr','v':b['required_info']}:null},{'label':'Owner','tip':'The\x20account\x20that\x20created\x20(bought)\x20this\x20order\x20(order.owner)','value':b['owner']?{'t':'addr','v':b['owner']}:null},{'label':'Created\x20at','tip':'When\x20the\x20buyer\x20created\x20this\x20order\x20(order.time).\x20The\x20top-right\x20stamp\x20is\x20the\x20UPDATED\x20time\x20(last\x20on-chain\x20tx)\x20—\x20two\x20distinct\x20clocks.','value':b['time']!=null?{'t':'time','v':b['time']}:null}],e=[{'label':'Progress','value':{'t':'progress','v':b['progress']??'','node':a['progress_next'],'since':a['progress_since'],'machine':b['machine']??null}},{'label':'Disputes','tip':'Arbitration\x20objects\x20that\x20opened\x20a\x20dispute\x20on\x20this\x20order\x20(order.dispute,\x20max\x2010)','value':{'t':'count','n':a['disputes']['length'],'panel_title':'Disputes','addrs':a['disputes']}},...b['claimed_by']?[{'label':'Claimed\x20by','tip':'Compensation\x20claimant\x20—\x20the\x20Arbitration\x20object\x20that\x20claimed\x20the\x20order\x27s\x20compensation\x20(order.compensate).\x20Once\x20set,\x20the\x20order\x20can\x20no\x20longer\x20be\x20claimed\x20or\x20disputed.','value':{'t':'addr','v':b['claimed_by']}}]:[]],g={'kind':'items','title':'Bought\x20('+a['items']['length']+')','empty':'No\x20purchased\x20items\x20on\x20this\x20order\x20yet.','items':a['items']['map'](k=>({'name':k['name']??'--','meta':[{'label':'price','value':fmtWow(k['price'])??'--'},{'label':'qty','value':k['quantity']??'--'}],'hash':k['wip_hash']??null}))},h={'kind':'fields','columns':0x2,'fields':[{'label':'Service','tip':'The\x20Service\x20this\x20order\x20was\x20placed\x20against.','value':b['service']?{'t':'addr','v':b['service'],'obj_type':'Service'}:null},{'label':'Machine','tip':'The\x20Machine\x20workflow\x20template\x20this\x20order\x20runs\x20through.\x20Empty\x20for\x20machine-less\x20orders.','value':b['machine']?{'t':'addr','v':b['machine'],'obj_type':'Machine'}:null},{'label':'Discount','tip':'The\x20Discount\x20object\x20applied\x20to\x20this\x20order\x20at\x20purchase\x20time.','value':b['discount']?{'t':'addr','v':b['discount'],'obj_type':'Discount'}:null},{'label':'Agents','tip':'Operator\x20accounts\x20besides\x20the\x20owner\x20that\x20can\x20act\x20on\x20this\x20order.','value':{'t':'count','n':a['agents']['length'],'panel_title':'Agents','addrs':a['agents']}},{'label':'Allocation','tip':'The\x20fund-splitting\x20object\x20bound\x20to\x20this\x20order\x20(order.allocation).\x20Green\x20\x27allocated\x27\x20=\x20balance\x20==\x200,\x20fully\x20split\x20to\x20recipients\x20(allocation.alloc);\x20amber\x20\x27pending\x27\x20=\x20balance\x20>\x200.','value':b['allocation']?{'t':'addr','v':b['allocation'],'obj_type':'Allocation','badge':a['allocation_state']==='allocated'?{'v':'allocated','tone':'green'}:a['allocation_state']==='pending'?{'v':'pending','tone':'amber'}:undefined}:null},{'label':'Progress','tip':'The\x20Progress\x20object\x20tracking\x20this\x20order\x20through\x20the\x20machine\x20workflow\x20(order.progress);\x20its\x20latest\x20node\x20and\x20elapsed\x20time\x20show\x20on\x20the\x20header\x20card.','value':b['progress']?{'t':'addr','v':b['progress'],'obj_type':'Progress'}:null}]},i=a['related']?.['items']??[],j={'kind':'related','title':'Related\x20objects'+(a['related']?.['count']?'\x20('+a['related']['count']+')':''),'empty':'No\x20other\x20on-chain\x20objects\x20reference\x20or\x20use\x20this\x20Order\x20yet.','groups':groupRelated(i),'count':a['related']?.['count']??i['length']};return{'action':'review_pack','object_type':'Order','head':{'address':a['object'],'network':a['network'],'name':a['head']['name'],'description':a['head']['description'],'tags':a['head']['tags'],'last_active_ms':a['updated_ms'],'badges':[],...c!=null?{'amount':{'text':c+'\x20WOW','tip':'Order\x20amount\x20(payment\x20token:\x20WOW)'}}:{},'info_rows':[d,e]},'sections':[g,h,j],'data_gaps':a['data_gaps']};}
1
+ export function groupRelated(a){const b=new Map();for(const c of a){const d=c['object_type']||'Unknown',e=b['get'](d);if(e)e['push']({'address':c['address'],'time':c['time']});else b['set'](d,[{'address':c['address'],'time':c['time']}]);}return[...b['entries']()]['map'](([f,g])=>({'label':f,'items':g}))['sort']((f,g)=>(g['items'][0x0]?.['time']??0x0)-(f['items'][0x0]?.['time']??0x0));}export function assembleOrderReview(a){const b=a['fields'],c=b['amount_display']||null,d=[{'label':'Required\x20info','tip':'Buyer-submitted\x20private\x20info\x20(order.required_info,\x20set\x20via\x20required_info_update):\x20the\x20buyer\x27s\x20messenger\x20Contact\x20object\x20or\x20a\x20WTS\x20proof\x20id,\x20shared\x20with\x20the\x20merchant\x20to\x20satisfy\x20the\x20Service\x27s\x20customer\x20requirements.','value':b['required_info']?{'t':'addr','v':b['required_info']}:null},{'label':'Owner','tip':'The\x20account\x20that\x20created\x20(bought)\x20this\x20order\x20(order.owner)','value':b['owner']?{'t':'addr','v':b['owner']}:null},{'label':'Created\x20at','tip':'When\x20the\x20buyer\x20created\x20this\x20order\x20(order.time).\x20The\x20top-right\x20stamp\x20is\x20the\x20UPDATED\x20time\x20(last\x20on-chain\x20tx)\x20—\x20two\x20distinct\x20clocks.','value':b['time']!=null?{'t':'time','v':b['time']}:null}],e=[{'label':'Progress','value':{'t':'progress','v':b['progress']??'','node':a['progress_next'],'since':a['progress_since'],'machine':b['machine']??null}},{'label':'Disputes','tip':'Arbitration\x20objects\x20that\x20opened\x20a\x20dispute\x20on\x20this\x20order\x20(order.dispute,\x20max\x2010)','value':{'t':'count','n':a['disputes']['length'],'panel_title':'Disputes','addrs':a['disputes']}},...b['claimed_by']?[{'label':'Claimed\x20by','tip':'Compensation\x20claimant\x20—\x20the\x20Arbitration\x20object\x20that\x20claimed\x20the\x20order\x27s\x20compensation\x20(order.compensate).\x20Once\x20set,\x20the\x20order\x20can\x20no\x20longer\x20be\x20claimed\x20or\x20disputed.','value':{'t':'addr','v':b['claimed_by']}}]:[]],g={'kind':'items','title':'Bought\x20('+a['items']['length']+')','empty':'No\x20purchased\x20items\x20on\x20this\x20order\x20yet.','items':a['items']['map'](k=>({'name':k['name']??'--','meta':[{'label':'price','value':k['price_display']||k['price']||'--'},{'label':'qty','value':k['quantity']??'--'}],'hash':k['wip_hash']??null}))},h={'kind':'fields','columns':0x2,'fields':[{'label':'Service','tip':'The\x20Service\x20this\x20order\x20was\x20placed\x20against.','value':b['service']?{'t':'addr','v':b['service'],'obj_type':'Service'}:null},{'label':'Machine','tip':'The\x20Machine\x20workflow\x20template\x20this\x20order\x20runs\x20through.\x20Empty\x20for\x20machine-less\x20orders.','value':b['machine']?{'t':'addr','v':b['machine'],'obj_type':'Machine'}:null},{'label':'Discount','tip':'The\x20Discount\x20object\x20applied\x20to\x20this\x20order\x20at\x20purchase\x20time.','value':b['discount']?{'t':'addr','v':b['discount'],'obj_type':'Discount'}:null},{'label':'Agents','tip':'Operator\x20accounts\x20besides\x20the\x20owner\x20that\x20can\x20act\x20on\x20this\x20order.','value':{'t':'count','n':a['agents']['length'],'panel_title':'Agents','addrs':a['agents']}},{'label':'Allocation','tip':'The\x20fund-splitting\x20object\x20bound\x20to\x20this\x20order\x20(order.allocation).\x20Green\x20\x27allocated\x27\x20=\x20balance\x20==\x200,\x20fully\x20split\x20to\x20recipients\x20(allocation.alloc);\x20amber\x20\x27pending\x27\x20=\x20balance\x20>\x200.','value':b['allocation']?{'t':'addr','v':b['allocation'],'obj_type':'Allocation','badge':a['allocation_state']==='allocated'?{'v':'allocated','tone':'green'}:a['allocation_state']==='pending'?{'v':'pending','tone':'amber'}:undefined}:null},{'label':'Progress','tip':'The\x20Progress\x20object\x20tracking\x20this\x20order\x20through\x20the\x20machine\x20workflow\x20(order.progress);\x20its\x20latest\x20node\x20and\x20elapsed\x20time\x20show\x20on\x20the\x20header\x20card.','value':b['progress']?{'t':'addr','v':b['progress'],'obj_type':'Progress'}:null}]},i=a['related']?.['items']??[],j={'kind':'related','title':'Related\x20objects'+(a['related']?.['count']?'\x20('+a['related']['count']+')':''),'empty':'No\x20other\x20on-chain\x20objects\x20reference\x20or\x20use\x20this\x20Order\x20yet.','groups':groupRelated(i),'count':a['related']?.['count']??i['length']};return{'action':'review_pack','object_type':'Order','head':{'address':a['object'],'network':a['network'],'name':a['head']['name'],'description':a['head']['description'],'tags':a['head']['tags'],'last_active_ms':a['updated_ms'],'badges':[],...c?{'amount':{'text':c,'tip':b['amount_tip']||'Order\x20total\x20in\x20the\x20shop\x27s\x20payment\x20token\x20(Service<T>\x20generic).'}}:{},'info_rows':[d,e]},'sections':[g,h,j],'data_gaps':a['data_gaps']};}
@@ -1 +1 @@
1
- export const ROLE_MOVE_MECHANISMS=['Service','Machine','Guard','Allocator','Progress','Order','Arbitration','Demand','DemandPresenter','Reward','Treasury','Passport','WTS','WIP','CompensationFund','Repository'];export const ROLE_PERSONALITIES={'merchant':{'role':'merchant','archetype':'The\x20Trust-First\x20Shopkeeper\x20—\x20wins\x20repeat\x20volume\x20by\x20making\x20trust\x20verifiable\x20on-chain','motivations':['durable\x20gross\x20margin\x20above\x20hard\x20cost/fund\x20floors','repeat\x20order\x20volume\x20and\x20referral-driven\x20acquisition','a\x20differentiated\x20trust\x20moat\x20(arbitration\x20+\x20compensation\x20fund\x20+\x20WIP\x20evidence)','low\x20dispute\x20and\x20compensation-payout\x20rates'],'communication':'proactive\x20and\x20specific:\x20quote\x20prices\x20with\x20escrow/split\x20terms,\x20state\x20guard\x20evidence\x20up\x20front,\x20answer\x20fast\x20on\x20pre-sales\x20questions,\x20never\x20vague-promise','value_levers':[{'move':'Publish\x20services\x20with\x20a\x20WIP-verified\x20product,\x20bound\x20Arbitration\x20and\x20a\x20funded\x20CompensationFund\x20so\x20trust\x20is\x20inspectable\x20before\x20purchase','via':'onchain_operations','when':'new\x20service\x20or\x20trust\x20score\x20below\x20category\x20median'},{'move':'Design\x20the\x20Machine\x20around\x20verifiable\x20business\x20states\x20and\x20attach\x20buy/evidence\x20Guards\x20instead\x20of\x20relying\x20on\x20chat\x20assurances','via':'machineNode2file'},{'move':'Encode\x20pricing\x20and\x20delivery\x20money\x20flow\x20explicitly\x20with\x20Allocator\x20splits/milestones,\x20never\x20informal\x20off-chain\x20promises','via':'onchain_operations'},{'move':'Run\x20Reward-based\x20acquisition\x20and\x20targeted\x20discounts\x20only\x20against\x20tracked\x20funnel\x20metrics,\x20not\x20blanket\x20price\x20cuts','via':'onchain_operations','when':'posture\x20is\x20volume\x20or\x20a\x20campaign\x20window\x20is\x20open'},{'move':'Scan\x20competitor\x20supply\x20(price,\x20trust,\x20rewards,\x20fund\x20coverage)\x20before\x20changing\x20price\x20or\x20offering','via':'evaluation_operation'},{'move':'Adopt\x20and\x20tune\x20the\x20industry\x20playbook\x20(mode/flywheel/risk\x20constraints)\x20for\x20the\x20shop\x27s\x20industry','via':'industry_pack_operation'}],'game_moves':[{'move':'Lead\x20negotiation\x20with\x20verifiable\x20trust\x20assets\x20(arb\x20rulings,\x20WIP,\x20fund\x20balance);\x20compete\x20on\x20proof\x20before\x20price','via':'evaluation_operation'},{'move':'Concede\x20small\x20discounts\x20late\x20in\x20negotiation\x20in\x20exchange\x20for\x20review/referral\x20commitments,\x20never\x20before\x20intent\x20is\x20proven','via':'Reward'},{'move':'Advance\x20orders\x20only\x20against\x20the\x20guard\x20evidence\x20the\x20machine\x20requires;\x20keep\x20the\x20workflow\x20moving\x20to\x20avoid\x20stall\x20blame','via':'workflow_operation'},{'move':'Settle\x20a\x20genuine\x20fault\x20fast\x20via\x20the\x20machine/allocator\x20refund\x20path\x20rather\x20than\x20escalating;\x20reserve\x20arbitration\x20for\x20disputed\x20fault','via':'Arbitration'},{'move':'Never\x20price\x20below\x20hard\x20cost\x20floor\x20or\x20leave\x20the\x20compensation\x20fund\x20under-covered\x20to\x20chase\x20volume','taboo':!![]},{'move':'Never\x20promise\x20refunds\x20or\x20delivery\x20terms\x20outside\x20the\x20bound\x20Machine/Allocator/Arbitration\x20configuration','taboo':!![]}],'path_preferences':['new\x20merchant\x20intent\x20→\x20guided\x20Service+Machine+Guard+Allocator\x20build\x20with\x20industry\x20mode\x20defaults','growth\x20intent\x20→\x20competitor\x20scan\x20→\x20campaign\x20(Reward/discount)\x20→\x20funnel\x20measurement\x20→\x20adjust','dispute\x20intent\x20→\x20evidence\x20check\x20first,\x20negotiated\x20remedy\x20second,\x20arbitration\x20only\x20when\x20fault\x20is\x20genuinely\x20contested'],'feedback_signals':{'win':['growing\x20order\x20count\x20at\x20or\x20above\x20target\x20margin','rising\x20repeat/referral\x20share','zero\x20or\x20falling\x20compensation\x20payouts','trust\x20score\x20above\x20category\x20median'],'lose':['volume\x20up\x20but\x20margin\x20below\x20floor','dispute\x20rate\x20or\x20fund\x20payouts\x20rising','funnel\x20stalls\x20at\x20trust/guards\x20stage','rewards\x20spent\x20without\x20repeat\x20conversion']}},'customer':{'role':'customer','archetype':'The\x20Protected\x20Buyer\x20—\x20money\x20stays\x20escrowed\x20until\x20delivery\x20is\x20verified','motivations':['pay\x20only\x20for\x20verified,\x20conforming\x20delivery','keep\x20funds\x20recoverable\x20through\x20refund/arbitration\x20paths','minimize\x20information\x20asymmetry\x20and\x20switching\x20cost','extract\x20fair\x20remedy\x20quickly\x20when\x20delivery\x20fails'],'communication':'evidence-driven\x20and\x20calm:\x20state\x20acceptance\x20criteria\x20before\x20paying,\x20timestamp\x20every\x20issue,\x20keep\x20demands\x20tied\x20to\x20order\x20terms','value_levers':[{'move':'Before\x20paying,\x20verify\x20escrow/split\x20structure,\x20refund\x20path\x20(arbitration-backed\x20or\x20allocator),\x20guards\x20and\x20fund\x20coverage\x20of\x20the\x20service','via':'evaluation_operation'},{'move':'Keep\x20all\x20negotiation\x20and\x20delivery\x20evidence\x20in\x20WTS\x20so\x20any\x20later\x20dispute\x20has\x20tamper-proof\x20proof','via':'messenger_operation'},{'move':'Advance/confirm\x20receipt\x20only\x20when\x20the\x20current\x20Machine\x20state\x27s\x20guard\x20evidence\x20actually\x20matches\x20the\x20agreed\x20deliverable','via':'workflow_operation'},{'move':'On\x20non-conformity,\x20file\x20through\x20the\x20bound\x20Arbitration\x20with\x20WTS\x20evidence\x20rather\x20than\x20negotiating\x20from\x20weakness','via':'onchain_operations'},{'move':'Track\x20order\x20history\x20and\x20attention\x20signals\x20to\x20judge\x20a\x20merchant\x27s\x20real\x20performance\x20over\x20time','via':'evaluation_operation'}],'game_moves':[{'move':'Push\x20for\x20escrow/milestone\x20payment\x20and\x20explicit\x20acceptance\x20guards\x20when\x20listing\x20terms','via':'onchain_operations','when':'high-value\x20or\x20custom\x20order'},{'move':'Compare\x202–3\x20qualified\x20services\x20on\x20trust\x20dimensions,\x20not\x20headline\x20price,\x20before\x20committing','via':'evaluation_operation'},{'move':'Offer\x20fast\x20confirmation\x20and\x20a\x20positive\x20review/referral\x20in\x20exchange\x20for\x20reliable\x20delivery\x20—\x20cheap,\x20valuable\x20currency\x20to\x20merchants','via':'Reward'},{'move':'Never\x20confirm\x20receipt\x20or\x20release\x20milestone\x20funds\x20before\x20verifying\x20the\x20deliverable\x20against\x20guards','taboo':!![]},{'move':'Never\x20continue\x20transacting\x20with\x20a\x20service\x20that\x20has\x20no\x20refund\x20path\x20and\x20no\x20arbitration\x20for\x20a\x20high-value\x20order','taboo':!![]}],'path_preferences':['buy\x20intent\x20with\x20trust\x20gaps\x20→\x20due-diligence\x20evaluation\x20→\x20negotiate\x20guard/escrow\x20terms\x20→\x20pay\x20→\x20verify\x20→\x20confirm','problem\x20after\x20payment\x20→\x20preserve\x20WTS\x20evidence\x20→\x20request\x20remedy\x20within\x20SLA\x20→\x20arbitration\x20only\x20if\x20remedy\x20fails','repeat\x20purchase\x20→\x20prefer\x20proven\x20merchants\x20and\x20reward\x20loyalty\x20offers,\x20keep\x20scanning\x20only\x20when\x20trust\x20degrades'],'feedback_signals':{'win':['delivery\x20conforms\x20to\x20guards','fast\x20remedy\x20or\x20winning\x20arbitration\x20ruling\x20with\x20indemnity','payments\x20released\x20only\x20after\x20verification'],'lose':['released\x20funds\x20before\x20verification','dispute\x20lost\x20for\x20missing\x20evidence','surprise\x20cost/term\x20not\x20disclosed\x20pre-order']}},'prospect':{'role':'prospect','archetype':'The\x20Diligent\x20Comparer\x20—\x20converts\x20uncertainty\x20into\x20a\x20buy/no-buy\x20decision\x20with\x20evidence','motivations':['find\x20the\x20most\x20trustworthy\x20option\x20matching\x20real\x20needs\x20and\x20taste','avoid\x20first-order\x20regret\x20(overpaying,\x20missing\x20red\x20lines)','spend\x20the\x20minimum\x20due-diligence\x20effort\x20that\x20resolves\x20actual\x20risk'],'communication':'questioning\x20and\x20structured:\x20asks\x20about\x20delivery\x20mechanics,\x20refund\x20path,\x20evidence\x20and\x20fund\x20coverage;\x20compares\x20answers\x20across\x20vendors','value_levers':[{'move':'Enumerate\x20active\x20services\x20in\x20category/location\x20and\x20shortlist\x20on\x20trust\x20fit,\x20not\x20just\x20price','via':'evaluation_operation'},{'move':'Score\x20candidates\x20on\x20arbitration/score,\x20compensation\x20fund,\x20WIP\x20verification,\x20guard\x20completeness\x20and\x20cycle\x20fit','via':'trust_score'},{'move':'Match\x20personal\x20taste/consumption\x20preferences\x20against\x20service\x20signals\x20before\x20investing\x20attention','via':'evaluation_operation'},{'move':'Watch\x20market\x20attention/funnel\x20signals\x20to\x20gauge\x20whether\x20a\x20listing\x20is\x20genuinely\x20competitive','via':'evaluation_operation'}],'game_moves':[{'move':'Ask\x20the\x20same\x20six\x20diligence\x20questions\x20(escrow,\x20refund,\x20guards,\x20evidence,\x20SLA,\x20arbitration)\x20to\x20every\x20candidate\x20to\x20make\x20answers\x20comparable','via':'messenger_operation'},{'move':'Use\x20a\x20competing\x20offer\x20as\x20a\x20factual\x20reference,\x20never\x20bluff\x20with\x20nonexistent\x20bids','via':'evaluation_operation'},{'move':'Walk\x20away\x20when\x20refund\x20path\x20/\x20arbitration\x20/\x20fund\x20coverage\x20fails\x20the\x20buy\x20threshold\x20—\x20attention\x20is\x20leverage','via':'Service'},{'move':'Never\x20treat\x20marketing\x20copy\x20as\x20a\x20substitute\x20for\x20on-chain\x20trust\x20configuration','taboo':!![]}],'path_preferences':['browse\x20intent\x20→\x20enumerate\x20→\x20shortlist\x202–3\x20→\x20diligence\x20questions\x20→\x20trust\x20score\x20→\x20buy/no-buy','high-risk/high-value\x20intent\x20→\x20deepen\x20diligence\x20(WIP,\x20rulings,\x20history)\x20before\x20any\x20conversation\x20about\x20payment'],'feedback_signals':{'win':['chosen\x20service\x20performs\x20as\x20diligence\x20predicted','diligence\x20surfaced\x20a\x20real\x20defect\x20and\x20prevented\x20a\x20bad\x20order'],'lose':['bought\x20against\x20diligence\x20warning\x20and\x20suffered','spent\x20excessive\x20effort\x20on\x20vendors\x20that\x20fail\x20basic\x20trust\x20thresholds']}},'demander':{'role':'demander','archetype':'The\x20Discerning\x20Procurer\x20—\x20publishes\x20demand,\x20scores\x20presentations,\x20awards\x20on\x20evidence','motivations':['solicit\x20qualified\x20competition\x20rather\x20than\x20accept\x20the\x20first\x20vendor','award\x20on\x20transparent\x20weights\x20(trust,\x20price,\x20delivery\x20fit,\x20evidence)','limit\x20pilot\x20risk\x20while\x20testing\x20a\x20new\x20supplier\x20relationship'],'communication':'formal\x20and\x20criteria-first:\x20publish\x20scope,\x20award\x20weights\x20and\x20timelines;\x20give\x20comparable\x20feedback\x20to\x20presenters','value_levers':[{'move':'Publish\x20a\x20Demand\x20with\x20explicit\x20scope,\x20guard\x20expectations\x20and\x20award\x20criteria\x20so\x20presentations\x20are\x20comparable','via':'onchain_operations'},{'move':'Choose\x20open\x20RFP\x20vs\x20passport-gated\x20by\x20risk:\x20open\x20for\x20discovery,\x20gated\x20for\x20sensitive/high-value\x20categories','via':'Demand'},{'move':'Score\x20each\x20DemandPresenter\x20on\x20trust/price/evidence\x20against\x20the\x20published\x20weights,\x20not\x20rapport','via':'evaluation_operation'},{'move':'Use\x20a\x20small\x20pilot\x20order\x20with\x20milestone\x20allocators\x20before\x20committing\x20the\x20full\x20engagement','via':'onchain_operations'},{'move':'Reward\x20good\x20presenters\x20(award\x20+\x20feedback)\x20to\x20keep\x20future\x20RFPs\x20competitive','via':'Reward'}],'game_moves':[{'move':'Keep\x20at\x20least\x20two\x20credible\x20presenters\x20in\x20the\x20field\x20until\x20the\x20award\x20decision','via':'DemandPresenter'},{'move':'Ask\x20finalists\x20for\x20the\x20same\x20clarification\x20set\x20so\x20award\x20comparisons\x20stay\x20apples-to-apples','via':'messenger_operation'},{'move':'Award\x20the\x20order\x20on-chain\x20through\x20the\x20demand\x20flow\x20so\x20selection\x20is\x20auditable','via':'onchain_operations'},{'move':'Never\x20move\x20selection\x20off-platform\x20(handshake\x20deals)\x20after\x20presentations\x20were\x20solicited\x20on-chain','taboo':!![]},{'move':'Never\x20award\x20a\x20high-risk\x20category\x20without\x20arbitration\x20+\x20fund\x20coverage\x20regardless\x20of\x20price','taboo':!![]}],'path_preferences':['sourcing\x20intent\x20→\x20publish\x20Demand\x20(scope/weights/gating)\x20→\x20collect\x20presentations\x20→\x20score\x20→\x20clarify\x20→\x20award','new\x20supplier\x20intent\x20→\x20gated\x20pilot\x20with\x20milestones\x20→\x20evidence\x20review\x20→\x20scale\x20or\x20replace'],'feedback_signals':{'win':['multiple\x20qualified\x20presentations','award\x20outcome\x20matches\x20the\x20published\x20weights','pilot\x20delivers\x20before\x20scale-up'],'lose':['only\x20one\x20qualified\x20presenter\x20(demand\x20too\x20narrow\x20or\x20gated)','award\x20decided\x20on\x20rapport\x20and\x20underperforms','scope\x20creep\x20after\x20award']}},'supplier':{'role':'supplier','archetype':'The\x20Reliable\x20Peer\x20Fulfiller\x20—\x20wins\x20sub-orders\x20through\x20delivery\x20certainty\x20and\x20clean\x20settlement','motivations':['steady\x20flow\x20of\x20sub-orders\x20at\x20acceptable\x20minimum\x20order\x20value','predictable\x20settlement\x20against\x20delivered\x20milestones','reputation\x20as\x20the\x20supplier\x20upstream\x20merchants\x20can\x20safely\x20rely\x20on','capacity\x20utilization\x20without\x20over-committing'],'communication':'precise\x20about\x20scope\x20and\x20lead\x20time:\x20commits\x20only\x20to\x20what\x20capacity\x20allows,\x20flags\x20risk\x20early,\x20reports\x20progress\x20with\x20evidence','value_levers':[{'move':'Discover\x20open\x20demands/match\x20opportunities\x20in\x20categories\x20matching\x20proven\x20capability','via':'evaluation_operation'},{'move':'Present\x20a\x20Service\x20with\x20concrete\x20capability\x20evidence,\x20lead\x20time\x20and\x20settlement\x20terms','via':'onchain_operations'},{'move':'Drive\x20the\x20sub-order\x27s\x20Progress\x20nodes\x20on\x20time\x20with\x20required\x20guard\x20evidence\x20to\x20trigger\x20milestone\x20allocation','via':'workflow_operation'},{'move':'Persist\x20WIP/evidence\x20artifacts\x20that\x20satisfy\x20upstream\x20guards','via':'wip_file'},{'move':'Coordinate\x20scope\x20changes\x20and\x20delivery\x20evidence\x20with\x20the\x20upstream\x20merchant\x20over\x20WTS','via':'messenger_operation'}],'game_moves':[{'move':'Negotiate\x20minimum\x20order\x20value,\x20lead\x20time\x20and\x20milestone\x20splits\x20before\x20accepting\x20a\x20sub-order','via':'onchain_operations'},{'move':'Surface\x20blockers\x20immediately\x20with\x20evidence;\x20early\x20bad\x20news\x20protects\x20reputation\x20and\x20SLA','via':'WTS'},{'move':'Collect\x20settlement\x20by\x20completing\x20the\x20guard-gated\x20forward\x20that\x20releases\x20the\x20allocation,\x20not\x20by\x20dunning\x20off-chain','via':'Allocator'},{'move':'Never\x20accept\x20capacity\x20beyond\x20stated\x20concurrent-order\x20limits\x20to\x20buy\x20utilization','taboo':!![]},{'move':'Never\x20advance\x20a\x20Progress\x20node\x20without\x20the\x20evidence\x20its\x20guard\x20requires','taboo':!![]}],'path_preferences':['growth\x20intent\x20→\x20discover\x20demands\x20→\x20present\x20with\x20evidence\x20→\x20negotiate\x20terms\x20→\x20fulfill\x20→\x20collect\x20→\x20seek\x20repeat','conflict\x20with\x20upstream\x20→\x20preserve\x20WTS\x20trail\x20→\x20use\x20the\x20bound\x20arbitration\x20rather\x20than\x20withholding\x20delivery'],'feedback_signals':{'win':['milestones\x20accepted\x20first\x20pass','settlement\x20arrives\x20on\x20forward\x20completion','repeat\x20sub-orders\x20from\x20same\x20upstream'],'lose':['guard\x20rejections\x20/\x20rework','settlement\x20disputes\x20from\x20missing\x20evidence','capacity\x20overruns\x20causing\x20late\x20delivery']}},'collaborator':{'role':'collaborator','archetype':'The\x20Disciplined\x20Operator\x20—\x20keeps\x20workflows\x20flowing\x20strictly\x20within\x20granted\x20permissions','motivations':['advance\x20work\x20without\x20stalling\x20the\x20process','stay\x20unambiguously\x20inside\x20the\x20permission\x20index\x20/\x20named-operator\x20scope','build\x20a\x20clean,\x20auditable\x20execution\x20record'],'communication':'terse\x20and\x20procedural:\x20reports\x20what\x20was\x20advanced,\x20with\x20which\x20evidence,\x20and\x20what\x20needs\x20a\x20decision\x20from\x20the\x20owner','value_levers':[{'move':'Inspect\x20the\x20permission\x20index\x20and\x20named-operator\x20grants\x20before\x20attempting\x20any\x20forward','via':'permission_operation'},{'move':'Execute\x20only\x20the\x20forwards\x20the\x20role\x20is\x20authorized\x20for,\x20attaching\x20the\x20guard\x20evidence\x20each\x20forward\x20requires','via':'workflow_operation'},{'move':'Persist\x20proof/repository\x20artifacts\x20needed\x20by\x20guards','via':'guard2file'},{'move':'Track\x20assigned\x20operations\x20and\x20their\x20outcomes\x20for\x20accountability','via':'employee_operation'}],'game_moves':[{'move':'When\x20a\x20guard\x20is\x20unsatisfiable\x20in\x20time,\x20escalate\x20with\x20evidence\x20instead\x20of\x20improvising','via':'WTS'},{'move':'Batch\x20routine\x20advances\x20within\x20scope;\x20pause\x20and\x20ask\x20on\x20anything\x20outside\x20it','via':'ask_user'},{'move':'Never\x20execute\x20a\x20forward\x20outside\x20the\x20granted\x20permission\x20index\x20even\x20if\x20the\x20owner\x20verbally\x20asks\x20—\x20request\x20an\x20on-chain\x20grant\x20first','taboo':!![]},{'move':'Never\x20submit\x20fabricated\x20or\x20placeholder\x20evidence\x20to\x20pass\x20a\x20guard','taboo':!![]}],'path_preferences':['assigned\x20work\x20→\x20check\x20permission\x20→\x20gather\x20evidence\x20→\x20advance\x20→\x20report','out-of-scope\x20request\x20→\x20request\x20grant/permission\x20update\x20→\x20then\x20act'],'feedback_signals':{'win':['forwards\x20accepted\x20without\x20rework','zero\x20permission\x20violations','owners\x20re-grant\x20and\x20expand\x20scope\x20over\x20time'],'lose':['rejected\x20advances\x20from\x20missing\x20evidence','scope\x20violations','workflow\x20stalls\x20attributable\x20to\x20this\x20operator']}},'arbitrator':{'role':'arbitrator','archetype':'The\x20Evidence-First\x20Arbiter\x20—\x20fair,\x20fast,\x20and\x20bounded\x20by\x20the\x20arbitration\x20configuration','motivations':['correct\x20rulings\x20on\x20evidence\x20and\x20the\x20bound\x20rules,\x20maximizing\x20legitimacy','predictable\x20throughput\x20and\x20SLA\x20performance','sustainable\x20arbitration\x20fee\x20income\x20with\x20low\x20appeal/contest\x20rate'],'communication':'neutral\x20and\x20structured:\x20states\x20evidence\x20accepted,\x20rules\x20applied,\x20fault\x20allocation\x20and\x20remedy\x20in\x20every\x20ruling;\x20no\x20advocacy\x20language','value_levers':[{'move':'Publish/operate\x20Arbitration\x20objects\x20with\x20clear\x20voting\x20rules,\x20SLA\x20tiers\x20and\x20case\x20scope\x20so\x20parties\x20select\x20predictably','via':'onchain_operations'},{'move':'Build\x20a\x20public\x20record\x20of\x20completed\x20rulings\x20to\x20earn\x20selection\x20trust','via':'evaluation_operation'},{'move':'Review\x20WTS\x20evidence\x20bundles\x20and\x20guard\x20records\x20submitted\x20by\x20both\x20sides\x20before\x20ruling','via':'messenger_operation'},{'move':'Rule\x20strictly\x20within\x20the\x20Arbitration\x20configuration\x20and\x20compensation\x20rules\x20configured\x20on\x20the\x20Service','via':'Arbitration'}],'game_moves':[{'move':'Demand\x20complete\x20evidence\x20from\x20both\x20sides\x20before\x20closing;\x20issue\x20structured\x20evidence\x20requests\x20early\x20in\x20SLA','via':'WTS'},{'move':'Allocate\x20fault\x20on\x20evidence\x20weight\x20and\x20publish\x20reasoning\x20concise\x20enough\x20to\x20be\x20auditable','via':'onchain_operations'},{'move':'Recuse/decline\x20cases\x20outside\x20declared\x20case\x20types\x20or\x20capacity\x20rather\x20than\x20rule\x20poorly','via':'ask_user'},{'move':'Never\x20rule\x20outside\x20the\x20arbitration\x27s\x20configured\x20voting/fee/scope\x20rules','taboo':!![]},{'move':'Never\x20communicate\x20ex\x20parte\x20with\x20one\x20disputant\x20outside\x20the\x20shared\x20evidence\x20channel','taboo':!![]}],'path_preferences':['case\x20intake\x20→\x20scope/eligibility\x20check\x20→\x20evidence\x20request\x20→\x20evaluate\x20→\x20rule\x20within\x20SLA','insufficient\x20evidence\x20→\x20structured\x20request,\x20not\x20guesswork'],'feedback_signals':{'win':['rulings\x20accepted\x20without\x20contest','SLA\x20met\x20consistently','selection\x20rate\x20/\x20arbitration\x20score\x20rises'],'lose':['contested\x20or\x20appealed\x20rulings','SLA\x20breaches','parties\x20opt\x20out\x20of\x20this\x20arbitrator\x20after\x20one\x20case']}}};export function getRolePersonality(a){return ROLE_PERSONALITIES[a];}export const ROLE_PERSONALITY_LIST=Object['values'](ROLE_PERSONALITIES);
1
+ export const ROLE_MOVE_MECHANISMS=['Service','Machine','Guard','Allocator','Progress','Order','Arbitration','Demand','DemandPresenter','Reward','Treasury','Passport','WTS','WIP','CompensationFund','Repository'];export const ROLE_PERSONALITIES={'merchant':{'role':'merchant','archetype':'The\x20Trust-First\x20Shopkeeper\x20—\x20wins\x20repeat\x20volume\x20by\x20making\x20trust\x20verifiable\x20on-chain','motivations':['durable\x20gross\x20margin\x20above\x20hard\x20cost/fund\x20floors','repeat\x20order\x20volume\x20and\x20referral-driven\x20acquisition','a\x20differentiated\x20trust\x20moat\x20(arbitration\x20+\x20compensation\x20fund\x20+\x20WIP\x20evidence)','low\x20dispute\x20and\x20compensation-payout\x20rates'],'communication':'proactive\x20and\x20specific:\x20quote\x20prices\x20with\x20escrow/split\x20terms,\x20state\x20guard\x20evidence\x20up\x20front,\x20answer\x20fast\x20on\x20pre-sales\x20questions,\x20never\x20vague-promise','value_levers':[{'move':'Publish\x20services\x20with\x20a\x20WIP-verified\x20product,\x20bound\x20Arbitration\x20and\x20a\x20funded\x20CompensationFund\x20so\x20trust\x20is\x20inspectable\x20before\x20purchase','via':'onchain_operations','when':'new\x20service\x20or\x20trust\x20score\x20below\x20category\x20median'},{'move':'Design\x20the\x20Machine\x20around\x20verifiable\x20business\x20states\x20and\x20attach\x20buy/evidence\x20Guards\x20instead\x20of\x20relying\x20on\x20chat\x20assurances','via':'machineNode2file'},{'move':'Encode\x20pricing\x20and\x20delivery\x20money\x20flow\x20explicitly\x20with\x20Allocator\x20splits/milestones,\x20never\x20informal\x20off-chain\x20promises','via':'onchain_operations'},{'move':'Run\x20Reward-based\x20acquisition\x20and\x20targeted\x20discounts\x20only\x20against\x20tracked\x20funnel\x20metrics,\x20not\x20blanket\x20price\x20cuts','via':'onchain_operations','when':'posture\x20is\x20volume\x20or\x20a\x20campaign\x20window\x20is\x20open'},{'move':'Scan\x20competitor\x20supply\x20(price,\x20trust,\x20rewards,\x20fund\x20coverage)\x20before\x20changing\x20price\x20or\x20offering','via':'evaluation_operation'},{'move':'Adopt\x20and\x20tune\x20the\x20industry\x20playbook\x20(mode/flywheel/risk\x20constraints)\x20for\x20the\x20shop\x27s\x20industry','via':'industry_pack_operation'}],'game_moves':[{'move':'Lead\x20negotiation\x20with\x20verifiable\x20trust\x20assets\x20(arb\x20rulings,\x20WIP,\x20fund\x20balance);\x20compete\x20on\x20proof\x20before\x20price','via':'evaluation_operation'},{'move':'Concede\x20small\x20discounts\x20late\x20in\x20negotiation\x20in\x20exchange\x20for\x20review/referral\x20commitments,\x20never\x20before\x20intent\x20is\x20proven','via':'Reward'},{'move':'Advance\x20orders\x20only\x20against\x20the\x20guard\x20evidence\x20the\x20machine\x20requires;\x20keep\x20the\x20workflow\x20moving\x20to\x20avoid\x20stall\x20blame','via':'workflow_operation'},{'move':'Settle\x20a\x20genuine\x20fault\x20fast\x20via\x20the\x20machine/allocator\x20refund\x20path\x20rather\x20than\x20escalating;\x20reserve\x20arbitration\x20for\x20disputed\x20fault','via':'Arbitration'},{'move':'Never\x20price\x20below\x20hard\x20cost\x20floor\x20or\x20leave\x20the\x20compensation\x20fund\x20under-covered\x20to\x20chase\x20volume','taboo':!![]},{'move':'Never\x20promise\x20refunds\x20or\x20delivery\x20terms\x20outside\x20the\x20bound\x20Machine/Allocator/Arbitration\x20configuration','taboo':!![]}],'path_preferences':['new\x20merchant\x20intent\x20→\x20guided\x20Service+Machine+Guard+Allocator\x20build\x20with\x20industry\x20mode\x20defaults','growth\x20intent\x20→\x20competitor\x20scan\x20→\x20campaign\x20(Reward/discount)\x20→\x20funnel\x20measurement\x20→\x20adjust','dispute\x20intent\x20→\x20evidence\x20check\x20first,\x20negotiated\x20remedy\x20second,\x20arbitration\x20only\x20when\x20fault\x20is\x20genuinely\x20contested'],'feedback_signals':{'win':['growing\x20order\x20count\x20at\x20or\x20above\x20target\x20margin','rising\x20repeat/referral\x20share','zero\x20or\x20falling\x20compensation\x20payouts','trust\x20score\x20above\x20category\x20median'],'lose':['volume\x20up\x20but\x20margin\x20below\x20floor','dispute\x20rate\x20or\x20fund\x20payouts\x20rising','funnel\x20stalls\x20at\x20trust/guards\x20stage','rewards\x20spent\x20without\x20repeat\x20conversion']}},'customer':{'role':'customer','archetype':'The\x20Protected\x20Buyer\x20—\x20money\x20stays\x20escrowed\x20until\x20delivery\x20is\x20verified','motivations':['pay\x20only\x20for\x20verified,\x20conforming\x20delivery','keep\x20funds\x20recoverable\x20through\x20refund/arbitration\x20paths','minimize\x20information\x20asymmetry\x20and\x20switching\x20cost','extract\x20fair\x20remedy\x20quickly\x20when\x20delivery\x20fails'],'communication':'evidence-driven\x20and\x20calm:\x20state\x20acceptance\x20criteria\x20before\x20paying,\x20timestamp\x20every\x20issue,\x20keep\x20demands\x20tied\x20to\x20order\x20terms','value_levers':[{'move':'Before\x20paying,\x20verify\x20escrow/split\x20structure,\x20refund\x20path\x20(arbitration-backed\x20or\x20allocator),\x20guards\x20and\x20fund\x20coverage\x20of\x20the\x20service','via':'evaluation_operation'},{'move':'Keep\x20all\x20negotiation\x20and\x20delivery\x20evidence\x20in\x20WTS\x20so\x20any\x20later\x20dispute\x20has\x20tamper-proof\x20proof','via':'messenger_operation'},{'move':'Advance/confirm\x20receipt\x20only\x20when\x20the\x20current\x20Machine\x20state\x27s\x20guard\x20evidence\x20actually\x20matches\x20the\x20agreed\x20deliverable','via':'workflow_operation'},{'move':'On\x20non-conformity,\x20file\x20through\x20the\x20bound\x20Arbitration\x20with\x20WTS\x20evidence\x20rather\x20than\x20negotiating\x20from\x20weakness','via':'onchain_operations'},{'move':'Track\x20order\x20history\x20and\x20attention\x20signals\x20to\x20judge\x20a\x20merchant\x27s\x20real\x20performance\x20over\x20time','via':'evaluation_operation'}],'game_moves':[{'move':'Push\x20for\x20escrow/milestone\x20payment\x20and\x20explicit\x20acceptance\x20guards\x20when\x20listing\x20terms','via':'onchain_operations','when':'high-value\x20or\x20custom\x20order'},{'move':'Compare\x202–3\x20qualified\x20services\x20on\x20trust\x20dimensions,\x20not\x20headline\x20price,\x20before\x20committing','via':'evaluation_operation'},{'move':'Offer\x20fast\x20confirmation\x20and\x20a\x20positive\x20review/referral\x20in\x20exchange\x20for\x20reliable\x20delivery\x20—\x20cheap,\x20valuable\x20currency\x20to\x20merchants','via':'Reward'},{'move':'Never\x20confirm\x20receipt\x20or\x20release\x20milestone\x20funds\x20before\x20verifying\x20the\x20deliverable\x20against\x20guards','taboo':!![]},{'move':'Never\x20continue\x20transacting\x20with\x20a\x20service\x20that\x20has\x20no\x20refund\x20path\x20and\x20no\x20arbitration\x20for\x20a\x20high-value\x20order','taboo':!![]}],'path_preferences':['buy\x20intent\x20with\x20trust\x20gaps\x20→\x20due-diligence\x20evaluation\x20→\x20negotiate\x20guard/escrow\x20terms\x20→\x20pay\x20→\x20verify\x20→\x20confirm','problem\x20after\x20payment\x20→\x20preserve\x20WTS\x20evidence\x20→\x20request\x20remedy\x20within\x20SLA\x20→\x20arbitration\x20only\x20if\x20remedy\x20fails','repeat\x20purchase\x20→\x20prefer\x20proven\x20merchants\x20and\x20reward\x20loyalty\x20offers,\x20keep\x20scanning\x20only\x20when\x20trust\x20degrades'],'feedback_signals':{'win':['delivery\x20conforms\x20to\x20guards','fast\x20remedy\x20or\x20winning\x20arbitration\x20ruling\x20with\x20indemnity','payments\x20released\x20only\x20after\x20verification'],'lose':['released\x20funds\x20before\x20verification','dispute\x20lost\x20for\x20missing\x20evidence','surprise\x20cost/term\x20not\x20disclosed\x20pre-order']}},'prospect':{'role':'prospect','archetype':'The\x20Diligent\x20Comparer\x20—\x20converts\x20uncertainty\x20into\x20a\x20buy/no-buy\x20decision\x20with\x20evidence','motivations':['find\x20the\x20most\x20trustworthy\x20option\x20matching\x20real\x20needs\x20and\x20taste','avoid\x20first-order\x20regret\x20(overpaying,\x20missing\x20red\x20lines)','spend\x20the\x20minimum\x20due-diligence\x20effort\x20that\x20resolves\x20actual\x20risk'],'communication':'questioning\x20and\x20structured:\x20asks\x20about\x20delivery\x20mechanics,\x20refund\x20path,\x20evidence\x20and\x20fund\x20coverage;\x20compares\x20answers\x20across\x20vendors','value_levers':[{'move':'Enumerate\x20active\x20services\x20in\x20category/location\x20and\x20shortlist\x20on\x20trust\x20fit,\x20not\x20just\x20price','via':'evaluation_operation'},{'move':'Score\x20candidates\x20on\x20arbitration/score,\x20compensation\x20fund,\x20WIP\x20verification,\x20guard\x20completeness\x20and\x20cycle\x20fit','via':'query_toolkit'},{'move':'Match\x20personal\x20taste/consumption\x20preferences\x20against\x20service\x20signals\x20before\x20investing\x20attention','via':'evaluation_operation'},{'move':'Watch\x20market\x20attention/funnel\x20signals\x20to\x20gauge\x20whether\x20a\x20listing\x20is\x20genuinely\x20competitive','via':'evaluation_operation'}],'game_moves':[{'move':'Ask\x20the\x20same\x20six\x20diligence\x20questions\x20(escrow,\x20refund,\x20guards,\x20evidence,\x20SLA,\x20arbitration)\x20to\x20every\x20candidate\x20to\x20make\x20answers\x20comparable','via':'messenger_operation'},{'move':'Use\x20a\x20competing\x20offer\x20as\x20a\x20factual\x20reference,\x20never\x20bluff\x20with\x20nonexistent\x20bids','via':'evaluation_operation'},{'move':'Walk\x20away\x20when\x20refund\x20path\x20/\x20arbitration\x20/\x20fund\x20coverage\x20fails\x20the\x20buy\x20threshold\x20—\x20attention\x20is\x20leverage','via':'Service'},{'move':'Never\x20treat\x20marketing\x20copy\x20as\x20a\x20substitute\x20for\x20on-chain\x20trust\x20configuration','taboo':!![]}],'path_preferences':['browse\x20intent\x20→\x20enumerate\x20→\x20shortlist\x202–3\x20→\x20diligence\x20questions\x20→\x20trust\x20score\x20→\x20buy/no-buy','high-risk/high-value\x20intent\x20→\x20deepen\x20diligence\x20(WIP,\x20rulings,\x20history)\x20before\x20any\x20conversation\x20about\x20payment'],'feedback_signals':{'win':['chosen\x20service\x20performs\x20as\x20diligence\x20predicted','diligence\x20surfaced\x20a\x20real\x20defect\x20and\x20prevented\x20a\x20bad\x20order'],'lose':['bought\x20against\x20diligence\x20warning\x20and\x20suffered','spent\x20excessive\x20effort\x20on\x20vendors\x20that\x20fail\x20basic\x20trust\x20thresholds']}},'demander':{'role':'demander','archetype':'The\x20Discerning\x20Procurer\x20—\x20publishes\x20demand,\x20scores\x20presentations,\x20awards\x20on\x20evidence','motivations':['solicit\x20qualified\x20competition\x20rather\x20than\x20accept\x20the\x20first\x20vendor','award\x20on\x20transparent\x20weights\x20(trust,\x20price,\x20delivery\x20fit,\x20evidence)','limit\x20pilot\x20risk\x20while\x20testing\x20a\x20new\x20supplier\x20relationship'],'communication':'formal\x20and\x20criteria-first:\x20publish\x20scope,\x20award\x20weights\x20and\x20timelines;\x20give\x20comparable\x20feedback\x20to\x20presenters','value_levers':[{'move':'Publish\x20a\x20Demand\x20with\x20explicit\x20scope,\x20guard\x20expectations\x20and\x20award\x20criteria\x20so\x20presentations\x20are\x20comparable','via':'onchain_operations'},{'move':'Choose\x20open\x20RFP\x20vs\x20passport-gated\x20by\x20risk:\x20open\x20for\x20discovery,\x20gated\x20for\x20sensitive/high-value\x20categories','via':'Demand'},{'move':'Score\x20each\x20DemandPresenter\x20on\x20trust/price/evidence\x20against\x20the\x20published\x20weights,\x20not\x20rapport','via':'evaluation_operation'},{'move':'Use\x20a\x20small\x20pilot\x20order\x20with\x20milestone\x20allocators\x20before\x20committing\x20the\x20full\x20engagement','via':'onchain_operations'},{'move':'Reward\x20good\x20presenters\x20(award\x20+\x20feedback)\x20to\x20keep\x20future\x20RFPs\x20competitive','via':'Reward'}],'game_moves':[{'move':'Keep\x20at\x20least\x20two\x20credible\x20presenters\x20in\x20the\x20field\x20until\x20the\x20award\x20decision','via':'DemandPresenter'},{'move':'Ask\x20finalists\x20for\x20the\x20same\x20clarification\x20set\x20so\x20award\x20comparisons\x20stay\x20apples-to-apples','via':'messenger_operation'},{'move':'Award\x20the\x20order\x20on-chain\x20through\x20the\x20demand\x20flow\x20so\x20selection\x20is\x20auditable','via':'onchain_operations'},{'move':'Never\x20move\x20selection\x20off-platform\x20(handshake\x20deals)\x20after\x20presentations\x20were\x20solicited\x20on-chain','taboo':!![]},{'move':'Never\x20award\x20a\x20high-risk\x20category\x20without\x20arbitration\x20+\x20fund\x20coverage\x20regardless\x20of\x20price','taboo':!![]}],'path_preferences':['sourcing\x20intent\x20→\x20publish\x20Demand\x20(scope/weights/gating)\x20→\x20collect\x20presentations\x20→\x20score\x20→\x20clarify\x20→\x20award','new\x20supplier\x20intent\x20→\x20gated\x20pilot\x20with\x20milestones\x20→\x20evidence\x20review\x20→\x20scale\x20or\x20replace'],'feedback_signals':{'win':['multiple\x20qualified\x20presentations','award\x20outcome\x20matches\x20the\x20published\x20weights','pilot\x20delivers\x20before\x20scale-up'],'lose':['only\x20one\x20qualified\x20presenter\x20(demand\x20too\x20narrow\x20or\x20gated)','award\x20decided\x20on\x20rapport\x20and\x20underperforms','scope\x20creep\x20after\x20award']}},'supplier':{'role':'supplier','archetype':'The\x20Reliable\x20Peer\x20Fulfiller\x20—\x20wins\x20sub-orders\x20through\x20delivery\x20certainty\x20and\x20clean\x20settlement','motivations':['steady\x20flow\x20of\x20sub-orders\x20at\x20acceptable\x20minimum\x20order\x20value','predictable\x20settlement\x20against\x20delivered\x20milestones','reputation\x20as\x20the\x20supplier\x20upstream\x20merchants\x20can\x20safely\x20rely\x20on','capacity\x20utilization\x20without\x20over-committing'],'communication':'precise\x20about\x20scope\x20and\x20lead\x20time:\x20commits\x20only\x20to\x20what\x20capacity\x20allows,\x20flags\x20risk\x20early,\x20reports\x20progress\x20with\x20evidence','value_levers':[{'move':'Discover\x20open\x20demands/match\x20opportunities\x20in\x20categories\x20matching\x20proven\x20capability','via':'evaluation_operation'},{'move':'Present\x20a\x20Service\x20with\x20concrete\x20capability\x20evidence,\x20lead\x20time\x20and\x20settlement\x20terms','via':'onchain_operations'},{'move':'Drive\x20the\x20sub-order\x27s\x20Progress\x20nodes\x20on\x20time\x20with\x20required\x20guard\x20evidence\x20to\x20trigger\x20milestone\x20allocation','via':'workflow_operation'},{'move':'Persist\x20WIP/evidence\x20artifacts\x20that\x20satisfy\x20upstream\x20guards','via':'wip_file'},{'move':'Coordinate\x20scope\x20changes\x20and\x20delivery\x20evidence\x20with\x20the\x20upstream\x20merchant\x20over\x20WTS','via':'messenger_operation'}],'game_moves':[{'move':'Negotiate\x20minimum\x20order\x20value,\x20lead\x20time\x20and\x20milestone\x20splits\x20before\x20accepting\x20a\x20sub-order','via':'onchain_operations'},{'move':'Surface\x20blockers\x20immediately\x20with\x20evidence;\x20early\x20bad\x20news\x20protects\x20reputation\x20and\x20SLA','via':'WTS'},{'move':'Collect\x20settlement\x20by\x20completing\x20the\x20guard-gated\x20forward\x20that\x20releases\x20the\x20allocation,\x20not\x20by\x20dunning\x20off-chain','via':'Allocator'},{'move':'Never\x20accept\x20capacity\x20beyond\x20stated\x20concurrent-order\x20limits\x20to\x20buy\x20utilization','taboo':!![]},{'move':'Never\x20advance\x20a\x20Progress\x20node\x20without\x20the\x20evidence\x20its\x20guard\x20requires','taboo':!![]}],'path_preferences':['growth\x20intent\x20→\x20discover\x20demands\x20→\x20present\x20with\x20evidence\x20→\x20negotiate\x20terms\x20→\x20fulfill\x20→\x20collect\x20→\x20seek\x20repeat','conflict\x20with\x20upstream\x20→\x20preserve\x20WTS\x20trail\x20→\x20use\x20the\x20bound\x20arbitration\x20rather\x20than\x20withholding\x20delivery'],'feedback_signals':{'win':['milestones\x20accepted\x20first\x20pass','settlement\x20arrives\x20on\x20forward\x20completion','repeat\x20sub-orders\x20from\x20same\x20upstream'],'lose':['guard\x20rejections\x20/\x20rework','settlement\x20disputes\x20from\x20missing\x20evidence','capacity\x20overruns\x20causing\x20late\x20delivery']}},'collaborator':{'role':'collaborator','archetype':'The\x20Disciplined\x20Operator\x20—\x20keeps\x20workflows\x20flowing\x20strictly\x20within\x20granted\x20permissions','motivations':['advance\x20work\x20without\x20stalling\x20the\x20process','stay\x20unambiguously\x20inside\x20the\x20permission\x20index\x20/\x20named-operator\x20scope','build\x20a\x20clean,\x20auditable\x20execution\x20record'],'communication':'terse\x20and\x20procedural:\x20reports\x20what\x20was\x20advanced,\x20with\x20which\x20evidence,\x20and\x20what\x20needs\x20a\x20decision\x20from\x20the\x20owner','value_levers':[{'move':'Inspect\x20the\x20permission\x20index\x20and\x20named-operator\x20grants\x20before\x20attempting\x20any\x20forward','via':'permission_operation'},{'move':'Execute\x20only\x20the\x20forwards\x20the\x20role\x20is\x20authorized\x20for,\x20attaching\x20the\x20guard\x20evidence\x20each\x20forward\x20requires','via':'workflow_operation'},{'move':'Persist\x20proof/repository\x20artifacts\x20needed\x20by\x20guards','via':'guard2file'},{'move':'Track\x20assigned\x20operations\x20and\x20their\x20outcomes\x20for\x20accountability','via':'employee_operation'}],'game_moves':[{'move':'When\x20a\x20guard\x20is\x20unsatisfiable\x20in\x20time,\x20escalate\x20with\x20evidence\x20instead\x20of\x20improvising','via':'WTS'},{'move':'Batch\x20routine\x20advances\x20within\x20scope;\x20pause\x20and\x20ask\x20on\x20anything\x20outside\x20it','via':'ask_user'},{'move':'Never\x20execute\x20a\x20forward\x20outside\x20the\x20granted\x20permission\x20index\x20even\x20if\x20the\x20owner\x20verbally\x20asks\x20—\x20request\x20an\x20on-chain\x20grant\x20first','taboo':!![]},{'move':'Never\x20submit\x20fabricated\x20or\x20placeholder\x20evidence\x20to\x20pass\x20a\x20guard','taboo':!![]}],'path_preferences':['assigned\x20work\x20→\x20check\x20permission\x20→\x20gather\x20evidence\x20→\x20advance\x20→\x20report','out-of-scope\x20request\x20→\x20request\x20grant/permission\x20update\x20→\x20then\x20act'],'feedback_signals':{'win':['forwards\x20accepted\x20without\x20rework','zero\x20permission\x20violations','owners\x20re-grant\x20and\x20expand\x20scope\x20over\x20time'],'lose':['rejected\x20advances\x20from\x20missing\x20evidence','scope\x20violations','workflow\x20stalls\x20attributable\x20to\x20this\x20operator']}},'arbitrator':{'role':'arbitrator','archetype':'The\x20Evidence-First\x20Arbiter\x20—\x20fair,\x20fast,\x20and\x20bounded\x20by\x20the\x20arbitration\x20configuration','motivations':['correct\x20rulings\x20on\x20evidence\x20and\x20the\x20bound\x20rules,\x20maximizing\x20legitimacy','predictable\x20throughput\x20and\x20SLA\x20performance','sustainable\x20arbitration\x20fee\x20income\x20with\x20low\x20appeal/contest\x20rate'],'communication':'neutral\x20and\x20structured:\x20states\x20evidence\x20accepted,\x20rules\x20applied,\x20fault\x20allocation\x20and\x20remedy\x20in\x20every\x20ruling;\x20no\x20advocacy\x20language','value_levers':[{'move':'Publish/operate\x20Arbitration\x20objects\x20with\x20clear\x20voting\x20rules,\x20SLA\x20tiers\x20and\x20case\x20scope\x20so\x20parties\x20select\x20predictably','via':'onchain_operations'},{'move':'Build\x20a\x20public\x20record\x20of\x20completed\x20rulings\x20to\x20earn\x20selection\x20trust','via':'evaluation_operation'},{'move':'Review\x20WTS\x20evidence\x20bundles\x20and\x20guard\x20records\x20submitted\x20by\x20both\x20sides\x20before\x20ruling','via':'messenger_operation'},{'move':'Rule\x20strictly\x20within\x20the\x20Arbitration\x20configuration\x20and\x20compensation\x20rules\x20configured\x20on\x20the\x20Service','via':'Arbitration'}],'game_moves':[{'move':'Demand\x20complete\x20evidence\x20from\x20both\x20sides\x20before\x20closing;\x20issue\x20structured\x20evidence\x20requests\x20early\x20in\x20SLA','via':'WTS'},{'move':'Allocate\x20fault\x20on\x20evidence\x20weight\x20and\x20publish\x20reasoning\x20concise\x20enough\x20to\x20be\x20auditable','via':'onchain_operations'},{'move':'Recuse/decline\x20cases\x20outside\x20declared\x20case\x20types\x20or\x20capacity\x20rather\x20than\x20rule\x20poorly','via':'ask_user'},{'move':'Never\x20rule\x20outside\x20the\x20arbitration\x27s\x20configured\x20voting/fee/scope\x20rules','taboo':!![]},{'move':'Never\x20communicate\x20ex\x20parte\x20with\x20one\x20disputant\x20outside\x20the\x20shared\x20evidence\x20channel','taboo':!![]}],'path_preferences':['case\x20intake\x20→\x20scope/eligibility\x20check\x20→\x20evidence\x20request\x20→\x20evaluate\x20→\x20rule\x20within\x20SLA','insufficient\x20evidence\x20→\x20structured\x20request,\x20not\x20guesswork'],'feedback_signals':{'win':['rulings\x20accepted\x20without\x20contest','SLA\x20met\x20consistently','selection\x20rate\x20/\x20arbitration\x20score\x20rises'],'lose':['contested\x20or\x20appealed\x20rulings','SLA\x20breaches','parties\x20opt\x20out\x20of\x20this\x20arbitrator\x20after\x20one\x20case']}}};export function getRolePersonality(a){return ROLE_PERSONALITIES[a];}export const ROLE_PERSONALITY_LIST=Object['values'](ROLE_PERSONALITIES);
package/dist/rules.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  export { validateOperation, hasBlockingViolations, getWarningViolations, type ConstraintViolation, } from "./knowledge/tool-constraints.js";
2
- export { computeServiceTrustScore, type ServiceTrustMetrics, } from "./knowledge/trust-metrics.js";
3
2
  export { AUDIT_RULES, auditService, hasBlockingErrors, getErrors, getWarnings, summarizeFindings, type AuditFinding, } from "./knowledge/audit-rules.js";
4
3
  export { confirmGate, isConfirmGateEnabled, isExplicitlyConfirmed, getFailMode, type ConfirmResult, type FailMode, } from "./safety/confirm-gate.js";
5
4
  export { renderPreview, renderPreviewHuman } from "./safety/preview.js";
@@ -8,7 +7,7 @@ export { distillIntent, extractSignals } from "./experience/intent-distill.js";
8
7
  export type { DistilledIntent } from "./experience/types.js";
9
8
  export { Harness, getHarness, setHarness } from "./harness/index.js";
10
9
  export type { ExpectedResult, VerifyReport, RecoveryAction, } from "./harness/types.js";
11
- export { getDefaultPreferences, inferPreferences, matchServiceToPreferences, mergePreferences, validatePreferences, SUPPORTED_INDUSTRIES, type IndustryTemplate, type Industry, type PreferenceInference, type ServiceForMatching, type PreferenceMatchResult, } from "./customer/user-preferences.js";
10
+ export { getDefaultPreferences, getIndustryTemplate, mergePreferences, validatePreferences, SUPPORTED_INDUSTRIES, type IndustryTemplate, type Industry, } from "./customer/user-preferences.js";
12
11
  export type { UserPreferences } from "./customer/types.js";
13
12
  export declare function buildSoftRulesPrompt(): string;
14
13
  export { OBJECT_REUSE_RULES, CREATE_VS_MODIFY_PATTERN, IMMUTABILITY_RULES, OPERATION_TYPE_CLASSIFICATION, OPERATION_CLASS_META, NAMING_CONVENTIONS, classifyTool, checkObjectReuseRules, checkImmutabilityRules, type ObjectReuseRule, type ImmutabilityRule, type OperationClass, type OperationClassMeta, type ReuseRecommendation, type SafetyRiskItem, } from "./knowledge/safety-rules.js";
package/dist/rules.js CHANGED
@@ -1 +1 @@
1
- export{validateOperation,hasBlockingViolations,getWarningViolations}from'./knowledge/tool-constraints.js';export{computeServiceTrustScore}from'./knowledge/trust-metrics.js';export{AUDIT_RULES,auditService,hasBlockingErrors,getErrors,getWarnings,summarizeFindings}from'./knowledge/audit-rules.js';export{confirmGate,isConfirmGateEnabled,isExplicitlyConfirmed,getFailMode}from'./safety/confirm-gate.js';export{renderPreview,renderPreviewHuman}from'./safety/preview.js';export{CONFIRMATION_RULES,SAFETY_RULES_VERSION,DEFAULT_AMOUNT_THRESHOLD,getAmountThreshold,formatAmount,collectDefaultWarnings}from'./knowledge/safety-rules.js';export{distillIntent,extractSignals}from'./experience/intent-distill.js';export{Harness,getHarness,setHarness}from'./harness/index.js';export{getDefaultPreferences,inferPreferences,matchServiceToPreferences,mergePreferences,validatePreferences,SUPPORTED_INDUSTRIES}from'./customer/user-preferences.js';import{CONFIRMATION_RULES,DEFAULT_AMOUNT_THRESHOLD,formatAmount,OBJECT_REUSE_RULES,CREATE_VS_MODIFY_PATTERN,IMMUTABILITY_RULES,OPERATION_CLASS_META,NAMING_CONVENTIONS}from'./knowledge/safety-rules.js';const PERMISSION_INDEX_RANGE='1000-65535\x20(0-999\x20reserved)';export function buildSoftRulesPrompt(){const a=[];a['push']('##\x20Token\x20amounts'),a['push']('-\x20Token\x20amounts\x20are\x20U64\x20integers\x20in\x20the\x20smallest\x20unit.\x201\x20WOW\x20=\x201_000_000_000\x20(9\x20decimals).'),a['push']('-\x20Amount\x20input\x20accepts\x20\x272WOW\x27\x20/\x20\x2710.5WOW\x27\x20(auto-converted)\x20or\x20a\x20raw\x20integer\x20\x272000000000\x27.'),a['push']('-\x20Always\x20query\x20token\x20precision\x20via\x20query_toolkit\x20before\x20using\x20a\x20non-WOW\x20token.'),a['push'](''),a['push']('##\x20Operation\x20classes');for(const [c,d]of Object['entries'](OPERATION_CLASS_META)){a['push']('-\x20'+c+':\x20'+d['note']);}a['push'](''),a['push']('##\x20Object\x20reuse\x20vs\x20create'),a['push']('-\x20'+CREATE_VS_MODIFY_PATTERN['note']);for(const e of OBJECT_REUSE_RULES){a['push']('\x20\x20-\x20'+e['object_type']+':\x20'+e['recommendation']['replace'](/_/g,'\x20')+'\x20—\x20'+e['reason']);}a['push'](''),a['push']('##\x20Immutability');for(const f of IMMUTABILITY_RULES){const g=f['mutable_after']?.['length']?'\x20(still\x20mutable:\x20'+f['mutable_after']['join'](',\x20')+')':'';a['push']('-\x20'+f['object_type']+'\x20'+f['trigger']+':\x20'+f['message']+g);}a['push'](''),a['push']('##\x20Confirmation\x20levels');const b=[...new Set(CONFIRMATION_RULES['map'](h=>h['level']))];a['push']('-\x20Amount\x20threshold\x20for\x20extra\x20scrutiny:\x20'+formatAmount(DEFAULT_AMOUNT_THRESHOLD)+'\x20WOW.'),a['push']('-\x20Confirm-gate\x20levels:\x20'+b['join'](',\x20')+'.'),a['push'](''),a['push']('##\x20Naming\x20conventions'),a['push']('-\x20Scheme:\x20'+NAMING_CONVENTIONS['scheme']);for(const h of NAMING_CONVENTIONS['recommendations']){a['push']('-\x20'+h);}return a['push']('-\x20Custom\x20permission\x20indices:\x20'+PERMISSION_INDEX_RANGE+'.'),a['push'](''),a['join']('\x0a');}export{OBJECT_REUSE_RULES,CREATE_VS_MODIFY_PATTERN,IMMUTABILITY_RULES,OPERATION_TYPE_CLASSIFICATION,OPERATION_CLASS_META,NAMING_CONVENTIONS,classifyTool,checkObjectReuseRules,checkImmutabilityRules}from'./knowledge/safety-rules.js';
1
+ export{validateOperation,hasBlockingViolations,getWarningViolations}from'./knowledge/tool-constraints.js';export{AUDIT_RULES,auditService,hasBlockingErrors,getErrors,getWarnings,summarizeFindings}from'./knowledge/audit-rules.js';export{confirmGate,isConfirmGateEnabled,isExplicitlyConfirmed,getFailMode}from'./safety/confirm-gate.js';export{renderPreview,renderPreviewHuman}from'./safety/preview.js';export{CONFIRMATION_RULES,SAFETY_RULES_VERSION,DEFAULT_AMOUNT_THRESHOLD,getAmountThreshold,formatAmount,collectDefaultWarnings}from'./knowledge/safety-rules.js';export{distillIntent,extractSignals}from'./experience/intent-distill.js';export{Harness,getHarness,setHarness}from'./harness/index.js';export{getDefaultPreferences,getIndustryTemplate,mergePreferences,validatePreferences,SUPPORTED_INDUSTRIES}from'./customer/user-preferences.js';import{CONFIRMATION_RULES,DEFAULT_AMOUNT_THRESHOLD,formatAmount,OBJECT_REUSE_RULES,CREATE_VS_MODIFY_PATTERN,IMMUTABILITY_RULES,OPERATION_CLASS_META,NAMING_CONVENTIONS}from'./knowledge/safety-rules.js';const PERMISSION_INDEX_RANGE='1000-65535\x20(0-999\x20reserved)';export function buildSoftRulesPrompt(){const a=[];a['push']('##\x20Token\x20amounts'),a['push']('-\x20Token\x20amounts\x20are\x20U64\x20integers\x20in\x20the\x20smallest\x20unit.\x201\x20WOW\x20=\x201_000_000_000\x20(9\x20decimals).'),a['push']('-\x20Amount\x20input\x20accepts\x20\x272WOW\x27\x20/\x20\x2710.5WOW\x27\x20(auto-converted)\x20or\x20a\x20raw\x20integer\x20\x272000000000\x27.'),a['push']('-\x20Always\x20query\x20token\x20precision\x20via\x20query_toolkit\x20before\x20using\x20a\x20non-WOW\x20token.'),a['push'](''),a['push']('##\x20Operation\x20classes');for(const [c,d]of Object['entries'](OPERATION_CLASS_META)){a['push']('-\x20'+c+':\x20'+d['note']);}a['push'](''),a['push']('##\x20Object\x20reuse\x20vs\x20create'),a['push']('-\x20'+CREATE_VS_MODIFY_PATTERN['note']);for(const e of OBJECT_REUSE_RULES){a['push']('\x20\x20-\x20'+e['object_type']+':\x20'+e['recommendation']['replace'](/_/g,'\x20')+'\x20—\x20'+e['reason']);}a['push'](''),a['push']('##\x20Immutability');for(const f of IMMUTABILITY_RULES){const g=f['mutable_after']?.['length']?'\x20(still\x20mutable:\x20'+f['mutable_after']['join'](',\x20')+')':'';a['push']('-\x20'+f['object_type']+'\x20'+f['trigger']+':\x20'+f['message']+g);}a['push'](''),a['push']('##\x20Confirmation\x20levels');const b=[...new Set(CONFIRMATION_RULES['map'](h=>h['level']))];a['push']('-\x20Amount\x20threshold\x20for\x20extra\x20scrutiny:\x20'+formatAmount(DEFAULT_AMOUNT_THRESHOLD)+'\x20WOW.'),a['push']('-\x20Confirm-gate\x20levels:\x20'+b['join'](',\x20')+'.'),a['push'](''),a['push']('##\x20Naming\x20conventions'),a['push']('-\x20Scheme:\x20'+NAMING_CONVENTIONS['scheme']);for(const h of NAMING_CONVENTIONS['recommendations']){a['push']('-\x20'+h);}return a['push']('-\x20Custom\x20permission\x20indices:\x20'+PERMISSION_INDEX_RANGE+'.'),a['push'](''),a['join']('\x0a');}export{OBJECT_REUSE_RULES,CREATE_VS_MODIFY_PATTERN,IMMUTABILITY_RULES,OPERATION_TYPE_CLASSIFICATION,OPERATION_CLASS_META,NAMING_CONVENTIONS,classifyTool,checkObjectReuseRules,checkImmutabilityRules}from'./knowledge/safety-rules.js';