@wowok/agent-mcp 3.0.4 → 3.0.6

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 (305) hide show
  1. package/README.md +25 -20
  2. package/dist/customer/account-events.js +1 -1
  3. package/dist/evaluation/path-reasoning.d.ts +4 -2
  4. package/dist/evaluation/path-reasoning.js +1 -1
  5. package/dist/extensions/constraint-registry.d.ts +2 -2
  6. package/dist/extensions/constraint-registry.js +1 -1
  7. package/dist/extensions/custom-registry-file.d.ts +22 -0
  8. package/dist/extensions/custom-registry-file.js +1 -0
  9. package/dist/extensions/index.d.ts +2 -1
  10. package/dist/extensions/index.js +1 -1
  11. package/dist/extensions/industry-pack.d.ts +7 -0
  12. package/dist/extensions/industry-pack.js +1 -1
  13. package/dist/extensions/metric-registry.d.ts +2 -2
  14. package/dist/extensions/metric-registry.js +1 -1
  15. package/dist/extensions/modes.js +1 -1
  16. package/dist/extensions/registry.d.ts +2 -2
  17. package/dist/extensions/registry.js +1 -1
  18. package/dist/extensions/types.d.ts +4 -0
  19. package/dist/goal/GoalEngine.d.ts +13 -1
  20. package/dist/goal/GoalEngine.js +1 -1
  21. package/dist/goal/next-steps.d.ts +12 -0
  22. package/dist/goal/next-steps.js +1 -0
  23. package/dist/goal/pursue.d.ts +18 -0
  24. package/dist/goal/pursue.js +1 -0
  25. package/dist/goal/types.d.ts +72 -0
  26. package/dist/goal/types.js +1 -1
  27. package/dist/graph/onchain/analyze.d.ts +44 -0
  28. package/dist/graph/onchain/analyze.js +1 -0
  29. package/dist/graph/onchain/analyze.spec.d.ts +1 -0
  30. package/dist/graph/onchain/analyze.spec.js +1 -0
  31. package/dist/graph/onchain/anti-cheat.d.ts +39 -0
  32. package/dist/graph/onchain/anti-cheat.js +1 -0
  33. package/dist/graph/onchain/anti-cheat.spec.d.ts +1 -0
  34. package/dist/graph/onchain/anti-cheat.spec.js +1 -0
  35. package/dist/graph/onchain/dataplane.d.ts +44 -0
  36. package/dist/graph/onchain/dataplane.js +1 -0
  37. package/dist/graph/onchain/edge-schema.d.ts +60 -0
  38. package/dist/graph/onchain/edge-schema.js +1 -0
  39. package/dist/graph/onchain/expand.d.ts +4 -0
  40. package/dist/graph/onchain/expand.js +1 -0
  41. package/dist/graph/onchain/extract.d.ts +21 -0
  42. package/dist/graph/onchain/extract.js +1 -0
  43. package/dist/graph/onchain/index.d.ts +17 -0
  44. package/dist/graph/onchain/index.js +1 -0
  45. package/dist/graph/onchain/interest.d.ts +10 -0
  46. package/dist/graph/onchain/interest.js +1 -0
  47. package/dist/graph/onchain/interest.spec.d.ts +1 -0
  48. package/dist/graph/onchain/interest.spec.js +1 -0
  49. package/dist/graph/onchain/onchain.spec.d.ts +1 -0
  50. package/dist/graph/onchain/onchain.spec.js +1 -0
  51. package/dist/graph/onchain/order-status.d.ts +53 -0
  52. package/dist/graph/onchain/order-status.js +1 -0
  53. package/dist/graph/onchain/project-relationship.d.ts +3 -0
  54. package/dist/graph/onchain/project-relationship.js +1 -0
  55. package/dist/graph/onchain/sdk-batch.d.ts +123 -0
  56. package/dist/graph/onchain/sdk-batch.js +1 -0
  57. package/dist/graph/onchain/sdk-dataplane.d.ts +43 -0
  58. package/dist/graph/onchain/sdk-dataplane.js +1 -0
  59. package/dist/graph/onchain/strategy.d.ts +54 -0
  60. package/dist/graph/onchain/strategy.js +1 -0
  61. package/dist/graph/onchain/strategy.spec.d.ts +1 -0
  62. package/dist/graph/onchain/strategy.spec.js +1 -0
  63. package/dist/graph/onchain/types.d.ts +238 -0
  64. package/dist/graph/onchain/types.js +1 -0
  65. package/dist/graph/onchain/viewport.d.ts +5 -0
  66. package/dist/graph/onchain/viewport.js +1 -0
  67. package/dist/harness/recover.js +1 -1
  68. package/dist/index.js +1 -1
  69. package/dist/intent/enrich.js +1 -1
  70. package/dist/keeper/detectors.d.ts +1 -1
  71. package/dist/keeper/detectors.js +1 -1
  72. package/dist/knowledge/account-marks.js +1 -1
  73. package/dist/knowledge/allocation-risk.js +1 -1
  74. package/dist/knowledge/allocation-templates.js +1 -1
  75. package/dist/knowledge/anti-cheat.d.ts +2 -37
  76. package/dist/knowledge/anti-cheat.js +1 -1
  77. package/dist/knowledge/contract-invariants.js +1 -1
  78. package/dist/knowledge/getting-started.d.ts +37 -0
  79. package/dist/knowledge/getting-started.js +1 -0
  80. package/dist/knowledge/goal-completion.d.ts +12 -0
  81. package/dist/knowledge/goal-completion.js +1 -1
  82. package/dist/knowledge/guard-render.d.ts +1 -0
  83. package/dist/knowledge/guard-render.js +1 -1
  84. package/dist/knowledge/guard-risk.js +1 -1
  85. package/dist/knowledge/guard-submission-brief.d.ts +83 -0
  86. package/dist/knowledge/guard-submission-brief.js +1 -0
  87. package/dist/knowledge/guard-submission-prompt.d.ts +13 -0
  88. package/dist/knowledge/guard-submission-prompt.js +1 -1
  89. package/dist/knowledge/index.d.ts +10 -4
  90. package/dist/knowledge/index.js +1 -1
  91. package/dist/knowledge/industry-registry.js +1 -1
  92. package/dist/knowledge/industry-strategy.d.ts +91 -0
  93. package/dist/knowledge/industry-strategy.js +1 -0
  94. package/dist/knowledge/jsonrpc-enum.js +1 -1
  95. package/dist/knowledge/market-metrics.d.ts +14 -3
  96. package/dist/knowledge/market-metrics.js +1 -1
  97. package/dist/knowledge/migration-preflight.js +1 -1
  98. package/dist/knowledge/operation-dictionary.d.ts +1 -1
  99. package/dist/knowledge/payment-tracker.d.ts +63 -0
  100. package/dist/knowledge/payment-tracker.js +1 -0
  101. package/dist/knowledge/recipient-constraint.d.ts +160 -0
  102. package/dist/knowledge/recipient-constraint.js +1 -0
  103. package/dist/knowledge/safety-rules.d.ts +1 -1
  104. package/dist/knowledge/safety-rules.js +1 -1
  105. package/dist/knowledge/scenario-topology.d.ts +6 -1
  106. package/dist/knowledge/scenario-topology.js +1 -1
  107. package/dist/knowledge/service-risk-node.d.ts +3 -0
  108. package/dist/knowledge/service-risk-node.js +1 -0
  109. package/dist/knowledge/service-risk.d.ts +2 -0
  110. package/dist/knowledge/service-risk.js +1 -1
  111. package/dist/knowledge/service-templates.d.ts +2 -0
  112. package/dist/knowledge/service-templates.js +1 -1
  113. package/dist/knowledge/strategy-manuals.d.ts +17 -0
  114. package/dist/knowledge/strategy-manuals.js +1 -0
  115. package/dist/knowledge/supply-chain.d.ts +3 -1
  116. package/dist/knowledge/supply-chain.js +1 -1
  117. package/dist/knowledge/template-registry.js +1 -1
  118. package/dist/knowledge/tools-reference.js +1 -1
  119. package/dist/knowledge/workflow-guidance.d.ts +3 -118
  120. package/dist/knowledge/workflow-guidance.js +1 -1
  121. package/dist/knowledge/workspace-lists.d.ts +4 -0
  122. package/dist/knowledge/workspace-lists.js +1 -1
  123. package/dist/monitor/MonitorLoop.js +1 -1
  124. package/dist/monitor/ScopeResolver.js +1 -1
  125. package/dist/participation/arbitrator-interest.d.ts +2 -0
  126. package/dist/participation/arbitrator-interest.js +1 -1
  127. package/dist/participation/collaborator-interest.d.ts +2 -0
  128. package/dist/participation/collaborator-interest.js +1 -1
  129. package/dist/participation/customer-interest.d.ts +2 -0
  130. package/dist/participation/customer-interest.js +1 -1
  131. package/dist/participation/merchant-interest.d.ts +2 -0
  132. package/dist/participation/merchant-interest.js +1 -1
  133. package/dist/participation/radar-core.d.ts +15 -15
  134. package/dist/participation/radar-core.js +1 -1
  135. package/dist/participation/supplier-interest.d.ts +2 -0
  136. package/dist/participation/supplier-interest.js +1 -1
  137. package/dist/persona/analyzer.d.ts +2 -1
  138. package/dist/persona/bridge.d.ts +5 -1
  139. package/dist/persona/bridge.js +1 -1
  140. package/dist/persona/defaults.js +1 -1
  141. package/dist/persona/distill-goal.d.ts +7 -1
  142. package/dist/persona/distill-goal.js +1 -1
  143. package/dist/persona/index.d.ts +13 -3
  144. package/dist/persona/index.js +1 -1
  145. package/dist/persona/model.d.ts +12 -2
  146. package/dist/persona/model.js +1 -1
  147. package/dist/persona/overrides.d.ts +1 -0
  148. package/dist/persona/overrides.js +1 -1
  149. package/dist/persona/topology-focus.d.ts +29 -0
  150. package/dist/persona/topology-focus.js +1 -0
  151. package/dist/persona/types.d.ts +81 -0
  152. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  153. package/dist/playbooks/service-build/context-assembly.js +1 -1
  154. package/dist/playbooks/service-build/machine-nodes.js +1 -1
  155. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  156. package/dist/playbooks/service-build/merchant-guide.d.ts +7 -0
  157. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  158. package/dist/playbooks/service-build/object-panorama.js +1 -1
  159. package/dist/playbooks/service-build/participation-radar.js +1 -1
  160. package/dist/playbooks/service-build/pipeline-actions.d.ts +2 -2
  161. package/dist/playbooks/service-build/pipeline-actions.js +1 -1
  162. package/dist/playbooks/service-build/relationship-profile.d.ts +1 -0
  163. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  164. package/dist/playbooks/service-build/risk-aggregator.js +1 -1
  165. package/dist/playbooks/service-build/service-panorama.d.ts +4 -0
  166. package/dist/playbooks/service-build/service-panorama.js +1 -1
  167. package/dist/playbooks/service-build/topology-query.d.ts +14 -0
  168. package/dist/playbooks/service-build/topology-query.js +1 -0
  169. package/dist/relationship/derivation.js +1 -1
  170. package/dist/role/index.d.ts +1 -0
  171. package/dist/role/index.js +1 -1
  172. package/dist/role/profiles.d.ts +26 -0
  173. package/dist/role/profiles.js +1 -0
  174. package/dist/safety/confirm-gate.d.ts +4 -1
  175. package/dist/safety/confirm-gate.js +1 -1
  176. package/dist/schema/call/allocation.d.ts +6 -6
  177. package/dist/schema/call/allocation.js +1 -1
  178. package/dist/schema/call/base.js +1 -1
  179. package/dist/schema/call/bridge.d.ts +1 -1
  180. package/dist/schema/call/guard.d.ts +20 -20
  181. package/dist/schema/call/repository.js +1 -1
  182. package/dist/schema/call/semantic.js +1 -1
  183. package/dist/schema/call/service.d.ts +4 -4
  184. package/dist/schema/call/service.js +1 -1
  185. package/dist/schema/common/index.js +1 -1
  186. package/dist/schema/employee/index.d.ts +7 -7
  187. package/dist/schema/evaluation/index.d.ts +26 -13
  188. package/dist/schema/evaluation/index.js +1 -1
  189. package/dist/schema/goal/index.d.ts +53 -17
  190. package/dist/schema/goal/index.js +1 -1
  191. package/dist/schema/goal/planning.d.ts +7 -7
  192. package/dist/schema/index.d.ts +1 -0
  193. package/dist/schema/index.js +1 -1
  194. package/dist/schema/industry-pack/index.d.ts +13 -6
  195. package/dist/schema/industry-pack/index.js +1 -1
  196. package/dist/schema/industry-pack/modes.d.ts +6 -6
  197. package/dist/schema/intent-radar/index.d.ts +16 -16
  198. package/dist/schema/local/index.d.ts +8 -4
  199. package/dist/schema/local/index.js +1 -1
  200. package/dist/schema/messenger/index.d.ts +428 -72
  201. package/dist/schema/messenger/index.js +1 -1
  202. package/dist/schema/operations.d.ts +177 -34
  203. package/dist/schema/operations.js +1 -1
  204. package/dist/schema/persona/index.d.ts +15744 -1
  205. package/dist/schema/persona/index.js +1 -1
  206. package/dist/schema/query/bi.d.ts +891 -24
  207. package/dist/schema/query/bi.js +1 -1
  208. package/dist/schema/query/index.d.ts +168 -43
  209. package/dist/schema/query/index.js +1 -1
  210. package/dist/schema/schema-query/index.d.ts +16 -0
  211. package/dist/schema/schema-query/index.js +1 -1
  212. package/dist/schema/schema-version.js +1 -1
  213. package/dist/schema/strategy-review/index.d.ts +137 -0
  214. package/dist/schema/strategy-review/index.js +1 -0
  215. package/dist/schema/trust/index.d.ts +6 -6
  216. package/dist/schema/workflow/index.d.ts +2 -2
  217. package/dist/schema-query-impl/index.js +1 -1
  218. package/dist/schemas/account_operation.output.json +8 -4
  219. package/dist/schemas/account_operation.schema.json +6 -2
  220. package/dist/schemas/bridge_operation.schema.json +10 -10
  221. package/dist/schemas/evaluation_operation.output.json +24 -0
  222. package/dist/schemas/evaluation_operation.schema.json +7 -7
  223. package/dist/schemas/goal_operation.schema.json +124 -0
  224. package/dist/schemas/guard2file.schema.json +2 -2
  225. package/dist/schemas/index.json +7 -1
  226. package/dist/schemas/industry_pack_operation.output.json +39 -0
  227. package/dist/schemas/local_mark_operation.schema.json +2 -2
  228. package/dist/schemas/machineNode2file.schema.json +2 -2
  229. package/dist/schemas/messenger_operation.output.json +934 -236
  230. package/dist/schemas/messenger_operation.schema.json +93 -242
  231. package/dist/schemas/onchain_events.schema.json +1 -1
  232. package/dist/schemas/onchain_operations.schema.json +54 -54
  233. package/dist/schemas/onchain_operations_allocation.schema.json +5 -5
  234. package/dist/schemas/onchain_operations_arbitration.schema.json +2 -2
  235. package/dist/schemas/onchain_operations_contact.schema.json +2 -2
  236. package/dist/schemas/onchain_operations_demand.schema.json +2 -2
  237. package/dist/schemas/onchain_operations_gen_passport.schema.json +2 -2
  238. package/dist/schemas/onchain_operations_gen_proof.schema.json +2 -2
  239. package/dist/schemas/onchain_operations_guard.schema.json +2 -2
  240. package/dist/schemas/onchain_operations_machine.schema.json +8 -8
  241. package/dist/schemas/onchain_operations_order.schema.json +2 -2
  242. package/dist/schemas/onchain_operations_payment.schema.json +3 -3
  243. package/dist/schemas/onchain_operations_permission.schema.json +2 -2
  244. package/dist/schemas/onchain_operations_personal.schema.json +2 -2
  245. package/dist/schemas/onchain_operations_progress.schema.json +2 -2
  246. package/dist/schemas/onchain_operations_proof.schema.json +2 -2
  247. package/dist/schemas/onchain_operations_repository.schema.json +5 -5
  248. package/dist/schemas/onchain_operations_reward.schema.json +2 -2
  249. package/dist/schemas/onchain_operations_service.schema.json +5 -5
  250. package/dist/schemas/onchain_operations_treasury.schema.json +4 -4
  251. package/dist/schemas/onchain_table_data.output.json +197 -13
  252. package/dist/schemas/onchain_table_data.schema.json +43 -43
  253. package/dist/schemas/persona_operation.output.json +37778 -262
  254. package/dist/schemas/persona_operation.schema.json +5960 -1
  255. package/dist/schemas/query_toolkit.output.json +1615 -10
  256. package/dist/schemas/query_toolkit.schema.json +232 -42
  257. package/dist/schemas/schema_query.schema.json +25 -1
  258. package/dist/schemas/strategy_review_operation.output.json +532 -0
  259. package/dist/schemas/strategy_review_operation.schema.json +66 -0
  260. package/dist/schemas/wowok_buildin_info.output.json +188 -6
  261. package/dist/schemas/wowok_buildin_info.schema.json +14 -0
  262. package/dist/strategy/collectors.d.ts +66 -0
  263. package/dist/strategy/collectors.js +1 -0
  264. package/dist/strategy/collectors.spec.d.ts +1 -0
  265. package/dist/strategy/collectors.spec.js +1 -0
  266. package/dist/strategy/index.d.ts +5 -0
  267. package/dist/strategy/index.js +1 -0
  268. package/dist/strategy/metrics.d.ts +20 -0
  269. package/dist/strategy/metrics.js +1 -0
  270. package/dist/strategy/review.d.ts +48 -0
  271. package/dist/strategy/review.js +1 -0
  272. package/dist/strategy/scorecard.d.ts +32 -0
  273. package/dist/strategy/scorecard.js +1 -0
  274. package/dist/strategy/store.d.ts +26 -0
  275. package/dist/strategy/store.js +1 -0
  276. package/dist/tools/handlers/config.js +1 -1
  277. package/dist/tools/handlers/evaluation.js +1 -1
  278. package/dist/tools/handlers/goal.js +1 -1
  279. package/dist/tools/handlers/industry-pack.js +1 -1
  280. package/dist/tools/handlers/local.js +1 -1
  281. package/dist/tools/handlers/messenger.js +1 -1
  282. package/dist/tools/handlers/onchain.js +1 -1
  283. package/dist/tools/handlers/permission.js +1 -1
  284. package/dist/tools/handlers/persona.js +1 -1
  285. package/dist/tools/handlers/query.d.ts +6 -0
  286. package/dist/tools/handlers/query.js +1 -1
  287. package/dist/tools/handlers/schema-query.js +1 -1
  288. package/dist/tools/handlers/strategy-review.d.ts +2 -0
  289. package/dist/tools/handlers/strategy-review.js +1 -0
  290. package/dist/tools/handlers/watch.js +1 -1
  291. package/dist/tools/handlers/workflow.js +1 -1
  292. package/dist/tools/index.d.ts +3 -0
  293. package/dist/tools/index.js +1 -1
  294. package/dist/tools/registry/agent.js +1 -1
  295. package/dist/tools/registry/business.js +1 -1
  296. package/dist/tools/registry/local.js +1 -1
  297. package/dist/tools/registry/messenger.js +1 -1
  298. package/dist/tools/registry/onchain.js +1 -1
  299. package/dist/tools/registry/query.js +1 -1
  300. package/dist/tools/rules-hook.d.ts +2 -0
  301. package/dist/tools/rules-hook.js +1 -1
  302. package/dist/tools/shared.d.ts +2 -1
  303. package/dist/tools/shared.js +1 -1
  304. package/dist/tools/wrap.js +1 -1
  305. package/package.json +2 -2
