@wowok/agent-mcp 3.3.1 → 3.3.2

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 (160) hide show
  1. package/dist/chain-semantics/field-capability.js +1 -1
  2. package/dist/chain-semantics/freeze-map.js +1 -1
  3. package/dist/chain-semantics/fund-flow.js +1 -1
  4. package/dist/chain-semantics/guard-verbs.js +1 -1
  5. package/dist/chain-semantics/object-graph.js +1 -1
  6. package/dist/composition/audit.d.ts +5 -0
  7. package/dist/composition/audit.js +1 -1
  8. package/dist/composition/blueprint-view.d.ts +0 -1
  9. package/dist/composition/blueprint-view.js +1 -1
  10. package/dist/composition/compile.d.ts +4 -2
  11. package/dist/composition/compile.js +1 -1
  12. package/dist/composition/inflight.d.ts +8 -4
  13. package/dist/composition/inflight.js +1 -1
  14. package/dist/customer/industry-risks.js +1 -1
  15. package/dist/customer/user-preferences.js +1 -1
  16. package/dist/extensions/business-modules.d.ts +7 -2
  17. package/dist/extensions/business-modules.js +1 -1
  18. package/dist/extensions/industry-audit.spec.js +1 -1
  19. package/dist/extensions/industry-pack.d.ts +3 -2
  20. package/dist/extensions/industry-pack.js +1 -1
  21. package/dist/extensions/modes.js +1 -1
  22. package/dist/graph/onchain/project-relationship.js +1 -1
  23. package/dist/knowledge/acquisition-flywheel.js +1 -1
  24. package/dist/knowledge/allocation-ledger.d.ts +4 -1
  25. package/dist/knowledge/allocation-ledger.js +1 -1
  26. package/dist/knowledge/allocation-puzzle.d.ts +1 -0
  27. package/dist/knowledge/allocation-puzzle.js +1 -1
  28. package/dist/knowledge/allocation-risk.d.ts +1 -1
  29. package/dist/knowledge/allocation-risk.js +1 -1
  30. package/dist/knowledge/arb-fund-facts.d.ts +5 -0
  31. package/dist/knowledge/arb-fund-facts.js +1 -1
  32. package/dist/knowledge/audit-rules.d.ts +4 -3
  33. package/dist/knowledge/audit-rules.js +1 -1
  34. package/dist/knowledge/baselines/rules/plan.json +48 -2
  35. package/dist/knowledge/baselines/rules/reward.json +1 -1
  36. package/dist/knowledge/builtin-templates.d.ts +9 -1
  37. package/dist/knowledge/builtin-templates.js +1 -1
  38. package/dist/knowledge/discount-threshold.js +1 -1
  39. package/dist/knowledge/guard-bindings.js +1 -1
  40. package/dist/knowledge/guard-design-patterns.js +1 -1
  41. package/dist/knowledge/guard-field-cognition.js +1 -1
  42. package/dist/knowledge/guard-lint.js +1 -1
  43. package/dist/knowledge/guard-submission-brief.d.ts +5 -0
  44. package/dist/knowledge/guard-submission-brief.js +1 -1
  45. package/dist/knowledge/guard-submission-prompt.d.ts +2 -1
  46. package/dist/knowledge/guard-submission-prompt.js +1 -1
  47. package/dist/knowledge/guard-templates.d.ts +1 -1
  48. package/dist/knowledge/guard-templates.js +1 -1
  49. package/dist/knowledge/industry-generalizer.js +1 -1
  50. package/dist/knowledge/industry-registry.js +1 -1
  51. package/dist/knowledge/industry-strategy.js +1 -1
  52. package/dist/knowledge/reward-ledger.js +1 -1
  53. package/dist/knowledge/reward-puzzle.d.ts +1 -1
  54. package/dist/knowledge/reward-risk.d.ts +1 -1
  55. package/dist/knowledge/scenario-modes.d.ts +2 -2
  56. package/dist/knowledge/scenario-modes.js +1 -1
  57. package/dist/knowledge/scenario-topology.js +1 -1
  58. package/dist/knowledge/strategy-manuals.js +1 -1
  59. package/dist/knowledge/template-index.d.ts +19 -0
  60. package/dist/knowledge/template-index.js +1 -0
  61. package/dist/knowledge/template-loader.d.ts +36 -0
  62. package/dist/knowledge/template-loader.js +1 -1
  63. package/dist/knowledge/template-registry.js +1 -1
  64. package/dist/knowledge/template-scanner.d.ts +7 -0
  65. package/dist/knowledge/template-scanner.js +1 -1
  66. package/dist/knowledge/tool-constraints.js +1 -1
  67. package/dist/knowledge/workflow-guidance.js +1 -1
  68. package/dist/monitor/MonitorLoop.js +1 -1
  69. package/dist/participation/radar-core.d.ts +1 -0
  70. package/dist/participation/radar-core.js +1 -1
  71. package/dist/persona/defaults.js +1 -1
  72. package/dist/persona/topology-focus.js +1 -1
  73. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  74. package/dist/playbooks/service-build/game-theory.d.ts +4 -1
  75. package/dist/playbooks/service-build/game-theory.js +1 -1
  76. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  77. package/dist/playbooks/service-build/merchant-guide.d.ts +25 -1
  78. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  79. package/dist/playbooks/service-build/migration-planner.js +1 -1
  80. package/dist/playbooks/service-build/object-panorama.js +1 -1
  81. package/dist/playbooks/service-build/participation-radar.js +1 -1
  82. package/dist/playbooks/service-build/pipeline-actions.d.ts +4 -1
  83. package/dist/playbooks/service-build/pipeline-actions.js +1 -1
  84. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  85. package/dist/playbooks/service-build/service-panorama.d.ts +4 -0
  86. package/dist/playbooks/service-build/service-panorama.js +1 -1
  87. package/dist/playbooks/service-build/service-quote.js +1 -1
  88. package/dist/relationship/derivation.d.ts +1 -1
  89. package/dist/review/index.js +1 -1
  90. package/dist/safety/confirm-gate.js +1 -1
  91. package/dist/schema/benchmark-migration/index.d.ts +35 -0
  92. package/dist/schema/benchmark-migration/index.js +1 -1
  93. package/dist/schema/call/allocation.d.ts +46 -3
  94. package/dist/schema/call/allocation.js +1 -1
  95. package/dist/schema/call/contact.js +1 -1
  96. package/dist/schema/call/guard.js +1 -1
  97. package/dist/schema/call/handler.js +1 -1
  98. package/dist/schema/call/order.js +1 -1
  99. package/dist/schema/call/progress.d.ts +6 -3
  100. package/dist/schema/call/progress.js +1 -1
  101. package/dist/schema/call/repository.js +1 -1
  102. package/dist/schema/call/reward.d.ts +2 -2
  103. package/dist/schema/call/reward.js +1 -1
  104. package/dist/schema/call/semantic.js +1 -1
  105. package/dist/schema/call/service.d.ts +8 -4
  106. package/dist/schema/call/service.js +1 -1
  107. package/dist/schema/common/index.js +1 -1
  108. package/dist/schema/goal/index.d.ts +54 -0
  109. package/dist/schema/goal/planning.d.ts +86 -0
  110. package/dist/schema/goal/planning.js +1 -1
  111. package/dist/schema/local/index.d.ts +39 -0
  112. package/dist/schema/local/index.js +1 -1
  113. package/dist/schema/operations.d.ts +20 -5
  114. package/dist/schema/operations.js +1 -1
  115. package/dist/schema/query/bi.d.ts +2 -0
  116. package/dist/schema/query/bi.js +1 -1
  117. package/dist/schema/query/index.d.ts +24 -12
  118. package/dist/schema/query/index.js +1 -1
  119. package/dist/schema/schema-version.d.ts +1 -1
  120. package/dist/schema/schema-version.js +1 -1
  121. package/dist/schema-query-impl/index.js +1 -1
  122. package/dist/schemas/account_operation.output.json +28 -3
  123. package/dist/schemas/benchmark_migration_operation.schema.json +87 -0
  124. package/dist/schemas/goal_operation.schema.json +94 -0
  125. package/dist/schemas/index.json +1 -1
  126. package/dist/schemas/onchain_operations.output.json +1 -1
  127. package/dist/schemas/onchain_operations.schema.json +409 -119
  128. package/dist/schemas/onchain_operations_allocation.schema.json +290 -6
  129. package/dist/schemas/onchain_operations_arbitration.schema.json +2 -2
  130. package/dist/schemas/onchain_operations_contact.schema.json +2 -2
  131. package/dist/schemas/onchain_operations_demand.schema.json +3 -3
  132. package/dist/schemas/onchain_operations_gen_passport.schema.json +1 -1
  133. package/dist/schemas/onchain_operations_guard.schema.json +63 -63
  134. package/dist/schemas/onchain_operations_machine.schema.json +1 -1
  135. package/dist/schemas/onchain_operations_order.schema.json +2 -2
  136. package/dist/schemas/onchain_operations_progress.schema.json +7 -3
  137. package/dist/schemas/onchain_operations_proof.schema.json +1 -1
  138. package/dist/schemas/onchain_operations_repository.schema.json +2 -2
  139. package/dist/schemas/onchain_operations_reward.schema.json +8 -8
  140. package/dist/schemas/onchain_operations_service.schema.json +20 -18
  141. package/dist/schemas/onchain_operations_treasury.schema.json +7 -7
  142. package/dist/schemas/query_toolkit.output.json +67 -53
  143. package/dist/schemas/workflow_operation.schema.json +1 -1
  144. package/dist/tools/handlers/benchmark-migration.js +1 -1
  145. package/dist/tools/handlers/config.js +1 -1
  146. package/dist/tools/handlers/file-export.js +1 -1
  147. package/dist/tools/handlers/industry-pack.d.ts +1 -0
  148. package/dist/tools/handlers/industry-pack.js +1 -1
  149. package/dist/tools/handlers/local.js +1 -1
  150. package/dist/tools/handlers/onchain.d.ts +24 -0
  151. package/dist/tools/handlers/onchain.js +1 -1
  152. package/dist/tools/handlers/query.js +1 -1
  153. package/dist/tools/handlers/review-chain.d.ts +1 -1
  154. package/dist/tools/handlers/review-chain.js +1 -1
  155. package/dist/tools/handlers/schema-query.js +1 -1
  156. package/dist/tools/handlers/workflow.js +1 -1
  157. package/dist/tools/registry/agent.js +1 -1
  158. package/dist/tools/wip-deploy-assist.js +1 -1
  159. package/dist/tools/wrap.js +1 -1
  160. package/package.json +2 -2
