@wowok/agent-mcp 2.7.10 → 3.0.1

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 (334) hide show
  1. package/dist/communication/evidence.d.ts +6 -0
  2. package/dist/communication/evidence.js +1 -0
  3. package/dist/evaluation/acceptance.d.ts +24 -0
  4. package/dist/evaluation/acceptance.js +1 -0
  5. package/dist/evaluation/builtins/demand-match.d.ts +3 -2
  6. package/dist/evaluation/builtins/demand-match.js +1 -1
  7. package/dist/evaluation/builtins/service-risk.d.ts +2 -1
  8. package/dist/evaluation/builtins/service-risk.js +1 -1
  9. package/dist/evaluation/index.d.ts +1 -0
  10. package/dist/evaluation/index.js +1 -1
  11. package/dist/evaluation/match-operation.d.ts +14 -0
  12. package/dist/evaluation/match-operation.js +1 -0
  13. package/dist/experience/realtime-feedback.js +1 -1
  14. package/dist/extensions/capability-manifest.d.ts +1 -82
  15. package/dist/extensions/capability-manifest.js +1 -1
  16. package/dist/extensions/constraint-registry.d.ts +6 -4
  17. package/dist/extensions/constraint-registry.js +1 -1
  18. package/dist/extensions/index.d.ts +4 -5
  19. package/dist/extensions/index.js +1 -1
  20. package/dist/extensions/industry-pack.js +1 -1
  21. package/dist/extensions/metric-registry.d.ts +6 -4
  22. package/dist/extensions/metric-registry.js +1 -1
  23. package/dist/extensions/mode-evaluator.d.ts +2 -3
  24. package/dist/extensions/mode-evaluator.js +1 -1
  25. package/dist/extensions/modes.js +1 -1
  26. package/dist/extensions/registry.d.ts +3 -25
  27. package/dist/extensions/registry.js +1 -1
  28. package/dist/extensions/types.d.ts +0 -68
  29. package/dist/goal/GoalClassifier.js +1 -1
  30. package/dist/goal/GoalEngine.d.ts +44 -1
  31. package/dist/goal/GoalEngine.js +1 -1
  32. package/dist/goal/types.d.ts +5 -1
  33. package/dist/harness/auto-escalation.d.ts +0 -12
  34. package/dist/harness/auto-escalation.js +1 -1
  35. package/dist/harness/index.d.ts +1 -14
  36. package/dist/harness/index.js +1 -1
  37. package/dist/harness/types.d.ts +0 -38
  38. package/dist/keeper/KeeperScan.d.ts +39 -0
  39. package/dist/keeper/KeeperScan.js +1 -0
  40. package/dist/keeper/KeeperStore.d.ts +43 -0
  41. package/dist/keeper/KeeperStore.js +1 -0
  42. package/dist/keeper/detectors.d.ts +23 -0
  43. package/dist/keeper/detectors.js +1 -0
  44. package/dist/keeper/keeper.spec.d.ts +1 -0
  45. package/dist/keeper/keeper.spec.js +1 -0
  46. package/dist/keeper/types.d.ts +65 -0
  47. package/dist/keeper/types.js +1 -0
  48. package/dist/knowledge/account-marks.d.ts +1 -0
  49. package/dist/knowledge/account-marks.js +1 -1
  50. package/dist/knowledge/demand-risk.js +1 -1
  51. package/dist/knowledge/event-semantics.d.ts +3 -0
  52. package/dist/knowledge/event-semantics.js +1 -1
  53. package/dist/knowledge/event-semantics.spec.d.ts +1 -0
  54. package/dist/knowledge/event-semantics.spec.js +1 -0
  55. package/dist/knowledge/evidence-review.d.ts +23 -0
  56. package/dist/knowledge/evidence-review.js +1 -1
  57. package/dist/knowledge/examples-scanner-cli.js +1 -1
  58. package/dist/knowledge/examples-scanner.js +1 -1
  59. package/dist/knowledge/fund-layer.d.ts +13 -9
  60. package/dist/knowledge/fund-layer.js +1 -1
  61. package/dist/knowledge/goal-completion.js +1 -1
  62. package/dist/knowledge/guard-bindings.d.ts +21 -0
  63. package/dist/knowledge/guard-bindings.js +1 -0
  64. package/dist/knowledge/guard-bytecode-spec.d.ts +82 -0
  65. package/dist/knowledge/guard-bytecode-spec.js +1 -0
  66. package/dist/knowledge/guard-design-patterns.d.ts +1 -1
  67. package/dist/knowledge/guard-design-patterns.js +1 -1
  68. package/dist/knowledge/index.d.ts +13 -7
  69. package/dist/knowledge/index.js +1 -1
  70. package/dist/knowledge/industry-registry.js +1 -1
  71. package/dist/knowledge/mcp-schema-audit-cli.js +1 -1
  72. package/dist/knowledge/mcp-schema-audit.js +1 -1
  73. package/dist/knowledge/reward-risk.d.ts +1 -1
  74. package/dist/knowledge/reward-risk.js +1 -1
  75. package/dist/knowledge/safety-rules.d.ts +2 -1
  76. package/dist/knowledge/safety-rules.js +1 -1
  77. package/dist/knowledge/scenario-modes.d.ts +1 -1
  78. package/dist/knowledge/scenario-modes.js +1 -1
  79. package/dist/knowledge/scenario-topology.d.ts +43 -0
  80. package/dist/knowledge/scenario-topology.js +1 -0
  81. package/dist/knowledge/supply-chain.js +1 -1
  82. package/dist/knowledge/template-registry.js +1 -1
  83. package/dist/knowledge/tools-reference.js +1 -1
  84. package/dist/knowledge/workflow-guidance.d.ts +55 -0
  85. package/dist/knowledge/workflow-guidance.js +1 -1
  86. package/dist/knowledge/workspace-lists.d.ts +1 -0
  87. package/dist/knowledge/workspace-lists.js +1 -1
  88. package/dist/monitor/MonitorLoop.d.ts +3 -0
  89. package/dist/monitor/MonitorLoop.js +1 -1
  90. package/dist/monitor/ScopeResolver.js +1 -1
  91. package/dist/monitor/SuggestionBridge.d.ts +38 -0
  92. package/dist/monitor/SuggestionBridge.js +1 -0
  93. package/dist/monitor/SuggestionBridge.spec.d.ts +1 -0
  94. package/dist/monitor/SuggestionBridge.spec.js +1 -0
  95. package/dist/monitor/types.d.ts +0 -1
  96. package/dist/monitor/types.js +1 -1
  97. package/dist/participation/arbitrator-interest.d.ts +20 -0
  98. package/dist/participation/arbitrator-interest.js +1 -0
  99. package/dist/participation/demander-interest.d.ts +23 -0
  100. package/dist/participation/demander-interest.js +1 -0
  101. package/dist/participation/employee-kpi.d.ts +12 -0
  102. package/dist/participation/employee-kpi.js +1 -1
  103. package/dist/participation/employee-kpi.spec.d.ts +1 -0
  104. package/dist/participation/employee-kpi.spec.js +1 -0
  105. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  106. package/dist/playbooks/service-build/context-assembly.js +1 -1
  107. package/dist/playbooks/service-build/machine-nodes.js +1 -1
  108. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  109. package/dist/playbooks/service-build/merchant-guide.d.ts +20 -0
  110. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  111. package/dist/playbooks/service-build/mode-actions.d.ts +30 -12
  112. package/dist/playbooks/service-build/mode-actions.js +1 -1
  113. package/dist/playbooks/service-build/object-panorama.js +1 -1
  114. package/dist/playbooks/service-build/participation-radar.js +1 -1
  115. package/dist/playbooks/service-build/relationship-profile.d.ts +2 -0
  116. package/dist/playbooks/service-build/relationship-profile.js +1 -0
  117. package/dist/playbooks/service-build/semantic-graph.d.ts +5 -1
  118. package/dist/playbooks/service-build/semantic-graph.js +1 -1
  119. package/dist/playbooks/service-build/service-panorama.js +1 -1
  120. package/dist/relationship/derivation.d.ts +94 -0
  121. package/dist/relationship/derivation.js +1 -0
  122. package/dist/relationship/derivation.spec.d.ts +1 -0
  123. package/dist/relationship/derivation.spec.js +1 -0
  124. package/dist/relationship/incentive.d.ts +38 -0
  125. package/dist/relationship/incentive.js +1 -0
  126. package/dist/relationship/index.d.ts +4 -0
  127. package/dist/relationship/index.js +1 -0
  128. package/dist/relationship/registry.d.ts +13 -0
  129. package/dist/relationship/registry.js +1 -0
  130. package/dist/relationship/types.d.ts +45 -0
  131. package/dist/relationship/types.js +1 -0
  132. package/dist/review/progress.js +1 -1
  133. package/dist/role/index.d.ts +2 -2
  134. package/dist/role/index.js +1 -1
  135. package/dist/role/model.d.ts +2 -1
  136. package/dist/role/model.js +1 -1
  137. package/dist/role/types.d.ts +5 -0
  138. package/dist/rules.d.ts +1 -1
  139. package/dist/safety/confirm-gate.js +1 -1
  140. package/dist/safety/preview.js +1 -1
  141. package/dist/schema/call/bridge.d.ts +25 -3
  142. package/dist/schema/call/bridge.js +1 -1
  143. package/dist/schema/call/semantic.js +1 -1
  144. package/dist/schema/common/index.js +1 -1
  145. package/dist/schema/employee/index.d.ts +61 -1
  146. package/dist/schema/employee/index.js +1 -1
  147. package/dist/schema/evaluation/index.d.ts +70 -5
  148. package/dist/schema/evaluation/index.js +1 -1
  149. package/dist/schema/goal/index.d.ts +40 -14
  150. package/dist/schema/goal/index.js +1 -1
  151. package/dist/schema/goal/planning.d.ts +6 -6
  152. package/dist/schema/index.d.ts +1 -0
  153. package/dist/schema/index.js +1 -1
  154. package/dist/schema/industry-pack/index.d.ts +59 -7
  155. package/dist/schema/industry-pack/index.js +1 -1
  156. package/dist/schema/industry-pack/modes.d.ts +59 -7
  157. package/dist/schema/industry-pack/modes.js +1 -1
  158. package/dist/schema/intent-radar/index.d.ts +19 -19
  159. package/dist/schema/keeper/index.d.ts +475 -0
  160. package/dist/schema/keeper/index.js +1 -0
  161. package/dist/schema/local/index.d.ts +11 -0
  162. package/dist/schema/local/index.js +1 -1
  163. package/dist/schema/messenger/index.d.ts +2 -0
  164. package/dist/schema/messenger/index.js +1 -1
  165. package/dist/schema/operations.d.ts +64 -16
  166. package/dist/schema/persona/index.d.ts +1 -1
  167. package/dist/schema/query/bi.d.ts +244 -16
  168. package/dist/schema/query/bi.js +1 -1
  169. package/dist/schema/query/index.d.ts +2 -2
  170. package/dist/schema/schema-query/index.d.ts +2 -11
  171. package/dist/schema/schema-query/index.js +1 -1
  172. package/dist/schema/schema-version.js +1 -1
  173. package/dist/schema/utils/skills-recommendation.js +1 -1
  174. package/dist/schema/watch/index.d.ts +4 -0
  175. package/dist/schema/watch/index.js +1 -1
  176. package/dist/schema-query-impl/index.d.ts +33 -14
  177. package/dist/schema-query-impl/index.js +1 -1
  178. package/dist/schemas/account_operation.output.json +29 -0
  179. package/dist/schemas/account_operation.schema.json +6 -2
  180. package/dist/schemas/bridge_operation.output.json +24 -1
  181. package/dist/schemas/bridge_operation.schema.json +73 -1
  182. package/dist/schemas/employee_operation.output.json +100 -0
  183. package/dist/schemas/employee_operation.schema.json +148 -5
  184. package/dist/schemas/evaluation_operation.output.json +135 -9
  185. package/dist/schemas/evaluation_operation.schema.json +176 -7
  186. package/dist/schemas/goal_operation.schema.json +76 -0
  187. package/dist/schemas/index.json +7 -1
  188. package/dist/schemas/industry_pack_operation.output.json +172 -27
  189. package/dist/schemas/industry_pack_operation.schema.json +19 -0
  190. package/dist/schemas/keeper_operation.output.json +1274 -0
  191. package/dist/schemas/keeper_operation.schema.json +359 -0
  192. package/dist/schemas/messenger_operation.schema.json +8 -0
  193. package/dist/schemas/onchain_events.output.json +1 -1
  194. package/dist/schemas/onchain_operations.schema.json +41 -41
  195. package/dist/schemas/onchain_operations_allocation.schema.json +4 -4
  196. package/dist/schemas/onchain_operations_arbitration.schema.json +3 -3
  197. package/dist/schemas/onchain_operations_contact.schema.json +2 -2
  198. package/dist/schemas/onchain_operations_demand.schema.json +2 -2
  199. package/dist/schemas/onchain_operations_machine.schema.json +2 -2
  200. package/dist/schemas/onchain_operations_order.schema.json +2 -2
  201. package/dist/schemas/onchain_operations_payment.schema.json +1 -1
  202. package/dist/schemas/onchain_operations_permission.schema.json +2 -2
  203. package/dist/schemas/onchain_operations_progress.schema.json +2 -2
  204. package/dist/schemas/onchain_operations_repository.schema.json +2 -2
  205. package/dist/schemas/onchain_operations_reward.schema.json +6 -6
  206. package/dist/schemas/onchain_operations_service.schema.json +7 -7
  207. package/dist/schemas/onchain_operations_treasury.schema.json +6 -6
  208. package/dist/schemas/onchain_table_data.output.json +71 -0
  209. package/dist/schemas/query_toolkit.output.json +485 -7
  210. package/dist/schemas/query_toolkit.schema.json +71 -0
  211. package/dist/schemas/schema_query.output.json +1 -64
  212. package/dist/schemas/schema_query.schema.json +18 -3
  213. package/dist/schemas/watch_operation.output.json +21 -1
  214. package/dist/task/ProcessStore.d.ts +18 -1
  215. package/dist/task/ProcessStore.js +1 -1
  216. package/dist/task/playbook.js +1 -1
  217. package/dist/task/types.d.ts +24 -0
  218. package/dist/tools/handlers/bridge.js +1 -1
  219. package/dist/tools/handlers/config.js +1 -1
  220. package/dist/tools/handlers/employee.d.ts +6 -0
  221. package/dist/tools/handlers/employee.js +1 -1
  222. package/dist/tools/handlers/employee.spec.d.ts +1 -0
  223. package/dist/tools/handlers/employee.spec.js +1 -0
  224. package/dist/tools/handlers/evaluation.js +1 -1
  225. package/dist/tools/handlers/evaluation.spec.d.ts +1 -0
  226. package/dist/tools/handlers/evaluation.spec.js +1 -0
  227. package/dist/tools/handlers/goal.js +1 -1
  228. package/dist/tools/handlers/industry-pack.js +1 -1
  229. package/dist/tools/handlers/keeper.d.ts +12 -0
  230. package/dist/tools/handlers/keeper.js +1 -0
  231. package/dist/tools/handlers/local.d.ts +4 -3
  232. package/dist/tools/handlers/local.js +1 -1
  233. package/dist/tools/handlers/messenger.js +1 -1
  234. package/dist/tools/handlers/onchain.js +1 -1
  235. package/dist/tools/handlers/permission.js +1 -1
  236. package/dist/tools/handlers/query.js +1 -1
  237. package/dist/tools/handlers/schema-query.js +1 -1
  238. package/dist/tools/handlers/watch.js +1 -1
  239. package/dist/tools/handlers/workflow.js +1 -1
  240. package/dist/tools/index.js +1 -1
  241. package/dist/tools/registry/agent.d.ts +2 -0
  242. package/dist/tools/registry/agent.js +1 -0
  243. package/dist/tools/registry/bridge.d.ts +2 -0
  244. package/dist/tools/registry/bridge.js +1 -0
  245. package/dist/tools/registry/business.d.ts +2 -0
  246. package/dist/tools/registry/business.js +1 -0
  247. package/dist/tools/registry/config.d.ts +2 -0
  248. package/dist/tools/registry/config.js +1 -0
  249. package/dist/tools/registry/files.d.ts +2 -0
  250. package/dist/tools/registry/files.js +1 -0
  251. package/dist/tools/registry/identity.d.ts +2 -0
  252. package/dist/tools/registry/identity.js +1 -0
  253. package/dist/tools/registry/local.d.ts +2 -0
  254. package/dist/tools/registry/local.js +1 -0
  255. package/dist/tools/registry/messenger.d.ts +2 -0
  256. package/dist/tools/registry/messenger.js +1 -0
  257. package/dist/tools/registry/monitor.d.ts +2 -0
  258. package/dist/tools/registry/monitor.js +1 -0
  259. package/dist/tools/registry/onchain.d.ts +2 -0
  260. package/dist/tools/registry/onchain.js +1 -0
  261. package/dist/tools/registry/query.d.ts +2 -0
  262. package/dist/tools/registry/query.js +1 -0
  263. package/dist/tools/registry/trust.d.ts +2 -0
  264. package/dist/tools/registry/trust.js +1 -0
  265. package/dist/tools/rules-hook.d.ts +1 -0
  266. package/dist/tools/rules-hook.js +1 -1
  267. package/dist/tools/shared.js +1 -1
  268. package/dist/tools/wrap.js +1 -1
  269. package/package.json +2 -2
  270. package/dist/examples/arbitration-dispute-create.json +0 -41
  271. package/dist/examples/arbitration-vote-weighted.json +0 -35
  272. package/dist/examples/arbitration-voting-guard-add.json +0 -38
  273. package/dist/examples/demand-present-service.json +0 -33
  274. package/dist/examples/education-contact-create.json +0 -40
  275. package/dist/examples/freelance-contact-create.json +0 -40
  276. package/dist/examples/gen-passport-verify-guard.json +0 -48
  277. package/dist/examples/guard-template-balance-check.json +0 -59
  278. package/dist/examples/guard-template-time-lock.json +0 -60
  279. package/dist/examples/insurance-guard-claim-timelock.json +0 -75
  280. package/dist/examples/insurance-guard-withdraw-allocation.json +0 -96
  281. package/dist/examples/insurance-machine-create.json +0 -75
  282. package/dist/examples/insurance-service-allocators.json +0 -55
  283. package/dist/examples/machine-multisig-threshold.json +0 -87
  284. package/dist/examples/machine-publish.json +0 -30
  285. package/dist/examples/machine-template-7node-rental.json +0 -119
  286. package/dist/examples/payment-scenario-bound.json +0 -45
  287. package/dist/examples/rental-ziroom-machine-create.json +0 -148
  288. package/dist/examples/rental-ziroom-permission-create.json +0 -41
  289. package/dist/examples/rental-ziroom-service-create.json +0 -36
  290. package/dist/examples/retail-adv-guard-customer-win-create.json +0 -80
  291. package/dist/examples/retail-adv-guard-messenger-proof-create.json +0 -65
  292. package/dist/examples/retail-adv-guard-reward-timeout-create.json +0 -92
  293. package/dist/examples/retail-adv-reward-guard-add.json +0 -51
  294. package/dist/examples/retail-myshop-allocation-activate.json +0 -55
  295. package/dist/examples/retail-myshop-arbitration-create.json +0 -40
  296. package/dist/examples/retail-myshop-contact-create.json +0 -43
  297. package/dist/examples/retail-myshop-order-create.json +0 -56
  298. package/dist/examples/retail-myshop-progress-operate.json +0 -38
  299. package/dist/examples/retail-myshop-reward-create.json +0 -35
  300. package/dist/examples/retail-myshop-service-create.json +0 -38
  301. package/dist/examples/retail-myshop-service-customer-required.json +0 -31
  302. package/dist/examples/service-discount-issue.json +0 -46
  303. package/dist/examples/subscription-contact-create.json +0 -40
  304. package/dist/examples/threebody-guard-create.json +0 -56
  305. package/dist/examples/threebody-machine-create.json +0 -71
  306. package/dist/examples/threebody-permission-create.json +0 -38
  307. package/dist/examples/threebody-service-allocators.json +0 -48
  308. package/dist/examples/travel-guard-time-lock.json +0 -69
  309. package/dist/examples/travel-guard-weather-oracle.json +0 -70
  310. package/dist/examples/travel-machine-create.json +0 -135
  311. package/dist/examples/travel-repository-create.json +0 -47
  312. package/dist/examples/travel-service-create.json +0 -34
  313. package/dist/examples/travel-treasury-create.json +0 -34
  314. package/dist/examples/treasury-deposit.json +0 -37
  315. package/dist/examples/treasury-withdraw.json +0 -38
  316. package/dist/harness/plan.d.ts +0 -33
  317. package/dist/harness/plan.js +0 -1
  318. package/dist/knowledge/demand-matching.d.ts +0 -29
  319. package/dist/knowledge/demand-matching.js +0 -1
  320. package/dist/knowledge/guard-context.d.ts +0 -56
  321. package/dist/knowledge/guard-context.js +0 -1
  322. package/dist/knowledge/guard-migration.d.ts +0 -48
  323. package/dist/knowledge/guard-migration.js +0 -1
  324. package/dist/mode-market/index.d.ts +0 -3
  325. package/dist/mode-market/index.js +0 -1
  326. package/dist/mode-market/registry.d.ts +0 -53
  327. package/dist/mode-market/registry.js +0 -1
  328. package/dist/mode-market/review.d.ts +0 -27
  329. package/dist/mode-market/review.js +0 -1
  330. package/dist/mode-market/submission.d.ts +0 -25
  331. package/dist/mode-market/submission.js +0 -1
  332. package/dist/schemas/guard-node-schema.json +0 -1000
  333. package/dist/task/stage-gate.d.ts +0 -22
  334. package/dist/task/stage-gate.js +0 -1