@@ -1 +1 @@
1
- import{OwnedRecordStorage}from'@wowok/wowok';const BUILTIN_RISK_METRICS=[{'metric_id':'funds_risk','display_name':'Funds\x20Risk','description':'Directly\x20operates\x20funds\x20/\x20affects\x20fund\x20flow\x20/\x20no\x20fund\x20risk','type':'risk','scale':'level','weight':0x1,'scope':'builtin'},{'metric_id':'trust_risk','display_name':'Trust\x20Risk','description':'Degree\x20of\x20impact\x20on\x20trust\x20mechanism','type':'risk','scale':'level','weight':0x1,'scope':'builtin'},{'metric_id':'delivery_risk','display_name':'Delivery\x20Risk','description':'Degree\x20of\x20impact\x20on\x20order\x20fulfillment','type':'risk','scale':'level','weight':0x1,'scope':'builtin'},{'metric_id':'compliance_risk','display_name':'Compliance\x20Risk','description':'Degree\x20of\x20regulatory\x20involvement','type':'risk','scale':'level','weight':0x1,'scope':'builtin'}],BUILTIN_BENEFIT_METRICS=[{'metric_id':'automation_level','display_name':'Automation\x20Level','description':'Fully\x20automated\x20/\x20semi-automated\x20/\x20manual','type':'benefit','scale':'level','weight':0x1,'scope':'builtin'},{'metric_id':'trust_boost','display_name':'Trust\x20Boost','description':'Degree\x20of\x20enhancement\x20to\x20trust\x20mechanism','type':'benefit','scale':'level','weight':0x1,'scope':'builtin'},{'metric_id':'efficiency_gain','display_name':'Efficiency\x20Gain','description':'Degree\x20of\x20efficiency\x20improvement','type':'benefit','scale':'level','weight':0x1,'scope':'builtin'}];export class MetricRegistry{static ['instance'];['metrics']=new Map();['persistence']=new OwnedRecordStorage('custom_metrics');['customMetricsLoaded']=![];static['Instance'](){return!MetricRegistry['instance']&&(MetricRegistry['instance']=new MetricRegistry()),MetricRegistry['instance'];}constructor(){this['registerBuiltinMetrics']();}async['ensureLoaded'](){if(this['customMetricsLoaded'])return;this['customMetricsLoaded']=!![];try{const a=await this['persistence']['list']();for(const b of a){try{const c=JSON['parse'](b['data']);c?.['metric_id']&&c['scope']==='custom'&&this['metrics']['set'](c['metric_id'],c);}catch{console['warn']('[MetricRegistry]\x20Skipping\x20corrupt\x20custom_metrics\x20row\x20\x27'+b['owner']+':'+b['name']+'\x27.');}}}catch(d){console['warn']('[MetricRegistry]\x20Failed\x20to\x20load\x20persisted\x20custom\x20metrics:',d['message']);}}['registerMetric'](a){if(!a['metric_id']||!a['type']||!a['scale'])return![];if(this['metrics']['has'](a['metric_id']))return![];return this['metrics']['set'](a['metric_id'],a),!![];}async['registerCustomMetric'](a,b,c,d,e,f,g){await this['ensureLoaded']();const h={'metric_id':a,'display_name':b,'description':c,'type':d,'scale':e,'weight':g??0x1,'scope':'custom','owner':f},i=this['registerMetric'](h);if(i)try{await this['persistence']['save'](f,a,JSON['stringify'](h));}catch(j){console['warn']('[MetricRegistry]\x20Failed\x20to\x20persist\x20custom\x20metric\x20\x27'+a+'\x27:',j['message']);}return i;}['getMetric'](a){return this['metrics']['get'](a);}async['listMetrics'](a){await this['ensureLoaded']();let b=Array['from'](this['metrics']['values']());if(!a)return b;if(a['type'])b=b['filter'](c=>c['type']===a['type']);if(a['scope'])b=b['filter'](c=>c['scope']===a['scope']);if(a['owner'])b=b['filter'](c=>c['owner']===a['owner']);return b;}async['unregisterMetric'](a,b){await this['ensureLoaded']();const c=this['metrics']['get'](a);if(!c||c['scope']!=='custom'||c['owner']!==b)return![];const d=this['metrics']['delete'](a);if(d)try{await this['persistence']['delete'](b,a);}catch(e){console['warn']('[MetricRegistry]\x20Failed\x20to\x20delete\x20persisted\x20custom\x20metric\x20\x27'+a+'\x27:',e['message']);}return d;}['evaluateMode'](a,b,c){const d=[...this['metrics']['values']()];if(c)for(const l of c){!d['some'](n=>n['metric_id']===l['metric_id'])&&d['push'](l);}const e=d['filter'](n=>n['type']==='risk'),f=d['filter'](n=>n['type']==='benefit'),g=[];for(const n of a['capabilities_used']){const o=b['getCard'](n);if(o)g['push'](o);}const h=this['evaluateMetricGroup'](g,e,'risk'),i=this['evaluateMetricGroup'](g,f,'benefit'),j=this['aggregateScore'](h),k=this['aggregateScore'](i);return{'risk_score':j,'benefit_score':k,'metric_details':[...h,...i]};}['evaluateMetricGroup'](a,b,c){const d=[];for(const e of b){const f=[];for(const h of a){const i=c==='risk'?h['risk_profile']:h['benefit_profile'];if(!i)continue;const j=i[e['metric_id']];j!==undefined&&f['push']({'value':j,'weight':0x1});}if(f['length']===0x0)continue;const g=this['computeAverageScore'](f,e['scale']);d['push']({'metric_id':e['metric_id'],'display_name':e['display_name'],'value':this['aggregateValue'](f,e['scale']),'normalized_score':g,'weight':e['weight']??0x1});}return d;}['computeAverageScore'](a,b){if(a['length']===0x0)return 0x0;if(b==='level'){const c={'high':0x64,'medium':0x3c,'low':0x1e};let d=0x0,e=0x0;for(const f of a){const g=c[String(f['value'])]??0x32;d+=g*f['weight'],e+=f['weight'];}return Math['round'](d/Math['max'](e,0x1));}if(b==='numeric'){let h=0x0,i=0x0;for(const j of a){const k=typeof j['value']==='number'?j['value']:0x32;h+=k*j['weight'],i+=j['weight'];}return Math['round'](h/Math['max'](i,0x1));}if(b==='percentage'){let l=0x0,m=0x0;for(const n of a){const o=typeof n['value']==='number'?n['value']:0x32;l+=o*n['weight'],m+=n['weight'];}return Math['round'](l/Math['max'](m,0x1));}return 0x0;}['aggregateValue'](a,b){if(b==='level'){const d={'high':0x0,'medium':0x0,'low':0x0};for(const f of a){const g=String(f['value']);if(d[g]!==undefined)d[g]++;}const e=Object['entries'](d)['sort']((h,i)=>i[0x1]-h[0x1])[0x0]?.[0x0];return e??'medium';}const c=a['reduce']((h,i)=>h+(typeof i['value']==='number'?i['value']:0x0),0x0);return Math['round'](c/a['length']);}['aggregateScore'](a){if(a['length']===0x0)return 0x0;let b=0x0,c=0x0;for(const e of a){b+=e['normalized_score']*e['weight'],c+=e['weight'];}return Math['round'](b/Math['max'](c,0x1));}['registerBuiltinMetrics'](){for(const a of BUILTIN_RISK_METRICS){this['registerMetric'](a);}for(const b of BUILTIN_BENEFIT_METRICS){this['registerMetric'](b);}}}export function getMetricRegistry(){return MetricRegistry['Instance']();}export const BUILTIN_METRICS_COUNT=BUILTIN_RISK_METRICS['length']+BUILTIN_BENEFIT_METRICS['length'];
1
+ import{CustomRegistryFile}from'./custom-registry-file.js';const BUILTIN_RISK_METRICS=[{'metric_id':'funds_risk','display_name':'Funds\x20Risk','description':'Directly\x20operates\x20funds\x20/\x20affects\x20fund\x20flow\x20/\x20no\x20fund\x20risk','type':'risk','scale':'level','weight':0x1,'scope':'builtin'},{'metric_id':'trust_risk','display_name':'Trust\x20Risk','description':'Degree\x20of\x20impact\x20on\x20trust\x20mechanism','type':'risk','scale':'level','weight':0x1,'scope':'builtin'},{'metric_id':'delivery_risk','display_name':'Delivery\x20Risk','description':'Degree\x20of\x20impact\x20on\x20order\x20fulfillment','type':'risk','scale':'level','weight':0x1,'scope':'builtin'},{'metric_id':'compliance_risk','display_name':'Compliance\x20Risk','description':'Degree\x20of\x20regulatory\x20involvement','type':'risk','scale':'level','weight':0x1,'scope':'builtin'}],BUILTIN_BENEFIT_METRICS=[{'metric_id':'automation_level','display_name':'Automation\x20Level','description':'Fully\x20automated\x20/\x20semi-automated\x20/\x20manual','type':'benefit','scale':'level','weight':0x1,'scope':'builtin'},{'metric_id':'trust_boost','display_name':'Trust\x20Boost','description':'Degree\x20of\x20enhancement\x20to\x20trust\x20mechanism','type':'benefit','scale':'level','weight':0x1,'scope':'builtin'},{'metric_id':'efficiency_gain','display_name':'Efficiency\x20Gain','description':'Degree\x20of\x20efficiency\x20improvement','type':'benefit','scale':'level','weight':0x1,'scope':'builtin'}];export class MetricRegistry{static ['instance'];['metrics']=new Map();['file']=CustomRegistryFile['Instance']();['customSyncedMtime']=-0x1;static['Instance'](){return!MetricRegistry['instance']&&(MetricRegistry['instance']=new MetricRegistry()),MetricRegistry['instance'];}constructor(){this['registerBuiltinMetrics']();}async['ensureLoaded'](){const {data:a,mtime:b}=await this['file']['read']();if(b<0x0||b===this['customSyncedMtime'])return;this['customSyncedMtime']=b;for(const [c,d]of this['metrics']){if(d['scope']==='custom')this['metrics']['delete'](c);}for(const e of Object['values'](a['metrics'])){const f=e;f?.['metric_id']&&f['scope']==='custom'?this['metrics']['set'](f['metric_id'],f):console['warn']('[MetricRegistry]\x20Skipping\x20invalid\x20custom_metrics\x20file\x20entry.');}}['registerMetric'](a){if(!a['metric_id']||!a['type']||!a['scale'])return![];if(this['metrics']['has'](a['metric_id']))return![];return this['metrics']['set'](a['metric_id'],a),!![];}async['registerCustomMetric'](a,b,c,d,e,f,g){await this['ensureLoaded']();const h={'metric_id':a,'display_name':b,'description':c,'type':d,'scale':e,'weight':g??0x1,'scope':'custom','owner':f},i=this['registerMetric'](h);return i&&await this['file']['update'](j=>{j['metrics'][a]=h;}),i;}['getMetric'](a){return this['metrics']['get'](a);}async['listMetrics'](a){await this['ensureLoaded']();let b=Array['from'](this['metrics']['values']());if(!a)return b;if(a['type'])b=b['filter'](c=>c['type']===a['type']);if(a['scope'])b=b['filter'](c=>c['scope']===a['scope']);if(a['owner'])b=b['filter'](c=>c['owner']===a['owner']);return b;}async['unregisterMetric'](a,b){await this['ensureLoaded']();const c=this['metrics']['get'](a);if(!c||c['scope']!=='custom'||c['owner']!==b)return![];const d=this['metrics']['delete'](a);return d&&await this['file']['update'](e=>{delete e['metrics'][a];}),d;}['evaluateMode'](a,b,c){const d=[...this['metrics']['values']()];if(c)for(const l of c){!d['some'](n=>n['metric_id']===l['metric_id'])&&d['push'](l);}const e=d['filter'](n=>n['type']==='risk'),f=d['filter'](n=>n['type']==='benefit'),g=[];for(const n of a['capabilities_used']){const o=b['getCard'](n);if(o)g['push'](o);}const h=this['evaluateMetricGroup'](g,e,'risk'),i=this['evaluateMetricGroup'](g,f,'benefit'),j=this['aggregateScore'](h),k=this['aggregateScore'](i);return{'risk_score':j,'benefit_score':k,'metric_details':[...h,...i]};}['evaluateMetricGroup'](a,b,c){const d=[];for(const e of b){const f=[];for(const h of a){const i=c==='risk'?h['risk_profile']:h['benefit_profile'];if(!i)continue;const j=i[e['metric_id']];j!==undefined&&f['push']({'value':j,'weight':0x1});}if(f['length']===0x0)continue;const g=this['computeAverageScore'](f,e['scale']);d['push']({'metric_id':e['metric_id'],'display_name':e['display_name'],'value':this['aggregateValue'](f,e['scale']),'normalized_score':g,'weight':e['weight']??0x1});}return d;}['computeAverageScore'](a,b){if(a['length']===0x0)return 0x0;if(b==='level'){const c={'high':0x64,'medium':0x3c,'low':0x1e};let d=0x0,e=0x0;for(const f of a){const g=c[String(f['value'])]??0x32;d+=g*f['weight'],e+=f['weight'];}return Math['round'](d/Math['max'](e,0x1));}if(b==='numeric'){let h=0x0,i=0x0;for(const j of a){const k=typeof j['value']==='number'?j['value']:0x32;h+=k*j['weight'],i+=j['weight'];}return Math['round'](h/Math['max'](i,0x1));}if(b==='percentage'){let l=0x0,m=0x0;for(const n of a){const o=typeof n['value']==='number'?n['value']:0x32;l+=o*n['weight'],m+=n['weight'];}return Math['round'](l/Math['max'](m,0x1));}return 0x0;}['aggregateValue'](a,b){if(b==='level'){const d={'high':0x0,'medium':0x0,'low':0x0};for(const f of a){const g=String(f['value']);if(d[g]!==undefined)d[g]++;}const e=Object['entries'](d)['sort']((h,i)=>i[0x1]-h[0x1])[0x0]?.[0x0];return e??'medium';}const c=a['reduce']((h,i)=>h+(typeof i['value']==='number'?i['value']:0x0),0x0);return Math['round'](c/a['length']);}['aggregateScore'](a){if(a['length']===0x0)return 0x0;let b=0x0,c=0x0;for(const e of a){b+=e['normalized_score']*e['weight'],c+=e['weight'];}return Math['round'](b/Math['max'](c,0x1));}['registerBuiltinMetrics'](){for(const a of BUILTIN_RISK_METRICS){this['registerMetric'](a);}for(const b of BUILTIN_BENEFIT_METRICS){this['registerMetric'](b);}}}export function getMetricRegistry(){return MetricRegistry['Instance']();}export const BUILTIN_METRICS_COUNT=BUILTIN_RISK_METRICS['length']+BUILTIN_BENEFIT_METRICS['length'];
@@ -1 +1 @@
1
- import{getScenarioMode}from'../knowledge/scenario-modes.js';import{getIndustryTraits}from'../knowledge/industry-registry.js';import{getIndustryRiskChecks,getIndustryNeeds}from'../customer/index.js';import{getFlywheelForIndustry}from'../knowledge/acquisition-flywheel.js';const GENERAL_TRAITS={'has_logistics':![],'communication_heavy':![],'pure_digital':![],'long_cycle':![],'deposit_required':![],'multi_tier_allocation':![],'regulatory_intensity':'low','trust_sensitivity':'medium','consumption_frequency':'occasional','avg_ticket_size':'medium'},GENERAL_FLYWHEEL={'industry':'general','trustSellingPoints':[],'keyActions':[],'rewardStrategy':'User-defined','discountStrategy':'User-defined','trustDescription':'User-defined\x20trust\x20mechanism'},GENERAL_MACHINE_SHAPE=[{'name':'paid','role':'Entry:\x20order\x20created\x20and\x20paid'},{'name':'delivering','role':'Service\x20delivery\x20in\x20progress'},{'name':'delivered','role':'Deliverable\x20available\x20for\x20review'},{'name':'completed','role':'Service\x20completed,\x20funds\x20released'},{'name':'cancelled','role':'Pre-delivery\x20cancellation\x20—\x20triggers\x20refund\x20Allocator'}],GENERAL_ALLOCATOR={'recipient':'signer','count':0x1,'mode':'surplus','description':'Default:\x20surplus\x20to\x20service\x20owner\x20(general\x20fallback)'},RETAIL_MACHINE_SHAPE=[{'name':'paid','role':'Entry:\x20order\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'processing','role':'Merchant\x20prepares\x20order\x20(picking/packing);\x20required_info\x20(shipping\x20address)\x20collected\x20via\x20Messenger'},{'name':'shipped','role':'Merchant\x20ships\x20goods,\x20records\x20shipping\x20WIP\x20(tracking\x20number)'},{'name':'in_transit','role':'Logistics\x20leg\x20active\x20—\x20tracking\x20WIP\x20updates'},{'name':'delivered','role':'Goods\x20delivered\x20to\x20buyer'},{'name':'confirmed','role':'Buyer\x20confirms\x20receipt\x20(confirm_gate:\x20only\x20buyer\x20can\x20confirm)'},{'name':'completed','role':'Funds\x20released\x20to\x20merchant'},{'name':'return_requested','role':'Buyer\x20requests\x20return\x20within\x20refund_window\x20(>=7d)'},{'name':'returned','role':'Buyer\x20ships\x20goods\x20back\x20(return\x20WIP:\x20tracking\x20number)\x20—\x20triggers\x20refund\x20Allocator\x20(R-M1-11\x20compliant)'},{'name':'cancelled','role':'Pre-ship\x20cancellation\x20—\x20triggers\x20refund\x20Allocator'}],RETAIL_GUARDS=[{'template_id':'buy_guard_inventory','host':'service','purpose':'Verify\x20inventory\x20and\x20buyer\x20address\x20on\x20purchase'},{'template_id':'ship_guard_wip','host':'machine','purpose':'Shipping\x20evidence\x20WIP\x20(logistics\x20tracking\x20number)'},{'template_id':'confirm_guard_signer','host':'machine','purpose':'Only\x20buyer\x20can\x20confirm\x20receipt'},{'template_id':'return_guard_timelock','host':'machine','purpose':'Return\x20request\x20gated\x20by\x20refund_window\x20time-lock\x20(clock)'},{'template_id':'refund_guard_permission','host':'machine','purpose':'Return\x20&\x20refund\x20requires\x20merchant\x20permission\x20OR\x20arbiter'},{'template_id':'tpl_payment_exception_compensation','host':'machine','purpose':'Logistics\x20delay\x20exception\x20compensation\x20(§2.13)'}],RETAIL_ALLOCATOR={'recipient':'entity','count':0x3,'mode':'rate','description':'Platform\x2010%\x20+\x20Merchant\x2090%\x20(rate-based\x20split)\x20on\x20completed;\x20full\x20refund\x20to\x20buyer\x20on\x20returned/cancelled\x20via\x20refund\x20Allocator'},RETAIL_KEY_RISK='Products\x20don\x27t\x20match\x20description\x20—\x20no\x20refund\x20path\x20for\x20returns',RETAIL_BUILD_NOTES=['Logistics\x20WIP\x20(tracking\x20number)\x20is\x20essential\x20—\x20shipping\x20evidence\x20protects\x20both\x20parties\x20in\x20return\x20disputes','confirm_gate\x20prevents\x20merchant\x20from\x20self-confirming\x20receipt','Refund\x20path\x20must\x20support\x20return-and-exchange\x20flow;\x20refund_window\x20>=\x207d','Return\x20request\x20is\x20time-lock\x20gated\x20—\x20after\x20the\x20window\x20closes,\x20returns\x20need\x20merchant\x20permission\x20or\x20arbitration','Compensation\x20fund\x20covers\x20return/exchange\x20disputes'],RETAIL_D2C_MACHINE_SHAPE=[{'name':'ordered','role':'Entry:\x20order\x20created\x20(funds\x20escrowed\x20in\x20Allocation)'},{'name':'shipped','role':'Merchant\x20ships\x20goods'},{'name':'delivered','role':'Goods\x20delivered\x20to\x20buyer'},{'name':'completed','role':'Buyer\x20confirms\x20receipt\x20—\x20withdraw_guard\x20releases\x20funds'},{'name':'cancelled','role':'Pre-ship\x20cancellation\x20—\x20refund_guard\x20refunds\x20buyer'}],RETAIL_D2C_GUARDS=[{'template_id':'withdraw_guard_delivery','host':'service','purpose':'Release\x20funds\x20to\x20merchant\x20+\x20processor\x20on\x20order\x20completion\x20(delivery\x20confirmation)'},{'template_id':'refund_guard_cancellation','host':'service','purpose':'Refund\x20100%\x20to\x20buyer\x20on\x20order\x20cancellation'}],RETAIL_D2C_ALLOCATOR={'recipient':'entity','count':0x2,'mode':'rate','description':'Merchant\x2097%\x20+\x20Processor\x203%\x20(rate-based\x20split,\x20no\x20platform\x20commission)'},RETAIL_D2C_KEY_RISK='No\x20platform\x20arbitration\x20—\x20disputes\x20rely\x20on\x20optional\x20Arbitration\x20or\x20off-chain\x20chargeback',RETAIL_D2C_BUILD_NOTES=['Allocation\x20escrow\x20replaces\x20platform\x20custody\x20—\x20funds\x20locked\x20in\x20contract\x20until\x20Guard\x20releases','withdraw_guard\x20enforces\x20delivery\x20gate\x20—\x20merchant\x20must\x20reach\x20\x27completed\x27\x20state\x20to\x20receive\x20payment','refund_guard\x20ensures\x20100%\x20refund\x20on\x20cancellation\x20—\x20no\x20merchant\x20approval\x20needed','No\x20buy_guard\x20needed\x20—\x20D2C\x20doesn\x27t\x20gate\x20purchases\x20(open\x20storefront)','Arbitration\x20is\x20optional\x20—\x20add\x20when\x20dispute\x20volume\x20justifies\x20the\x20cost','Service\x20↔\x20Guard\x20circular\x20dependency:\x20create\x20Service\x20(unpublished)\x20→\x20create\x20Guards\x20→\x20update\x20Service\x20(publish)'],SUPPORTED_INDUSTRY_SET=new Set(['freelance','rental','education','travel','subscription','retail','retail_d2c']);function fetchTemplate(a){const b=a==='retail_d2c'?'retail':a,c=getIndustryTraits(b)??GENERAL_TRAITS,d=SUPPORTED_INDUSTRY_SET['has'](a),e=a==='retail_d2c'?'retail':a,f=d?getIndustryRiskChecks(e):[],g=d?getIndustryNeeds(e):[],h=getFlywheelForIndustry(b)??GENERAL_FLYWHEEL;let i,j,k,l,m;if(a==='retail')i=RETAIL_MACHINE_SHAPE,j=RETAIL_GUARDS,k=RETAIL_ALLOCATOR,l=RETAIL_KEY_RISK,m=RETAIL_BUILD_NOTES;else{if(a==='retail_d2c')i=RETAIL_D2C_MACHINE_SHAPE,j=RETAIL_D2C_GUARDS,k=RETAIL_D2C_ALLOCATOR,l=RETAIL_D2C_KEY_RISK,m=RETAIL_D2C_BUILD_NOTES;else{if(a==='general'){const n=getScenarioMode('general');i=GENERAL_MACHINE_SHAPE,j=[],k=GENERAL_ALLOCATOR,l=n?.['key_risk']??'No\x20safety\x20net\x20—\x20user\x20must\x20design\x20all\x20trust\x20mechanisms\x20manually',m=n?.['build_notes'];}else{const o=getScenarioMode(a);if(!o)throw new Error('[modes.ts]\x20No\x20scenario\x20mode\x20found\x20for\x20industry:\x20'+a);i=o['machine_shape'],j=o['guards'],k=o['allocator'],l=o['key_risk'],m=o['build_notes'];}}}return{'traits':c,'risk_checks':f,'needs':g,'flywheel':h,'machine_shape':i,'guards':j,'allocator':k,'key_risk':l,'build_notes':m};}export const BUILTIN_MODES=[{'name':'freelance','display_name':'Freelance','version':'v1','source':'builtin',...fetchTemplate('freelance'),'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','guard.validate_wip_hash','machine.node_topology','treasury.owner_receive','allocation.distribute','allocation.distribute_milestone','service.publish','progress.advance','arb.vote_weighted','contact.im_create'],'config_overrides':{'service':{'setting_locked_time':'30d','engagement_type':'milestone'},'machine':{'wip_required':!![],'wip_hash_algorithm':'sha256','acceptance_gate':!![]}},'expected_benefits':[{'metric':'Dispute\x20rate\x20reduction','expected_value':'40%','evidence':'WIP\x20hash\x20+\x20milestone\x20allocation\x20enforces\x20delivery\x20evidence'},{'metric':'Delivery\x20confirmation\x20efficiency','expected_value':'+50%','evidence':'acceptance\x20gate\x20automates\x20acceptance\x20workflow'},{'metric':'Provider\x20payment\x20assurance','expected_value':'100%','evidence':'Funds\x20auto-release\x20to\x20provider\x20after\x20accepted\x20node'}],'risk_appetite':'balanced','risk_constraints':{'require_arbitration':!![],'require_compensation_fund':![],'require_wip_evidence':!![],'other_constraints':['setting_locked_time\x20>=\x207d\x20to\x20lock\x20engagement-period\x20rules','ISSUE-P1-4:\x2048h\x20auto-accept\x20requires\x20off-chain\x20keeper\x20(WoWok\x20Guard\x20does\x20not\x20support\x20time-based\x20triggers).\x20Deploy\x20a\x20keeper\x20service\x20that\x20polls\x20Progress\x20objects\x20in\x20\x27delivered\x27\x20state\x20and\x20calls\x20adminUnhold\x20(permission\x20224)\x20after\x2048h\x20timeout.\x20See\x20keeper\x20template\x20in\x20docs.']},'applicable_conditions':{'business_scale':'small','min_daily_orders':0x1,'other_conditions':['Suitable\x20for\x20mid-to-long-term\x20project\x20delivery','Requires\x20milestone-based\x20phased\x20acceptance']},'similar_industries':['rental','education'],'novel_capabilities':['allocation.distribute_milestone'],'disabled_builtin_constraints':['require_compensation_fund']},{'name':'rental','display_name':'Rental','version':'v1','source':'builtin',...fetchTemplate('rental'),'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','guard.validate_wip_hash','machine.node_topology','treasury.owner_receive','allocation.distribute','service.publish','progress.advance','arb.vote_weighted','contact.im_create'],'config_overrides':{'treasury':{'deposit_escrow':!![],'deposit_deductible':!![]},'machine':{'wip_required':!![],'wip_stages':['handover_out','returned'],'inspection_gate':!![]}},'expected_benefits':[{'metric':'Deposit\x20dispute\x20rate','expected_value':'-60%','evidence':'pre-rental\x20WIP\x20mandatorily\x20records\x20item\x27s\x20original\x20state'},{'metric':'Damage\x20liability\x20accuracy','expected_value':'+70%','evidence':'pre/post\x20WIP\x20hash\x20comparison\x20eliminates\x20unfounded\x20deductions'},{'metric':'Trust\x20score','expected_value':'+25%','evidence':'compensation_fund\x20covers\x20damage\x20risk'}],'risk_appetite':'conservative','risk_constraints':{'require_arbitration':!![],'require_compensation_fund':!![],'require_wip_evidence':!![],'max_single_transaction':0x2710,'compensation_fund_coverage_ratio':0xa,'other_constraints':['Deposit\x20must\x20be\x20escrowed\x20(no\x20direct\x20transfer)','lock_duration\x20>=\x207d\x20to\x20prevent\x20arbitrary\x20merchant\x20withdrawal']},'applicable_conditions':{'business_scale':'small','min_daily_orders':0x1,'other_conditions':['Requires\x20physical\x20item\x20handover','Has\x20logistics\x20or\x20offline\x20delivery\x20leg']},'similar_industries':['retail','travel'],'novel_capabilities':[]},{'name':'education','display_name':'Education','version':'v1','source':'builtin',...fetchTemplate('education'),'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','guard.validate_wip_hash','machine.node_topology','treasury.owner_receive','allocation.distribute','allocation.distribute_milestone','service.publish','progress.advance','arb.vote_weighted','contact.im_create'],'config_overrides':{'allocation':{'strategy':{'recipient':'entity','count':0x1,'mode':'amount','description':'1/N\x20of\x20tuition\x20released\x20per\x20session\x20attendance'},'session_threshold':!![]},'service':{'setting_locked_time':'120d','anti_runaway':!![]}},'expected_benefits':[{'metric':'Refund\x20dispute\x20rate','expected_value':'-50%','evidence':'per-session\x20release\x20distributes\x20tuition\x20by\x20class'},{'metric':'Institution\x20runaway\x20risk','expected_value':'eliminated','evidence':'Funds\x20release\x20per\x20session;\x20undelivered\x20portion\x20is\x20refundable'},{'metric':'Attendance\x20traceability','expected_value':'100%','evidence':'attendance_guard\x20signs\x20each\x20session'}],'risk_appetite':'conservative','risk_constraints':{'require_arbitration':!![],'require_compensation_fund':!![],'require_wip_evidence':![],'other_constraints':['setting_locked_time\x20covers\x20the\x20entire\x20term\x20(>=90d)','Long-cycle\x20projects\x20must\x20monitor\x20>90d\x20progress']},'applicable_conditions':{'business_scale':'medium','min_daily_orders':0x1,'other_conditions':['Long-cycle\x20delivery','Requires\x20per-session\x20acceptance','Regulatory\x20intensity:\x20medium']},'similar_industries':['freelance','subscription'],'novel_capabilities':['allocation.distribute_milestone'],'disabled_builtin_constraints':['require_wip_evidence']},{'name':'travel','display_name':'Travel','version':'v1','source':'builtin',...fetchTemplate('travel'),'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','guard.validate_wip_hash','machine.node_topology','treasury.owner_receive','allocation.distribute','service.publish','progress.advance','arb.vote_weighted','contact.im_create'],'config_overrides':{'allocation':{'strategy':{'recipient':'entity','count':0x3,'mode':'amount','description':'Deposit\x2020%\x20to\x20agency,\x20final\x2080%\x20to\x20agency,\x20then\x20agency-side\x20Allocation\x20splits\x20to\x20hotel/guide/driver\x20per\x20segment'},'multi_tier_waterfall':!![],'guard_chaining':!![]},'service':{'supply_chain_suborders':!![],'segment_guard_required':!![]}},'expected_benefits':[{'metric':'Fund\x20transparency','expected_value':'100%','evidence':'multi-tier\x20allocation\x20splits\x20per\x20segment\x20to\x20hotel/guide/driver'},{'metric':'Itinerary\x20change\x20disputes','expected_value':'-45%','evidence':'segment\x20WIP\x20accepts\x20each\x20leg'},{'metric':'Breach\x20compensation\x20assurance','expected_value':'+60%','evidence':'compensation_fund\x20covers\x20itinerary\x20breach'}],'risk_appetite':'balanced','risk_constraints':{'require_arbitration':!![],'require_compensation_fund':!![],'require_wip_evidence':!![],'other_constraints':['Multi-tier\x20allocation\x20requires\x20guard\x20chaining\x20validation','deposit\x2020%\x20+\x20final\x2080%\x20two-stage\x20payment']},'applicable_conditions':{'business_scale':'medium','min_daily_orders':0x1,'other_conditions':['Multi-segment\x20itinerary\x20combination','Requires\x20hotel/guide/driver\x20multi-party\x20allocation']},'similar_industries':['rental','education'],'novel_capabilities':[]},{'name':'subscription','display_name':'Subscription','version':'v1','source':'builtin',...fetchTemplate('subscription'),'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','machine.node_topology','treasury.owner_receive','allocation.distribute','service.publish','progress.advance','arb.vote_weighted','reward.claim_guard','contact.im_create'],'config_overrides':{'machine':{'no_auto_renew_trap':!![],'user_confirmed_charge':!![],'cancel_anytime':!![],'next_period_effective':!![]},'service':{'creator_data_subscription':!![],'periodic_billing':!![]}},'expected_benefits':[{'metric':'Renewal\x20rate','expected_value':'+25%','evidence':'loyalty\x20reward\x20+\x20transparent\x20subscription\x20mechanism'},{'metric':'Cancellation\x20disputes','expected_value':'eliminated','evidence':'cancel\x20anytime\x20+\x20no\x20auto-renew\x20trap'},{'metric':'Creator\x20retention','expected_value':'+30%','evidence':'deliver_guard_wip\x20prevents\x20content\x20dropout'}],'risk_appetite':'aggressive','risk_constraints':{'require_arbitration':![],'require_compensation_fund':![],'require_wip_evidence':![],'compensation_fund_coverage_ratio':0x3,'other_constraints':['Forbid\x20dead-end\x20nodes\x20(prevent\x20lock-in)','charge_guard\x20requires\x20user\x20confirmation\x20each\x20period']},'applicable_conditions':{'business_scale':'small','min_daily_orders':0x5,'other_conditions':['Pure-digital\x20delivery','Periodic\x20content\x20or\x20SaaS\x20service']},'similar_industries':['freelance','education'],'novel_capabilities':[],'disabled_builtin_constraints':['require_arbitration','require_compensation_fund','require_wip_evidence']},{'name':'retail','display_name':'Retail','version':'v1','source':'builtin',...fetchTemplate('retail'),'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','guard.validate_wip_hash','machine.node_topology','treasury.owner_receive','allocation.distribute','service.publish','progress.advance','arb.vote_weighted','reward.claim_guard','contact.im_create'],'config_overrides':{'machine':{'wip_required':!![],'wip_field':'tracking_number','confirm_gate':!![],'refund_requires_approval':!![]},'service':{'logistics_mode':'standard','first_order_discount':!![]}},'expected_benefits':[{'metric':'Return\x20dispute\x20rate','expected_value':'-35%','evidence':'logistics\x20WIP\x20+\x20refund\x20path\x20assurance'},{'metric':'Repurchase\x20rate','expected_value':'+20%','evidence':'spend\x20cashback\x20reward'},{'metric':'Product\x20authenticity\x20traceability','expected_value':'100%','evidence':'WIP\x20verifies\x20product/logistics\x20info'}],'risk_appetite':'conservative','risk_constraints':{'require_arbitration':!![],'require_compensation_fund':!![],'require_wip_evidence':![],'compensation_fund_coverage_ratio':0x5,'other_constraints':['refund_window\x20>=\x207d','confirm_gate:\x20only\x20buyer\x20can\x20confirm\x20receipt']},'applicable_conditions':{'business_scale':'medium','min_daily_orders':0xa,'other_conditions':['Has\x20logistics\x20shipping\x20leg','High-frequency\x20small-ticket\x20transactions']},'similar_industries':['rental','subscription'],'novel_capabilities':[],'disabled_builtin_constraints':['require_wip_evidence']},{'name':'retail_d2c','display_name':'Retail\x20D2C\x20(Direct-to-Consumer)','version':'v1','source':'builtin',...fetchTemplate('retail_d2c'),'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_withdraw','guard.validate_refund','machine.node_topology','allocation.distribute','service.publish','progress.advance','contact.im_create'],'config_overrides':{'machine':{'wip_required':![],'confirm_gate':!![],'refund_requires_approval':![]},'service':{'logistics_mode':'merchant_managed','multi_recipient_allocation':!![]}},'expected_benefits':[{'metric':'Merchant\x20revenue\x20share','expected_value':'97%','evidence':'No\x20platform\x20commission\x20—\x20only\x203%\x20processing\x20fee'},{'metric':'Fund\x20safety','expected_value':'contract-grade','evidence':'Allocation\x20escrow\x20+\x20Guard\x20verification\x20replaces\x20platform\x20custody'},{'metric':'Delivery\x20reliability','expected_value':'high','evidence':'withdraw_guard\x20enforces\x20delivery\x20confirmation\x20before\x20payment'}],'risk_appetite':'balanced','risk_constraints':{'require_arbitration':![],'require_compensation_fund':![],'require_wip_evidence':![],'other_constraints':['Allocation\x20escrow\x20required\x20(withdraw_guard\x20+\x20refund_guard)','Service\x20↔\x20Guard\x20circular\x20dependency\x20requires\x203-step\x20creation\x20pattern']},'applicable_conditions':{'business_scale':'small','min_daily_orders':0x1,'other_conditions':['Independent\x20storefront\x20(no\x20marketplace)','Merchant-managed\x20logistics','Allocation\x20escrow\x20model']},'similar_industries':['retail','subscription'],'novel_capabilities':['Allocation\x20escrow\x20as\x20platform-custody\x20alternative','Multi-recipient\x20allocation\x20(merchant\x20+\x20processor)'],'disabled_builtin_constraints':['require_arbitration','require_compensation_fund','require_wip_evidence']},{'name':'general','display_name':'General','version':'v1','source':'builtin',...fetchTemplate('general'),'capabilities_used':['permission.index_create','machine.node_topology','treasury.owner_receive','allocation.distribute','service.publish','progress.advance'],'expected_benefits':[{'metric':'Flexibility','expected_value':'100%','evidence':'User\x20customizes\x20all\x20trust\x20mechanism\x20parameters'},{'metric':'Degraded\x20safety','expected_value':'usable','evidence':'Can\x20fall\x20back\x20to\x20general\x20at\x20any\x20time'}],'risk_appetite':'balanced','risk_constraints':{'require_arbitration':![],'require_compensation_fund':![],'require_wip_evidence':![]},'applicable_conditions':{'business_scale':'small','other_conditions':['Fallback\x20degraded\x20mode','Hybrid\x20scenarios\x20not\x20covered\x20by\x20other\x20industries']},'similar_industries':[],'novel_capabilities':[],'disabled_builtin_constraints':['require_arbitration','require_compensation_fund','require_wip_evidence']}];
1
+ import{getScenarioMode}from'../knowledge/scenario-modes.js';import{getIndustryTraits}from'../knowledge/industry-registry.js';import{getIndustryRiskChecks,getIndustryNeeds}from'../customer/index.js';import{getFlywheelForIndustry}from'../knowledge/acquisition-flywheel.js';const GENERAL_TRAITS={'has_logistics':![],'communication_heavy':![],'pure_digital':![],'long_cycle':![],'deposit_required':![],'multi_tier_allocation':![],'regulatory_intensity':'low','trust_sensitivity':'medium','consumption_frequency':'occasional','avg_ticket_size':'medium'},GENERAL_FLYWHEEL={'industry':'general','trustSellingPoints':[],'keyActions':[],'rewardStrategy':'User-defined','discountStrategy':'User-defined','trustDescription':'User-defined\x20trust\x20mechanism'},GENERAL_MACHINE_SHAPE=[{'name':'paid','role':'Entry:\x20order\x20created\x20and\x20paid'},{'name':'delivering','role':'Service\x20delivery\x20in\x20progress'},{'name':'delivered','role':'Deliverable\x20available\x20for\x20review'},{'name':'completed','role':'Service\x20completed,\x20funds\x20released'},{'name':'cancelled','role':'Pre-delivery\x20cancellation\x20—\x20triggers\x20refund\x20Allocator'}],GENERAL_ALLOCATOR={'recipient':'signer','count':0x1,'mode':'surplus','description':'Default:\x20surplus\x20to\x20service\x20owner\x20(general\x20fallback)'},RETAIL_MACHINE_SHAPE=[{'name':'paid','role':'Entry:\x20order\x20paid\x20via\x20Service.buy();\x20Machine\x20starts\x20here'},{'name':'processing','role':'Merchant\x20prepares\x20order\x20(picking/packing);\x20required_info\x20(shipping\x20address)\x20collected\x20via\x20Messenger'},{'name':'shipped','role':'Merchant\x20ships\x20goods,\x20records\x20shipping\x20WIP\x20(tracking\x20number)'},{'name':'in_transit','role':'Logistics\x20leg\x20active\x20—\x20tracking\x20WIP\x20updates'},{'name':'delivered','role':'Goods\x20delivered\x20to\x20buyer'},{'name':'confirmed','role':'Buyer\x20confirms\x20receipt\x20(confirm_gate:\x20only\x20buyer\x20can\x20confirm)'},{'name':'completed','role':'Funds\x20released\x20to\x20merchant'},{'name':'return_requested','role':'Buyer\x20requests\x20return\x20within\x20refund_window\x20(>=7d)'},{'name':'returned','role':'Buyer\x20ships\x20goods\x20back\x20(return\x20WIP:\x20tracking\x20number)\x20—\x20triggers\x20refund\x20Allocator\x20(R-M1-11\x20compliant)'},{'name':'cancelled','role':'Pre-ship\x20cancellation\x20—\x20triggers\x20refund\x20Allocator'}],RETAIL_GUARDS=[{'template_id':'buy_guard_inventory','host':'service','purpose':'Verify\x20inventory\x20and\x20buyer\x20address\x20on\x20purchase'},{'template_id':'ship_guard_wip','host':'machine','purpose':'Shipping\x20evidence\x20WIP\x20(logistics\x20tracking\x20number)'},{'template_id':'confirm_guard_signer','host':'machine','purpose':'Only\x20buyer\x20can\x20confirm\x20receipt'},{'template_id':'return_guard_timelock','host':'machine','purpose':'Return\x20request\x20gated\x20by\x20refund_window\x20time-lock\x20(clock)'},{'template_id':'refund_guard_permission','host':'machine','purpose':'Return\x20&\x20refund\x20requires\x20merchant\x20permission\x20OR\x20arbiter'},{'template_id':'tpl_payment_exception_compensation','host':'machine','purpose':'Logistics\x20delay\x20exception\x20compensation\x20(§2.13)'}],RETAIL_ALLOCATOR={'recipient':'entity','count':0x3,'mode':'rate','description':'Platform\x2010%\x20+\x20Merchant\x2090%\x20(rate-based\x20split)\x20on\x20completed;\x20full\x20refund\x20to\x20buyer\x20on\x20returned/cancelled\x20via\x20refund\x20Allocator'},RETAIL_KEY_RISK='Products\x20don\x27t\x20match\x20description\x20—\x20no\x20refund\x20path\x20for\x20returns',RETAIL_BUILD_NOTES=['Logistics\x20WIP\x20(tracking\x20number)\x20is\x20essential\x20—\x20shipping\x20evidence\x20protects\x20both\x20parties\x20in\x20return\x20disputes','confirm_gate\x20prevents\x20merchant\x20from\x20self-confirming\x20receipt','Refund\x20path\x20must\x20support\x20return-and-exchange\x20flow;\x20refund_window\x20>=\x207d','Return\x20request\x20is\x20time-lock\x20gated\x20—\x20after\x20the\x20window\x20closes,\x20returns\x20need\x20merchant\x20permission\x20or\x20arbitration','Compensation\x20fund\x20covers\x20return/exchange\x20disputes'],RETAIL_D2C_MACHINE_SHAPE=[{'name':'ordered','role':'Entry:\x20order\x20created\x20(funds\x20escrowed\x20in\x20Allocation)'},{'name':'shipped','role':'Merchant\x20ships\x20goods'},{'name':'delivered','role':'Goods\x20delivered\x20to\x20buyer'},{'name':'completed','role':'Buyer\x20confirms\x20receipt\x20—\x20withdraw_guard\x20releases\x20funds'},{'name':'cancelled','role':'Pre-ship\x20cancellation\x20—\x20refund_guard\x20refunds\x20buyer'}],RETAIL_D2C_GUARDS=[{'template_id':'withdraw_guard_delivery','host':'service','purpose':'Release\x20funds\x20to\x20merchant\x20+\x20processor\x20on\x20order\x20completion\x20(delivery\x20confirmation)'},{'template_id':'refund_guard_cancellation','host':'service','purpose':'Refund\x20100%\x20to\x20buyer\x20on\x20order\x20cancellation'}],RETAIL_D2C_ALLOCATOR={'recipient':'entity','count':0x2,'mode':'rate','description':'Merchant\x2097%\x20+\x20Processor\x203%\x20(rate-based\x20split,\x20no\x20platform\x20commission)'},RETAIL_D2C_KEY_RISK='No\x20platform\x20arbitration\x20—\x20disputes\x20rely\x20on\x20optional\x20Arbitration\x20or\x20off-chain\x20chargeback',RETAIL_D2C_BUILD_NOTES=['Allocation\x20escrow\x20replaces\x20platform\x20custody\x20—\x20funds\x20locked\x20in\x20contract\x20until\x20Guard\x20releases','withdraw_guard\x20enforces\x20delivery\x20gate\x20—\x20merchant\x20must\x20reach\x20\x27completed\x27\x20state\x20to\x20receive\x20payment','refund_guard\x20ensures\x20100%\x20refund\x20on\x20cancellation\x20—\x20no\x20merchant\x20approval\x20needed','No\x20buy_guard\x20needed\x20—\x20D2C\x20doesn\x27t\x20gate\x20purchases\x20(open\x20storefront)','Arbitration\x20is\x20optional\x20—\x20add\x20when\x20dispute\x20volume\x20justifies\x20the\x20cost','Service\x20↔\x20Guard\x20circular\x20dependency:\x20create\x20Service\x20(unpublished)\x20→\x20create\x20Guards\x20→\x20update\x20Service\x20(publish)'],SUPPORTED_INDUSTRY_SET=new Set(['freelance','rental','education','travel','subscription','retail','retail_d2c']);function fetchTemplate(a){const b=a==='retail_d2c'?'retail':a,c=getIndustryTraits(b)??GENERAL_TRAITS,d=SUPPORTED_INDUSTRY_SET['has'](a),e=a==='retail_d2c'?'retail':a,f=d?getIndustryRiskChecks(e):[],g=d?getIndustryNeeds(e):[],h=getFlywheelForIndustry(b)??GENERAL_FLYWHEEL;let i,j,k,l,m;if(a==='retail')i=RETAIL_MACHINE_SHAPE,j=RETAIL_GUARDS,k=RETAIL_ALLOCATOR,l=RETAIL_KEY_RISK,m=RETAIL_BUILD_NOTES;else{if(a==='retail_d2c')i=RETAIL_D2C_MACHINE_SHAPE,j=RETAIL_D2C_GUARDS,k=RETAIL_D2C_ALLOCATOR,l=RETAIL_D2C_KEY_RISK,m=RETAIL_D2C_BUILD_NOTES;else{if(a==='general'){const n=getScenarioMode('general');i=GENERAL_MACHINE_SHAPE,j=[],k=GENERAL_ALLOCATOR,l=n?.['key_risk']??'No\x20safety\x20net\x20—\x20user\x20must\x20design\x20all\x20trust\x20mechanisms\x20manually',m=n?.['build_notes'];}else{const o=getScenarioMode(a);if(!o)throw new Error('[modes.ts]\x20No\x20scenario\x20mode\x20found\x20for\x20industry:\x20'+a);i=o['machine_shape'],j=o['guards'],k=o['allocator'],l=o['key_risk'],m=o['build_notes'];}}}return{'traits':c,'risk_checks':f,'needs':g,'flywheel':h,'machine_shape':i,'guards':j,'allocator':k,'key_risk':l,'build_notes':m};}export const BUILTIN_MODES=[{'name':'freelance','display_name':'Freelance','version':'v1','source':'builtin',...fetchTemplate('freelance'),'analyze':{'key_questions':['Are\x20WIP\x20hashes\x20bound\x20to\x20each\x20milestone,\x20so\x20delivery\x20evidence\x20cannot\x20be\x20substituted\x20after\x20acceptance?','Does\x20the\x20acceptance\x20gate\x20have\x20a\x20time-bounded\x20escape\x20(keeper-driven\x20auto-accept),\x20or\x20can\x20a\x20silent\x20buyer\x20hold\x20the\x20provider\x27s\x20funds\x20hostage\x20indefinitely?']},'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','guard.validate_wip_hash','machine.node_topology','treasury.owner_receive','allocation.distribute','allocation.distribute_milestone','service.publish','progress.advance','arb.vote_weighted','contact.im_create'],'config_overrides':{'service':{'setting_locked_time':'30d','engagement_type':'milestone'},'machine':{'wip_required':!![],'wip_hash_algorithm':'sha256','acceptance_gate':!![]}},'expected_benefits':[{'metric':'Dispute\x20rate\x20reduction','expected_value':'40%','evidence':'WIP\x20hash\x20+\x20milestone\x20allocation\x20enforces\x20delivery\x20evidence'},{'metric':'Delivery\x20confirmation\x20efficiency','expected_value':'+50%','evidence':'acceptance\x20gate\x20automates\x20acceptance\x20workflow'},{'metric':'Provider\x20payment\x20assurance','expected_value':'100%','evidence':'Funds\x20auto-release\x20to\x20provider\x20after\x20accepted\x20node'}],'risk_appetite':'balanced','risk_constraints':{'require_arbitration':!![],'require_compensation_fund':![],'require_wip_evidence':!![],'other_constraints':['setting_locked_time\x20>=\x207d\x20to\x20lock\x20engagement-period\x20rules','ISSUE-P1-4:\x2048h\x20auto-accept\x20requires\x20off-chain\x20keeper\x20(WoWok\x20Guard\x20does\x20not\x20support\x20time-based\x20triggers).\x20Deploy\x20a\x20keeper\x20service\x20that\x20polls\x20Progress\x20objects\x20in\x20\x27delivered\x27\x20state\x20and\x20calls\x20adminUnhold\x20(permission\x20224)\x20after\x2048h\x20timeout.\x20See\x20keeper\x20template\x20in\x20docs.']},'applicable_conditions':{'business_scale':'small','min_daily_orders':0x1,'other_conditions':['Suitable\x20for\x20mid-to-long-term\x20project\x20delivery','Requires\x20milestone-based\x20phased\x20acceptance']},'similar_industries':['rental','education'],'novel_capabilities':['allocation.distribute_milestone'],'disabled_builtin_constraints':['require_compensation_fund']},{'name':'rental','display_name':'Rental','version':'v1','source':'builtin',...fetchTemplate('rental'),'analyze':{'key_questions':['Is\x20the\x20deposit\x20escrowed\x20on-chain\x20and\x20sized\x20against\x20the\x20item\x27s\x20full\x20replacement\x20value,\x20not\x20just\x20the\x20rental\x20fee?','Are\x20pre-handover\x20and\x20post-return\x20WIP\x20states\x20hash-recorded,\x20so\x20damage\x20attribution\x20is\x20provable\x20rather\x20than\x20asserted?']},'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','guard.validate_wip_hash','machine.node_topology','treasury.owner_receive','allocation.distribute','service.publish','progress.advance','arb.vote_weighted','contact.im_create'],'config_overrides':{'treasury':{'deposit_escrow':!![],'deposit_deductible':!![]},'machine':{'wip_required':!![],'wip_stages':['handover_out','returned'],'inspection_gate':!![]}},'expected_benefits':[{'metric':'Deposit\x20dispute\x20rate','expected_value':'-60%','evidence':'pre-rental\x20WIP\x20mandatorily\x20records\x20item\x27s\x20original\x20state'},{'metric':'Damage\x20liability\x20accuracy','expected_value':'+70%','evidence':'pre/post\x20WIP\x20hash\x20comparison\x20eliminates\x20unfounded\x20deductions'},{'metric':'Trust\x20score','expected_value':'+25%','evidence':'compensation_fund\x20covers\x20damage\x20risk'}],'risk_appetite':'conservative','risk_constraints':{'require_arbitration':!![],'require_compensation_fund':!![],'require_wip_evidence':!![],'max_single_transaction':0x2710,'compensation_fund_coverage_ratio':0xa,'other_constraints':['Deposit\x20must\x20be\x20escrowed\x20(no\x20direct\x20transfer)','lock_duration\x20>=\x207d\x20to\x20prevent\x20arbitrary\x20merchant\x20withdrawal']},'applicable_conditions':{'business_scale':'small','min_daily_orders':0x1,'other_conditions':['Requires\x20physical\x20item\x20handover','Has\x20logistics\x20or\x20offline\x20delivery\x20leg']},'similar_industries':['retail','travel'],'novel_capabilities':[]},{'name':'education','display_name':'Education','version':'v1','source':'builtin',...fetchTemplate('education'),'analyze':{'key_questions':['Does\x20tuition\x20release\x20per\x20attended\x20session\x20(Progress\x20node),\x20so\x20undelivered\x20sessions\x20stay\x20refundable\x20if\x20the\x20institution\x20disappears?','Does\x20setting_locked_time\x20span\x20the\x20full\x20term,\x20so\x20the\x20institution\x20cannot\x20tighten\x20refund\x20rules\x20mid-course?']},'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','guard.validate_wip_hash','machine.node_topology','treasury.owner_receive','allocation.distribute','allocation.distribute_milestone','service.publish','progress.advance','arb.vote_weighted','contact.im_create'],'config_overrides':{'allocation':{'strategy':{'recipient':'entity','count':0x1,'mode':'amount','description':'1/N\x20of\x20tuition\x20released\x20per\x20session\x20attendance'},'session_threshold':!![]},'service':{'setting_locked_time':'120d','anti_runaway':!![]}},'expected_benefits':[{'metric':'Refund\x20dispute\x20rate','expected_value':'-50%','evidence':'per-session\x20release\x20distributes\x20tuition\x20by\x20class'},{'metric':'Institution\x20runaway\x20risk','expected_value':'eliminated','evidence':'Funds\x20release\x20per\x20session;\x20undelivered\x20portion\x20is\x20refundable'},{'metric':'Attendance\x20traceability','expected_value':'100%','evidence':'attendance_guard\x20signs\x20each\x20session'}],'risk_appetite':'conservative','risk_constraints':{'require_arbitration':!![],'require_compensation_fund':!![],'require_wip_evidence':![],'other_constraints':['setting_locked_time\x20covers\x20the\x20entire\x20term\x20(>=90d)','Long-cycle\x20projects\x20must\x20monitor\x20>90d\x20progress']},'applicable_conditions':{'business_scale':'medium','min_daily_orders':0x1,'other_conditions':['Long-cycle\x20delivery','Requires\x20per-session\x20acceptance','Regulatory\x20intensity:\x20medium']},'similar_industries':['freelance','subscription'],'novel_capabilities':['allocation.distribute_milestone'],'disabled_builtin_constraints':['require_wip_evidence']},{'name':'travel','display_name':'Travel','version':'v1','source':'builtin',...fetchTemplate('travel'),'analyze':{'key_questions':['Does\x20each\x20itinerary\x20segment\x20have\x20its\x20own\x20guard\x20and\x20WIP\x20acceptance,\x20so\x20one\x20failed\x20leg\x20is\x20refundable\x20without\x20unwinding\x20the\x20whole\x20trip?','Is\x20the\x20multi-tier\x20allocation\x20waterfall\x20(agency\x20→\x20hotel/guide/driver)\x20visible\x20on-chain,\x20so\x20the\x20agency\x20cannot\x20silently\x20re-split\x20funds?']},'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','guard.validate_wip_hash','machine.node_topology','treasury.owner_receive','allocation.distribute','service.publish','progress.advance','arb.vote_weighted','contact.im_create'],'config_overrides':{'allocation':{'strategy':{'recipient':'entity','count':0x3,'mode':'amount','description':'Deposit\x2020%\x20to\x20agency,\x20final\x2080%\x20to\x20agency,\x20then\x20agency-side\x20Allocation\x20splits\x20to\x20hotel/guide/driver\x20per\x20segment'},'multi_tier_waterfall':!![],'guard_chaining':!![]},'service':{'supply_chain_suborders':!![],'segment_guard_required':!![]}},'expected_benefits':[{'metric':'Fund\x20transparency','expected_value':'100%','evidence':'multi-tier\x20allocation\x20splits\x20per\x20segment\x20to\x20hotel/guide/driver'},{'metric':'Itinerary\x20change\x20disputes','expected_value':'-45%','evidence':'segment\x20WIP\x20accepts\x20each\x20leg'},{'metric':'Breach\x20compensation\x20assurance','expected_value':'+60%','evidence':'compensation_fund\x20covers\x20itinerary\x20breach'}],'risk_appetite':'balanced','risk_constraints':{'require_arbitration':!![],'require_compensation_fund':!![],'require_wip_evidence':!![],'other_constraints':['Multi-tier\x20allocation\x20requires\x20guard\x20chaining\x20validation','deposit\x2020%\x20+\x20final\x2080%\x20two-stage\x20payment']},'applicable_conditions':{'business_scale':'medium','min_daily_orders':0x1,'other_conditions':['Multi-segment\x20itinerary\x20combination','Requires\x20hotel/guide/driver\x20multi-party\x20allocation']},'similar_industries':['rental','education'],'novel_capabilities':[]},{'name':'subscription','display_name':'Subscription','version':'v1','source':'builtin',...fetchTemplate('subscription'),'analyze':{'key_questions':['Is\x20every\x20periodic\x20charge\x20gated\x20by\x20an\x20explicit\x20user\x20confirmation,\x20with\x20no\x20auto-renew\x20default?','Can\x20the\x20subscriber\x20cancel\x20anytime\x20effective\x20next\x20period,\x20without\x20a\x20dead-end\x20node\x20in\x20the\x20machine?']},'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','machine.node_topology','treasury.owner_receive','allocation.distribute','service.publish','progress.advance','arb.vote_weighted','reward.claim_guard','contact.im_create'],'config_overrides':{'machine':{'no_auto_renew_trap':!![],'user_confirmed_charge':!![],'cancel_anytime':!![],'next_period_effective':!![]},'service':{'creator_data_subscription':!![],'periodic_billing':!![]}},'expected_benefits':[{'metric':'Renewal\x20rate','expected_value':'+25%','evidence':'loyalty\x20reward\x20+\x20transparent\x20subscription\x20mechanism'},{'metric':'Cancellation\x20disputes','expected_value':'eliminated','evidence':'cancel\x20anytime\x20+\x20no\x20auto-renew\x20trap'},{'metric':'Creator\x20retention','expected_value':'+30%','evidence':'deliver_guard_wip\x20prevents\x20content\x20dropout'}],'risk_appetite':'aggressive','risk_constraints':{'require_arbitration':![],'require_compensation_fund':![],'require_wip_evidence':![],'compensation_fund_coverage_ratio':0x3,'other_constraints':['Forbid\x20dead-end\x20nodes\x20(prevent\x20lock-in)','charge_guard\x20requires\x20user\x20confirmation\x20each\x20period']},'applicable_conditions':{'business_scale':'small','min_daily_orders':0x5,'other_conditions':['Pure-digital\x20delivery','Periodic\x20content\x20or\x20SaaS\x20service']},'similar_industries':['freelance','education'],'novel_capabilities':[],'disabled_builtin_constraints':['require_arbitration','require_compensation_fund','require_wip_evidence']},{'name':'retail','display_name':'Retail','version':'v1','source':'builtin',...fetchTemplate('retail'),'analyze':{'key_questions':['Is\x20the\x20logistics\x20tracking\x20number\x20recorded\x20as\x20WIP\x20before\x20the\x20confirm\x20gate,\x20so\x20receipt\x20disputes\x20have\x20carrier\x20evidence?','Is\x20the\x20refund\x20window\x20at\x20least\x207\x20days\x20with\x20an\x20on-chain\x20refund\x20path\x20that\x20does\x20not\x20rely\x20on\x20merchant\x20goodwill?']},'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_buy','guard.validate_wip_hash','machine.node_topology','treasury.owner_receive','allocation.distribute','service.publish','progress.advance','arb.vote_weighted','reward.claim_guard','contact.im_create'],'config_overrides':{'machine':{'wip_required':!![],'wip_field':'tracking_number','confirm_gate':!![],'refund_requires_approval':!![]},'service':{'logistics_mode':'standard','first_order_discount':!![]}},'expected_benefits':[{'metric':'Return\x20dispute\x20rate','expected_value':'-35%','evidence':'logistics\x20WIP\x20+\x20refund\x20path\x20assurance'},{'metric':'Repurchase\x20rate','expected_value':'+20%','evidence':'spend\x20cashback\x20reward'},{'metric':'Product\x20authenticity\x20traceability','expected_value':'100%','evidence':'WIP\x20verifies\x20product/logistics\x20info'}],'risk_appetite':'conservative','risk_constraints':{'require_arbitration':!![],'require_compensation_fund':!![],'require_wip_evidence':![],'compensation_fund_coverage_ratio':0x5,'other_constraints':['refund_window\x20>=\x207d','confirm_gate:\x20only\x20buyer\x20can\x20confirm\x20receipt']},'applicable_conditions':{'business_scale':'medium','min_daily_orders':0xa,'other_conditions':['Has\x20logistics\x20shipping\x20leg','High-frequency\x20small-ticket\x20transactions']},'similar_industries':['rental','subscription'],'novel_capabilities':[],'disabled_builtin_constraints':['require_wip_evidence']},{'name':'retail_d2c','display_name':'Retail\x20D2C\x20(Direct-to-Consumer)','version':'v1','source':'builtin',...fetchTemplate('retail_d2c'),'analyze':{'key_questions':['Do\x20withdraw_guard\x20and\x20refund_guard\x20fully\x20enclose\x20the\x20Allocation\x20escrow,\x20so\x20neither\x20side\x20can\x20move\x20funds\x20outside\x20the\x20contract\x20path?','With\x20no\x20platform\x20arbitration,\x20what\x20off-chain\x20recourse\x20(if\x20any)\x20backs\x20a\x20delivery\x20failure\x20—\x20and\x20is\x20that\x20acceptable\x20for\x20the\x20ticket\x20size?']},'capabilities_used':['permission.index_create','permission.role_assign','guard.validate_withdraw','guard.validate_refund','machine.node_topology','allocation.distribute','service.publish','progress.advance','contact.im_create'],'config_overrides':{'machine':{'wip_required':![],'confirm_gate':!![],'refund_requires_approval':![]},'service':{'logistics_mode':'merchant_managed','multi_recipient_allocation':!![]}},'expected_benefits':[{'metric':'Merchant\x20revenue\x20share','expected_value':'97%','evidence':'No\x20platform\x20commission\x20—\x20only\x203%\x20processing\x20fee'},{'metric':'Fund\x20safety','expected_value':'contract-grade','evidence':'Allocation\x20escrow\x20+\x20Guard\x20verification\x20replaces\x20platform\x20custody'},{'metric':'Delivery\x20reliability','expected_value':'high','evidence':'withdraw_guard\x20enforces\x20delivery\x20confirmation\x20before\x20payment'}],'risk_appetite':'balanced','risk_constraints':{'require_arbitration':![],'require_compensation_fund':![],'require_wip_evidence':![],'other_constraints':['Allocation\x20escrow\x20required\x20(withdraw_guard\x20+\x20refund_guard)','Service\x20↔\x20Guard\x20circular\x20dependency\x20requires\x203-step\x20creation\x20pattern']},'applicable_conditions':{'business_scale':'small','min_daily_orders':0x1,'other_conditions':['Independent\x20storefront\x20(no\x20marketplace)','Merchant-managed\x20logistics','Allocation\x20escrow\x20model']},'similar_industries':['retail','subscription'],'novel_capabilities':['Allocation\x20escrow\x20as\x20platform-custody\x20alternative','Multi-recipient\x20allocation\x20(merchant\x20+\x20processor)'],'disabled_builtin_constraints':['require_arbitration','require_compensation_fund','require_wip_evidence']},{'name':'general','display_name':'General','version':'v1','source':'builtin',...fetchTemplate('general'),'analyze':{'key_questions':['Which\x20trust\x20mechanisms\x20(arbitration,\x20compensation\x20fund,\x20WIP\x20evidence)\x20are\x20missing\x20here,\x20and\x20what\x20does\x20each\x20absence\x20cost\x20in\x20the\x20worst\x20case?','What\x20is\x20the\x20single\x20point\x20of\x20failure\x20—\x20who\x20can\x20unilaterally\x20take\x20funds\x20or\x20stall\x20the\x20workflow?']},'capabilities_used':['permission.index_create','machine.node_topology','treasury.owner_receive','allocation.distribute','service.publish','progress.advance'],'expected_benefits':[{'metric':'Flexibility','expected_value':'100%','evidence':'User\x20customizes\x20all\x20trust\x20mechanism\x20parameters'},{'metric':'Degraded\x20safety','expected_value':'usable','evidence':'Can\x20fall\x20back\x20to\x20general\x20at\x20any\x20time'}],'risk_appetite':'balanced','risk_constraints':{'require_arbitration':![],'require_compensation_fund':![],'require_wip_evidence':![]},'applicable_conditions':{'business_scale':'small','other_conditions':['Fallback\x20degraded\x20mode','Hybrid\x20scenarios\x20not\x20covered\x20by\x20other\x20industries']},'similar_industries':[],'novel_capabilities':[],'disabled_builtin_constraints':['require_arbitration','require_compensation_fund','require_wip_evidence']}];
@@ -6,8 +6,8 @@ export declare class IndustryModeRegistry {
6
6
  private aliases;
7
7
  private evaluator;
8
8
  private initialized;
9
- private persistence;
10
- private userModesLoaded;
9
+ private file;
10
+ private userModesSyncedMtime;
11
11
  static Instance(): IndustryModeRegistry;
12
12
  private constructor();
13
13
  registerMode(mode: IndustryMode, aliases?: string[]): boolean;
@@ -1 +1 @@
1
- import{OwnedRecordStorage}from'@wowok/wowok';import{CapabilityRegistry}from'./capability-manifest.js';import{ModeEvaluator}from'./mode-evaluator.js';import{MetricRegistry}from'./metric-registry.js';import{ConstraintRegistry}from'./constraint-registry.js';import{BUILTIN_MODES}from'./modes.js';export class IndustryModeRegistry{static ['instance'];['registrations']=new Map();['userModes']=new Map();['aliases']=new Map();['evaluator'];['initialized']=![];['persistence']=new OwnedRecordStorage('user_modes');['userModesLoaded']=![];static['Instance'](){return!IndustryModeRegistry['instance']&&(IndustryModeRegistry['instance']=new IndustryModeRegistry()),IndustryModeRegistry['instance'];}constructor(){this['evaluator']=new ModeEvaluator(CapabilityRegistry['Instance'](),MetricRegistry['Instance'](),ConstraintRegistry['Instance']()),this['registerBuiltinModes'](),this['initialized']=!![];}['registerMode'](a,b){if(!a['name']||!a['traits']||!a['machine_shape'])return console['warn']('[IndustryModeRegistry]\x20registerMode\x20rejected:\x20invalid\x20mode\x20'+('(name='+(a['name']||'<missing>')+',\x20traits='+(a['traits']?'ok':'<missing>')+',\x20')+('machine_shape='+(a['machine_shape']?'ok':'<missing>')+').')),![];if(this['registrations']['has'](a['name'])){const c=this['registrations']['get'](a['name']);return console['warn']('[IndustryModeRegistry]\x20registerMode\x20rejected:\x20mode\x20\x27'+a['name']+'\x27\x20already\x20registered\x20'+('(registered_at='+new Date(c?.['registered_at']??0x0)['toISOString']()+').\x20')+'Use\x20evolveMode/deriveMode\x20for\x20user\x20modifications,\x20or\x20unregister\x20first.'),![];}this['registrations']['set'](a['name'],{'mode':a,'aliases':b,'enabled':!![],'registered_at':Date['now']()});if(b)for(const d of b){this['aliases']['set'](d,a['name']);}return!![];}['getMode'](a){const b=this['resolveAlias'](a);return this['registrations']['get'](b)?.['mode'];}['listModes'](){return Array['from'](this['registrations']['values']())['filter'](a=>a['enabled'])['map'](a=>a['mode']);}['resolveAlias'](a){return this['aliases']['get'](a)??a;}['hasMode'](a){const b=this['resolveAlias'](a);return this['registrations']['has'](b);}['unregisterMode'](a){const b=this['resolveAlias'](a);if(!this['registrations']['has'](b))return![];this['registrations']['delete'](b);for(const [c,d]of this['aliases']){if(d===b)this['aliases']['delete'](c);}return!![];}async['evaluateModeObject'](a){return await Promise['all']([MetricRegistry['Instance']()['ensureLoaded'](),ConstraintRegistry['Instance']()['ensureLoaded']()]),this['evaluator']['evaluateMode'](a);}async['registerUserMode'](a,b){await this['ensureUserModesLoaded']();if(!a['name']||!a['owner']||!a['machine_shape'])return![];if(a['source']!=='custom')return![];if(a['owner']!==b)return![];const c=this['userModeKey'](a['owner'],a['name']);if(this['registrations']['has'](a['name']))return![];if(this['userModes']['has'](c))return![];return(!a['evolution_history']||a['evolution_history']['length']===0x0)&&(a['evolution_history']=[{'version':a['version']||'v1','changed_at':Date['now'](),'changes':['Initial\x20registration\x20(registerUserMode)']}]),this['userModes']['set'](c,a),await this['persistUserMode'](a),!![];}async['deriveMode'](a,b,c,d,e){await this['ensureUserModesLoaded']();const f=this['getMode'](a);if(!f)return undefined;if(!d||this['registrations']['has'](d))return undefined;const g=this['userModeKey'](c,d);if(this['userModes']['has'](g))return undefined;const h={'name':d,'display_name':e??d,'version':'v1','source':'custom','traits':b['traits']??f['traits'],'machine_shape':b['machine_shape']??f['machine_shape'],'guards':b['guards']??f['guards'],'allocator':b['allocator']??f['allocator'],'risk_checks':b['risk_checks']??f['risk_checks'],'needs':b['needs']??f['needs'],'flywheel':b['flywheel']??f['flywheel'],'key_risk':b['key_risk']??f['key_risk'],'build_notes':b['build_notes']??f['build_notes'],'capabilities_used':b['capabilities_used']??f['capabilities_used'],'config_overrides':b['config_overrides']??f['config_overrides'],'config_override_rules':b['config_override_rules']??f['config_override_rules'],'expected_benefits':b['expected_benefits']??f['expected_benefits'],'risk_appetite':b['risk_appetite']??f['risk_appetite'],'risk_constraints':b['risk_constraints']??f['risk_constraints'],'applicable_conditions':b['applicable_conditions']??f['applicable_conditions'],'similar_industries':b['similar_industries']??f['similar_industries'],'novel_capabilities':b['novel_capabilities']??f['novel_capabilities'],'owner':c,'derived_from':a,'custom_metrics':b['custom_metrics']??f['custom_metrics'],'custom_constraints':b['custom_constraints']??f['custom_constraints'],'evolution_history':[{'version':'v1','changed_at':Date['now'](),'changes':['Derived\x20from\x20builtin\x20\x27'+a+'\x27']}]};return this['userModes']['set'](g,h),await this['persistUserMode'](h),h;}async['evolveMode'](a,b,c,d,e=!![]){await this['ensureUserModesLoaded']();const f=this['userModeKey'](c,a),g=this['userModes']['get'](f);if(!g)return undefined;const h=e?this['bumpPatchVersion'](g['version']):g['version'],i={...g,...b,'name':g['name'],'owner':g['owner'],'source':'custom','derived_from':g['derived_from'],'evolution_history':[...g['evolution_history']??[],{'version':h,'changed_at':Date['now'](),'changes':[d]}],'version':h};return this['userModes']['set'](f,i),await this['persistUserMode'](i),i;}async['listUserModes'](a){await this['ensureUserModesLoaded']();const b=[];for(const c of this['userModes']['values']()){c['owner']===a&&b['push'](c);}return b;}async['getUserMode'](a,b){await this['ensureUserModesLoaded']();const c=this['userModeKey'](b,a);return this['userModes']['get'](c);}async['unregisterUserMode'](a,b){await this['ensureUserModesLoaded']();const c=this['userModeKey'](b,a),d=this['userModes']['delete'](c);return d&&await this['unpersistUserMode'](b,a),d;}['userModeKey'](a,b){return a+':'+b;}async['ensureUserModesLoaded'](){if(this['userModesLoaded'])return;this['userModesLoaded']=!![];try{const a=await this['persistence']['list']();for(const b of a){try{const c=JSON['parse'](b['data']);c?.['name']&&c?.['owner']&&c?.['machine_shape']&&this['userModes']['set'](this['userModeKey'](b['owner'],b['name']),c);}catch{console['warn']('[IndustryModeRegistry]\x20Skipping\x20corrupt\x20user_modes\x20row\x20\x27'+b['owner']+':'+b['name']+'\x27.');}}}catch(d){console['warn']('[IndustryModeRegistry]\x20Failed\x20to\x20load\x20persisted\x20user\x20modes:',d['message']);}}async['persistUserMode'](a){try{await this['persistence']['save'](a['owner'],a['name'],JSON['stringify'](a));}catch(b){console['warn']('[IndustryModeRegistry]\x20Failed\x20to\x20persist\x20user\x20mode\x20\x27'+a['owner']+':'+a['name']+'\x27:',b['message']);}}async['unpersistUserMode'](a,b){try{await this['persistence']['delete'](a,b);}catch(c){console['warn']('[IndustryModeRegistry]\x20Failed\x20to\x20delete\x20persisted\x20user\x20mode\x20\x27'+a+':'+b+'\x27:',c['message']);}}['bumpPatchVersion'](a){const b=a['replace'](/^v/,''),c=b['split']('.');if(c['length']<0x2)return'v'+b+'.1';const d=parseInt(c[0x1]??'0',0xa);return c[0x1]=String(d+0x1),'v'+c['join']('.');}['registerBuiltinModes'](){for(const a of BUILTIN_MODES){this['registerMode'](a);}}}export function getIndustryModeRegistry(){return IndustryModeRegistry['Instance']();}export const INDUSTRY_MODE_REGISTRY_VERSION=2.3;
1
+ import{CustomRegistryFile}from'./custom-registry-file.js';import{CapabilityRegistry}from'./capability-manifest.js';import{ModeEvaluator}from'./mode-evaluator.js';import{MetricRegistry}from'./metric-registry.js';import{ConstraintRegistry}from'./constraint-registry.js';import{BUILTIN_MODES}from'./modes.js';export class IndustryModeRegistry{static ['instance'];['registrations']=new Map();['userModes']=new Map();['aliases']=new Map();['evaluator'];['initialized']=![];['file']=CustomRegistryFile['Instance']();['userModesSyncedMtime']=-0x1;static['Instance'](){return!IndustryModeRegistry['instance']&&(IndustryModeRegistry['instance']=new IndustryModeRegistry()),IndustryModeRegistry['instance'];}constructor(){this['evaluator']=new ModeEvaluator(CapabilityRegistry['Instance'](),MetricRegistry['Instance'](),ConstraintRegistry['Instance']()),this['registerBuiltinModes'](),this['initialized']=!![];}['registerMode'](a,b){if(!a['name']||!a['traits']||!a['machine_shape'])return console['warn']('[IndustryModeRegistry]\x20registerMode\x20rejected:\x20invalid\x20mode\x20'+('(name='+(a['name']||'<missing>')+',\x20traits='+(a['traits']?'ok':'<missing>')+',\x20')+('machine_shape='+(a['machine_shape']?'ok':'<missing>')+').')),![];if(this['registrations']['has'](a['name'])){const c=this['registrations']['get'](a['name']);return console['warn']('[IndustryModeRegistry]\x20registerMode\x20rejected:\x20mode\x20\x27'+a['name']+'\x27\x20already\x20registered\x20'+('(registered_at='+new Date(c?.['registered_at']??0x0)['toISOString']()+').\x20')+'Use\x20evolveMode/deriveMode\x20for\x20user\x20modifications,\x20or\x20unregister\x20first.'),![];}this['registrations']['set'](a['name'],{'mode':a,'aliases':b,'enabled':!![],'registered_at':Date['now']()});if(b)for(const d of b){this['aliases']['set'](d,a['name']);}return!![];}['getMode'](a){const b=this['resolveAlias'](a);return this['registrations']['get'](b)?.['mode'];}['listModes'](){return Array['from'](this['registrations']['values']())['filter'](a=>a['enabled'])['map'](a=>a['mode']);}['resolveAlias'](a){return this['aliases']['get'](a)??a;}['hasMode'](a){const b=this['resolveAlias'](a);return this['registrations']['has'](b);}['unregisterMode'](a){const b=this['resolveAlias'](a);if(!this['registrations']['has'](b))return![];this['registrations']['delete'](b);for(const [c,d]of this['aliases']){if(d===b)this['aliases']['delete'](c);}return!![];}async['evaluateModeObject'](a){return await Promise['all']([MetricRegistry['Instance']()['ensureLoaded'](),ConstraintRegistry['Instance']()['ensureLoaded']()]),this['evaluator']['evaluateMode'](a);}async['registerUserMode'](a,b){await this['ensureUserModesLoaded']();if(!a['name']||!a['owner']||!a['machine_shape'])return![];if(a['source']!=='custom')return![];if(a['owner']!==b)return![];const c=this['userModeKey'](a['owner'],a['name']);if(this['registrations']['has'](a['name']))return![];if(this['userModes']['has'](c))return![];return(!a['evolution_history']||a['evolution_history']['length']===0x0)&&(a['evolution_history']=[{'version':a['version']||'v1','changed_at':Date['now'](),'changes':['Initial\x20registration\x20(registerUserMode)']}]),this['userModes']['set'](c,a),await this['persistUserMode'](a),!![];}async['deriveMode'](a,b,c,d,e){await this['ensureUserModesLoaded']();const f=this['getMode'](a);if(!f)return undefined;if(!d||this['registrations']['has'](d))return undefined;const g=this['userModeKey'](c,d);if(this['userModes']['has'](g))return undefined;const h={'name':d,'display_name':e??d,'version':'v1','source':'custom','traits':b['traits']??f['traits'],'machine_shape':b['machine_shape']??f['machine_shape'],'guards':b['guards']??f['guards'],'allocator':b['allocator']??f['allocator'],'risk_checks':b['risk_checks']??f['risk_checks'],'needs':b['needs']??f['needs'],'flywheel':b['flywheel']??f['flywheel'],'key_risk':b['key_risk']??f['key_risk'],'build_notes':b['build_notes']??f['build_notes'],'analyze':b['analyze']??f['analyze'],'capabilities_used':b['capabilities_used']??f['capabilities_used'],'config_overrides':b['config_overrides']??f['config_overrides'],'config_override_rules':b['config_override_rules']??f['config_override_rules'],'expected_benefits':b['expected_benefits']??f['expected_benefits'],'risk_appetite':b['risk_appetite']??f['risk_appetite'],'risk_constraints':b['risk_constraints']??f['risk_constraints'],'applicable_conditions':b['applicable_conditions']??f['applicable_conditions'],'similar_industries':b['similar_industries']??f['similar_industries'],'novel_capabilities':b['novel_capabilities']??f['novel_capabilities'],'owner':c,'derived_from':a,'custom_metrics':b['custom_metrics']??f['custom_metrics'],'custom_constraints':b['custom_constraints']??f['custom_constraints'],'evolution_history':[{'version':'v1','changed_at':Date['now'](),'changes':['Derived\x20from\x20builtin\x20\x27'+a+'\x27']}]};return this['userModes']['set'](g,h),await this['persistUserMode'](h),h;}async['evolveMode'](a,b,c,d,e=!![]){await this['ensureUserModesLoaded']();const f=this['userModeKey'](c,a),g=this['userModes']['get'](f);if(!g)return undefined;const h=e?this['bumpPatchVersion'](g['version']):g['version'],i={...g,...b,'name':g['name'],'owner':g['owner'],'source':'custom','derived_from':g['derived_from'],'evolution_history':[...g['evolution_history']??[],{'version':h,'changed_at':Date['now'](),'changes':[d]}],'version':h};return this['userModes']['set'](f,i),await this['persistUserMode'](i),i;}async['listUserModes'](a){await this['ensureUserModesLoaded']();const b=[];for(const c of this['userModes']['values']()){c['owner']===a&&b['push'](c);}return b;}async['getUserMode'](a,b){await this['ensureUserModesLoaded']();const c=this['userModeKey'](b,a);return this['userModes']['get'](c);}async['unregisterUserMode'](a,b){await this['ensureUserModesLoaded']();const c=this['userModeKey'](b,a),d=this['userModes']['delete'](c);return d&&await this['unpersistUserMode'](b,a),d;}['userModeKey'](a,b){return a+':'+b;}async['ensureUserModesLoaded'](){const {data:a,mtime:b}=await this['file']['read']();if(b<0x0||b===this['userModesSyncedMtime'])return;this['userModesSyncedMtime']=b,this['userModes']['clear']();for(const [c,d]of Object['entries'](a['user_modes'])){const e=d;e?.['name']&&e?.['owner']&&e?.['machine_shape']?this['userModes']['set'](c,e):console['warn']('[IndustryModeRegistry]\x20Skipping\x20invalid\x20user_modes\x20file\x20entry\x20\x27'+c+'\x27.');}}async['persistUserMode'](a){await this['file']['update'](b=>{b['user_modes'][this['userModeKey'](a['owner'],a['name'])]=a;});}async['unpersistUserMode'](a,b){await this['file']['update'](c=>{delete c['user_modes'][this['userModeKey'](a,b)];});}['bumpPatchVersion'](a){const b=a['replace'](/^v/,''),c=b['split']('.');if(c['length']<0x2)return'v'+b+'.1';const d=parseInt(c[0x1]??'0',0xa);return c[0x1]=String(d+0x1),'v'+c['join']('.');}['registerBuiltinModes'](){for(const a of BUILTIN_MODES){this['registerMode'](a);}}}export function getIndustryModeRegistry(){return IndustryModeRegistry['Instance']();}export const INDUSTRY_MODE_REGISTRY_VERSION=2.3;
@@ -35,6 +35,9 @@ export interface ConfigOverrideRule {
35
35
  else_value?: unknown;
36
36
  };
37
37
  }