@@ -1 +1 @@
1
- import{checkEntityRecipientsSync,describeEntityRecipients}from'./entity-recipient-guard.js';import{runGuardRulePack}from'./guard-risk.js';import{findScene}from'./guard-ledger.js';const GUARD_DETERMINISTIC_FAILURE_RULES=new Map([['R-C2-05','any'],['R-C2-06','critical'],['R-C2-07','any'],['R-X1-19','any']]);function guardDeterministicRulesSatisfied(a){try{const b=a?.['root'];if(!b||typeof b!=='object'||b['type']==='file')return!![];const c=a?.['binding_hint'],d=findScene(c?.['host_object']??'',c?.['binding_field']??''),e=(Array['isArray'](a?.['table'])?a['table']:[])['map'](g=>({'identifier':g?.['identifier'],'b_submission':g?.['b_submission']??![],'value_type':g?.['value_type'],'value':g?.['value'],'name':g?.['name'],'object_type':g?.['object_type']})),f=runGuardRulePack({'table':e,'root':b,'scene':d??undefined});return!f['some'](g=>{const h=GUARD_DETERMINISTIC_FAILURE_RULES['get'](g['id']);if(!h)return![];return h==='any'||g['level']==='critical';});}catch{return!![];}}function guardDeterministicBlockMessage(a){let b='';try{const c=a?.['root'];if(c&&typeof c==='object'&&c['type']!=='file'){const d=a?.['binding_hint'],e=findScene(d?.['host_object']??'',d?.['binding_field']??''),f=(Array['isArray'](a?.['table'])?a['table']:[])['map'](h=>({'identifier':h?.['identifier'],'b_submission':h?.['b_submission']??![],'value_type':h?.['value_type'],'value':h?.['value'],'name':h?.['name'],'object_type':h?.['object_type']})),g=runGuardRulePack({'table':f,'root':c,'scene':e??undefined})['filter'](h=>{const i=GUARD_DETERMINISTIC_FAILURE_RULES['get'](h['id']);if(!i)return![];return i==='any'||h['level']==='critical';})['map'](h=>h['id']+'\x20('+h['title']+')');b=g['join'](';\x20');}}catch{}return'Guard\x20draft\x20blocked:\x20deterministic-failure\x20rule(s)\x20fired'+(b?'\x20—\x20'+b:'')+'.\x20These\x20shapes\x20cannot\x20succeed\x20on-chain:\x20witness\x20edges\x20are\x20directional\x20(no\x20PROGRESS→ORDER\x20reverse\x20edge\x20—\x20derive\x20Progress\x20via\x20convert_witness\x20100),\x20repository.data\x20keys-where\x20nodes\x20must\x20use\x20the\x20parameters-free\x20query-1177\x20shape\x20(the\x20Range-gte\x20predicate\x20lives\x20in\x20the\x20BCS\x20conditions\x20blob\x20—\x20a\x20parameter-carrying\x20keys-where\x20node\x20aborts\x20natively,\x20upw\x20F-28),\x20and\x20order.*\x20queries\x20in\x20a\x20buy\x20guard\x20are\x20circular\x20(the\x20Order\x20does\x20not\x20exist\x20at\x20buy\x20time\x20—\x20query\x20service.*\x20instead).\x20Fix\x20the\x20flagged\x20nodes\x20and\x20re-create;\x20run\x20guard\x20lint\x20/\x20analyze_guard_semantics\x20for\x20exact\x20node\x20paths.';}function entityRecipientsSatisfied(a){try{const b=a?.['allocators']??a?.['order_allocators'];if(!b)return!![];return checkEntityRecipientsSync(b)['length']===0x0;}catch{return!![];}}export const TOOL_CONSTRAINTS=[{'operation_type':'service','constraints':[{'field':'namedNew.name','description':'Service\x20should\x20have\x20a\x20name\x20for\x20easy\x20reference','severity':'warning','check':a=>!!a?.['namedNew']?.['name']||typeof a?.['object']==='string','message':()=>'Service\x20without\x20a\x20name\x20is\x20hard\x20to\x20reference\x20later.\x20Consider\x20setting\x20namedNew.name.'},{'field':'price','description':'Service\x20price\x20should\x20be\x20set\x20before\x20publish','severity':'warning','check':a=>a?.['price']!==undefined||!a?.['publish'],'message':()=>'Publishing\x20a\x20service\x20without\x20a\x20price\x20—\x20customers\x20won\x27t\x20know\x20the\x20cost.'},{'field':'allocators.allocators[].sharing[].who.Entity.name_or_address','description':'R-RECIPIENT-03\x20—\x20an\x20Entity\x20recipient\x20may\x20not\x20be\x20empty,\x20omitted,\x20unresolved,\x20or\x20the\x20deploying\x20account\x20(direct-sales\x20invariant)','severity':'error','check':entityRecipientsSatisfied,'message':a=>describeEntityRecipients(checkEntityRecipientsSync(a?.['allocators']??a?.['order_allocators']))}],'requireOneOf':[{'fields':['object','namedNew'],'reason':'Must\x20specify\x20either\x20an\x20existing\x20object\x20(string)\x20or\x20create\x20new\x20(namedNew)'}]},{'operation_type':'machine','constraints':[{'field':'node.nodes','description':'Machine\x20must\x20have\x20at\x20least\x20one\x20node\x20when\x20published','severity':'error','check':a=>{if(typeof a?.['object']==='string')return!![];if(!a?.['publish'])return!![];if(Array['isArray'](a?.['node']?.['nodes'])&&a['node']['nodes']['length']>0x0)return!![];if(typeof a?.['node']?.['json_or_markdown_file']==='string'&&a['node']['json_or_markdown_file']['length']>0x0)return!![];return![];},'message':()=>'Publishing\x20a\x20Machine\x20without\x20nodes\x20—\x20a\x20workflow\x20template\x20requires\x20at\x20least\x20one\x20node.\x20Provide\x20nodes\x20via\x20inline\x20`node.nodes`\x20array\x20OR\x20`node.json_or_markdown_file`\x20path\x20(file\x20contains\x20JSON\x20or\x20Markdown\x20node\x20definitions).\x20Consider\x20adding\x20nodes\x20before\x20publish,\x20or\x20publish\x20later\x20after\x20adding\x20nodes.'}]},{'operation_type':'payment','constraints':[{'field':'revenue','description':'Payment\x20requires\x20at\x20least\x20one\x20revenue\x20entry\x20(CREATE\x20mode\x20only)','severity':'error','check':a=>a?.['receive']===!![]||Array['isArray'](a?.['revenue'])&&a['revenue']['length']>0x0,'message':()=>'Payment\x20requires\x20a\x20non-empty\x20\x27revenue\x27\x20array\x20(payment\x20recipients\x20and\x20amounts).\x20For\x20RECEIVE\x20mode\x20(unwrap\x20CoinWrapper),\x20use\x20{object:\x20\x27<coinwrapper_id>\x27,\x20receive:\x20true,\x20type_parameter:\x20\x270x2::wow::WOW\x27}.'},{'field':'revenue[0].amount','description':'Payment\x20revenue\x20amount\x20must\x20be\x20specified\x20(CREATE\x20mode\x20only)','severity':'error','check':a=>a?.['receive']===!![]||Array['isArray'](a?.['revenue'])&&a['revenue']['length']>0x0&&(!!a['revenue'][0x0]?.['amount']?.['balance']||!!a['revenue'][0x0]?.['amount']?.['coin']),'message':()=>'Payment\x20revenue[0].amount\x20must\x20specify\x20either\x20\x27balance\x27\x20value\x20or\x20\x27coin\x27\x20object\x20(see\x20CoinParamSchema).'}]},{'operation_type':'allocation','constraints':[{'field':'payment_info.for_object','description':'Unanchored\x20allocation\x20with\x20GuardIdentifier\x20recipients\x20is\x20blocked\x20by\x20default\x20(docs#11)','severity':'error','check':a=>{if(!a?.['allocators'])return!![];if(a?.['allow_unanchored']===!![])return!![];if(a?.['payment_info']?.['for_object'])return!![];const b=a?.['allocators']?.['allocators'];if(!Array['isArray'](b))return!![];return!b['some'](c=>Array['isArray'](c?.['sharing'])&&c['sharing']['some'](e=>e?.['who']&&'GuardIdentifier'in e['who']));},'message':()=>'Unanchored\x20allocation\x20(payment_info.for_object\x20not\x20set)\x20with\x20GuardIdentifier\x20recipients\x20lets\x20any\x20guard-passing\x20caller\x20redirect\x20the\x20submitted\x20payout\x20address\x20to\x20an\x20arbitrary\x20address\x20(docs#11).\x20Anchor\x20it\x20with\x20payment_info.for_object,\x20or\x20pass\x20allow_unanchored:true\x20to\x20proceed.'},{'field':'allocators.allocators[].sharing[].who.Entity.name_or_address','description':'R-RECIPIENT-03\x20—\x20an\x20Entity\x20recipient\x20may\x20not\x20be\x20empty,\x20omitted,\x20unresolved,\x20or\x20the\x20deploying\x20account\x20(direct-sales\x20invariant)','severity':'error','check':entityRecipientsSatisfied,'message':a=>describeEntityRecipients(checkEntityRecipientsSync(a?.['allocators']??a?.['order_allocators']))}]},{'operation_type':'order','constraints':[{'field':'object','description':'Order\x20requires\x20an\x20existing\x20Order\x20object\x20reference','severity':'error','check':a=>!!a?.['object'],'message':()=>'Order\x20requires\x20\x27object\x27\x20field\x20(Order\x20object\x20ID\x20or\x20name).'}]},{'operation_type':'reward','constraints':[{'field':'coin_add','description':'Reward\x20funding\x20requires\x20coin_add','severity':'warning','check':a=>{if(a?.['claim']||a?.['guard_add']||a?.['guard_remove_expired']||a?.['owner_receive']||a?.['receive'])return!![];return!!a?.['coin_add']?.['balance']||!!a?.['coin_add']?.['coin'];},'message':()=>'Reward\x20funding\x20requires\x20\x27coin_add\x27\x20with\x20either\x20\x27balance\x27\x20value\x20or\x20\x27coin\x27\x20object\x20(see\x20CoinParamSchema).\x20Other\x20operations\x20(claim,\x20guard_add,\x20etc.)\x20don\x27t\x20need\x20coin_add.'}]},{'operation_type':'guard','constraints':[{'field':'root','description':'Guard\x20must\x20specify\x20root\x20(node\x20tree\x20or\x20file)','severity':'error','check':a=>!!a?.['root'],'message':()=>'Guard\x20requires\x20a\x20\x27root\x27\x20field\x20(type=\x27node\x27\x20for\x20tree\x20or\x20type=\x27file\x27\x20to\x20load\x20from\x20file).'},{'field':'root','description':'Guard\x20draft\x20must\x20pass\x20the\x20deterministic-failure\x20rules\x20(witness\x20matrix,\x20reverse-edge,\x20keys-where\x20native\x20abort,\x20buy-time\x20circularity)','severity':'error','check':guardDeterministicRulesSatisfied,'message':guardDeterministicBlockMessage}]},{'operation_type':'permission','constraints':[{'field':'with_forbidden','description':'Permission\x20should\x20have\x20at\x20least\x20one\x20rule','severity':'warning','check':a=>Array['isArray'](a?.['with_forbidden'])&&a['with_forbidden']['length']>0x0||Array['isArray'](a?.['with_allowed'])&&a['with_allowed']['length']>0x0,'message':()=>'Permission\x20has\x20no\x20rules\x20(with_forbidden/with_allowed).\x20An\x20empty\x20permission\x20allows\x20nothing.'}]},{'operation_type':'demand','constraints':[{'field':'reward','description':'Demand\x20should\x20have\x20a\x20reward\x20to\x20attract\x20solutions','severity':'warning','check':a=>!!a?.['reward'],'message':()=>'Demand\x20without\x20a\x20reward\x20pool\x20may\x20not\x20attract\x20solution\x20providers.'}]},{'operation_type':'progress','constraints':[{'field':'object','description':'Progress\x20requires\x20an\x20existing\x20Progress\x20object\x20reference','severity':'error','check':a=>!!a?.['object'],'message':()=>'Progress\x20requires\x20\x27object\x27\x20field\x20(Progress\x20object\x20ID\x20or\x20name).'}]}];const CONSTRAINT_INDEX=new Map(TOOL_CONSTRAINTS['map'](a=>[a['operation_type'],a]));export function validateOperation(a,b){const d=CONSTRAINT_INDEX['get'](a);if(!d)return[];const e=[];for(const f of d['constraints']){try{!f['check'](b)&&e['push']({'field':f['field'],'severity':f['severity'],'message':f['message'](b)});}catch{}}if(d['requireOneOf'])for(const g of d['requireOneOf']){const h=g['fields']['some'](i=>b?.[i]!==undefined&&b?.[i]!==null);!h&&e['push']({'field':g['fields']['join']('|'),'severity':'error','message':g['reason']});}if(d['mutuallyExclusive'])for(const i of d['mutuallyExclusive']){const j=i['fields']['filter'](k=>b?.[k]!==undefined&&b?.[k]!==null);j['length']>0x1&&e['push']({'field':j['join']('|'),'severity':'error','message':'Fields\x20are\x20mutually\x20exclusive:\x20'+j['join'](',\x20')+'.\x20'+i['reason']});}return e;}export function hasBlockingViolations(a){return a['some'](b=>b['severity']==='error');}export function getWarningViolations(a){return a['filter'](b=>b['severity']==='warning');}export const TOOL_CONSTRAINTS_VERSION=0x1;
1
+ import{checkEntityRecipientsSync,describeEntityRecipients}from'./entity-recipient-guard.js';import{runGuardRulePack}from'./guard-risk.js';import{findScene}from'./guard-ledger.js';const GUARD_DETERMINISTIC_FAILURE_RULES=new Map([['R-C2-05','any'],['R-C2-06','critical'],['R-C2-07','any'],['R-X1-19','any']]);function guardDeterministicRulesSatisfied(a){try{const b=a?.['root'];if(!b||typeof b!=='object'||b['type']==='file')return!![];const c=a?.['binding_hint'],d=findScene(c?.['host_object']??'',c?.['binding_field']??''),e=(Array['isArray'](a?.['table'])?a['table']:[])['map'](g=>({'identifier':g?.['identifier'],'b_submission':g?.['b_submission']??![],'value_type':g?.['value_type'],'value':g?.['value'],'name':g?.['name'],'object_type':g?.['object_type']})),f=runGuardRulePack({'table':e,'root':b,'scene':d??undefined});return!f['some'](g=>{const h=GUARD_DETERMINISTIC_FAILURE_RULES['get'](g['id']);if(!h)return![];return h==='any'||g['level']==='critical';});}catch{return!![];}}function guardDeterministicBlockMessage(a){let b='';try{const c=a?.['root'];if(c&&typeof c==='object'&&c['type']!=='file'){const d=a?.['binding_hint'],e=findScene(d?.['host_object']??'',d?.['binding_field']??''),f=(Array['isArray'](a?.['table'])?a['table']:[])['map'](h=>({'identifier':h?.['identifier'],'b_submission':h?.['b_submission']??![],'value_type':h?.['value_type'],'value':h?.['value'],'name':h?.['name'],'object_type':h?.['object_type']})),g=runGuardRulePack({'table':f,'root':c,'scene':e??undefined})['filter'](h=>{const i=GUARD_DETERMINISTIC_FAILURE_RULES['get'](h['id']);if(!i)return![];return i==='any'||h['level']==='critical';})['map'](h=>h['id']+'\x20('+h['title']+')');b=g['join'](';\x20');}}catch{}return'Guard\x20draft\x20blocked:\x20deterministic-failure\x20rule(s)\x20fired'+(b?'\x20—\x20'+b:'')+'.\x20These\x20shapes\x20cannot\x20succeed\x20on-chain:\x20witness\x20edges\x20are\x20directional\x20(no\x20PROGRESS→ORDER\x20reverse\x20edge\x20—\x20derive\x20Progress\x20via\x20convert_witness\x20100),\x20repository.data\x20keys-where\x20nodes\x20must\x20use\x20the\x20parameters-free\x20query-1177\x20shape\x20(the\x20Range-gte\x20predicate\x20lives\x20in\x20the\x20BCS\x20conditions\x20blob\x20—\x20a\x20parameter-carrying\x20keys-where\x20node\x20aborts\x20natively,\x20upw\x20F-28),\x20and\x20order.*\x20queries\x20in\x20a\x20buy\x20guard\x20are\x20circular\x20(the\x20Order\x20does\x20not\x20exist\x20at\x20buy\x20time\x20—\x20query\x20service.*\x20instead).\x20Fix\x20the\x20flagged\x20nodes\x20and\x20re-create;\x20run\x20guard\x20lint\x20/\x20analyze_guard_semantics\x20for\x20exact\x20node\x20paths.';}function entityRecipientsSatisfied(a){try{const b=a?.['allocators']??a?.['order_allocators'];if(!b)return!![];return checkEntityRecipientsSync(b)['length']===0x0;}catch{return!![];}}export const TOOL_CONSTRAINTS=[{'operation_type':'service','constraints':[{'field':'namedNew.name','description':'Service\x20should\x20have\x20a\x20name\x20for\x20easy\x20reference','severity':'warning','check':a=>!!a?.['namedNew']?.['name']||typeof a?.['object']==='string','message':()=>'Service\x20without\x20a\x20name\x20is\x20hard\x20to\x20reference\x20later.\x20Consider\x20setting\x20namedNew.name.'},{'field':'price','description':'Service\x20price\x20should\x20be\x20set\x20before\x20publish','severity':'warning','check':a=>a?.['price']!==undefined||!a?.['publish'],'message':()=>'Publishing\x20a\x20service\x20without\x20a\x20price\x20—\x20customers\x20won\x27t\x20know\x20the\x20cost.'},{'field':'allocators.allocators[].sharing[].who.Entity.name_or_address','description':'R-RECIPIENT-03\x20—\x20an\x20Entity\x20recipient\x20may\x20not\x20be\x20empty,\x20omitted,\x20unresolved,\x20or\x20the\x20deploying\x20account\x20(direct-sales\x20invariant)','severity':'error','check':entityRecipientsSatisfied,'message':a=>describeEntityRecipients(checkEntityRecipientsSync(a?.['allocators']??a?.['order_allocators']))}],'requireOneOf':[{'fields':['object','namedNew'],'reason':'Must\x20specify\x20either\x20an\x20existing\x20object\x20(string)\x20or\x20create\x20new\x20(namedNew)'}]},{'operation_type':'machine','constraints':[{'field':'node.nodes','description':'Machine\x20must\x20have\x20at\x20least\x20one\x20node\x20when\x20published','severity':'error','check':a=>{if(typeof a?.['object']==='string')return!![];if(!a?.['publish'])return!![];if(Array['isArray'](a?.['node']?.['nodes'])&&a['node']['nodes']['length']>0x0)return!![];if(typeof a?.['node']?.['json_or_markdown_file']==='string'&&a['node']['json_or_markdown_file']['length']>0x0)return!![];return![];},'message':()=>'Publishing\x20a\x20Machine\x20without\x20nodes\x20—\x20a\x20workflow\x20template\x20requires\x20at\x20least\x20one\x20node.\x20Provide\x20nodes\x20via\x20inline\x20`node.nodes`\x20array\x20OR\x20`node.json_or_markdown_file`\x20path\x20(file\x20contains\x20JSON\x20or\x20Markdown\x20node\x20definitions).\x20Consider\x20adding\x20nodes\x20before\x20publish,\x20or\x20publish\x20later\x20after\x20adding\x20nodes.'}]},{'operation_type':'payment','constraints':[{'field':'revenue','description':'Payment\x20requires\x20at\x20least\x20one\x20revenue\x20entry\x20(CREATE\x20mode\x20only)','severity':'error','check':a=>a?.['receive']===!![]||Array['isArray'](a?.['revenue'])&&a['revenue']['length']>0x0,'message':()=>'Payment\x20requires\x20a\x20non-empty\x20\x27revenue\x27\x20array\x20(payment\x20recipients\x20and\x20amounts).\x20For\x20RECEIVE\x20mode\x20(unwrap\x20CoinWrapper),\x20use\x20{object:\x20\x27<coinwrapper_id>\x27,\x20receive:\x20true,\x20type_parameter:\x20\x270x2::wow::WOW\x27}.'},{'field':'revenue[0].amount','description':'Payment\x20revenue\x20amount\x20must\x20be\x20specified\x20(CREATE\x20mode\x20only)','severity':'error','check':a=>a?.['receive']===!![]||Array['isArray'](a?.['revenue'])&&a['revenue']['length']>0x0&&(!!a['revenue'][0x0]?.['amount']?.['balance']||!!a['revenue'][0x0]?.['amount']?.['coin']),'message':()=>'Payment\x20revenue[0].amount\x20must\x20specify\x20either\x20\x27balance\x27\x20value\x20or\x20\x27coin\x27\x20object\x20(see\x20CoinParamSchema).'}]},{'operation_type':'allocation','constraints':[{'field':'payment_info.for_object','description':'Unanchored\x20allocation\x20with\x20GuardIdentifier\x20recipients\x20is\x20blocked\x20by\x20default\x20(docs#11)','severity':'error','check':a=>{if(!a?.['allocators'])return!![];if(a?.['allow_unanchored']===!![])return!![];if(a?.['payment_info']?.['for_object'])return!![];const b=a?.['allocators']?.['allocators'];if(!Array['isArray'](b))return!![];return!b['some'](c=>Array['isArray'](c?.['sharing'])&&c['sharing']['some'](e=>e?.['who']&&'GuardIdentifier'in e['who']));},'message':()=>'Unanchored\x20allocation\x20(payment_info.for_object\x20not\x20set)\x20with\x20GuardIdentifier\x20recipients\x20lets\x20any\x20guard-passing\x20caller\x20redirect\x20the\x20submitted\x20payout\x20address\x20to\x20an\x20arbitrary\x20address\x20(docs#11).\x20Anchor\x20it\x20with\x20payment_info.for_object,\x20or\x20pass\x20allow_unanchored:true\x20to\x20proceed.'},{'field':'allocators.allocators[].sharing[].who.Entity.name_or_address','description':'R-RECIPIENT-03\x20—\x20an\x20Entity\x20recipient\x20may\x20not\x20be\x20empty,\x20omitted,\x20unresolved,\x20or\x20the\x20deploying\x20account\x20(direct-sales\x20invariant)','severity':'error','check':entityRecipientsSatisfied,'message':a=>describeEntityRecipients(checkEntityRecipientsSync(a?.['allocators']??a?.['order_allocators']))}]},{'operation_type':'order','constraints':[{'field':'object','description':'Order\x20requires\x20an\x20existing\x20Order\x20object\x20reference','severity':'error','check':a=>!!a?.['object'],'message':()=>'Order\x20requires\x20\x27object\x27\x20field\x20(Order\x20object\x20ID\x20or\x20name).'}]},{'operation_type':'reward','constraints':[{'field':'coin_add','description':'Reward\x20funding\x20requires\x20coin_add','severity':'warning','check':a=>{if(a?.['claim']||a?.['guard_add']||a?.['guard_remove']||a?.['owner_receive']||a?.['receive'])return!![];return!!a?.['coin_add']?.['balance']||!!a?.['coin_add']?.['coin'];},'message':()=>'Reward\x20funding\x20requires\x20\x27coin_add\x27\x20with\x20either\x20\x27balance\x27\x20value\x20or\x20\x27coin\x27\x20object\x20(see\x20CoinParamSchema).\x20Other\x20operations\x20(claim,\x20guard_add,\x20etc.)\x20don\x27t\x20need\x20coin_add.'}]},{'operation_type':'guard','constraints':[{'field':'root','description':'Guard\x20must\x20specify\x20root\x20(node\x20tree\x20or\x20file)','severity':'error','check':a=>!!a?.['root'],'message':()=>'Guard\x20requires\x20a\x20\x27root\x27\x20field\x20(type=\x27node\x27\x20for\x20tree\x20or\x20type=\x27file\x27\x20to\x20load\x20from\x20file).'},{'field':'root','description':'Guard\x20draft\x20must\x20pass\x20the\x20deterministic-failure\x20rules\x20(witness\x20matrix,\x20reverse-edge,\x20keys-where\x20native\x20abort,\x20buy-time\x20circularity)','severity':'error','check':guardDeterministicRulesSatisfied,'message':guardDeterministicBlockMessage}]},{'operation_type':'permission','constraints':[{'field':'with_forbidden','description':'Permission\x20should\x20have\x20at\x20least\x20one\x20rule','severity':'warning','check':a=>Array['isArray'](a?.['with_forbidden'])&&a['with_forbidden']['length']>0x0||Array['isArray'](a?.['with_allowed'])&&a['with_allowed']['length']>0x0,'message':()=>'Permission\x20has\x20no\x20rules\x20(with_forbidden/with_allowed).\x20An\x20empty\x20permission\x20allows\x20nothing.'}]},{'operation_type':'demand','constraints':[{'field':'reward','description':'Demand\x20should\x20have\x20a\x20reward\x20to\x20attract\x20solutions','severity':'warning','check':a=>!!a?.['reward'],'message':()=>'Demand\x20without\x20a\x20reward\x20pool\x20may\x20not\x20attract\x20solution\x20providers.'}]},{'operation_type':'progress','constraints':[{'field':'object','description':'Progress\x20requires\x20an\x20existing\x20Progress\x20object\x20reference','severity':'error','check':a=>!!a?.['object'],'message':()=>'Progress\x20requires\x20\x27object\x27\x20field\x20(Progress\x20object\x20ID\x20or\x20name).'}]}];const CONSTRAINT_INDEX=new Map(TOOL_CONSTRAINTS['map'](a=>[a['operation_type'],a]));export function validateOperation(a,b){const d=CONSTRAINT_INDEX['get'](a);if(!d)return[];const e=[];for(const f of d['constraints']){try{!f['check'](b)&&e['push']({'field':f['field'],'severity':f['severity'],'message':f['message'](b)});}catch{}}if(d['requireOneOf'])for(const g of d['requireOneOf']){const h=g['fields']['some'](i=>b?.[i]!==undefined&&b?.[i]!==null);!h&&e['push']({'field':g['fields']['join']('|'),'severity':'error','message':g['reason']});}if(d['mutuallyExclusive'])for(const i of d['mutuallyExclusive']){const j=i['fields']['filter'](k=>b?.[k]!==undefined&&b?.[k]!==null);j['length']>0x1&&e['push']({'field':j['join']('|'),'severity':'error','message':'Fields\x20are\x20mutually\x20exclusive:\x20'+j['join'](',\x20')+'.\x20'+i['reason']});}return e;}export function hasBlockingViolations(a){return a['some'](b=>b['severity']==='error');}export function getWarningViolations(a){return a['filter'](b=>b['severity']==='warning');}export const TOOL_CONSTRAINTS_VERSION=0x1;
@@ -1 +1 @@
1
- import{query_account_list,LocalMark,GetLocalNamesByAddresses}from'@wowok/wowok';import{NO_AUTO_SETTLEMENT_FACT}from'./settlement-semantics.js';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';import{formatShortAddress}from'../persona/address-format.js';import{recommendedCallForForwardBinding,recommendedCallForOrderHolder}from'../participation/radar-core.js';import{batchQueryObjectsByIds,fetchMachineNodes,fetchOrderContext,fetchPermissionContext}from'../graph/onchain/sdk-batch.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i,PRE_DELIVERY_RE=/^(|entry|paid|kickoff|confirmed|requirements_pending|in_progress|active|processing|subscribed)$/i,ACTIVE_STAGE_RE=/(charg|billing|renew|deliver|fulfill|ship|sent|work|produ)/i,REFUND_FLAVOR_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?|expired)(_|$)/i;function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'completion\x20stage\x20\x22'+a+'\x22';case'refund':return'refund/cancel\x20stage\x20\x22'+a+'\x22';case'exception':return'exception/dispute\x20stage\x20\x22'+a+'\x22';default:return'advance\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;return formatShortAddress(a);}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d,e){const g=e&&a['namedOperator']===''&&!a['permissionIndex']?recommendedCallForOrderHolder({'hasGuard':!!a['guard'],'currentNode':e['currentNode'],'targetNode':e['targetNode']}):recommendedCallForForwardBinding({'permissionIndex':a['permissionIndex'],'namedOperator':a['namedOperator'],'hasGuard':!!a['guard']});if(a['namedOperator']===''){const h=b?.[0x0],i=a['permissionIndex']!==undefined&&a['permissionIndex']!==null;return{'kind':'order_holder','role_name':i?'order\x20holder\x20(customer)\x20OR\x20'+resolvePermissionRole(a['permissionIndex'],c):'order\x20holder\x20(customer)','permission_index':i?a['permissionIndex']:undefined,'account_name':d?d(h):shortAddr(h),'recommended_call':g};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22','recommended_call':g};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c),'recommended_call':g};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c){if(!c)return{'gains':[],'risks':[]};if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20unlocked\x20—\x20provider\x20funds\x20become\x20releasable\x20(an\x20explicit\x20allocation\x20step\x20is\x20still\x20required;\x20nothing\x20releases\x20automatically)'],'risks':['Provider\x20can\x20now\x20claim\x20the\x20escrow','Refund\x20leverage\x20lost\x20once\x20completion\x20is\x20recorded\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Refund\x20path\x20unlocked\x20—\x20escrow\x20becomes\x20releasable\x20back\x20to\x20you\x20via\x20an\x20explicit\x20allocation\x20step\x20(trigger\x20it\x20yourself;\x20funds\x20are\x20not\x20returned\x20automatically)'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20unlocked\x20—\x20funds\x20releasable\x20to\x20provider\x20via\x20an\x20explicit\x20allocation\x20step\x20(NOT\x20automatic\x20on\x20node\x20migration)'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e,f){let g;if(!e)g=a==='exception'?0x2d:0x32;else b?g=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:g=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)g+=0x14;if(d)g-=0xa;return e&&f&&(a==='refund'||a==='exception')&&(g=Math['min'](g,0x28)),Math['max'](0x0,Math['min'](0x64,g));}export function buildWorkflowGuidance(a){const b=[],c=PRE_DELIVERY_RE['test'](a['current'])||ACTIVE_STAGE_RE['test'](a['current'])||a['just_advanced']===!![];for(const m of a['nodes']){for(const n of m['pairs']){if(n['prev_node']!==a['current'])continue;for(const p of n['forwards']){if(!p['name'])continue;const q=resolveOperator(p,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'],{'currentNode':a['current'],'targetNode':m['name']}),r=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let s=![];a['callerAddress']&&(s=accountCanExecuteForward(p,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const t=classifyNode(m['name']),u=!!a['caller'],{gains:v,risks:w}=gainsRisksFor(t,r,u),x=consistencyFor(t,r,s,!!p['guard'],u,c);b['push']({'next_node':m['name'],'forward':p['name'],'weight':p['weight'],'operator':q,'guard':p['guard'],'business_meaning':businessMeaning(m['name'],t),'gains':v,'risks':w,'consistency':x,'recommended':![],'executable_by_caller':s});}}}if(b['length']===0x0){const y=a['escrow'],z=!y?'':y['fund_direction']==='buyer'?'the\x20rails\x20are\x20ORDER-ANCHORED\x20(GuardIdentifier\x20recipients)\x20—\x20the\x20payout\x20lands\x20on\x20the\x20Order\x20object\x20for\x20the\x20order\x20owner\x20(the\x20buyer)\x20to\x20claim,\x20regardless\x20of\x20the\x20node\x27s\x20name\x20(\x22'+a['current']+'\x22).\x20':y['fund_direction']==='provider'?'the\x20rails\x20pay\x20ENTITY\x20recipients\x20—\x20the\x20payout\x20goes\x20to\x20the\x20named\x20provider-side\x20parties,\x20regardless\x20of\x20the\x20node\x27s\x20name\x20(\x22'+a['current']+'\x22).\x20':y['fund_direction']==='mixed'?'the\x20rails\x20mix\x20order-anchored\x20and\x20Entity\x20recipients\x20—\x20which\x20party\x20is\x20paid\x20depends\x20on\x20WHICH\x20rail\x20fires;\x20inspect\x20each\x20allocator\x27s\x20guard\x20before\x20triggering.\x20':y['fund_direction']==='signer'?'a\x20rail\x20pays\x20whoever\x20TRIGGERS\x20it\x20(Signer\x20recipient)\x20—\x20the\x20operator\x27s\x20own\x20identity\x20decides\x20the\x20payee;\x20never\x20trigger\x20on\x20behalf\x20of\x20another\x20party.\x20':'rail\x20recipients\x20were\x20unreadable\x20from\x20the\x20machine\x20graph\x20—\x20READ\x20them\x20before\x20triggering,\x20the\x20tooling\x20can:\x20query_toolkit\x20query_type=\x27service_panorama\x27\x20returns\x20result.service.order_allocators.allocators[].sharing\x20(who/mode/value\x20per\x20rail),\x20and\x20object_panorama\x20on\x20the\x20pool\x27s\x20Allocation\x20(\x27'+y['allocation']+'\x27)\x20returns\x20the\x20balance,\x20payment_info\x20anchor\x20and\x20the\x20same\x20resolved\x20recipient\x20rows.\x20The\x20name\x20flavor\x20('+(y['refund_terminal']?'refund/cancel-flavored':'completion-flavored')+')\x20is\x20a\x20GUESS\x20about\x20direction,\x20never\x20a\x20fact\x20—\x20do\x20not\x20act\x20on\x20it\x20alone.\x20',A=y?'Node\x20\x22'+a['current']+'\x22\x20is\x20terminal\x20(no\x20outgoing\x20forwards)\x20—\x20but\x20the\x20order\x27s\x20Allocation\x20'+y['allocation']+'\x20still\x20holds\x20'+y['balance']+'\x20(smallest\x20unit)\x20with\x20no\x20payments\x20recorded.\x20'+NO_AUTO_SETTLEMENT_FACT+'\x20'+z+('Execute\x20via\x20onchain_operations\x20{operation_type:\x27allocation\x27,\x20data:{object:\x27'+y['allocation']+'\x27,\x20alloc_by_guard:\x27<guard>\x27}}')+(y['guards']['length']?'\x20—\x20candidate\x20guards\x20on\x20this\x20pool:\x20'+y['guards']['join'](',\x20')+'.':'\x20—\x20inspect\x20the\x20pool\x27s\x20allocators\x20first.')+'\x20Trigger\x20ONCE\x20and\x20verify\x20the\x20pool\x20drained\x20(a\x20fully-drained\x20pool\x20aborts\x20on\x20re-trigger;\x20a\x20max-capped\x20pool\x20re-splits\x20the\x20remainder).\x20Recipients\x20then\x20claim\x20their\x20CoinWrappers\x20(receive).':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.';return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':A};}const d=new Map();for(const B of b){const C=d['get'](B['forward']);if(C)C['add'](B['next_node']);else d['set'](B['forward'],new Set([B['next_node']]));}const e=[];for(const [D,E]of d){if(E['size']<0x2)continue;const F=[...E]['sort'](),G=F['some'](J=>classifyNode(J)==='refund'),H=F['some'](J=>classifyNode(J)!=='refund'),I=G&&H;e['push'](I?'CRITICAL\x20'+D:D);for(let J=0x0;J<b['length'];J++){if(b[J]['forward']!==D)continue;b[J]={...b[J],'ambiguous':{'destinations':F,'fund_conflict':I}};}}e['sort'](),b['sort']((K,L)=>L['consistency']-K['consistency']);const g=e['length']>0x0;let h;if(!g){const K=b['findIndex'](L=>!L['ambiguous']);K>=0x0&&(h={...b[K],'recommended':!![]},b[K]=h);}const j=[];for(const L of b){h&&L!==h&&L['consistency']>0x0&&L['forward']!==h['forward']&&j['push']('Choosing\x20\x22'+L['forward']+'\x20→\x20'+L['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+h['forward']+'\x20→\x20'+h['next_node']+'\x22');}c&&b['some'](M=>classifyNode(M['next_node'])==='refund')&&j['push']('Refund/cancel\x20options\x20are\x20listed\x20but\x20not\x20auto-recommended\x20here\x20(pre-delivery\x20stage,\x20active\x20billing/delivery\x20stage,\x20or\x20a\x20just-completed\x20advance\x20signals\x20intent\x20to\x20continue)\x20—\x20choose\x20one\x20explicitly\x20when\x20cancellation\x20is\x20intended');for(const M of b){if(!M['ambiguous'])continue;j['push']('\x22'+M['forward']+'\x22\x20is\x20AMBIGUOUS\x20from\x20\x22'+a['current']+'\x22\x20—\x20it\x20legally\x20reaches\x20'+M['ambiguous']['destinations']['join']('\x20/\x20')+'\x20'+(M['ambiguous']['fund_conflict']?'(fund\x20direction\x20DIFFERS\x20between\x20them);\x20the\x20destination\x20you\x20pass\x20in\x20next_node_name\x20decides,\x20so\x20state\x20the\x20intended\x20node\x20explicitly\x20instead\x20of\x20trusting\x20the\x20forward\x20name':';\x20state\x20the\x20intended\x20node\x20explicitly'));}const k=[];if(h){const N=h['operator'];if(N['kind']==='order_holder')N['account_name']&&N['account_name']!==a['caller']&&k['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+N['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.');else{if(h['executable_by_caller']===![]){const O=N['kind']==='named_operator'?'named\x20operator\x20\x22'+N['named_operator']+'\x22':N['role_name']??'permission\x20index\x20'+(N['permission_index']??'(unknown)');let P;if(N['kind']==='permission_index'&&a['permissionContext']&&N['permission_index']!==undefined){const Q=[...a['orderHolderAddresses']??[],...a['callerAddress']?[a['callerAddress']]:[]],R=Q['find'](S=>{if(!S)return![];const T=S['toLowerCase']();return a['permissionContext']['admin']['has'](T)||(a['permissionContext']['table']['get'](T)?.['has'](N['permission_index'])??![]);});if(R)P=a['nameResolver']?a['nameResolver'](R):shortAddr(R);}k['push']('The\x20recommended\x20action\x20requires\x20'+O+(P?'\x20(held\x20by\x20'+P+')':'')+('\x20—\x20the\x20current\x20signing\x20account\x20('+(a['caller']??'unresolved')+')\x20is\x20not\x20entitled;\x20switch\x20env.account\x20to\x20an\x20account\x20holding\x20it\x20before\x20operating.'));}}}e['length']>0x0&&k['push']('Machine\x20topology\x20defect\x20(P0-6):\x20forward\x20name(s)\x20'+[...new Set(e['map'](S=>S['replace'](/^CRITICAL /,'')))]['join'](',\x20')+'\x20'+'resolve\x20to\x20more\x20than\x20one\x20destination\x20from\x20this\x20node.\x20The\x20contract\x20accepts\x20any\x20of\x20them\x20(progress.move:540\x20takes\x20next_node\x20as\x20a\x20caller\x20argument;\x20'+'machine.move:182\x20only\x20forbids\x20duplicate\x20prev_node\x20WITHIN\x20one\x20node),\x20so\x20the\x20workflow\x20outcome\x20is\x20decided\x20by\x20the\x20CALLER,\x20not\x20by\x20the\x20published\x20Machine.\x20'+'Nothing\x20is\x20auto-recommended\x20for\x20these\x20forwards\x20—\x20fix\x20the\x20graph\x20by\x20giving\x20each\x20destination\x20its\x20own\x20forward\x20name.');const l=b['filter'](S=>S['guard']);return l['length']>=0x2&&l['length']===b['length']&&k['push'](l['length']+'\x20guarded\x20variants\x20mount\x20on\x20node\x20\x22'+a['current']+'\x22\x20and\x20they\x20are\x20typically\x20MUTUALLY\x20EXCLUSIVE\x20'+'(variant\x20rails\x20usually\x20read\x20a\x20policy/mode\x20oracle\x20row\x20—\x20only\x20the\x20row\x27s\x20current\x20value\x20admits\x20one\x20of\x20them).\x20'+'Do\x20NOT\x20discover\x20which\x20one\x20by\x20signing:\x20probe\x20with\x20env.dry_run=true\x20first\x20(free,\x20never\x20committed,\x20'+'and\x20a\x20guard\x20rejection\x20on\x20a\x20dry\x20run\x20does\x20not\x20consume\x20the\x20retry\x20budget)\x20—\x20the\x20rejection\x20diagnosis\x20names\x20the\x20failing\x20guard.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':h?{'best':h['forward']+'\x20→\x20'+h['next_node'],'rationale':'Highest\x20consistency\x20('+h['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(h['gains']?.['join'](';\x20')||'none')+'.\x20Risks:\x20'+(h['risks']?.['join'](';\x20')||'none')+'.\x20Operator:\x20'+(h['operator']['role_name']??h['operator']['kind'])+(h['operator']['account_name']?'\x20('+h['operator']['account_name']+')':'')+'.'+(h['guard']?'\x20Guard\x20to\x20satisfy:\x20'+h['guard']+'.':''),'caveat':j['length']?j['join']('.\x20'):undefined}:{'best':undefined,'rationale':e['length']?'No\x20action\x20recommended:\x20every\x20reachable\x20forward\x20from\x20\x22'+a['current']+'\x22\x20is\x20ambiguous\x20(resolves\x20to\x20multiple\x20destinations).\x20Choose\x20the\x20destination\x20node\x20deliberately\x20—\x20do\x20not\x20let\x20the\x20forward\x20name\x20decide\x20it.':undefined,'caveat':j['length']?j['join']('.\x20'):undefined},'note':k['length']?k['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b=a['current']===a['targetNode'],c={'account':a['callerName'],'action':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':b,'current_node':a['current']};if(a['simulated'])c['simulated']=!![];if(!b){const e=a['nodes']['filter'](j=>j['name']===a['targetNode'])['flatMap'](j=>j['pairs'])['find'](j=>j['prev_node']===a['current']),g=a['session']?.['slice'](-0x1)[0x0],h=g?.['threshold']??e?.['threshold']??0x0,i=g?.['weights']??0x0;if(h>0x0){c['threshold']=h,c['accumulated_weight']=i,c['remaining']=Math['max'](0x0,h-i);const j=new Set((g?.['forwards']??[])['filter'](l=>l?.['accomplished']!==![])['map'](l=>l?.['forward'])['filter'](l=>!!l)),k=[];for(const l of e?.['forwards']??[]){if(!l['name']||j['has'](l['name']))continue;k['push']({'forward':l['name'],'operator':resolveOperator(l,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'],{'currentNode':a['current'],'targetNode':a['targetNode']})});}if(k['length'])c['waiting_on']=k;c['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+h+',\x20accumulated\x20weight\x20'+i+',\x20remaining\x20'+Math['max'](0x0,h-i)+'.\x20'+(k['length']?'Waiting\x20for:\x20'+k['map'](m=>m['forward']+'\x20('+(m['operator']['role_name']??m['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else c['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}const d=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'callerAddress':a['callerAddress'],'orderHolderAddresses':a['orderHolderAddresses'],'progressNamedOperator':a['progressNamedOperator'],'permissionContext':a['permissionContext'],'orderContext':a['orderContext'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver'],'escrow':a['escrow'],'just_advanced':b&&classifyNode(a['targetNode'])!=='refund'});if(d['options']['length']>0x0)c['next_guidance']=d;else{if(d['note'])c['note']=c['note']?c['note']+'\x20'+d['note']:d['note'];}return c;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);c['ambiguous']&&d['push']('AMBIGUOUS:\x20this\x20forward\x20name\x20also\x20reaches\x20'+c['ambiguous']['destinations']['filter'](e=>e!==c['next_node'])['join'](',\x20')+(c['ambiguous']['fund_conflict']?'\x20(fund\x20direction\x20differs\x20—\x20next_node_name\x20decides)':''));d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']?.['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']?.['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));a['simulated']&&b['push']('\x20\x20•\x20simulated\x20(dry-run):\x20this\x20migration\x20comes\x20from\x20the\x20call\x27s\x20own\x20events\x20—\x20state\x20NOT\x20committed\x20on-chain');if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export function extractObjectVersionFromTx(a,b){if(!a||typeof a!=='object')return undefined;const d=a,e=d['effects']?.['objectChanges']??d['objectChanges'];if(!Array['isArray'](e))return undefined;const f=b['toLowerCase']();for(const g of e){if(typeof g?.['object']!=='string'||String(g['object'])['toLowerCase']()!==f)continue;if(g['version']!==undefined&&g['version']!==null)return String(g['version']);}return undefined;}export function extractProgressEventNodeFromTx(a,b){if(!a||typeof a!=='object'||!b)return undefined;const c=a,d=c['events']??c['effects']?.['events'];if(!Array['isArray'](d))return undefined;const e=b['toLowerCase']();for(const f of d){const g=f?.['json']??f?.['parsedJson']??f,h=typeof g?.['node']==='string'?g['node']:undefined;if(!h)continue;const i=typeof g?.['object']==='string'?g['object']['trim']()['toLowerCase']():'';if(i===e||i['startsWith'](e+'\x20')||i['startsWith'](e+'('))return h;}return undefined;}async function fetchTerminalEscrow(b,c,d,e){if(!b)return undefined;try{const f=(await batchQueryObjectsByIds([b],c,d??!![]))[0x0],g=f?.['data']??f,h=typeof g?.['allocation']==='string'?g['allocation']:undefined;if(!h)return undefined;const i=(await batchQueryObjectsByIds([h],c,d??!![]))[0x0],j=i?.['data']??i,k=typeof j?.['balance']==='bigint'?j['balance']:BigInt(j?.['balance']??0x0);if(k<=0x0n)return undefined;const l=Array['isArray'](j?.['payment'])?j['payment']:[];if(l['length']>0x0)return undefined;const m=(Array['isArray'](j?.['allocators']?.['allocators'])?j['allocators']['allocators']:[])['map'](p=>String(p?.['guard']??''))['filter'](p=>p),n=new Set();for(const p of Array['isArray'](j?.['allocators']?.['allocators'])?j['allocators']['allocators']:[]){for(const q of Array['isArray'](p?.['sharing'])?p['sharing']:[]){const r=q?.['who'];if(r!==null&&typeof r==='object'){if('GuardIdentifier'in r)n['add']('buyer');else{if('Entity'in r)n['add']('provider');else{if('Signer'in r)n['add']('signer');}}}}}const o=n['size']===0x0?'unknown':n['size']>0x1?'mixed':[...n][0x0];return{'allocation':h,'balance':k['toString'](),'guards':m,'fund_direction':o,'refund_terminal':REFUND_FLAVOR_RE['test'](e)};}catch{return undefined;}}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=async()=>(await batchQueryObjectsByIds([b],a['network'],!![]))[0x0];let d=await c();const e=extractObjectVersionFromTx(a['txResult'],b);for(let z=0x0;e!==undefined&&d&&String(d['version']??'')!==e&&z<0x2;z++){await new Promise(B=>setTimeout(B,0x258));const A=await c();if(A)d=A;}const f=d?.['data']??d;if((d?.['type']??f?.['type'])!=='Progress')return undefined;let g=f['current']??'';const h=extractProgressEventNodeFromTx(a['txResult'],b),i=h!==undefined&&g!==h;if(i)g=h;const j=i&&a['dryRun']===!![],k=f['machine'],l=Array['isArray'](f['session'])?f['session']:[],m=(Array['isArray'](f['namedOperator'])?f['namedOperator']['find'](B=>B?.['name']==='')?.['operators']:undefined)??[];if(!k)return undefined;const n=await fetchMachineNodes(k,a['network'],![]);let o,p;try{const B=await batchQueryObjectsByIds([k],a['network'],a['noCache']),C=B[0x0],D=C?.['data']??C,E=D?.['permission'];if(E){const F=await batchQueryObjectsByIds([E],a['network'],a['noCache']),G=F[0x0];o=(G?.['data']??G)?.['description']??undefined,p=await fetchPermissionContext(E,a['network'],a['noCache']);}}catch{}const q=(Array['isArray'](f['namedOperator'])?f['namedOperator']:[])['map'](H=>({'name':String(H?.['name']??''),'operators':(H?.['operators']??[])['map'](I=>String(I))}));let r;f['task']&&(r=await fetchOrderContext(f['task'],a['network'],a['noCache']));const s=r?Array['from'](new Set([r['builder'],...r['agent']])['values']()):m;let t;try{t=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{t=undefined;}const u=await makeNameResolver([a['accountName'],...s]),v={'current':g,'nodes':n,'caller':a['accountName'],'callerAddress':t,'orderHolderAddresses':s,'progressNamedOperator':q,'permissionContext':p,'orderContext':r,'permissionDescription':o,'nameResolver':u};let w=buildWorkflowGuidance(v);if(w['options']['length']===0x0){const H=await fetchTerminalEscrow(f['task'],a['network'],a['noCache'],g);H&&(v['escrow']=H,w=buildWorkflowGuidance(v));}let x;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(x=buildWorkflowReceipt({...v,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':l,'simulated':j}));if(a['compact']){w['options']['length']&&!x?.['next_guidance']?.['options']['length']&&trimGuidanceProse(w);if(x?.['next_guidance'])trimGuidanceProse(x['next_guidance']);}const y=[x?renderReceiptText(x):undefined,w['options']['length']&&!x?.['next_guidance']?.['options']['length']?renderGuidanceText(w):undefined]['filter'](I=>!!I)['join']('\x0a\x0a');return{'guidance':w,'receipt':x,'text':y};}catch{return undefined;}}export async function resolveHoldableEdges(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=(await batchQueryObjectsByIds([b],a['network'],!![]))[0x0],d=c?.['data']??c;if((c?.['type']??d?.['type'])!=='Progress')return undefined;const e=typeof d['current']==='string'?d['current']:'',g=d['machine'];if(!g)return undefined;const h=await fetchMachineNodes(g,a['network'],![]);let i;try{const n=await batchQueryObjectsByIds([g],a['network'],a['noCache']),o=(n[0x0]?.['data']??n[0x0])?.['permission'];if(o)i=await fetchPermissionContext(o,a['network'],a['noCache']);}catch{}const j=(Array['isArray'](d['namedOperator'])?d['namedOperator']:[])['map'](p=>({'name':String(p?.['name']??''),'operators':(p?.['operators']??[])['map'](q=>String(q))}));let k;if(d['task'])k=await fetchOrderContext(d['task'],a['network'],a['noCache']);let l;try{l=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{l=undefined;}if(!l)return{'current':e,'edges':[]};const m=[];for(const p of h){for(const q of p['pairs']){if(q['prev_node']!==e)continue;for(const r of q['forwards']){if(!r['name'])continue;m['push']({'next_node':p['name'],'forward':r['name'],'weight':r['weight'],'threshold':q['threshold'],'guard':r['guard'],'kind':forwardOperatorKind(r),'holdable':accountCanExecuteForward(r,l,j,k,i)});}}}return{'current':e,'edges':m};}catch{return undefined;}}function trimGuidanceProse(a){for(const b of a['options']??[]){delete b['gains'],delete b['risks'];if(!b['recommended'])delete b['operator']?.['recommended_call']?.['reason'];}}export function mergeGuidanceIntoOutput(a,b,c){if(!b)return a;try{const d=a?.['structuredContent'];if(d&&typeof d==='object'){const e=d['semantic'];if(e&&typeof e==='object'){const f=!!b['receipt']?.['next_guidance']?.['options']?.['length'];b['guidance']&&!f&&(e['workflow_guidance']=b['guidance']);if(b['receipt'])e['workflow_receipt']=b['receipt'];c?.['responseLevel']!=='full'&&(e['workflow_guidance']&&trimGuidanceProse(e['workflow_guidance']),b['receipt']?.['next_guidance']&&trimGuidanceProse(b['receipt']['next_guidance']));}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}export async function resolveLocalNamesFor(a){const b=new Map();try{const c=[...new Set((a??[])['filter'](e=>typeof e==='string'&&e['startsWith']('0x')))];if(c['length']===0x0)return{'byAddress':b};const d=await GetLocalNamesByAddresses(c);for(const e of d??[]){const f=e?.['account']||e?.['local_mark'];if(f)b['set'](String(e['address'])['toLowerCase'](),f);}}catch{}return{'byAddress':b};}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=a['namedOperator'],i=c['find'](j=>String(j?.['name']??'')===h);if(i?.['operators']?.['some'](j=>String(j)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const j=e['table']['get'](g);if(j?.['has'](a['permissionIndex']))return!![];}return![];}export function forwardOperatorKind(a){if(a['namedOperator']==='')return'order_holder';if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return'named_operator';return'permission_index';}export function enumerateActionableForwards(a,b,c,d,e,g){const h=typeof a?.['current']==='string'?a['current']:'',i=new Map();for(const k of Array['isArray'](a?.['session'])?a['session']:[]){const l=String(k?.['next_node']??'');for(const m of Array['isArray'](k?.['forwards'])?k['forwards']:[]){i['set'](l+'|'+String(m?.['forward']??''),{'who':m?.['who']?String(m['who'])['toLowerCase']():null,'accomplished':!!m?.['accomplished']});}}const j=[];for(const n of b){for(const o of n['pairs']){if(o['prev_node']!==h)continue;for(const p of o['forwards']){if(!p['name'])continue;const q=i['get'](n['name']+'|'+p['name']);if(q?.['accomplished'])continue;let r=c['filter'](t=>accountCanExecuteForward(p,t,d,e,g));q?.['who']&&(r=r['filter'](t=>t['toLowerCase']()===q['who'])),j['push']({'next_node':n['name'],'forward':p['name'],'weight':p['weight'],'threshold':o['threshold'],'guard':p['guard'],'operator_kind':forwardOperatorKind(p),'permission_index':p['permissionIndex']??undefined,'named_operator':typeof p['namedOperator']==='string'&&p['namedOperator']['length']>0x0?p['namedOperator']:undefined,'executable_accounts':r['map'](t=>t['toLowerCase']())});}}}return j;}
1
+ import{query_account_list,LocalMark,GetLocalNamesByAddresses}from'@wowok/wowok';import{NO_AUTO_SETTLEMENT_FACT}from'./settlement-semantics.js';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';import{formatShortAddress}from'../persona/address-format.js';import{recommendedCallForForwardBinding,recommendedCallForOrderHolder}from'../participation/radar-core.js';import{batchQueryObjectsByIds,fetchMachineNodes,fetchOrderContext,fetchPermissionContext}from'../graph/onchain/sdk-batch.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i,PRE_DELIVERY_RE=/^(|entry|paid|kickoff|confirmed|requirements_pending|in_progress|active|processing|subscribed)$/i,ACTIVE_STAGE_RE=/(charg|billing|renew|deliver|fulfill|ship|sent|work|produ)/i,REFUND_FLAVOR_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?|expired)(_|$)/i;function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'completion\x20stage\x20\x22'+a+'\x22';case'refund':return'refund/cancel\x20stage\x20\x22'+a+'\x22';case'exception':return'exception/dispute\x20stage\x20\x22'+a+'\x22';default:return'advance\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;return formatShortAddress(a);}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d,e){const g=e&&a['namedOperator']===''&&!a['permissionIndex']?recommendedCallForOrderHolder({'hasGuard':!!a['guard'],'currentNode':e['currentNode'],'targetNode':e['targetNode']}):recommendedCallForForwardBinding({'permissionIndex':a['permissionIndex'],'namedOperator':a['namedOperator'],'hasGuard':!!a['guard']});if(a['namedOperator']===''){const h=b?.[0x0],i=a['permissionIndex']!==undefined&&a['permissionIndex']!==null;return{'kind':'order_holder','role_name':i?'order\x20holder\x20(customer)\x20OR\x20'+resolvePermissionRole(a['permissionIndex'],c):'order\x20holder\x20(customer)','permission_index':i?a['permissionIndex']:undefined,'account_name':d?d(h):shortAddr(h),'recommended_call':g};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22','recommended_call':g};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c),'recommended_call':g};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c){if(!c)return{'gains':[],'risks':[]};if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20unlocked\x20—\x20provider\x20funds\x20become\x20releasable\x20(an\x20explicit\x20allocation\x20step\x20is\x20still\x20required;\x20nothing\x20releases\x20automatically)'],'risks':['Provider\x20can\x20now\x20claim\x20the\x20escrow','Refund\x20leverage\x20lost\x20once\x20completion\x20is\x20recorded\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Refund\x20path\x20unlocked\x20—\x20escrow\x20becomes\x20releasable\x20back\x20to\x20you\x20via\x20an\x20explicit\x20allocation\x20step\x20(trigger\x20it\x20yourself;\x20funds\x20are\x20not\x20returned\x20automatically)'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20unlocked\x20—\x20funds\x20releasable\x20to\x20provider\x20via\x20an\x20explicit\x20allocation\x20step\x20(NOT\x20automatic\x20on\x20node\x20migration)'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e,f){let g;if(!e)g=a==='exception'?0x2d:0x32;else b?g=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:g=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;if(e&&c)g+=0x14;if(d)g-=0xa;return e&&f&&(a==='refund'||a==='exception')&&(g=Math['min'](g,0x28)),Math['max'](0x0,Math['min'](0x64,g));}export function buildWorkflowGuidance(a){const b=[],c=PRE_DELIVERY_RE['test'](a['current'])||ACTIVE_STAGE_RE['test'](a['current'])||a['just_advanced']===!![];for(const m of a['nodes']){for(const n of m['pairs']){if(n['prev_node']!==a['current'])continue;for(const p of n['forwards']){if(!p['name'])continue;const q=resolveOperator(p,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'],{'currentNode':a['current'],'targetNode':m['name']}),r=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let s=![];a['callerAddress']&&(s=accountCanExecuteForward(p,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const t=classifyNode(m['name']),u=!!a['caller'],{gains:v,risks:w}=gainsRisksFor(t,r,u),x=consistencyFor(t,r,s,!!p['guard'],u,c);b['push']({'next_node':m['name'],'forward':p['name'],'weight':p['weight'],'operator':q,'guard':p['guard'],'business_meaning':businessMeaning(m['name'],t),'gains':v,'risks':w,'consistency':x,'recommended':![],'executable_by_caller':s});}}}if(b['length']===0x0){const y=a['escrow'],z=!y?'':y['fund_direction']==='buyer'?'the\x20rails\x20are\x20ORDER-ANCHORED\x20(GuardIdentifier\x20recipients)\x20—\x20the\x20payout\x20lands\x20on\x20the\x20Order\x20object\x20for\x20the\x20order\x20owner\x20(the\x20buyer)\x20to\x20claim,\x20regardless\x20of\x20the\x20node\x27s\x20name\x20(\x22'+a['current']+'\x22).\x20':y['fund_direction']==='provider'?'the\x20rails\x20pay\x20ENTITY\x20recipients\x20—\x20the\x20payout\x20goes\x20to\x20the\x20named\x20provider-side\x20parties,\x20regardless\x20of\x20the\x20node\x27s\x20name\x20(\x22'+a['current']+'\x22).\x20':y['fund_direction']==='mixed'?'the\x20rails\x20mix\x20order-anchored\x20and\x20Entity\x20recipients\x20—\x20which\x20party\x20is\x20paid\x20depends\x20on\x20WHICH\x20rail\x20fires;\x20inspect\x20each\x20allocator\x27s\x20guard\x20before\x20triggering.\x20':y['fund_direction']==='signer'?'a\x20rail\x20pays\x20whoever\x20TRIGGERS\x20it\x20(Signer\x20recipient)\x20—\x20the\x20operator\x27s\x20own\x20identity\x20decides\x20the\x20payee;\x20never\x20trigger\x20on\x20behalf\x20of\x20another\x20party.\x20':'rail\x20recipients\x20were\x20unreadable\x20from\x20the\x20machine\x20graph\x20—\x20READ\x20them\x20before\x20triggering,\x20the\x20tooling\x20can:\x20query_toolkit\x20query_type=\x27service_panorama\x27\x20returns\x20result.service.order_allocators.allocators[].sharing\x20(who/mode/value\x20per\x20rail),\x20and\x20object_panorama\x20on\x20the\x20pool\x27s\x20Allocation\x20(\x27'+y['allocation']+'\x27)\x20returns\x20the\x20balance,\x20payment_info\x20anchor\x20and\x20the\x20same\x20resolved\x20recipient\x20rows.\x20The\x20name\x20flavor\x20('+(y['refund_terminal']?'refund/cancel-flavored':'completion-flavored')+')\x20is\x20a\x20GUESS\x20about\x20direction,\x20never\x20a\x20fact\x20—\x20do\x20not\x20act\x20on\x20it\x20alone.\x20',A=y?'Node\x20\x22'+a['current']+'\x22\x20is\x20terminal\x20(no\x20outgoing\x20forwards)\x20—\x20but\x20the\x20order\x27s\x20Allocation\x20'+y['allocation']+'\x20still\x20holds\x20'+y['balance']+'\x20(smallest\x20unit)\x20with\x20no\x20payments\x20recorded.\x20'+NO_AUTO_SETTLEMENT_FACT+'\x20'+z+('Execute\x20via\x20onchain_operations\x20{operation_type:\x27allocation\x27,\x20data:{object:\x27'+y['allocation']+'\x27,\x20alloc_by_guard:\x27<guard>\x27}}')+(y['guards']['length']?'\x20—\x20candidate\x20guards\x20on\x20this\x20pool:\x20'+y['guards']['join'](',\x20')+'.':'\x20—\x20inspect\x20the\x20pool\x27s\x20allocators\x20first.')+'\x20Trigger\x20ONCE\x20and\x20verify\x20the\x20pool\x20drained\x20(a\x20fully-drained\x20pool\x20aborts\x20on\x20re-trigger;\x20a\x20max-capped\x20pool\x20re-splits\x20the\x20remainder).\x20Recipients\x20then\x20claim\x20their\x20CoinWrappers\x20(receive).':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.';return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':A};}const d=new Map();for(const B of b){const C=d['get'](B['forward']);if(C)C['add'](B['next_node']);else d['set'](B['forward'],new Set([B['next_node']]));}const e=[];for(const [D,E]of d){if(E['size']<0x2)continue;const F=[...E]['sort'](),G=F['some'](J=>classifyNode(J)==='refund'),H=F['some'](J=>classifyNode(J)!=='refund'),I=G&&H;e['push'](I?'CRITICAL\x20'+D:D);for(let J=0x0;J<b['length'];J++){if(b[J]['forward']!==D)continue;b[J]={...b[J],'ambiguous':{'destinations':F,'fund_conflict':I}};}}e['sort'](),b['sort']((K,L)=>L['consistency']-K['consistency']);const g=e['length']>0x0;let h;if(!g){const K=b['findIndex'](L=>!L['ambiguous']);K>=0x0&&(h={...b[K],'recommended':!![]},b[K]=h);}const j=[];for(const L of b){h&&L!==h&&L['consistency']>0x0&&L['forward']!==h['forward']&&j['push']('Choosing\x20\x22'+L['forward']+'\x20→\x20'+L['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+h['forward']+'\x20→\x20'+h['next_node']+'\x22');}c&&b['some'](M=>classifyNode(M['next_node'])==='refund')&&j['push']('Refund/cancel\x20options\x20are\x20listed\x20but\x20not\x20auto-recommended\x20here\x20(pre-delivery\x20stage,\x20active\x20billing/delivery\x20stage,\x20or\x20a\x20just-completed\x20advance\x20signals\x20intent\x20to\x20continue)\x20—\x20choose\x20one\x20explicitly\x20when\x20cancellation\x20is\x20intended');for(const M of b){if(!M['ambiguous'])continue;j['push']('\x22'+M['forward']+'\x22\x20is\x20AMBIGUOUS\x20from\x20\x22'+a['current']+'\x22\x20—\x20it\x20legally\x20reaches\x20'+M['ambiguous']['destinations']['join']('\x20/\x20')+'\x20'+(M['ambiguous']['fund_conflict']?'(fund\x20direction\x20DIFFERS\x20between\x20them);\x20the\x20destination\x20you\x20pass\x20in\x20next_node_name\x20decides,\x20so\x20state\x20the\x20intended\x20node\x20explicitly\x20instead\x20of\x20trusting\x20the\x20forward\x20name':';\x20state\x20the\x20intended\x20node\x20explicitly'));}const k=[];if(h){const N=h['operator'];if(N['kind']==='order_holder')N['account_name']&&N['account_name']!==a['caller']&&k['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+N['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.');else{if(h['executable_by_caller']===![]){const O=N['kind']==='named_operator'?'named\x20operator\x20\x22'+N['named_operator']+'\x22':N['role_name']??'permission\x20index\x20'+(N['permission_index']??'(unknown)');let P;if(N['kind']==='permission_index'&&a['permissionContext']&&N['permission_index']!==undefined){const Q=[...a['orderHolderAddresses']??[],...a['callerAddress']?[a['callerAddress']]:[]],R=Q['find'](S=>{if(!S)return![];const T=S['toLowerCase']();return a['permissionContext']['admin']['has'](T)||(a['permissionContext']['table']['get'](T)?.['has'](N['permission_index'])??![]);});if(R)P=a['nameResolver']?a['nameResolver'](R):shortAddr(R);}k['push']('The\x20recommended\x20action\x20requires\x20'+O+(P?'\x20(held\x20by\x20'+P+')':'')+('\x20—\x20the\x20current\x20signing\x20account\x20('+(a['caller']??'unresolved')+')\x20is\x20not\x20entitled;\x20switch\x20env.account\x20to\x20an\x20account\x20holding\x20it\x20before\x20operating.'));}}}e['length']>0x0&&k['push']('Machine\x20topology\x20defect\x20(P0-6):\x20forward\x20name(s)\x20'+[...new Set(e['map'](S=>S['replace'](/^CRITICAL /,'')))]['join'](',\x20')+'\x20'+'resolve\x20to\x20more\x20than\x20one\x20destination\x20from\x20this\x20node.\x20The\x20contract\x20accepts\x20any\x20of\x20them\x20(progress.move:540\x20takes\x20next_node\x20as\x20a\x20caller\x20argument;\x20'+'machine.move:182\x20only\x20forbids\x20duplicate\x20prev_node\x20WITHIN\x20one\x20node),\x20so\x20the\x20workflow\x20outcome\x20is\x20decided\x20by\x20the\x20CALLER,\x20not\x20by\x20the\x20published\x20Machine.\x20'+'Nothing\x20is\x20auto-recommended\x20for\x20these\x20forwards\x20—\x20fix\x20the\x20graph\x20by\x20giving\x20each\x20destination\x20its\x20own\x20forward\x20name.');const l=b['filter'](S=>S['guard']);return l['length']>=0x2&&l['length']===b['length']&&k['push'](l['length']+'\x20guarded\x20variants\x20mount\x20on\x20node\x20\x22'+a['current']+'\x22\x20and\x20they\x20are\x20typically\x20MUTUALLY\x20EXCLUSIVE\x20'+'(variant\x20rails\x20usually\x20read\x20a\x20policy/mode\x20oracle\x20row\x20—\x20only\x20the\x20row\x27s\x20current\x20value\x20admits\x20one\x20of\x20them).\x20'+'Do\x20NOT\x20discover\x20which\x20one\x20by\x20signing:\x20probe\x20with\x20env.dry_run=true\x20first\x20(free,\x20never\x20committed,\x20'+'and\x20a\x20guard\x20rejection\x20on\x20a\x20dry\x20run\x20does\x20not\x20consume\x20the\x20retry\x20budget)\x20—\x20the\x20rejection\x20diagnosis\x20names\x20the\x20failing\x20guard.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':h?{'best':h['forward']+'\x20→\x20'+h['next_node'],'rationale':'Highest\x20consistency\x20('+h['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(h['gains']?.['join'](';\x20')||'none')+'.\x20Risks:\x20'+(h['risks']?.['join'](';\x20')||'none')+'.\x20Operator:\x20'+(h['operator']['role_name']??h['operator']['kind'])+(h['operator']['account_name']?'\x20('+h['operator']['account_name']+')':'')+'.'+(h['guard']?'\x20Guard\x20to\x20satisfy:\x20'+h['guard']+'.':''),'caveat':j['length']?j['join']('.\x20'):undefined}:{'best':undefined,'rationale':e['length']?'No\x20action\x20recommended:\x20every\x20reachable\x20forward\x20from\x20\x22'+a['current']+'\x22\x20is\x20ambiguous\x20(resolves\x20to\x20multiple\x20destinations).\x20Choose\x20the\x20destination\x20node\x20deliberately\x20—\x20do\x20not\x20let\x20the\x20forward\x20name\x20decide\x20it.':undefined,'caveat':j['length']?j['join']('.\x20'):undefined},'note':k['length']?k['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b={'hold':'held','unhold':'released\x20(unhold)','adminUnhold':'force-released\x20(adminUnhold)'},c=a['op']?b[a['op']]:undefined,d=c!==undefined?![]:a['current']===a['targetNode'],e={'account':a['callerName'],'action':c!==undefined?a['callerName']+'\x20'+c+'\x20\x22'+a['forward']+'\x22\x20—\x20node\x20stays\x20at\x20\x22'+a['current']+'\x22':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':d,'current_node':a['current']};if(a['simulated'])e['simulated']=!![];if(c!==undefined)e['note']='Hold-family\x20op\x20does\x20not\x20migrate\x20the\x20node\x20—\x20it\x20only\x20pins/unpins\x20a\x20forward;\x20the\x20current\x20node\x20and\x20its\x20threshold\x20state\x20are\x20unchanged.';else{if(!d){const h=a['nodes']['filter'](l=>l['name']===a['targetNode'])['flatMap'](l=>l['pairs'])['find'](l=>l['prev_node']===a['current']),i=a['session']?.['slice'](-0x1)[0x0],j=i?.['threshold']??h?.['threshold']??0x0,k=i?.['weights']??0x0;if(j>0x0){e['threshold']=j,e['accumulated_weight']=k,e['remaining']=Math['max'](0x0,j-k);const l=new Set((i?.['forwards']??[])['filter'](n=>n?.['accomplished']!==![])['map'](n=>n?.['forward'])['filter'](n=>!!n)),m=[];for(const n of h?.['forwards']??[]){if(!n['name']||l['has'](n['name']))continue;m['push']({'forward':n['name'],'operator':resolveOperator(n,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'],{'currentNode':a['current'],'targetNode':a['targetNode']})});}if(m['length'])e['waiting_on']=m;e['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+j+',\x20accumulated\x20weight\x20'+k+',\x20remaining\x20'+Math['max'](0x0,j-k)+'.\x20'+(m['length']?'Waiting\x20for:\x20'+m['map'](o=>o['forward']+'\x20('+(o['operator']['role_name']??o['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else e['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}}const g=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'callerAddress':a['callerAddress'],'orderHolderAddresses':a['orderHolderAddresses'],'progressNamedOperator':a['progressNamedOperator'],'permissionContext':a['permissionContext'],'orderContext':a['orderContext'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver'],'escrow':a['escrow'],'just_advanced':d&&classifyNode(a['targetNode'])!=='refund'});if(g['options']['length']>0x0)e['next_guidance']=g;else{if(g['note'])e['note']=e['note']?e['note']+'\x20'+g['note']:g['note'];}return e;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);c['ambiguous']&&d['push']('AMBIGUOUS:\x20this\x20forward\x20name\x20also\x20reaches\x20'+c['ambiguous']['destinations']['filter'](e=>e!==c['next_node'])['join'](',\x20')+(c['ambiguous']['fund_conflict']?'\x20(fund\x20direction\x20differs\x20—\x20next_node_name\x20decides)':''));d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']?.['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']?.['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));a['simulated']&&b['push']('\x20\x20•\x20simulated\x20(dry-run):\x20this\x20migration\x20comes\x20from\x20the\x20call\x27s\x20own\x20events\x20—\x20state\x20NOT\x20committed\x20on-chain');if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export function extractObjectVersionFromTx(a,b){if(!a||typeof a!=='object')return undefined;const d=a,e=d['effects']?.['objectChanges']??d['objectChanges'];if(!Array['isArray'](e))return undefined;const f=b['toLowerCase']();for(const g of e){if(typeof g?.['object']!=='string'||String(g['object'])['toLowerCase']()!==f)continue;if(g['version']!==undefined&&g['version']!==null)return String(g['version']);}return undefined;}export function extractProgressEventNodeFromTx(a,b){if(!a||typeof a!=='object'||!b)return undefined;const c=a,d=c['events']??c['effects']?.['events'];if(!Array['isArray'](d))return undefined;const e=b['toLowerCase']();for(const f of d){const g=f?.['json']??f?.['parsedJson']??f,h=typeof g?.['node']==='string'?g['node']:undefined;if(!h)continue;const i=typeof g?.['object']==='string'?g['object']['trim']()['toLowerCase']():'';if(i===e||i['startsWith'](e+'\x20')||i['startsWith'](e+'('))return h;}return undefined;}async function fetchTerminalEscrow(b,c,d,e){if(!b)return undefined;try{const f=(await batchQueryObjectsByIds([b],c,d??!![]))[0x0],g=f?.['data']??f,h=typeof g?.['allocation']==='string'?g['allocation']:undefined;if(!h)return undefined;const i=(await batchQueryObjectsByIds([h],c,d??!![]))[0x0],j=i?.['data']??i,k=typeof j?.['balance']==='bigint'?j['balance']:BigInt(j?.['balance']??0x0);if(k<=0x0n)return undefined;const l=Array['isArray'](j?.['payment'])?j['payment']:[];if(l['length']>0x0)return undefined;const m=(Array['isArray'](j?.['allocators']?.['allocators'])?j['allocators']['allocators']:[])['map'](p=>String(p?.['guard']??''))['filter'](p=>p),n=new Set();for(const p of Array['isArray'](j?.['allocators']?.['allocators'])?j['allocators']['allocators']:[]){for(const q of Array['isArray'](p?.['sharing'])?p['sharing']:[]){const r=q?.['who'];if(r!==null&&typeof r==='object'){if('GuardIdentifier'in r)n['add']('buyer');else{if('Entity'in r)n['add']('provider');else{if('Signer'in r)n['add']('signer');}}}}}const o=n['size']===0x0?'unknown':n['size']>0x1?'mixed':[...n][0x0];return{'allocation':h,'balance':k['toString'](),'guards':m,'fund_direction':o,'refund_terminal':REFUND_FLAVOR_RE['test'](e)};}catch{return undefined;}}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=async()=>(await batchQueryObjectsByIds([b],a['network'],!![]))[0x0];let d=await c();const e=extractObjectVersionFromTx(a['txResult'],b);for(let z=0x0;e!==undefined&&d&&String(d['version']??'')!==e&&z<0x2;z++){await new Promise(B=>setTimeout(B,0x258));const A=await c();if(A)d=A;}const f=d?.['data']??d;if((d?.['type']??f?.['type'])!=='Progress')return undefined;let g=f['current']??'';const h=extractProgressEventNodeFromTx(a['txResult'],b),i=h!==undefined&&g!==h;if(i)g=h;const j=i&&a['dryRun']===!![],k=f['machine'],l=Array['isArray'](f['session'])?f['session']:[],m=(Array['isArray'](f['namedOperator'])?f['namedOperator']['find'](B=>B?.['name']==='')?.['operators']:undefined)??[];if(!k)return undefined;const n=await fetchMachineNodes(k,a['network'],![]);let o,p;try{const B=await batchQueryObjectsByIds([k],a['network'],a['noCache']),C=B[0x0],D=C?.['data']??C,E=D?.['permission'];if(E){const F=await batchQueryObjectsByIds([E],a['network'],a['noCache']),G=F[0x0];o=(G?.['data']??G)?.['description']??undefined,p=await fetchPermissionContext(E,a['network'],a['noCache']);}}catch{}const q=(Array['isArray'](f['namedOperator'])?f['namedOperator']:[])['map'](H=>({'name':String(H?.['name']??''),'operators':(H?.['operators']??[])['map'](I=>String(I))}));let r;f['task']&&(r=await fetchOrderContext(f['task'],a['network'],a['noCache']));const s=r?Array['from'](new Set([r['builder'],...r['agent']])['values']()):m;let t;try{t=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{t=undefined;}const u=await makeNameResolver([a['accountName'],...s]),v={'current':g,'nodes':n,'caller':a['accountName'],'callerAddress':t,'orderHolderAddresses':s,'progressNamedOperator':q,'permissionContext':p,'orderContext':r,'permissionDescription':o,'nameResolver':u};let w=buildWorkflowGuidance(v);if(w['options']['length']===0x0){const H=await fetchTerminalEscrow(f['task'],a['network'],a['noCache'],g);H&&(v['escrow']=H,w=buildWorkflowGuidance(v));}let x;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(x=buildWorkflowReceipt({...v,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':l,'simulated':j}));if(a['compact']){w['options']['length']&&!x?.['next_guidance']?.['options']['length']&&trimGuidanceProse(w);if(x?.['next_guidance'])trimGuidanceProse(x['next_guidance']);}const y=[x?renderReceiptText(x):undefined,w['options']['length']&&!x?.['next_guidance']?.['options']['length']?renderGuidanceText(w):undefined]['filter'](I=>!!I)['join']('\x0a\x0a');return{'guidance':w,'receipt':x,'text':y};}catch{return undefined;}}export async function resolveHoldableEdges(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=(await batchQueryObjectsByIds([b],a['network'],!![]))[0x0],d=c?.['data']??c;if((c?.['type']??d?.['type'])!=='Progress')return undefined;const e=typeof d['current']==='string'?d['current']:'',g=d['machine'];if(!g)return undefined;const h=await fetchMachineNodes(g,a['network'],![]);let i;try{const n=await batchQueryObjectsByIds([g],a['network'],a['noCache']),o=(n[0x0]?.['data']??n[0x0])?.['permission'];if(o)i=await fetchPermissionContext(o,a['network'],a['noCache']);}catch{}const j=(Array['isArray'](d['namedOperator'])?d['namedOperator']:[])['map'](p=>({'name':String(p?.['name']??''),'operators':(p?.['operators']??[])['map'](q=>String(q))}));let k;if(d['task'])k=await fetchOrderContext(d['task'],a['network'],a['noCache']);let l;try{l=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{l=undefined;}if(!l)return{'current':e,'edges':[]};const m=[];for(const p of h){for(const q of p['pairs']){if(q['prev_node']!==e)continue;for(const r of q['forwards']){if(!r['name'])continue;m['push']({'next_node':p['name'],'forward':r['name'],'weight':r['weight'],'threshold':q['threshold'],'guard':r['guard'],'kind':forwardOperatorKind(r),'holdable':accountCanExecuteForward(r,l,j,k,i)});}}}return{'current':e,'edges':m};}catch{return undefined;}}function trimGuidanceProse(a){for(const b of a['options']??[]){delete b['gains'],delete b['risks'];if(!b['recommended'])delete b['operator']?.['recommended_call']?.['reason'];}}export function mergeGuidanceIntoOutput(a,b,c){if(!b)return a;try{const d=a?.['structuredContent'];if(d&&typeof d==='object'){const e=d['semantic'];if(e&&typeof e==='object'){const f=!!b['receipt']?.['next_guidance']?.['options']?.['length'];b['guidance']&&!f&&(e['workflow_guidance']=b['guidance']);if(b['receipt'])e['workflow_receipt']=b['receipt'];c?.['responseLevel']!=='full'&&(e['workflow_guidance']&&trimGuidanceProse(e['workflow_guidance']),b['receipt']?.['next_guidance']&&trimGuidanceProse(b['receipt']['next_guidance']));}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}export async function resolveLocalNamesFor(a){const b=new Map();try{const c=[...new Set((a??[])['filter'](e=>typeof e==='string'&&e['startsWith']('0x')))];if(c['length']===0x0)return{'byAddress':b};const d=await GetLocalNamesByAddresses(c);for(const e of d??[]){const f=e?.['account']||e?.['local_mark'];if(f)b['set'](String(e['address'])['toLowerCase'](),f);}}catch{}return{'byAddress':b};}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=a['namedOperator'],i=c['find'](j=>String(j?.['name']??'')===h);if(i?.['operators']?.['some'](j=>String(j)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const j=e['table']['get'](g);if(j?.['has'](a['permissionIndex']))return!![];}return![];}export function forwardOperatorKind(a){if(a['namedOperator']==='')return'order_holder';if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return'named_operator';return'permission_index';}export function enumerateActionableForwards(a,b,c,d,e,g){const h=typeof a?.['current']==='string'?a['current']:'',i=new Map();for(const k of Array['isArray'](a?.['session'])?a['session']:[]){const l=String(k?.['next_node']??'');for(const m of Array['isArray'](k?.['forwards'])?k['forwards']:[]){i['set'](l+'|'+String(m?.['forward']??''),{'who':m?.['who']?String(m['who'])['toLowerCase']():null,'accomplished':!!m?.['accomplished']});}}const j=[];for(const n of b){for(const o of n['pairs']){if(o['prev_node']!==h)continue;for(const p of o['forwards']){if(!p['name'])continue;const q=i['get'](n['name']+'|'+p['name']);if(q?.['accomplished'])continue;let r=c['filter'](t=>accountCanExecuteForward(p,t,d,e,g));q?.['who']&&(r=r['filter'](t=>t['toLowerCase']()===q['who'])),j['push']({'next_node':n['name'],'forward':p['name'],'weight':p['weight'],'threshold':o['threshold'],'guard':p['guard'],'operator_kind':forwardOperatorKind(p),'permission_index':p['permissionIndex']??undefined,'named_operator':typeof p['namedOperator']==='string'&&p['namedOperator']['length']>0x0?p['namedOperator']:undefined,'executable_accounts':r['map'](t=>t['toLowerCase']())});}}}return j;}
@@ -1 +1 @@
1
- import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{bridgeMonitorSuggestions}from'./SuggestionBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{runKeeperScan as a283a,realKeeperScanDeps}from'../keeper/KeeperScan.js';import{addProblem,addSuggestion,listProblems,listSuggestions}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'openSuggestions':a=>bridgeMonitorSuggestions(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addSuggestion':addSuggestion,'listSuggestions':listSuggestions,'logger':b=>console['error']('[monitor]\x20'+b)}),'runKeeperScan':(a,b)=>a283a(a,b,realKeeperScanDeps()),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}if(m['length']>0x0&&this['deps']['openSuggestions'])try{await this['deps']['openSuggestions']({'network':a,'events':j,'annotations':m,'scope':k});}catch(s){this['deps']['logger']('monitor\x20loop:\x20suggestion\x20bridge\x20error\x20on\x20'+a+':\x20'+String(s?.['message']??s));}if(this['deps']['runKeeperScan'])try{await this['deps']['runKeeperScan'](a,k);}catch(t){this['deps']['logger']('monitor\x20loop:\x20keeper\x20scan\x20error\x20on\x20'+a+':\x20'+String(t?.['message']??t));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:u,changed:v}=await this['deps']['resolveScope'](a,f);c['scope']=u;if(v){const w=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),x=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],u,w,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+u['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+x['rescanned']+',\x20updated\x20'+x['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(y){const z=String(y?.['message']??y);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+z),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
1
+ import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{bridgeMonitorSuggestions}from'./SuggestionBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{runKeeperScan as a284a,realKeeperScanDeps}from'../keeper/KeeperScan.js';import{addProblem,addSuggestion,listProblems,listSuggestions}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'openSuggestions':a=>bridgeMonitorSuggestions(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addSuggestion':addSuggestion,'listSuggestions':listSuggestions,'logger':b=>console['error']('[monitor]\x20'+b)}),'runKeeperScan':(a,b)=>a284a(a,b,realKeeperScanDeps()),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}if(m['length']>0x0&&this['deps']['openSuggestions'])try{await this['deps']['openSuggestions']({'network':a,'events':j,'annotations':m,'scope':k});}catch(s){this['deps']['logger']('monitor\x20loop:\x20suggestion\x20bridge\x20error\x20on\x20'+a+':\x20'+String(s?.['message']??s));}if(this['deps']['runKeeperScan'])try{await this['deps']['runKeeperScan'](a,k);}catch(t){this['deps']['logger']('monitor\x20loop:\x20keeper\x20scan\x20error\x20on\x20'+a+':\x20'+String(t?.['message']??t));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:u,changed:v}=await this['deps']['resolveScope'](a,f);c['scope']=u;if(v){const w=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),x=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],u,w,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+u['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+x['rescanned']+',\x20updated\x20'+x['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(y){const z=String(y?.['message']??y);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+z),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
@@ -48,6 +48,7 @@ export interface RecommendedCall {
48
48
  reason?: string;
49
49
  }
50
50
  export declare function isRenewalLoopEdge(currentNode: string, targetNode: string): boolean;
51
+ export declare function isInstallmentCaptureEdge(currentNode: string, targetNode: string): boolean;
51
52
  export declare function recommendedCallForOrderHolder(opts: {
52
53
  hasGuard?: boolean;
53
54
  currentNode?: string;
@@ -1 +1 @@
1
- import{deriveCommercialRole,CORE_PERMISSION_INDEX}from'../role/derivation.js';import{annotateNodeName}from'../graph/onchain/order-status.js';const ORDER_HOLDER_CALL={'tool':'onchain_operations','path':'data.progress','reason':'namedOperator=\x22\x22\x20=\x20OrderHolder:\x20execute\x20via\x20onchain_operations\x20operation_type=\x22order\x22\x20data.progress\x20—\x20order::progress\x20runs\x20with\x20the\x20Order\x20as\x20holder\x20(OrderHolder\x20short-circuit\x20established\x20at\x20purchase).\x20workflow_operation\x20operate\x20auto-routes\x20to\x20the\x20same\x20order-bound\x20path\x20when\x20the\x20Progress\x20task\x20is\x20an\x20Order;\x20on\x20a\x20standalone\x20Progress\x20empty-namedOperator\x20forwards\x20are\x20un-executable\x20(abort\x208).'},ORDER_RENEW_CALL={'tool':'onchain_operations','path':'data.order_renew','reason':'Renewal\x20forward\x20(order-holder\x20loop\x20into\x20a\x20charging\x20node):\x20execute\x20via\x20onchain_operations\x20operation_type=\x22order\x22\x20data.order_renew\x20—\x20ONE\x20PTB\x20pays\x20the\x20period\x20amount\x20into\x20the\x20Allocation\x20AND\x20advances\x20the\x20renew\x20forward\x20atomically.\x20Plain\x20data.progress\x20would\x20advance\x20the\x20loop\x20WITHOUT\x20funding\x20it\x20(zero-value\x20period).'},RENEWAL_NODE_RE=/(charg|billing|renew)/i,POST_PERIOD_NODE_RE=/(deliver|complet|expir|ship|sent)/i;export function isRenewalLoopEdge(a,b){return RENEWAL_NODE_RE['test'](b)&&POST_PERIOD_NODE_RE['test'](a);}export function recommendedCallForOrderHolder(a){const b=a['currentNode']!==undefined&&a['targetNode']!==undefined&&isRenewalLoopEdge(a['currentNode'],a['targetNode']),c=b?ORDER_RENEW_CALL:ORDER_HOLDER_CALL;return a['hasGuard']?{...c,'reason':c['reason']+GUARD_PASSPORT_SUFFIX}:c;}const PROGRESS_OPERATE_CALL={'tool':'workflow_operation','path':'data.operate','reason':'Forward\x20requires\x20a\x20permission\x20index\x20or\x20a\x20named\x20operator:\x20execute\x20on\x20the\x20Progress\x20object\x20via\x20workflow_operation\x20action=operate.\x20The\x20OrderHolder\x20short-circuit\x20(order.data.progress)\x20does\x20not\x20apply\x20to\x20this\x20forward.'},GUARD_PASSPORT_SUFFIX='\x20The\x20forward\x20binds\x20a\x20Guard:\x20a\x20validated\x20passport\x20is\x20mandatory\x20on\x20either\x20route\x20(progress#9\x20\x22Passport\x20required\x22)\x20and\x20cannot\x20be\x20bypassed.';export function recommendedCallForExecutionPath(a,b){const c=a==='order_holder'?ORDER_HOLDER_CALL:a==='permission'||a==='named_operator'?PROGRESS_OPERATE_CALL:undefined;if(!c)return undefined;return b?{...c,'reason':c['reason']+GUARD_PASSPORT_SUFFIX}:c;}export function recommendedCallForForwardBinding(a){const b=a['permissionIndex']!=null?'permission':a['namedOperator']===''?'order_holder':a['namedOperator']!=null?'named_operator':'not_available';return recommendedCallForExecutionPath(b,a['hasGuard']);}export function analyzeOrderParticipation(a){const b=a['node_annotations'],c=a['current_node']??'',d=!!a['order_holder']&&a['order_holder']===a['account'],e=new Set();if(a['permission']?.['entityPermissions'])for(const [v,w]of a['permission']['entityPermissions']){if(v===a['account']){for(const x of w)e['add'](x);}}if(a['permission']){const y=a['permission']['admin']??[],z=a['permission']['owner'];(y['some'](A=>A['toLowerCase']()===a['account']['toLowerCase']())||z&&z['toLowerCase']()===a['account']['toLowerCase']())&&e['add'](CORE_PERMISSION_INDEX['service']);}const f=[];if(a['named_accounts'])for(const [A,B]of Object['entries'](a['named_accounts'])){if(nameResolvesTo(B,a['account']))f['push'](A);}const g=deriveCommercialRole({'account':a['account'],'order_holder':a['order_holder'],'held_permission_indexes':Array['from'](e),'named_operator_names':f,'demand_presenters':a['demand_presenters'],'has_active_order':!![]}),h=g['role'],i=g['collaborator_kind'],j=[],k=[],l=!a['workflow'];let m;if(a['workflow'])for(const C of a['workflow']['transitions']){if(C['prevNode']!==c)continue;m=C['threshold'];const D={'name':C['forward']??'(unnamed)','permissionIndex':C['permissionIndex']??null,'namedOperator':C['namedOperator']??null,'guard':C['guard']??null,'weight':C['weight']??null},E=resolveForward(D,C['node'],a,d,e,b);if(E['execution_path']==='not_available'){const F=D['permissionIndex']!=null?'permission\x20index\x20'+D['permissionIndex']:D['namedOperator']===''?'OrderHolder\x20(customer)':'named\x20operator\x20\x27'+D['namedOperator']+'\x27',G=k['find'](H=>H['role']===F);if(G)G['forwards']['push'](E['name']);else k['push']({'role':F,'forwards':[E['name']]});}else j['push'](E);}const n=[];d&&n['push']({'label':'OrderHolder\x20(customer)','can_act_now':j['some'](H=>H['execution_path']==='order_holder')});for(const H of[...e]['sort']((I,J)=>I-J)){n['push']({'label':'permission\x20index\x20'+H,'can_act_now':j['some'](I=>I['permission_index']===H)});}if(a['named_accounts'])for(const [I,J]of Object['entries'](a['named_accounts'])){nameResolvesTo(J,a['account'])&&n['push']({'label':'named\x20operator\x20\x27'+I+'\x27','can_act_now':j['some'](K=>K['named_operator']===I)});}let o;j['length']>0x1&&(o={'message':j['length']+'\x20operations\x20are\x20available\x20to\x20you\x20at\x20node\x20\x27'+(c||'(entry)')+'\x27.\x20'+'Each\x20leads\x20to\x20a\x20different\x20outcome\x20—\x20review\x20the\x20consequences\x20and\x20choose;\x20no\x20one\x20else\x20can\x20make\x20this\x20decision\x20for\x20you.','options':j['map'](K=>({'forward':K['name'],'to_node':K['to_node'],'consequence':K['consequence']}))});const p=[];for(const K of a['claimable_rewards']??[]){if(K['already_claimed'])continue;p['push']({'kind':'reward','label':K['description']??'Reward\x20'+K['address'],'how':'onchain_operations\x20reward\x20op=\x27claim\x27\x20(object=\x27'+K['address']+'\x27)'});}a['pending_compensation']&&p['push']({'kind':'compensation','label':a['pending_compensation']['note']??'Arbitration\x20indemnity\x20awarded\x20to\x20you','how':'onchain_operations\x20order\x20op=\x27arb_claim_compensation\x27\x20(arb=\x27'+a['pending_compensation']['arbitration']+'\x27)\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund'});a['discount_available']&&p['push']({'kind':'discount','label':a['discount_available'],'how':'Mention\x20the\x20discount\x20when\x20placing\x20the\x20next\x20order\x20(reward\x20discount\x20config\x20applies\x20at\x20purchase)'});a['rating_pending']&&p['push']({'kind':'rating','label':'Rate\x20this\x20transaction\x20(like/dislike)\x20—\x20builds\x20on-chain\x20reputation\x20for\x20both\x20sides','how':'onchain_operations\x20operation_type=\x27personal\x27,\x20data.mark={op:\x27like\x27|\x27dislike\x27,\x20address:\x27<merchant\x20address>\x27}\x20—\x20counts\x20into\x20the\x20PUBLIC\x20aggregate\x20via\x20the\x20on-chain\x20reputation\x20registry'});const q=d?j['find'](L=>/review/i['test'](L['to_node'])):undefined;if(q){const L=(a['claimable_rewards']??[])['some'](M=>!M['already_claimed'])?'\x20A\x20guard-gated\x20service\x20reward\x20is\x20attached\x20to\x20this\x20order\x20—\x20its\x20claim\x20rides\x20the\x20SAME\x20passport\x20as\x20the\x20review\x20forward.':'';p['push']({'kind':'review','label':'Review\x20this\x20transaction:\x20advancing\x20\x27'+q['name']+'\x27\x20→\x20\x27'+q['to_node']+'\x27\x20carries\x20your\x20review.\x20'+'Your\x20review\x20TEXT\x20rides\x20the\x20forward\x20message\x20(permanent\x20on-chain\x20history,\x20signed\x20by\x20you);\x20the\x20structured\x20'+'like/dislike\x20+\x20tags\x20ride\x20the\x20review\x20repository\x20in\x20the\x20same\x20transaction.\x20Reviewing\x20does\x20NOT\x20affect\x20your\x20'+'refund/settlement\x20rights\x20—\x20settlement\x20is\x20anchored\x20on\x20delivery\x20time,\x20not\x20on\x20whether\x20or\x20how\x20you\x20review.'+L,'how':'onchain_operations\x20operation_type=\x22progress\x22\x20data.progress\x20(forward\x20\x27'+q['name']+'\x27)\x20with\x20'+'data.message\x20=\x20review\x20text;\x20optional\x20data.review\x20=\x20{\x20repository:\x20\x27<review\x20repository>\x27,\x20'+'rating:\x20\x27like\x27|\x27dislike\x27,\x20tags?:\x20[...],\x20reward_claim?:\x20{\x20reward,\x20guard\x20}\x20}\x20—\x20the\x20chained\x20repository\x20'+'write\x20+\x20reward\x20claim\x20reuse\x20the\x20forward\x27s\x20passport'});}const s=buildInterestHints(a,h,j,k,c),u=buildSummary(a,h,n,j,k,p,l,c);return{'account':a['account'],'progress':a['progress_address'],'order':a['order_address'],'current_node':c,'perspective':h,'collaborator_kind':i,'roles':n,'operable':j,'branch_choice':o,'waiting_on':k,'pending_claims':p,'interest_hints':s,'workflow_unknown':l,'threshold':m,'summary':u};}export function aggregateRadar(a,b){const c=a['filter'](g=>g['operable']['length']>0x0||g['pending_claims']['length']>0x0)['sort']((g,h)=>(g['perspective']==='customer'?0x0:0x1)-(h['perspective']==='customer'?0x0:0x1)),d=a['filter'](g=>g['operable']['length']===0x0&&g['pending_claims']['length']===0x0),e=a['flatMap'](g=>g['pending_claims']['map'](h=>({...h,'progress':g['progress']}))),f=a['length']===0x0?'No\x20in-flight\x20orders\x20found\x20for\x20this\x20account.':a['length']+'\x20in-flight\x20order(s):\x20'+c['length']+'\x20need\x20your\x20action\x20or\x20have\x20claims,\x20'+d['length']+'\x20are\x20waiting\x20on\x20other\x20roles.\x20'+(e['length']>0x0?e['length']+'\x20unclaimed\x20benefit(s)\x20detected.\x20':'')+(c['length']>0x0?'Top\x20priority:\x20'+c[0x0]['summary']:'Nothing\x20requires\x20your\x20action\x20right\x20now.');return{'account':a[0x0]?.['account']??'','orders_analyzed':a['length'],'actionable':c,'waiting':d,'all_pending_claims':e,'unread_messages_total':b??0x0,'summary':f};}function nameResolvesTo(a,b){if(!a)return![];return Array['isArray'](a)?a['includes'](b):a===b;}export function isConsequenceNode(a,b,c){const d=(a??'')['toLowerCase'](),e=c?.[b];if(e?.['some'](g=>!!g&&d['includes'](g['toLowerCase']())))return!![];const f=annotateNodeName(a??'');return b==='completed'?f==='completion':f==='refund'||f==='exception';}function resolveForward(a,b,c,d,e,f){let g='not_available';if(a['permissionIndex']!=null){if(e['has'](a['permissionIndex']))g='permission';}else{if(a['namedOperator']===''){if(d)g='order_holder';}else{if(a['namedOperator']!=null){const l=c['named_accounts']?.[a['namedOperator']];if(nameResolvesTo(l,c['account']))g='named_operator';}}}const h=b,i=describeForward(a['name']??'',h,g,a['permissionIndex'],a['namedOperator']),j=consequenceOf(h,f),k=g==='order_holder'?recommendedCallForOrderHolder({'hasGuard':!!a['guard'],'currentNode':c['current_node']??'','targetNode':h}):recommendedCallForExecutionPath(g,!!a['guard']);return{'name':a['name']??'(unnamed)','to_node':h,'execution_path':g,'permission_index':a['permissionIndex']??undefined,'named_operator':a['namedOperator']??undefined,'guard':a['guard']??undefined,'semantics':i,'consequence':j,'weight':a['weight']??undefined,'recommended_call':k};}function describeForward(a,b,c,d,e){const f=d!=null?'requires\x20permission\x20index\x20'+d:e===''?'executable\x20by\x20the\x20order\x20holder\x20(customer)':'executable\x20by\x20named\x20operator\x20\x27'+e+'\x27',g=c==='not_available'?'You\x20CANNOT\x20execute\x20this':'You\x20CAN\x20execute\x20this';return'\x27'+a+'\x27\x20advances\x20the\x20order\x20to\x20node\x20\x27'+b+'\x27\x20('+f+').\x20'+g+'.';}export function consequenceOf(a,b){if(isConsequenceNode(a,'completed',b))return'Completion\x20path\x20—\x20funds\x20are\x20released\x20to\x20the\x20merchant\x20per\x20the\x20Allocation\x20waterfall;\x20refunds\x20become\x20harder\x20after\x20this\x20point.';if(isConsequenceNode(a,'refunded',b))return'Refund/cancellation\x20path\x20—\x20escrowed\x20funds\x20return\x20to\x20the\x20buyer\x20per\x20the\x20Allocation\x20configuration.';return undefined;}function buildInterestHints(a,b,c,d,e){const f=[],g=a['now']??Date['now'](),h=a['last_progress_at']!=null?(g-a['last_progress_at'])/0x36ee80:undefined;if(b==='customer')c['length']>0x0&&f['push']('Your\x20confirmation\x20is\x20the\x20fund-release\x20trigger:\x20escrowed\x20money\x20stays\x20locked\x20until\x20YOU\x20act\x20—\x20only\x20confirm\x20when\x20the\x20deliverable\x20matches\x20the\x20agreement.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Delivery\x20depends\x20on\x20the\x20merchant-side\x20roles\x20listed\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20Messenger\x20first,\x20then\x20consider\x20dispute\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x18&&f['push']('Order\x20has\x20not\x20advanced\x20for\x20'+Math['round'](h)+'h.\x20Your\x20leverage:\x20compensation_fund\x20(if\x20any)\x20+\x20arbitration\x20+\x20on-chain\x20reputation\x20(dislike)\x20—\x20in\x20that\x20order.');else{if(b==='supplier')c['length']>0x0&&f['push']('Advancing\x20your\x20sub-order\x20NOW\x20unlocks\x20YOUR\x20settlement\x20—\x20upload\x20delivery\x20evidence\x20first\x20to\x20protect\x20your\x20payment\x20claim\x20against\x20the\x20upstream\x20merchant.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Your\x20settlement\x20depends\x20on\x20upstream\x20roles\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20a\x20Messenger\x20nudge\x20first,\x20then\x20arbitration\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x30&&f['push']('Sub-order\x20stalled\x20'+Math['round'](h)+'h:\x20your\x20claim\x20erodes\x20with\x20time\x20—\x20evidence\x20+\x20a\x20Messenger\x20nudge\x20are\x20your\x20cheapest\x20protections.');else{if(b==='collaborator'||b==='merchant'){const i=d['filter'](j=>j['role']['startsWith']('permission\x20index'));c['length']>0x0&&f['push']('Advancing\x20the\x20workflow\x20NOW\x20improves\x20flow\x20efficiency\x20and\x20shortens\x20your\x20fund-settlement\x20cycle;\x20stalled\x20orders\x20degrade\x20your\x20on-chain\x20reputation\x20metrics\x20(dispute\x20rate,\x20stall\x20statistics).');i['length']>0x0&&f['push']('Nodes\x20waiting\x20on\x20YOUR\x20permission\x20indexes\x20are\x20your\x20responsibility\x20surface:\x20prolonged\x20inaction\x20may\x20trigger\x20timeout\x20penalties\x20or\x20disputes\x20recorded\x20permanently\x20on-chain.');e&&c['length']===0x0&&f['push']('Nothing\x20for\x20you\x20to\x20execute\x20at\x20this\x20node\x20—\x20monitor\x20only;\x20avoid\x20unnecessary\x20interference\x20that\x20creates\x20semantic\x20responsibility.');if(b==='merchant'&&a['review_summary']){const {orders_completed:j,reviews_written:k,reward_bound:l}=a['review_summary'];if(j>0x0&&k<j){const m=j-k,n=m/j;n>=0.3&&f['push']('Review\x20coverage\x20is\x20low:\x20'+k+'/'+j+'\x20completed\x20orders\x20carry\x20a\x20structured\x20review\x20('+m+'\x20missing).'+(l?'\x20With\x20a\x20review\x20reward\x20attached,\x20a\x20high\x20missing\x20rate\x20usually\x20means\x20the\x20reward\x20expired,\x20its\x20window\x20is\x20too\x20short,\x20or\x20the\x20reward\x20is\x20hard\x20to\x20discover\x20at\x20quote\x20time\x20—\x20review\x20the\x20reward\x20terms\x20and\x20window.':'\x20Consider\x20whether\x20a\x20review\x20incentive\x20(review_reward\x20mode)\x20or\x20a\x20longer\x20review\x20window\x20fits\x20this\x20service.'));}}}else f['push']('You\x20hold\x20no\x20operative\x20role\x20on\x20this\x20order\x20(neutral).\x20On-chain\x20data\x20remains\x20transparent\x20to\x20you\x20for\x20auditing.');}}return(a['unread_messages']??0x0)>0x0&&f['push'](a['unread_messages']+'\x20unread\x20Messenger\x20message(s)\x20—\x20negotiation\x20evidence\x20(WTS)\x20forms\x20the\x20arbitration\x20record;\x20timely\x20replies\x20protect\x20your\x20position.'),f;}function buildSummary(a,b,c,d,e,f,g,h){const i=c['length']>0x0?c['map'](m=>m['label'])['join'](',\x20'):'no\x20operative\x20role',j=h===''?'(entry,\x20not\x20started)':'\x27'+h+'\x27';if(g)return'Order\x20'+a['progress_address']+'\x20is\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+').\x20Machine\x20workflow\x20data\x20unavailable\x20—\x20fetch\x20the\x20bound\x20Machine\x20to\x20see\x20executable\x20operations.';const k=d['length']>0x0?'you\x20can\x20execute:\x20'+d['map'](m=>'\x27'+m['name']+'\x27→\x27'+m['to_node']+'\x27')['join'](',\x20'):e['length']>0x0?'waiting\x20on\x20'+e['map'](m=>m['role'])['join'](',\x20'):'no\x20pending\x20operations\x20at\x20this\x20node',l=f['length']>0x0?'\x20'+f['length']+'\x20unclaimed\x20benefit(s).':'';return'Order\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+')\x20—\x20'+k+'.'+l;}
1
+ import{deriveCommercialRole,CORE_PERMISSION_INDEX}from'../role/derivation.js';import{annotateNodeName}from'../graph/onchain/order-status.js';const ORDER_HOLDER_CALL={'tool':'onchain_operations','path':'data.progress','reason':'namedOperator=\x22\x22\x20=\x20OrderHolder:\x20execute\x20via\x20onchain_operations\x20operation_type=\x22order\x22\x20data.progress\x20—\x20order::progress\x20runs\x20with\x20the\x20Order\x20as\x20holder\x20(OrderHolder\x20short-circuit\x20established\x20at\x20purchase).\x20workflow_operation\x20operate\x20auto-routes\x20to\x20the\x20same\x20order-bound\x20path\x20when\x20the\x20Progress\x20task\x20is\x20an\x20Order;\x20on\x20a\x20standalone\x20Progress\x20empty-namedOperator\x20forwards\x20are\x20un-executable\x20(abort\x208).'},ORDER_RENEW_CALL={'tool':'onchain_operations','path':'data.order_renew','reason':'Renewal\x20forward\x20(order-holder\x20loop\x20into\x20a\x20charging\x20node):\x20execute\x20via\x20onchain_operations\x20operation_type=\x22order\x22\x20data.order_renew\x20—\x20ONE\x20PTB\x20pays\x20the\x20period\x20amount\x20into\x20the\x20Allocation\x20AND\x20advances\x20the\x20renew\x20forward\x20atomically.\x20Plain\x20data.progress\x20would\x20advance\x20the\x20loop\x20WITHOUT\x20funding\x20it\x20(zero-value\x20period).'},INSTALLMENT_CAPTURE_CALL={'tool':'onchain_operations','path':'data.order_renew','reason':'Installment/deposit\x20capture\x20forward\x20(a\x20due\x20state\x20advancing\x20into\x20a\x20paid\x20state):\x20execute\x20via\x20onchain_operations\x20operation_type=\x22order\x22\x20data.order_renew\x20—\x20ONE\x20PTB\x20pays\x20the\x20captured\x20installment\x20into\x20the\x20Allocation\x20AND\x20advances\x20the\x20forward\x20atomically.\x20Plain\x20data.progress\x20would\x20advance\x20WITHOUT\x20the\x20capture\x20landing\x20(a\x20zero-value\x20advance\x20the\x20allocation.balance\x20fund\x20gate\x20rejects,\x20INV-B1).'},RENEWAL_NODE_RE=/(charg|billing|renew)/i,POST_PERIOD_NODE_RE=/(deliver|complet|expir|ship|sent)/i,INSTALLMENT_DUE_NODE_RE=/(due|owed|owing|unpaid|awaiting|pending)/i,INSTALLMENT_CAPTURE_NODE_RE=/(paid|captured|funded|settled)/i;export function isRenewalLoopEdge(a,b){return RENEWAL_NODE_RE['test'](b)&&POST_PERIOD_NODE_RE['test'](a);}export function isInstallmentCaptureEdge(a,b){return INSTALLMENT_DUE_NODE_RE['test'](a)&&INSTALLMENT_CAPTURE_NODE_RE['test'](b);}export function recommendedCallForOrderHolder(a){const b=a['currentNode']!==undefined&&a['targetNode']!==undefined,c=b&&isRenewalLoopEdge(a['currentNode'],a['targetNode']),d=!c&&b&&isInstallmentCaptureEdge(a['currentNode'],a['targetNode']),e=c?ORDER_RENEW_CALL:d?INSTALLMENT_CAPTURE_CALL:ORDER_HOLDER_CALL;return a['hasGuard']?{...e,'reason':e['reason']+GUARD_PASSPORT_SUFFIX}:e;}const PROGRESS_OPERATE_CALL={'tool':'workflow_operation','path':'data.operate','reason':'Forward\x20requires\x20a\x20permission\x20index\x20or\x20a\x20named\x20operator:\x20execute\x20on\x20the\x20Progress\x20object\x20via\x20workflow_operation\x20action=operate.\x20The\x20OrderHolder\x20short-circuit\x20(order.data.progress)\x20does\x20not\x20apply\x20to\x20this\x20forward.'},GUARD_PASSPORT_SUFFIX='\x20The\x20forward\x20binds\x20a\x20Guard:\x20a\x20validated\x20passport\x20is\x20mandatory\x20on\x20either\x20route\x20(progress#9\x20\x22Passport\x20required\x22)\x20and\x20cannot\x20be\x20bypassed.';export function recommendedCallForExecutionPath(a,b){const c=a==='order_holder'?ORDER_HOLDER_CALL:a==='permission'||a==='named_operator'?PROGRESS_OPERATE_CALL:undefined;if(!c)return undefined;return b?{...c,'reason':c['reason']+GUARD_PASSPORT_SUFFIX}:c;}export function recommendedCallForForwardBinding(a){const b=a['permissionIndex']!=null?'permission':a['namedOperator']===''?'order_holder':a['namedOperator']!=null?'named_operator':'not_available';return recommendedCallForExecutionPath(b,a['hasGuard']);}export function analyzeOrderParticipation(a){const b=a['node_annotations'],c=a['current_node']??'',d=!!a['order_holder']&&a['order_holder']===a['account'],e=new Set();if(a['permission']?.['entityPermissions'])for(const [v,w]of a['permission']['entityPermissions']){if(v===a['account']){for(const x of w)e['add'](x);}}if(a['permission']){const y=a['permission']['admin']??[],z=a['permission']['owner'];(y['some'](A=>A['toLowerCase']()===a['account']['toLowerCase']())||z&&z['toLowerCase']()===a['account']['toLowerCase']())&&e['add'](CORE_PERMISSION_INDEX['service']);}const f=[];if(a['named_accounts'])for(const [A,B]of Object['entries'](a['named_accounts'])){if(nameResolvesTo(B,a['account']))f['push'](A);}const g=deriveCommercialRole({'account':a['account'],'order_holder':a['order_holder'],'held_permission_indexes':Array['from'](e),'named_operator_names':f,'demand_presenters':a['demand_presenters'],'has_active_order':!![]}),h=g['role'],i=g['collaborator_kind'],j=[],k=[],l=!a['workflow'];let m;if(a['workflow'])for(const C of a['workflow']['transitions']){if(C['prevNode']!==c)continue;m=C['threshold'];const D={'name':C['forward']??'(unnamed)','permissionIndex':C['permissionIndex']??null,'namedOperator':C['namedOperator']??null,'guard':C['guard']??null,'weight':C['weight']??null},E=resolveForward(D,C['node'],a,d,e,b);if(E['execution_path']==='not_available'){const F=D['permissionIndex']!=null?'permission\x20index\x20'+D['permissionIndex']:D['namedOperator']===''?'OrderHolder\x20(customer)':'named\x20operator\x20\x27'+D['namedOperator']+'\x27',G=k['find'](H=>H['role']===F);if(G)G['forwards']['push'](E['name']);else k['push']({'role':F,'forwards':[E['name']]});}else j['push'](E);}const n=[];d&&n['push']({'label':'OrderHolder\x20(customer)','can_act_now':j['some'](H=>H['execution_path']==='order_holder')});for(const H of[...e]['sort']((I,J)=>I-J)){n['push']({'label':'permission\x20index\x20'+H,'can_act_now':j['some'](I=>I['permission_index']===H)});}if(a['named_accounts'])for(const [I,J]of Object['entries'](a['named_accounts'])){nameResolvesTo(J,a['account'])&&n['push']({'label':'named\x20operator\x20\x27'+I+'\x27','can_act_now':j['some'](K=>K['named_operator']===I)});}let o;j['length']>0x1&&(o={'message':j['length']+'\x20operations\x20are\x20available\x20to\x20you\x20at\x20node\x20\x27'+(c||'(entry)')+'\x27.\x20'+'Each\x20leads\x20to\x20a\x20different\x20outcome\x20—\x20review\x20the\x20consequences\x20and\x20choose;\x20no\x20one\x20else\x20can\x20make\x20this\x20decision\x20for\x20you.','options':j['map'](K=>({'forward':K['name'],'to_node':K['to_node'],'consequence':K['consequence']}))});const p=[];for(const K of a['claimable_rewards']??[]){if(K['already_claimed'])continue;p['push']({'kind':'reward','label':K['description']??'Reward\x20'+K['address'],'how':'onchain_operations\x20reward\x20op=\x27claim\x27\x20(object=\x27'+K['address']+'\x27)'});}a['pending_compensation']&&p['push']({'kind':'compensation','label':a['pending_compensation']['note']??'Arbitration\x20indemnity\x20awarded\x20to\x20you','how':'onchain_operations\x20order\x20op=\x27arb_claim_compensation\x27\x20(arb=\x27'+a['pending_compensation']['arbitration']+'\x27)\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund'});a['discount_available']&&p['push']({'kind':'discount','label':a['discount_available'],'how':'Mention\x20the\x20discount\x20when\x20placing\x20the\x20next\x20order\x20(reward\x20discount\x20config\x20applies\x20at\x20purchase)'});a['rating_pending']&&p['push']({'kind':'rating','label':'Rate\x20this\x20transaction\x20(like/dislike)\x20—\x20builds\x20on-chain\x20reputation\x20for\x20both\x20sides','how':'onchain_operations\x20operation_type=\x27personal\x27,\x20data.mark={op:\x27like\x27|\x27dislike\x27,\x20address:\x27<merchant\x20address>\x27}\x20—\x20counts\x20into\x20the\x20PUBLIC\x20aggregate\x20via\x20the\x20on-chain\x20reputation\x20registry'});const q=d?j['find'](L=>/review/i['test'](L['to_node'])):undefined;if(q){const L=(a['claimable_rewards']??[])['some'](M=>!M['already_claimed'])?'\x20A\x20guard-gated\x20service\x20reward\x20is\x20attached\x20to\x20this\x20order\x20—\x20its\x20claim\x20rides\x20the\x20SAME\x20passport\x20as\x20the\x20review\x20forward.':'';p['push']({'kind':'review','label':'Review\x20this\x20transaction:\x20advancing\x20\x27'+q['name']+'\x27\x20→\x20\x27'+q['to_node']+'\x27\x20carries\x20your\x20review.\x20'+'Your\x20review\x20TEXT\x20rides\x20the\x20forward\x20message\x20(permanent\x20on-chain\x20history,\x20signed\x20by\x20you);\x20the\x20structured\x20'+'like/dislike\x20+\x20tags\x20ride\x20the\x20review\x20repository\x20in\x20the\x20same\x20transaction.\x20Reviewing\x20does\x20NOT\x20affect\x20your\x20'+'refund/settlement\x20rights\x20—\x20settlement\x20is\x20anchored\x20on\x20delivery\x20time,\x20not\x20on\x20whether\x20or\x20how\x20you\x20review.'+L,'how':'onchain_operations\x20operation_type=\x22progress\x22\x20data.progress\x20(forward\x20\x27'+q['name']+'\x27)\x20with\x20'+'data.message\x20=\x20review\x20text;\x20optional\x20data.review\x20=\x20{\x20repository:\x20\x27<review\x20repository>\x27,\x20'+'rating:\x20\x27like\x27|\x27dislike\x27,\x20tags?:\x20[...],\x20reward_claim?:\x20{\x20reward,\x20guard\x20}\x20}\x20—\x20the\x20chained\x20repository\x20'+'write\x20+\x20reward\x20claim\x20reuse\x20the\x20forward\x27s\x20passport'});}const s=buildInterestHints(a,h,j,k,c),u=buildSummary(a,h,n,j,k,p,l,c);return{'account':a['account'],'progress':a['progress_address'],'order':a['order_address'],'current_node':c,'perspective':h,'collaborator_kind':i,'roles':n,'operable':j,'branch_choice':o,'waiting_on':k,'pending_claims':p,'interest_hints':s,'workflow_unknown':l,'threshold':m,'summary':u};}export function aggregateRadar(a,b){const c=a['filter'](g=>g['operable']['length']>0x0||g['pending_claims']['length']>0x0)['sort']((g,h)=>(g['perspective']==='customer'?0x0:0x1)-(h['perspective']==='customer'?0x0:0x1)),d=a['filter'](g=>g['operable']['length']===0x0&&g['pending_claims']['length']===0x0),e=a['flatMap'](g=>g['pending_claims']['map'](h=>({...h,'progress':g['progress']}))),f=a['length']===0x0?'No\x20in-flight\x20orders\x20found\x20for\x20this\x20account.':a['length']+'\x20in-flight\x20order(s):\x20'+c['length']+'\x20need\x20your\x20action\x20or\x20have\x20claims,\x20'+d['length']+'\x20are\x20waiting\x20on\x20other\x20roles.\x20'+(e['length']>0x0?e['length']+'\x20unclaimed\x20benefit(s)\x20detected.\x20':'')+(c['length']>0x0?'Top\x20priority:\x20'+c[0x0]['summary']:'Nothing\x20requires\x20your\x20action\x20right\x20now.');return{'account':a[0x0]?.['account']??'','orders_analyzed':a['length'],'actionable':c,'waiting':d,'all_pending_claims':e,'unread_messages_total':b??0x0,'summary':f};}function nameResolvesTo(a,b){if(!a)return![];return Array['isArray'](a)?a['includes'](b):a===b;}export function isConsequenceNode(a,b,c){const d=(a??'')['toLowerCase'](),e=c?.[b];if(e?.['some'](g=>!!g&&d['includes'](g['toLowerCase']())))return!![];const f=annotateNodeName(a??'');return b==='completed'?f==='completion':f==='refund'||f==='exception';}function resolveForward(a,b,c,d,e,f){let g='not_available';if(a['permissionIndex']!=null){if(e['has'](a['permissionIndex']))g='permission';}else{if(a['namedOperator']===''){if(d)g='order_holder';}else{if(a['namedOperator']!=null){const l=c['named_accounts']?.[a['namedOperator']];if(nameResolvesTo(l,c['account']))g='named_operator';}}}const h=b,i=describeForward(a['name']??'',h,g,a['permissionIndex'],a['namedOperator']),j=consequenceOf(h,f),k=g==='order_holder'?recommendedCallForOrderHolder({'hasGuard':!!a['guard'],'currentNode':c['current_node']??'','targetNode':h}):recommendedCallForExecutionPath(g,!!a['guard']);return{'name':a['name']??'(unnamed)','to_node':h,'execution_path':g,'permission_index':a['permissionIndex']??undefined,'named_operator':a['namedOperator']??undefined,'guard':a['guard']??undefined,'semantics':i,'consequence':j,'weight':a['weight']??undefined,'recommended_call':k};}function describeForward(a,b,c,d,e){const f=d!=null?'requires\x20permission\x20index\x20'+d:e===''?'executable\x20by\x20the\x20order\x20holder\x20(customer)':'executable\x20by\x20named\x20operator\x20\x27'+e+'\x27',g=c==='not_available'?'You\x20CANNOT\x20execute\x20this':'You\x20CAN\x20execute\x20this';return'\x27'+a+'\x27\x20advances\x20the\x20order\x20to\x20node\x20\x27'+b+'\x27\x20('+f+').\x20'+g+'.';}export function consequenceOf(a,b){if(isConsequenceNode(a,'completed',b))return'Completion\x20path\x20—\x20funds\x20are\x20released\x20to\x20the\x20merchant\x20per\x20the\x20Allocation\x20waterfall;\x20refunds\x20become\x20harder\x20after\x20this\x20point.';if(isConsequenceNode(a,'refunded',b))return'Refund/cancellation\x20path\x20—\x20escrowed\x20funds\x20return\x20to\x20the\x20buyer\x20per\x20the\x20Allocation\x20configuration.';return undefined;}function buildInterestHints(a,b,c,d,e){const f=[],g=a['now']??Date['now'](),h=a['last_progress_at']!=null?(g-a['last_progress_at'])/0x36ee80:undefined;if(b==='customer')c['length']>0x0&&f['push']('Your\x20confirmation\x20is\x20the\x20fund-release\x20trigger:\x20escrowed\x20money\x20stays\x20locked\x20until\x20YOU\x20act\x20—\x20only\x20confirm\x20when\x20the\x20deliverable\x20matches\x20the\x20agreement.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Delivery\x20depends\x20on\x20the\x20merchant-side\x20roles\x20listed\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20Messenger\x20first,\x20then\x20consider\x20dispute\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x18&&f['push']('Order\x20has\x20not\x20advanced\x20for\x20'+Math['round'](h)+'h.\x20Your\x20leverage:\x20compensation_fund\x20(if\x20any)\x20+\x20arbitration\x20+\x20on-chain\x20reputation\x20(dislike)\x20—\x20in\x20that\x20order.');else{if(b==='supplier')c['length']>0x0&&f['push']('Advancing\x20your\x20sub-order\x20NOW\x20unlocks\x20YOUR\x20settlement\x20—\x20upload\x20delivery\x20evidence\x20first\x20to\x20protect\x20your\x20payment\x20claim\x20against\x20the\x20upstream\x20merchant.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Your\x20settlement\x20depends\x20on\x20upstream\x20roles\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20a\x20Messenger\x20nudge\x20first,\x20then\x20arbitration\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x30&&f['push']('Sub-order\x20stalled\x20'+Math['round'](h)+'h:\x20your\x20claim\x20erodes\x20with\x20time\x20—\x20evidence\x20+\x20a\x20Messenger\x20nudge\x20are\x20your\x20cheapest\x20protections.');else{if(b==='collaborator'||b==='merchant'){const i=d['filter'](j=>j['role']['startsWith']('permission\x20index'));c['length']>0x0&&f['push']('Advancing\x20the\x20workflow\x20NOW\x20improves\x20flow\x20efficiency\x20and\x20shortens\x20your\x20fund-settlement\x20cycle;\x20stalled\x20orders\x20degrade\x20your\x20on-chain\x20reputation\x20metrics\x20(dispute\x20rate,\x20stall\x20statistics).');i['length']>0x0&&f['push']('Nodes\x20waiting\x20on\x20YOUR\x20permission\x20indexes\x20are\x20your\x20responsibility\x20surface:\x20prolonged\x20inaction\x20may\x20trigger\x20timeout\x20penalties\x20or\x20disputes\x20recorded\x20permanently\x20on-chain.');e&&c['length']===0x0&&f['push']('Nothing\x20for\x20you\x20to\x20execute\x20at\x20this\x20node\x20—\x20monitor\x20only;\x20avoid\x20unnecessary\x20interference\x20that\x20creates\x20semantic\x20responsibility.');if(b==='merchant'&&a['review_summary']){const {orders_completed:j,reviews_written:k,reward_bound:l}=a['review_summary'];if(j>0x0&&k<j){const m=j-k,n=m/j;n>=0.3&&f['push']('Review\x20coverage\x20is\x20low:\x20'+k+'/'+j+'\x20completed\x20orders\x20carry\x20a\x20structured\x20review\x20('+m+'\x20missing).'+(l?'\x20With\x20a\x20review\x20reward\x20attached,\x20a\x20high\x20missing\x20rate\x20usually\x20means\x20the\x20reward\x20expired,\x20its\x20window\x20is\x20too\x20short,\x20or\x20the\x20reward\x20is\x20hard\x20to\x20discover\x20at\x20quote\x20time\x20—\x20review\x20the\x20reward\x20terms\x20and\x20window.':'\x20Consider\x20whether\x20a\x20review\x20incentive\x20(review_reward\x20mode)\x20or\x20a\x20longer\x20review\x20window\x20fits\x20this\x20service.'));}}}else f['push']('You\x20hold\x20no\x20operative\x20role\x20on\x20this\x20order\x20(neutral).\x20On-chain\x20data\x20remains\x20transparent\x20to\x20you\x20for\x20auditing.');}}return(a['unread_messages']??0x0)>0x0&&f['push'](a['unread_messages']+'\x20unread\x20Messenger\x20message(s)\x20—\x20negotiation\x20evidence\x20(WTS)\x20forms\x20the\x20arbitration\x20record;\x20timely\x20replies\x20protect\x20your\x20position.'),f;}function buildSummary(a,b,c,d,e,f,g,h){const i=c['length']>0x0?c['map'](m=>m['label'])['join'](',\x20'):'no\x20operative\x20role',j=h===''?'(entry,\x20not\x20started)':'\x27'+h+'\x27';if(g)return'Order\x20'+a['progress_address']+'\x20is\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+').\x20Machine\x20workflow\x20data\x20unavailable\x20—\x20fetch\x20the\x20bound\x20Machine\x20to\x20see\x20executable\x20operations.';const k=d['length']>0x0?'you\x20can\x20execute:\x20'+d['map'](m=>'\x27'+m['name']+'\x27→\x27'+m['to_node']+'\x27')['join'](',\x20'):e['length']>0x0?'waiting\x20on\x20'+e['map'](m=>m['role'])['join'](',\x20'):'no\x20pending\x20operations\x20at\x20this\x20node',l=f['length']>0x0?'\x20'+f['length']+'\x20unclaimed\x20benefit(s).':'';return'Order\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+')\x20—\x20'+k+'.'+l;}
@@ -1 +1 @@
1
- import{getDefaultPreferences}from'../customer/user-preferences.js';import{getIndustryPersona,registerIndustryPersonae}from'./pack-personae.js';import{PERSONA_VERSION}from'./types.js';function safePrefs(a){const {budget_range:b,...c}=a;return c;}function industryPrefs(a){return safePrefs(getDefaultPreferences(a));}const SPECS=[{'role':'merchant','industry':'freelance','strategy':['Deliver\x20in\x20milestones\x20and\x20release\x20per\x20milestone\x20(avoid\x20all-or-nothing\x20non-acceptance).','Record\x20WIP\x20hash\x20at\x20each\x20key\x20node\x20as\x20evidence.','Use\x20an\x20accept_guard\x20time\x20gate\x20so\x20non-accepting\x20clients\x20auto-release\x20after\x20the\x20deadline.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20compensation\x20fund','forbid\x20full\x20upfront\x20payment\x20before\x20any\x20delivery']},{'role':'customer','industry':'freelance','strategy':['Pay\x20per\x20milestone,\x20verify\x20each\x20before\x20releasing\x20the\x20next.','Verify\x20WIP\x20hash\x20before\x20accepting\x20a\x20delivery.','Open\x20arbitration\x20if\x20the\x20provider\x20is\x20unresponsive.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20compensation\x20fund','forbid\x20direct\x20payment\x20without\x20escrow']},{'role':'merchant','industry':'rental','strategy':['Record\x20pre/post\x20rental\x20WIP\x20hashes\x20as\x20the\x20damage-claim\x20baseline.','Hold\x20the\x20deposit\x20in\x20a\x20graded\x20allocator\x20(normal\x20return\x20auto-releases).','Keep\x20an\x20evidence\x20chain\x20for\x20any\x20damage\x20claim.'],'requirements':['must\x20have\x20arbitration','damage\x20claims\x20require\x20pre-rental\x20baseline\x20evidence']},{'role':'customer','industry':'rental','strategy':['Record\x20condition\x20evidence\x20(WIP\x20hash)\x20before\x20renting.','Confirm\x20the\x20return\x20only\x20after\x20verifying\x20no\x20damage.','Open\x20arbitration\x20against\x20unfair\x20damage\x20claims.'],'requirements':['must\x20have\x20arbitration','deposit\x20must\x20be\x20refundable\x20(a\x20return\x20path\x20must\x20exist)']},{'role':'merchant','industry':'education','strategy':['Release\x20tuition\x20per\x20lesson\x20(1/N)\x20to\x20structurally\x20prevent\x20run-away\x20disputes.','Keep\x20attendance/completion\x20evidence.','Declare\x20the\x20refund\x20policy\x20up\x20front.'],'requirements':['must\x20have\x20arbitration','tuition\x20must\x20be\x20escrowed\x20(not\x20directly\x20received)']},{'role':'customer','industry':'education','strategy':['Pay\x20per\x20lesson,\x20never\x20full\x20upfront.','Confirm\x20completed\x20lessons\x20before\x20paying.','Request\x20proportional\x20refund\x20if\x20the\x20course\x20is\x20cancelled.'],'requirements':['must\x20have\x20arbitration','forbid\x20one-time\x20full\x20upfront\x20payment']},{'role':'merchant','industry':'travel','strategy':['Model\x20multi-leg\x20trips\x20as\x20a\x20multi-leg\x20machine\x20with\x20a\x20transparent\x20fund\x20waterfall.','Declare\x20the\x20cancellation\x20policy\x20up\x20front.','Separate\x20refundable\x20vs\x20non-refundable\x20legs.'],'requirements':['must\x20have\x20arbitration','funds\x20must\x20be\x20escrowed\x20(conditionally\x20released)']},{'role':'customer','industry':'travel','strategy':['Confirm\x20the\x20cancellation/refund\x20policy\x20before\x20booking.','Watch\x20cross-leg\x20responsibility\x20in\x20multi-leg\x20trips.','Pursue\x20the\x20non-refundable\x20downstream\x20on\x20flight\x20cancellation.'],'requirements':['must\x20have\x20arbitration','cancellation\x20must\x20be\x20refundable\x20(a\x20refund\x20path\x20must\x20exist)']},{'role':'merchant','industry':'subscription','strategy':['Charge\x20each\x20period\x20via\x20charge_guard_signer\x20(explicit\x20user\x20signature).','Keep\x20100%\x20of\x20revenue\x20(no\x20platform\x20cut).','Declare\x20pauses/cancellation\x20explicitly.'],'requirements':['forbid\x20auto-renewal\x20traps\x20(every\x20period\x20must\x20be\x20explicitly\x20signed)']},{'role':'customer','industry':'subscription','strategy':['Confirm\x20authorization\x20before\x20each\x20charge.','Cancel\x20anytime\x20without\x20friction.','Stop\x20charging\x20when\x20the\x20creator\x20pauses.'],'requirements':['forbid\x20auto-renewal\x20(every\x20period\x20must\x20be\x20explicitly\x20signed)','cancellation\x20must\x20be\x20frictionless']},{'role':'merchant','industry':'retail','strategy':['Release\x20funds\x20on\x20confirmed\x20receipt\x20(escrow).','Keep\x20an\x20evidence\x20chain\x20for\x20authenticity\x20disputes.','Declare\x20the\x20return\x20policy\x20up\x20front.'],'requirements':['must\x20have\x20arbitration','funds\x20must\x20be\x20escrowed\x20(released\x20on\x20confirmed\x20receipt)']},{'role':'customer','industry':'retail','strategy':['Verify\x20authenticity\x20before\x20confirming\x20receipt.','Never\x20confirm\x20receipt\x20before\x20the\x20goods\x20arrive.','Open\x20arbitration\x20for\x20counterfeit\x20/\x20not-received.'],'requirements':['must\x20have\x20arbitration','not-received\x20must\x20be\x20refundable']}];function buildDefault(a){const b=a['industry']?[a['industry']]:[],c={'identity':{'self_description':a['role']+'\x20in\x20'+(a['industry']??'any')+'\x20industry'},'preferences':a['industry']?industryPrefs(a['industry']):{}},d={'strategy':a['strategy'],'requirements':a['requirements']};return{'version':PERSONA_VERSION,'scope':'system','role':a['role'],'industries':b,'long_term':c,'current':d,'updated_at':0x0};}const GENERIC_ROLE_SPECS=[{'role':'arbitrator','strategy':['Confirm\x20cases\x20promptly\x20to\x20keep\x20the\x20dispute\x20pipeline\x20moving\x20(efficiency\x20+\x20fee\x20throughput).','Verify\x20all\x20evidence\x20(WTS)\x20before\x20ruling\x20—\x20unverified\x20evidence\x20is\x20not\x20evidence.','Write\x20reasoned,\x20professional\x20feedback\x20—\x20it\x20is\x20permanently\x20public\x20on-chain\x20(reputation).','Reset\x20unclear\x20cases\x20back\x20with\x20clear\x20feedback\x20rather\x20than\x20guessing.'],'requirements':['must\x20verify\x20evidence\x20(WTS)\x20before\x20ruling','forbid\x20ruling\x20without\x20verified\x20evidence']},{'role':'supplier','strategy':['Deliver\x20the\x20sub-order\x20and\x20retain\x20per-tier\x20sub-delivery\x20proof.','Settle\x20independently\x20per\x20verified\x20tier\x20(not\x20bundled\x20with\x20the\x20main\x20order).','Keep\x20an\x20evidence\x20chain\x20for\x20any\x20sub-delivery\x20dispute.'],'requirements':['sub-delivery\x20must\x20be\x20provable\x20(per-tier\x20release\x20guard)','must\x20have\x20independent\x20allocation\x20for\x20sub-order\x20settlement']},{'role':'collaborator','strategy':['Advance\x20only\x20the\x20forwards\x20within\x20your\x20permission\x20scope.','Advance\x20promptly\x20to\x20keep\x20the\x20workflow\x20moving\x20(avoid\x20stall\x20penalties).','Avoid\x20interfering\x20outside\x20your\x20permission\x20scope\x20(creates\x20responsibility\x20without\x20authority).'],'requirements':['only\x20operate\x20authorized\x20forwards\x20(permission\x20index\x20/\x20named\x20operator)','forbid\x20operating\x20outside\x20your\x20permission\x20scope']},{'role':'prospect','strategy':['Verify\x20fund\x20safety\x20(escrow\x20+\x20refund\x20path)\x20before\x20ordering.','Verify\x20delivery\x20trust\x20(WIP\x20hash,\x20machine\x20workflow)\x20before\x20ordering.','Check\x20arbitration\x20availability\x20for\x20recourse\x20before\x20committing.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20refund\x20path']},{'role':'demander','strategy':['Publish\x20demand\x20with\x20explicit\x20scope,\x20award\x20criteria\x20and\x20guard\x20expectations\x20so\x20presentations\x20are\x20comparable.','Keep\x20at\x20least\x20two\x20credible\x20presenters\x20in\x20the\x20field\x20until\x20the\x20award\x20decision.','Score\x20presenters\x20on\x20published\x20weights\x20(trust,\x20price,\x20evidence)\x20rather\x20than\x20rapport.','Pilot\x20high-risk\x20engagements\x20with\x20milestone\x20allocators\x20before\x20scaling.'],'requirements':['award\x20must\x20happen\x20on-chain\x20through\x20the\x20demand\x20flow\x20(no\x20off-platform\x20handshake)','high-risk\x20categories\x20must\x20have\x20arbitration\x20and\x20compensation\x20coverage']}],DEFAULTS=[...SPECS,...GENERIC_ROLE_SPECS]['map'](buildDefault);export const GENERIC_PERSONA={'version':PERSONA_VERSION,'scope':'system','role':'customer','industries':[],'long_term':{'identity':{'self_description':'generic\x20WoWok\x20user'}},'current':{},'updated_at':0x0};function personaToIndustryPersona(a){if(a['industries']['length']===0x0)return null;return{'role':a['role'],'industry':a['industries'][0x0],'long_term':a['long_term'],'current':a['current']};}function industryPersonaToPersona(a){return{'version':PERSONA_VERSION,'scope':'system','role':a['role'],'industries':[a['industry']],'long_term':a['long_term'],'current':a['current'],'updated_at':0x0};}const builtinPersonaeByIndustry=new Map();for(const p of DEFAULTS){const ip=personaToIndustryPersona(p);if(!ip)continue;const list=builtinPersonaeByIndustry['get'](ip['industry'])??[];list['push'](ip),builtinPersonaeByIndustry['set'](ip['industry'],list);}for(const [industry,personae]of builtinPersonaeByIndustry){registerIndustryPersonae(industry,personae);}export function getIndustryDefault(a,b){const c=getIndustryPersona(b,a);if(c)return industryPersonaToPersona(c);const d=DEFAULTS['find'](e=>e['role']===a&&e['industries']['length']===0x0);if(d)return{...d};return{...GENERIC_PERSONA,'role':a};}export function listIndustryDefaults(){return DEFAULTS['map'](a=>({...a}));}
1
+ import{getDefaultPreferences}from'../customer/user-preferences.js';import{getIndustryPersona,registerIndustryPersonae}from'./pack-personae.js';import{PERSONA_VERSION}from'./types.js';function safePrefs(a){const {budget_range:b,...c}=a;return c;}function industryPrefs(a){return safePrefs(getDefaultPreferences(a));}const SPECS=[{'role':'merchant','industry':'freelance','strategy':['Deliver\x20in\x20milestones\x20and\x20release\x20per\x20milestone\x20(avoid\x20all-or-nothing\x20non-acceptance).','Record\x20WIP\x20hash\x20at\x20each\x20key\x20node\x20as\x20evidence.','Use\x20an\x20accept_guard\x20time\x20gate\x20so\x20non-accepting\x20clients\x20auto-release\x20after\x20the\x20deadline.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20compensation\x20fund','forbid\x20full\x20upfront\x20payment\x20before\x20any\x20delivery']},{'role':'customer','industry':'freelance','strategy':['Pay\x20per\x20milestone,\x20verify\x20each\x20before\x20releasing\x20the\x20next.','Verify\x20WIP\x20hash\x20before\x20accepting\x20a\x20delivery.','Open\x20arbitration\x20if\x20the\x20provider\x20is\x20unresponsive.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20compensation\x20fund','forbid\x20direct\x20payment\x20without\x20escrow']},{'role':'merchant','industry':'rental','strategy':['Record\x20pre/post\x20rental\x20WIP\x20hashes\x20as\x20the\x20damage-claim\x20baseline.','Hold\x20the\x20deposit\x20in\x20a\x20graded\x20allocator\x20(normal\x20return\x20auto-releases).','Keep\x20an\x20evidence\x20chain\x20for\x20any\x20damage\x20claim.'],'requirements':['must\x20have\x20arbitration','damage\x20claims\x20require\x20pre-rental\x20baseline\x20evidence']},{'role':'customer','industry':'rental','strategy':['Record\x20condition\x20evidence\x20(WIP\x20hash)\x20before\x20renting.','Confirm\x20the\x20return\x20only\x20after\x20verifying\x20no\x20damage.','Open\x20arbitration\x20against\x20unfair\x20damage\x20claims.'],'requirements':['must\x20have\x20arbitration','deposit\x20must\x20be\x20refundable\x20(a\x20return\x20path\x20must\x20exist)']},{'role':'merchant','industry':'education','strategy':['Release\x20tuition\x20per\x20lesson\x20(1/N)\x20to\x20structurally\x20prevent\x20run-away\x20disputes.','Keep\x20attendance/completion\x20evidence.','Declare\x20the\x20refund\x20policy\x20up\x20front.'],'requirements':['must\x20have\x20arbitration','tuition\x20must\x20be\x20escrowed\x20(not\x20directly\x20received)']},{'role':'customer','industry':'education','strategy':['Pay\x20per\x20lesson,\x20never\x20full\x20upfront.','Confirm\x20completed\x20lessons\x20before\x20paying.','Request\x20proportional\x20refund\x20if\x20the\x20course\x20is\x20cancelled.'],'requirements':['must\x20have\x20arbitration','forbid\x20one-time\x20full\x20upfront\x20payment']},{'role':'merchant','industry':'travel','strategy':['Model\x20multi-leg\x20trips\x20as\x20a\x20multi-leg\x20machine\x20with\x20a\x20transparent\x20fund\x20waterfall.','Declare\x20the\x20cancellation\x20policy\x20up\x20front.','Separate\x20refundable\x20vs\x20non-refundable\x20legs.'],'requirements':['must\x20have\x20arbitration','funds\x20must\x20be\x20escrowed\x20(conditionally\x20released)']},{'role':'customer','industry':'travel','strategy':['Confirm\x20the\x20cancellation/refund\x20policy\x20before\x20booking.','Watch\x20cross-leg\x20responsibility\x20in\x20multi-leg\x20trips.','Pursue\x20the\x20non-refundable\x20downstream\x20on\x20flight\x20cancellation.'],'requirements':['must\x20have\x20arbitration','cancellation\x20must\x20be\x20refundable\x20(a\x20refund\x20path\x20must\x20exist)']},{'role':'merchant','industry':'subscription','strategy':['Charge\x20each\x20period\x20via\x20charge_guard_signer\x20(explicit\x20user\x20signature).','Keep\x20100%\x20of\x20revenue\x20(no\x20platform\x20cut).','Declare\x20pauses/cancellation\x20explicitly.'],'requirements':['forbid\x20auto-renewal\x20traps\x20(every\x20period\x20must\x20be\x20explicitly\x20signed)']},{'role':'customer','industry':'subscription','strategy':['Confirm\x20authorization\x20before\x20each\x20charge.','Cancel\x20anytime\x20without\x20friction.','Stop\x20charging\x20when\x20the\x20creator\x20pauses.'],'requirements':['forbid\x20auto-renewal\x20(every\x20period\x20must\x20be\x20explicitly\x20signed)','cancellation\x20must\x20be\x20frictionless']},{'role':'merchant','industry':'retail','strategy':['Release\x20funds\x20on\x20confirmed\x20receipt\x20(escrow).','Keep\x20an\x20evidence\x20chain\x20for\x20authenticity\x20disputes.','Declare\x20the\x20return\x20policy\x20up\x20front.'],'requirements':['must\x20have\x20arbitration','funds\x20must\x20be\x20escrowed\x20(released\x20on\x20confirmed\x20receipt)']},{'role':'customer','industry':'retail','strategy':['Verify\x20authenticity\x20before\x20confirming\x20receipt.','Never\x20confirm\x20receipt\x20before\x20the\x20goods\x20arrive.','Open\x20arbitration\x20for\x20counterfeit\x20/\x20not-received.'],'requirements':['must\x20have\x20arbitration','not-received\x20must\x20be\x20refundable']},{'role':'merchant','industry':'licensing','strategy':['Anchor\x20the\x20license\x20terms\x20(territory,\x20term,\x20media,\x20caps)\x20as\x20a\x20WIP\x20hash\x20before\x20granting.','Split\x20proceeds\x20via\x20a\x20frozen\x20Allocation\x20Rate\x20plan\x20every\x20rights-holder\x20can\x20audit.','Gate\x20settlement\x20behind\x20an\x20inspection-window\x20time-lock\x20Guard;\x20state\x20plainly\x20that\x20a\x20usage\x20cap\x20is\x20attested,\x20not\x20metered.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20compensation\x20fund','forbid\x20presenting\x20an\x20off-chain\x20sale\x20as\x20an\x20on-chain\x20auction']},{'role':'customer','industry':'licensing','strategy':['Read\x20the\x20frozen\x20split\x20and\x20the\x20terms\x20hash\x20before\x20committing.','Verify\x20the\x20granted\x20scope\x20during\x20the\x20inspection\x20window\x20before\x20release.','Open\x20arbitration\x20for\x20scope/territory/royalty-reporting\x20disputes.'],'requirements':['must\x20have\x20arbitration','the\x20granted\x20rights\x20must\x20be\x20hash-anchored\x20(provable,\x20not\x20prose)','funds\x20must\x20be\x20escrowed\x20until\x20the\x20inspection\x20window\x20passes']},{'role':'merchant','industry':'crowdfunding','strategy':['Anchor\x20the\x20campaign\x20terms,\x20funding\x20goal\x20and\x20deadline\x20as\x20a\x20WIP\x20hash\x20before\x20launch.','Escrow\x20each\x20contribution\x20in\x20its\x20OWN\x20Allocation\x20bound\x20to\x20the\x20funder\x27s\x20Order\x20—\x20never\x20pool;\x20settle\x20with\x20a\x20two-leg\x20release/refund\x20Guard\x20gated\x20on\x20the\x20aggregate\x20threshold\x20AND\x20the\x20deadline.','Bind\x20every\x20contribution-row\x20write\x20to\x20its\x20funder\x20(order.owner\x20==\x20Signer);\x20state\x20plainly\x20that\x20the\x20threshold\x20is\x20an\x20aggregate\x20read,\x20not\x20a\x20chain-verified\x20total-custody\x20proof,\x20and\x20never\x20promise\x20investment\x20returns.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20compensation\x20fund','forbid\x20presenting\x20a\x20flexible\x20keep-it-all\x20campaign\x20as\x20all-or-nothing','forbid\x20promising\x20investment\x20returns\x20or\x20token-price\x20appreciation']},{'role':'customer','industry':'crowdfunding','strategy':['Read\x20the\x20live\x20aggregate\x20and\x20the\x20funding\x20goal\x20before\x20contributing.','Confirm\x20the\x20refund\x20posture:\x20all-or-nothing\x20refunds\x20automatically\x20at\x20deadline\x20if\x20the\x20goal\x20is\x20missed;\x20flexible\x20keep-it-all\x20does\x20not\x20refund.','Open\x20arbitration\x20for\x20non-delivery\x20after\x20a\x20successful\x20raise.'],'requirements':['must\x20have\x20arbitration','my\x20contribution\x20must\x20be\x20escrowed\x20unpooled\x20and\x20refundable\x20to\x20me\x20on\x20a\x20missed\x20threshold','the\x20funding\x20goal\x20and\x20deadline\x20must\x20be\x20hash-anchored\x20(provable,\x20not\x20prose)']}];function buildDefault(a){const b=a['industry']?[a['industry']]:[],c={'identity':{'self_description':a['role']+'\x20in\x20'+(a['industry']??'any')+'\x20industry'},'preferences':a['industry']?industryPrefs(a['industry']):{}},d={'strategy':a['strategy'],'requirements':a['requirements']};return{'version':PERSONA_VERSION,'scope':'system','role':a['role'],'industries':b,'long_term':c,'current':d,'updated_at':0x0};}const GENERIC_ROLE_SPECS=[{'role':'arbitrator','strategy':['Confirm\x20cases\x20promptly\x20to\x20keep\x20the\x20dispute\x20pipeline\x20moving\x20(efficiency\x20+\x20fee\x20throughput).','Verify\x20all\x20evidence\x20(WTS)\x20before\x20ruling\x20—\x20unverified\x20evidence\x20is\x20not\x20evidence.','Write\x20reasoned,\x20professional\x20feedback\x20—\x20it\x20is\x20permanently\x20public\x20on-chain\x20(reputation).','Reset\x20unclear\x20cases\x20back\x20with\x20clear\x20feedback\x20rather\x20than\x20guessing.'],'requirements':['must\x20verify\x20evidence\x20(WTS)\x20before\x20ruling','forbid\x20ruling\x20without\x20verified\x20evidence']},{'role':'supplier','strategy':['Deliver\x20the\x20sub-order\x20and\x20retain\x20per-tier\x20sub-delivery\x20proof.','Settle\x20independently\x20per\x20verified\x20tier\x20(not\x20bundled\x20with\x20the\x20main\x20order).','Keep\x20an\x20evidence\x20chain\x20for\x20any\x20sub-delivery\x20dispute.'],'requirements':['sub-delivery\x20must\x20be\x20provable\x20(per-tier\x20release\x20guard)','must\x20have\x20independent\x20allocation\x20for\x20sub-order\x20settlement']},{'role':'collaborator','strategy':['Advance\x20only\x20the\x20forwards\x20within\x20your\x20permission\x20scope.','Advance\x20promptly\x20to\x20keep\x20the\x20workflow\x20moving\x20(avoid\x20stall\x20penalties).','Avoid\x20interfering\x20outside\x20your\x20permission\x20scope\x20(creates\x20responsibility\x20without\x20authority).'],'requirements':['only\x20operate\x20authorized\x20forwards\x20(permission\x20index\x20/\x20named\x20operator)','forbid\x20operating\x20outside\x20your\x20permission\x20scope']},{'role':'prospect','strategy':['Verify\x20fund\x20safety\x20(escrow\x20+\x20refund\x20path)\x20before\x20ordering.','Verify\x20delivery\x20trust\x20(WIP\x20hash,\x20machine\x20workflow)\x20before\x20ordering.','Check\x20arbitration\x20availability\x20for\x20recourse\x20before\x20committing.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20refund\x20path']},{'role':'demander','strategy':['Publish\x20demand\x20with\x20explicit\x20scope,\x20award\x20criteria\x20and\x20guard\x20expectations\x20so\x20presentations\x20are\x20comparable.','Keep\x20at\x20least\x20two\x20credible\x20presenters\x20in\x20the\x20field\x20until\x20the\x20award\x20decision.','Score\x20presenters\x20on\x20published\x20weights\x20(trust,\x20price,\x20evidence)\x20rather\x20than\x20rapport.','Pilot\x20high-risk\x20engagements\x20with\x20milestone\x20allocators\x20before\x20scaling.'],'requirements':['award\x20must\x20happen\x20on-chain\x20through\x20the\x20demand\x20flow\x20(no\x20off-platform\x20handshake)','high-risk\x20categories\x20must\x20have\x20arbitration\x20and\x20compensation\x20coverage']}],DEFAULTS=[...SPECS,...GENERIC_ROLE_SPECS]['map'](buildDefault);export const GENERIC_PERSONA={'version':PERSONA_VERSION,'scope':'system','role':'customer','industries':[],'long_term':{'identity':{'self_description':'generic\x20WoWok\x20user'}},'current':{},'updated_at':0x0};function personaToIndustryPersona(a){if(a['industries']['length']===0x0)return null;return{'role':a['role'],'industry':a['industries'][0x0],'long_term':a['long_term'],'current':a['current']};}function industryPersonaToPersona(a){return{'version':PERSONA_VERSION,'scope':'system','role':a['role'],'industries':[a['industry']],'long_term':a['long_term'],'current':a['current'],'updated_at':0x0};}const builtinPersonaeByIndustry=new Map();for(const p of DEFAULTS){const ip=personaToIndustryPersona(p);if(!ip)continue;const list=builtinPersonaeByIndustry['get'](ip['industry'])??[];list['push'](ip),builtinPersonaeByIndustry['set'](ip['industry'],list);}for(const [industry,personae]of builtinPersonaeByIndustry){registerIndustryPersonae(industry,personae);}export function getIndustryDefault(a,b){const c=getIndustryPersona(b,a);if(c)return industryPersonaToPersona(c);const d=DEFAULTS['find'](e=>e['role']===a&&e['industries']['length']===0x0);if(d)return{...d};return{...GENERIC_PERSONA,'role':a};}export function listIndustryDefaults(){return DEFAULTS['map'](a=>({...a}));}
@@ -1 +1 @@
1
- import{getEffectivePersona}from'./index.js';import{INTENT_PRESETS,isTopologyIntent,normalizeTopologyFocusPref}from'../graph/onchain/strategy.js';export const ROLE_TOPOLOGY_DEFAULTS={'customer':{'intents':['order_health','counterparty'],'rationale':'track\x20own\x20orders\x20to\x20completion\x20and\x20know\x20who\x20is\x20on\x20the\x20other\x20side'},'prospect':{'intents':['counterparty','reputation','fund_flow'],'rationale':'pre-order\x20due\x20diligence:\x20seller\x20credibility,\x20fund\x20safety,\x20social\x20proof'},'merchant':{'intents':['order_health','supply_chain'],'rationale':'track\x20incoming\x20orders\x20and\x20the\x20settlement\x20waterfall\x20of\x20each'},'supplier':{'intents':['supply_chain','workflow'],'rationale':'sub-order\x20settlement\x20structure\x20and\x20the\x20process\x20it\x20hangs\x20on'},'collaborator':{'intents':['workflow','permission'],'rationale':'which\x20forwards\x20exist\x20and\x20what\x20is\x20within\x20own\x20permission\x20scope'},'arbitrator':{'intents':['arbitration','reputation'],'rationale':'cases\x20at\x20hand\x20plus\x20the\x20parties\x27\x20track\x20record'},'demander':{'intents':['demand_match','counterparty'],'rationale':'evaluate\x20presenters\x20against\x20the\x20demand\x20and\x20know\x20who\x20they\x20are'}};export const INDUSTRY_TOPOLOGY_DEFAULTS={'freelance':{'label':'freelance','familyDepths':{'W':0x4,'M':0x3},'tableEdges':['machine.node']},'rental':{'label':'rental','familyDepths':{'M':0x4,'W':0x2}},'education':{'label':'education','familyDepths':{'W':0x4,'M':0x2},'tableEdges':['machine.node']},'travel':{'label':'travel','familyDepths':{'W':0x4,'M':0x3},'tableEdges':['machine.node']},'subscription':{'label':'subscription','familyDepths':{'M':0x3,'W':0x2}},'retail':{'label':'retail','familyDepths':{'M':0x3}}};export function getIndustryTopologyTemplate(a){if(!a)return undefined;return INDUSTRY_TOPOLOGY_DEFAULTS[a];}export async function resolvePersonaTopologyFocus(a,b,c){try{const d=await getEffectivePersona(a,b,c),e=c??d['role'],f=d['layer']['profiles']?.[e]?.['topology'];if(f===undefined)return undefined;return normalizeTopologyFocusPref(f)??undefined;}catch{return undefined;}}export async function resolveTopologyContext(a){const b=a['role']?ROLE_TOPOLOGY_DEFAULTS[a['role']]:undefined,c=getIndustryTopologyTemplate(a['industry']);let d,e,f,g;try{const h=await getEffectivePersona(a['account'],a['industry'],a['role']),i=a['role']??h['role'];f=i,g=h['layer']['evaluation'];const j=h['layer']['profiles']?.[i]?.['topology'];if(j!==undefined)d=normalizeTopologyFocusPref(j)??undefined;const k=h['layer']['preferences']?.['risk_appetite'],l=k==='conservative'||k==='balanced'||k==='aggressive'?k:undefined,m=h['layer']['requirements'];(l!=null||(m?.['length']??0x0)>0x0)&&(e={...l!=null?{'risk_appetite':l}:{},...m?.['length']?{'requirements':m}:{}});}catch{}return{'roleDefault':b,'industryTemplate':c,'personaPref':d,'drive':e,...f?{'personaRole':f}:{},...g?{'evaluation':g}:{}};}export function describeIntents(){return Object['entries'](INTENT_PRESETS)['map'](([a,b])=>{const c=b['families']?'\x20families\x20'+b['families']['join']('/'):'',d=b['familyDepths']?'\x20depths\x20'+Object['entries'](b['familyDepths'])['map'](([e,g])=>e+'≤'+g)['join']('\x20'):'';return a+':\x20'+b['description']+c+d;});}export function assertIntent(a){if(!isTopologyIntent(a))throw new Error('unknown\x20topology\x20intent\x20\x27'+a+'\x27\x20(valid:\x20'+Object['keys'](INTENT_PRESETS)['join'](',\x20')+')');return a;}
1
+ import{getEffectivePersona}from'./index.js';import{INTENT_PRESETS,isTopologyIntent,normalizeTopologyFocusPref}from'../graph/onchain/strategy.js';export const ROLE_TOPOLOGY_DEFAULTS={'customer':{'intents':['order_health','counterparty'],'rationale':'track\x20own\x20orders\x20to\x20completion\x20and\x20know\x20who\x20is\x20on\x20the\x20other\x20side'},'prospect':{'intents':['counterparty','reputation','fund_flow'],'rationale':'pre-order\x20due\x20diligence:\x20seller\x20credibility,\x20fund\x20safety,\x20social\x20proof'},'merchant':{'intents':['order_health','supply_chain'],'rationale':'track\x20incoming\x20orders\x20and\x20the\x20settlement\x20waterfall\x20of\x20each'},'supplier':{'intents':['supply_chain','workflow'],'rationale':'sub-order\x20settlement\x20structure\x20and\x20the\x20process\x20it\x20hangs\x20on'},'collaborator':{'intents':['workflow','permission'],'rationale':'which\x20forwards\x20exist\x20and\x20what\x20is\x20within\x20own\x20permission\x20scope'},'arbitrator':{'intents':['arbitration','reputation'],'rationale':'cases\x20at\x20hand\x20plus\x20the\x20parties\x27\x20track\x20record'},'demander':{'intents':['demand_match','counterparty'],'rationale':'evaluate\x20presenters\x20against\x20the\x20demand\x20and\x20know\x20who\x20they\x20are'}};export const INDUSTRY_TOPOLOGY_DEFAULTS={'freelance':{'label':'freelance','familyDepths':{'W':0x4,'M':0x3},'tableEdges':['machine.node']},'rental':{'label':'rental','familyDepths':{'M':0x4,'W':0x2}},'education':{'label':'education','familyDepths':{'W':0x4,'M':0x2},'tableEdges':['machine.node']},'travel':{'label':'travel','familyDepths':{'W':0x4,'M':0x3},'tableEdges':['machine.node']},'subscription':{'label':'subscription','familyDepths':{'M':0x3,'W':0x2}},'retail':{'label':'retail','familyDepths':{'M':0x3}},'licensing':{'label':'licensing','familyDepths':{'M':0x4,'W':0x2}},'crowdfunding':{'label':'crowdfunding','familyDepths':{'M':0x4,'W':0x2}}};export function getIndustryTopologyTemplate(a){if(!a)return undefined;return INDUSTRY_TOPOLOGY_DEFAULTS[a];}export async function resolvePersonaTopologyFocus(a,b,c){try{const d=await getEffectivePersona(a,b,c),e=c??d['role'],f=d['layer']['profiles']?.[e]?.['topology'];if(f===undefined)return undefined;return normalizeTopologyFocusPref(f)??undefined;}catch{return undefined;}}export async function resolveTopologyContext(a){const b=a['role']?ROLE_TOPOLOGY_DEFAULTS[a['role']]:undefined,c=getIndustryTopologyTemplate(a['industry']);let d,e,f,g;try{const h=await getEffectivePersona(a['account'],a['industry'],a['role']),i=a['role']??h['role'];f=i,g=h['layer']['evaluation'];const j=h['layer']['profiles']?.[i]?.['topology'];if(j!==undefined)d=normalizeTopologyFocusPref(j)??undefined;const k=h['layer']['preferences']?.['risk_appetite'],l=k==='conservative'||k==='balanced'||k==='aggressive'?k:undefined,m=h['layer']['requirements'];(l!=null||(m?.['length']??0x0)>0x0)&&(e={...l!=null?{'risk_appetite':l}:{},...m?.['length']?{'requirements':m}:{}});}catch{}return{'roleDefault':b,'industryTemplate':c,'personaPref':d,'drive':e,...f?{'personaRole':f}:{},...g?{'evaluation':g}:{}};}export function describeIntents(){return Object['entries'](INTENT_PRESETS)['map'](([a,b])=>{const c=b['families']?'\x20families\x20'+b['families']['join']('/'):'',d=b['familyDepths']?'\x20depths\x20'+Object['entries'](b['familyDepths'])['map'](([e,g])=>e+'≤'+g)['join']('\x20'):'';return a+':\x20'+b['description']+c+d;});}export function assertIntent(a){if(!isTopologyIntent(a))throw new Error('unknown\x20topology\x20intent\x20\x27'+a+'\x27\x20(valid:\x20'+Object['keys'](INTENT_PRESETS)['join'](',\x20')+')');return a;}