@@ -1 +1 @@
1
- import{LocalMark,query_objects,query_table,watch_conversations}from'@wowok/wowok';import{analyzeOrderParticipation,aggregateRadar,isConsequenceNode}from'../../participation/radar-core.js';import{monitorOrder}from'../../customer/order-monitor.js';import{analyzeMerchantInterest}from'../../participation/merchant-interest.js';import{analyzeCustomerInterest}from'../../participation/customer-interest.js';import{analyzeSupplierInterest}from'../../participation/supplier-interest.js';import{analyzeCollaboratorInterest}from'../../participation/collaborator-interest.js';import{fetchMachineNodes}from'./machine-nodes.js';import{extractGenericTokenType,registryDisplayHint}from'../../knowledge/fund-layer.js';const QUERY_BATCH=0x32;function fld(a,b){return a?.[b]??a?.['data']?.[b];}async function resolveAddress(a,b){const c=await LocalMark['Instance']()['get_address'](a);if(!c)throw new Error('Cannot\x20resolve\x20'+b+'\x20\x27'+a+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.\x20'+'Register\x20it\x20via\x20local_mark_operation\x20or\x20pass\x20the\x200x\x20address\x20directly.');return c;}function balanceStr(a){if(a==null)return undefined;if(typeof a==='object'&&'balance'in a)return String(a['balance']);return String(a);}function balanceToken(a){if(a!=null&&typeof a==='object'&&typeof a['token_type']==='string')return a['token_type'];return undefined;}function summarizeAllocation(a,b){const c=Array['isArray'](a)?a:Array['isArray'](a?.['allocators'])?a['allocators']:[];if(c['length']===0x0)return undefined;let d=0x0,e=0x0,f=0x0,g=0x0;const h=b['toLowerCase']();for(const i of c){for(const j of i?.['sharing']??[]){d++;const k=j?.['who'];if(k==null)continue;if(typeof k==='object'&&'GuardIdentifier'in k)e++;else{if(typeof k==='object'&&'Signer'in k)g++;else{if(typeof k==='object'&&'Entity'in k){const l=k['Entity'],m=typeof l==='string'?l:l?.['name_or_address'];if(typeof m==='string'&&m['toLowerCase']()===h)f++;}else typeof k==='string'&&k['toLowerCase']()===h&&f++;}}}}return{'recipient_slots':d,'guard_gated_slots':e,'direct_to_me_slots':f,'to_payer_slots':g};}async function queryObjectsBatched(a,b){const c=[];for(let d=0x0;d<a['length'];d+=QUERY_BATCH){const e=a['slice'](d,d+QUERY_BATCH),f=await query_objects({'objects':e,'network':b});c['push'](...f?.['objects']??[]);}return c;}async function fetchEntityPermissions(a,b){const c=new Map(),d=[];let e=undefined;for(;;){const g=await query_table({'parent':a,'cursor':e??undefined,'network':b});if(!g?.['items']||g['items']['length']===0x0)break;for(const h of g['items']){if(h['object'])d['push'](h['object']);}if(!g['hasNextPage']||!g['nextCursor'])break;e=g['nextCursor'];}const f=await queryObjectsBatched(d,b);for(const i of f){if(i?.['type']!=='TableItem_PermissionPerm')continue;const j=fld(i,'address'),k=fld(i,'perm')??[],l=k['map'](m=>typeof m==='number'?m:typeof m?.['index']==='number'?m['index']:null)['filter'](m=>m!==null);if(j)c['set'](j,l);}return c;}function toRadarMachineNodes(a){return a['map'](b=>({'name':b['name'],'pairs':(Array['isArray'](b['value'])?b['value']:[])['map'](c=>({'prev_node':c['prev_node'],'threshold':c['threshold']??undefined,'forwards':(c['forwards']??[])['map'](d=>({'name':d['name'],'permissionIndex':d['permissionIndex']??null,'namedOperator':d['namedOperator']??null,'guard':d['guard']?.['guard']??(typeof d['guard']==='string'?d['guard']:null),'weight':d['weight']??null}))}))}));}export async function handleParticipationRadar(a){if(!a['radar_account'])throw new Error('\x27radar_account\x27\x20is\x20required\x20for\x20participation_radar');if(!a['radar_targets']||a['radar_targets']['length']===0x0)throw new Error('\x27radar_targets\x27\x20(1-20\x20in-flight\x20orders)\x20is\x20required\x20for\x20participation_radar');const b=a['context_network']??'testnet',d=a['radar_include_alerts']??!![],f=[],g=await resolveAddress(a['radar_account'],'radar_account'),h=await Promise['all'](a['radar_targets']['map'](async I=>({'progress':await resolveAddress(I['progress'],'progress'),'order':I['order']?await resolveAddress(I['order'],'order'):undefined}))),i=h['flatMap'](I=>I['order']?[I['progress'],I['order']]:[I['progress']]),j=await queryObjectsBatched(i,b),k=new Map();for(const I of j){const J=fld(I,'object');if(J)k['set'](J,I);}const l=new Map(),m=new Map();for(const K of h){const L=k['get'](K['progress']);if(!L){f['push']('Progress\x20'+K['progress']+'\x20not\x20found\x20on\x20'+b+'\x20—\x20target\x20skipped.');continue;}l['set'](K['progress'],L);if(K['order']){const M=k['get'](K['order']);if(M)m['set'](K['order'],M);else f['push']('Order\x20'+K['order']+'\x20not\x20found\x20on\x20'+b+'\x20—\x20order-holder\x20detection\x20disabled\x20for\x20'+K['progress']+'.');}}h['length']>0x0&&l['size']===0x0&&f['push']('NETWORK\x20MISMATCH\x20SUSPECTED:\x200/'+h['length']+'\x20radar\x20targets\x20exist\x20on\x20network=\x27'+b+'\x27.\x20'+'These\x20objects\x20most\x20likely\x20live\x20on\x20a\x20different\x20network\x20—\x20re-run\x20with\x20the\x20matching\x20\x27network\x27\x20parameter.');const q=[...new Set([...l['values']()]['map'](N=>fld(N,'machine'))['filter'](N=>!!N))],s=[...new Set([...m['values']()]['map'](N=>fld(N,'service'))['filter'](N=>!!N))],u=[...new Set([...m['values']()]['flatMap'](N=>{const O=fld(N,'dispute');return Array['isArray'](O)?O:[];}))],w=new Map(),x=new Map(),y=new Map(),z=new Map();await Promise['all']([...q['map'](async N=>{try{const [O,P]=await Promise['all']([queryObjectsBatched([N],b),fetchMachineNodes(N,b)]);if(O[0x0])w['set'](N,O[0x0]);x['set'](N,toRadarMachineNodes(P));}catch(Q){f['push']('Machine\x20'+N+'\x20fetch\x20failed:\x20'+Q['message']+'\x20—\x20workflow\x20unknown\x20for\x20its\x20orders.');}}),((async()=>{if(s['length']===0x0)return;try{const N=await queryObjectsBatched(s,b);for(const O of N){const P=fld(O,'object');if(P)y['set'](P,O);}}catch(Q){f['push']('Service\x20query\x20failed:\x20'+Q['message']+'\x20—\x20compensation/reward\x20context\x20degraded.');}})()),((async()=>{if(u['length']===0x0)return;try{const N=await queryObjectsBatched(u,b);for(const O of N){const P=fld(O,'object');if(P)z['set'](P,O);}}catch(Q){f['push']('Arb\x20query\x20failed:\x20'+Q['message']+'\x20—\x20compensation\x20claim\x20detection\x20disabled.');}})())]);const A=new Map(),B=[...new Set(q['map'](N=>fld(w['get'](N),'permission'))['filter'](N=>!!N))],C=new Map();await Promise['all'](B['map'](async N=>{try{const [O,P]=await Promise['all']([queryObjectsBatched([N],b),fetchEntityPermissions(N,b)]),Q=O[0x0];C['set'](N,{'address':N,'entity_count':fld(Q,'entity_count'),'perm_remark':fld(Q,'perm_remark'),'entityPermissions':P,'owner':fld(Q,'builder')});}catch(R){f['push']('Permission\x20'+N+'\x20fetch\x20failed:\x20'+R['message']+'\x20—\x20operator\x20permission\x20matching\x20degraded.');}}));for(const N of q){const O=fld(w['get'](N),'permission');if(O&&C['has'](O))A['set'](N,C['get'](O));}let D=0x0;const E=new Map();try{const P=await watch_conversations({'account':g,'unreadOnly':!![],'previewMessageCount':0x0,'skipAutoMarkViewed':!![]}),Q=Array['isArray'](P)?P:P?.['conversations']??[];for(const R of Q){const S=R?.['peerAddress'],T=typeof R?.['unreadCount']==='number'?R['unreadCount']:0x0;typeof S==='string'&&T>0x0&&(E['set'](S['toLowerCase'](),T),D+=T);}}catch{f['push']('Messenger\x20unread\x20unavailable\x20(radar\x20account\x20is\x20not\x20a\x20local\x20messenger\x20account,\x20or\x20messenger\x20storage\x20offline)\x20'+'—\x20unread_messages_total\x20reported\x20as\x200.');}const F=[],G=Date['now']();for(const U of h){const V=l['get'](U['progress']);if(!V)continue;const W=U['order']?m['get'](U['order']):undefined,X=fld(V,'machine'),Y=fld(V,'current')??'',Z=fld(V,'namedOperator')??[],a0={};for(const ae of Z){if(ae?.['name'])a0[ae['name']]=Array['isArray'](ae['operators'])?ae['operators']:[];}const a1=W?fld(W,'service'):undefined,a2=a1?y['get'](a1):undefined;let a3;const a4=W?fld(W,'builder'):undefined;if(W&&a4===g){const af=fld(W,'dispute')??[];for(const ag of af){const ah=z['get'](ag);if(!ah)continue;const ai=fld(ah,'indemnity');if(ai){a3={'arbitration':fld(ah,'arbitration')??ag,'note':'Arbitration\x20verdict\x20recorded\x20an\x20indemnity\x20(Arb\x20'+ag+').\x20'+'Claim\x20via\x20service\x20op=\x27compensation_claim\x27\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund.\x20'+'(Claimed-status\x20is\x20not\x20readable\x20from\x20the\x20Arb\x20object;\x20the\x20contract\x20rejects\x20double-claims.)'};break;}}}const a5=[];if(a2&&a4===g){const aj=fld(a2,'rewards')??[];for(const ak of aj){a5['push']({'address':ak,'description':'Service\x20reward\x20'+ak+'\x20(guard-gated\x20—\x20eligibility\x20verified\x20at\x20claim\x20time)'});}}const a6=isConsequenceNode(Y,'completed'),a7=isConsequenceNode(Y,'refunded');let a8=0x0;if(E['size']>0x0){const al=new Set();if(a4)al['add'](a4['toLowerCase']());for(const am of Object['values'](a0)){for(const an of am)al['add'](an['toLowerCase']());}al['delete'](g['toLowerCase']());for(const ao of al){a8+=E['get'](ao)??0x0;}}const a9={'account':g,'progress_address':U['progress'],'order_address':U['order'],'current_node':Y,'order_holder':a4,'machine_nodes':X?x['get'](X):undefined,'permission':X?A['get'](X)??null:null,'named_accounts':a0,'claimable_rewards':a5['length']>0x0?a5:undefined,'pending_compensation':a3,'rating_pending':a6&&a4===g,'unread_messages':a8>0x0?a8:undefined,'last_progress_at':fld(V,'current_time')??undefined,'now':G},aa=analyzeOrderParticipation(a9),ab=(fld(a2,'arbitrations')??[])['length']>0x0,ac=a6?'completed':a7?'refunded':null,ad=a9['last_progress_at']!=null?(G-a9['last_progress_at'])/0x36ee80:undefined;if(aa['perspective']==='merchant')aa['interest_analysis']=analyzeMerchantInterest({'account':g,'current_node':Y,'operable':aa['operable'],'waiting_on':aa['waiting_on'],'order_amount':balanceStr(fld(W,'amount')),'token_type':balanceToken(fld(W,'amount')),'allocation':summarizeAllocation(fld(a2,'order_allocators'),g),'compensation_fund':balanceStr(fld(a2,'compensation_fund')),'arbitration_bound':ab,'rewards_count':(fld(a2,'rewards')??[])['length'],'stalled_hours':ad,'terminal':ac,'unread_messages':a8>0x0?a8:undefined});else{if(aa['perspective']==='supplier')aa['interest_analysis']=analyzeSupplierInterest({'account':g,'current_node':Y,'operable':aa['operable'],'waiting_on':aa['waiting_on'],'order_amount':balanceStr(fld(W,'amount')),'token_type':balanceToken(fld(W,'amount')),'arbitration_bound':ab,'compensation_fund':balanceStr(fld(a2,'compensation_fund')),'terminal':ac,'stalled_hours':ad,'unread_messages':a8>0x0?a8:undefined});else{if(aa['perspective']==='collaborator')aa['interest_analysis']=analyzeCollaboratorInterest({'account':g,'current_node':Y,'operable':aa['operable'],'waiting_on':aa['waiting_on'],'collaborator_kind':aa['collaborator_kind'],'arbitration_bound':ab,'terminal':ac,'stalled_hours':ad,'unread_messages':a8>0x0?a8:undefined});else aa['perspective']==='customer'&&(aa['interest_analysis']=analyzeCustomerInterest({'account':g,'current_node':Y,'operable':aa['operable'],'waiting_on':aa['waiting_on'],'order_amount':balanceStr(fld(W,'amount')),'token_type':balanceToken(fld(W,'amount')),'compensation_fund':balanceStr(fld(a2,'compensation_fund')),'arbitration_bound':ab,'terminal':ac,'stalled_hours':ad,'unread_messages':a8>0x0?a8:undefined}));}}if(d&&W){const ap={'order_id':U['order'],'service_id':a1??'','current_node':Y||undefined,'created_at':Number(fld(W,'time')??G)||G,'last_progress_at':fld(V,'current_time')??undefined,'now':G,'order_amount':((()=>{try{return BigInt(fld(W,'amount')??0x0);}catch{return undefined;}})()),'compensation_balance':((()=>{try{const aq=fld(a2,'compensation_fund');return aq!=null?BigInt(aq):undefined;}catch{return undefined;}})()),'token':registryDisplayHint(extractGenericTokenType(fld(a2,'type_raw'))),'has_arbitration':(fld(a2,'arbitrations')??[])['length']>0x0,'pending_user_action':aa['operable']['some'](aq=>aq['execution_path']==='order_holder'),'completed':a6,'refunded':a7};try{const aq=monitorOrder({'current':ap,'thresholds':a['radar_monitor_thresholds']});aq['length']>0x0&&(aa['attached_alerts']=aq);}catch(ar){f['push']('Order\x20monitor\x20failed\x20for\x20'+U['order']+':\x20'+ar['message']+'.');}}F['push'](aa);}const H=aggregateRadar(F,D);return{'action':'participation_radar','account':g,'orders_analyzed':H['orders_analyzed'],'actionable':H['actionable'],'waiting':H['waiting'],'all_pending_claims':H['all_pending_claims'],'unread_messages_total':H['unread_messages_total'],'data_gaps':f,'summary':H['summary']};}
1
+ import{LocalMark,watch_conversations}from'@wowok/wowok';import{analyzeOrderParticipation,aggregateRadar,isConsequenceNode}from'../../participation/radar-core.js';import{monitorOrder}from'../../customer/order-monitor.js';import{analyzeMerchantInterest}from'../../participation/merchant-interest.js';import{analyzeCustomerInterest}from'../../participation/customer-interest.js';import{analyzeSupplierInterest}from'../../participation/supplier-interest.js';import{analyzeCollaboratorInterest}from'../../participation/collaborator-interest.js';import{fetchMachineNodes}from'./machine-nodes.js';import{extractGenericTokenType,registryDisplayHint}from'../../knowledge/fund-layer.js';import{batchQueryObjectsByIds,batchQueryTableItems}from'../../knowledge/workflow-guidance.js';function fld(a,b){return a?.[b]??a?.['data']?.[b];}async function resolveAddress(a,b){const c=await LocalMark['Instance']()['get_address'](a);if(!c)throw new Error('Cannot\x20resolve\x20'+b+'\x20\x27'+a+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.\x20'+'Register\x20it\x20via\x20local_mark_operation\x20or\x20pass\x20the\x200x\x20address\x20directly.');return c;}function balanceStr(a){if(a==null)return undefined;if(typeof a==='object'&&'balance'in a)return String(a['balance']);return String(a);}function balanceToken(a){if(a!=null&&typeof a==='object'&&typeof a['token_type']==='string')return a['token_type'];return undefined;}function summarizeAllocation(a,b){const c=Array['isArray'](a)?a:Array['isArray'](a?.['allocators'])?a['allocators']:[];if(c['length']===0x0)return undefined;let d=0x0,e=0x0,f=0x0,g=0x0;const h=b['toLowerCase']();for(const i of c){for(const j of i?.['sharing']??[]){d++;const k=j?.['who'];if(k==null)continue;if(typeof k==='object'&&'GuardIdentifier'in k)e++;else{if(typeof k==='object'&&'Signer'in k)g++;else{if(typeof k==='object'&&'Entity'in k){const l=k['Entity'],m=typeof l==='string'?l:l?.['name_or_address'];if(typeof m==='string'&&m['toLowerCase']()===h)f++;}else typeof k==='string'&&k['toLowerCase']()===h&&f++;}}}}return{'recipient_slots':d,'guard_gated_slots':e,'direct_to_me_slots':f,'to_payer_slots':g};}async function fetchEntityPermissions(a,b){const c=new Map(),{items:d}=await batchQueryTableItems(a,{'network':b});for(const e of d){const f=e['object'];if(f?.['type']!=='TableItem_PermissionPerm')continue;const g=fld(f,'address'),h=fld(f,'perm')??[],i=h['map'](j=>typeof j==='number'?j:typeof j?.['index']==='number'?j['index']:null)['filter'](j=>j!==null);if(g)c['set'](g,i);}return c;}function toRadarMachineNodes(a){return a['map'](b=>({'name':b['name'],'pairs':(Array['isArray'](b['value'])?b['value']:[])['map'](c=>({'prev_node':c['prev_node'],'threshold':c['threshold']??undefined,'forwards':(c['forwards']??[])['map'](d=>({'name':d['name'],'permissionIndex':d['permissionIndex']??null,'namedOperator':d['namedOperator']??null,'guard':d['guard']?.['guard']??(typeof d['guard']==='string'?d['guard']:null),'weight':d['weight']??null}))}))}));}export async function handleParticipationRadar(a){if(!a['radar_account'])throw new Error('\x27radar_account\x27\x20is\x20required\x20for\x20participation_radar');if(!a['radar_targets']||a['radar_targets']['length']===0x0)throw new Error('\x27radar_targets\x27\x20(1-20\x20in-flight\x20orders)\x20is\x20required\x20for\x20participation_radar');const b=a['context_network']??'testnet',d=a['radar_include_alerts']??!![],f=[],g=await resolveAddress(a['radar_account'],'radar_account'),h=await Promise['all'](a['radar_targets']['map'](async I=>({'progress':await resolveAddress(I['progress'],'progress'),'order':I['order']?await resolveAddress(I['order'],'order'):undefined}))),i=h['flatMap'](I=>I['order']?[I['progress'],I['order']]:[I['progress']]),j=await batchQueryObjectsByIds(i,b),k=new Map();for(const I of j){const J=fld(I,'object');if(J)k['set'](J,I);}const l=new Map(),m=new Map();for(const K of h){const L=k['get'](K['progress']);if(!L){f['push']('Progress\x20'+K['progress']+'\x20not\x20found\x20on\x20'+b+'\x20—\x20target\x20skipped.');continue;}l['set'](K['progress'],L);if(K['order']){const M=k['get'](K['order']);if(M)m['set'](K['order'],M);else f['push']('Order\x20'+K['order']+'\x20not\x20found\x20on\x20'+b+'\x20—\x20order-holder\x20detection\x20disabled\x20for\x20'+K['progress']+'.');}}h['length']>0x0&&l['size']===0x0&&f['push']('NETWORK\x20MISMATCH\x20SUSPECTED:\x200/'+h['length']+'\x20radar\x20targets\x20exist\x20on\x20network=\x27'+b+'\x27.\x20'+'These\x20objects\x20most\x20likely\x20live\x20on\x20a\x20different\x20network\x20—\x20re-run\x20with\x20the\x20matching\x20\x27network\x27\x20parameter.');const q=[...new Set([...l['values']()]['map'](N=>fld(N,'machine'))['filter'](N=>!!N))],s=[...new Set([...m['values']()]['map'](N=>fld(N,'service'))['filter'](N=>!!N))],u=[...new Set([...m['values']()]['flatMap'](N=>{const O=fld(N,'dispute');return Array['isArray'](O)?O:[];}))],w=new Map(),x=new Map(),y=new Map(),z=new Map();await Promise['all']([...q['map'](async N=>{try{const [O,P]=await Promise['all']([batchQueryObjectsByIds([N],b),fetchMachineNodes(N,b)]);if(O[0x0])w['set'](N,O[0x0]);x['set'](N,toRadarMachineNodes(P));}catch(Q){f['push']('Machine\x20'+N+'\x20fetch\x20failed:\x20'+Q['message']+'\x20—\x20workflow\x20unknown\x20for\x20its\x20orders.');}}),((async()=>{if(s['length']===0x0)return;try{const N=await batchQueryObjectsByIds(s,b);for(const O of N){const P=fld(O,'object');if(P)y['set'](P,O);}}catch(Q){f['push']('Service\x20query\x20failed:\x20'+Q['message']+'\x20—\x20compensation/reward\x20context\x20degraded.');}})()),((async()=>{if(u['length']===0x0)return;try{const N=await batchQueryObjectsByIds(u,b);for(const O of N){const P=fld(O,'object');if(P)z['set'](P,O);}}catch(Q){f['push']('Arb\x20query\x20failed:\x20'+Q['message']+'\x20—\x20compensation\x20claim\x20detection\x20disabled.');}})())]);const A=new Map(),B=[...new Set(q['map'](N=>fld(w['get'](N),'permission'))['filter'](N=>!!N))],C=new Map();await Promise['all'](B['map'](async N=>{try{const [O,P]=await Promise['all']([batchQueryObjectsByIds([N],b),fetchEntityPermissions(N,b)]),Q=O[0x0];C['set'](N,{'address':N,'entity_count':fld(Q,'entity_count'),'perm_remark':fld(Q,'perm_remark'),'entityPermissions':P,'owner':fld(Q,'builder')});}catch(R){f['push']('Permission\x20'+N+'\x20fetch\x20failed:\x20'+R['message']+'\x20—\x20operator\x20permission\x20matching\x20degraded.');}}));for(const N of q){const O=fld(w['get'](N),'permission');if(O&&C['has'](O))A['set'](N,C['get'](O));}let D=0x0;const E=new Map();try{const P=await watch_conversations({'account':g,'unreadOnly':!![],'previewMessageCount':0x0,'skipAutoMarkViewed':!![]}),Q=Array['isArray'](P)?P:P?.['conversations']??[];for(const R of Q){const S=R?.['peerAddress'],T=typeof R?.['unreadCount']==='number'?R['unreadCount']:0x0;typeof S==='string'&&T>0x0&&(E['set'](S['toLowerCase'](),T),D+=T);}}catch{f['push']('Messenger\x20unread\x20unavailable\x20(radar\x20account\x20is\x20not\x20a\x20local\x20messenger\x20account,\x20or\x20messenger\x20storage\x20offline)\x20'+'—\x20unread_messages_total\x20reported\x20as\x200.');}const F=[],G=Date['now']();for(const U of h){const V=l['get'](U['progress']);if(!V)continue;const W=U['order']?m['get'](U['order']):undefined,X=fld(V,'machine'),Y=fld(V,'current')??'',Z=fld(V,'namedOperator')??[],a0={};for(const ae of Z){if(ae?.['name'])a0[ae['name']]=Array['isArray'](ae['operators'])?ae['operators']:[];}const a1=W?fld(W,'service'):undefined,a2=a1?y['get'](a1):undefined;let a3;const a4=W?fld(W,'builder'):undefined;if(W&&a4===g){const af=fld(W,'dispute')??[];for(const ag of af){const ah=z['get'](ag);if(!ah)continue;const ai=fld(ah,'indemnity');if(ai){a3={'arbitration':fld(ah,'arbitration')??ag,'note':'Arbitration\x20verdict\x20recorded\x20an\x20indemnity\x20(Arb\x20'+ag+').\x20'+'Claim\x20via\x20service\x20op=\x27compensation_claim\x27\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund.\x20'+'(Claimed-status\x20is\x20not\x20readable\x20from\x20the\x20Arb\x20object;\x20the\x20contract\x20rejects\x20double-claims.)'};break;}}}const a5=[];if(a2&&a4===g){const aj=fld(a2,'rewards')??[];for(const ak of aj){a5['push']({'address':ak,'description':'Service\x20reward\x20'+ak+'\x20(guard-gated\x20—\x20eligibility\x20verified\x20at\x20claim\x20time)'});}}const a6=isConsequenceNode(Y,'completed'),a7=isConsequenceNode(Y,'refunded');let a8=0x0;if(E['size']>0x0){const al=new Set();if(a4)al['add'](a4['toLowerCase']());for(const am of Object['values'](a0)){for(const an of am)al['add'](an['toLowerCase']());}al['delete'](g['toLowerCase']());for(const ao of al){a8+=E['get'](ao)??0x0;}}const a9={'account':g,'progress_address':U['progress'],'order_address':U['order'],'current_node':Y,'order_holder':a4,'machine_nodes':X?x['get'](X):undefined,'permission':X?A['get'](X)??null:null,'named_accounts':a0,'claimable_rewards':a5['length']>0x0?a5:undefined,'pending_compensation':a3,'rating_pending':a6&&a4===g,'unread_messages':a8>0x0?a8:undefined,'last_progress_at':fld(V,'current_time')??undefined,'now':G},aa=analyzeOrderParticipation(a9),ab=(fld(a2,'arbitrations')??[])['length']>0x0,ac=a6?'completed':a7?'refunded':null,ad=a9['last_progress_at']!=null?(G-a9['last_progress_at'])/0x36ee80:undefined;if(aa['perspective']==='merchant')aa['interest_analysis']=analyzeMerchantInterest({'account':g,'current_node':Y,'operable':aa['operable'],'waiting_on':aa['waiting_on'],'order_amount':balanceStr(fld(W,'amount')),'token_type':balanceToken(fld(W,'amount')),'allocation':summarizeAllocation(fld(a2,'order_allocators'),g),'compensation_fund':balanceStr(fld(a2,'compensation_fund')),'arbitration_bound':ab,'rewards_count':(fld(a2,'rewards')??[])['length'],'stalled_hours':ad,'terminal':ac,'unread_messages':a8>0x0?a8:undefined});else{if(aa['perspective']==='supplier')aa['interest_analysis']=analyzeSupplierInterest({'account':g,'current_node':Y,'operable':aa['operable'],'waiting_on':aa['waiting_on'],'order_amount':balanceStr(fld(W,'amount')),'token_type':balanceToken(fld(W,'amount')),'arbitration_bound':ab,'compensation_fund':balanceStr(fld(a2,'compensation_fund')),'terminal':ac,'stalled_hours':ad,'unread_messages':a8>0x0?a8:undefined});else{if(aa['perspective']==='collaborator')aa['interest_analysis']=analyzeCollaboratorInterest({'account':g,'current_node':Y,'operable':aa['operable'],'waiting_on':aa['waiting_on'],'collaborator_kind':aa['collaborator_kind'],'arbitration_bound':ab,'terminal':ac,'stalled_hours':ad,'unread_messages':a8>0x0?a8:undefined});else aa['perspective']==='customer'&&(aa['interest_analysis']=analyzeCustomerInterest({'account':g,'current_node':Y,'operable':aa['operable'],'waiting_on':aa['waiting_on'],'order_amount':balanceStr(fld(W,'amount')),'token_type':balanceToken(fld(W,'amount')),'compensation_fund':balanceStr(fld(a2,'compensation_fund')),'arbitration_bound':ab,'terminal':ac,'stalled_hours':ad,'unread_messages':a8>0x0?a8:undefined}));}}if(d&&W){const ap={'order_id':U['order'],'service_id':a1??'','current_node':Y||undefined,'created_at':Number(fld(W,'time')??G)||G,'last_progress_at':fld(V,'current_time')??undefined,'now':G,'order_amount':((()=>{try{return BigInt(fld(W,'amount')??0x0);}catch{return undefined;}})()),'compensation_balance':((()=>{try{const aq=fld(a2,'compensation_fund');return aq!=null?BigInt(aq):undefined;}catch{return undefined;}})()),'token':registryDisplayHint(extractGenericTokenType(fld(a2,'type_raw'))),'has_arbitration':(fld(a2,'arbitrations')??[])['length']>0x0,'pending_user_action':aa['operable']['some'](aq=>aq['execution_path']==='order_holder'),'completed':a6,'refunded':a7};try{const aq=monitorOrder({'current':ap,'thresholds':a['radar_monitor_thresholds']});aq['length']>0x0&&(aa['attached_alerts']=aq);}catch(ar){f['push']('Order\x20monitor\x20failed\x20for\x20'+U['order']+':\x20'+ar['message']+'.');}}F['push'](aa);}const H=aggregateRadar(F,D);return{'action':'participation_radar','account':g,'orders_analyzed':H['orders_analyzed'],'actionable':H['actionable'],'waiting':H['waiting'],'all_pending_claims':H['all_pending_claims'],'unread_messages_total':H['unread_messages_total'],'data_gaps':f,'summary':H['summary']};}
@@ -0,0 +1,2 @@
1
+ import type { RelationshipProfileInput, RelationshipProfileResult } from "../../schema/query/bi.js";
2
+ export declare function handleRelationshipProfile(v: RelationshipProfileInput): Promise<RelationshipProfileResult>;
@@ -0,0 +1 @@
1
+ import{LocalMark,objectTypeFromAddress,queryOrdersByUser}from'@wowok/wowok';import{batchQueryObjectsByIds,batchQueryTableItems,fetchEntityPermission,fetchObjectLinkerCore,fetchObjectLinkerTx,fetchServiceOrders}from'../../knowledge/workflow-guidance.js';import{deriveRelationshipProfile}from'../../relationship/index.js';import{analyzeDemanderInterest}from'../../participation/demander-interest.js';import{GUARD_BINDING_REGISTRY,OWNER_RECEIVE_COGNITION}from'../../knowledge/guard-bindings.js';import{detectBridgesForObjects,summarizeBridge}from'../../knowledge/scenario-topology.js';import{fetchMachineNodes}from'./machine-nodes.js';const MAX_MANAGED_PER_PERMISSION=0x3c,MAX_ORDERS=0x28,MAX_DEMANDS=0x14,MAX_ALLOCATIONS=0x28;function fld(a,b){return a?.[b]??a?.['data']?.[b];}async function resolveAddress(a,b){if(/^0x[0-9a-fA-F]{4,}$/i['test'](a))return a;const c=await LocalMark['Instance']()['get_address'](a);if(!c)throw new Error('Cannot\x20resolve\x20'+b+'\x20\x27'+a+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.\x20'+'Pass\x20the\x200x\x20address\x20directly\x20or\x20register\x20it\x20via\x20local_mark_operation.');return c;}async function safe(a,b,c){try{return await b();}catch(d){return c['push'](a+':\x20'+d['message']),undefined;}}export async function handleRelationshipProfile(b){if(!b['radar_account'])throw new Error('\x27radar_account\x27\x20is\x20required\x20for\x20relationship_profile');const e=b['context_network']??'testnet',f=[],g=await resolveAddress(b['radar_account'],'radar_account'),h=await safe('entity_permission\x20'+g,()=>fetchEntityPermission(g,e),f),i=[...new Set((h?.['items']??[])['map'](V=>typeof V?.['permission']==='string'?V['permission']:undefined)['filter'](V=>!!V))]['slice'](0x0,0x19),j=[],k=new Map();if(i['length']>0x0){const V=await safe('permissions\x20query',()=>batchQueryObjectsByIds(i,e),f)??[];for(const W of V){const X=fld(W,'object');if(!X)continue;j['push']({'address':X,'owner':fld(W,'owner')??'','admins':(fld(W,'admin')??[])['filter'](Y=>typeof Y==='string'),'entities':[]});}await Promise['all'](i['map'](async Y=>{const Z=await safe('permission\x20table\x20'+Y,()=>batchQueryTableItems(Y,{'network':e}),f);if(!Z)return;const a0=j['find'](a1=>a1['address']['toLowerCase']()===Y['toLowerCase']());if(!a0)return;for(const a1 of Z['items']){const a2=a1['object'];if(a2?.['type']&&!String(a2['type'])['includes']('PermissionPerm'))continue;const a3=fld(a2,'address');if(!a3)continue;const a4=fld(a2,'perm')??[],a5=a4['map'](a6=>typeof a6==='number'?a6:typeof a6?.['index']==='number'?a6['index']:null)['filter'](a6=>a6!==null);a0['entities']['push']({'address':a3,'perm_indices':a5});}}));for(const Y of i){const [Z,a0]=await Promise['all']([safe('object_linker_core\x20'+Y,()=>fetchObjectLinkerCore(Y,e),f),safe('object_linker_tx\x20'+Y,()=>fetchObjectLinkerTx(Y,e),f)]),a1=[...(Z?.['items']??[])['map'](a2=>a2?.['who']),...(a0?.['items']??[])['map'](a2=>a2?.['who'])]['filter'](a2=>typeof a2==='string'&&!!a2);for(const a2 of a1['slice'](0x0,MAX_MANAGED_PER_PERMISSION)){if(!k['has'](a2['toLowerCase']())){const a3=objectTypeFromAddress(a2);if(a3)k['set'](a2['toLowerCase'](),a3);}}}}const l=a4=>[...k['entries']()]['filter'](([a5,a6])=>a6===a4)['map'](([a5])=>a5),m=l('service'),n=l('demand')['slice'](0x0,MAX_DEMANDS),q=l('contact'),u=l('arbitration'),w=new Map(),x=await safe('orders\x20by\x20user\x20'+g,()=>queryOrdersByUser({'address':g,'network':e}),f);for(const a4 of x??[]){const a5=a4?.['order']?.['object'];typeof a5==='string'&&a5&&w['set'](a5['toLowerCase'](),'buyer');}for(const a6 of m){const a7=await safe('service\x20orders\x20'+a6,()=>fetchServiceOrders(a6,e),f);for(const a8 of a7?.['items']??[]){typeof a8?.['who']==='string'&&a8['who']&&w['set'](a8['who']['toLowerCase'](),'merchant');}}const y=[...w['keys']()]['slice'](0x0,MAX_ORDERS),z=[],A={};if(y['length']>0x0){const a9=await safe('orders\x20query',()=>batchQueryObjectsByIds(y,e),f)??[],aa=new Set();for(const ae of a9){const af=fld(ae,'object');if(!af)continue;z['push']({'address':af,'owner':fld(ae,'owner')??'','agents':(fld(ae,'agent')??[])['filter'](ah=>typeof ah==='string'),'service':fld(ae,'service')??'','amount':fld(ae,'amount')??undefined,'allocation':fld(ae,'allocation')??undefined,'dispute_arbitrations':(fld(ae,'dispute')??[])['filter'](ah=>typeof ah==='string'),'claimed_by':fld(ae,'claimed_by')??null});const ag=fld(ae,'service');if(ag)aa['add'](ag);}const ab=await safe('order\x20services\x20query',()=>batchQueryObjectsByIds([...aa],e),f)??[],ac=new Map();for(const ah of ab){const ai=fld(ah,'object'),aj=fld(ah,'permission');if(ai&&aj)ac['set'](ai['toLowerCase'](),aj);}const ad=[...new Set([...ac['values']()])];if(ad['length']>0x0){const ak=await safe('service\x20permissions\x20query',()=>batchQueryObjectsByIds(ad,e),f)??[],al=new Map();for(const am of ak){const an=fld(am,'object'),ao=fld(am,'owner');if(an&&ao)al['set'](an['toLowerCase'](),ao);}for(const [ap,aq]of ac){const ar=al['get'](aq['toLowerCase']());if(ar)A[ap]=ar;}}}const B=[];for(const as of n){const at=await safe('demand\x20'+as,()=>batchQueryObjectsByIds([as],e),f)??[],au=at[0x0],av=fld(au,'permission');let aw='';if(av){const aB=await safe('demand\x20permission\x20'+av,()=>batchQueryObjectsByIds([av],e),f)??[];aw=fld(aB[0x0],'owner')??'';}const ax=[],ay=await safe('demand\x20presenters\x20'+as,()=>batchQueryTableItems(as,{'network':e}),f);if(ay)for(const aC of ay['items']){const aD=aC['object'];if(!aD?.['type']||!String(aD['type'])['includes']('Present'))continue;const aE=fld(aD,'address')??aC['objectId'],aF=fld(aD,'value')??aD;ax['push']({'address':typeof aE==='string'?aE:aC['objectId'],'service':typeof aF?.['service']==='string'?aF['service']:undefined,'acceptance_score':typeof aF?.['acceptance_score']==='number'?aF['acceptance_score']:undefined});}const az=(fld(au,'rewards')??[])['filter'](aG=>typeof aG==='string'),aA=(fld(au,'guards')??[])['map'](aG=>typeof aG==='string'?aG:fld(aG,'guard'))['filter'](aG=>typeof aG==='string');B['push']({'address':as,'owner':aw,'presenters':ax,'rewards':az,'guards':aA});}const C=[],D=[...new Set(z['map'](aG=>aG['allocation'])['filter'](aG=>!!aG))]['slice'](0x0,MAX_ALLOCATIONS);if(D['length']>0x0){const aG=await safe('allocations\x20query',()=>batchQueryObjectsByIds(D,e),f)??[];for(const aH of aG){const aI=fld(aH,'object');if(!aI)continue;const aJ=fld(aH,'allocators')??aH,aK=Array['isArray'](aJ)?aJ:Array['isArray'](aJ?.['allocators'])?aJ['allocators']:[],aL=aK['flatMap'](aM=>(aM?.['sharing']??[])['map'](aN=>({'who':aN?.['who']??aN,'mode':aN?.['mode']===0x1||aN?.['mode']==='Rate'?'Rate':aN?.['mode']===0x2||aN?.['mode']==='Surplus'?'Surplus':'Amount','sharing':aN?.['sharing']!=null?String(aN['sharing']):undefined,'guard':typeof aM?.['guard']==='string'?aM['guard']:undefined})));C['push']({'address':aI,'owner':fld(aH,'owner')??'','sharing':aL});}}const E=[];if(q['length']>0x0){const aM=await safe('contacts\x20query',()=>batchQueryObjectsByIds(q['slice'](0x0,0x14),e),f)??[];for(const aN of aM){const aO=fld(aN,'object');if(!aO)continue;const aP=fld(aN,'permission');let aQ='';if(aP){const aS=await safe('contact\x20permission\x20'+aP,()=>batchQueryObjectsByIds([aP],e),f)??[];aQ=fld(aS[0x0],'owner')??'';}const aR=(fld(aN,'ims')??[])['map'](aT=>typeof aT==='string'?aT:aT?.['at'])['filter'](aT=>typeof aT==='string');E['push']({'address':aO,'ims':aR,'owner':aQ});}}const F=[],G=l('machine')['slice'](0x0,0xa);for(const aT of G){const [aU,aV]=await Promise['all']([safe('machine\x20'+aT,()=>batchQueryObjectsByIds([aT],e),f),safe('machine\x20nodes\x20'+aT,()=>fetchMachineNodes(aT,e),f)]),aW=aU?.[0x0]?fld(aU[0x0],'permission'):undefined,aX=(aV??[])['flatMap'](aY=>(Array['isArray'](aY['value'])?aY['value']:[])['flatMap'](aZ=>(aZ['forwards']??[])['map'](b0=>({'node':aZ['prev_node']??aY['name'],'next_node':aY['name'],'forward_name':b0['name'],'named_operator':b0['namedOperator']??null,'permission_index':b0['permissionIndex']??null,'guard':typeof b0['guard']==='string'?b0['guard']:b0['guard']?.['guard']??null}))));F['push']({'address':aT,'permission_address':aW,'forwards':aX});}const H=[],I=new Map();for(const aY of z){const aZ=w['get'](aY['address']['toLowerCase']())??'buyer';for(const b0 of aY['dispute_arbitrations']??[])I['set'](b0['toLowerCase'](),{'order':aY['address'],'side':aZ});}const J=new Set(u);for(const b1 of I['keys']())J['add'](b1);if(J['size']>0x0){const b2=await safe('arbitrations\x20query',()=>batchQueryObjectsByIds([...J]['slice'](0x0,0xf),e),f)??[];let b3=0x0;for(const b4 of b2){const b5=fld(b4,'object');if(!b5)continue;const b6=I['get'](b5['toLowerCase']());if(b6){const b7=(fld(b4,'voted')??[])['map'](b8=>({'address':typeof b8?.['voter']==='string'?b8['voter']:'','weight':typeof b8?.['weight']==='number'?b8['weight']:undefined}))['filter'](b8=>b8['address']['length']>0x0);H['push']({'address':b5,'object_kind':'case','voters':b7,'order':fld(b4,'order')??b6['order'],'arbitration':fld(b4,'arbitration')??undefined,'anchor_side':b6['side'],'bound_services':[]});}else b3++,H['push']({'address':b5,'object_kind':'service','voters':[],'bound_services':[]});}b3>0x0&&f['push']('Arbitration\x20service\x20voting-guard\x20member\x20resolution\x20is\x20not\x20implemented\x20yet\x20—\x20arbitration\x20services\x20contribute\x20binding\x20presence\x20only\x20(Arb\x20CASE\x20votes\x20ARE\x20parsed\x20into\x20arbitration_delegation/dispute_resolution\x20edges).');}const K={'anchor':g,'permissions':j,'machines':F,'orders':z,'demands':B,'allocations':C,'contacts':E,'arbitrations':H,'service_owners':A},L=deriveRelationshipProfile(K),M=new Set();if(C['length']>0x0)M['add']('Allocation');if(B['length']>0x0)M['add']('Demand');if(F['some'](b8=>(b8['forwards']??[])['some'](b9=>b9['guard'])))M['add']('MachineForward');if(H['length']>0x0)M['add']('Arbitration');for(const b8 of M){const b9=GUARD_BINDING_REGISTRY['filter'](bb=>bb['object']===b8);if(b9['length']===0x0)continue;const ba=b9['map'](bb=>{const bc=bb['preset_kind']==='amount'&&bb['object']==='Allocation'?'\x20(Rate\x20is\x20basis\x20points;\x20rates\x20must\x20complete\x2010000\x20unless\x20a\x20Surplus\x20entry\x20exists)':'';return''+bb['slot']+bc+'\x20['+bb['preset_kind']+']\x20—\x20creator:\x20'+bb['creator']['split']('\x20—\x20')[0x0]['split']('.\x20')[0x0]+';\x20user:\x20'+bb['user'];})['join']('\x20|\x20');L['notes']['push']('Guard-preset\x20deep\x20context\x20on\x20the\x20'+b8+'(s)\x20in\x20this\x20topology:\x20'+ba+'.');}C['length']>0x0&&L['notes']['push']('Cognition\x20fixed:\x20'+OWNER_RECEIVE_COGNITION);const N=['Permission'];if(z['length']>0x0)N['push']('Order');if(F['length']>0x0)N['push']('Machine','Progress');if(C['length']>0x0)N['push']('Allocation','Payment');if(B['length']>0x0)N['push']('Demand');if(H['length']>0x0)N['push']('Arbitration','Arb');if(E['length']>0x0)N['push']('Contact');if(Object['keys'](A)['length']>0x0)N['push']('Service','Guard');const O=detectBridgesForObjects(N);if(O['length']>0x0){const bb=O['slice'](0x0,0x8)['map'](bc=>summarizeBridge(bc))['join']('\x0a-\x20');L['notes']['push']('Scenario\x20topology\x20('+O['length']+'\x20bridge(s)\x20implied\x20by\x20the\x20touched\x20objects\x20—\x20capability\x20comes\x20from\x20the\x20\x22\x20+\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x22integration,\x20not\x20from\x20any\x20single\x20object):\x0a-\x20'+bb);}const P=b['relation_kinds']?new Set(b['relation_kinds']):undefined,Q=P?L['edges']['filter'](bc=>P['has'](bc['kind'])):L['edges'],R=Q['reduce']((bc,bd)=>{return bc[bd['kind']]=(bc[bd['kind']]??0x0)+0x1,bc;},{});let S=g+'\x20holds\x20'+Q['length']+'\x20relationship\x20edge(s)\x20across\x20'+Object['keys'](L['by_counterparty'])['length']+'\x20counterparty(ies)'+(Object['keys'](R)['length']>0x0?':\x20'+Object['entries'](R)['map'](([bc,bd])=>bc+'×'+bd)['join'](',\x20')+'.':'.');Q['length']===0x0&&f['length']>0x0&&(S+='\x20No\x20edges\x20derived\x20—\x20check\x20data_gaps\x20(the\x20account\x20may\x20have\x20no\x20on-chain\x20power\x20carriers\x20on\x20this\x20network).');const T=(bc,bd)=>bc['toLowerCase']()===bd['toLowerCase'](),U=B['filter'](bc=>bc['owner']&&T(bc['owner'],g))['map'](bc=>({'demand':bc['address'],...analyzeDemanderInterest({'account':g,'demand':bc['address'],'presenters':bc['presenters']??[],'rewards':(bc['rewards']??[])['map'](bd=>({'address':bd})),'guards':bc['guards']??[],'open':!(bc['presenters']??[])['some'](bd=>bd['acceptance_score']!==undefined)})}));return U['length']>0x0&&(S+='\x20Anchor\x20demands\x20'+U['length']+'\x20demand(s)\x20—\x20demander-interest\x20analysis\x20attached.'),{'action':'relationship_profile','account':g,'edges':Q,'by_counterparty':L['by_counterparty'],'notes':L['notes'],'data_gaps':f,'summary':S,...U['length']>0x0?{'demander_interest':U}:{}};}
@@ -2,6 +2,7 @@ import type { ProjectObjectType } from "./namespace.js";
2
2
  import type { BusinessIntent } from "./intent-analyzer.js";
3
3
  import type { BusinessModule, BusinessModuleId } from "../../extensions/business-modules.js";
4
4
  import type { GraphEdgeBase, GraphNodeBase } from "../../graph/base.js";
5
+ import type { IndustryMode } from "../../extensions/types.js";
5
6
  export type ConfigValueType = "string" | "number" | "boolean" | "address_ref" | "guard_logic" | "enum";
6
7
  export interface ConfigValueBase {
7
8
  type: ConfigValueType;
@@ -89,5 +90,8 @@ export interface GraphValidationResult {
89
90
  softViolations: SemanticConstraint[];
90
91
  infoNotes: SemanticConstraint[];
91
92
  }
92
- export declare function buildSemanticGraph(intent: BusinessIntent, adoptedModules: BusinessModule[]): SemanticObjectGraph;
93
+ export interface ModePriorOptions {
94
+ paymentExplicit?: boolean;
95
+ }
96
+ export declare function buildSemanticGraph(intent: BusinessIntent, adoptedModules: BusinessModule[], mode?: IndustryMode, options?: ModePriorOptions): SemanticObjectGraph;
93
97
  export declare function validateGraph(graph: SemanticObjectGraph): GraphValidationResult;
@@ -1 +1 @@
1
- export function buildSemanticGraph(a,b){const c=[],d=[],e=[];c['push']({'id':'main_permission','type':'permission','purpose':'Role-based\x20access\x20control\x20for\x20merchant,\x20customer,\x20and\x20optional\x20arbitrator','derivedFrom':{'intentField':'roles','rationale':'All\x20WOW\x20services\x20require\x20a\x20Permission\x20object\x20for\x20role\x20management'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_permission','mapsTo':'object.name'}},'expectedState':{'published':!![],'paused':![]}});(a['intent']['startsWith']('sell_')||a['intent']==='rent_asset')&&(c['push']({'id':'main_service','type':'service','purpose':'Main\x20service\x20offering:\x20'+a['description'],'derivedFrom':{'intentField':'description','rationale':'Service\x20is\x20the\x20primary\x20object\x20representing\x20the\x20merchant\x20offering'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_service','mapsTo':'object.name'},'type_parameter':{'type':'string','value':a['payment']['currency'],'mapsTo':'object.type_parameter'},'permission':{'type':'address_ref','targetId':'main_permission','mapsTo':'object.permission'}},'expectedState':{'published':!![],'paused':![]}}),d['push']({'from':'main_service','to':'main_permission','relation':'has_permission','required':!![],'derivedFrom':{'intentField':'roles','rationale':'Service\x20must\x20reference\x20its\x20Permission\x20object'}}));(a['payment']['model']==='milestone'||a['deliverables']['length']>0x1)&&(c['push']({'id':'main_machine','type':'machine','purpose':'Workflow\x20controlling\x20deliverable\x20milestones\x20and\x20acceptance','derivedFrom':{'intentField':'deliverables','rationale':'Multiple\x20deliverables\x20or\x20milestone\x20payment\x20requires\x20Machine\x20workflow'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_machine','mapsTo':'object.name'},'permission':{'type':'address_ref','targetId':'main_permission','mapsTo':'object.permission'}},'expectedState':{'published':!![],'paused':![]}}),c['find'](l=>l['id']==='main_service')&&d['push']({'from':'main_service','to':'main_machine','relation':'uses_machine','required':!![],'derivedFrom':{'intentField':'deliverables','rationale':'Service\x20binds\x20to\x20Machine\x20for\x20workflow\x20execution'}}));(a['payment']['model']==='milestone'||a['payment']['model']==='escrow'||a['trust']['escrow'])&&(c['push']({'id':'main_allocation','type':'allocation','purpose':'Fund\x20distribution\x20among\x20merchant\x20and\x20optional\x20suppliers','derivedFrom':{'intentField':'payment.allocation','rationale':'Escrow/milestone\x20requires\x20Allocation\x20for\x20fund\x20routing'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_allocation','mapsTo':'object.name'},'type_parameter':{'type':'string','value':a['payment']['currency'],'mapsTo':'object.type_parameter'},'permission':{'type':'address_ref','targetId':'main_permission','mapsTo':'object.permission'}},'expectedState':{'published':!![],'paused':![]}}),c['find'](l=>l['id']==='main_service')&&d['push']({'from':'main_service','to':'main_allocation','relation':'has_order_allocators','required':!![],'derivedFrom':{'intentField':'payment','rationale':'Service\x20must\x20bind\x20Allocation\x20for\x20order\x20fund\x20routing'}}));a['trust']['arbitration']!=='none'&&(c['push']({'id':'main_arbitration','type':'arb','purpose':'Independent\x20dispute\x20resolution','derivedFrom':{'intentField':'trust.arbitration','rationale':'Arbitration\x20object\x20provides\x20binding\x20dispute\x20resolution'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_arbitration','mapsTo':'object.name'},'type_parameter':{'type':'string','value':a['payment']['currency'],'mapsTo':'object.type_parameter'}},'expectedState':{'published':!![],'paused':![]}}),c['push']({'id':'arb_permission','type':'permission','purpose':'Independent\x20permission\x20for\x20arbitration\x20(MUST\x20differ\x20from\x20Service.permission)','derivedFrom':{'intentField':'trust.arbitration','rationale':'Contract-enforced:\x20arbitration.permission\x20!=\x20service.permission\x20(E_ARBITRATION_PERMISSION_CONFLICT=33)'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_arb_permission','mapsTo':'object.name'}},'expectedState':{'published':!![],'paused':![]}}),d['push']({'from':'main_arbitration','to':'arb_permission','relation':'has_permission','required':!![],'derivedFrom':{'intentField':'trust.arbitration','rationale':'Arbitration\x20requires\x20its\x20own\x20Permission'}}),c['find'](l=>l['id']==='main_service')&&d['push']({'from':'main_service','to':'main_arbitration','relation':'has_arbitration','required':![],'derivedFrom':{'intentField':'trust.arbitration','rationale':'Service\x20references\x20Arbitration\x20in\x20arbitrations\x20list'}}));const f=b['some'](l=>l['id']==='wip_provenance'||l['id']==='subscription_with_proof'||l['id']==='damage_attestation');f&&c['push']({'id':'main_repository','type':'repository','purpose':'Store\x20WIP\x20hashes\x20and\x20delivery\x20evidence','derivedFrom':{'intentField':'deliverables','rationale':'WIP\x20provenance\x20requires\x20Repository\x20for\x20hash\x20commitments'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_repository','mapsTo':'object.name'},'permission':{'type':'address_ref','targetId':'main_permission','mapsTo':'object.permission'}},'expectedState':{'published':!![],'paused':![]}});for(const l of b){for(const m of l['templateRefs']){if(m['object_type']==='guard')c['push']({'id':'guard_'+l['id'],'type':'guard','purpose':m['purpose'],'derivedFrom':{'intentField':'trust','rationale':'Guard\x20for\x20'+l['name']+'\x20module'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_'+l['id']+'_guard','mapsTo':'object.name'}},'expectedState':{'published':!![],'paused':![]}});else{if(m['template_id']['startsWith']('supplier-')){const n='supplier_'+l['id']+'_'+m['object_type'];if(c['some'](p=>p['id']===n))continue;c['push']({'id':n,'type':m['object_type'],'purpose':m['purpose'],'derivedFrom':{'intentField':'roles.suppliers','rationale':'Supplier\x20'+m['object_type']+'\x20for\x20'+l['name']+'\x20(B-6\x20two-hop\x20waterfall)'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_'+l['id']+'_'+m['object_type'],'mapsTo':'object.name'}},'expectedState':{'published':!![],'paused':![]}});const o=c['find'](p=>p['id']==='main_service');o&&d['push']({'from':'main_service','to':n,'relation':'sub_order','required':![],'derivedFrom':{'intentField':'payment.allocation','rationale':'Two-hop\x20waterfall:\x20main\x20order\x20→\x20tier-1\x20allocation\x20→\x20supplier\x20sub-order\x20→\x20tier-2\x20allocation\x20('+l['name']+')'}});}}}}if(a['intent']['startsWith']('sell_')||a['intent']==='rent_asset'){c['push']({'id':'main_contact','type':'contact','purpose':'Public\x20contact/IM\x20channel\x20so\x20customers\x20can\x20reach\x20the\x20merchant\x20before\x20ordering','derivedFrom':{'intentField':'description','rationale':'A\x20discoverable\x20contact\x20object\x20improves\x20customer\x20trust\x20and\x20order\x20conversion'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_contact','mapsTo':'object.name'},'description':{'type':'string','value':a['description'],'mapsTo':'object.description'}},'expectedState':{'published':!![],'paused':![]}});const p=c['find'](q=>q['id']==='main_service');p&&(p['config']['um']={'type':'address_ref','targetId':'main_contact','mapsTo':'object.um'},d['push']({'from':'main_service','to':'main_contact','relation':'has_contact','required':![],'derivedFrom':{'intentField':'description','rationale':'Service\x20binds\x20Contact\x20via\x20um\x20so\x20customers\x20can\x20reach\x20the\x20merchant'}}));}(a['intent']['startsWith']('sell_')||a['intent']==='rent_asset')&&(c['push']({'id':'main_reward','type':'reward','purpose':'Optional\x20incentive\x20pool\x20(discount/referral)\x20to\x20attract\x20and\x20retain\x20customers','derivedFrom':{'intentField':'payment','rationale':'Rewards\x20lower\x20acquisition\x20cost\x20and\x20boost\x20conversion'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_reward','mapsTo':'object.name'},'type_parameter':{'type':'string','value':a['payment']['currency'],'mapsTo':'object.type_parameter'},'permission':{'type':'address_ref','targetId':'main_permission','mapsTo':'object.permission'}},'expectedState':{'published':!![],'paused':![]}}),c['find'](q=>q['id']==='main_service')&&d['push']({'from':'main_service','to':'main_reward','relation':'has_rewards','required':![],'derivedFrom':{'intentField':'payment','rationale':'Service\x20can\x20reference\x20Reward\x20in\x20its\x20rewards\x20list'}}));e['push']({'id':'service_permission_bound','level':'hard','description':'Service\x20must\x20be\x20bound\x20to\x20a\x20Permission\x20object','source':{'layer':'contract','reference':'service.move:\x20permission\x20field\x20is\x20required'},'fixSuggestion':'Create\x20Permission\x20object\x20first,\x20then\x20reference\x20it\x20in\x20Service.object.permission'});a['trust']['arbitration']!=='none'&&e['push']({'id':'arbitration_permission_independent','level':'hard','description':'Arbitration.permission\x20MUST\x20be\x20different\x20from\x20Service.permission','source':{'layer':'contract','reference':'service.move:433-436\x20E_ARBITRATION_PERMISSION_CONFLICT=33'},'fixSuggestion':'Create\x20a\x20dedicated\x20Permission\x20object\x20for\x20Arbitration,\x20do\x20NOT\x20reuse\x20Service.permission'});a['payment']['model']==='milestone'&&e['push']({'id':'machine_bound_before_publish','level':'hard','description':'Machine\x20must\x20be\x20published\x20and\x20bound\x20to\x20Service\x20before\x20Service.publish','source':{'layer':'contract','reference':'service.move:\x20machine\x20is\x20IMMUTABLE\x20after\x20publish'},'fixSuggestion':'Create\x20and\x20publish\x20Machine\x20before\x20calling\x20Service.publish.\x20Machine\x20cannot\x20be\x20changed\x20after\x20Service\x20is\x20published.'});const g=calculateModuleScoreBoost(b),h=Math['min'](0x64,0x28+Object['values'](g)['reduce']((q,r)=>q+r,0x0)/0x2),i=Math['min'](0x64,0x32+(g['trust']??0x0)+(g['fund_safety']??0x0)),j=Math['min'](0x64,0x1e+b['length']*0x8),k={'estimatedRiskScore':h,'estimatedTrustScore':i,'estimatedCompletenessScore':j,'keyRisks':[...a['trust']['arbitration']==='none'?['No\x20arbitration\x20configured\x20—\x20disputes\x20have\x20no\x20resolution\x20path']:[],...a['payment']['model']==='upfront'&&a['trust']['refundPolicy']==='no_refund'?['Full\x20upfront\x20+\x20no\x20refund\x20=\x20high\x20user\x20risk']:[]],'strengths':b['map'](q=>q['name']+':\x20'+q['description']['slice'](0x0,0x3c)+'...'),'moduleBoosts':g};return{'nodes':c,'edges':d,'constraints':e,'evaluationPreview':k,'adoptedModules':b['map'](q=>q['id']),'businessIntent':a};}function calculateModuleScoreBoost(a){const b={};for(const c of a){for(const d of c['evaluationImpact']){const e=d['effect']==='required'?0xf:d['effect']==='boost'?0x8:0x3;b[d['dimension']]=(b[d['dimension']]??0x0)+e;}}return b;}export function validateGraph(a){const b=[],c=[],d=[];for(const e of a['constraints']){if(e['id']==='service_permission_bound'){const f=a['nodes']['some'](h=>h['type']==='service'),g=a['edges']['some'](h=>h['relation']==='has_permission'&&h['from']['startsWith']('main_service'));f&&!g&&b['push'](e);}if(e['id']==='arbitration_permission_independent'){const h=a['nodes']['find'](j=>j['id']==='main_service'),i=a['nodes']['find'](j=>j['id']==='main_arbitration');if(h&&i){const j=a['edges']['find'](l=>l['from']==='main_service'&&l['relation']==='has_permission')?.['to'],k=a['edges']['find'](l=>l['from']==='main_arbitration'&&l['relation']==='has_permission')?.['to'];j&&k&&j===k&&b['push'](e);}}if(e['level']==='soft')c['push'](e);else e['level']==='info'&&d['push'](e);}return{'valid':b['length']===0x0,'hardViolations':b,'softViolations':c,'infoNotes':d};}
1
+ export function buildSemanticGraph(a,b,c,d){const e=[],f=[],h=[],j=c?.['machine_shape']??[],k=c?.['allocator'],l=!!k&&!d?.['paymentExplicit']&&(k['count']>0x1||k['recipient']!=='signer');e['push']({'id':'main_permission','type':'permission','purpose':'Role-based\x20access\x20control\x20for\x20merchant,\x20customer,\x20and\x20optional\x20arbitrator','derivedFrom':{'intentField':'roles','rationale':'All\x20WOW\x20services\x20require\x20a\x20Permission\x20object\x20for\x20role\x20management'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_permission','mapsTo':'object.name'}},'expectedState':{'published':!![],'paused':![]}});(a['intent']['startsWith']('sell_')||a['intent']==='rent_asset')&&(e['push']({'id':'main_service','type':'service','purpose':'Main\x20service\x20offering:\x20'+a['description'],'derivedFrom':{'intentField':'description','rationale':'Service\x20is\x20the\x20primary\x20object\x20representing\x20the\x20merchant\x20offering'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_service','mapsTo':'object.name'},'type_parameter':{'type':'string','value':a['payment']['currency'],'mapsTo':'object.type_parameter'},'permission':{'type':'address_ref','targetId':'main_permission','mapsTo':'object.permission'}},'expectedState':{'published':!![],'paused':![]}}),f['push']({'from':'main_service','to':'main_permission','relation':'has_permission','required':!![],'derivedFrom':{'intentField':'roles','rationale':'Service\x20must\x20reference\x20its\x20Permission\x20object'}}));(a['payment']['model']==='milestone'||a['deliverables']['length']>0x1||j['length']>0x0)&&(e['push']({'id':'main_machine','type':'machine','purpose':'Workflow\x20controlling\x20deliverable\x20milestones\x20and\x20acceptance','derivedFrom':j['length']>0x0?{'intentField':'industry','rationale':'Mode\x20\x27'+c['name']+'\x27\x20machine_shape\x20prior:\x20'+j['length']+'\x20nodes'}:{'intentField':'deliverables','rationale':'Multiple\x20deliverables\x20or\x20milestone\x20payment\x20requires\x20Machine\x20workflow'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_machine','mapsTo':'object.name'},'permission':{'type':'address_ref','targetId':'main_permission','mapsTo':'object.permission'},...j['length']>0x0?{'nodes':{'type':'string','value':j['map'](s=>s['name'])['join']('\x20→\x20'),'mapsTo':'machine.nodes'}}:{}},'expectedState':{'published':!![],'paused':![]}}),e['find'](s=>s['id']==='main_service')&&f['push']({'from':'main_service','to':'main_machine','relation':'uses_machine','required':!![],'derivedFrom':{'intentField':'deliverables','rationale':'Service\x20binds\x20to\x20Machine\x20for\x20workflow\x20execution'}}));(a['payment']['model']==='milestone'||a['payment']['model']==='escrow'||a['trust']['escrow']||l)&&(e['push']({'id':'main_allocation','type':'allocation','purpose':'Fund\x20distribution\x20among\x20merchant\x20and\x20optional\x20suppliers','derivedFrom':l&&a['payment']['model']!=='milestone'&&a['payment']['model']!=='escrow'&&!a['trust']['escrow']?{'intentField':'industry','rationale':'Mode\x20\x27'+c['name']+'\x27\x20allocator\x20prior:\x20'+k['description']}:{'intentField':'payment.allocation','rationale':'Escrow/milestone\x20requires\x20Allocation\x20for\x20fund\x20routing'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_allocation','mapsTo':'object.name'},'type_parameter':{'type':'string','value':a['payment']['currency'],'mapsTo':'object.type_parameter'},'permission':{'type':'address_ref','targetId':'main_permission','mapsTo':'object.permission'},...k?{'allocator_strategy':{'type':'string','value':k['description'],'mapsTo':'allocation.strategy'},'allocator_mode':{'type':'enum','value':k['mode'],'allowed':['amount','rate','surplus'],'mapsTo':'allocation.mode'},'allocator_recipient_count':{'type':'number','value':k['count'],'mapsTo':'allocation.recipients'}}:{}},'expectedState':{'published':!![],'paused':![]}}),e['find'](s=>s['id']==='main_service')&&f['push']({'from':'main_service','to':'main_allocation','relation':'has_order_allocators','required':!![],'derivedFrom':{'intentField':'payment','rationale':'Service\x20must\x20bind\x20Allocation\x20for\x20order\x20fund\x20routing'}}));a['trust']['arbitration']!=='none'&&(e['push']({'id':'main_arbitration','type':'arb','purpose':'Independent\x20dispute\x20resolution','derivedFrom':{'intentField':'trust.arbitration','rationale':'Arbitration\x20object\x20provides\x20binding\x20dispute\x20resolution'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_arbitration','mapsTo':'object.name'},'type_parameter':{'type':'string','value':a['payment']['currency'],'mapsTo':'object.type_parameter'}},'expectedState':{'published':!![],'paused':![]}}),e['push']({'id':'arb_permission','type':'permission','purpose':'Independent\x20permission\x20for\x20arbitration\x20(MUST\x20differ\x20from\x20Service.permission)','derivedFrom':{'intentField':'trust.arbitration','rationale':'Contract-enforced:\x20arbitration.permission\x20!=\x20service.permission\x20(E_ARBITRATION_PERMISSION_CONFLICT=33)'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_arb_permission','mapsTo':'object.name'}},'expectedState':{'published':!![],'paused':![]}}),f['push']({'from':'main_arbitration','to':'arb_permission','relation':'has_permission','required':!![],'derivedFrom':{'intentField':'trust.arbitration','rationale':'Arbitration\x20requires\x20its\x20own\x20Permission'}}),e['find'](s=>s['id']==='main_service')&&f['push']({'from':'main_service','to':'main_arbitration','relation':'has_arbitration','required':![],'derivedFrom':{'intentField':'trust.arbitration','rationale':'Service\x20references\x20Arbitration\x20in\x20arbitrations\x20list'}}));const m=b['some'](s=>s['id']==='wip_provenance'||s['id']==='subscription_with_proof'||s['id']==='damage_attestation');m&&e['push']({'id':'main_repository','type':'repository','purpose':'Store\x20WIP\x20hashes\x20and\x20delivery\x20evidence','derivedFrom':{'intentField':'deliverables','rationale':'WIP\x20provenance\x20requires\x20Repository\x20for\x20hash\x20commitments'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_repository','mapsTo':'object.name'},'permission':{'type':'address_ref','targetId':'main_permission','mapsTo':'object.permission'}},'expectedState':{'published':!![],'paused':![]}});for(const s of b){for(const t of s['templateRefs']){if(t['object_type']==='guard')e['push']({'id':'guard_'+s['id'],'type':'guard','purpose':t['purpose'],'derivedFrom':{'intentField':'trust','rationale':'Guard\x20for\x20'+s['name']+'\x20module'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_'+s['id']+'_guard','mapsTo':'object.name'}},'expectedState':{'published':!![],'paused':![]}});else{if(t['template_id']['startsWith']('supplier-')){const u='supplier_'+s['id']+'_'+t['object_type'];if(e['some'](w=>w['id']===u))continue;e['push']({'id':u,'type':t['object_type'],'purpose':t['purpose'],'derivedFrom':{'intentField':'roles.suppliers','rationale':'Supplier\x20'+t['object_type']+'\x20for\x20'+s['name']+'\x20(B-6\x20two-hop\x20waterfall)'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_'+s['id']+'_'+t['object_type'],'mapsTo':'object.name'}},'expectedState':{'published':!![],'paused':![]}});const v=e['find'](w=>w['id']==='main_service');v&&f['push']({'from':'main_service','to':u,'relation':'sub_order','required':![],'derivedFrom':{'intentField':'payment.allocation','rationale':'Two-hop\x20waterfall:\x20main\x20order\x20→\x20tier-1\x20allocation\x20→\x20supplier\x20sub-order\x20→\x20tier-2\x20allocation\x20('+s['name']+')'}});}}}}if(a['intent']['startsWith']('sell_')||a['intent']==='rent_asset'){e['push']({'id':'main_contact','type':'contact','purpose':'Public\x20contact/IM\x20channel\x20so\x20customers\x20can\x20reach\x20the\x20merchant\x20before\x20ordering','derivedFrom':{'intentField':'description','rationale':'A\x20discoverable\x20contact\x20object\x20improves\x20customer\x20trust\x20and\x20order\x20conversion'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_contact','mapsTo':'object.name'},'description':{'type':'string','value':a['description'],'mapsTo':'object.description'}},'expectedState':{'published':!![],'paused':![]}});const w=e['find'](x=>x['id']==='main_service');w&&(w['config']['um']={'type':'address_ref','targetId':'main_contact','mapsTo':'object.um'},f['push']({'from':'main_service','to':'main_contact','relation':'has_contact','required':![],'derivedFrom':{'intentField':'description','rationale':'Service\x20binds\x20Contact\x20via\x20um\x20so\x20customers\x20can\x20reach\x20the\x20merchant'}}));}(a['intent']['startsWith']('sell_')||a['intent']==='rent_asset')&&(e['push']({'id':'main_reward','type':'reward','purpose':'Optional\x20incentive\x20pool\x20(discount/referral)\x20to\x20attract\x20and\x20retain\x20customers','derivedFrom':{'intentField':'payment','rationale':'Rewards\x20lower\x20acquisition\x20cost\x20and\x20boost\x20conversion'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_reward','mapsTo':'object.name'},'type_parameter':{'type':'string','value':a['payment']['currency'],'mapsTo':'object.type_parameter'},'permission':{'type':'address_ref','targetId':'main_permission','mapsTo':'object.permission'}},'expectedState':{'published':!![],'paused':![]}}),e['find'](x=>x['id']==='main_service')&&f['push']({'from':'main_service','to':'main_reward','relation':'has_rewards','required':![],'derivedFrom':{'intentField':'payment','rationale':'Service\x20can\x20reference\x20Reward\x20in\x20its\x20rewards\x20list'}}));if(c?.['guards']?.['length']){const x=y=>{switch(y){case'service':return e['find'](z=>z['id']==='main_service')?.['id'];case'machine':return e['find'](z=>z['id']==='main_machine')?.['id'];case'reward':return e['find'](z=>z['id']==='main_reward')?.['id'];case'repository':return e['find'](z=>z['id']==='main_repository')?.['id'];case'arbitration':return e['find'](z=>z['id']==='main_arbitration')?.['id'];default:return undefined;}};for(const y of c['guards']){const z='guard_'+y['template_id'];if(e['some'](B=>B['id']===z))continue;const A=x(y['host']);if(!A)continue;e['push']({'id':z,'type':'guard','purpose':y['purpose'],'derivedFrom':{'intentField':'industry','rationale':'Mode\x20\x27'+c['name']+'\x27\x20guard\x20prior\x20('+y['host']+'\x20host)'},'config':{'name':{'type':'string','value':a['description']['slice'](0x0,0x14)+'_'+y['template_id'],'mapsTo':'object.name'},'template':{'type':'string','value':y['template_id'],'mapsTo':'guard.template'}},'expectedState':{'published':!![],'paused':![]}}),f['push']({'from':A,'to':z,'relation':'has_guard','required':![],'derivedFrom':{'intentField':'industry','rationale':'Mode\x20\x27'+c['name']+'\x27\x20attaches\x20'+y['template_id']+'\x20to\x20'+y['host']}});}}if(c?.['config_overrides'])for(const [B,C]of Object['entries'](c['config_overrides'])){for(const D of e){if(D['type']!==B)continue;for(const [E,F]of Object['entries'](C)){if(D['config'][E]!==undefined)continue;if(typeof F==='string')D['config'][E]={'type':'string','value':F,'mapsTo':'object.'+E};else{if(typeof F==='number')D['config'][E]={'type':'number','value':F,'mapsTo':'object.'+E};else typeof F==='boolean'&&(D['config'][E]={'type':'boolean','value':F,'mapsTo':'object.'+E});}}}}h['push']({'id':'service_permission_bound','level':'hard','description':'Service\x20must\x20be\x20bound\x20to\x20a\x20Permission\x20object','source':{'layer':'contract','reference':'service.move:\x20permission\x20field\x20is\x20required'},'fixSuggestion':'Create\x20Permission\x20object\x20first,\x20then\x20reference\x20it\x20in\x20Service.object.permission'});a['trust']['arbitration']!=='none'&&h['push']({'id':'arbitration_permission_independent','level':'hard','description':'Arbitration.permission\x20MUST\x20be\x20different\x20from\x20Service.permission','source':{'layer':'contract','reference':'service.move:433-436\x20E_ARBITRATION_PERMISSION_CONFLICT=33'},'fixSuggestion':'Create\x20a\x20dedicated\x20Permission\x20object\x20for\x20Arbitration,\x20do\x20NOT\x20reuse\x20Service.permission'});a['payment']['model']==='milestone'&&h['push']({'id':'machine_bound_before_publish','level':'hard','description':'Machine\x20must\x20be\x20published\x20and\x20bound\x20to\x20Service\x20before\x20Service.publish','source':{'layer':'contract','reference':'service.move:\x20machine\x20is\x20IMMUTABLE\x20after\x20publish'},'fixSuggestion':'Create\x20and\x20publish\x20Machine\x20before\x20calling\x20Service.publish.\x20Machine\x20cannot\x20be\x20changed\x20after\x20Service\x20is\x20published.'});if(c){h['push']({'id':'mode_key_risk','level':'info','description':'['+c['display_name']+']\x20key\x20risk:\x20'+c['key_risk'],'source':{'layer':'industry_mode','reference':c['name']},'fixSuggestion':c['build_notes']?.[0x0]??'Adopt\x20the\x20mode\x27s\x20guard/allocator\x20priors\x20when\x20materializing\x20objects'});for(let G=0x0;G<(c['build_notes']??[])['length'];G++){h['push']({'id':'mode_build_note_'+G,'level':'info','description':'['+c['display_name']+']\x20'+c['build_notes'][G],'source':{'layer':'industry_mode','reference':c['name']},'fixSuggestion':'Apply\x20this\x20note\x20during\x20object\x20materialization'});}c['risk_constraints']['require_arbitration']&&a['trust']['arbitration']==='none'&&h['push']({'id':'mode_requires_arbitration','level':'soft','description':'Mode\x20\x27'+c['display_name']+'\x27\x20requires\x20arbitration,\x20but\x20intent\x20trust.arbitration\x20is\x20\x27none\x27','source':{'layer':'industry_mode','reference':c['name']+'.risk_constraints.require_arbitration'},'fixSuggestion':'Set\x20guide_confirm.trust.arbitration\x20to\x20a\x20dispute\x20resolution\x20mode,\x20or\x20the\x20plan\x20ships\x20without\x20the\x20mode\x27s\x20safety\x20net'});}const n=calculateModuleScoreBoost(b),o=Math['min'](0x64,0x28+Object['values'](n)['reduce']((H,I)=>H+I,0x0)/0x2),p=Math['min'](0x64,0x32+(n['trust']??0x0)+(n['fund_safety']??0x0)),q=Math['min'](0x64,0x1e+b['length']*0x8),r={'estimatedRiskScore':o,'estimatedTrustScore':p,'estimatedCompletenessScore':q,'keyRisks':[...c?['['+c['display_name']+']\x20'+c['key_risk']]:[],...a['trust']['arbitration']==='none'?['No\x20arbitration\x20configured\x20—\x20disputes\x20have\x20no\x20resolution\x20path']:[],...a['payment']['model']==='upfront'&&a['trust']['refundPolicy']==='no_refund'?['Full\x20upfront\x20+\x20no\x20refund\x20=\x20high\x20user\x20risk']:[]],'strengths':[...b['map'](H=>H['name']+':\x20'+H['description']['slice'](0x0,0x3c)+'...'),...(c?.['expected_benefits']??[])['map'](H=>H['metric']+':\x20'+H['expected_value']+'\x20('+H['evidence']+')')],'moduleBoosts':n};return{'nodes':e,'edges':f,'constraints':h,'evaluationPreview':r,'adoptedModules':b['map'](H=>H['id']),'businessIntent':a};}function calculateModuleScoreBoost(a){const b={};for(const c of a){for(const d of c['evaluationImpact']){const e=d['effect']==='required'?0xf:d['effect']==='boost'?0x8:0x3;b[d['dimension']]=(b[d['dimension']]??0x0)+e;}}return b;}export function validateGraph(a){const b=[],c=[],d=[];for(const e of a['constraints']){if(e['id']==='service_permission_bound'){const f=a['nodes']['some'](h=>h['type']==='service'),g=a['edges']['some'](h=>h['relation']==='has_permission'&&h['from']['startsWith']('main_service'));f&&!g&&b['push'](e);}if(e['id']==='arbitration_permission_independent'){const h=a['nodes']['find'](j=>j['id']==='main_service'),i=a['nodes']['find'](j=>j['id']==='main_arbitration');if(h&&i){const j=a['edges']['find'](l=>l['from']==='main_service'&&l['relation']==='has_permission')?.['to'],k=a['edges']['find'](l=>l['from']==='main_arbitration'&&l['relation']==='has_permission')?.['to'];j&&k&&j===k&&b['push'](e);}}if(e['level']==='soft')c['push'](e);else e['level']==='info'&&d['push'](e);}return{'valid':b['length']===0x0,'hardViolations':b,'softViolations':c,'infoNotes':d};}
@@ -1 +1 @@
1
- import{Config,LocalMark,query_serviceContext,query_object_last_updated,queryTableItem_ServiceOrders,query_affiliations,query_objects,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{generateBusinessReport}from'./reverse-mapping.js';import{resolveSupplyChainGraph}from'../../knowledge/supply-chain.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 R=await LocalMark['Instance']()['get_address'](c);if(!R)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=R;}let k=await query_serviceContext({'service':j,'include_machine_nodes':!![],'network':f});if(!k?.['service']&&d){const S=await Config['Instance']()['network_get']();S&&S!==f&&(f=S,k=await query_serviceContext({'service':j,'include_machine_nodes':!![],'network':f}));}const l=k['service'];j=l['object']??j;const m=new Set(),n=T=>{if(T)m['add'](T);};n(j),n(l['machine']),n(l['permission']),n(l['um']);for(const T of l['arbitrations']??[])n(T);for(const U of l['rewards']??[])n(U);for(const V of l['repositories']??[])n(V);const p=k['permission'];if(p){const W=Array['isArray'](p['admin'])?p['admin']:[];W[0x0]&&n(typeof W[0x0]==='string'?W[0x0]:W[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=X=>X?q['get'](X)??{'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:X,edges:Y}=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':X,'edges':Y};}let B=null;try{const Z=await query_object_last_updated({'object':j,'network':f});Z?.['timestamp_ms']&&(B={'timestamp_ms':Z['timestamp_ms'],'digest':Z['digest']??null,'sender':Z['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 a0=[l];for(const a1 of Object['values'](k['referenced']??{})){if(a1&&a1['object']!==j)a0['push'](a1);}E=generateBusinessReport({'objects':a0,'machine_nodes':A['map'](a2=>({'name':a2['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=async a2=>{if(a2===null||a2===undefined||a2==='')return{'display':'','tip':''};if(!H)return{'display':a2,'tip':''};try{const a3=await formatChainValue(a2,H,f);if(a3['precision_known'])return{'display':a3['symbol']?a3['display']+'\x20'+a3['symbol']:a3['display'],'tip':a3['text']};return{'display':a2,'tip':''};}catch{return{'display':a2,'tip':''};}};let J=null;try{const a2=await queryTableItem_ServiceOrders({'address':j,'no_cache':!![],'network':f}),a3=Array['isArray'](a2?.['items'])?a2['items']:[],a4=a3['map'](ab=>typeof ab?.['who']==='string'?ab['who']:'')['filter'](ab=>ab!==''),a5=new Map();try{if(a4['length']>0x0){const ab=await query_objects({'objects':a4,'network':f});for(const ac of ab?.['objects']??[]){ac&&ac['type']===ObjectType['Order']&&a5['set'](ac['object'],ac);}}}catch{h['push']('recent_orders:\x20order\x20details\x20unavailable\x20(non-blocking)');}const a6=new Map(),a7=new Map(),a8=new Map();try{const ad=new Set();for(const ae of a5['values']()){if(ae?.['progress'])ad['add'](ae['progress']);if(ae?.['allocation'])ad['add'](ae['allocation']);}if(ad['size']>0x0){const af=await query_objects({'objects':Array['from'](ad),'network':f});for(const ag of af?.['objects']??[]){if(!ag?.['object'])continue;if(ag['type']===ObjectType['Progress']){const ah=ag?.['current'];a6['set'](ag['object'],typeof ah==='string'&&ah!==''?ah:null),a7['set'](ag['object'],Number(ag?.['current_time'])||null);}else{if(ag['type']===ObjectType['Allocation']){const ai=Number(ag?.['balance']??0x0);a8['set'](ag['object'],Number['isFinite'](ai)&&ai===0x0?'allocated':'pending');}}}}}catch{h['push']('recent_orders:\x20progress/allocation\x20details\x20unavailable\x20(non-blocking)');}const a9=new Map();try{const aj=Array['from'](new Set(a3['map'](al=>typeof al?.['who']==='string'?al['who']:'')['filter'](Boolean))),ak=await Promise['allSettled'](aj['map'](al=>query_object_last_updated({'object':al,'network':f})));for(let al=0x0;al<aj['length'];al++){const am=ak[al];a9['set'](aj[al],am['status']==='fulfilled'&&am['value']?.['timestamp_ms']?Number(am['value']['timestamp_ms'])||null:null);}}catch{h['push']('recent_orders:\x20order\x20updated\x20times\x20unavailable\x20(non-blocking)');}const aa=await Promise['all'](a3['map'](async an=>{const ao=typeof an?.['who']==='string'?an['who']:'',ap=a5['get'](ao),aq=ap?.['amount']!==null&&ap?.['amount']!==undefined?String(ap['amount']):'',ar=await I(aq);return{'order':ao,'time':typeof an?.['time']==='number'?an['time']:0x0,'updated_ms':a9['get'](ao)??null,'amount':aq,'amount_display':ar['display'],'amount_tip':ar['tip'],'progress':ap?.['progress']??null,'allocation':ap?.['allocation']??null,'disputes':Array['isArray'](ap?.['dispute'])?ap['dispute']:[],'agent':Array['isArray'](ap?.['agent'])?ap['agent']:[],'owner':ownerAddr(ap?.['builder']??ap?.['owner']),'claimed_by':ap?.['claimed_by']??null,'required_info':ap?.['required_info']??null,'progress_next':ap?.['progress']?a6['get'](ap['progress'])??null:null,'progress_since':ap?.['progress']?a7['get'](ap['progress'])??null:null,'allocation_state':ap?.['allocation']?a8['get'](ap['allocation'])??'pending':'none','bought':await Promise['all']((Array['isArray'](ap?.['items'])?ap['items']:[])['map'](async as=>({'name':String(as?.['name']??''),'price_display':(await I(as?.['price']!==null&&as?.['price']!==undefined?String(as['price']):'0'))['display'],'quantity':String(as?.['quantity']??'0'),'wip_hash':String(as?.['wip_hash']??'')})))};}));J={'count':a3['length'],'items':aa['filter'](an=>an['order']!=='')['slice'](-0x14)['reverse']()};}catch{h['push']('recent_orders:\x20reverse-index\x20query\x20failed\x20(non-blocking)');}const K=[];try{const an=await query_affiliations({'address':j,'no_cache':!![],'network':f}),ao=new Set(),ap=new Map();for(const ar of an?.['entries']??[]){const as=typeof ar?.['who']==='string'?ar['who']:'';if(!as||ao['has'](as))continue;ao['add'](as);const at=objectTypeFromAddress(as);if(!at)continue;if(at===ObjectType['Order'])continue;const au=String(at);let av=ap['get'](au);!av&&(av=[],ap['set'](au,av)),av['push']({'address':as,'type_label':au,'name':x(as)['name'],'time':typeof ar?.['time']==='number'?ar['time']:null});}const aq=['Progress','Allocation','Payment','Guard'];for(const aw of aq){const ax=ap['get'](aw);ax&&ax['length']>0x0&&(K['push']({'type_label':aw,'items':ax}),ap['delete'](aw));}for(const [ay,az]of ap){if(az['length']>0x0)K['push']({'type_label':ay,'items':az});}}catch{h['push']('related:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}const L=[];for(const aA of k['allocator_guards']??[]){const aB=summarizeGuard(aA);if(aB)L['push'](aB);}const M=[];for(const aC of Array['isArray'](l['sales'])?l['sales']:[]){const aD=balanceStr(aC?.['price']),aE=await I(aD);M['push']({'name':typeof aC?.['name']==='string'?aC['name']:'','price':aD,'price_display':aE['display'],'price_tip':aE['tip'],'stock':balanceStr(aC?.['stock']),'suspension':aC?.['suspension']===!![],'wip':typeof aC?.['wip']==='string'?aC['wip']:'','wip_hash':typeof aC?.['wip_hash']==='string'?aC['wip_hash']:''});}const N=l['order_allocators']?{'description':l['order_allocators']['description']??'','threshold':balanceStr(l['order_allocators']['threshold']),'allocators':(l['order_allocators']['allocators']??[])['map'](aF=>({'guard':aF['guard'],'sharing_count':Array['isArray'](aF['sharing'])?aF['sharing']['length']:0x0,'max':balanceStr(aF['max']??null)}))}:null,O=summarizePermission(k['permission'],x(l['permission'])),P=O?.['owner']??B?.['sender']??null,Q=P?await markOf(P):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':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,'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':D,'trust':C,'business_report':E,'recent_orders':J,'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}from'../../knowledge/workflow-guidance.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 R=await LocalMark['Instance']()['get_address'](c);if(!R)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=R;}let k=await query_serviceContext({'service':j,'include_machine_nodes':!![],'network':f});if(!k?.['service']&&d){const S=await Config['Instance']()['network_get']();S&&S!==f&&(f=S,k=await query_serviceContext({'service':j,'include_machine_nodes':!![],'network':f}));}const l=k['service'];j=l['object']??j;const m=new Set(),n=T=>{if(T)m['add'](T);};n(j),n(l['machine']),n(l['permission']),n(l['um']);for(const T of l['arbitrations']??[])n(T);for(const U of l['rewards']??[])n(U);for(const V of l['repositories']??[])n(V);const p=k['permission'];if(p){const W=Array['isArray'](p['admin'])?p['admin']:[];W[0x0]&&n(typeof W[0x0]==='string'?W[0x0]:W[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=X=>X?q['get'](X)??{'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:X,edges:Y}=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':X,'edges':Y};}let B=null;try{const Z=await query_object_last_updated({'object':j,'network':f});Z?.['timestamp_ms']&&(B={'timestamp_ms':Z['timestamp_ms'],'digest':Z['digest']??null,'sender':Z['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 a0=[l];for(const a1 of Object['values'](k['referenced']??{})){if(a1&&a1['object']!==j)a0['push'](a1);}E=generateBusinessReport({'objects':a0,'machine_nodes':A['map'](a2=>({'name':a2['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=async a2=>{if(a2===null||a2===undefined||a2==='')return{'display':'','tip':''};if(!H)return{'display':a2,'tip':''};try{const a3=await formatChainValue(a2,H,f);if(a3['precision_known'])return{'display':a3['symbol']?a3['display']+'\x20'+a3['symbol']:a3['display'],'tip':a3['text']};return{'display':a2,'tip':''};}catch{return{'display':a2,'tip':''};}};let J=null;try{const a2=await fetchServiceOrders(j,f,!![]),a3=Array['isArray'](a2?.['items'])?a2['items']:[],a4=a3['map'](ab=>typeof ab?.['who']==='string'?ab['who']:'')['filter'](ab=>ab!==''),a5=new Map();try{if(a4['length']>0x0){const ab=await batchQueryObjectsByIds(a4,f,!![]);for(const ac of ab){ac&&ac['type']===ObjectType['Order']&&a5['set'](ac['object'],ac);}}}catch{h['push']('recent_orders:\x20order\x20details\x20unavailable\x20(non-blocking)');}const a6=new Map(),a7=new Map(),a8=new Map();try{const ad=new Set();for(const ae of a5['values']()){if(ae?.['progress'])ad['add'](ae['progress']);if(ae?.['allocation'])ad['add'](ae['allocation']);}if(ad['size']>0x0){const af=await batchQueryObjectsByIds(Array['from'](ad),f,!![]);for(const ag of af){if(!ag?.['object'])continue;if(ag['type']===ObjectType['Progress']){const ah=ag?.['current'];a6['set'](ag['object'],typeof ah==='string'&&ah!==''?ah:null),a7['set'](ag['object'],Number(ag?.['current_time'])||null);}else{if(ag['type']===ObjectType['Allocation']){const ai=Number(ag?.['balance']??0x0);a8['set'](ag['object'],Number['isFinite'](ai)&&ai===0x0?'allocated':'pending');}}}}}catch{h['push']('recent_orders:\x20progress/allocation\x20details\x20unavailable\x20(non-blocking)');}const a9=new Map();try{const aj=Array['from'](new Set(a3['map'](al=>typeof al?.['who']==='string'?al['who']:'')['filter'](Boolean))),ak=await Promise['allSettled'](aj['map'](al=>query_object_last_updated({'object':al,'network':f})));for(let al=0x0;al<aj['length'];al++){const am=ak[al];a9['set'](aj[al],am['status']==='fulfilled'&&am['value']?.['timestamp_ms']?Number(am['value']['timestamp_ms'])||null:null);}}catch{h['push']('recent_orders:\x20order\x20updated\x20times\x20unavailable\x20(non-blocking)');}const aa=await Promise['all'](a3['map'](async an=>{const ao=typeof an?.['who']==='string'?an['who']:'',ap=a5['get'](ao),aq=ap?.['amount']!==null&&ap?.['amount']!==undefined?String(ap['amount']):'',ar=await I(aq);return{'order':ao,'time':typeof an?.['time']==='number'?an['time']:0x0,'updated_ms':a9['get'](ao)??null,'amount':aq,'amount_display':ar['display'],'amount_tip':ar['tip'],'progress':ap?.['progress']??null,'allocation':ap?.['allocation']??null,'disputes':Array['isArray'](ap?.['dispute'])?ap['dispute']:[],'agent':Array['isArray'](ap?.['agent'])?ap['agent']:[],'owner':ownerAddr(ap?.['builder']??ap?.['owner']),'claimed_by':ap?.['claimed_by']??null,'required_info':ap?.['required_info']??null,'progress_next':ap?.['progress']?a6['get'](ap['progress'])??null:null,'progress_since':ap?.['progress']?a7['get'](ap['progress'])??null:null,'allocation_state':ap?.['allocation']?a8['get'](ap['allocation'])??'pending':'none','bought':await Promise['all']((Array['isArray'](ap?.['items'])?ap['items']:[])['map'](async as=>({'name':String(as?.['name']??''),'price_display':(await I(as?.['price']!==null&&as?.['price']!==undefined?String(as['price']):'0'))['display'],'quantity':String(as?.['quantity']??'0'),'wip_hash':String(as?.['wip_hash']??'')})))};}));J={'count':a3['length'],'items':aa['filter'](an=>an['order']!=='')['slice'](-0x14)['reverse']()};}catch{h['push']('recent_orders:\x20reverse-index\x20query\x20failed\x20(non-blocking)');}const K=[];try{const an=await query_affiliations({'address':j,'no_cache':!![],'network':f}),ao=new Set(),ap=new Map();for(const ar of an?.['entries']??[]){const as=typeof ar?.['who']==='string'?ar['who']:'';if(!as||ao['has'](as))continue;ao['add'](as);const at=objectTypeFromAddress(as);if(!at)continue;if(at===ObjectType['Order'])continue;const au=String(at);let av=ap['get'](au);!av&&(av=[],ap['set'](au,av)),av['push']({'address':as,'type_label':au,'name':x(as)['name'],'time':typeof ar?.['time']==='number'?ar['time']:null});}const aq=['Progress','Allocation','Payment','Guard'];for(const aw of aq){const ax=ap['get'](aw);ax&&ax['length']>0x0&&(K['push']({'type_label':aw,'items':ax}),ap['delete'](aw));}for(const [ay,az]of ap){if(az['length']>0x0)K['push']({'type_label':ay,'items':az});}}catch{h['push']('related:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}const L=[];for(const aA of k['allocator_guards']??[]){const aB=summarizeGuard(aA);if(aB)L['push'](aB);}const M=[];for(const aC of Array['isArray'](l['sales'])?l['sales']:[]){const aD=balanceStr(aC?.['price']),aE=await I(aD);M['push']({'name':typeof aC?.['name']==='string'?aC['name']:'','price':aD,'price_display':aE['display'],'price_tip':aE['tip'],'stock':balanceStr(aC?.['stock']),'suspension':aC?.['suspension']===!![],'wip':typeof aC?.['wip']==='string'?aC['wip']:'','wip_hash':typeof aC?.['wip_hash']==='string'?aC['wip_hash']:''});}const N=l['order_allocators']?{'description':l['order_allocators']['description']??'','threshold':balanceStr(l['order_allocators']['threshold']),'allocators':(l['order_allocators']['allocators']??[])['map'](aF=>({'guard':aF['guard'],'sharing_count':Array['isArray'](aF['sharing'])?aF['sharing']['length']:0x0,'max':balanceStr(aF['max']??null)}))}:null,O=summarizePermission(k['permission'],x(l['permission'])),P=O?.['owner']??B?.['sender']??null,Q=P?await markOf(P):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':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,'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':D,'trust':C,'business_report':E,'recent_orders':J,'data_gaps':h};}
@@ -0,0 +1,94 @@
1
+ import type { RelationshipProfile } from "./types.js";
2
+ export interface PermissionFacts {
3
+ address: string;
4
+ owner: string;
5
+ admins: string[];
6
+ entities: Array<{
7
+ address: string;
8
+ perm_indices: number[];
9
+ }>;
10
+ anchor_role_bits?: number;
11
+ managed_objects?: Array<{
12
+ object_type: string;
13
+ address: string;
14
+ }>;
15
+ }
16
+ export interface MachineFacts {
17
+ address: string;
18
+ permission_address?: string;
19
+ forwards?: Array<{
20
+ node: string;
21
+ next_node: string;
22
+ forward_name: string;
23
+ named_operator?: string | null;
24
+ permission_index?: number | null;
25
+ guard?: string | null;
26
+ }>;
27
+ }
28
+ export interface OrderFacts {
29
+ address: string;
30
+ owner: string;
31
+ agents: string[];
32
+ service: string;
33
+ amount?: string;
34
+ service_owner?: string;
35
+ allocation?: string;
36
+ dispute_arbitrations?: string[];
37
+ claimed_by?: string | null;
38
+ }
39
+ export interface DemandFacts {
40
+ address: string;
41
+ owner: string;
42
+ presenters?: Array<{
43
+ address: string;
44
+ service?: string;
45
+ acceptance_score?: number;
46
+ }>;
47
+ rewards?: string[];
48
+ guards?: string[];
49
+ }
50
+ export interface AllocationFacts {
51
+ address: string;
52
+ owner?: string;
53
+ sharing?: Array<{
54
+ who: {
55
+ Entity: string;
56
+ } | {
57
+ Signer: true;
58
+ } | {
59
+ GuardIdentifier: number;
60
+ };
61
+ mode: "Amount" | "Rate" | "Surplus";
62
+ sharing?: string;
63
+ guard?: string;
64
+ }>;
65
+ }
66
+ export interface ContactFacts {
67
+ address: string;
68
+ ims: string[];
69
+ owner: string;
70
+ }
71
+ export interface ArbitrationFacts {
72
+ address: string;
73
+ object_kind?: "case" | "service";
74
+ voters?: Array<{
75
+ address: string;
76
+ weight?: number;
77
+ }>;
78
+ order?: string;
79
+ arbitration?: string;
80
+ anchor_side?: "buyer" | "merchant";
81
+ bound_services?: string[];
82
+ }
83
+ export interface RelationshipInput {
84
+ anchor: string;
85
+ permissions?: PermissionFacts[];
86
+ machines?: MachineFacts[];
87
+ orders?: OrderFacts[];
88
+ demands?: DemandFacts[];
89
+ allocations?: AllocationFacts[];
90
+ contacts?: ContactFacts[];
91
+ arbitrations?: ArbitrationFacts[];
92
+ service_owners?: Record<string, string>;
93
+ }
94
+ export declare function deriveRelationshipProfile(input: RelationshipInput): RelationshipProfile;
@@ -0,0 +1 @@
1
+ import{RELATIONSHIP_KIND_REGISTRY,interestHintsFor}from'./registry.js';function eq(c,d){return c['toLowerCase']()===d['toLowerCase']();}function isAddressLike(a){return/^0x[0-9a-fA-F]{4,}$/i['test'](a);}function edge(a,b,c,d,e,f=[]){return{'anchor':a,'counterparty':b,'kind':c,'power':e,'interest':d,'value_flows':f,'tension':RELATIONSHIP_KIND_REGISTRY[c]['tension']};}function pushEdge(a,b){const c=b['counterparty']['toLowerCase']()+'|'+b['kind'],d=a['get'](c);if(d){d['power']['objects']['push'](...b['power']['objects']),d['value_flows']['push'](...b['value_flows']);b['power']['perm_indices']['length']>0x0&&(d['power']['perm_indices']=[...new Set([...d['power']['perm_indices'],...b['power']['perm_indices']])]);return;}a['set'](c,b);}export function deriveRelationshipProfile(a){const b=a['anchor'],c=new Map(),d=[],f=a['service_owners']??{};for(const i of a['permissions']??[]){const j=eq(i['owner'],b),k=i['admins']['some'](m=>eq(m,b)),l=i['entities']['find'](m=>eq(m['address'],b));if(j||k)for(const m of i['entities']){if(eq(m['address'],b))continue;const n='employment';pushEdge(c,edge(b,m['address'],n,interestHintsFor(n,!![]),{'role_bits':(j?0x1:0x0)|(k?0x2:0x0),'perm_indices':[],'objects':(i['managed_objects']??[])['map'](p=>({'object_type':p['object_type'],'address':p['address'],'capacity':'merchant-side\x20authority'})),'carrier':'permission'}));}else{if(l)for(const o of[i['owner'],...i['admins']]){if(!o||eq(o,b))continue;const p='employment';pushEdge(c,edge(b,o,p,interestHintsFor(p,![]),{'role_bits':0x4,'perm_indices':l['perm_indices'],'objects':(i['managed_objects']??[])['map'](q=>({'object_type':q['object_type'],'address':q['address'],'capacity':'entity\x20(perm\x20indices:\x20'+(l['perm_indices']['join'](',\x20')||'none')+')'})),'carrier':'permission'}));}}}for(const q of a['machines']??[]){for(const r of q['forwards']??[]){const t=r['named_operator'];if(!t||eq(t,b))continue;const u='process_operation';isAddressLike(t)?pushEdge(c,edge(b,t,u,interestHintsFor(u,!![]),{'role_bits':0x0,'perm_indices':[],'objects':[{'object_type':'Machine','address':q['address'],'capacity':r['node']+'\x20→\x20'+r['next_node']+'\x20('+r['forward_name']+')\x20named\x20operator'}],'carrier':'machine_forward'})):d['push']('Machine\x20'+q['address']+'\x20forward\x20\x27'+r['forward_name']+'\x27\x20('+r['node']+'\x20→\x20'+r['next_node']+')\x20has\x20named\x20operator\x20\x27'+t+'\x27\x20—\x20named\x20operators\x20resolve\x20per-order\x20via\x20the\x20Progress\x20namedOperator\x20table,\x20so\x20no\x20static\x20edge\x20is\x20derived.');}}for(const v of a['orders']??[]){const w=eq(v['owner'],b),x=v['agents']['some'](A=>eq(A,b)),y=v['service_owner']??f[v['service']],z='transaction';if((w||x)&&y){const A=[];v['amount']&&v['amount']!=='0'&&A['push']({'from':w?b:v['owner'],'to':y,'carrier_object':v['address'],'carrier_type':v['allocation']?'Order\x20→\x20Allocation':'Order\x20(escrow)','amount':v['amount'],'trigger':'workflow\x20reaches\x20a\x20completion\x20terminal\x20(guard-gated)'});const B=edge(b,y,z,interestHintsFor(z,!![]),{'role_bits':w?0x1:0x2,'perm_indices':[],'objects':[{'object_type':'Order','address':v['address'],'capacity':w?'buyer\x20(owner)':'buyer\x27s\x20agent'}],'carrier':'order'},A);v['dispute_arbitrations']?.['length']&&B['power']['objects']['push']({'object_type':'Arbitration','address':v['dispute_arbitrations']['join'](',\x20'),'capacity':'bound\x20dispute\x20paths'}),pushEdge(c,B);}else y&&eq(y,b)&&pushEdge(c,edge(b,v['owner'],z,interestHintsFor(z,![]),{'role_bits':0x4,'perm_indices':[],'objects':[{'object_type':'Order','address':v['address'],'capacity':'merchant\x20side\x20(service)'}],'carrier':'order'},v['amount']&&v['amount']!=='0'?[{'from':v['owner'],'to':b,'carrier_object':v['address'],'carrier_type':v['allocation']?'Order\x20→\x20Allocation':'Order\x20(escrow)','amount':v['amount'],'trigger':'workflow\x20reaches\x20a\x20completion\x20terminal\x20(guard-gated)'}]:[]));if(w)for(const C of v['agents']){if(eq(C,b))continue;const D='agency';pushEdge(c,edge(b,C,D,interestHintsFor(D,!![]),{'role_bits':0x1,'perm_indices':[],'objects':[{'object_type':'Order','address':v['address'],'capacity':'principal'}],'carrier':'order'}));}else{if(x){const E='agency';pushEdge(c,edge(b,v['owner'],E,interestHintsFor(E,![]),{'role_bits':0x2,'perm_indices':[],'objects':[{'object_type':'Order','address':v['address'],'capacity':'agent'}],'carrier':'order'}));}}}for(const F of a['demands']??[]){const G=eq(F['owner'],b);for(const H of F['presenters']??[]){if(eq(H['address'],b)&&G)continue;if(G&&!eq(H['address'],b)){const I='supply',J=edge(b,H['address'],I,interestHintsFor(I,!![]),{'role_bits':0x1,'perm_indices':[],'objects':[{'object_type':'Demand','address':F['address'],'capacity':'presenter\x20(service\x20'+(H['service']??'?')+',\x20score\x20'+(H['acceptance_score']??'n/a')+')'}],'carrier':'demand_presenter'});pushEdge(c,J);}else{if(!G&&eq(H['address'],b)){const K='supply';pushEdge(c,edge(b,F['owner'],K,interestHintsFor(K,![]),{'role_bits':0x4,'perm_indices':[],'objects':[{'object_type':'Demand','address':F['address'],'capacity':'I\x20presented\x20service\x20'+(H['service']??'?')+'\x20(score\x20'+(H['acceptance_score']??'n/a')+')'}],'carrier':'demand_presenter'}));}}}}for(const L of a['allocations']??[]){const M=!!L['owner']&&eq(L['owner'],b),N=(L['sharing']??[])['some'](O=>typeof O['who']==='object'&&'Entity'in O['who']&&eq(O['who']['Entity'],b));if(M)for(const O of L['sharing']??[]){if(typeof O['who']!=='object'||!('Entity'in O['who']))continue;const P=O['who']['Entity'];if(!P||eq(P,b))continue;const Q='value_distribution';pushEdge(c,edge(b,P,Q,interestHintsFor(Q,!![]),{'role_bits':0x1,'perm_indices':[],'objects':[{'object_type':'Allocation','address':L['address'],'capacity':'payer\x20/\x20allocation\x20owner'}],'carrier':'allocation_sharing'},[{'from':b,'to':P,'carrier_object':L['address'],'carrier_type':'Allocation\x20Sharing\x20('+O['mode']+(O['sharing']?'\x20'+O['sharing']:'')+')','trigger':O['guard']?'guard\x20'+O['guard']+'\x20passes':'allocator\x20guard\x20passes'}]));}else{if(N&&L['owner']&&!eq(L['owner'],b)){const R='value_distribution';pushEdge(c,edge(b,L['owner'],R,interestHintsFor(R,![]),{'role_bits':0x4,'perm_indices':[],'objects':[{'object_type':'Allocation','address':L['address'],'capacity':'declared\x20recipient'}],'carrier':'allocation_sharing'},[{'from':L['owner'],'to':b,'carrier_object':L['address'],'carrier_type':'Allocation\x20Sharing','trigger':'allocator\x20guard\x20passes'}]));}}for(const S of L['sharing']??[]){if(typeof S['who']==='object'&&'Signer'in S['who'])d['push']('Allocation\x20'+L['address']+'\x20has\x20a\x20Signer\x20recipient\x20('+S['mode']+')\x20—\x20value\x20flows\x20to\x20the\x20account\x20that\x20executes\x20the\x20guard-gated\x20alloc\x20call,\x20not\x20to\x20a\x20fixed\x20counterparty.');else typeof S['who']==='object'&&'GuardIdentifier'in S['who']&&d['push']('Allocation\x20'+L['address']+'\x20has\x20a\x20GuardIdentifier\x20recipient\x20('+S['mode']+')\x20—\x20the\x20recipient\x20address\x20is\x20resolved\x20from\x20a\x20guard\x20submission\x20at\x20alloc\x20time,\x20not\x20statically.');}}for(const T of a['arbitrations']??[]){for(const U of T['voters']??[]){if(eq(U['address'],b))continue;if(T['anchor_side']!=='buyer'){const V='arbitration_delegation';pushEdge(c,edge(b,U['address'],V,interestHintsFor(V,!![]),{'role_bits':0x1,'perm_indices':[],'objects':[{'object_type':'Arbitration','address':T['address'],'capacity':'bound\x20arbitration\x20(voter\x20weight\x20'+(U['weight']??'n/a')+')'}],'carrier':'arbitration_binding'}));}if(T['object_kind']==='case'){const W='dispute_resolution',X=[{'object_type':'Arb','address':T['address'],'capacity':'dispute\x20case\x20(vote\x20weight\x20'+(U['weight']??'n/a')+')'}];T['order']&&X['push']({'object_type':'Order','address':T['order'],'capacity':'disputed\x20order'}),pushEdge(c,edge(b,U['address'],W,interestHintsFor(W,![]),{'role_bits':0x4,'perm_indices':[],'objects':X,'carrier':'arbitration_binding'}));}}}for(const Y of a['contacts']??[]){const Z=eq(Y['owner'],b);for(const a0 of Y['ims']){if(eq(a0,b))continue;const a1='contact_membership';pushEdge(c,edge(b,a0,a1,interestHintsFor(a1,Z),{'role_bits':Z?0x1:0x4,'perm_indices':[],'objects':[{'object_type':'Contact','address':Y['address'],'capacity':Z?'contact\x20owner':'IM\x20member'}],'carrier':'contact_im'}));}}const g=[...c['values']()],h={};for(const a2 of g){const a3=a2['counterparty']['toLowerCase']();(h[a3]??=[])['push'](a2['kind']);}for(const a4 of new Set(g['map'](a5=>a5['kind']))){const a5=RELATIONSHIP_KIND_REGISTRY[a4];a5?.['tension']&&d['push'](a4+':\x20anchor('+a5['anchor_role']+')\x20wants\x20\x22'+a5['tension']['anchor_goal']+'\x22;\x20counterparty('+a5['counterparty_role']+')\x20wants\x20\x22'+a5['tension']['counterparty_goal']+'\x22.\x20Divergence:\x20'+a5['tension']['divergence']);}return{'anchor':b,'edges':g,'by_counterparty':h,'notes':d};}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe,expect,it}from'vitest';import{deriveRelationshipProfile}from'./derivation.js';const ANCHOR='0xaaa111',VOTER1='0xbbb222',VOTER2='0xccc333',ARB_CASE='0x1200aa',ORDER='0x1600bb',ARB_SERVICE='0x1300cc';function edgesOf(a,b){return deriveRelationshipProfile(b)['edges']['filter'](c=>c['kind']===a);}describe('deriveRelationshipProfile\x20—\x20arbitration\x20edges\x20(K3-19\x20G1)',()=>{it('merchant-side\x20case:\x20voters\x20produce\x20BOTH\x20delegation\x20and\x20dispute_resolution\x20edges',()=>{const a={'anchor':ANCHOR,'arbitrations':[{'address':ARB_CASE,'object_kind':'case','voters':[{'address':VOTER1,'weight':0x2},{'address':VOTER2,'weight':0x1}],'order':ORDER,'arbitration':ARB_SERVICE,'anchor_side':'merchant'}]},b=edgesOf('arbitration_delegation',a);expect(b)['toHaveLength'](0x2),expect(b['map'](f=>f['counterparty'])['sort']())['toEqual']([VOTER1,VOTER2]['sort']()),expect(b[0x0]['power']['objects'][0x0])['toMatchObject']({'object_type':'Arbitration','address':ARB_CASE});const c=edgesOf('dispute_resolution',a);expect(c)['toHaveLength'](0x2);const d=c['find'](f=>f['counterparty']===VOTER1);expect(d['power']['objects'])['toEqual']([{'object_type':'Arb','address':ARB_CASE,'capacity':'dispute\x20case\x20(vote\x20weight\x202)'},{'object_type':'Order','address':ORDER,'capacity':'disputed\x20order'}]),expect(d['interest']['gains'][0x0])['toMatch'](/indemnity|own-side loss/i);}),it('buyer-side\x20case:\x20dispute_resolution\x20edges\x20only\x20—\x20the\x20buyer\x20never\x20delegates',()=>{const a={'anchor':ANCHOR,'arbitrations':[{'address':ARB_CASE,'object_kind':'case','voters':[{'address':VOTER1,'weight':0x3}],'order':ORDER,'anchor_side':'buyer'}]};expect(edgesOf('arbitration_delegation',a))['toHaveLength'](0x0);const b=edgesOf('dispute_resolution',a);expect(b)['toHaveLength'](0x1),expect(b[0x0]['counterparty'])['toBe'](VOTER1);}),it('arbitration\x20SERVICE\x20without\x20resolved\x20voters:\x20binding\x20presence\x20only,\x20no\x20edges',()=>{const a={'anchor':ANCHOR,'arbitrations':[{'address':ARB_SERVICE,'object_kind':'service','voters':[],'bound_services':[]}]},b=deriveRelationshipProfile(a);expect(b['edges']['filter'](c=>c['kind']==='arbitration_delegation'||c['kind']==='dispute_resolution'))['toHaveLength'](0x0);}),it('the\x20anchor\x27s\x20own\x20vote\x20is\x20skipped\x20(no\x20self\x20edges)',()=>{const a={'anchor':ANCHOR,'arbitrations':[{'address':ARB_CASE,'object_kind':'case','voters':[{'address':ANCHOR,'weight':0x1},{'address':VOTER2}],'order':ORDER,'anchor_side':'merchant'}]},b=deriveRelationshipProfile(a)['edges'];expect(b['every'](c=>c['counterparty']['toLowerCase']()!==ANCHOR['toLowerCase']()))['toBe'](!![]),expect(edgesOf('dispute_resolution',a))['toHaveLength'](0x1),expect(edgesOf('dispute_resolution',a)[0x0]['power']['objects'][0x0]['capacity'])['toContain']('n/a');}),it('legacy\x20facts\x20(no\x20object_kind/anchor_side)\x20still\x20produce\x20delegation\x20edges',()=>{const a={'anchor':ANCHOR,'arbitrations':[{'address':ARB_SERVICE,'voters':[{'address':VOTER1,'weight':0x5}]}]};expect(edgesOf('arbitration_delegation',a))['toHaveLength'](0x1),expect(edgesOf('dispute_resolution',a))['toHaveLength'](0x0);}),it('multiple\x20cases\x20on\x20the\x20same\x20voter\x20merge\x20into\x20ONE\x20edge\x20per\x20(pair,\x20kind)',()=>{const a='0x1200dd',b={'anchor':ANCHOR,'arbitrations':[{'address':ARB_CASE,'object_kind':'case','voters':[{'address':VOTER1,'weight':0x1}],'order':ORDER,'anchor_side':'buyer'},{'address':a,'object_kind':'case','voters':[{'address':VOTER1,'weight':0x2}],'order':'0x1600ee','anchor_side':'buyer'}]},c=edgesOf('dispute_resolution',b);expect(c)['toHaveLength'](0x1),expect(c[0x0]['power']['objects']['filter'](d=>d['object_type']==='Arb'))['toHaveLength'](0x2);});});
@@ -0,0 +1,38 @@
1
+ import type { LiabilityResolution, ReactionKpi } from "../participation/employee-kpi.js";
2
+ export interface AcceptanceEvidence {
3
+ node: string;
4
+ wip_hashes: string[];
5
+ submitted_at?: number;
6
+ }
7
+ export interface AcceptanceVerdict {
8
+ node: string;
9
+ passed: boolean;
10
+ criteria: string[];
11
+ gaps: string[];
12
+ }
13
+ export interface IncentiveInput {
14
+ employee: string;
15
+ kpis: ReactionKpi[];
16
+ acceptance: AcceptanceEvidence[];
17
+ liability?: LiabilityResolution;
18
+ available_rewards?: Array<{
19
+ address: string;
20
+ description?: string;
21
+ }>;
22
+ prior_compensation?: string;
23
+ }
24
+ export type SuggestionKind = "reward_grant" | "compensation_offset" | "correction_notice" | "none";
25
+ export interface RewardSuggestion {
26
+ employee: string;
27
+ kind: SuggestionKind;
28
+ rationale: string;
29
+ requires_confirmation: true;
30
+ reward_candidates: Array<{
31
+ address: string;
32
+ description?: string;
33
+ }>;
34
+ execution_hint: string;
35
+ kpi_rollup: string;
36
+ }
37
+ export declare function evaluateAcceptance(node: string, evidence?: AcceptanceEvidence): AcceptanceVerdict;
38
+ export declare function suggestIncentive(input: IncentiveInput): RewardSuggestion;
@@ -0,0 +1 @@
1
+ export function evaluateAcceptance(a,b){const c=[],d=[];if(!b)return{'node':a,'passed':![],'criteria':['WIP\x20evidence\x20submitted\x20for\x20the\x20node'],'gaps':['No\x20evidence\x20submitted\x20—\x20node\x20advanced\x20without\x20verifiable\x20WIP']};return c['push']('WIP\x20evidence\x20submitted\x20for\x20the\x20node'),b['wip_hashes']['length']===0x0?d['push']('Evidence\x20entry\x20exists\x20but\x20contains\x20no\x20WIP\x20hash'):c['push']('WIP\x20hashes\x20present\x20('+b['wip_hashes']['length']+')'),{'node':a,'passed':d['length']===0x0,'criteria':c,'gaps':d};}export function suggestIncentive(a){const b=a['kpis']['length']?a['kpis']['map'](h=>h['node']+':\x20'+h['status']+(h['reaction_ms']>=0x0?'\x20('+Math['round'](h['reaction_ms']/0x36ee80)+'h)':'\x20(pending)'))['join'](';\x20'):'No\x20node\x20KPIs\x20recorded',c=a['kpis']['filter'](h=>h['status']==='fail'),d=a['kpis']['filter'](h=>h['status']==='warn'),e=a['kpis']['filter'](h=>h['status']==='pass'),f=a['kpis']['filter'](h=>h['status']!=='warn')['map'](h=>evaluateAcceptance(h['node'],a['acceptance']['find'](i=>i['node']===h['node']))),g=f['filter'](h=>!h['passed']);if(a['liability']&&a['liability']['bears']==='employee')return{'employee':a['employee'],'kind':'compensation_offset','rationale':'Liability\x20resolution\x20assigns\x20the\x20loss\x20to\x20the\x20employee\x20('+a['liability']['note']+').\x20'+(a['liability']['must_compensate_before_resume']?'The\x20order\x20user\x20must\x20be\x20compensated\x20BEFORE\x20the\x20workflow\x20resumes.\x20':'')+'Suggest\x20offsetting\x20the\x20loss\x20against\x20the\x20employee\x27s\x20next\x20distribution\x20(Allocation\x20guard\x20or\x20reward\x20amount),\x20with\x20the\x20employee\x27s\x20visibility.','requires_confirmation':!![],'reward_candidates':[],'execution_hint':'After\x20merchant\x20confirmation:\x20adjust\x20the\x20employee\x27s\x20Allocation\x20Sharing\x20amount/guard\x20for\x20the\x20relevant\x20order,\x20or\x20deduct\x20from\x20the\x20next\x20reward\x20grant.\x20All\x20changes\x20are\x20on-chain\x20and\x20auditable.','kpi_rollup':b};if(g['length']>0x0||c['length']>0x0){const h=g['map'](i=>i['node']+':\x20'+i['gaps']['join'](';\x20'))['join']('\x20|\x20');return{'employee':a['employee'],'kind':'correction_notice','rationale':(c['length']>0x0?c['length']+'\x20KPI\x20failure(s).\x20':'')+(g['length']>0x0?'Acceptance\x20gaps:\x20'+h:'')+'\x20No\x20reward\x20suggested.\x20Surface\x20the\x20gaps\x20to\x20the\x20employee\x20via\x20Messenger\x20with\x20the\x20on-chain\x20evidence\x20links.','requires_confirmation':!![],'reward_candidates':[],'execution_hint':'After\x20merchant\x20confirmation:\x20send\x20a\x20Messenger\x20message\x20to\x20the\x20employee\x20with\x20the\x20KPI\x20rollup\x20and\x20WIP\x20evidence\x20gaps;\x20optionally\x20set\x20a\x20stricter\x20response_time_budget_ms\x20on\x20the\x20employee\x20profile.','kpi_rollup':b};}if(e['length']>0x0&&c['length']===0x0&&g['length']===0x0){const i=a['available_rewards']??[];return{'employee':a['employee'],'kind':i['length']>0x0?'reward_grant':'none','rationale':'All\x20'+e['length']+'\x20node\x20KPI(s)\x20passed\x20with\x20complete,\x20verifiable\x20WIP\x20evidence.\x20'+(i['length']>0x0?'Suggest\x20granting\x20one\x20of\x20the\x20available\x20rewards\x20—\x20aligns\x20employee\x20compensation\x20with\x20delivered\x20output\x20(principal-agent\x20alignment).':'No\x20reward\x20objects\x20configured\x20on\x20the\x20service\x20—\x20suggest\x20the\x20merchant\x20add\x20a\x20Reward\x20(guard-gated\x20claim)\x20to\x20make\x20future\x20incentive\x20alignment\x20executable\x20on-chain.'),'requires_confirmation':!![],'reward_candidates':i,'execution_hint':i['length']>0x0?'After\x20merchant\x20confirmation:\x20set\x20the\x20employee\x20as\x20the\x20RewardGuard\x20recipient\x20(guard-gated\x20claim\x20by\x20the\x20employee),\x20or\x20transfer\x20the\x20reward\x20directly\x20via\x20the\x20existing\x20reward/payment\x20ops.':'After\x20merchant\x20confirmation:\x20create\x20a\x20Reward\x20bound\x20to\x20a\x20guard\x20the\x20employee\x20satisfies\x20(reward.operation),\x20then\x20notify\x20the\x20employee\x20via\x20Messenger.','kpi_rollup':b};}return{'employee':a['employee'],'kind':'none','rationale':d['length']>0x0?d['length']+'\x20node(s)\x20still\x20pending\x20employee\x20action\x20—\x20no\x20verdict\x20possible\x20until\x20they\x20advance.':'No\x20KPI\x20data\x20to\x20evaluate.','requires_confirmation':!![],'reward_candidates':[],'execution_hint':'No\x20action.\x20Monitor\x20pending\x20nodes;\x20re-run\x20when\x20they\x20complete.','kpi_rollup':b};}
@@ -0,0 +1,4 @@
1
+ export * from "./types.js";
2
+ export * from "./registry.js";
3
+ export * from "./derivation.js";
4
+ export * from "./incentive.js";
@@ -0,0 +1 @@
1
+ export*from'./types.js';export*from'./registry.js';export*from'./derivation.js';export*from'./incentive.js';
@@ -0,0 +1,13 @@
1
+ import type { RelationshipKind, RelationshipTension } from "./types.js";
2
+ export interface RelationshipKindMeta {
3
+ kind: RelationshipKind;
4
+ semantics: string;
5
+ anchor_role: string;
6
+ counterparty_role: string;
7
+ tension?: RelationshipTension;
8
+ }
9
+ export declare const RELATIONSHIP_KIND_REGISTRY: Record<RelationshipKind, RelationshipKindMeta>;
10
+ export declare function interestHintsFor(kind: RelationshipKind, asAnchorRole: boolean): {
11
+ gains: string[];
12
+ exposures: string[];
13
+ };
@@ -0,0 +1 @@
1
+ const EMPLOYMENT={'kind':'employment','semantics':'Merchant\x27s\x20internal\x20staff\x20via\x20Permission\x20entity\x20membership\x20(no\x20node\x20operator\x20power\x20of\x20their\x20own)\x20—\x20principal-agent.','anchor_role':'merchant','counterparty_role':'employee','tension':{'anchor_goal':'Maximize\x20delivered\x20output\x20quality\x20at\x20fixed\x20labor\x20cost;\x20errors\x20are\x20attributed\x20to\x20the\x20merchant\x20outwardly.','counterparty_goal':'Maximize\x20compensation\x20while\x20minimizing\x20effort\x20and\x20personal\x20liability\x20exposure.','divergence':'Fixed\x20pay\x20decouples\x20effort\x20from\x20outcome:\x20the\x20employee\x20bears\x20only\x20bounded\x20liability\x20(resolveLiability)\x20while\x20the\x20merchant\x27s\x20reputation\x20and\x20compensation_fund\x20absorb\x20the\x20residue.','alignment_mechanisms':['Employee\x20KPI:\x20assessReactionKpi\x20measures\x20node\x20reaction\x20time\x20against\x20a\x20budget\x20(participation/employee-kpi.ts)','Acceptance\x20gate:\x20node\x20advancement\x20requires\x20the\x20merchant-side\x20permission\x20or\x20evidence\x20upload\x20(machine.move\x20forwards)','Compensation-before-resume:\x20an\x20employee-error\x20loss\x20must\x20compensate\x20the\x20order\x20user\x20before\x20the\x20workflow\x20resumes\x20(resolveLiability)','Incentive\x20bridge:\x20KPI\x20+\x20acceptance\x20→\x20Reward\x20suggestion,\x20executed\x20only\x20after\x20merchant\x20confirmation\x20(relationship/incentive.ts)']}},PROCESS_OPERATION={'kind':'process_operation','semantics':'Machine\x20node\x20operators\x20—\x20namedOperator\x20addresses,\x20permissionIndex\x20entities,\x20or\x20guard\x20proofs\x20(machine.move\x20Forward).','anchor_role':'machine/merchant\x20side','counterparty_role':'node\x20operator','tension':{'anchor_goal':'Workflow\x20advances\x20correctly\x20and\x20on\x20schedule;\x20WIP\x20evidence\x20is\x20complete.','counterparty_goal':'Complete\x20assigned\x20nodes\x20with\x20minimal\x20friction;\x20parallel\x20forwards\x20let\x20operators\x20pick\x20favorable\x20edges.','divergence':'Multi-path\x20forwards\x20(multiple\x20forwards\x20from\x20one\x20prev_node)\x20let\x20operators\x20choose\x20the\x20cheap\x20edge,\x20not\x20the\x20quality\x20edge.','alignment_mechanisms':['Forward\x20guard:\x20each\x20edge\x20can\x20require\x20a\x20guard\x20proof\x20(machine.move\x20Forward.guard)','Threshold\x20accumulation:\x20parallel\x20edges\x20need\x20accumulated\x20weights\x20to\x20migrate\x20the\x20node','WIP\x20evidence:\x20progress\x20records\x20who\x20advanced\x20what\x20and\x20when\x20(progress.move\x20Holder)']}},AGENCY={'kind':'agency','semantics':'Order\x20owner\x20(buyer)\x20delegates\x20purchasing\x20power\x20to\x20order\x20agents\x20(order.move\x20agent[]).','anchor_role':'buyer','counterparty_role':'agent','tension':{'anchor_goal':'Agent\x20acts\x20strictly\x20within\x20the\x20principal\x27s\x20interest\x20when\x20spending\x20escrowed\x20funds.','counterparty_goal':'Operational\x20latitude;\x20agents\x20may\x20face\x20incentives\x20from\x20the\x20merchant\x20side.','divergence':'The\x20agent\x20spends\x20the\x20principal\x27s\x20money:\x20classic\x20delegated-spending\x20moral\x20hazard.','alignment_mechanisms':['has_op_permission:\x20only\x20owner/agent\x20can\x20operate\x20the\x20order\x20(order.move)','Order\x20agent_set\x20is\x20revocable\x20at\x20any\x20time\x20by\x20the\x20owner','All\x20agent\x20operations\x20are\x20on-chain\x20auditable\x20events']}},TRANSACTION={'kind':'transaction','semantics':'Customer\x20(order\x20owner)\x20↔\x20merchant\x20(service\x20side)\x20—\x20the\x20core\x20adversarial-cooperative\x20exchange.','anchor_role':'customer','counterparty_role':'merchant','tension':{'anchor_goal':'Receive\x20the\x20agreed\x20deliverable;\x20keep\x20the\x20refund\x20path\x20available\x20until\x20acceptance.','counterparty_goal':'Get\x20escrowed\x20funds\x20released\x20as\x20early\x20as\x20possible;\x20minimize\x20dispute\x20surface.','divergence':'Fund\x20release\x20vs\x20acceptance\x20timing:\x20the\x20customer\x20wants\x20evidence\x20before\x20release,\x20the\x20merchant\x20wants\x20release\x20on\x20completion\x20terminal.','alignment_mechanisms':['Escrow:\x20order\x20amount\x20is\x20locked\x20until\x20the\x20workflow\x20reaches\x20a\x20terminal\x20(order.move)','buy_guard:\x20merchant\x20can\x20pre-screen\x20buyers\x20(service.move)','compensation_fund\x20+\x20bound\x20arbitrations:\x20breach\x20recourse\x20without\x20a\x20platform\x20(service.move\x20publish\x20rule)','Registrar\x20votes\x20(BIT_LIKE/BIT_DISLIKE/BIT_FAVOR):\x20post-transaction\x20reputation\x20accumulation','Demand\x20feedback\x20acceptance_score:\x20demander\x20rates\x20the\x20supplier\x20on-chain\x20(demand.move\x20feedback)']}},SUPPLY={'kind':'supply','semantics':'Demander\x20(demand\x20permission\x20owner)\x20×\x20presenter\x20(supplier\x20presenting\x20a\x20service\x20to\x20the\x20demand).','anchor_role':'demander','counterparty_role':'supplier/presenter','tension':{'anchor_goal':'Select\x20the\x20best-fitting\x20service;\x20personalized\x20support\x20before\x20committing.','counterparty_goal':'Win\x20the\x20selection;\x20the\x20present\x20call\x20is\x20cheap\x20so\x20over-presenting\x20is\x20rational.','divergence':'Presentation\x20is\x20free\x20for\x20the\x20supplier\x20but\x20selection\x20is\x20costly\x20for\x20the\x20demander\x20—\x20asymmetric\x20effort.','alignment_mechanisms':['Presenters\x20map\x20with\x20recommend\x20field\x20and\x20update_time\x20(demand.move\x20present)','On-chain\x20acceptance_score\x20feedback\x20loop\x20(demand.move\x20feedback)\x20—\x20bad\x20presentations\x20get\x20scored','Demand\x20guards:\x20present/claim\x20can\x20be\x20gated\x20(demand.move\x20guards)','Demand\x20rewards:\x20only\x20the\x20selected\x20winner\x27s\x20claim\x20guard\x20passes\x20(reward.move)']}},ARBITRATION_DELEGATION={'kind':'arbitration_delegation','semantics':'Service\x20owner\x20delegates\x20dispute\x20resolution\x20to\x20an\x20Arbitration\x27s\x20voting\x20guards\x20(service.move\x20arbitrations).','anchor_role':'service\x20owner\x20(merchant)','counterparty_role':'arbitrators\x20(voting\x20guard\x20members)','tension':{'anchor_goal':'Fair\x20verdicts\x20that\x20protect\x20the\x20merchant\x27s\x20reputation;\x20predictable\x20fee\x20costs.','counterparty_goal':'Earn\x20arbitration\x20fees;\x20vote\x20throughput\x20matters\x20more\x20than\x20deep\x20investigation.','divergence':'Vote\x20cost\x20asymmetry:\x20fast\x20votes\x20earn\x20the\x20same\x20fee\x20as\x20investigated\x20votes.','alignment_mechanisms':['Separation\x20of\x20powers:\x20arbitration\x20permission\x20must\x20differ\x20from\x20the\x20service\x20permission\x20(service.move\x20arbitration_add\x20rule)','vote_weight\x20per\x20voting\x20guard\x20member\x20—\x20weighted,\x20not\x20majority-count\x20(arbitration.move)','Arb\x20indemnity\x20is\x20paid\x20from\x20the\x20merchant\x27s\x20compensation_fund\x20—\x20verdicts\x20cost\x20the\x20merchant\x20real\x20money\x20(arb.move)','Registrar\x20reputation\x20for\x20the\x20arbitration\x20object\x20itself']}},DISPUTE_RESOLUTION={'kind':'dispute_resolution','semantics':'Arbitrator\x20↔\x20disputants\x20through\x20Arb\x20lifecycle\x20(order.move\x20dispute[]\x20/\x20claimed_by,\x20arb.move).','anchor_role':'arbitrator','counterparty_role':'disputants','tension':{'anchor_goal':'Resolve\x20with\x20a\x20defensible\x20proposition\x20before\x20the\x20voting\x20deadline.','counterparty_goal':'Maximize\x20own-side\x20indemnity\x20/\x20minimize\x20own-side\x20loss.','divergence':'Zero-sum\x20over\x20the\x20indemnity\x20amount\x20within\x20the\x20voting\x20deadline\x20window.','alignment_mechanisms':['voting_deadline\x20forces\x20resolution\x20(arb.move)','Voted\x20records\x20are\x20on-chain\x20and\x20auditable','compensation\x20claim\x20is\x20single-shot\x20(order\x20claimed_by\x20guard,\x20E_ORDER_ALREADY_CLAIMED)']}},VALUE_DISTRIBUTION={'kind':'value_distribution','semantics':'Declared\x20value\x20flow:\x20allocation\x20recipients\x20(Entity\x20/\x20Signer\x20/\x20GuardIdentifier)\x20sharing\x20escrowed\x20funds.','anchor_role':'payer\x20/\x20allocation\x20owner','counterparty_role':'recipient','tension':{'anchor_goal':'Control\x20outflow:\x20threshold,\x20max\x20cap,\x20guard-gated\x20release.','counterparty_goal':'Receive\x20distribution\x20as\x20early\x20and\x20as\x20fully\x20as\x20possible.','divergence':'Every\x20basis\x20point\x20of\x20Rate\x20sharing\x20is\x20contested;\x20Surplus\x20absorbs\x20the\x20remainder.','alignment_mechanisms':['Allocator\x20guard\x20must\x20pass\x20before\x20any\x20split\x20(allocation.move\x20alloc)','Rate\x20total\x20must\x20be\x20exactly\x2010000\x20without\x20Surplus\x20/\x20at\x20most\x2010000\x20with\x20one\x20(contract\x20invariants)','max\x20cap\x20for\x20Amount-mode\x20allocators\x20(allocation.move)','Payment\x20objects\x20record\x20the\x20per-recipient\x20breakdown\x20(payment.move\x20NewPaymentEvent)']}},CONTACT_MEMBERSHIP={'kind':'contact_membership','semantics':'Communication\x20channel\x20membership\x20(contact.move\x20ims[]).','anchor_role':'contact\x20owner','counterparty_role':'IM\x20member','tension':undefined};export const RELATIONSHIP_KIND_REGISTRY={'employment':EMPLOYMENT,'process_operation':PROCESS_OPERATION,'agency':AGENCY,'transaction':TRANSACTION,'supply':SUPPLY,'arbitration_delegation':ARBITRATION_DELEGATION,'dispute_resolution':DISPUTE_RESOLUTION,'value_distribution':VALUE_DISTRIBUTION,'contact_membership':CONTACT_MEMBERSHIP};export function interestHintsFor(a,b){const c=RELATIONSHIP_KIND_REGISTRY[a];if(!c?.['tension'])return{'gains':[],'exposures':[]};return b?{'gains':['Aligned\x20outcome\x20of:\x20'+c['tension']['anchor_goal']],'exposures':[c['tension']['divergence']]}:{'gains':['Aligned\x20outcome\x20of:\x20'+c['tension']['counterparty_goal']],'exposures':[c['tension']['divergence']]};}