38
+ export interface IndustryAnalyzeDefaults {
39
+ key_questions?: string[];
40
+ }
38
41
  export interface IndustryMode {
39
42
  name: string;
40
43
  display_name: string;
@@ -49,6 +52,7 @@ export interface IndustryMode {
49
52
  flywheel: AcquisitionFlywheel;
50
53
  key_risk: string;
51
54
  build_notes?: string[];
55
+ analyze?: IndustryAnalyzeDefaults;
52
56
  capabilities_used: string[];
53
57
  config_overrides?: Record<string, Record<string, unknown>>;
54
58
  config_override_rules?: ConfigOverrideRule[];
@@ -1,6 +1,6 @@
1
1
  import { type GoalClassification } from "./GoalClassifier.js";
2
2
  import { GoalStore } from "./GoalStore.js";
3
- import { type GoalProcessSummary, type GoalRecord, type GoalStage, type GoalType, type ObjectRef } from "./types.js";
3
+ import { type BoundaryQuestion, type GoalBoundaries, type GoalProcessSummary, type GoalRecord, type GoalStage, type GoalType, type NextStepOption, type ObjectRef, type PursueReport } from "./types.js";
4
4
  import { type FeedbackRecord, type ProblemRecord, type ProcessEvent, type ProcessManifest, type ProcessStageState, type SuggestionRecord } from "../task/types.js";
5
5
  import type { UserIntentSignature } from "../experience/types.js";
6
6
  import { type SubscriptionStore } from "../monitor/SubscriptionStore.js";
@@ -150,6 +150,18 @@ export declare class GoalEngine {
150
150
  apply_error?: string;
151
151
  complete_report?: GoalCompletionVerdict;
152
152
  }>;
153
+ boundariesView(network: string, id: string): Promise<{
154
+ goal: GoalRecord;
155
+ boundaries?: GoalBoundaries;
156
+ questions: BoundaryQuestion[];
157
+ missing: string[];
158
+ }>;
159
+ setBoundaries(network: string, id: string, patch: Partial<GoalBoundaries>): Promise<GoalRecord>;
160
+ pursue(network: string, id: string): Promise<PursueReport>;
161
+ nextSteps(network: string, id: string): Promise<{
162
+ goal: GoalRecord;
163
+ steps: NextStepOption[];
164
+ }>;
153
165
  private emitSuggestionEvent;
154
166
  list(network: string, filter?: {
155
167
  stage?: GoalStage;
@@ -1 +1 @@
1
- import{classifyGoal}from'./GoalClassifier.js';import{goalStore}from'./GoalStore.js';import{isTerminalStage,newGoalId,stageIndex}from'./types.js';import{GENERIC_PLAYBOOK,playbookForGoalType}from'../task/playbook.js';import{PROCESS_SCHEMA_VERSION,newProcessId}from'../task/types.js';import{addFeedback,addSuggestion,appendEvent,deleteProcessDir,initProcess,listFeedback,listProblems,listSuggestions,loadManifest,loadStageState,processesRootDir,readEvents,saveManifest,updateSuggestion}from'../task/ProcessStore.js';import{recordSignature}from'../experience/index.js';import{join}from'path';import{registerPlanApproval,revokePlanApproval}from'./plan-approval.js';import{subscriptionStore}from'../monitor/SubscriptionStore.js';import{createIntent,removeIntent}from'../intent/index.js';import{listLocalAccounts}from'../knowledge/workflow-guidance.js';import{evaluateGoalCompletion}from'../knowledge/goal-completion.js';export const GOAL_PLAYBOOKS={'publish_service':'wowok-provider','fulfill_order':'wowok-provider','capture_demand':'wowok-market','purchase_service':'wowok-order','collaborate_flow':'wowok-collaborator','supply_suborder':'wowok-supplier','publish_demand':'wowok-order','run_arbitration':'wowok-arbitrator','dispute_resolution':'wowok-order','manage_assets':'wowok-governance'};export const PLAN_APPROVAL_COVERS_LEVELS=['standard','none'];export const ADOPT_JACCARD_THRESHOLD=0.6;export function tokenizeIntent(a){const b=new Set(),c=(a??'')['toLowerCase']();for(const d of c['matchAll'](/[a-z0-9]+/g))b['add'](d[0x0]);for(const e of c['matchAll'](/[\u3400-\u9fff\uf900-\ufaff]/g))b['add'](e[0x0]);return b;}export function jaccard(c,d){if(c['size']===0x0||d['size']===0x0)return 0x0;let e=0x0;for(const f of c)if(d['has'](f))e++;return e/(c['size']+d['size']-e);}function deriveTitle(a){const b=(intent_text_first_line(a)||'Untitled\x20goal')['trim']();return b['length']>0x3c?b['slice'](0x0,0x39)+'…':b;}function intent_text_first_line(a){return(a??'')['split'](/\r?\n/,0x1)[0x0]??'';}function newApprovalId(){return'appr_'+Date['now']()['toString'](0x24)+Math['random']()['toString'](0x24)['slice'](0x2,0x8);}export class GoalEngine{['deps'];constructor(a){this['deps']=a;}async['createOrAdopt'](a){const b=a['network']??'default',c=(a['intent_text']??'')['trim']();if(!c)throw new Error('create_or_adopt\x20requires\x20non-empty\x20intent_text');let d=a['goal_type'],f;if(!d){f=classifyGoal(c),d=f['goal_type']??undefined;if(!d)return{'adopted':![],'classification':f,'needs_type':!![]};}const h=await this['deps']['store']['list'](b),i=a['account']??'',j=tokenizeIntent(c);let k;for(const r of h){if(isTerminalStage(r['stage']))continue;if(r['goal_type']!==d)continue;if((r['binding']?.['account']??'')!==i)continue;const s=jaccard(j,tokenizeIntent(r['intent_text']));s>=ADOPT_JACCARD_THRESHOLD&&(!k||s>k['sim'])&&(k={'goal':r,'sim':s});}if(k)return{'goal':k['goal'],'adopted':!![],'classification':f};const l=Date['now']();let m,n='recognized';if(a['account']){const t=await this['preflightAccount'](a['account']);m={'account':a['account'],'persona':a['persona'],'preflight':t},n='bound';}const o={'id':newGoalId(),'goal_type':d,'title':a['title']?.['trim']()||deriveTitle(c),'intent_text':c,...a['conversation_id']?{'conversation_id':a['conversation_id']}:{},'binding':m,'objects':[],'monitor':{'focus_ids':[],'intent_ids':[]},'stage':n,'playbook':GOAL_PLAYBOOKS[d],'approvals':[],'created_at':l,'updated_at':l};await this['deps']['store']['create'](b,o);const p=[],q=playbookForGoalType(d);if(q['name']!==GENERIC_PLAYBOOK||a['create_process']===!![])try{const u=newProcessId(),v=join(this['deps']['processes']['rootDir'](),u),w=new Date(l)['toISOString']();this['deps']['processes']['initProcess'](v,{'schema_version':PROCESS_SCHEMA_VERSION,'mcp_version':'unknown','process_id':u,'playbook':q['name'],'goal_id':o['id'],'title':o['title'],'network':b,'objects':[],'created_at':w,'updated_at':w,'archived':![]},q['stages']),o['process']={'id':u,'playbook':q['name'],'dir':v},o['process_ref']=u,await this['deps']['store']['save'](b,o);}catch(x){p['push']('process\x20creation\x20failed\x20(goal\x20kept\x20without\x20process):\x20'+(x instanceof Error?x['message']:String(x)));}return{'goal':o,'adopted':![],'classification':f,...p['length']?{'warnings':p}:{}};}async['preflightAccount'](a){const b=[];let c;try{const d=await this['deps']['listLocalAccounts']();c=d['find'](f=>f['address']===a||f['name']===a);}catch(f){b['push']('local\x20account\x20lookup\x20failed:\x20'+(f instanceof Error?f['message']:String(f)));}if(c){if(c['address']!==a)b['push']('resolved\x20\x27'+a+'\x27\x20to\x20'+c['address']);}else b['push']('account\x20\x27'+a+'\x27\x20not\x20found\x20among\x20local\x20accounts');return{'account_found':Boolean(c),'notes':b};}async['approve'](a,b,c){const d=await this['mustGet'](a,b);if(isTerminalStage(d['stage']))throw new Error('goal\x20'+b+'\x20is\x20terminal\x20('+d['stage']+')');const e={'id':newApprovalId(),'approved_at':Date['now'](),'scope':'plan','covers_levels':[...PLAN_APPROVAL_COVERS_LEVELS],...c?{'note':c}:{}};d['approvals']['push'](e),registerPlanApproval(d['id']);const f=stageIndex(d['stage']);if(f>=0x0&&f<stageIndex('approved'))d['stage']='approved';return d['updated_at']=Date['now'](),this['deps']['store']['save'](a,d);}async['bind'](a,b,c,d){const e=await this['mustGet'](a,b);if(isTerminalStage(e['stage']))throw new Error('goal\x20'+b+'\x20is\x20terminal\x20('+e['stage']+')');if(!c?.['trim']())throw new Error('bind\x20requires\x20a\x20non-empty\x20account');const f=await this['preflightAccount'](c['trim']());e['binding']={'account':c['trim'](),...d?.['trim']()?{'persona':d['trim']()}:{},'preflight':f};const g=stageIndex(e['stage']);if(g>=0x0&&g<stageIndex('bound'))e['stage']='bound';return e['updated_at']=Date['now'](),this['deps']['store']['save'](a,e);}async['advance'](a,b,c={}){const d=await this['mustGet'](a,b);if(isTerminalStage(d['stage']))throw new Error('goal\x20'+b+'\x20is\x20terminal\x20('+d['stage']+')');const e=[];for(const g of c['objects']??[]){const h=d['objects']['some'](i=>i['type']===g['type']&&i['object']['toLowerCase']()===g['object']['toLowerCase']());!h&&(d['objects']['push']({'type':g['type'],'object':g['object']}),e['push']({'type':g['type'],'object':g['object']}));}const f=c['stage'];if(f){this['assertTransition'](d['stage'],f);const i=f==='monitoring'&&d['stage']!=='monitoring';d['stage']=f,d['updated_at']=Date['now']();if(i)await this['autoBindMonitor'](a,d);if(i)this['emitProcessEvent'](d,'goal_monitoring','goal\x20entered\x20monitoring');}else{if((c['objects']??[])['length']===0x0)throw new Error('advance\x20requires\x20a\x20target\x20stage\x20and/or\x20objects');}return e['length']>0x0&&d['process']&&this['registerProcessObjects'](d,e),d['updated_at']=Date['now'](),this['deps']['store']['save'](a,d);}async['registerActObjects'](a,b,c='default'){if(b['length']===0x0)return 0x0;try{let d=c,e=await this['deps']['store']['get'](d,a);if(!e&&d!=='default'){e=await this['deps']['store']['get']('default',a);if(e)d='default';}if(!e||isTerminalStage(e['stage']))return 0x0;const f=e['objects']['length'],g=await this['advance'](d,a,{'objects':b});return g['objects']['length']-f;}catch{return 0x0;}}async['recordCommunicationEvidence'](a,b,c='default'){try{let d=await this['deps']['store']['get'](c,a);!d&&c!=='default'&&(d=await this['deps']['store']['get']('default',a));if(!d||isTerminalStage(d['stage'])||!d['process'])return![];return this['deps']['processes']['appendEvent'](d['process']['dir'],{'timestamp':new Date()['toISOString'](),'event':'communication_evidence','reason':''+b['title'],'data':{'operation':b['operation'],'kind':b['kind'],...b['detail']?{'detail':b['detail']}:{},...b['data']??{}}}),!![];}catch{return![];}}['registerProcessObjects'](a,b){try{const c=a['process']['dir'],d=this['deps']['processes']['loadManifest'](c);for(const e of b){const f=d['objects']['some'](g=>g['type']===e['type']&&g['object']['toLowerCase']()===e['object']['toLowerCase']());if(!f)d['objects']['push']({'type':e['type'],'object':e['object']});}this['deps']['processes']['saveManifest'](c,d),this['deps']['processes']['appendEvent'](c,{'timestamp':new Date()['toISOString'](),'event':'objects_registered','reason':b['length']+'\x20object(s)\x20registered\x20by\x20goal\x20'+a['id'],'data':{'added':b['map'](g=>g['type']+':'+g['object'])}});}catch{}}['emitProcessEvent'](a,b,c){if(!a['process'])return;try{this['deps']['processes']['appendEvent'](a['process']['dir'],{'timestamp':new Date()['toISOString'](),'event':b,'reason':c});}catch{}}['distillOutcome'](a,b){try{const c={'playbook':a['process']?.['playbook'],'objects_count':a['objects']['length']};if(a['process']){const d=this['deps']['processes']['loadStageState'](a['process']['dir']),e=d?.['stages']['filter'](h=>d['stage_meta'][h]?.['committed'])['length'];if(e!==undefined)c['stages_completed']=e;const f=this['deps']['processes']['listProblems'](a['process']['dir']),g=this['deps']['processes']['listFeedback'](a['process']['dir']);c['problems_open']=f['filter'](h=>h['status']==='open')['length'],c['problems_resolved']=f['filter'](h=>h['status']==='resolved')['length'],c['feedback_positive']=g['filter'](h=>h['sentiment']==='positive')['length'],c['feedback_negative']=g['filter'](h=>h['sentiment']==='negative')['length'];}this['deps']['recordSignature']({'intent':a['goal_type'],'signals':c,'timestamp':Date['now'](),'outcome':b});}catch{}}['assertTransition'](a,b){if(isTerminalStage(a))throw new Error('goal\x20is\x20terminal\x20('+a+')');if(b==='abandoned')throw new Error('use\x20the\x20abandon\x20action\x20to\x20abandon\x20a\x20goal');if(b==='paused')return;if(a==='paused')return;if(b===a)return;const c=stageIndex(a),d=stageIndex(b);if(d<0x0||c<0x0||d<c)throw new Error('invalid\x20stage\x20transition:\x20'+a+'\x20→\x20'+b+'\x20(forward-only\x20along\x20'+'recognized→confirmed→bound→planned→approved→acting→monitoring→completed'+')');}async['pause'](a,b){return this['advance'](a,b,{'stage':'paused'});}async['autoBindMonitor'](a,b){const c=await this['deps']['subscriptionStore']['getConfig'](a),d=c['scope']['focus_objects']['map'](g=>({...g})),e=Date['now']();for(const f of b['objects']){const g=d['some'](h=>h['object']===f['object']&&h['goal_id']===b['id']);if(g)continue;d['push']({'object':f['object'],'added_at':e,'reason':'goal','closure':!![],'goal_id':b['id'],'note':b['title']});if(!b['monitor']['focus_ids']['includes'](f['object']))b['monitor']['focus_ids']['push'](f['object']);}await this['deps']['subscriptionStore']['saveConfig'](a,{'scope':{...c['scope'],'focus_objects':d}});if((b['goal_type']==='capture_demand'||b['goal_type']==='publish_demand')&&b['monitor']['intent_ids']['length']===0x0){const h=await this['deps']['createIntent']({'intent':b['intent_text'],'account':b['binding']?.['account']});b['monitor']['intent_ids']['push'](h['id']);}}async['complete'](a,b,c={}){const d=await this['mustGet'](a,b);if(isTerminalStage(d['stage']))throw new Error('goal\x20'+b+'\x20is\x20terminal\x20('+d['stage']+')');const e=await this['deps']['evaluateCompletion'](d,a),f=c['force']===!![];if(!e['complete']&&!f)return{'goal':d,'completed':![],'verify_report':e};const g=await this['teardown'](a,d);d['stage']='completed',d['outcome']={'success':e['complete']||f,'completed_at':Date['now'](),'verify_report':e,...!e['complete']&&f?{'forced':!![]}:{}},d['updated_at']=Date['now']();if(d['process']){if(c['feedback'])try{this['deps']['processes']['addFeedback'](d['process']['dir'],{'source':'user','sentiment':c['feedback']['sentiment'],'comment':c['feedback']['comment']});}catch{g['push']('feedback\x20recording\x20failed');}this['emitProcessEvent'](d,'goal_completed','goal\x20completed\x20('+d['title']+')');}this['distillOutcome'](d,'success');const h=await this['deps']['store']['save'](a,d);return{'goal':h,'completed':!![],'verify_report':e,'teardown_notes':g['length']?g:undefined};}async['abandon'](a,b,c){const d=await this['mustGet'](a,b);if(isTerminalStage(d['stage']))throw new Error('goal\x20'+b+'\x20is\x20already\x20terminal\x20('+d['stage']+')');const e=await this['teardown'](a,d);d['stage']='abandoned',d['outcome']={'success':![],'completed_at':Date['now'](),...c?{'verify_report':{'reason':c}}:{}},d['updated_at']=Date['now'](),this['emitProcessEvent'](d,'goal_abandoned',c??'goal\x20abandoned'),this['distillOutcome'](d,'failed');const f=await this['deps']['store']['save'](a,d);return{'goal':f,'teardown_notes':e['length']?e:undefined};}async['remove'](a,b,c={}){const d=await this['mustGet'](a,b);let e;if(!isTerminalStage(d['stage'])){if(c['force']!==!![])throw new Error('goal\x20'+b+'\x20is\x20not\x20terminal\x20('+d['stage']+')\x20—\x20complete/abandon\x20it\x20first,\x20or\x20pass\x20force=true');await this['teardown'](a,d),e=!![];}let f;if(d['process'])try{this['deps']['processes']['removeDir'](d['process']['dir']),f=!![];}catch{f=![];}const g=await this['deps']['store']['remove'](a,b);return{'deleted':g,...e!==undefined?{'tore_down_active':e}:{},...f!==undefined?{'process_removed':f}:{}};}async['teardown'](a,b){const c=[];try{const d=await this['deps']['subscriptionStore']['getConfig'](a),f=d['scope']['focus_objects']['filter'](g=>g['goal_id']!==b['id']);f['length']!==d['scope']['focus_objects']['length']&&await this['deps']['subscriptionStore']['saveConfig'](a,{'scope':{...d['scope'],'focus_objects':f}});}catch(g){c['push']('focus\x20teardown\x20failed:\x20'+(g instanceof Error?g['message']:String(g)));}revokePlanApproval(b['id']);for(const h of b['monitor']['intent_ids']){try{await this['deps']['removeIntent'](h);}catch(i){c['push']('intent\x20teardown\x20failed\x20('+h+'):\x20'+(i instanceof Error?i['message']:String(i)));}}return c;}async['get'](a,b){const c=await this['mustGet'](a,b);if(!c['process'])return c;try{return{...c,'process_summary':this['summarizeProcess'](c['process']['dir'],c['process']['id'],c['process']['playbook'])};}catch{return c;}}['summarizeProcess'](a,b,c){const d=this['deps']['processes']['loadStageState'](a),e=this['deps']['processes']['listProblems'](a,{'status':'open'}),f={'critical':0x0,'high':0x1,'medium':0x2,'low':0x3},g=[...e]['sort']((i,j)=>f[i['severity']]-f[j['severity']])['slice'](0x0,0x3)['map'](i=>i['title']),h=this['deps']['processes']['listSuggestions'](a,{'status':'pending'});return{'id':b,'playbook':c,'current_stage':d?.['current_stage']??'unknown','stages':(d?.['stages']??[])['map'](i=>({'name':i,'committed':d?.['stage_meta'][i]?.['committed']??![],'completion':d?.['stage_meta'][i]?.['completion']??0x0})),'open_problems':{'count':e['length'],'top':g},'pending_suggestions':{'count':h['length'],'top':h['slice'](0x0,0x3)['map'](i=>i['title'])},'last_events':this['deps']['processes']['readEvents'](a)['slice'](-0x5),'feedback_count':this['deps']['processes']['listFeedback'](a)['length']};}async['listSuggestions'](a,b,c={}){const d=await this['mustGet'](a,b);if(!d['process'])return{'goal':d,'suggestions':[],'open_problems':[]};const e=this['deps']['processes']['listSuggestions'](d['process']['dir']),f=c['include_resolved']?e:e['filter'](h=>h['status']==='pending'),g=this['deps']['processes']['listProblems'](d['process']['dir'],{'status':'open'});return{'goal':d,'suggestions':f,'open_problems':g};}async['resolveSuggestion'](a,b,c,d){const f=await this['mustGet'](a,b);if(!f['process'])throw new Error('goal\x20'+b+'\x20has\x20no\x20TaskProcess\x20(no\x20suggestion\x20stream)');const g=f['process']['dir'],h=this['deps']['processes']['listSuggestions'](g)['find'](n=>n['id']===c);if(!h)throw new Error('suggestion\x20not\x20found:\x20'+c);if(h['status']!=='pending')throw new Error('suggestion\x20'+c+'\x20already\x20resolved\x20('+h['status']+')');if(d['decision']==='dismiss'){const n=this['deps']['processes']['updateSuggestion'](g,c,{'status':'dismissed',...d['note']?{'resolution_note':d['note']}:{}});return this['emitSuggestionEvent'](f,'suggestion_dismissed',h,d['note']),{'goal':f,'suggestion':n,'applied':![]};}if(d['apply']!==!![]){const o=this['deps']['processes']['updateSuggestion'](g,c,{'status':'confirmed',...d['note']?{'resolution_note':d['note']}:{}});return this['emitSuggestionEvent'](f,'suggestion_confirmed',h,d['note']),{'goal':f,'suggestion':o,'applied':![]};}let i,j,k=![];if(h['kind']==='advance_stage'&&h['stage'])try{await this['advance'](a,b,{'stage':h['stage']}),k=!![];}catch(p){i=p instanceof Error?p['message']:String(p);}else{if(h['kind']==='complete_goal')try{const q=await this['complete'](a,b,{});j=q['verify_report'],q['completed']?k=!![]:i='completion\x20conditions\x20unmet:\x20'+(q['verify_report']['missing']['join'](';\x20')||'no\x20evidence');}catch(r){i=r instanceof Error?r['message']:String(r);}else{if(h['kind']==='register_object'&&h['objects']?.['length'])try{await this['advance'](a,b,{'objects':h['objects']}),k=!![];}catch(s){i=s instanceof Error?s['message']:String(s);}else k=!![];}}if(i){const t=await this['mustGet'](a,b);return{'goal':t,'suggestion':h,'applied':![],'apply_error':i};}const l=this['deps']['processes']['updateSuggestion'](g,c,{'status':'confirmed','applied':!![],...d['note']?{'resolution_note':d['note']}:{}});this['emitSuggestionEvent'](f,'suggestion_applied',h,d['note']);const m=await this['mustGet'](a,b);return{'goal':m,'suggestion':l,'applied':!![],...j?{'complete_report':j}:{}};}['emitSuggestionEvent'](a,b,c,d){if(!a['process'])return;try{this['deps']['processes']['appendEvent'](a['process']['dir'],{'timestamp':new Date()['toISOString'](),'event':b,'reason':c['kind']+'\x20\x27'+c['title']+'\x27\x20('+c['id']+')','data':{'suggestion_id':c['id'],'kind':c['kind'],...c['stage']?{'stage':c['stage']}:{},...d?{'note':d}:{}}});}catch{}}async['list'](a,b={}){const [c,d]=await Promise['all']([this['deps']['store']['list'](a,b),this['deps']['store']['counts'](a)]);return{'goals':c,'counts':d};}async['mustGet'](a,b){const c=await this['deps']['store']['get'](a,b);if(!c)throw new Error('goal\x20not\x20found:\x20'+b);return c;}}export const goalEngine=new GoalEngine({'store':goalStore,'subscriptionStore':subscriptionStore,'createIntent':createIntent,'removeIntent':removeIntent,'listLocalAccounts':listLocalAccounts,'evaluateCompletion':(a,b)=>evaluateGoalCompletion(a,b),'processes':{'rootDir':processesRootDir,'initProcess':initProcess,'loadManifest':loadManifest,'saveManifest':saveManifest,'loadStageState':loadStageState,'appendEvent':appendEvent,'addFeedback':addFeedback,'listProblems':listProblems,'listFeedback':listFeedback,'readEvents':readEvents,'addSuggestion':addSuggestion,'updateSuggestion':updateSuggestion,'listSuggestions':listSuggestions,'removeDir':deleteProcessDir},'recordSignature':recordSignature});
1
+ import{classifyGoal}from'./GoalClassifier.js';import{goalStore}from'./GoalStore.js';import{GOAL_AUTONOMY_LEVELS,isTerminalStage,newGoalId,stageIndex}from'./types.js';import{goalBoundaryQuestions,pursueTick}from'./pursue.js';import{nextStepsForGoal}from'./next-steps.js';import{GENERIC_PLAYBOOK,playbookForGoalType}from'../task/playbook.js';import{PROCESS_SCHEMA_VERSION,newProcessId}from'../task/types.js';import{addFeedback,addSuggestion,appendEvent,deleteProcessDir,initProcess,listFeedback,listProblems,listSuggestions,loadManifest,loadStageState,processesRootDir,readEvents,saveManifest,updateSuggestion}from'../task/ProcessStore.js';import{recordSignature}from'../experience/index.js';import{join}from'path';import{registerPlanApproval,revokePlanApproval}from'./plan-approval.js';import{subscriptionStore}from'../monitor/SubscriptionStore.js';import{createIntent,removeIntent}from'../intent/index.js';import{listLocalAccounts}from'../knowledge/workflow-guidance.js';import{evaluateGoalCompletion}from'../knowledge/goal-completion.js';export const GOAL_PLAYBOOKS={'publish_service':'wowok-provider','fulfill_order':'wowok-provider','capture_demand':'wowok-market','purchase_service':'wowok-order','collaborate_flow':'wowok-collaborator','supply_suborder':'wowok-supplier','publish_demand':'wowok-order','run_arbitration':'wowok-arbitrator','dispute_resolution':'wowok-order','manage_assets':'wowok-governance'};export const PLAN_APPROVAL_COVERS_LEVELS=['standard','none'];export const ADOPT_JACCARD_THRESHOLD=0.6;export function tokenizeIntent(a){const b=new Set(),c=(a??'')['toLowerCase']();for(const d of c['matchAll'](/[a-z0-9]+/g))b['add'](d[0x0]);for(const e of c['matchAll'](/[\u3400-\u9fff\uf900-\ufaff]/g))b['add'](e[0x0]);return b;}export function jaccard(c,d){if(c['size']===0x0||d['size']===0x0)return 0x0;let e=0x0;for(const f of c)if(d['has'](f))e++;return e/(c['size']+d['size']-e);}function deriveTitle(a){const b=(intent_text_first_line(a)||'Untitled\x20goal')['trim']();return b['length']>0x3c?b['slice'](0x0,0x39)+'…':b;}function intent_text_first_line(a){return(a??'')['split'](/\r?\n/,0x1)[0x0]??'';}function newApprovalId(){return'appr_'+Date['now']()['toString'](0x24)+Math['random']()['toString'](0x24)['slice'](0x2,0x8);}export class GoalEngine{['deps'];constructor(a){this['deps']=a;}async['createOrAdopt'](a){const b=a['network']??'default',c=(a['intent_text']??'')['trim']();if(!c)throw new Error('create_or_adopt\x20requires\x20non-empty\x20intent_text');let d=a['goal_type'],f;if(!d){f=classifyGoal(c),d=f['goal_type']??undefined;if(!d)return{'adopted':![],'classification':f,'needs_type':!![]};}const h=await this['deps']['store']['list'](b),i=a['account']??'',j=tokenizeIntent(c);let k;for(const r of h){if(isTerminalStage(r['stage']))continue;if(r['goal_type']!==d)continue;if((r['binding']?.['account']??'')!==i)continue;const s=jaccard(j,tokenizeIntent(r['intent_text']));s>=ADOPT_JACCARD_THRESHOLD&&(!k||s>k['sim'])&&(k={'goal':r,'sim':s});}if(k)return{'goal':k['goal'],'adopted':!![],'classification':f};const l=Date['now']();let m,n='recognized';if(a['account']){const t=await this['preflightAccount'](a['account']);m={'account':a['account'],'persona':a['persona'],'preflight':t},n='bound';}const o={'id':newGoalId(),'goal_type':d,'title':a['title']?.['trim']()||deriveTitle(c),'intent_text':c,...a['conversation_id']?{'conversation_id':a['conversation_id']}:{},'binding':m,'objects':[],'monitor':{'focus_ids':[],'intent_ids':[]},'stage':n,'playbook':GOAL_PLAYBOOKS[d],'approvals':[],'created_at':l,'updated_at':l};await this['deps']['store']['create'](b,o);const p=[],q=playbookForGoalType(d);if(q['name']!==GENERIC_PLAYBOOK||a['create_process']===!![])try{const u=newProcessId(),v=join(this['deps']['processes']['rootDir'](),u),w=new Date(l)['toISOString']();this['deps']['processes']['initProcess'](v,{'schema_version':PROCESS_SCHEMA_VERSION,'mcp_version':'unknown','process_id':u,'playbook':q['name'],'goal_id':o['id'],'title':o['title'],'network':b,'objects':[],'created_at':w,'updated_at':w,'archived':![]},q['stages']),o['process']={'id':u,'playbook':q['name'],'dir':v},o['process_ref']=u,await this['deps']['store']['save'](b,o);}catch(x){p['push']('process\x20creation\x20failed\x20(goal\x20kept\x20without\x20process):\x20'+(x instanceof Error?x['message']:String(x)));}return{'goal':o,'adopted':![],'classification':f,...p['length']?{'warnings':p}:{}};}async['preflightAccount'](a){const b=[];let c;try{const d=await this['deps']['listLocalAccounts']();c=d['find'](f=>f['address']===a||f['name']===a);}catch(f){b['push']('local\x20account\x20lookup\x20failed:\x20'+(f instanceof Error?f['message']:String(f)));}if(c){if(c['address']!==a)b['push']('resolved\x20\x27'+a+'\x27\x20to\x20'+c['address']);}else b['push']('account\x20\x27'+a+'\x27\x20not\x20found\x20among\x20local\x20accounts');return{'account_found':Boolean(c),'notes':b};}async['approve'](a,b,c){const d=await this['mustGet'](a,b);if(isTerminalStage(d['stage']))throw new Error('goal\x20'+b+'\x20is\x20terminal\x20('+d['stage']+')');const e={'id':newApprovalId(),'approved_at':Date['now'](),'scope':'plan','covers_levels':[...PLAN_APPROVAL_COVERS_LEVELS],...c?{'note':c}:{}};d['approvals']['push'](e),registerPlanApproval(d['id']);const f=stageIndex(d['stage']);if(f>=0x0&&f<stageIndex('approved'))d['stage']='approved';return d['updated_at']=Date['now'](),this['deps']['store']['save'](a,d);}async['bind'](a,b,c,d){const e=await this['mustGet'](a,b);if(isTerminalStage(e['stage']))throw new Error('goal\x20'+b+'\x20is\x20terminal\x20('+e['stage']+')');if(!c?.['trim']())throw new Error('bind\x20requires\x20a\x20non-empty\x20account');const f=await this['preflightAccount'](c['trim']());e['binding']={'account':c['trim'](),...d?.['trim']()?{'persona':d['trim']()}:{},'preflight':f};const g=stageIndex(e['stage']);if(g>=0x0&&g<stageIndex('bound'))e['stage']='bound';return e['updated_at']=Date['now'](),this['deps']['store']['save'](a,e);}async['advance'](a,b,c={}){const d=await this['mustGet'](a,b);if(isTerminalStage(d['stage']))throw new Error('goal\x20'+b+'\x20is\x20terminal\x20('+d['stage']+')');const e=[];for(const g of c['objects']??[]){const h=d['objects']['some'](i=>i['type']===g['type']&&i['object']['toLowerCase']()===g['object']['toLowerCase']());!h&&(d['objects']['push']({'type':g['type'],'object':g['object']}),e['push']({'type':g['type'],'object':g['object']}));}const f=c['stage'];if(f){this['assertTransition'](d['stage'],f);const i=f==='monitoring'&&d['stage']!=='monitoring';d['stage']=f,d['updated_at']=Date['now']();if(i)await this['autoBindMonitor'](a,d);if(i)this['emitProcessEvent'](d,'goal_monitoring','goal\x20entered\x20monitoring');}else{if((c['objects']??[])['length']===0x0)throw new Error('advance\x20requires\x20a\x20target\x20stage\x20and/or\x20objects');}return e['length']>0x0&&d['process']&&this['registerProcessObjects'](d,e),d['updated_at']=Date['now'](),this['deps']['store']['save'](a,d);}async['registerActObjects'](a,b,c='default'){if(b['length']===0x0)return 0x0;try{let d=c,e=await this['deps']['store']['get'](d,a);if(!e&&d!=='default'){e=await this['deps']['store']['get']('default',a);if(e)d='default';}if(!e||isTerminalStage(e['stage']))return 0x0;const f=e['objects']['length'],g=await this['advance'](d,a,{'objects':b});return g['objects']['length']-f;}catch{return 0x0;}}async['recordCommunicationEvidence'](a,b,c='default'){try{let d=await this['deps']['store']['get'](c,a);!d&&c!=='default'&&(d=await this['deps']['store']['get']('default',a));if(!d||isTerminalStage(d['stage'])||!d['process'])return![];return this['deps']['processes']['appendEvent'](d['process']['dir'],{'timestamp':new Date()['toISOString'](),'event':'communication_evidence','reason':''+b['title'],'data':{'operation':b['operation'],'kind':b['kind'],...b['detail']?{'detail':b['detail']}:{},...b['data']??{}}}),!![];}catch{return![];}}['registerProcessObjects'](a,b){try{const c=a['process']['dir'],d=this['deps']['processes']['loadManifest'](c);for(const e of b){const f=d['objects']['some'](g=>g['type']===e['type']&&g['object']['toLowerCase']()===e['object']['toLowerCase']());if(!f)d['objects']['push']({'type':e['type'],'object':e['object']});}this['deps']['processes']['saveManifest'](c,d),this['deps']['processes']['appendEvent'](c,{'timestamp':new Date()['toISOString'](),'event':'objects_registered','reason':b['length']+'\x20object(s)\x20registered\x20by\x20goal\x20'+a['id'],'data':{'added':b['map'](g=>g['type']+':'+g['object'])}});}catch{}}['emitProcessEvent'](a,b,c,d){if(!a['process'])return;try{this['deps']['processes']['appendEvent'](a['process']['dir'],{'timestamp':new Date()['toISOString'](),'event':b,'reason':c,...d?{'data':d}:{}});}catch{}}['distillOutcome'](a,b){try{const c={'playbook':a['process']?.['playbook'],'objects_count':a['objects']['length']};if(a['process']){const d=this['deps']['processes']['loadStageState'](a['process']['dir']),e=d?.['stages']['filter'](h=>d['stage_meta'][h]?.['committed'])['length'];if(e!==undefined)c['stages_completed']=e;const f=this['deps']['processes']['listProblems'](a['process']['dir']),g=this['deps']['processes']['listFeedback'](a['process']['dir']);c['problems_open']=f['filter'](h=>h['status']==='open')['length'],c['problems_resolved']=f['filter'](h=>h['status']==='resolved')['length'],c['feedback_positive']=g['filter'](h=>h['sentiment']==='positive')['length'],c['feedback_negative']=g['filter'](h=>h['sentiment']==='negative')['length'];}this['deps']['recordSignature']({'intent':a['goal_type'],'signals':c,'timestamp':Date['now'](),'outcome':b});}catch{}}['assertTransition'](a,b){if(isTerminalStage(a))throw new Error('goal\x20is\x20terminal\x20('+a+')');if(b==='abandoned')throw new Error('use\x20the\x20abandon\x20action\x20to\x20abandon\x20a\x20goal');if(b==='paused')return;if(a==='paused')return;if(b===a)return;const c=stageIndex(a),d=stageIndex(b);if(d<0x0||c<0x0||d<c)throw new Error('invalid\x20stage\x20transition:\x20'+a+'\x20→\x20'+b+'\x20(forward-only\x20along\x20'+'recognized→confirmed→bound→planned→approved→acting→monitoring→completed'+')');}async['pause'](a,b){return this['advance'](a,b,{'stage':'paused'});}async['autoBindMonitor'](a,b){const c=await this['deps']['subscriptionStore']['getConfig'](a),d=c['scope']['focus_objects']['map'](g=>({...g})),e=Date['now']();for(const f of b['objects']){const g=d['some'](h=>h['object']===f['object']&&h['goal_id']===b['id']);if(g)continue;d['push']({'object':f['object'],'added_at':e,'reason':'goal','closure':!![],'goal_id':b['id'],'note':b['title']});if(!b['monitor']['focus_ids']['includes'](f['object']))b['monitor']['focus_ids']['push'](f['object']);}await this['deps']['subscriptionStore']['saveConfig'](a,{'scope':{...c['scope'],'focus_objects':d}});if((b['goal_type']==='capture_demand'||b['goal_type']==='publish_demand')&&b['monitor']['intent_ids']['length']===0x0){const h=await this['deps']['createIntent']({'intent':b['intent_text'],'account':b['binding']?.['account']});b['monitor']['intent_ids']['push'](h['id']);}}async['complete'](a,b,c={}){const d=await this['mustGet'](a,b);if(isTerminalStage(d['stage']))throw new Error('goal\x20'+b+'\x20is\x20terminal\x20('+d['stage']+')');const e=await this['deps']['evaluateCompletion'](d,a),f=c['force']===!![];if(!e['complete']&&!f)return{'goal':d,'completed':![],'verify_report':e};const g=await this['teardown'](a,d);d['stage']='completed',d['outcome']={'success':e['complete']||f,'completed_at':Date['now'](),'verify_report':e,...!e['complete']&&f?{'forced':!![]}:{}},d['updated_at']=Date['now']();if(d['process']){if(c['feedback'])try{this['deps']['processes']['addFeedback'](d['process']['dir'],{'source':'user','sentiment':c['feedback']['sentiment'],'comment':c['feedback']['comment']});}catch{g['push']('feedback\x20recording\x20failed');}this['emitProcessEvent'](d,'goal_completed','goal\x20completed\x20('+d['title']+')');}this['distillOutcome'](d,'success');const h=await this['deps']['store']['save'](a,d);return{'goal':h,'completed':!![],'verify_report':e,'teardown_notes':g['length']?g:undefined};}async['abandon'](a,b,c){const d=await this['mustGet'](a,b);if(isTerminalStage(d['stage']))throw new Error('goal\x20'+b+'\x20is\x20already\x20terminal\x20('+d['stage']+')');const e=await this['teardown'](a,d);d['stage']='abandoned',d['outcome']={'success':![],'completed_at':Date['now'](),...c?{'verify_report':{'reason':c}}:{}},d['updated_at']=Date['now'](),this['emitProcessEvent'](d,'goal_abandoned',c??'goal\x20abandoned'),this['distillOutcome'](d,'failed');const f=await this['deps']['store']['save'](a,d);return{'goal':f,'teardown_notes':e['length']?e:undefined};}async['remove'](a,b,c={}){const d=await this['mustGet'](a,b);let e;if(!isTerminalStage(d['stage'])){if(c['force']!==!![])throw new Error('goal\x20'+b+'\x20is\x20not\x20terminal\x20('+d['stage']+')\x20—\x20complete/abandon\x20it\x20first,\x20or\x20pass\x20force=true');await this['teardown'](a,d),e=!![];}let f;if(d['process'])try{this['deps']['processes']['removeDir'](d['process']['dir']),f=!![];}catch{f=![];}const g=await this['deps']['store']['remove'](a,b);return{'deleted':g,...e!==undefined?{'tore_down_active':e}:{},...f!==undefined?{'process_removed':f}:{}};}async['teardown'](a,b){const c=[];try{const d=await this['deps']['subscriptionStore']['getConfig'](a),f=d['scope']['focus_objects']['filter'](g=>g['goal_id']!==b['id']);f['length']!==d['scope']['focus_objects']['length']&&await this['deps']['subscriptionStore']['saveConfig'](a,{'scope':{...d['scope'],'focus_objects':f}});}catch(g){c['push']('focus\x20teardown\x20failed:\x20'+(g instanceof Error?g['message']:String(g)));}revokePlanApproval(b['id']);for(const h of b['monitor']['intent_ids']){try{await this['deps']['removeIntent'](h);}catch(i){c['push']('intent\x20teardown\x20failed\x20('+h+'):\x20'+(i instanceof Error?i['message']:String(i)));}}return c;}async['get'](a,b){const c=await this['mustGet'](a,b);if(!c['process'])return c;try{return{...c,'process_summary':this['summarizeProcess'](c['process']['dir'],c['process']['id'],c['process']['playbook'])};}catch{return c;}}['summarizeProcess'](a,b,c){const d=this['deps']['processes']['loadStageState'](a),e=this['deps']['processes']['listProblems'](a,{'status':'open'}),f={'critical':0x0,'high':0x1,'medium':0x2,'low':0x3},g=[...e]['sort']((i,j)=>f[i['severity']]-f[j['severity']])['slice'](0x0,0x3)['map'](i=>i['title']),h=this['deps']['processes']['listSuggestions'](a,{'status':'pending'});return{'id':b,'playbook':c,'current_stage':d?.['current_stage']??'unknown','stages':(d?.['stages']??[])['map'](i=>({'name':i,'committed':d?.['stage_meta'][i]?.['committed']??![],'completion':d?.['stage_meta'][i]?.['completion']??0x0})),'open_problems':{'count':e['length'],'top':g},'pending_suggestions':{'count':h['length'],'top':h['slice'](0x0,0x3)['map'](i=>i['title'])},'last_events':this['deps']['processes']['readEvents'](a)['slice'](-0x5),'feedback_count':this['deps']['processes']['listFeedback'](a)['length']};}async['listSuggestions'](a,b,c={}){const d=await this['mustGet'](a,b);if(!d['process'])return{'goal':d,'suggestions':[],'open_problems':[]};const e=this['deps']['processes']['listSuggestions'](d['process']['dir']),f=c['include_resolved']?e:e['filter'](h=>h['status']==='pending'),g=this['deps']['processes']['listProblems'](d['process']['dir'],{'status':'open'});return{'goal':d,'suggestions':f,'open_problems':g};}async['resolveSuggestion'](a,b,c,d){const f=await this['mustGet'](a,b);if(!f['process'])throw new Error('goal\x20'+b+'\x20has\x20no\x20TaskProcess\x20(no\x20suggestion\x20stream)');const g=f['process']['dir'],h=this['deps']['processes']['listSuggestions'](g)['find'](n=>n['id']===c);if(!h)throw new Error('suggestion\x20not\x20found:\x20'+c);if(h['status']!=='pending')throw new Error('suggestion\x20'+c+'\x20already\x20resolved\x20('+h['status']+')');if(d['decision']==='dismiss'){const n=this['deps']['processes']['updateSuggestion'](g,c,{'status':'dismissed',...d['note']?{'resolution_note':d['note']}:{}});return this['emitSuggestionEvent'](f,'suggestion_dismissed',h,d['note']),{'goal':f,'suggestion':n,'applied':![]};}if(d['apply']!==!![]){const o=this['deps']['processes']['updateSuggestion'](g,c,{'status':'confirmed',...d['note']?{'resolution_note':d['note']}:{}});return this['emitSuggestionEvent'](f,'suggestion_confirmed',h,d['note']),{'goal':f,'suggestion':o,'applied':![]};}let i,j,k=![];if(h['kind']==='advance_stage'&&h['stage'])try{await this['advance'](a,b,{'stage':h['stage']}),k=!![];}catch(p){i=p instanceof Error?p['message']:String(p);}else{if(h['kind']==='complete_goal')try{const q=await this['complete'](a,b,{});j=q['verify_report'],q['completed']?k=!![]:i='completion\x20conditions\x20unmet:\x20'+(q['verify_report']['missing']['join'](';\x20')||'no\x20evidence');}catch(r){i=r instanceof Error?r['message']:String(r);}else{if(h['kind']==='register_object'&&h['objects']?.['length'])try{await this['advance'](a,b,{'objects':h['objects']}),k=!![];}catch(s){i=s instanceof Error?s['message']:String(s);}else k=!![];}}if(i){const t=await this['mustGet'](a,b);return{'goal':t,'suggestion':h,'applied':![],'apply_error':i};}const l=this['deps']['processes']['updateSuggestion'](g,c,{'status':'confirmed','applied':!![],...d['note']?{'resolution_note':d['note']}:{}});this['emitSuggestionEvent'](f,'suggestion_applied',h,d['note']);const m=await this['mustGet'](a,b);return{'goal':m,'suggestion':l,'applied':!![],...j?{'complete_report':j}:{}};}async['boundariesView'](a,c){const d=await this['mustGet'](a,c),e=goalBoundaryQuestions(d['goal_type']),f=d['boundaries'],g=[];if(!f?.['budget'])g['push']('budget');if(!f?.['deadline'])g['push']('deadline');if(!f?.['requirements']?.['length'])g['push']('requirements');if(!f?.['autonomy'])g['push']('autonomy');return{'goal':d,...f?{'boundaries':f}:{},'questions':e,'missing':g};}async['setBoundaries'](a,b,c){const d=await this['mustGet'](a,b);if(isTerminalStage(d['stage']))throw new Error('goal\x20'+b+'\x20is\x20terminal\x20('+d['stage']+')');const e={};if(c['budget']!==undefined){if(!/^\d+$/['test'](c['budget']))throw new Error('boundaries.budget\x20must\x20be\x20a\x20non-negative\x20integer\x20decimal\x20string\x20(smallest\x20on-chain\x20unit)');e['budget']=c['budget'];}if(c['deadline']!==undefined){if(!Number['isFinite'](c['deadline'])||c['deadline']<=0x0)throw new Error('boundaries.deadline\x20must\x20be\x20a\x20positive\x20ms-epoch\x20timestamp');e['deadline']=c['deadline'];}if(c['requirements']!==undefined){const h=c['requirements']['map'](i=>i['trim']())['filter'](i=>i['length']>0x0);if(h['length']!==c['requirements']['length'])throw new Error('boundaries.requirements\x20must\x20be\x20non-empty\x20strings');e['requirements']=h;}if(c['autonomy']!==undefined){if(!GOAL_AUTONOMY_LEVELS['includes'](c['autonomy']))throw new Error('boundaries.autonomy\x20must\x20be\x20one\x20of:\x20'+GOAL_AUTONOMY_LEVELS['join']('\x20|\x20'));e['autonomy']=c['autonomy'];}const f=d['boundaries']??{'autonomy':'confirm_all'};d['boundaries']={...f,...e,'confirmed_at':Date['now']()};const g=stageIndex(d['stage']);if(g>=0x0&&g<stageIndex('confirmed'))d['stage']='confirmed';return d['updated_at']=Date['now'](),this['emitProcessEvent'](d,'boundaries_confirmed','goal\x20boundaries\x20set\x20(autonomy\x20'+d['boundaries']['autonomy']+')'),this['deps']['store']['save'](a,d);}async['pursue'](a,b){const d=await this['mustGet'](a,b);if(isTerminalStage(d['stage']))throw new Error('goal\x20'+b+'\x20is\x20terminal\x20('+d['stage']+')');const f=[];if(d['stage']==='paused')return f['push']('goal\x20is\x20paused\x20(the\x20user\x27s\x20explicit\x20hold)\x20—\x20nothing\x20pursued\x20this\x20tick'),{'action':'wait','items':[],'applied':[],'authorized':[],'boundary_status':{'autonomy':d['boundaries']?.['autonomy']??'unset',...d['boundaries']?.['budget']!==undefined?{'budget':d['boundaries']['budget']}:{},...d['boundaries']?.['deadline']!==undefined?{'deadline':d['boundaries']['deadline']}:{},...d['boundaries']?.['requirements']?.['length']?{'requirements':d['boundaries']['requirements']}:{}},'notes':f};const g=[];if(d['process']){const l=this['deps']['processes']['listSuggestions'](d['process']['dir'],{'status':'pending'});for(const m of l){g['push']({'id':m['id'],'kind':m['kind'],...m['stage']?{'stage':m['stage']}:{},...m['objects']?.['length']?{'objects':m['objects']}:{},'title':m['title'],...m['detail']?{'detail':m['detail']}:{},'risk':m['kind']==='incentive'?'high':m['kind']==='advance_stage'||m['kind']==='register_object'||m['kind']==='complete_goal'||m['kind']==='note'?'none':'low','suggestion_id':m['id'],...m['origin']?{'origin':m['origin']}:{}});}}const h=g['some'](n=>n['kind']==='complete_goal');!h&&d['stage']==='monitoring'&&g['push']({'id':'engine:complete-check','kind':'complete_goal','title':'Verify\x20completion\x20conditions\x20on\x20chain','detail':'The\x20engine\x20re-checks\x20the\x20goal-type\x20completion\x20conjunction;\x20completion\x20only\x20lands\x20when\x20chain\x20conditions\x20hold.','risk':'none','origin':{'source':'engine'}});const i=pursueTick(d,g,Date['now']());f['push'](...i['notes']);const j=[],k=[];for(const n of i['items']){if(n['action']!=='execute'){const p=g['find'](q=>q['id']===n['candidate_id']);if(n['action']==='ask_user'&&p&&!p['suggestion_id']&&d['process'])try{this['deps']['processes']['addSuggestion'](d['process']['dir'],{'kind':p['kind'],...p['stage']?{'stage':p['stage']}:{},'title':p['title'],...p['detail']?{'detail':p['detail']+'\x20(pursue:\x20'+n['reason']+')'}:{'detail':n['reason']}});}catch{f['push']('ask_user\x20suggestion\x20could\x20not\x20be\x20recorded\x20for\x20\x27'+p['title']+'\x27');}continue;}const o=g['find'](q=>q['id']===n['candidate_id']);if(!o)continue;if(o['kind']==='onchain_operation'){k['push']({'candidate_id':o['id'],'title':o['title'],'reason':n['reason']});continue;}if(o['suggestion_id'])try{const q=await this['resolveSuggestion'](a,b,o['suggestion_id'],{'decision':'confirm','apply':!![]});j['push']({'candidate_id':o['id'],'outcome':q['applied']?'applied\x20(suggestion\x20confirmed)':'not\x20applied:\x20'+(q['apply_error']??'unknown')});}catch(r){j['push']({'candidate_id':o['id'],'outcome':'failed:\x20'+(r instanceof Error?r['message']:String(r))});}else{if(o['id']==='engine:complete-check')try{const t=await this['complete'](a,b,{});t['completed']?j['push']({'candidate_id':o['id'],'outcome':'goal\x20completed\x20(chain\x20conditions\x20verified)'}):j['push']({'candidate_id':o['id'],'outcome':'conditions\x20unmet\x20—\x20keep\x20waiting:\x20'+(t['verify_report']['missing']['join'](';\x20')||'no\x20evidence\x20yet')});}catch(u){j['push']({'candidate_id':o['id'],'outcome':'completion\x20check\x20failed:\x20'+(u instanceof Error?u['message']:String(u))});}}}return this['emitProcessEvent'](d,'pursue_tick','pursue\x20tick:\x20'+i['action']+'\x20('+i['items']['length']+'\x20candidate(s),\x20'+j['length']+'\x20applied)',{'data':{'action':i['action'],'items':i['items']['map'](v=>({'candidate_id':v['candidate_id'],'action':v['action']})),'applied':j['map'](v=>v['candidate_id'])}}),{'action':i['action'],'items':i['items'],'applied':j,'authorized':k,'boundary_status':i['boundary_status'],'notes':f};}async['nextSteps'](a,b){const c=await this['mustGet'](a,b);let d;if(c['process'])try{const e=this['deps']['processes']['listSuggestions'](c['process']['dir'],{'status':'pending'}),f=this['deps']['processes']['listProblems'](c['process']['dir'],{'status':'open'});d={'pending_suggestions':{'count':e['length'],'top':e['slice'](0x0,0x3)['map'](g=>g['title'])},'open_problems':{'count':f['length'],'top':f['slice'](0x0,0x3)['map'](g=>g['title'])}};}catch{d=undefined;}return{'goal':c,'steps':nextStepsForGoal(c,d)};}['emitSuggestionEvent'](a,b,c,d){if(!a['process'])return;try{this['deps']['processes']['appendEvent'](a['process']['dir'],{'timestamp':new Date()['toISOString'](),'event':b,'reason':c['kind']+'\x20\x27'+c['title']+'\x27\x20('+c['id']+')','data':{'suggestion_id':c['id'],'kind':c['kind'],...c['stage']?{'stage':c['stage']}:{},...d?{'note':d}:{}}});}catch{}}async['list'](a,b={}){const [c,d]=await Promise['all']([this['deps']['store']['list'](a,b),this['deps']['store']['counts'](a)]);return{'goals':c,'counts':d};}async['mustGet'](a,b){const c=await this['deps']['store']['get'](a,b);if(!c)throw new Error('goal\x20not\x20found:\x20'+b);return c;}}export const goalEngine=new GoalEngine({'store':goalStore,'subscriptionStore':subscriptionStore,'createIntent':createIntent,'removeIntent':removeIntent,'listLocalAccounts':listLocalAccounts,'evaluateCompletion':(a,b)=>evaluateGoalCompletion(a,b),'processes':{'rootDir':processesRootDir,'initProcess':initProcess,'loadManifest':loadManifest,'saveManifest':saveManifest,'loadStageState':loadStageState,'appendEvent':appendEvent,'addFeedback':addFeedback,'listProblems':listProblems,'listFeedback':listFeedback,'readEvents':readEvents,'addSuggestion':addSuggestion,'updateSuggestion':updateSuggestion,'listSuggestions':listSuggestions,'removeDir':deleteProcessDir},'recordSignature':recordSignature});
@@ -0,0 +1,12 @@
1
+ import { type GoalRecord, type NextStepOption } from "./types.js";
2
+ export interface NextStepsContext {
3
+ pending_suggestions: {
4
+ count: number;
5
+ top: string[];
6
+ };
7
+ open_problems: {
8
+ count: number;
9
+ top: string[];
10
+ };
11
+ }
12
+ export declare function nextStepsForGoal(goal: GoalRecord, ctx?: NextStepsContext): NextStepOption[];
@@ -0,0 +1 @@
1
+ import{GOAL_TYPE_LABELS}from'./types.js';const STAGE_AXIS=['recognized','confirmed','bound','planned','approved','acting','monitoring','completed'];function nextStation(a){const b=STAGE_AXIS['indexOf'](a);return b>=0x0&&b<STAGE_AXIS['length']-0x1?STAGE_AXIS[b+0x1]:undefined;}const STATION_MEANING={'recognized':'the\x20intent\x20is\x20recorded\x20and\x20classified','confirmed':'budget/deadline/requirements/autonomy\x20boundaries\x20are\x20set','bound':'the\x20operating\x20account\x20is\x20bound\x20(with\x20a\x20local\x20preflight)','planned':'the\x20plan\x20is\x20drafted\x20(playbook\x20pipeline)','approved':'the\x20plan\x20is\x20approved\x20(confirm-gate\x20downgrade\x20for\x20standard\x20ops)','acting':'on-chain\x20operations\x20execute;\x20created\x20objects\x20register\x20here','monitoring':'monitor\x20focus\x20auto-binds\x20to\x20the\x20goal\x27s\x20objects;\x20progression\x20events\x20arrive\x20as\x20suggestions','paused':'the\x20goal\x20is\x20on\x20hold\x20(resume\x20via\x20advance)','completed':'terminal\x20—\x20the\x20completion\x20conjunction\x20verified\x20on\x20chain','abandoned':'terminal\x20—\x20given\x20up\x20(audit\x20retained)'},GOAL_FOLLOW_UPS={'publish_service':[{'goal_type':'capture_demand','title':'Attract\x20orders\x20for\x20the\x20live\x20service','why':'A\x20published\x20service\x20only\x20earns\x20when\x20orders\x20arrive\x20—\x20capture_demand\x20watches\x20the\x20market\x20and\x20pushes\x20matching\x20opportunities.'},{'goal_type':'fulfill_order','title':'Fulfill\x20the\x20incoming\x20orders','why':'Each\x20matched\x20order\x20needs\x20workflow\x20execution\x20(machine\x20forwards)\x20to\x20reach\x20completion\x20and\x20release\x20payment.'},{'goal_type':'manage_assets','title':'Keep\x20permission\x20&\x20allocation\x20healthy','why':'As\x20volume\x20grows,\x20tune\x20the\x20service\x27s\x20permission\x20index,\x20allocator\x20strategy\x20and\x20treasury\x20bindings.'}],'fulfill_order':[{'goal_type':'publish_service','title':'Grow\x20the\x20service\x20catalog','why':'Fulfilled\x20orders\x20build\x20the\x20service\x27s\x20trust\x20data\x20—\x20publish\x20the\x20next\x20offering\x20while\x20reputation\x20compounds.'},{'goal_type':'manage_assets','title':'Tune\x20allocation\x20&\x20treasury\x20for\x20volume','why':'Settlement\x20flows\x20grow\x20with\x20fulfilled\x20orders;\x20keep\x20the\x20allocator\x20strategy\x20and\x20treasury\x20bindings\x20healthy.'}],'capture_demand':[{'goal_type':'fulfill_order','title':'Fulfill\x20the\x20captured\x20orders','why':'Captured\x20orders\x20only\x20convert\x20to\x20income\x20when\x20the\x20workflow\x20runs\x20to\x20completion.'},{'goal_type':'collaborate_flow','title':'Subcontract\x20overflow\x20via\x20collaboration','why':'When\x20order\x20volume\x20exceeds\x20capacity,\x20route\x20sub-orders\x20to\x20collaborators\x20through\x20permission-gated\x20forwards.'}],'purchase_service':[{'goal_type':'dispute_resolution','title':'Raise\x20a\x20dispute\x20if\x20delivery\x20missed\x20your\x20requirements','why':'The\x20acceptance\x20requirements\x20you\x20set\x20at\x20CONFIRM\x20are\x20the\x20dispute\x20baseline;\x20the\x20order\x27s\x20arbitration\x20binding\x20resolves\x20it.'},{'goal_type':'publish_demand','title':'Publish\x20the\x20next\x20demand','why':'Repeat\x20sourcing\x20with\x20the\x20same\x20boundary\x20template\x20—\x20budget/deadline/requirements\x20carry\x20over\x20as\x20defaults.'}],'collaborate_flow':[{'goal_type':'fulfill_order','title':'Take\x20full\x20orders\x20of\x20your\x20own','why':'Collaboration\x20proves\x20delivery\x20capacity\x20—\x20graduate\x20to\x20owning\x20the\x20full\x20order\x20flow.'},{'goal_type':'supply_suborder','title':'Supply\x20sub-orders\x20directly\x20to\x20demands','why':'Present\x20your\x20proven\x20capability\x20as\x20a\x20supplier\x20without\x20waiting\x20for\x20a\x20collaborator\x20to\x20route\x20work.'}],'supply_suborder':[{'goal_type':'fulfill_order','title':'Move\x20up\x20to\x20full\x20order\x20fulfillment','why':'Reliable\x20sub-order\x20supply\x20builds\x20the\x20trust\x20data\x20needed\x20to\x20hold\x20complete\x20orders.'},{'goal_type':'publish_service','title':'Package\x20the\x20capability\x20as\x20a\x20service','why':'A\x20published\x20service\x20surfaces\x20your\x20supply\x20capability\x20in\x20the\x20market\x20continuously.'}],'publish_demand':[{'goal_type':'purchase_service','title':'Buy\x20the\x20selected\x20presentation','why':'Selecting\x20a\x20presented\x20service\x20turns\x20the\x20demand\x20into\x20an\x20order\x20—\x20purchase_service\x20drives\x20it\x20to\x20delivery.'},{'goal_type':'publish_demand','title':'Re-publish\x20with\x20tighter\x20criteria','why':'If\x20no\x20presentation\x20satisfied\x20the\x20requirements,\x20re-publish\x20with\x20sharper\x20selection\x20criteria.'}],'run_arbitration':[{'goal_type':'manage_assets','title':'Tune\x20voting\x20rules,\x20weights\x20&\x20fees','why':'Case\x20throughput\x20and\x20verdict\x20quality\x20data\x20tell\x20you\x20how\x20the\x20arbitration\x20business\x20should\x20be\x20reconfigured.'},{'goal_type':'dispute_resolution','title':'Watch\x20the\x20dispute\x20market\x20for\x20new\x20cases','why':'Published\x20arbitration\x20cases\x20flow\x20to\x20active\x20arbitrators\x20—\x20keep\x20the\x20case\x20pipeline\x20full.'}],'dispute_resolution':[{'goal_type':'purchase_service','title':'Re-order\x20the\x20service\x20elsewhere','why':'A\x20resolved\x20dispute\x20closes\x20the\x20failed\x20order\x20—\x20source\x20again\x20with\x20the\x20requirements\x20the\x20dispute\x20proved\x20necessary.'},{'goal_type':'manage_assets','title':'Review\x20the\x20permission\x20&\x20asset\x20fallout','why':'Disputes\x20often\x20expose\x20permission\x20gaps\x20—\x20audit\x20what\x20the\x20resolution\x20changed\x20on-chain.'}],'manage_assets':[{'goal_type':'publish_service','title':'Return\x20to\x20the\x20provider\x20loop','why':'Governance\x20hygiene\x20done\x20—\x20the\x20business\x20loops\x20(publish/capture/fulfill)\x20run\x20on\x20clean\x20permissions.'},{'goal_type':'capture_demand','title':'Return\x20to\x20the\x20market','why':'With\x20assets\x20healthy,\x20capture\x20demand\x20opportunities\x20again.'}]},EMPTY_CONTEXT={'pending_suggestions':{'count':0x0,'top':[]},'open_problems':{'count':0x0,'top':[]}};export function nextStepsForGoal(a,b=EMPTY_CONTEXT){const c=[],d=a['stage']==='completed'||a['stage']==='abandoned';if(!d){!a['boundaries']&&c['push']({'id':'confirm_boundaries','kind':'confirm_boundaries','title':'Confirm\x20the\x20goal\x20boundaries\x20(budget\x20/\x20deadline\x20/\x20requirements\x20/\x20autonomy)','detail':'The\x20CONFIRM\x20station:\x20answer\x20the\x20boundary\x20questions\x20so\x20the\x20pursue\x20tick\x20can\x20run\x20within\x20a\x20clear\x20authorization\x20envelope.\x20Until\x20then\x20every\x20decision\x20defaults\x20to\x20confirm_all.','suggestion':{'action':'boundaries','id':a['id']}});!a['binding']&&c['push']({'id':'bind_account','kind':'bind_account','title':'Bind\x20the\x20operating\x20account','detail':'The\x20goal\x20needs\x20the\x20account\x20whose\x20assets\x20it\x20operates\x20with\x20(local\x20preflight\x20runs\x20at\x20bind\x20time).','suggestion':{'action':'bind','id':a['id'],'account':'<your\x20account>'}});b['pending_suggestions']['count']>0x0&&c['push']({'id':'resolve_suggestions','kind':'resolve_suggestions','title':'Resolve\x20'+b['pending_suggestions']['count']+'\x20pending\x20suggestion(s)','detail':b['pending_suggestions']['top']['length']?'Awaiting\x20your\x20decision:\x20'+b['pending_suggestions']['top']['join']('\x20·\x20'):undefined,'suggestion':{'action':'suggestions','id':a['id']}});b['open_problems']['count']>0x0&&c['push']({'id':'review_problems','kind':'review','title':'Review\x20'+b['open_problems']['count']+'\x20open\x20problem(s)','detail':b['open_problems']['top']['length']?'Most\x20severe:\x20'+b['open_problems']['top']['join']('\x20·\x20'):undefined,'suggestion':{'action':'get','id':a['id']}});const e=nextStation(a['stage']);if(e&&a['stage']!=='paused')c['push']({'id':'advance_station','kind':'advance_goal','title':'Advance\x20to\x20\x27'+e+'\x27\x20(currently\x20\x27'+a['stage']+'\x27)','detail':STATION_MEANING[e],'suggestion':{'action':'advance','id':a['id'],'stage':e}});else a['stage']==='paused'&&c['push']({'id':'resume','kind':'advance_goal','title':'Resume\x20the\x20paused\x20goal','detail':'The\x20goal\x20is\x20on\x20hold\x20—\x20advance\x20back\x20onto\x20the\x20axis\x20to\x20continue\x20pursuing\x20it.','suggestion':{'action':'advance','id':a['id'],'stage':'acting'}});}a['objects']['length']>0x0&&a['binding']&&c['push']({'id':'inspect_interest','kind':'inspect_interest','title':'Inspect\x20your\x20live\x20role-interest\x20view\x20(operable\x20forwards,\x20blocked\x20moves,\x20risks)','detail':'Run\x20the\x20G2\x20projection\x20with\x20the\x20goal\x27s\x20bound\x20account\x20as\x20observer:\x20stakes,\x20every\x20operable\x20forward\x20(with\x20the\x20exact\x20tool\x20call),\x20blocked\x20moves\x20with\x20reasons,\x20counterparty\x20tension\x20and\x20risk\x20reminders.','suggestion':{'tool':'topology_bi','interest_role':!![],'observer':a['binding']['account'],'seeds':a['objects']['map'](g=>g['object'])}});for(const g of GOAL_FOLLOW_UPS[a['goal_type']]){c['push']({'id':'follow_up_'+g['goal_type'],'kind':'create_goal','title':g['title'],'detail':'Start\x20a\x20'+GOAL_TYPE_LABELS[g['goal_type']]+'\x20goal.','goal_type':g['goal_type'],'why':g['why'],'suggestion':{'action':'create','goal_type':g['goal_type'],'intent_text':'<your\x20intent\x20for:\x20'+g['title']+'>',...a['binding']?.['account']?{'account':a['binding']['account']}:{}}});}return a['stage']==='abandoned'&&c['push']({'id':'retry_same_goal','kind':'create_goal','title':'Retry\x20this\x20'+GOAL_TYPE_LABELS[a['goal_type']]+'\x20goal','detail':'Re-attempt\x20with\x20adjusted\x20boundaries\x20—\x20what\x20went\x20wrong\x20is\x20audited\x20in\x20the\x20abandoned\x20record.','goal_type':a['goal_type'],'suggestion':{'action':'create','goal_type':a['goal_type'],'intent_text':a['intent_text'],...a['binding']?.['account']?{'account':a['binding']['account']}:{}}}),c;}
@@ -0,0 +1,18 @@
1
+ import type { BoundaryQuestion, GoalAutonomy, GoalRecord, GoalType, PursueAction, PursueCandidate, PursuePlanItem, PursueRisk } from "./types.js";
2
+ export declare function goalBoundaryQuestions(goalType: GoalType): BoundaryQuestion[];
3
+ export declare function decideByAutonomy(autonomy: GoalAutonomy, risk: PursueRisk): "execute" | "ask_user";
4
+ export declare function exceedsBudget(cost: string | undefined, budget: string | undefined): boolean | null;
5
+ export interface PursuePlan {
6
+ action: PursueAction;
7
+ items: PursuePlanItem[];
8
+ boundary_status: PursuePlanBoundaryStatus;
9
+ notes: string[];
10
+ }
11
+ export interface PursuePlanBoundaryStatus {
12
+ autonomy: GoalAutonomy | "unset";
13
+ budget?: string;
14
+ deadline?: number;
15
+ deadline_exceeded?: boolean;
16
+ requirements?: string[];
17
+ }
18
+ export declare function pursueTick(goal: GoalRecord, candidates: PursueCandidate[], now: number): PursuePlan;
@@ -0,0 +1 @@
1
+ const UNIVERSAL_BOUNDARY_QUESTIONS=[{'id':'budget','field':'budget','question':'What\x20is\x20the\x20maximum\x20you\x20are\x20willing\x20to\x20spend\x20on\x20this\x20goal\x20in\x20total?','why':'Payment\x20moves\x20costing\x20more\x20than\x20the\x20budget\x20are\x20rejected\x20outright\x20(stalled),\x20never\x20asked.'},{'id':'deadline','field':'deadline','question':'By\x20when\x20must\x20this\x20goal\x20be\x20delivered\x20(deadline)?','why':'Past\x20the\x20deadline\x20the\x20goal\x20stops\x20pursuing\x20and\x20reports\x20stalled\x20—\x20no\x20further\x20moves\x20are\x20proposed.'},{'id':'requirements','field':'requirements','question':'Any\x20hard\x20acceptance\x20requirements?\x20(e.g.\x20\x27service\x20location\x20must\x20be\x20London\x27,\x20\x27must\x20bind\x20on-chain\x20arbitration\x27)','why':'Commitment-level\x20moves\x20always\x20wait\x20until\x20every\x20requirement\x20is\x20verified\x20against\x20the\x20on-chain\x20facts.'},{'id':'autonomy','field':'autonomy','question':'How\x20much\x20standing\x20authorization\x20should\x20the\x20goal\x20engine\x20have\x20while\x20pursuing\x20this\x20goal?','why':'This\x20sets\x20what\x20executes\x20autonomously;\x20irreversible/publish/amount\x20operations\x20ALWAYS\x20ask\x20regardless.','default':'confirm_all\x20(nothing\x20executes\x20without\x20your\x20confirmation;\x20safest)\x20|\x20execute_low_risk\x20(safe\x20internal\x20moves\x20execute;\x20on-chain\x20operations\x20ask)\x20|\x20execute_all\x20(standard-gated\x20on-chain\x20moves\x20also\x20execute;\x20irreversible\x20ones\x20still\x20ask)'}],TYPE_CONTEXT_QUESTIONS={'publish_service':[{'id':'pricing','field':'context','question':'What\x20pricing\x20and\x20order\x20terms\x20are\x20acceptable\x20for\x20the\x20service\x20you\x20publish?'},{'id':'arbitration','field':'context','question':'Which\x20arbitration\x20should\x20the\x20service\x20bind\x20for\x20buyer\x20protection?'}],'purchase_service':[{'id':'quality','field':'context','question':'What\x20quality/location\x20constraints\x20must\x20the\x20service\x20satisfy\x20(these\x20become\x20requirements)?'},{'id':'dispute_threshold','field':'context','question':'What\x20delivery\x20failure\x20should\x20trigger\x20a\x20dispute\x20instead\x20of\x20waiting\x20(e.g.\x20N\x20days\x20without\x20progress)?'}],'capture_demand':[{'id':'order_filter','field':'context','question':'Which\x20orders\x20should\x20the\x20goal\x20pursue\x20(size\x20range,\x20location,\x20industry)?'}],'fulfill_order':[{'id':'sla','field':'context','question':'What\x20delivery\x20SLA\x20must\x20you\x20keep\x20per\x20order\x20node?'},{'id':'escalation','field':'context','question':'When\x20should\x20a\x20stuck\x20order\x20escalate\x20to\x20dispute\x20rather\x20than\x20keep\x20delivering?'}],'publish_demand':[{'id':'selection','field':'context','question':'How\x20will\x20you\x20select\x20among\x20presenting\x20suppliers\x20(trust\x20data,\x20price,\x20capacity)?'},{'id':'presentation_deadline','field':'context','question':'How\x20long\x20should\x20the\x20demand\x20stay\x20open\x20for\x20supplier\x20presentations?'}],'collaborate_flow':[{'id':'capacity','field':'context','question':'How\x20many\x20pending\x20workflow\x20nodes\x20can\x20you\x20process\x20in\x20parallel?'}],'supply_suborder':[{'id':'margin','field':'context','question':'What\x20is\x20the\x20minimum\x20acceptable\x20margin\x20for\x20a\x20sub-order\x20you\x20supply?'}],'run_arbitration':[{'id':'case_capacity','field':'context','question':'How\x20many\x20dispute\x20cases\x20can\x20you\x20arbitrate\x20concurrently?'},{'id':'fee_policy','field':'context','question':'What\x20fee\x20and\x20voting-weight\x20policy\x20should\x20your\x20arbitration\x20business\x20run?'}],'dispute_resolution':[{'id':'evidence','field':'context','question':'What\x20evidence\x20(messages,\x20WTS\x20files,\x20node\x20guards)\x20supports\x20your\x20position?'},{'id':'desired_outcome','field':'context','question':'What\x20resolution\x20do\x20you\x20want\x20—\x20refund,\x20forced\x20completion,\x20or\x20renegotiation?'}],'manage_assets':[{'id':'asset_scope','field':'context','question':'Which\x20assets\x20(objects,\x20permissions,\x20treasuries)\x20are\x20in\x20scope\x20for\x20this\x20goal?'}]};export function goalBoundaryQuestions(a){return[...UNIVERSAL_BOUNDARY_QUESTIONS,...TYPE_CONTEXT_QUESTIONS[a]??[]];}const ACTION_RANK={'stalled':0x3,'ask_user':0x2,'execute':0x1,'wait':0x0};export function decideByAutonomy(a,b){if(b==='high')return'ask_user';if(b==='none')return a==='confirm_all'?'ask_user':'execute';return a==='execute_all'?'execute':'ask_user';}export function exceedsBudget(a,d){if(a===undefined||d===undefined)return![];let e,f;try{e=BigInt(a),f=BigInt(d);}catch{return null;}return e>f;}export function pursueTick(a,d,e){const f=a['boundaries'],g=[],h=f?.['autonomy']??'confirm_all';!f&&g['push']('boundaries\x20unset\x20—\x20defaulting\x20to\x20confirm_all\x20(every\x20decision\x20surfaces\x20as\x20a\x20pending\x20suggestion);\x20run\x20the\x20boundaries\x20action\x20to\x20grant\x20autonomy');const i=f?.['deadline']!==undefined&&e>f['deadline'];i&&g['push']('deadline\x20exceeded\x20('+new Date(f['deadline'])['toISOString']()+')\x20—\x20every\x20candidate\x20stalls');const j=[];for(const l of d){const m={'candidate_id':l['id'],...l['suggestion_id']?{'suggestion_id':l['suggestion_id']}:{}};if(i){j['push']({...m,'action':'stalled','reason':'deadline\x20exceeded\x20—\x20the\x20goal\x20no\x20longer\x20pursues'});continue;}const n=exceedsBudget(l['cost'],f?.['budget']);if(n===!![]){j['push']({...m,'action':'stalled','reason':'cost\x20'+l['cost']+'\x20exceeds\x20the\x20budget\x20'+f?.['budget']+'\x20(boundary\x20violation)'});continue;}if(n===null){j['push']({...m,'action':'ask_user','reason':'cost\x20\x27'+l['cost']+'\x27\x20cannot\x20be\x20verified\x20against\x20the\x20budget\x20\x27'+f?.['budget']+'\x27\x20(non-numeric)\x20—\x20decide\x20manually'});continue;}const o=l['kind']==='onchain_operation'||l['kind']==='incentive'||l['cost']!==undefined;if(o&&(f?.['requirements']?.['length']??0x0)>0x0){j['push']({...m,'action':'ask_user','reason':'acceptance\x20requirements\x20must\x20be\x20verified\x20before\x20committing:\x20'+f['requirements']['join'](';\x20')});continue;}const p=decideByAutonomy(h,l['risk']);j['push']({...m,'action':p,'reason':p==='execute'?l['risk']==='none'?'engine-local\x20move\x20('+l['kind']+')\x20—\x20within\x20the\x20granted\x20autonomy\x20('+h+')':'standard-confirm-gated\x20move\x20—\x20within\x20the\x20granted\x20autonomy\x20('+h+');\x20the\x20confirm-gate\x20still\x20applies\x20per\x20operation':l['risk']==='high'?'high-risk\x20on-chain\x20commitment\x20—\x20ALWAYS\x20requires\x20user\x20confirmation\x20(autonomy\x20never\x20overrides\x20the\x20confirm-gate)':'autonomy\x20'+h+'\x20does\x20not\x20cover\x20this\x20move\x20('+l['kind']+',\x20risk\x20'+l['risk']+')\x20—\x20surfaced\x20as\x20a\x20pending\x20suggestion'});}let k='wait';for(const q of j){if(ACTION_RANK[q['action']]>ACTION_RANK[k])k=q['action'];}return d['length']===0x0&&(k='wait',g['push']('nothing\x20actionable\x20this\x20tick\x20—\x20the\x20goal\x20is\x20healthy\x20(wait)')),{'action':k,'items':j,'boundary_status':{'autonomy':f?.['autonomy']??'unset',...f?.['budget']!==undefined?{'budget':f['budget']}:{},...f?.['deadline']!==undefined?{'deadline':f['deadline']}:{},...i?{'deadline_exceeded':!![]}:{},...f?.['requirements']?.['length']?{'requirements':f['requirements']}:{}},'notes':g};}