@wowok/agent-mcp 3.0.3 → 3.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/dist/evaluation/path-reasoning.d.ts +4 -2
  2. package/dist/evaluation/path-reasoning.js +1 -1
  3. package/dist/extensions/constraint-registry.d.ts +2 -2
  4. package/dist/extensions/constraint-registry.js +1 -1
  5. package/dist/extensions/custom-registry-file.d.ts +22 -0
  6. package/dist/extensions/custom-registry-file.js +1 -0
  7. package/dist/extensions/index.d.ts +2 -1
  8. package/dist/extensions/index.js +1 -1
  9. package/dist/extensions/industry-pack.d.ts +7 -0
  10. package/dist/extensions/industry-pack.js +1 -1
  11. package/dist/extensions/metric-registry.d.ts +2 -2
  12. package/dist/extensions/metric-registry.js +1 -1
  13. package/dist/extensions/modes.js +1 -1
  14. package/dist/extensions/registry.d.ts +2 -2
  15. package/dist/extensions/registry.js +1 -1
  16. package/dist/extensions/types.d.ts +4 -0
  17. package/dist/goal/GoalEngine.d.ts +13 -1
  18. package/dist/goal/GoalEngine.js +1 -1
  19. package/dist/goal/next-steps.d.ts +12 -0
  20. package/dist/goal/next-steps.js +1 -0
  21. package/dist/goal/pursue.d.ts +18 -0
  22. package/dist/goal/pursue.js +1 -0
  23. package/dist/goal/types.d.ts +72 -0
  24. package/dist/goal/types.js +1 -1
  25. package/dist/graph/onchain/analyze.d.ts +44 -0
  26. package/dist/graph/onchain/analyze.js +1 -0
  27. package/dist/graph/onchain/analyze.spec.d.ts +1 -0
  28. package/dist/graph/onchain/analyze.spec.js +1 -0
  29. package/dist/graph/onchain/anti-cheat.d.ts +39 -0
  30. package/dist/graph/onchain/anti-cheat.js +1 -0
  31. package/dist/graph/onchain/anti-cheat.spec.d.ts +1 -0
  32. package/dist/graph/onchain/anti-cheat.spec.js +1 -0
  33. package/dist/graph/onchain/dataplane.d.ts +44 -0
  34. package/dist/graph/onchain/dataplane.js +1 -0
  35. package/dist/graph/onchain/edge-schema.d.ts +60 -0
  36. package/dist/graph/onchain/edge-schema.js +1 -0
  37. package/dist/graph/onchain/expand.d.ts +4 -0
  38. package/dist/graph/onchain/expand.js +1 -0
  39. package/dist/graph/onchain/extract.d.ts +21 -0
  40. package/dist/graph/onchain/extract.js +1 -0
  41. package/dist/graph/onchain/index.d.ts +17 -0
  42. package/dist/graph/onchain/index.js +1 -0
  43. package/dist/graph/onchain/interest.d.ts +10 -0
  44. package/dist/graph/onchain/interest.js +1 -0
  45. package/dist/graph/onchain/interest.spec.d.ts +1 -0
  46. package/dist/graph/onchain/interest.spec.js +1 -0
  47. package/dist/graph/onchain/onchain.spec.d.ts +1 -0
  48. package/dist/graph/onchain/onchain.spec.js +1 -0
  49. package/dist/graph/onchain/order-status.d.ts +53 -0
  50. package/dist/graph/onchain/order-status.js +1 -0
  51. package/dist/graph/onchain/project-relationship.d.ts +3 -0
  52. package/dist/graph/onchain/project-relationship.js +1 -0
  53. package/dist/graph/onchain/sdk-batch.d.ts +117 -0
  54. package/dist/graph/onchain/sdk-batch.js +1 -0
  55. package/dist/graph/onchain/sdk-dataplane.d.ts +40 -0
  56. package/dist/graph/onchain/sdk-dataplane.js +1 -0
  57. package/dist/graph/onchain/strategy.d.ts +54 -0
  58. package/dist/graph/onchain/strategy.js +1 -0
  59. package/dist/graph/onchain/strategy.spec.d.ts +1 -0
  60. package/dist/graph/onchain/strategy.spec.js +1 -0
  61. package/dist/graph/onchain/types.d.ts +238 -0
  62. package/dist/graph/onchain/types.js +1 -0
  63. package/dist/graph/onchain/viewport.d.ts +5 -0
  64. package/dist/graph/onchain/viewport.js +1 -0
  65. package/dist/harness/recover.js +1 -1
  66. package/dist/index.js +1 -1
  67. package/dist/intent/enrich.js +1 -1
  68. package/dist/keeper/detectors.d.ts +1 -1
  69. package/dist/keeper/detectors.js +1 -1
  70. package/dist/knowledge/account-marks.js +1 -1
  71. package/dist/knowledge/anti-cheat.d.ts +2 -37
  72. package/dist/knowledge/anti-cheat.js +1 -1
  73. package/dist/knowledge/contract-invariants.js +1 -1
  74. package/dist/knowledge/event-semantics.js +1 -1
  75. package/dist/knowledge/getting-started.d.ts +37 -0
  76. package/dist/knowledge/getting-started.js +1 -0
  77. package/dist/knowledge/goal-completion.js +1 -1
  78. package/dist/knowledge/guard-puzzle.js +1 -1
  79. package/dist/knowledge/guard-render.d.ts +1 -0
  80. package/dist/knowledge/guard-render.js +1 -1
  81. package/dist/knowledge/guard-submission-brief.d.ts +83 -0
  82. package/dist/knowledge/guard-submission-brief.js +1 -0
  83. package/dist/knowledge/guard-submission-prompt.d.ts +13 -0
  84. package/dist/knowledge/guard-submission-prompt.js +1 -1
  85. package/dist/knowledge/index.d.ts +6 -4
  86. package/dist/knowledge/index.js +1 -1
  87. package/dist/knowledge/industry-registry.js +1 -1
  88. package/dist/knowledge/industry-strategy.d.ts +91 -0
  89. package/dist/knowledge/industry-strategy.js +1 -0
  90. package/dist/knowledge/jsonrpc-enum.js +1 -1
  91. package/dist/knowledge/market-metrics.d.ts +14 -3
  92. package/dist/knowledge/market-metrics.js +1 -1
  93. package/dist/knowledge/migration-preflight.js +1 -1
  94. package/dist/knowledge/operation-dictionary.d.ts +1 -1
  95. package/dist/knowledge/safety-rules.js +1 -1
  96. package/dist/knowledge/scenario-topology.d.ts +6 -1
  97. package/dist/knowledge/scenario-topology.js +1 -1
  98. package/dist/knowledge/service-ledger.js +1 -1
  99. package/dist/knowledge/service-risk-node.d.ts +3 -0
  100. package/dist/knowledge/service-risk-node.js +1 -0
  101. package/dist/knowledge/service-risk.d.ts +2 -0
  102. package/dist/knowledge/service-risk.js +1 -1
  103. package/dist/knowledge/service-templates.d.ts +2 -0
  104. package/dist/knowledge/service-templates.js +1 -1
  105. package/dist/knowledge/strategy-manuals.d.ts +17 -0
  106. package/dist/knowledge/strategy-manuals.js +1 -0
  107. package/dist/knowledge/supply-chain.d.ts +3 -1
  108. package/dist/knowledge/supply-chain.js +1 -1
  109. package/dist/knowledge/template-registry.js +1 -1
  110. package/dist/knowledge/tools-reference.js +1 -1
  111. package/dist/knowledge/workflow-guidance.d.ts +3 -118
  112. package/dist/knowledge/workflow-guidance.js +1 -1
  113. package/dist/knowledge/workspace-lists.js +1 -1
  114. package/dist/monitor/MonitorLoop.js +1 -1
  115. package/dist/monitor/ScopeResolver.js +1 -1
  116. package/dist/participation/radar-core.d.ts +15 -15
  117. package/dist/participation/radar-core.js +1 -1
  118. package/dist/persona/analyzer.d.ts +2 -1
  119. package/dist/persona/bridge.d.ts +5 -1
  120. package/dist/persona/bridge.js +1 -1
  121. package/dist/persona/defaults.js +1 -1
  122. package/dist/persona/distill-goal.d.ts +7 -1
  123. package/dist/persona/distill-goal.js +1 -1
  124. package/dist/persona/index.d.ts +13 -3
  125. package/dist/persona/index.js +1 -1
  126. package/dist/persona/model.d.ts +12 -2
  127. package/dist/persona/model.js +1 -1
  128. package/dist/persona/overrides.d.ts +1 -0
  129. package/dist/persona/overrides.js +1 -1
  130. package/dist/persona/topology-focus.d.ts +29 -0
  131. package/dist/persona/topology-focus.js +1 -0
  132. package/dist/persona/types.d.ts +81 -0
  133. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  134. package/dist/playbooks/service-build/context-assembly.js +1 -1
  135. package/dist/playbooks/service-build/machine-nodes.js +1 -1
  136. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  137. package/dist/playbooks/service-build/object-panorama.js +1 -1
  138. package/dist/playbooks/service-build/participation-radar.js +1 -1
  139. package/dist/playbooks/service-build/relationship-profile.d.ts +1 -0
  140. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  141. package/dist/playbooks/service-build/service-panorama.d.ts +4 -0
  142. package/dist/playbooks/service-build/service-panorama.js +1 -1
  143. package/dist/playbooks/service-build/topology-query.d.ts +14 -0
  144. package/dist/playbooks/service-build/topology-query.js +1 -0
  145. package/dist/role/index.d.ts +1 -0
  146. package/dist/role/index.js +1 -1
  147. package/dist/role/profiles.d.ts +26 -0
  148. package/dist/role/profiles.js +1 -0
  149. package/dist/safety/confirm-gate.d.ts +4 -1
  150. package/dist/safety/confirm-gate.js +1 -1
  151. package/dist/schema/call/allocation.d.ts +11 -6
  152. package/dist/schema/call/arbitration.d.ts +5 -0
  153. package/dist/schema/call/base.d.ts +5 -0
  154. package/dist/schema/call/base.js +1 -1
  155. package/dist/schema/call/bridge.d.ts +26 -1
  156. package/dist/schema/call/contact.d.ts +5 -0
  157. package/dist/schema/call/demand.d.ts +5 -0
  158. package/dist/schema/call/guard.d.ts +35 -20
  159. package/dist/schema/call/machine.d.ts +10 -0
  160. package/dist/schema/call/order.d.ts +5 -0
  161. package/dist/schema/call/payment.d.ts +5 -0
  162. package/dist/schema/call/permission.d.ts +5 -0
  163. package/dist/schema/call/personal.d.ts +5 -0
  164. package/dist/schema/call/progress.d.ts +5 -0
  165. package/dist/schema/call/proof.d.ts +10 -0
  166. package/dist/schema/call/repository.d.ts +5 -0
  167. package/dist/schema/call/repository.js +1 -1
  168. package/dist/schema/call/reward.d.ts +5 -0
  169. package/dist/schema/call/semantic.js +1 -1
  170. package/dist/schema/call/service.d.ts +9 -4
  171. package/dist/schema/call/treasury.d.ts +5 -0
  172. package/dist/schema/common/index.js +1 -1
  173. package/dist/schema/employee/index.d.ts +7 -7
  174. package/dist/schema/evaluation/index.d.ts +22 -9
  175. package/dist/schema/evaluation/index.js +1 -1
  176. package/dist/schema/goal/index.d.ts +37 -1
  177. package/dist/schema/goal/index.js +1 -1
  178. package/dist/schema/goal/planning.d.ts +1 -1
  179. package/dist/schema/index.d.ts +2 -0
  180. package/dist/schema/index.js +1 -1
  181. package/dist/schema/industry-pack/index.d.ts +7 -0
  182. package/dist/schema/industry-pack/index.js +1 -1
  183. package/dist/schema/interaction/index.d.ts +34 -0
  184. package/dist/schema/interaction/index.js +1 -0
  185. package/dist/schema/local/index.d.ts +8 -4
  186. package/dist/schema/local/index.js +1 -1
  187. package/dist/schema/messenger/index.d.ts +324 -64
  188. package/dist/schema/messenger/index.js +1 -1
  189. package/dist/schema/operations.d.ts +236 -11
  190. package/dist/schema/operations.js +1 -1
  191. package/dist/schema/persona/index.d.ts +15743 -0
  192. package/dist/schema/persona/index.js +1 -1
  193. package/dist/schema/query/bi.d.ts +869 -2
  194. package/dist/schema/query/bi.js +1 -1
  195. package/dist/schema/query/index.d.ts +163 -41
  196. package/dist/schema/query/index.js +1 -1
  197. package/dist/schema/schema-query/index.d.ts +16 -0
  198. package/dist/schema/schema-query/index.js +1 -1
  199. package/dist/schema/schema-version.js +1 -1
  200. package/dist/schema/strategy-review/index.d.ts +137 -0
  201. package/dist/schema/strategy-review/index.js +1 -0
  202. package/dist/schema/trust/index.d.ts +6 -6
  203. package/dist/schema/workflow/index.d.ts +2 -2
  204. package/dist/schema-query-impl/index.js +1 -1
  205. package/dist/schemas/account_operation.output.json +8 -4
  206. package/dist/schemas/account_operation.schema.json +6 -2
  207. package/dist/schemas/ask_user.output.json +54 -0
  208. package/dist/schemas/ask_user.schema.json +78 -0
  209. package/dist/schemas/bridge_operation.schema.json +50 -5
  210. package/dist/schemas/evaluation_operation.output.json +24 -0
  211. package/dist/schemas/goal_operation.schema.json +124 -0
  212. package/dist/schemas/guard2file.schema.json +10 -1
  213. package/dist/schemas/index.json +13 -1
  214. package/dist/schemas/industry_pack_operation.output.json +39 -0
  215. package/dist/schemas/local_mark_operation.schema.json +2 -2
  216. package/dist/schemas/machineNode2file.schema.json +10 -1
  217. package/dist/schemas/messenger_operation.output.json +678 -200
  218. package/dist/schemas/messenger_operation.schema.json +74 -239
  219. package/dist/schemas/onchain_events.output.json +2 -2
  220. package/dist/schemas/onchain_operations.schema.json +183 -21
  221. package/dist/schemas/onchain_operations_allocation.schema.json +10 -1
  222. package/dist/schemas/onchain_operations_arbitration.schema.json +10 -1
  223. package/dist/schemas/onchain_operations_contact.schema.json +10 -1
  224. package/dist/schemas/onchain_operations_demand.schema.json +10 -1
  225. package/dist/schemas/onchain_operations_gen_passport.schema.json +10 -1
  226. package/dist/schemas/onchain_operations_gen_proof.schema.json +10 -1
  227. package/dist/schemas/onchain_operations_guard.schema.json +10 -1
  228. package/dist/schemas/onchain_operations_machine.schema.json +10 -1
  229. package/dist/schemas/onchain_operations_order.schema.json +10 -1
  230. package/dist/schemas/onchain_operations_payment.schema.json +10 -1
  231. package/dist/schemas/onchain_operations_permission.schema.json +10 -1
  232. package/dist/schemas/onchain_operations_personal.schema.json +10 -1
  233. package/dist/schemas/onchain_operations_progress.schema.json +10 -1
  234. package/dist/schemas/onchain_operations_proof.schema.json +10 -1
  235. package/dist/schemas/onchain_operations_repository.schema.json +13 -4
  236. package/dist/schemas/onchain_operations_reward.schema.json +10 -1
  237. package/dist/schemas/onchain_operations_service.schema.json +10 -1
  238. package/dist/schemas/onchain_operations_treasury.schema.json +10 -1
  239. package/dist/schemas/onchain_table_data.output.json +184 -0
  240. package/dist/schemas/onchain_table_data.schema.json +43 -43
  241. package/dist/schemas/persona_operation.output.json +37778 -262
  242. package/dist/schemas/persona_operation.schema.json +5960 -1
  243. package/dist/schemas/query_toolkit.output.json +1580 -2
  244. package/dist/schemas/query_toolkit.schema.json +194 -32
  245. package/dist/schemas/schema_query.schema.json +25 -1
  246. package/dist/schemas/strategy_review_operation.output.json +532 -0
  247. package/dist/schemas/strategy_review_operation.schema.json +66 -0
  248. package/dist/schemas/wowok_buildin_info.output.json +188 -6
  249. package/dist/schemas/wowok_buildin_info.schema.json +14 -0
  250. package/dist/strategy/collectors.d.ts +66 -0
  251. package/dist/strategy/collectors.js +1 -0
  252. package/dist/strategy/collectors.spec.d.ts +1 -0
  253. package/dist/strategy/collectors.spec.js +1 -0
  254. package/dist/strategy/index.d.ts +5 -0
  255. package/dist/strategy/index.js +1 -0
  256. package/dist/strategy/metrics.d.ts +20 -0
  257. package/dist/strategy/metrics.js +1 -0
  258. package/dist/strategy/review.d.ts +48 -0
  259. package/dist/strategy/review.js +1 -0
  260. package/dist/strategy/scorecard.d.ts +32 -0
  261. package/dist/strategy/scorecard.js +1 -0
  262. package/dist/strategy/store.d.ts +26 -0
  263. package/dist/strategy/store.js +1 -0
  264. package/dist/tools/handlers/ask-user.d.ts +3 -0
  265. package/dist/tools/handlers/ask-user.js +1 -0
  266. package/dist/tools/handlers/config.js +1 -1
  267. package/dist/tools/handlers/evaluation.js +1 -1
  268. package/dist/tools/handlers/goal.js +1 -1
  269. package/dist/tools/handlers/industry-pack.js +1 -1
  270. package/dist/tools/handlers/local.js +1 -1
  271. package/dist/tools/handlers/messenger.js +1 -1
  272. package/dist/tools/handlers/onchain.js +1 -1
  273. package/dist/tools/handlers/permission.js +1 -1
  274. package/dist/tools/handlers/persona.js +1 -1
  275. package/dist/tools/handlers/query.d.ts +6 -0
  276. package/dist/tools/handlers/query.js +1 -1
  277. package/dist/tools/handlers/schema-query.js +1 -1
  278. package/dist/tools/handlers/strategy-review.d.ts +2 -0
  279. package/dist/tools/handlers/strategy-review.js +1 -0
  280. package/dist/tools/handlers/watch.js +1 -1
  281. package/dist/tools/handlers/workflow.js +1 -1
  282. package/dist/tools/index.d.ts +5 -2
  283. package/dist/tools/index.js +1 -1
  284. package/dist/tools/registry/agent.js +1 -1
  285. package/dist/tools/registry/bridge.js +1 -1
  286. package/dist/tools/registry/business.js +1 -1
  287. package/dist/tools/registry/interaction.d.ts +2 -0
  288. package/dist/tools/registry/interaction.js +1 -0
  289. package/dist/tools/registry/local.js +1 -1
  290. package/dist/tools/registry/messenger.js +1 -1
  291. package/dist/tools/registry/monitor.js +1 -1
  292. package/dist/tools/registry/onchain.js +1 -1
  293. package/dist/tools/registry/query.js +1 -1
  294. package/dist/tools/rules-hook.js +1 -1
  295. package/dist/tools/shared.d.ts +2 -1
  296. package/dist/tools/shared.js +1 -1
  297. package/dist/tools/types.d.ts +7 -1
  298. package/dist/tools/wrap.d.ts +3 -3
  299. package/dist/tools/wrap.js +1 -1
  300. package/package.json +2 -2
@@ -1 +1 @@
1
- import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{bridgeMonitorSuggestions}from'./SuggestionBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{runKeeperScan as a177a,realKeeperScanDeps}from'../keeper/KeeperScan.js';import{addProblem,addSuggestion,listProblems,listSuggestions}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'openSuggestions':a=>bridgeMonitorSuggestions(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addSuggestion':addSuggestion,'listSuggestions':listSuggestions,'logger':b=>console['error']('[monitor]\x20'+b)}),'runKeeperScan':(a,b)=>a177a(a,b,realKeeperScanDeps()),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}if(m['length']>0x0&&this['deps']['openSuggestions'])try{await this['deps']['openSuggestions']({'network':a,'events':j,'annotations':m,'scope':k});}catch(s){this['deps']['logger']('monitor\x20loop:\x20suggestion\x20bridge\x20error\x20on\x20'+a+':\x20'+String(s?.['message']??s));}if(this['deps']['runKeeperScan'])try{await this['deps']['runKeeperScan'](a,k);}catch(t){this['deps']['logger']('monitor\x20loop:\x20keeper\x20scan\x20error\x20on\x20'+a+':\x20'+String(t?.['message']??t));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:u,changed:v}=await this['deps']['resolveScope'](a,f);c['scope']=u;if(v){const w=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),x=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],u,w,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+u['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+x['rescanned']+',\x20updated\x20'+x['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(y){const z=String(y?.['message']??y);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+z),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
1
+ import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{bridgeMonitorSuggestions}from'./SuggestionBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{runKeeperScan as a205a,realKeeperScanDeps}from'../keeper/KeeperScan.js';import{addProblem,addSuggestion,listProblems,listSuggestions}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'openSuggestions':a=>bridgeMonitorSuggestions(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addSuggestion':addSuggestion,'listSuggestions':listSuggestions,'logger':b=>console['error']('[monitor]\x20'+b)}),'runKeeperScan':(a,b)=>a205a(a,b,realKeeperScanDeps()),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}if(m['length']>0x0&&this['deps']['openSuggestions'])try{await this['deps']['openSuggestions']({'network':a,'events':j,'annotations':m,'scope':k});}catch(s){this['deps']['logger']('monitor\x20loop:\x20suggestion\x20bridge\x20error\x20on\x20'+a+':\x20'+String(s?.['message']??s));}if(this['deps']['runKeeperScan'])try{await this['deps']['runKeeperScan'](a,k);}catch(t){this['deps']['logger']('monitor\x20loop:\x20keeper\x20scan\x20error\x20on\x20'+a+':\x20'+String(t?.['message']??t));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:u,changed:v}=await this['deps']['resolveScope'](a,f);c['scope']=u;if(v){const w=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),x=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],u,w,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+u['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+x['rescanned']+',\x20updated\x20'+x['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(y){const z=String(y?.['message']??y);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+z),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
@@ -1 +1 @@
1
- import{SQLiteStorage}from'@wowok/wowok/w/local';import{query_objects,queryOrdersByUser,objectTypeFromAddress}from'@wowok/wowok';import{fetchEntityPermission,fetchObjectLinkerCore,fetchObjectLinkerTx,fetchServiceOrders,listLocalAccounts}from'../knowledge/workflow-guidance.js';import{monitorEventStore}from'./EventStore.js';import{formatShortAddress}from'../persona/address-format.js';import{LOOP_DEFAULTS,normalizeAddr}from'./types.js';const SCOPE_PREFIX='mon_scope:v4:',SCOPE_HIST_PREFIX='mon_scope_hist:v4:',SCOPE_HISTORY_KEEP=0x5,FAVOR_SCAN_MAX=0x1388;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function realDeps(){return{'listLocalAccounts':()=>listLocalAccounts(),'fetchEntityPermission':(a,b)=>fetchEntityPermission(a,b),'fetchObjectLinkerCore':(a,b)=>fetchObjectLinkerCore(a,b),'fetchObjectLinkerTx':(a,b)=>fetchObjectLinkerTx(a,b),'queryServiceOrders':a=>fetchServiceOrders(a['address'],a['network']),'queryOrdersByUser':a=>queryOrdersByUser({'address':a['address'],'network':a['network']}),'queryObjects':a=>query_objects({'objects':a['objects'],'network':a['network']}),'objectTypeFromAddress':a=>objectTypeFromAddress(a),'store':monitorEventStore,'storage':new SQLiteStorage(),'now':()=>Date['now']()};}function canonicalize(a){if(Array['isArray'](a))return a['map'](canonicalize)['sort']((c,d)=>{const e=JSON['stringify'](c),f=JSON['stringify'](d);return e<f?-0x1:e>f?0x1:0x0;});if(a&&typeof a==='object'){const b={};for(const c of Object['keys'](a)['sort']()){b[c]=canonicalize(a[c]);}return b;}return a;}function semanticHashOf(a){return JSON['stringify'](canonicalize({'accounts':a['accounts'],'permissions':a['permissions'],'managed_objects':a['managed_objects'],'services':a['services'],'orders':a['orders'],'order_children':a['order_children'],'focus':a['focus']}));}function lowerTypeOf(a,b){try{return a['objectTypeFromAddress'](b)?.['toLowerCase']()??null;}catch{return null;}}function objectFields(a){return a?.['data']??a??{};}function childrenOfOrder(a){const b=[],c=Array['isArray'](a?.['dispute'])?a['dispute']:[];for(const e of c){if(typeof e==='string'&&e)b['push']({'type':'arb','object':e});}return typeof a?.['progress']==='string'&&a['progress']&&b['push']({'type':'progress','object':a['progress']}),typeof a?.['allocation']==='string'&&a['allocation']&&b['push']({'type':'allocation','object':a['allocation']}),b;}export async function loadScopeSnapshot(a,b){try{const c=await(b??new SQLiteStorage())['get'](''+SCOPE_PREFIX+netKey(a));if(!c)return undefined;const d=JSON['parse'](c);return d&&typeof d['version']==='number'?d:undefined;}catch{return undefined;}}export async function resolveScope(a,b,e){const g={...realDeps(),...e??{}},h=g['now'](),j=[],k=async(N,O)=>{try{return await O();}catch{return j['push'](N),undefined;}},l=''+SCOPE_PREFIX+netKey(a),n=''+SCOPE_HIST_PREFIX+netKey(a);let p;try{const N=await g['storage']['get'](l);p=N?JSON['parse'](N):undefined;}catch{p=undefined;}let q;if(b['scope']['accounts']==='local-all'){const O=await k('accounts',()=>g['listLocalAccounts']());q=(O??[])['map'](P=>P['address'])['filter'](P=>typeof P==='string'&&P);}else q=[...b['scope']['accounts']];q=[...new Set(q)];const s=b['scope']['rules'],t=[],u=[],w=new Map();if(s['managed_objects']||s['merchant_orders']){for(const R of q){const S=await k('entity_permission:'+formatShortAddress(R),()=>g['fetchEntityPermission'](R,a));for(const T of S?.['items']??[]){if(T?.['permission'])t['push'](T['permission']);}}const P=[...new Set(t)];t['length']=0x0,t['push'](...P);const Q=new Set();for(const U of P){const V=await k('object_linker_core:'+formatShortAddress(U),()=>g['fetchObjectLinkerCore'](U,a)),W=await k('object_linker_tx:'+formatShortAddress(U),()=>g['fetchObjectLinkerTx'](U,a)),X=[...(V?.['items']??[])['map'](Y=>Y?.['who']),...(W?.['items']??[])['map'](Y=>Y?.['who'])];for(const Y of X){if(typeof Y!=='string'||!Y)continue;const Z=lowerTypeOf(g,Y);if(!Z)continue;const a0=normalizeAddr(Y);if(Q['has'](a0))continue;Q['add'](a0),u['push']({'type':Z,'object':Y}),w['set'](a0,U);}}}const x=u['filter'](a1=>a1['type']==='service')['map'](a1=>a1['object']),y=new Map(),z=(a1,a2)=>{const a3=normalizeAddr(a1);if(!a3)return;const a4=y['get'](a3)??{'order':a1,'merchant':![],'buyer':![]};a4[a2]=!![],y['set'](a3,a4);};if(s['merchant_orders'])for(const a1 of x){const a2=await k('service_orders:'+formatShortAddress(a1),()=>g['queryServiceOrders']({'address':a1,'network':a}));for(const a3 of a2?.['items']??[]){if(typeof a3?.['who']==='string'&&a3['who'])z(a3['who'],'merchant');}}if(s['my_orders'])for(const a4 of q){const a5=await k('user_orders:'+formatShortAddress(a4),()=>g['queryOrdersByUser']({'address':a4,'network':a}));for(const a6 of a5??[]){if(!a6?.['is_owner']&&!a6?.['is_agent'])continue;const a7=a6?.['order']?.['object']??a6?.['order']?.['id'];if(typeof a7==='string'&&a7)z(a7,'buyer');}}const A=[...y['values']()]['map'](a8=>({'order':a8['order'],'role':a8['merchant']&&a8['buyer']?'both':a8['merchant']?'merchant':'buyer'})),B=[],C=new Map();if(s['order_children']&&y['size']>0x0){const a8=[...y['values']()]['map'](a9=>a9['order']);for(let a9=0x0;a9<a8['length'];a9+=0x32){const aa=a8['slice'](a9,a9+0x32),ab=await k('order_objects:'+formatShortAddress(aa[0x0]),()=>g['queryObjects']({'objects':aa,'network':a}));for(const ac of ab?.['objects']??[]){const ad=objectFields(ac),ae=ac?.['object']??ad?.['object']??ad?.['id'];if(typeof ae!=='string'||!ae)continue;for(const af of childrenOfOrder(ad)){const ag=normalizeAddr(af['object']);if(C['has'](ag))continue;C['set'](ag,ae),B['push'](af);}}}}const D=(b['scope']['focus_objects']??[])['map'](ah=>({...ah})),E=new Set(D['map'](ah=>normalizeAddr(ah['object']))),F=new Map();for(const ah of p?.['focus']??[]){if(ah?.['reason']==='favor'&&ah['object'])F['set'](normalizeAddr(ah['object']),ah['added_at']);}if(s['favor_objects']&&q['length']>0x0){const ai=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),aj=h-Math['max'](0x0,ai)*0x5265c00,ak=new Set(q['map'](al=>normalizeAddr(al)));try{let al=0x0;for(;;){const am=await g['store']['list'](a,{'module':'arb','eventType':'FeedbackEvent','since':aj,'offset':al,'limit':0xc8});if(am['events']['length']===0x0)break;for(const an of am['events']){const ao=an['event'],ap=normalizeAddr(ao?.['sender']);if(!ap||!ak['has'](ap))continue;const aq=ao?.['object'],ar=normalizeAddr(typeof aq==='string'?aq:'');if(!ar||E['has'](ar))continue;E['add'](ar),D['push']({'object':aq,'added_at':F['get'](ar)??h,'reason':'favor','closure':!![]});}al+=am['events']['length'];if(al>=am['total']||al>=FAVOR_SCAN_MAX)break;}}catch{j['push']('favor_scan');}}const G={},H=(as,at)=>{const au=normalizeAddr(as);if(!au)return;const av=G[au]??=[],aw=av['some'](ax=>ax['rule']===at['rule']&&normalizeAddr(ax['object'])===normalizeAddr(at['object']));if(!aw)av['push'](at);};if(s['managed_objects'])for(const as of u){const at=w['get'](normalizeAddr(as['object']));H(as['object'],{'rule':'managed_objects','object':as['object'],'detail':at?as['type']+'\x20'+formatShortAddress(as['object'])+'\x20of\x20permission\x20'+formatShortAddress(at):as['type']+'\x20'+formatShortAddress(as['object'])+'\x20(managed)'});}for(const au of A){(au['role']==='merchant'||au['role']==='both')&&H(au['order'],{'rule':'merchant_orders','object':au['order'],'detail':'order\x20'+formatShortAddress(au['order'])+'\x20(merchant)'}),(au['role']==='buyer'||au['role']==='both')&&H(au['order'],{'rule':'my_orders','object':au['order'],'detail':'order\x20'+formatShortAddress(au['order'])+'\x20(buyer)'});}if(s['order_children'])for(const av of B){const aw=C['get'](normalizeAddr(av['object']));H(av['object'],{'rule':'order_children','object':av['object'],'detail':aw?av['type']+'\x20'+formatShortAddress(av['object'])+'\x20of\x20order\x20'+formatShortAddress(aw):av['type']+'\x20'+formatShortAddress(av['object'])+'\x20(order\x20child)'});}for(const ax of D){const ay=lowerTypeOf(g,ax['object']);H(ax['object'],{'rule':'focus','object':ax['object'],'detail':'focused\x20'+(ay??'object')+'\x20'+formatShortAddress(ax['object'])});if(!ax['closure'])continue;if(ay==='service'){const az=await k('focus_service_orders:'+formatShortAddress(ax['object']),()=>g['queryServiceOrders']({'address':ax['object'],'network':a}));for(const aA of az?.['items']??[]){if(typeof aA?.['who']!=='string'||!aA['who'])continue;H(aA['who'],{'rule':'focus','object':aA['who'],'detail':'order\x20'+formatShortAddress(aA['who'])+'\x20of\x20focused\x20service\x20'+formatShortAddress(ax['object'])});}}else{if(ay==='order'){const aB=await k('focus_order:'+formatShortAddress(ax['object']),()=>g['queryObjects']({'objects':[ax['object']],'network':a})),aC=objectFields(aB?.['objects']?.[0x0]);for(const aD of childrenOfOrder(aC)){H(aD['object'],{'rule':'focus','object':aD['object'],'detail':aD['type']+'\x20'+formatShortAddress(aD['object'])+'\x20of\x20focused\x20order\x20'+formatShortAddress(ax['object'])});}}}}const I={'accounts':q,'permissions':t,'managed_objects':u,'services':x,'orders':A,'order_children':B,'focus':D},J=semanticHashOf(I),K=!p||semanticHashOf(p)!==J,L=p?K?p['version']+0x1:p['version']:0x1,M={'version':L,'resolved_at':h,...I,'index':G,...j['length']>0x0?{'data_gaps':j}:{}};try{await g['storage']['put'](l,JSON['stringify'](M));if(K){let aE=[];try{const aF=await g['storage']['get'](n),aG=aF?JSON['parse'](aF):undefined;aE=Array['isArray'](aG?.['snapshots'])?aG['snapshots']:[];}catch{aE=[];}aE['unshift'](M),await g['storage']['put'](n,JSON['stringify']({'snapshots':aE['slice'](0x0,SCOPE_HISTORY_KEEP)}));}}catch{j['push']('snapshot_persist');}return{'snapshot':M,'changed':K};}
1
+ import{SQLiteStorage}from'@wowok/wowok/w/local';import{query_objects,queryOrdersByUser,objectTypeFromAddress}from'@wowok/wowok';import{fetchEntityPermission,fetchObjectLinkerCore,fetchObjectLinkerTx,fetchServiceOrders}from'../graph/onchain/sdk-batch.js';import{listLocalAccounts}from'../knowledge/workflow-guidance.js';import{monitorEventStore}from'./EventStore.js';import{formatShortAddress}from'../persona/address-format.js';import{LOOP_DEFAULTS,normalizeAddr}from'./types.js';const SCOPE_PREFIX='mon_scope:v4:',SCOPE_HIST_PREFIX='mon_scope_hist:v4:',SCOPE_HISTORY_KEEP=0x5,FAVOR_SCAN_MAX=0x1388;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function realDeps(){return{'listLocalAccounts':()=>listLocalAccounts(),'fetchEntityPermission':(a,b)=>fetchEntityPermission(a,b),'fetchObjectLinkerCore':(a,b)=>fetchObjectLinkerCore(a,b),'fetchObjectLinkerTx':(a,b)=>fetchObjectLinkerTx(a,b),'queryServiceOrders':a=>fetchServiceOrders(a['address'],a['network']),'queryOrdersByUser':a=>queryOrdersByUser({'address':a['address'],'network':a['network']}),'queryObjects':a=>query_objects({'objects':a['objects'],'network':a['network']}),'objectTypeFromAddress':a=>objectTypeFromAddress(a),'store':monitorEventStore,'storage':new SQLiteStorage(),'now':()=>Date['now']()};}function canonicalize(a){if(Array['isArray'](a))return a['map'](canonicalize)['sort']((c,d)=>{const e=JSON['stringify'](c),f=JSON['stringify'](d);return e<f?-0x1:e>f?0x1:0x0;});if(a&&typeof a==='object'){const b={};for(const c of Object['keys'](a)['sort']()){b[c]=canonicalize(a[c]);}return b;}return a;}function semanticHashOf(a){return JSON['stringify'](canonicalize({'accounts':a['accounts'],'permissions':a['permissions'],'managed_objects':a['managed_objects'],'services':a['services'],'orders':a['orders'],'order_children':a['order_children'],'focus':a['focus']}));}function lowerTypeOf(a,b){try{return a['objectTypeFromAddress'](b)?.['toLowerCase']()??null;}catch{return null;}}function objectFields(a){return a?.['data']??a??{};}function childrenOfOrder(a){const b=[],c=Array['isArray'](a?.['dispute'])?a['dispute']:[];for(const e of c){if(typeof e==='string'&&e)b['push']({'type':'arb','object':e});}return typeof a?.['progress']==='string'&&a['progress']&&b['push']({'type':'progress','object':a['progress']}),typeof a?.['allocation']==='string'&&a['allocation']&&b['push']({'type':'allocation','object':a['allocation']}),b;}export async function loadScopeSnapshot(a,b){try{const c=await(b??new SQLiteStorage())['get'](''+SCOPE_PREFIX+netKey(a));if(!c)return undefined;const d=JSON['parse'](c);return d&&typeof d['version']==='number'?d:undefined;}catch{return undefined;}}export async function resolveScope(a,b,e){const g={...realDeps(),...e??{}},h=g['now'](),i=[],j=async(M,N)=>{try{return await N();}catch{return i['push'](M),undefined;}},k=''+SCOPE_PREFIX+netKey(a),l=''+SCOPE_HIST_PREFIX+netKey(a);let n;try{const M=await g['storage']['get'](k);n=M?JSON['parse'](M):undefined;}catch{n=undefined;}let p;if(b['scope']['accounts']==='local-all'){const N=await j('accounts',()=>g['listLocalAccounts']());p=(N??[])['map'](O=>O['address'])['filter'](O=>typeof O==='string'&&O);}else p=[...b['scope']['accounts']];p=[...new Set(p)];const q=b['scope']['rules'],s=[],t=[],u=new Map();if(q['managed_objects']||q['merchant_orders']){for(const Q of p){const R=await j('entity_permission:'+formatShortAddress(Q),()=>g['fetchEntityPermission'](Q,a));for(const S of R?.['items']??[]){if(S?.['permission'])s['push'](S['permission']);}}const O=[...new Set(s)];s['length']=0x0,s['push'](...O);const P=new Set();for(const T of O){const U=await j('object_linker_core:'+formatShortAddress(T),()=>g['fetchObjectLinkerCore'](T,a)),V=await j('object_linker_tx:'+formatShortAddress(T),()=>g['fetchObjectLinkerTx'](T,a)),W=[...(U?.['items']??[])['map'](X=>X?.['who']),...(V?.['items']??[])['map'](X=>X?.['who'])];for(const X of W){if(typeof X!=='string'||!X)continue;const Y=lowerTypeOf(g,X);if(!Y)continue;const Z=normalizeAddr(X);if(P['has'](Z))continue;P['add'](Z),t['push']({'type':Y,'object':X}),u['set'](Z,T);}}}const w=t['filter'](a0=>a0['type']==='service')['map'](a0=>a0['object']),x=new Map(),y=(a0,a1)=>{const a2=normalizeAddr(a0);if(!a2)return;const a3=x['get'](a2)??{'order':a0,'merchant':![],'buyer':![]};a3[a1]=!![],x['set'](a2,a3);};if(q['merchant_orders'])for(const a0 of w){const a1=await j('service_orders:'+formatShortAddress(a0),()=>g['queryServiceOrders']({'address':a0,'network':a}));for(const a2 of a1?.['items']??[]){if(typeof a2?.['who']==='string'&&a2['who'])y(a2['who'],'merchant');}}if(q['my_orders'])for(const a3 of p){const a4=await j('user_orders:'+formatShortAddress(a3),()=>g['queryOrdersByUser']({'address':a3,'network':a}));for(const a5 of a4??[]){if(!a5?.['is_owner']&&!a5?.['is_agent'])continue;const a6=a5?.['order']?.['object']??a5?.['order']?.['id'];if(typeof a6==='string'&&a6)y(a6,'buyer');}}const z=[...x['values']()]['map'](a7=>({'order':a7['order'],'role':a7['merchant']&&a7['buyer']?'both':a7['merchant']?'merchant':'buyer'})),A=[],B=new Map();if(q['order_children']&&x['size']>0x0){const a7=[...x['values']()]['map'](a9=>a9['order']),a8=await j('order_objects:'+a7['length'],()=>g['queryObjects']({'objects':a7,'network':a}));for(const a9 of a8?.['objects']??[]){const aa=objectFields(a9),ab=a9?.['object']??aa?.['object']??aa?.['id'];if(typeof ab!=='string'||!ab)continue;for(const ac of childrenOfOrder(aa)){const ad=normalizeAddr(ac['object']);if(B['has'](ad))continue;B['set'](ad,ab),A['push'](ac);}}}const C=(b['scope']['focus_objects']??[])['map'](ae=>({...ae})),D=new Set(C['map'](ae=>normalizeAddr(ae['object']))),E=new Map();for(const ae of n?.['focus']??[]){if(ae?.['reason']==='favor'&&ae['object'])E['set'](normalizeAddr(ae['object']),ae['added_at']);}if(q['favor_objects']&&p['length']>0x0){const af=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),ag=h-Math['max'](0x0,af)*0x5265c00,ah=new Set(p['map'](ai=>normalizeAddr(ai)));try{let ai=0x0;for(;;){const aj=await g['store']['list'](a,{'module':'arb','eventType':'FeedbackEvent','since':ag,'offset':ai,'limit':0xc8});if(aj['events']['length']===0x0)break;for(const ak of aj['events']){const al=ak['event'],am=normalizeAddr(al?.['sender']);if(!am||!ah['has'](am))continue;const an=al?.['object'],ao=normalizeAddr(typeof an==='string'?an:'');if(!ao||D['has'](ao))continue;D['add'](ao),C['push']({'object':an,'added_at':E['get'](ao)??h,'reason':'favor','closure':!![]});}ai+=aj['events']['length'];if(ai>=aj['total']||ai>=FAVOR_SCAN_MAX)break;}}catch{i['push']('favor_scan');}}const F={},G=(ap,aq)=>{const ar=normalizeAddr(ap);if(!ar)return;const as=F[ar]??=[],at=as['some'](au=>au['rule']===aq['rule']&&normalizeAddr(au['object'])===normalizeAddr(aq['object']));if(!at)as['push'](aq);};if(q['managed_objects'])for(const ap of t){const aq=u['get'](normalizeAddr(ap['object']));G(ap['object'],{'rule':'managed_objects','object':ap['object'],'detail':aq?ap['type']+'\x20'+formatShortAddress(ap['object'])+'\x20of\x20permission\x20'+formatShortAddress(aq):ap['type']+'\x20'+formatShortAddress(ap['object'])+'\x20(managed)'});}for(const ar of z){(ar['role']==='merchant'||ar['role']==='both')&&G(ar['order'],{'rule':'merchant_orders','object':ar['order'],'detail':'order\x20'+formatShortAddress(ar['order'])+'\x20(merchant)'}),(ar['role']==='buyer'||ar['role']==='both')&&G(ar['order'],{'rule':'my_orders','object':ar['order'],'detail':'order\x20'+formatShortAddress(ar['order'])+'\x20(buyer)'});}if(q['order_children'])for(const as of A){const at=B['get'](normalizeAddr(as['object']));G(as['object'],{'rule':'order_children','object':as['object'],'detail':at?as['type']+'\x20'+formatShortAddress(as['object'])+'\x20of\x20order\x20'+formatShortAddress(at):as['type']+'\x20'+formatShortAddress(as['object'])+'\x20(order\x20child)'});}for(const au of C){const av=lowerTypeOf(g,au['object']);G(au['object'],{'rule':'focus','object':au['object'],'detail':'focused\x20'+(av??'object')+'\x20'+formatShortAddress(au['object'])});if(!au['closure'])continue;if(av==='service'){const aw=await j('focus_service_orders:'+formatShortAddress(au['object']),()=>g['queryServiceOrders']({'address':au['object'],'network':a}));for(const ax of aw?.['items']??[]){if(typeof ax?.['who']!=='string'||!ax['who'])continue;G(ax['who'],{'rule':'focus','object':ax['who'],'detail':'order\x20'+formatShortAddress(ax['who'])+'\x20of\x20focused\x20service\x20'+formatShortAddress(au['object'])});}}else{if(av==='order'){const ay=await j('focus_order:'+formatShortAddress(au['object']),()=>g['queryObjects']({'objects':[au['object']],'network':a})),az=objectFields(ay?.['objects']?.[0x0]);for(const aA of childrenOfOrder(az)){G(aA['object'],{'rule':'focus','object':aA['object'],'detail':aA['type']+'\x20'+formatShortAddress(aA['object'])+'\x20of\x20focused\x20order\x20'+formatShortAddress(au['object'])});}}}}const H={'accounts':p,'permissions':s,'managed_objects':t,'services':w,'orders':z,'order_children':A,'focus':C},I=semanticHashOf(H),J=!n||semanticHashOf(n)!==I,K=n?J?n['version']+0x1:n['version']:0x1,L={'version':K,'resolved_at':h,...H,'index':F,...i['length']>0x0?{'data_gaps':i}:{}};try{await g['storage']['put'](k,JSON['stringify'](L));if(J){let aB=[];try{const aC=await g['storage']['get'](l),aD=aC?JSON['parse'](aC):undefined;aB=Array['isArray'](aD?.['snapshots'])?aD['snapshots']:[];}catch{aB=[];}aB['unshift'](L),await g['storage']['put'](l,JSON['stringify']({'snapshots':aB['slice'](0x0,SCOPE_HISTORY_KEEP)}));}}catch{i['push']('snapshot_persist');}return{'snapshot':L,'changed':J};}
@@ -1,23 +1,10 @@
1
1
  import type { CommercialRole } from "../role/types.js";
2
+ import { type WorkflowSubgraph } from "../graph/onchain/order-status.js";
2
3
  import type { CollaboratorInterestAnalysis } from "./collaborator-interest.js";
3
4
  import type { CustomerInterestAnalysis } from "./customer-interest.js";
4
5
  import type { MerchantInterestAnalysis } from "./merchant-interest.js";
5
6
  import type { SupplierInterestAnalysis } from "./supplier-interest.js";
6
7
  import type { PermissionObjectData } from "../schema/utils/permission-machine-check.js";
7
- export interface RadarMachineNode {
8
- name: string;
9
- pairs?: Array<{
10
- prev_node: string;
11
- threshold?: number;
12
- forwards?: Array<{
13
- name: string;
14
- permissionIndex?: number | null;
15
- namedOperator?: string | null;
16
- guard?: string | null;
17
- weight?: number | null;
18
- }>;
19
- }>;
20
- }
21
8
  export interface NodeAnnotations {
22
9
  completed?: string[];
23
10
  refunded?: string[];
@@ -28,7 +15,7 @@ export interface OrderRadarInput {
28
15
  order_address?: string;
29
16
  current_node: string;
30
17
  order_holder?: string;
31
- machine_nodes?: RadarMachineNode[];
18
+ workflow?: WorkflowSubgraph;
32
19
  permission?: PermissionObjectData | null;
33
20
  named_accounts?: Record<string, string | string[]>;
34
21
  demand_presenters?: string[];
@@ -49,6 +36,17 @@ export interface OrderRadarInput {
49
36
  unread_messages?: number;
50
37
  }
51
38
  export type ExecutionPath = "order_holder" | "permission" | "named_operator" | "not_available";
39
+ export interface RecommendedCall {
40
+ tool: "onchain_operations" | "workflow_operation";
41
+ path: string;
42
+ reason: string;
43
+ }
44
+ export declare function recommendedCallForExecutionPath(path: ExecutionPath, hasGuard?: boolean): RecommendedCall | undefined;
45
+ export declare function recommendedCallForForwardBinding(opts: {
46
+ permissionIndex: number | null | undefined;
47
+ namedOperator: string | null | undefined;
48
+ hasGuard?: boolean;
49
+ }): RecommendedCall | undefined;
52
50
  export interface RadarForward {
53
51
  name: string;
54
52
  to_node: string;
@@ -59,6 +57,7 @@ export interface RadarForward {
59
57
  semantics: string;
60
58
  consequence?: string;
61
59
  weight?: number;
60
+ recommended_call?: RecommendedCall;
62
61
  }
63
62
  export interface PendingClaim {
64
63
  kind: "reward" | "discount" | "compensation" | "rating";
@@ -111,3 +110,4 @@ export interface AccountRadarDashboard {
111
110
  }
112
111
  export declare function aggregateRadar(results: OrderRadarResult[], unreadTotal?: number): AccountRadarDashboard;
113
112
  export declare function isConsequenceNode(nodeName: string, kind: keyof Required<NodeAnnotations>, annotations?: NodeAnnotations): boolean;
113
+ export declare function consequenceOf(toNode: string, annotations: NodeAnnotations | undefined): string | undefined;
@@ -1 +1 @@
1
- import{deriveCommercialRole,CORE_PERMISSION_INDEX}from'../role/derivation.js';const DEFAULT_ANNOTATIONS={'completed':['complete','completed','done','finish','finished','delivered','accepted'],'refunded':['refund','refunded','cancelled','canceled','lost','closed']};export function analyzeOrderParticipation(a){const b={'completed':a['node_annotations']?.['completed']??DEFAULT_ANNOTATIONS['completed'],'refunded':a['node_annotations']?.['refunded']??DEFAULT_ANNOTATIONS['refunded']},c=a['current_node']??'',d=!!a['order_holder']&&a['order_holder']===a['account'],e=new Set();if(a['permission']?.['entityPermissions'])for(const [t,u]of a['permission']['entityPermissions']){if(t===a['account']){for(const v of u)e['add'](v);}}if(a['permission']){const w=a['permission']['admin']??[],x=a['permission']['owner'];(w['some'](y=>y['toLowerCase']()===a['account']['toLowerCase']())||x&&x['toLowerCase']()===a['account']['toLowerCase']())&&e['add'](CORE_PERMISSION_INDEX['service']);}const f=[];if(a['named_accounts'])for(const [y,z]of Object['entries'](a['named_accounts'])){if(nameResolvesTo(z,a['account']))f['push'](y);}const g=deriveCommercialRole({'account':a['account'],'order_holder':a['order_holder'],'held_permission_indexes':Array['from'](e),'named_operator_names':f,'demand_presenters':a['demand_presenters'],'has_active_order':!![]}),h=g['role'],i=g['collaborator_kind'],j=[],k=[],l=!a['machine_nodes'];let m;if(a['machine_nodes'])for(const A of a['machine_nodes']){for(const B of A['pairs']??[]){if(B['prev_node']!==c)continue;m=B['threshold'];for(const C of B['forwards']??[]){const D=resolveForward(C,A['name'],a,d,e,b);if(D['execution_path']==='not_available'){const E=C['permissionIndex']!=null?'permission\x20index\x20'+C['permissionIndex']:C['namedOperator']===''?'OrderHolder\x20(customer)':'named\x20operator\x20\x27'+C['namedOperator']+'\x27',F=k['find'](G=>G['role']===E);if(F)F['forwards']['push'](D['name']);else k['push']({'role':E,'forwards':[D['name']]});}else j['push'](D);}}}const n=[];d&&n['push']({'label':'OrderHolder\x20(customer)','can_act_now':j['some'](G=>G['execution_path']==='order_holder')});for(const G of[...e]['sort']((H,I)=>H-I)){n['push']({'label':'permission\x20index\x20'+G,'can_act_now':j['some'](H=>H['permission_index']===G)});}if(a['named_accounts'])for(const [H,I]of Object['entries'](a['named_accounts'])){nameResolvesTo(I,a['account'])&&n['push']({'label':'named\x20operator\x20\x27'+H+'\x27','can_act_now':j['some'](J=>J['named_operator']===H)});}let o;j['length']>0x1&&(o={'message':j['length']+'\x20operations\x20are\x20available\x20to\x20you\x20at\x20node\x20\x27'+(c||'(entry)')+'\x27.\x20'+'Each\x20leads\x20to\x20a\x20different\x20outcome\x20—\x20review\x20the\x20consequences\x20and\x20choose;\x20no\x20one\x20else\x20can\x20make\x20this\x20decision\x20for\x20you.','options':j['map'](J=>({'forward':J['name'],'to_node':J['to_node'],'consequence':J['consequence']}))});const p=[];for(const J of a['claimable_rewards']??[]){if(J['already_claimed'])continue;p['push']({'kind':'reward','label':J['description']??'Reward\x20'+J['address'],'how':'onchain_operations\x20reward\x20op=\x27claim\x27\x20(object=\x27'+J['address']+'\x27)'});}a['pending_compensation']&&p['push']({'kind':'compensation','label':a['pending_compensation']['note']??'Arbitration\x20indemnity\x20awarded\x20to\x20you','how':'onchain_operations\x20service\x20op=\x27compensation_claim\x27\x20(arbitration=\x27'+a['pending_compensation']['arbitration']+'\x27)\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund'});a['discount_available']&&p['push']({'kind':'discount','label':a['discount_available'],'how':'Mention\x20the\x20discount\x20when\x20placing\x20the\x20next\x20order\x20(reward\x20discount\x20config\x20applies\x20at\x20purchase)'});a['rating_pending']&&p['push']({'kind':'rating','label':'Rate\x20this\x20transaction\x20(like/dislike)\x20—\x20builds\x20on-chain\x20reputation\x20for\x20both\x20sides','how':'onchain_operations\x20operation_type=\x27personal\x27,\x20data.mark={op:\x27like\x27|\x27dislike\x27,\x20address:\x27<merchant\x20address>\x27}\x20—\x20votes\x20through\x20registrar::like/dislike\x20into\x20the\x20PUBLIC\x20aggregate\x20count'});const q=buildInterestHints(a,h,j,k,c),s=buildSummary(a,h,n,j,k,p,l,c);return{'account':a['account'],'progress':a['progress_address'],'order':a['order_address'],'current_node':c,'perspective':h,'collaborator_kind':i,'roles':n,'operable':j,'branch_choice':o,'waiting_on':k,'pending_claims':p,'interest_hints':q,'workflow_unknown':l,'threshold':m,'summary':s};}export function aggregateRadar(a,b){const c=a['filter'](g=>g['operable']['length']>0x0||g['pending_claims']['length']>0x0)['sort']((g,h)=>(g['perspective']==='customer'?0x0:0x1)-(h['perspective']==='customer'?0x0:0x1)),d=a['filter'](g=>g['operable']['length']===0x0&&g['pending_claims']['length']===0x0),e=a['flatMap'](g=>g['pending_claims']['map'](h=>({...h,'progress':g['progress']}))),f=a['length']===0x0?'No\x20in-flight\x20orders\x20found\x20for\x20this\x20account.':a['length']+'\x20in-flight\x20order(s):\x20'+c['length']+'\x20need\x20your\x20action\x20or\x20have\x20claims,\x20'+d['length']+'\x20are\x20waiting\x20on\x20other\x20roles.\x20'+(e['length']>0x0?e['length']+'\x20unclaimed\x20benefit(s)\x20detected.\x20':'')+(c['length']>0x0?'Top\x20priority:\x20'+c[0x0]['summary']:'Nothing\x20requires\x20your\x20action\x20right\x20now.');return{'account':a[0x0]?.['account']??'','orders_analyzed':a['length'],'actionable':c,'waiting':d,'all_pending_claims':e,'unread_messages_total':b??0x0,'summary':f};}function nameResolvesTo(a,b){if(!a)return![];return Array['isArray'](a)?a['includes'](b):a===b;}export function isConsequenceNode(a,b,c){const d=c?.[b]??DEFAULT_ANNOTATIONS[b],e=(a??'')['toLowerCase']();return d['some'](f=>e['includes'](f));}function resolveForward(a,b,c,d,e,f){let g='not_available';if(a['permissionIndex']!=null){if(e['has'](a['permissionIndex']))g='permission';}else{if(a['namedOperator']===''){if(d)g='order_holder';}else{if(a['namedOperator']!=null){const k=c['named_accounts']?.[a['namedOperator']];if(nameResolvesTo(k,c['account']))g='named_operator';}}}const h=b,i=describeForward(a['name']??'',h,g,a['permissionIndex'],a['namedOperator']),j=consequenceOf(h,f);return{'name':a['name']??'(unnamed)','to_node':h,'execution_path':g,'permission_index':a['permissionIndex']??undefined,'named_operator':a['namedOperator']??undefined,'guard':a['guard']??undefined,'semantics':i,'consequence':j,'weight':a['weight']??undefined};}function describeForward(a,b,c,d,e){const f=d!=null?'requires\x20permission\x20index\x20'+d:e===''?'executable\x20by\x20the\x20order\x20holder\x20(customer)':'executable\x20by\x20named\x20operator\x20\x27'+e+'\x27',g=c==='not_available'?'You\x20CANNOT\x20execute\x20this':'You\x20CAN\x20execute\x20this';return'\x27'+a+'\x27\x20advances\x20the\x20order\x20to\x20node\x20\x27'+b+'\x27\x20('+f+').\x20'+g+'.';}function consequenceOf(a,b){if(isConsequenceNode(a,'completed',b))return'Completion\x20path\x20—\x20funds\x20are\x20released\x20to\x20the\x20merchant\x20per\x20the\x20Allocation\x20waterfall;\x20refunds\x20become\x20harder\x20after\x20this\x20point.';if(isConsequenceNode(a,'refunded',b))return'Refund/cancellation\x20path\x20—\x20escrowed\x20funds\x20return\x20to\x20the\x20buyer\x20per\x20the\x20Allocation\x20configuration.';return undefined;}function buildInterestHints(a,b,c,d,e){const f=[],g=a['now']??Date['now'](),h=a['last_progress_at']!=null?(g-a['last_progress_at'])/0x36ee80:undefined;if(b==='customer')c['length']>0x0&&f['push']('Your\x20confirmation\x20is\x20the\x20fund-release\x20trigger:\x20escrowed\x20money\x20stays\x20locked\x20until\x20YOU\x20act\x20—\x20only\x20confirm\x20when\x20the\x20deliverable\x20matches\x20the\x20agreement.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Delivery\x20depends\x20on\x20the\x20merchant-side\x20roles\x20listed\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20Messenger\x20first,\x20then\x20consider\x20dispute\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x18&&f['push']('Order\x20has\x20not\x20advanced\x20for\x20'+Math['round'](h)+'h.\x20Your\x20leverage:\x20compensation_fund\x20(if\x20any)\x20+\x20arbitration\x20+\x20on-chain\x20reputation\x20(dislike)\x20—\x20in\x20that\x20order.');else{if(b==='supplier')c['length']>0x0&&f['push']('Advancing\x20your\x20sub-order\x20NOW\x20unlocks\x20YOUR\x20settlement\x20—\x20upload\x20delivery\x20evidence\x20first\x20to\x20protect\x20your\x20payment\x20claim\x20against\x20the\x20upstream\x20merchant.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Your\x20settlement\x20depends\x20on\x20upstream\x20roles\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20a\x20Messenger\x20nudge\x20first,\x20then\x20arbitration\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x30&&f['push']('Sub-order\x20stalled\x20'+Math['round'](h)+'h:\x20your\x20claim\x20erodes\x20with\x20time\x20—\x20evidence\x20+\x20a\x20Messenger\x20nudge\x20are\x20your\x20cheapest\x20protections.');else{if(b==='collaborator'||b==='merchant'){const i=d['filter'](j=>j['role']['startsWith']('permission\x20index'));c['length']>0x0&&f['push']('Advancing\x20the\x20workflow\x20NOW\x20improves\x20flow\x20efficiency\x20and\x20shortens\x20your\x20fund-settlement\x20cycle;\x20stalled\x20orders\x20degrade\x20your\x20on-chain\x20reputation\x20metrics\x20(dispute\x20rate,\x20stall\x20statistics).'),i['length']>0x0&&f['push']('Nodes\x20waiting\x20on\x20YOUR\x20permission\x20indexes\x20are\x20your\x20responsibility\x20surface:\x20prolonged\x20inaction\x20may\x20trigger\x20timeout\x20penalties\x20or\x20disputes\x20recorded\x20permanently\x20on-chain.'),e&&c['length']===0x0&&f['push']('Nothing\x20for\x20you\x20to\x20execute\x20at\x20this\x20node\x20—\x20monitor\x20only;\x20avoid\x20unnecessary\x20interference\x20that\x20creates\x20semantic\x20responsibility.');}else f['push']('You\x20hold\x20no\x20operative\x20role\x20on\x20this\x20order\x20(neutral).\x20On-chain\x20data\x20remains\x20transparent\x20to\x20you\x20for\x20auditing.');}}return(a['unread_messages']??0x0)>0x0&&f['push'](a['unread_messages']+'\x20unread\x20Messenger\x20message(s)\x20—\x20negotiation\x20evidence\x20(WTS)\x20forms\x20the\x20arbitration\x20record;\x20timely\x20replies\x20protect\x20your\x20position.'),f;}function buildSummary(a,b,c,d,e,f,g,h){const i=c['length']>0x0?c['map'](m=>m['label'])['join'](',\x20'):'no\x20operative\x20role',j=h===''?'(entry,\x20not\x20started)':'\x27'+h+'\x27';if(g)return'Order\x20'+a['progress_address']+'\x20is\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+').\x20Machine\x20workflow\x20data\x20unavailable\x20—\x20fetch\x20the\x20bound\x20Machine\x20to\x20see\x20executable\x20operations.';const k=d['length']>0x0?'you\x20can\x20execute:\x20'+d['map'](m=>'\x27'+m['name']+'\x27→\x27'+m['to_node']+'\x27')['join'](',\x20'):e['length']>0x0?'waiting\x20on\x20'+e['map'](m=>m['role'])['join'](',\x20'):'no\x20pending\x20operations\x20at\x20this\x20node',l=f['length']>0x0?'\x20'+f['length']+'\x20unclaimed\x20benefit(s).':'';return'Order\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+')\x20—\x20'+k+'.'+l;}
1
+ import{deriveCommercialRole,CORE_PERMISSION_INDEX}from'../role/derivation.js';import{annotateNodeName}from'../graph/onchain/order-status.js';const ORDER_HOLDER_CALL={'tool':'onchain_operations','path':'data.progress','reason':'namedOperator=\x22\x22\x20=\x20OrderHolder:\x20execute\x20via\x20onchain_operations\x20operation_type=\x22order\x22\x20data.progress\x20—\x20order::progress\x20runs\x20with\x20the\x20Order\x20as\x20holder\x20(short-circuit\x20set\x20by\x20service::buy).\x20Calling\x20workflow_operation\x20operate\x20(progress::next)\x20directly\x20aborts\x20permission#5\x20\x22Permission\x20denied\x22:\x20Progress-level\x20checks\x20do\x20not\x20recognize\x20the\x20OrderHolder.'},PROGRESS_OPERATE_CALL={'tool':'workflow_operation','path':'data.operate','reason':'Forward\x20requires\x20a\x20permission\x20index\x20or\x20a\x20named\x20operator:\x20execute\x20on\x20the\x20Progress\x20object\x20via\x20workflow_operation\x20action=operate.\x20The\x20OrderHolder\x20short-circuit\x20(order.data.progress)\x20does\x20not\x20apply\x20to\x20this\x20forward.'},GUARD_PASSPORT_SUFFIX='\x20The\x20forward\x20binds\x20a\x20Guard:\x20a\x20validated\x20passport\x20is\x20mandatory\x20on\x20either\x20route\x20(progress#9\x20\x22Passport\x20required\x22)\x20and\x20cannot\x20be\x20bypassed.';export function recommendedCallForExecutionPath(a,b){const c=a==='order_holder'?ORDER_HOLDER_CALL:a==='permission'||a==='named_operator'?PROGRESS_OPERATE_CALL:undefined;if(!c)return undefined;return b?{...c,'reason':c['reason']+GUARD_PASSPORT_SUFFIX}:c;}export function recommendedCallForForwardBinding(a){const b=a['permissionIndex']!=null?'permission':a['namedOperator']===''?'order_holder':a['namedOperator']!=null?'named_operator':'not_available';return recommendedCallForExecutionPath(b,a['hasGuard']);}export function analyzeOrderParticipation(a){const b=a['node_annotations'],c=a['current_node']??'',d=!!a['order_holder']&&a['order_holder']===a['account'],e=new Set();if(a['permission']?.['entityPermissions'])for(const [u,v]of a['permission']['entityPermissions']){if(u===a['account']){for(const w of v)e['add'](w);}}if(a['permission']){const x=a['permission']['admin']??[],y=a['permission']['owner'];(x['some'](z=>z['toLowerCase']()===a['account']['toLowerCase']())||y&&y['toLowerCase']()===a['account']['toLowerCase']())&&e['add'](CORE_PERMISSION_INDEX['service']);}const f=[];if(a['named_accounts'])for(const [z,A]of Object['entries'](a['named_accounts'])){if(nameResolvesTo(A,a['account']))f['push'](z);}const g=deriveCommercialRole({'account':a['account'],'order_holder':a['order_holder'],'held_permission_indexes':Array['from'](e),'named_operator_names':f,'demand_presenters':a['demand_presenters'],'has_active_order':!![]}),h=g['role'],i=g['collaborator_kind'],j=[],k=[],l=!a['workflow'];let m;if(a['workflow'])for(const B of a['workflow']['transitions']){if(B['prevNode']!==c)continue;m=B['threshold'];const C={'name':B['forward']??'(unnamed)','permissionIndex':B['permissionIndex']??null,'namedOperator':B['namedOperator']??null,'guard':B['guard']??null,'weight':B['weight']??null},D=resolveForward(C,B['node'],a,d,e,b);if(D['execution_path']==='not_available'){const E=C['permissionIndex']!=null?'permission\x20index\x20'+C['permissionIndex']:C['namedOperator']===''?'OrderHolder\x20(customer)':'named\x20operator\x20\x27'+C['namedOperator']+'\x27',F=k['find'](G=>G['role']===E);if(F)F['forwards']['push'](D['name']);else k['push']({'role':E,'forwards':[D['name']]});}else j['push'](D);}const n=[];d&&n['push']({'label':'OrderHolder\x20(customer)','can_act_now':j['some'](G=>G['execution_path']==='order_holder')});for(const G of[...e]['sort']((H,I)=>H-I)){n['push']({'label':'permission\x20index\x20'+G,'can_act_now':j['some'](H=>H['permission_index']===G)});}if(a['named_accounts'])for(const [H,I]of Object['entries'](a['named_accounts'])){nameResolvesTo(I,a['account'])&&n['push']({'label':'named\x20operator\x20\x27'+H+'\x27','can_act_now':j['some'](J=>J['named_operator']===H)});}let o;j['length']>0x1&&(o={'message':j['length']+'\x20operations\x20are\x20available\x20to\x20you\x20at\x20node\x20\x27'+(c||'(entry)')+'\x27.\x20'+'Each\x20leads\x20to\x20a\x20different\x20outcome\x20—\x20review\x20the\x20consequences\x20and\x20choose;\x20no\x20one\x20else\x20can\x20make\x20this\x20decision\x20for\x20you.','options':j['map'](J=>({'forward':J['name'],'to_node':J['to_node'],'consequence':J['consequence']}))});const p=[];for(const J of a['claimable_rewards']??[]){if(J['already_claimed'])continue;p['push']({'kind':'reward','label':J['description']??'Reward\x20'+J['address'],'how':'onchain_operations\x20reward\x20op=\x27claim\x27\x20(object=\x27'+J['address']+'\x27)'});}a['pending_compensation']&&p['push']({'kind':'compensation','label':a['pending_compensation']['note']??'Arbitration\x20indemnity\x20awarded\x20to\x20you','how':'onchain_operations\x20service\x20op=\x27compensation_claim\x27\x20(arbitration=\x27'+a['pending_compensation']['arbitration']+'\x27)\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund'});a['discount_available']&&p['push']({'kind':'discount','label':a['discount_available'],'how':'Mention\x20the\x20discount\x20when\x20placing\x20the\x20next\x20order\x20(reward\x20discount\x20config\x20applies\x20at\x20purchase)'});a['rating_pending']&&p['push']({'kind':'rating','label':'Rate\x20this\x20transaction\x20(like/dislike)\x20—\x20builds\x20on-chain\x20reputation\x20for\x20both\x20sides','how':'onchain_operations\x20operation_type=\x27personal\x27,\x20data.mark={op:\x27like\x27|\x27dislike\x27,\x20address:\x27<merchant\x20address>\x27}\x20—\x20votes\x20through\x20registrar::like/dislike\x20into\x20the\x20PUBLIC\x20aggregate\x20count'});const q=buildInterestHints(a,h,j,k,c),s=buildSummary(a,h,n,j,k,p,l,c);return{'account':a['account'],'progress':a['progress_address'],'order':a['order_address'],'current_node':c,'perspective':h,'collaborator_kind':i,'roles':n,'operable':j,'branch_choice':o,'waiting_on':k,'pending_claims':p,'interest_hints':q,'workflow_unknown':l,'threshold':m,'summary':s};}export function aggregateRadar(a,b){const c=a['filter'](g=>g['operable']['length']>0x0||g['pending_claims']['length']>0x0)['sort']((g,h)=>(g['perspective']==='customer'?0x0:0x1)-(h['perspective']==='customer'?0x0:0x1)),d=a['filter'](g=>g['operable']['length']===0x0&&g['pending_claims']['length']===0x0),e=a['flatMap'](g=>g['pending_claims']['map'](h=>({...h,'progress':g['progress']}))),f=a['length']===0x0?'No\x20in-flight\x20orders\x20found\x20for\x20this\x20account.':a['length']+'\x20in-flight\x20order(s):\x20'+c['length']+'\x20need\x20your\x20action\x20or\x20have\x20claims,\x20'+d['length']+'\x20are\x20waiting\x20on\x20other\x20roles.\x20'+(e['length']>0x0?e['length']+'\x20unclaimed\x20benefit(s)\x20detected.\x20':'')+(c['length']>0x0?'Top\x20priority:\x20'+c[0x0]['summary']:'Nothing\x20requires\x20your\x20action\x20right\x20now.');return{'account':a[0x0]?.['account']??'','orders_analyzed':a['length'],'actionable':c,'waiting':d,'all_pending_claims':e,'unread_messages_total':b??0x0,'summary':f};}function nameResolvesTo(a,b){if(!a)return![];return Array['isArray'](a)?a['includes'](b):a===b;}export function isConsequenceNode(a,b,c){const d=(a??'')['toLowerCase'](),e=c?.[b];if(e?.['some'](g=>!!g&&d['includes'](g['toLowerCase']())))return!![];const f=annotateNodeName(a??'');return b==='completed'?f==='completion':f==='refund'||f==='exception';}function resolveForward(a,b,c,d,e,f){let g='not_available';if(a['permissionIndex']!=null){if(e['has'](a['permissionIndex']))g='permission';}else{if(a['namedOperator']===''){if(d)g='order_holder';}else{if(a['namedOperator']!=null){const k=c['named_accounts']?.[a['namedOperator']];if(nameResolvesTo(k,c['account']))g='named_operator';}}}const h=b,i=describeForward(a['name']??'',h,g,a['permissionIndex'],a['namedOperator']),j=consequenceOf(h,f);return{'name':a['name']??'(unnamed)','to_node':h,'execution_path':g,'permission_index':a['permissionIndex']??undefined,'named_operator':a['namedOperator']??undefined,'guard':a['guard']??undefined,'semantics':i,'consequence':j,'weight':a['weight']??undefined,'recommended_call':recommendedCallForExecutionPath(g,!!a['guard'])};}function describeForward(a,b,c,d,e){const f=d!=null?'requires\x20permission\x20index\x20'+d:e===''?'executable\x20by\x20the\x20order\x20holder\x20(customer)':'executable\x20by\x20named\x20operator\x20\x27'+e+'\x27',g=c==='not_available'?'You\x20CANNOT\x20execute\x20this':'You\x20CAN\x20execute\x20this';return'\x27'+a+'\x27\x20advances\x20the\x20order\x20to\x20node\x20\x27'+b+'\x27\x20('+f+').\x20'+g+'.';}export function consequenceOf(a,b){if(isConsequenceNode(a,'completed',b))return'Completion\x20path\x20—\x20funds\x20are\x20released\x20to\x20the\x20merchant\x20per\x20the\x20Allocation\x20waterfall;\x20refunds\x20become\x20harder\x20after\x20this\x20point.';if(isConsequenceNode(a,'refunded',b))return'Refund/cancellation\x20path\x20—\x20escrowed\x20funds\x20return\x20to\x20the\x20buyer\x20per\x20the\x20Allocation\x20configuration.';return undefined;}function buildInterestHints(a,b,c,d,e){const f=[],g=a['now']??Date['now'](),h=a['last_progress_at']!=null?(g-a['last_progress_at'])/0x36ee80:undefined;if(b==='customer')c['length']>0x0&&f['push']('Your\x20confirmation\x20is\x20the\x20fund-release\x20trigger:\x20escrowed\x20money\x20stays\x20locked\x20until\x20YOU\x20act\x20—\x20only\x20confirm\x20when\x20the\x20deliverable\x20matches\x20the\x20agreement.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Delivery\x20depends\x20on\x20the\x20merchant-side\x20roles\x20listed\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20Messenger\x20first,\x20then\x20consider\x20dispute\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x18&&f['push']('Order\x20has\x20not\x20advanced\x20for\x20'+Math['round'](h)+'h.\x20Your\x20leverage:\x20compensation_fund\x20(if\x20any)\x20+\x20arbitration\x20+\x20on-chain\x20reputation\x20(dislike)\x20—\x20in\x20that\x20order.');else{if(b==='supplier')c['length']>0x0&&f['push']('Advancing\x20your\x20sub-order\x20NOW\x20unlocks\x20YOUR\x20settlement\x20—\x20upload\x20delivery\x20evidence\x20first\x20to\x20protect\x20your\x20payment\x20claim\x20against\x20the\x20upstream\x20merchant.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Your\x20settlement\x20depends\x20on\x20upstream\x20roles\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20a\x20Messenger\x20nudge\x20first,\x20then\x20arbitration\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x30&&f['push']('Sub-order\x20stalled\x20'+Math['round'](h)+'h:\x20your\x20claim\x20erodes\x20with\x20time\x20—\x20evidence\x20+\x20a\x20Messenger\x20nudge\x20are\x20your\x20cheapest\x20protections.');else{if(b==='collaborator'||b==='merchant'){const i=d['filter'](j=>j['role']['startsWith']('permission\x20index'));c['length']>0x0&&f['push']('Advancing\x20the\x20workflow\x20NOW\x20improves\x20flow\x20efficiency\x20and\x20shortens\x20your\x20fund-settlement\x20cycle;\x20stalled\x20orders\x20degrade\x20your\x20on-chain\x20reputation\x20metrics\x20(dispute\x20rate,\x20stall\x20statistics).'),i['length']>0x0&&f['push']('Nodes\x20waiting\x20on\x20YOUR\x20permission\x20indexes\x20are\x20your\x20responsibility\x20surface:\x20prolonged\x20inaction\x20may\x20trigger\x20timeout\x20penalties\x20or\x20disputes\x20recorded\x20permanently\x20on-chain.'),e&&c['length']===0x0&&f['push']('Nothing\x20for\x20you\x20to\x20execute\x20at\x20this\x20node\x20—\x20monitor\x20only;\x20avoid\x20unnecessary\x20interference\x20that\x20creates\x20semantic\x20responsibility.');}else f['push']('You\x20hold\x20no\x20operative\x20role\x20on\x20this\x20order\x20(neutral).\x20On-chain\x20data\x20remains\x20transparent\x20to\x20you\x20for\x20auditing.');}}return(a['unread_messages']??0x0)>0x0&&f['push'](a['unread_messages']+'\x20unread\x20Messenger\x20message(s)\x20—\x20negotiation\x20evidence\x20(WTS)\x20forms\x20the\x20arbitration\x20record;\x20timely\x20replies\x20protect\x20your\x20position.'),f;}function buildSummary(a,b,c,d,e,f,g,h){const i=c['length']>0x0?c['map'](m=>m['label'])['join'](',\x20'):'no\x20operative\x20role',j=h===''?'(entry,\x20not\x20started)':'\x27'+h+'\x27';if(g)return'Order\x20'+a['progress_address']+'\x20is\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+').\x20Machine\x20workflow\x20data\x20unavailable\x20—\x20fetch\x20the\x20bound\x20Machine\x20to\x20see\x20executable\x20operations.';const k=d['length']>0x0?'you\x20can\x20execute:\x20'+d['map'](m=>'\x27'+m['name']+'\x27→\x27'+m['to_node']+'\x27')['join'](',\x20'):e['length']>0x0?'waiting\x20on\x20'+e['map'](m=>m['role'])['join'](',\x20'):'no\x20pending\x20operations\x20at\x20this\x20node',l=f['length']>0x0?'\x20'+f['length']+'\x20unclaimed\x20benefit(s).':'';return'Order\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+')\x20—\x20'+k+'.'+l;}
@@ -1,4 +1,4 @@
1
- import type { Industry, PersonaRole } from "./types.js";
1
+ import type { Industry, PersonaRole, PersonaLayer } from "./types.js";
2
2
  export interface PersonaAnalysisSuggestion {
3
3
  field: string;
4
4
  value: unknown;
@@ -10,6 +10,7 @@ export interface PersonaAnalysis {
10
10
  preferences: Record<string, unknown>;
11
11
  requirements: string[];
12
12
  rules: string[];
13
+ profiles?: PersonaLayer["profiles"];
13
14
  suggestions: PersonaAnalysisSuggestion[];
14
15
  confidence: number;
15
16
  }
@@ -1,5 +1,9 @@
1
1
  import type { UserInjection } from "../evaluation/types.js";
2
2
  import type { EffectivePersona } from "./types.js";
3
3
  export declare function personaToInjection(effective: EffectivePersona): UserInjection;
4
- export declare function personaToContextText(effective: EffectivePersona): string;
4
+ export interface PersonaContextTextOptions {
5
+ lastStrategyReviewAt?: number | null;
6
+ now?: number;
7
+ }
8
+ export declare function personaToContextText(effective: EffectivePersona, opts?: PersonaContextTextOptions): string;
5
9
  export declare function mergeInjections(base?: UserInjection | null, override?: UserInjection | null): UserInjection | undefined;
@@ -1 +1 @@
1
- const REQUIREMENT_RULE_MAP=[{'keywords':['arbitration','arb'],'rule_id':'r_trust'},{'keywords':['compensation','fund'],'rule_id':'r_fund'},{'keywords':['region','location'],'rule_id':'r_region'},{'keywords':['price','budget'],'rule_id':'r_price'},{'keywords':['industry'],'rule_id':'r_industry'},{'keywords':['capability'],'rule_id':'r_capabilities'},{'keywords':['trust','score'],'rule_id':'r_trust'}],FORBID_KEYWORDS=['forbid','never','no\x20'];function mapRequirement(a){const b=a['toLowerCase'](),c=FORBID_KEYWORDS['some'](d=>b['includes'](d));for(const d of REQUIREMENT_RULE_MAP){if(d['keywords']['some'](e=>b['includes'](e)))return{'rule_id':d['rule_id'],'condition':c?'forbid':'require','note':a};}return{'rule_id':'r_trust','condition':c?'forbid':'require','note':a};}export function personaToInjection(a){const b=(a['layer']['requirements']??[])['map'](mapRequirement),c=['role='+a['role'],a['industries']['length']?'industries='+a['industries']['join'](','):'',a['layer']['identity']?.['self_description']??'']['filter'](Boolean)['join'](';\x20');return{'intent':c,'preferences':a['layer']['preferences']??{},'requirements':b['length']?b:undefined};}export function personaToContextText(a){const b=[];b['push']('#\x20Effective\x20Persona\x20(role='+a['role']+',\x20industries='+(a['industries']['join'](',')||'any')+')');const c=a['layer']['identity'];if(c){if(c['self_description'])b['push']('-\x20self:\x20'+c['self_description']);if(c['region'])b['push']('-\x20region:\x20'+c['region']);if(c['languages']?.['length'])b['push']('-\x20languages:\x20'+c['languages']['join'](',\x20'));}if(a['layer']['strategy']?.['length']){b['push']('-\x20strategy:');for(const d of a['layer']['strategy'])b['push']('\x20\x20-\x20'+d);}if(a['layer']['rules']?.['length']){b['push']('-\x20rules:');for(const e of a['layer']['rules'])b['push']('\x20\x20-\x20'+e);}if(a['layer']['requirements']?.['length']){b['push']('-\x20requirements:');for(const f of a['layer']['requirements'])b['push']('\x20\x20-\x20'+f);}return a['layer']['spec']&&(b['push']('-\x20spec:'),b['push'](a['layer']['spec'])),b['join']('\x0a');}export function mergeInjections(a,b){if(!a&&!b)return undefined;if(!a)return b??undefined;if(!b)return a;return{'intent':b['intent']??a['intent'],'preferences':{...a['preferences']??{},...b['preferences']??{}},'requirements':[...a['requirements']??[],...b['requirements']??[]],'overrides':{'rules':{...a['overrides']?.['rules']??{},...b['overrides']?.['rules']??{}},'data_sources':{...a['overrides']?.['data_sources']??{},...b['overrides']?.['data_sources']??{}}}};}
1
+ import{getRolePersonality}from'../role/profiles.js';import{getIndustryStrategy}from'../knowledge/industry-strategy.js';import{reviewNudgeLine}from'../strategy/review.js';const PRODUCTION_ROLES=new Set(['merchant','supplier']);function compactList(a,b=0x4){return a['filter'](c=>typeof c==='string'&&c['length']>0x0)['slice'](0x0,b);}function renderActiveRoleProfile(b,e){const f=[],g=(h,i)=>{if(Array['isArray'](i)){const j=compactList(i,0x6);if(j['length'])f['push']('\x20\x20-\x20'+h+':\x20'+j['join'](',\x20'));}else typeof i==='string'&&i['length']>0x0&&f['push']('\x20\x20-\x20'+h+':\x20'+i);};e['tastes']&&(g('taste\x20materials',e['tastes']['materials']),g('taste\x20colors',e['tastes']['colors']),g('taste\x20styles',e['tastes']['styles']),g('taste\x20tags',e['tastes']['tags']),g('taste\x20brands',e['tastes']['brands']),g('taste\x20avoid',e['tastes']['avoid']));if(e['consumption']){const h=e['consumption'];g('buy\x20frequency',h['frequency']),g('price\x20band',h['price_band']),g('decision\x20speed',h['decision_speed']),g('trusted\x20channels',h['channels']),g('repeat\x20orientation',h['repeat_orientation']),g('avg\x20order\x20range',h['avg_order_range']),g('consumption\x20notes',h['notes']);}e['merchant']&&(g('strategic\x20posture',e['merchant']['posture']),g('pricing\x20style',e['merchant']['pricing_style']),g('service\x20style',e['merchant']['service_style']),g('communication',e['merchant']['communication']),g('growth\x20focus',e['merchant']['growth_focus']));if(e['supplier']){const i=e['supplier'];g('min\x20order',i['min_order']),g('lead\x20time',i['lead_time']),g('settlement\x20terms',i['settlement_terms']),g('categories',i['categories']),g('capacity',i['capacity']);}if(e['collaborator']){const j=e['collaborator'];g('scope\x20discipline',j['scope_discipline']),g('notifications',j['notifications']),g('working\x20hours',j['working_hours']),g('advance\x20style',j['advance_style']);}if(e['arbitrator']){const k=e['arbitrator'];g('case\x20types',k['case_types']),g('response\x20speed',k['response_speed']),g('ruling\x20style',k['ruling_style']);}if(e['demander']){const l=e['demander'];if(l['award_weights']&&Object['keys'](l['award_weights'])['length']>0x0){const m=Object['entries'](l['award_weights'])['map'](([n,o])=>n+'='+o)['join'](',\x20');f['push']('\x20\x20-\x20award\x20weights:\x20'+m);}g('pilot\x20budget',l['pilot_budget']),g('RFP\x20openness',l['rfp_openness']),g('decision\x20basis',l['decision_basis']);}return e['preferences']&&Object['keys'](e['preferences'])['length']>0x0&&f['push']('\x20\x20-\x20role\x20preferences:\x20'+JSON['stringify'](e['preferences'])),f;}function roleProfileToInjectionPrefs(b,e){const f={},g=(h,i)=>{if(Array['isArray'](i)){if(i['length']>0x0)f[h]=i;}else i!==undefined&&i!==null&&i!==''&&(f[h]=i);};e['tastes']&&(g('taste_materials',e['tastes']['materials']),g('taste_colors',e['tastes']['colors']),g('taste_styles',e['tastes']['styles']),g('taste_tags',e['tastes']['tags']),g('taste_brands',e['tastes']['brands']),g('taste_avoid',e['tastes']['avoid']));if(e['consumption']){const h=e['consumption'];g('buy_frequency',h['frequency']),g('buy_price_band',h['price_band']),g('buy_decision_speed',h['decision_speed']),g('buy_channels',h['channels']),g('buy_repeat_orientation',h['repeat_orientation']),g('buy_avg_order_range',h['avg_order_range']),g('buy_notes',h['notes']);}e['merchant']&&(g('merchant_posture',e['merchant']['posture']),g('merchant_pricing_style',e['merchant']['pricing_style']),g('merchant_service_style',e['merchant']['service_style']),g('merchant_communication',e['merchant']['communication']),g('merchant_growth_focus',e['merchant']['growth_focus']));if(e['supplier']){const i=e['supplier'];g('supplier_min_order',i['min_order']),g('supplier_lead_time',i['lead_time']),g('supplier_settlement_terms',i['settlement_terms']),g('supplier_categories',i['categories']),g('supplier_capacity',i['capacity']);}if(e['collaborator']){const j=e['collaborator'];g('collaborator_scope',j['scope_discipline']),g('collaborator_notifications',j['notifications']),g('collaborator_working_hours',j['working_hours']),g('collaborator_advance_style',j['advance_style']);}if(e['arbitrator']){const l=e['arbitrator'];g('arbitrator_case_types',l['case_types']),g('arbitrator_response_speed',l['response_speed']),g('arbitrator_ruling_style',l['ruling_style']);}if(e['demander']){const m=e['demander'];if(m['award_weights']&&Object['keys'](m['award_weights'])['length']>0x0)for(const [n,o]of Object['entries'](m['award_weights'])){if(typeof o==='number')g('award_weight_'+n,o);}g('demander_pilot_budget',m['pilot_budget']),g('demander_rfp_openness',m['rfp_openness']),g('demander_decision_basis',m['decision_basis']);}if(Object['keys'](f)['length']>0x0)f['active_role']=b;return f;}function renderBusinessStrategy(a){const b=a['industries'][0x0];if(!b||!PRODUCTION_ROLES['has'](a['role']))return[];const c=getIndustryStrategy(b);if(!c)return[];const d=a['layer']['profiles']?.['merchant']?.['merchant']?.['posture']??'balanced',e=c['postures'][d],f=c['pricing']['models']['find'](h=>h['id']===c['pricing']['default_model_id'])??c['pricing']['models'][0x0],g=['-\x20business\x20strategy\x20('+b+',\x20'+d+'\x20posture):'];g['push']('\x20\x20-\x20benchmark:\x20'+c['benchmark']+'\x20(tier\x20'+c['priority_tier']+',\x20launch\x20'+c['launch_window']+')');if(f)g['push']('\x20\x20-\x20default\x20pricing\x20model:\x20'+f['name']+'\x20—\x20'+f['applicable_when']);g['push']('\x20\x20-\x20posture\x20thesis:\x20'+e['thesis']),g['push']('\x20\x20-\x20competitor\x20watch\x20cadence:\x20'+c['competitor_watch']['cadence']+'\x20('+c['competitor_watch']['cadence_days']+'d)\x20on\x20'+c['competitor_watch']['dimensions']['slice'](0x0,0x4)['join'](',\x20'));for(const h of c['red_lines']['slice'](0x0,0x3))g['push']('\x20\x20-\x20red\x20line:\x20'+h);return g['push']('\x20\x20-\x20deep\x20playbook\x20on\x20demand:\x20industry_pack_operation\x20action=\x27get\x27\x20category=\x27'+b+'\x27\x20(playbook)\x20and\x20read_file\x20\x27strategy-manual.md\x27'),g;}const REQUIREMENT_RULE_MAP=[{'keywords':['arbitration','arb'],'rule_id':'r_trust'},{'keywords':['compensation','fund'],'rule_id':'r_fund'},{'keywords':['region','location'],'rule_id':'r_region'},{'keywords':['price','budget'],'rule_id':'r_price'},{'keywords':['industry'],'rule_id':'r_industry'},{'keywords':['capability'],'rule_id':'r_capabilities'},{'keywords':['trust','score'],'rule_id':'r_trust'}],FORBID_KEYWORDS=['forbid','never','no\x20'];function mapRequirement(a){const b=a['toLowerCase'](),c=FORBID_KEYWORDS['some'](d=>b['includes'](d));for(const d of REQUIREMENT_RULE_MAP){if(d['keywords']['some'](e=>b['includes'](e)))return{'rule_id':d['rule_id'],'condition':c?'forbid':'require','note':a};}return{'rule_id':'r_trust','condition':c?'forbid':'require','note':a};}export function personaToInjection(a){const b=(a['layer']['requirements']??[])['map'](mapRequirement),c=['role='+a['role'],a['industries']['length']?'industries='+a['industries']['join'](','):'',a['layer']['identity']?.['self_description']??'']['filter'](Boolean)['join'](';\x20'),d=a['layer']['profiles']?.[a['role']],e=d?roleProfileToInjectionPrefs(a['role'],d):{};return{'intent':c,'preferences':{...e,...a['layer']['preferences']??{}},'requirements':b['length']?b:undefined};}export function personaToContextText(a,c={}){const d=[];d['push']('#\x20Effective\x20Persona\x20(role='+a['role']+',\x20industries='+(a['industries']['join'](',')||'any')+')');const e=a['layer']['identity'];if(e){if(e['self_description'])d['push']('-\x20self:\x20'+e['self_description']);if(e['region'])d['push']('-\x20region:\x20'+e['region']);if(e['languages']?.['length'])d['push']('-\x20languages:\x20'+e['languages']['join'](',\x20'));}const f=getRolePersonality(a['role']);if(f){d['push']('-\x20active\x20role\x20lens:\x20'+f['archetype']),d['push']('\x20\x20-\x20motivations:\x20'+f['motivations']['slice'](0x0,0x4)['join'](';\x20')),d['push']('\x20\x20-\x20communication:\x20'+f['communication']);const j=f['game_moves']['filter'](k=>k['taboo'])['slice'](0x0,0x3);if(j['length']){d['push']('\x20\x20-\x20role\x20taboos:');for(const k of j)d['push']('\x20\x20\x20\x20-\x20'+k['move']);}f['path_preferences']['length']&&d['push']('\x20\x20-\x20path\x20preference:\x20'+f['path_preferences'][0x0]),d['push']('\x20\x20-\x20winning\x20looks\x20like:\x20'+f['feedback_signals']['win']['slice'](0x0,0x2)['join'](';\x20'));}const g=a['layer']['profiles']?.[a['role']];g&&(d['push']('-\x20active\x20role\x20profile:'),d['push'](...renderActiveRoleProfile(a['role'],g)));d['push'](...renderBusinessStrategy(a));if(a['role']==='merchant'){const l=a['industries'][0x0];if(l){const m=reviewNudgeLine(l,c['lastStrategyReviewAt']??null,c['now']??Date['now']());if(m)d['push']('-\x20'+m);}}if(a['layer']['strategy']?.['length']){d['push']('-\x20strategy:');for(const n of a['layer']['strategy'])d['push']('\x20\x20-\x20'+n);}if(a['layer']['rules']?.['length']){d['push']('-\x20rules:');for(const o of a['layer']['rules'])d['push']('\x20\x20-\x20'+o);}if(a['layer']['requirements']?.['length']){d['push']('-\x20requirements:');for(const p of a['layer']['requirements'])d['push']('\x20\x20-\x20'+p);}const h=a['layer']['policy'],i=a['layer']['overrides'];if(h||i){d['push']('-\x20safety\x20policy:');if(h?.['confirm']?.['mode'])d['push']('\x20\x20-\x20confirm\x20mode:\x20'+h['confirm']['mode']);h?.['confirm']?.['batch_standard']===!![]&&d['push']('\x20\x20-\x20independent\x20routine\x20confirmations\x20in\x20one\x20turn\x20are\x20batched\x20into\x20one\x20card');h?.['confirm']?.['session_remember']?.['length']&&d['push']('\x20\x20-\x20remember\x20session\x20approvals:\x20'+h['confirm']['session_remember']['join'](',\x20'));h?.['confirm']?.['intent_bypass']===![]&&d['push']('\x20\x20-\x20explicit\x20intent\x20phrases\x20do\x20NOT\x20skip\x20a\x20confirmation\x20(a\x20click\x20is\x20required)');if(h?.['budget']?.['daily_wow']!==undefined){const q=h['budget']['daily_wow'];d['push']('\x20\x20-\x20daily\x20spend\x20ceiling:\x20'+(q===null?'unlimited':q+'\x20base\x20units'));}h?.['allowlist']?.['length']&&d['push']('\x20\x20-\x20allowlist:\x20'+h['allowlist']['join'](',\x20'));if(h?.['audit']===!![])d['push']('\x20\x20-\x20audit\x20logging:\x20on');if(i)for(const [u,v]of Object['entries'](i)){d['push']('\x20\x20-\x20rule\x20override\x20'+u+':\x20'+v);}d['push']('\x20\x20-\x20hard\x20floor\x20(never\x20relaxable):\x20fund\x20movement,\x20irreversible/publish/amount\x20operations,\x20guard\x20creation');}return a['layer']['spec']&&(d['push']('-\x20spec:'),d['push'](a['layer']['spec'])),d['join']('\x0a');}export function mergeInjections(a,b){if(!a&&!b)return undefined;if(!a)return b??undefined;if(!b)return a;return{'intent':b['intent']??a['intent'],'preferences':{...a['preferences']??{},...b['preferences']??{}},'requirements':[...a['requirements']??[],...b['requirements']??[]],'overrides':{'rules':{...a['overrides']?.['rules']??{},...b['overrides']?.['rules']??{}},'data_sources':{...a['overrides']?.['data_sources']??{},...b['overrides']?.['data_sources']??{}}}};}
@@ -1 +1 @@
1
- import{getDefaultPreferences}from'../customer/user-preferences.js';import{getIndustryPersona,registerIndustryPersonae}from'./pack-personae.js';import{PERSONA_VERSION}from'./types.js';function safePrefs(a){const {budget_range:b,...c}=a;return c;}function industryPrefs(a){return safePrefs(getDefaultPreferences(a));}const SPECS=[{'role':'merchant','industry':'freelance','strategy':['Deliver\x20in\x20milestones\x20and\x20release\x20per\x20milestone\x20(avoid\x20all-or-nothing\x20non-acceptance).','Record\x20WIP\x20hash\x20at\x20each\x20key\x20node\x20as\x20evidence.','Use\x20an\x20accept_guard\x20time\x20gate\x20so\x20non-accepting\x20clients\x20auto-release\x20after\x20the\x20deadline.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20compensation\x20fund','forbid\x20full\x20upfront\x20payment\x20before\x20any\x20delivery']},{'role':'customer','industry':'freelance','strategy':['Pay\x20per\x20milestone,\x20verify\x20each\x20before\x20releasing\x20the\x20next.','Verify\x20WIP\x20hash\x20before\x20accepting\x20a\x20delivery.','Open\x20arbitration\x20if\x20the\x20provider\x20is\x20unresponsive.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20compensation\x20fund','forbid\x20direct\x20payment\x20without\x20escrow']},{'role':'merchant','industry':'rental','strategy':['Record\x20pre/post\x20rental\x20WIP\x20hashes\x20as\x20the\x20damage-claim\x20baseline.','Hold\x20the\x20deposit\x20in\x20a\x20graded\x20allocator\x20(normal\x20return\x20auto-releases).','Keep\x20an\x20evidence\x20chain\x20for\x20any\x20damage\x20claim.'],'requirements':['must\x20have\x20arbitration','damage\x20claims\x20require\x20pre-rental\x20baseline\x20evidence']},{'role':'customer','industry':'rental','strategy':['Record\x20condition\x20evidence\x20(WIP\x20hash)\x20before\x20renting.','Confirm\x20the\x20return\x20only\x20after\x20verifying\x20no\x20damage.','Open\x20arbitration\x20against\x20unfair\x20damage\x20claims.'],'requirements':['must\x20have\x20arbitration','deposit\x20must\x20be\x20refundable\x20(a\x20return\x20path\x20must\x20exist)']},{'role':'merchant','industry':'education','strategy':['Release\x20tuition\x20per\x20lesson\x20(1/N)\x20to\x20structurally\x20prevent\x20run-away\x20disputes.','Keep\x20attendance/completion\x20evidence.','Declare\x20the\x20refund\x20policy\x20up\x20front.'],'requirements':['must\x20have\x20arbitration','tuition\x20must\x20be\x20escrowed\x20(not\x20directly\x20received)']},{'role':'customer','industry':'education','strategy':['Pay\x20per\x20lesson,\x20never\x20full\x20upfront.','Confirm\x20completed\x20lessons\x20before\x20paying.','Request\x20proportional\x20refund\x20if\x20the\x20course\x20is\x20cancelled.'],'requirements':['must\x20have\x20arbitration','forbid\x20one-time\x20full\x20upfront\x20payment']},{'role':'merchant','industry':'travel','strategy':['Model\x20multi-leg\x20trips\x20as\x20a\x20multi-leg\x20machine\x20with\x20a\x20transparent\x20fund\x20waterfall.','Declare\x20the\x20cancellation\x20policy\x20up\x20front.','Separate\x20refundable\x20vs\x20non-refundable\x20legs.'],'requirements':['must\x20have\x20arbitration','funds\x20must\x20be\x20escrowed\x20(conditionally\x20released)']},{'role':'customer','industry':'travel','strategy':['Confirm\x20the\x20cancellation/refund\x20policy\x20before\x20booking.','Watch\x20cross-leg\x20responsibility\x20in\x20multi-leg\x20trips.','Pursue\x20the\x20non-refundable\x20downstream\x20on\x20flight\x20cancellation.'],'requirements':['must\x20have\x20arbitration','cancellation\x20must\x20be\x20refundable\x20(a\x20refund\x20path\x20must\x20exist)']},{'role':'merchant','industry':'subscription','strategy':['Charge\x20each\x20period\x20via\x20charge_guard_signer\x20(explicit\x20user\x20signature).','Keep\x20100%\x20of\x20revenue\x20(no\x20platform\x20cut).','Declare\x20pauses/cancellation\x20explicitly.'],'requirements':['forbid\x20auto-renewal\x20traps\x20(every\x20period\x20must\x20be\x20explicitly\x20signed)']},{'role':'customer','industry':'subscription','strategy':['Confirm\x20authorization\x20before\x20each\x20charge.','Cancel\x20anytime\x20without\x20friction.','Stop\x20charging\x20when\x20the\x20creator\x20pauses.'],'requirements':['forbid\x20auto-renewal\x20(every\x20period\x20must\x20be\x20explicitly\x20signed)','cancellation\x20must\x20be\x20frictionless']},{'role':'merchant','industry':'retail','strategy':['Release\x20funds\x20on\x20confirmed\x20receipt\x20(escrow).','Keep\x20an\x20evidence\x20chain\x20for\x20authenticity\x20disputes.','Declare\x20the\x20return\x20policy\x20up\x20front.'],'requirements':['must\x20have\x20arbitration','funds\x20must\x20be\x20escrowed\x20(released\x20on\x20confirmed\x20receipt)']},{'role':'customer','industry':'retail','strategy':['Verify\x20authenticity\x20before\x20confirming\x20receipt.','Never\x20confirm\x20receipt\x20before\x20the\x20goods\x20arrive.','Open\x20arbitration\x20for\x20counterfeit\x20/\x20not-received.'],'requirements':['must\x20have\x20arbitration','not-received\x20must\x20be\x20refundable']}];function buildDefault(a){const b=a['industry']?[a['industry']]:[],c={'identity':{'self_description':a['role']+'\x20in\x20'+(a['industry']??'any')+'\x20industry'},'preferences':a['industry']?industryPrefs(a['industry']):{}},d={'strategy':a['strategy'],'requirements':a['requirements']};return{'version':PERSONA_VERSION,'scope':'system','role':a['role'],'industries':b,'long_term':c,'current':d,'updated_at':0x0};}const GENERIC_ROLE_SPECS=[{'role':'arbitrator','strategy':['Confirm\x20cases\x20promptly\x20to\x20keep\x20the\x20dispute\x20pipeline\x20moving\x20(efficiency\x20+\x20fee\x20throughput).','Verify\x20all\x20evidence\x20(WTS)\x20before\x20ruling\x20—\x20unverified\x20evidence\x20is\x20not\x20evidence.','Write\x20reasoned,\x20professional\x20feedback\x20—\x20it\x20is\x20permanently\x20public\x20on-chain\x20(reputation).','Reset\x20unclear\x20cases\x20back\x20with\x20clear\x20feedback\x20rather\x20than\x20guessing.'],'requirements':['must\x20verify\x20evidence\x20(WTS)\x20before\x20ruling','forbid\x20ruling\x20without\x20verified\x20evidence']},{'role':'supplier','strategy':['Deliver\x20the\x20sub-order\x20and\x20retain\x20per-tier\x20sub-delivery\x20proof.','Settle\x20independently\x20per\x20verified\x20tier\x20(not\x20bundled\x20with\x20the\x20main\x20order).','Keep\x20an\x20evidence\x20chain\x20for\x20any\x20sub-delivery\x20dispute.'],'requirements':['sub-delivery\x20must\x20be\x20provable\x20(per-tier\x20release\x20guard)','must\x20have\x20independent\x20allocation\x20for\x20sub-order\x20settlement']},{'role':'collaborator','strategy':['Advance\x20only\x20the\x20forwards\x20within\x20your\x20permission\x20scope.','Advance\x20promptly\x20to\x20keep\x20the\x20workflow\x20moving\x20(avoid\x20stall\x20penalties).','Avoid\x20interfering\x20outside\x20your\x20permission\x20scope\x20(creates\x20responsibility\x20without\x20authority).'],'requirements':['only\x20operate\x20authorized\x20forwards\x20(permission\x20index\x20/\x20named\x20operator)','forbid\x20operating\x20outside\x20your\x20permission\x20scope']},{'role':'prospect','strategy':['Verify\x20fund\x20safety\x20(escrow\x20+\x20refund\x20path)\x20before\x20ordering.','Verify\x20delivery\x20trust\x20(WIP\x20hash,\x20machine\x20workflow)\x20before\x20ordering.','Check\x20arbitration\x20availability\x20for\x20recourse\x20before\x20committing.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20refund\x20path']}],DEFAULTS=[...SPECS,...GENERIC_ROLE_SPECS]['map'](buildDefault);export const GENERIC_PERSONA={'version':PERSONA_VERSION,'scope':'system','role':'customer','industries':[],'long_term':{'identity':{'self_description':'generic\x20WoWok\x20user'}},'current':{},'updated_at':0x0};function personaToIndustryPersona(a){if(a['industries']['length']===0x0)return null;return{'role':a['role'],'industry':a['industries'][0x0],'long_term':a['long_term'],'current':a['current']};}function industryPersonaToPersona(a){return{'version':PERSONA_VERSION,'scope':'system','role':a['role'],'industries':[a['industry']],'long_term':a['long_term'],'current':a['current'],'updated_at':0x0};}const builtinPersonaeByIndustry=new Map();for(const p of DEFAULTS){const ip=personaToIndustryPersona(p);if(!ip)continue;const list=builtinPersonaeByIndustry['get'](ip['industry'])??[];list['push'](ip),builtinPersonaeByIndustry['set'](ip['industry'],list);}for(const [industry,personae]of builtinPersonaeByIndustry){registerIndustryPersonae(industry,personae);}export function getIndustryDefault(a,b){const c=getIndustryPersona(b,a);if(c)return industryPersonaToPersona(c);const d=DEFAULTS['find'](e=>e['role']===a&&e['industries']['length']===0x0);if(d)return{...d};return{...GENERIC_PERSONA,'role':a};}export function listIndustryDefaults(){return DEFAULTS['map'](a=>({...a}));}
1
+ import{getDefaultPreferences}from'../customer/user-preferences.js';import{getIndustryPersona,registerIndustryPersonae}from'./pack-personae.js';import{PERSONA_VERSION}from'./types.js';function safePrefs(a){const {budget_range:b,...c}=a;return c;}function industryPrefs(a){return safePrefs(getDefaultPreferences(a));}const SPECS=[{'role':'merchant','industry':'freelance','strategy':['Deliver\x20in\x20milestones\x20and\x20release\x20per\x20milestone\x20(avoid\x20all-or-nothing\x20non-acceptance).','Record\x20WIP\x20hash\x20at\x20each\x20key\x20node\x20as\x20evidence.','Use\x20an\x20accept_guard\x20time\x20gate\x20so\x20non-accepting\x20clients\x20auto-release\x20after\x20the\x20deadline.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20compensation\x20fund','forbid\x20full\x20upfront\x20payment\x20before\x20any\x20delivery']},{'role':'customer','industry':'freelance','strategy':['Pay\x20per\x20milestone,\x20verify\x20each\x20before\x20releasing\x20the\x20next.','Verify\x20WIP\x20hash\x20before\x20accepting\x20a\x20delivery.','Open\x20arbitration\x20if\x20the\x20provider\x20is\x20unresponsive.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20compensation\x20fund','forbid\x20direct\x20payment\x20without\x20escrow']},{'role':'merchant','industry':'rental','strategy':['Record\x20pre/post\x20rental\x20WIP\x20hashes\x20as\x20the\x20damage-claim\x20baseline.','Hold\x20the\x20deposit\x20in\x20a\x20graded\x20allocator\x20(normal\x20return\x20auto-releases).','Keep\x20an\x20evidence\x20chain\x20for\x20any\x20damage\x20claim.'],'requirements':['must\x20have\x20arbitration','damage\x20claims\x20require\x20pre-rental\x20baseline\x20evidence']},{'role':'customer','industry':'rental','strategy':['Record\x20condition\x20evidence\x20(WIP\x20hash)\x20before\x20renting.','Confirm\x20the\x20return\x20only\x20after\x20verifying\x20no\x20damage.','Open\x20arbitration\x20against\x20unfair\x20damage\x20claims.'],'requirements':['must\x20have\x20arbitration','deposit\x20must\x20be\x20refundable\x20(a\x20return\x20path\x20must\x20exist)']},{'role':'merchant','industry':'education','strategy':['Release\x20tuition\x20per\x20lesson\x20(1/N)\x20to\x20structurally\x20prevent\x20run-away\x20disputes.','Keep\x20attendance/completion\x20evidence.','Declare\x20the\x20refund\x20policy\x20up\x20front.'],'requirements':['must\x20have\x20arbitration','tuition\x20must\x20be\x20escrowed\x20(not\x20directly\x20received)']},{'role':'customer','industry':'education','strategy':['Pay\x20per\x20lesson,\x20never\x20full\x20upfront.','Confirm\x20completed\x20lessons\x20before\x20paying.','Request\x20proportional\x20refund\x20if\x20the\x20course\x20is\x20cancelled.'],'requirements':['must\x20have\x20arbitration','forbid\x20one-time\x20full\x20upfront\x20payment']},{'role':'merchant','industry':'travel','strategy':['Model\x20multi-leg\x20trips\x20as\x20a\x20multi-leg\x20machine\x20with\x20a\x20transparent\x20fund\x20waterfall.','Declare\x20the\x20cancellation\x20policy\x20up\x20front.','Separate\x20refundable\x20vs\x20non-refundable\x20legs.'],'requirements':['must\x20have\x20arbitration','funds\x20must\x20be\x20escrowed\x20(conditionally\x20released)']},{'role':'customer','industry':'travel','strategy':['Confirm\x20the\x20cancellation/refund\x20policy\x20before\x20booking.','Watch\x20cross-leg\x20responsibility\x20in\x20multi-leg\x20trips.','Pursue\x20the\x20non-refundable\x20downstream\x20on\x20flight\x20cancellation.'],'requirements':['must\x20have\x20arbitration','cancellation\x20must\x20be\x20refundable\x20(a\x20refund\x20path\x20must\x20exist)']},{'role':'merchant','industry':'subscription','strategy':['Charge\x20each\x20period\x20via\x20charge_guard_signer\x20(explicit\x20user\x20signature).','Keep\x20100%\x20of\x20revenue\x20(no\x20platform\x20cut).','Declare\x20pauses/cancellation\x20explicitly.'],'requirements':['forbid\x20auto-renewal\x20traps\x20(every\x20period\x20must\x20be\x20explicitly\x20signed)']},{'role':'customer','industry':'subscription','strategy':['Confirm\x20authorization\x20before\x20each\x20charge.','Cancel\x20anytime\x20without\x20friction.','Stop\x20charging\x20when\x20the\x20creator\x20pauses.'],'requirements':['forbid\x20auto-renewal\x20(every\x20period\x20must\x20be\x20explicitly\x20signed)','cancellation\x20must\x20be\x20frictionless']},{'role':'merchant','industry':'retail','strategy':['Release\x20funds\x20on\x20confirmed\x20receipt\x20(escrow).','Keep\x20an\x20evidence\x20chain\x20for\x20authenticity\x20disputes.','Declare\x20the\x20return\x20policy\x20up\x20front.'],'requirements':['must\x20have\x20arbitration','funds\x20must\x20be\x20escrowed\x20(released\x20on\x20confirmed\x20receipt)']},{'role':'customer','industry':'retail','strategy':['Verify\x20authenticity\x20before\x20confirming\x20receipt.','Never\x20confirm\x20receipt\x20before\x20the\x20goods\x20arrive.','Open\x20arbitration\x20for\x20counterfeit\x20/\x20not-received.'],'requirements':['must\x20have\x20arbitration','not-received\x20must\x20be\x20refundable']}];function buildDefault(a){const b=a['industry']?[a['industry']]:[],c={'identity':{'self_description':a['role']+'\x20in\x20'+(a['industry']??'any')+'\x20industry'},'preferences':a['industry']?industryPrefs(a['industry']):{}},d={'strategy':a['strategy'],'requirements':a['requirements']};return{'version':PERSONA_VERSION,'scope':'system','role':a['role'],'industries':b,'long_term':c,'current':d,'updated_at':0x0};}const GENERIC_ROLE_SPECS=[{'role':'arbitrator','strategy':['Confirm\x20cases\x20promptly\x20to\x20keep\x20the\x20dispute\x20pipeline\x20moving\x20(efficiency\x20+\x20fee\x20throughput).','Verify\x20all\x20evidence\x20(WTS)\x20before\x20ruling\x20—\x20unverified\x20evidence\x20is\x20not\x20evidence.','Write\x20reasoned,\x20professional\x20feedback\x20—\x20it\x20is\x20permanently\x20public\x20on-chain\x20(reputation).','Reset\x20unclear\x20cases\x20back\x20with\x20clear\x20feedback\x20rather\x20than\x20guessing.'],'requirements':['must\x20verify\x20evidence\x20(WTS)\x20before\x20ruling','forbid\x20ruling\x20without\x20verified\x20evidence']},{'role':'supplier','strategy':['Deliver\x20the\x20sub-order\x20and\x20retain\x20per-tier\x20sub-delivery\x20proof.','Settle\x20independently\x20per\x20verified\x20tier\x20(not\x20bundled\x20with\x20the\x20main\x20order).','Keep\x20an\x20evidence\x20chain\x20for\x20any\x20sub-delivery\x20dispute.'],'requirements':['sub-delivery\x20must\x20be\x20provable\x20(per-tier\x20release\x20guard)','must\x20have\x20independent\x20allocation\x20for\x20sub-order\x20settlement']},{'role':'collaborator','strategy':['Advance\x20only\x20the\x20forwards\x20within\x20your\x20permission\x20scope.','Advance\x20promptly\x20to\x20keep\x20the\x20workflow\x20moving\x20(avoid\x20stall\x20penalties).','Avoid\x20interfering\x20outside\x20your\x20permission\x20scope\x20(creates\x20responsibility\x20without\x20authority).'],'requirements':['only\x20operate\x20authorized\x20forwards\x20(permission\x20index\x20/\x20named\x20operator)','forbid\x20operating\x20outside\x20your\x20permission\x20scope']},{'role':'prospect','strategy':['Verify\x20fund\x20safety\x20(escrow\x20+\x20refund\x20path)\x20before\x20ordering.','Verify\x20delivery\x20trust\x20(WIP\x20hash,\x20machine\x20workflow)\x20before\x20ordering.','Check\x20arbitration\x20availability\x20for\x20recourse\x20before\x20committing.'],'requirements':['must\x20have\x20arbitration','must\x20have\x20a\x20refund\x20path']},{'role':'demander','strategy':['Publish\x20demand\x20with\x20explicit\x20scope,\x20award\x20criteria\x20and\x20guard\x20expectations\x20so\x20presentations\x20are\x20comparable.','Keep\x20at\x20least\x20two\x20credible\x20presenters\x20in\x20the\x20field\x20until\x20the\x20award\x20decision.','Score\x20presenters\x20on\x20published\x20weights\x20(trust,\x20price,\x20evidence)\x20rather\x20than\x20rapport.','Pilot\x20high-risk\x20engagements\x20with\x20milestone\x20allocators\x20before\x20scaling.'],'requirements':['award\x20must\x20happen\x20on-chain\x20through\x20the\x20demand\x20flow\x20(no\x20off-platform\x20handshake)','high-risk\x20categories\x20must\x20have\x20arbitration\x20and\x20compensation\x20coverage']}],DEFAULTS=[...SPECS,...GENERIC_ROLE_SPECS]['map'](buildDefault);export const GENERIC_PERSONA={'version':PERSONA_VERSION,'scope':'system','role':'customer','industries':[],'long_term':{'identity':{'self_description':'generic\x20WoWok\x20user'}},'current':{},'updated_at':0x0};function personaToIndustryPersona(a){if(a['industries']['length']===0x0)return null;return{'role':a['role'],'industry':a['industries'][0x0],'long_term':a['long_term'],'current':a['current']};}function industryPersonaToPersona(a){return{'version':PERSONA_VERSION,'scope':'system','role':a['role'],'industries':[a['industry']],'long_term':a['long_term'],'current':a['current'],'updated_at':0x0};}const builtinPersonaeByIndustry=new Map();for(const p of DEFAULTS){const ip=personaToIndustryPersona(p);if(!ip)continue;const list=builtinPersonaeByIndustry['get'](ip['industry'])??[];list['push'](ip),builtinPersonaeByIndustry['set'](ip['industry'],list);}for(const [industry,personae]of builtinPersonaeByIndustry){registerIndustryPersonae(industry,personae);}export function getIndustryDefault(a,b){const c=getIndustryPersona(b,a);if(c)return industryPersonaToPersona(c);const d=DEFAULTS['find'](e=>e['role']===a&&e['industries']['length']===0x0);if(d)return{...d};return{...GENERIC_PERSONA,'role':a};}export function listIndustryDefaults(){return DEFAULTS['map'](a=>({...a}));}
@@ -1,5 +1,11 @@
1
1
  import type { GoalRecord } from "../goal/types.js";
2
2
  import type { PersonaLayer } from "./types.js";
3
+ export interface ScorecardEvidenceRef {
4
+ snapshot_id?: string;
5
+ industry: string;
6
+ posture?: string;
7
+ overall?: number | null;
8
+ }
3
9
  export interface GoalEvidence {
4
10
  goal_type: string;
5
11
  stage: string;
@@ -12,7 +18,7 @@ export interface GoalEvidence {
12
18
  duration_days?: number;
13
19
  }
14
20
  export declare function gatherGoalEvidence(goal: GoalRecord): GoalEvidence;
15
- export declare function distillGoalToProposal(goal: GoalRecord, evidence: GoalEvidence): {
21
+ export declare function distillGoalToProposal(goal: GoalRecord, evidence: GoalEvidence, scorecard?: ScorecardEvidenceRef | null): {
16
22
  summary: string;
17
23
  current_delta: PersonaLayer;
18
24
  evidence: GoalEvidence;
@@ -1 +1 @@
1
- import{existsSync}from'fs';import{listFeedback,listProblems}from'../task/ProcessStore.js';export function gatherGoalEvidence(a){const b={'goal_type':a['goal_type'],'stage':a['stage'],...a['outcome']?{'outcome_success':a['outcome']['success']}:{},'objects_count':a['objects']['length'],'problems_open':0x0,'problems_resolved':0x0,'feedback_positive':0x0,'feedback_negative':0x0,...a['outcome']?{'duration_days':Math['max'](0x0,Math['round']((a['outcome']['completed_at']-a['created_at'])/0x5265c00*0xa)/0xa)}:{}};if(a['process']&&existsSync(a['process']['dir']))try{const c=listProblems(a['process']['dir']);b['problems_open']=c['filter'](e=>e['status']==='open')['length'],b['problems_resolved']=c['filter'](e=>e['status']==='resolved')['length'];const d=listFeedback(a['process']['dir']);b['feedback_positive']=d['filter'](e=>e['sentiment']==='positive')['length'],b['feedback_negative']=d['filter'](e=>e['sentiment']==='negative')['length'];}catch{}return b;}const MAX_RULES=0x3;export function distillGoalToProposal(a,b){const c=[];if(a['process']&&existsSync(a['process']['dir']))try{const h=listProblems(a['process']['dir'])['filter'](i=>i['status']==='open');for(const i of h['slice'](0x0,MAX_RULES)){c['push']('avoid:\x20'+i['title']);}}catch{}const d={};if(b['feedback_negative']>b['feedback_positive'])d['last_goal_sentiment']='negative';else b['outcome_success']===!![]&&b['feedback_negative']===0x0&&(d['last_goal_sentiment']='positive');const e={};if(c['length'])e['rules']=c;if(Object['keys'](d)['length'])e['preferences']=d;const f=b['outcome_success']===!![]?'completed':b['outcome_success']===![]?'ended':'is\x20in\x20progress',g='Goal\x20\x22'+a['title']+'\x22\x20('+b['goal_type']+')\x20'+f+('\x20with\x20'+b['objects_count']+'\x20object(s)')+(b['duration_days']!==undefined?'\x20over\x20~'+b['duration_days']+'\x20day(s)':'')+(';\x20problems\x20open/resolved\x20'+b['problems_open']+'/'+b['problems_resolved'])+(',\x20feedback\x20+'+b['feedback_positive']+'/-'+b['feedback_negative']+'.')+(c['length']?'\x20Carried\x20'+c['length']+'\x20avoid-rule(s)\x20into\x20the\x20proposal.':'\x20No\x20avoid-rules\x20derived.');return{'summary':g,'current_delta':e,'evidence':b,'apply_via':'Review\x20the\x20proposal,\x20then\x20persist\x20it\x20with\x20persona_operation\x20{action:\x27set\x27,\x20current:<current_delta>}\x20(merge\x20with\x20the\x20existing\x20current\x20layer\x20as\x20needed).\x20set/apply\x20are\x20user-driven\x20and\x20pass\x20the\x20client\x27s\x20confirmation\x20gate;\x20distill\x20itself\x20never\x20writes.'};}
1
+ import{existsSync}from'fs';import{listFeedback,listProblems}from'../task/ProcessStore.js';import{assertAiCurrentDelta}from'./model.js';export function gatherGoalEvidence(a){const b={'goal_type':a['goal_type'],'stage':a['stage'],...a['outcome']?{'outcome_success':a['outcome']['success']}:{},'objects_count':a['objects']['length'],'problems_open':0x0,'problems_resolved':0x0,'feedback_positive':0x0,'feedback_negative':0x0,...a['outcome']?{'duration_days':Math['max'](0x0,Math['round']((a['outcome']['completed_at']-a['created_at'])/0x5265c00*0xa)/0xa)}:{}};if(a['process']&&existsSync(a['process']['dir']))try{const c=listProblems(a['process']['dir']);b['problems_open']=c['filter'](e=>e['status']==='open')['length'],b['problems_resolved']=c['filter'](e=>e['status']==='resolved')['length'];const d=listFeedback(a['process']['dir']);b['feedback_positive']=d['filter'](e=>e['sentiment']==='positive')['length'],b['feedback_negative']=d['filter'](e=>e['sentiment']==='negative')['length'];}catch{}return b;}const MAX_RULES=0x3;export function distillGoalToProposal(a,b,c){const d=[];if(a['process']&&existsSync(a['process']['dir']))try{const i=listProblems(a['process']['dir'])['filter'](j=>j['status']==='open');for(const j of i['slice'](0x0,MAX_RULES)){d['push']('avoid:\x20'+j['title']);}}catch{}const e={};if(b['feedback_negative']>b['feedback_positive'])e['last_goal_sentiment']='negative';else b['outcome_success']===!![]&&b['feedback_negative']===0x0&&(e['last_goal_sentiment']='positive');const f={};if(d['length'])f['rules']=d;if(Object['keys'](e)['length'])f['preferences']=e;assertAiCurrentDelta(f);const g=b['outcome_success']===!![]?'completed':b['outcome_success']===![]?'ended':'is\x20in\x20progress',h='Goal\x20\x22'+a['title']+'\x22\x20('+b['goal_type']+')\x20'+g+('\x20with\x20'+b['objects_count']+'\x20object(s)')+(b['duration_days']!==undefined?'\x20over\x20~'+b['duration_days']+'\x20day(s)':'')+(';\x20problems\x20open/resolved\x20'+b['problems_open']+'/'+b['problems_resolved'])+(',\x20feedback\x20+'+b['feedback_positive']+'/-'+b['feedback_negative']+'.')+(d['length']?'\x20Carried\x20'+d['length']+'\x20avoid-rule(s)\x20into\x20the\x20proposal.':'\x20No\x20avoid-rules\x20derived.')+(c?'\x20Strategy\x20scorecard:\x20'+(c['overall']===null||c['overall']===undefined?'n/a':c['overall']+'/100')+('\x20('+(c['posture']??'balanced')+',\x20'+c['industry']+(c['snapshot_id']?',\x20snapshot\x20'+c['snapshot_id']:'')+').'):'');return{'summary':h,'current_delta':f,'evidence':b,'apply_via':'Review\x20the\x20proposal,\x20then\x20persist\x20it\x20with\x20persona_operation\x20{action:\x27set\x27,\x20current:<current_delta>}\x20(merge\x20with\x20the\x20existing\x20current\x20layer\x20as\x20needed).\x20set/apply\x20are\x20user-driven\x20and\x20pass\x20the\x20client\x27s\x20confirmation\x20gate;\x20distill\x20itself\x20never\x20writes.'};}
@@ -1,10 +1,10 @@
1
1
  import { type PersonaAnalysis } from "./analyzer.js";
2
2
  import { type AddressFormat } from "./address-format.js";
3
- import type { EffectivePersona, Industry, Persona, PersonaLayer, PersonaRole, PersonaScope, SystemOverrideValue } from "./types.js";
3
+ import type { EffectivePersona, Industry, Persona, PersonaLayer, PersonaPolicy, PersonaRole, PersonaScope, SystemOverrideValue } from "./types.js";
4
4
  import type { UserProfile } from "../experience/types.js";
5
5
  export { GENERIC_PERSONA, getIndustryDefault, listIndustryDefaults } from "./defaults.js";
6
6
  export { SqlitePersonaStore, getPersonaStore, setPersonaStore } from "./store.js";
7
- export { countPersonaLines, emptyPersona, mergeLayers, mutateLayer, resolveEffective, validatePersona } from "./model.js";
7
+ export { assertAiCurrentDelta, countPersonaLines, effectiveAnalyzeQuestions, emptyPersona, mergeLayers, mergeRoleProfiles, mergeProfileMaps, mutateLayer, resolveEffective, validatePersona, validateLayerProfiles, } from "./model.js";
8
8
  export { personaToContextText, personaToInjection, mergeInjections } from "./bridge.js";
9
9
  export { analyzePersonaContext } from "./analyzer.js";
10
10
  export { profileToCurrentLayer } from "./experience-bridge.js";
@@ -17,12 +17,22 @@ export type { SystemOverrideSetting } from "./overrides.js";
17
17
  export * from "./strategy-intent.js";
18
18
  export * from "./local-region.js";
19
19
  export * from "./address-format.js";
20
- export type { EffectivePersona, Industry, Persona, PersonaIdentity, PersonaLayer, PersonaMutationMode, PersonaRole, PersonaScope, SystemOverrideValue, } from "./types.js";
20
+ export { ROLE_TOPOLOGY_DEFAULTS, INDUSTRY_TOPOLOGY_DEFAULTS, getIndustryTopologyTemplate, resolvePersonaTopologyFocus, resolveTopologyContext, describeIntents, assertIntent, type RoleTopologyDefault, type IndustryTopologyTemplate, type ResolvedTopologyContext, } from "./topology-focus.js";
21
+ export type { ConfirmModePolicy, EffectivePersona, Industry, Persona, PersonaIdentity, PersonaLayer, PersonaMutationMode, PersonaPolicy, PersonaRole, PersonaScope, SystemOverrideValue, } from "./types.js";
21
22
  export declare function getEffectivePersona(account?: string, industry?: Industry, role?: PersonaRole): Promise<EffectivePersona>;
22
23
  export declare function resolveAddressFormat(account?: string, industry?: Industry, role?: PersonaRole): Promise<AddressFormat>;
24
+ export declare function resolveGateControls(account?: string): Promise<{
25
+ overrides: Record<string, SystemOverrideValue>;
26
+ policy: PersonaPolicy;
27
+ }>;
23
28
  export declare function resolveEffectiveOverrides(account?: string): Promise<Record<string, SystemOverrideValue>>;
24
29
  export declare function analysisToLayerDelta(analysis: PersonaAnalysis): PersonaLayer;
25
30
  export declare function applyAnalysisToCurrent(scope: PersonaScope, account: string | undefined, analysis: PersonaAnalysis, mode?: "merge" | "replace", role?: PersonaRole, industries?: Industry[]): Promise<Persona>;
31
+ export declare function applyDeltaToCurrent(scope: PersonaScope, account: string | undefined, delta: PersonaLayer, role?: PersonaRole, industries?: Industry[]): Promise<{
32
+ persona: Persona;
33
+ effective: EffectivePersona;
34
+ applied: PersonaLayer;
35
+ }>;
26
36
  export declare function syncExperienceToCurrent(account?: string, profile?: UserProfile): Promise<{
27
37
  persona: Persona;
28
38
  applied: PersonaLayer;
@@ -1 +1 @@
1
- import{GENERIC_PERSONA,getIndustryDefault}from'./defaults.js';import{getPersonaStore}from'./store.js';import{emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';import{getIndustryPersona}from'./pack-personae.js';import{resolveOverrides}from'./overrides.js';import{profileToCurrentLayer}from'./experience-bridge.js';import{getProfile}from'../experience/index.js';import{ADDRESS_FORMAT_DEFAULT,ADDRESS_FORMAT_PREF_KEY,isAddressFormat}from'./address-format.js';export{GENERIC_PERSONA,getIndustryDefault,listIndustryDefaults}from'./defaults.js';export{SqlitePersonaStore,getPersonaStore,setPersonaStore}from'./store.js';export{countPersonaLines,emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';export{personaToContextText,personaToInjection,mergeInjections}from'./bridge.js';export{analyzePersonaContext}from'./analyzer.js';export{profileToCurrentLayer}from'./experience-bridge.js';export{distillGoalToProposal,gatherGoalEvidence}from'./distill-goal.js';export{registerIndustryPersonae,getIndustryPersona,listPersonaeIndustries,unregisterIndustryPersonae}from'./pack-personae.js';export{resolveOverrides,validateLayerOverrides,getOverrideDefault,SYSTEM_OVERRIDE_SETTINGS}from'./overrides.js';export*from'./strategy-intent.js';export*from'./local-region.js';export*from'./address-format.js';export async function getEffectivePersona(a,b,c){const d=getPersonaStore(),e=await d['get']('system'),f=a?await d['get']('account',a):null,g=b?mergeIndustryExternal(c??'customer',b):{...GENERIC_PERSONA,'role':c??'customer'};return resolveEffective(e,f,g);}export async function resolveAddressFormat(a,b,c){try{const d=await getEffectivePersona(a,b,c),e=d['layer']['preferences']?.[ADDRESS_FORMAT_PREF_KEY];if(isAddressFormat(e))return e;}catch{}return ADDRESS_FORMAT_DEFAULT;}function mergeIndustryExternal(a,b){const c=getIndustryDefault(a,b),d=getIndustryPersona(b,a);if(!d)return c;return{...c,'long_term':mergeLayers([c['long_term'],d['long_term']]),'current':mergeLayers([c['current'],d['current']])};}export async function resolveEffectiveOverrides(a){const b=getPersonaStore(),c=await b['get']('system'),d=a?await b['get']('account',a):null,e=[];if(c)e['push'](c['long_term'],c['current']);if(d)e['push'](d['long_term'],d['current']);return resolveOverrides(e);}export function analysisToLayerDelta(a){const b={};a['preferences']&&Object['keys'](a['preferences'])['length']&&(b['preferences']=a['preferences']);if(a['requirements']['length'])b['requirements']=a['requirements'];if(a['rules']['length'])b['rules']=a['rules'];return b;}export async function applyAnalysisToCurrent(a,b,c,d='merge',e,f){const g=getPersonaStore(),h=a==='account'&&b?await g['get']('account',b):await g['get']('system'),i=e??c['role']??h?.['role']??'customer',j=f??c['industries'],k=h??emptyPersona(a,b,i,j),l=Array['from'](new Set([...k['industries'],...j??[]])),m=analysisToLayerDelta(c),n=mutateLayer(k['current'],m,d),o={...k,'role':i,'industries':l,'current':n,'updated_at':Date['now']()},p=validatePersona(o);if(p['length']>0x0)throw new Error('persona\x20invalid\x20after\x20apply:\x20'+p['join'](';\x20'));return await g['put'](o),o;}export async function syncExperienceToCurrent(a,b){const c=getPersonaStore(),d=a?'account':'system',e=a?await c['get']('account',a):await c['get']('system'),f=e??emptyPersona(d,a,'customer',[]),g=profileToCurrentLayer(b??getProfile()),h=mutateLayer(f['current'],g,'merge'),i={...f,'current':h,'updated_at':Date['now']()},j=validatePersona(i);if(j['length']>0x0)throw new Error('persona\x20invalid\x20after\x20sync:\x20'+j['join'](';\x20'));return await c['put'](i),{'persona':i,'applied':g,'effective':await getEffectivePersona(a)};}
1
+ import{GENERIC_PERSONA,getIndustryDefault}from'./defaults.js';import{getPersonaStore}from'./store.js';import{assertAiCurrentDelta,emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';import{getIndustryPersona}from'./pack-personae.js';import{resolveOverrides}from'./overrides.js';import{profileToCurrentLayer}from'./experience-bridge.js';import{getProfile}from'../experience/index.js';import{ADDRESS_FORMAT_DEFAULT,ADDRESS_FORMAT_PREF_KEY,isAddressFormat}from'./address-format.js';export{GENERIC_PERSONA,getIndustryDefault,listIndustryDefaults}from'./defaults.js';export{SqlitePersonaStore,getPersonaStore,setPersonaStore}from'./store.js';export{assertAiCurrentDelta,countPersonaLines,effectiveAnalyzeQuestions,emptyPersona,mergeLayers,mergeRoleProfiles,mergeProfileMaps,mutateLayer,resolveEffective,validatePersona,validateLayerProfiles}from'./model.js';export{personaToContextText,personaToInjection,mergeInjections}from'./bridge.js';export{analyzePersonaContext}from'./analyzer.js';export{profileToCurrentLayer}from'./experience-bridge.js';export{distillGoalToProposal,gatherGoalEvidence}from'./distill-goal.js';export{registerIndustryPersonae,getIndustryPersona,listPersonaeIndustries,unregisterIndustryPersonae}from'./pack-personae.js';export{resolveOverrides,validateLayerOverrides,getOverrideDefault,SYSTEM_OVERRIDE_SETTINGS}from'./overrides.js';export*from'./strategy-intent.js';export*from'./local-region.js';export*from'./address-format.js';export{ROLE_TOPOLOGY_DEFAULTS,INDUSTRY_TOPOLOGY_DEFAULTS,getIndustryTopologyTemplate,resolvePersonaTopologyFocus,resolveTopologyContext,describeIntents,assertIntent}from'./topology-focus.js';export async function getEffectivePersona(a,b,c){const d=getPersonaStore(),e=await d['get']('system'),f=a?await d['get']('account',a):null,g=b?mergeIndustryExternal(c??'customer',b):{...GENERIC_PERSONA,'role':c??'customer'},h=resolveEffective(e,f,g);return c?{...h,'role':c}:h;}export async function resolveAddressFormat(a,b,c){try{const d=await getEffectivePersona(a,b,c),e=d['layer']['preferences']?.[ADDRESS_FORMAT_PREF_KEY];if(isAddressFormat(e))return e;}catch{}return ADDRESS_FORMAT_DEFAULT;}function mergeIndustryExternal(a,b){const c=getIndustryDefault(a,b),d=getIndustryPersona(b,a);if(!d)return c;return{...c,'long_term':mergeLayers([c['long_term'],d['long_term']]),'current':mergeLayers([c['current'],d['current']])};}async function collectGatePairs(a){const b=getPersonaStore(),c=await b['get']('system'),d=a?await b['get']('account',a):null,e=[],f=[];return c&&(e['push'](c['long_term'],c['current']),f['push']({'part':'long_term','group':0x0},{'part':'current','group':0x0})),d&&(e['push'](d['long_term'],d['current']),f['push']({'part':'long_term','group':0x2},{'part':'current','group':0x2})),{'layers':e,'meta':f};}export async function resolveGateControls(a){const {layers:b,meta:c}=await collectGatePairs(a),d=mergeLayers(b,c);return{'overrides':resolveOverrides([d]),'policy':d['policy']??{}};}export async function resolveEffectiveOverrides(a){return(await resolveGateControls(a))['overrides'];}export function analysisToLayerDelta(a){const b={};a['preferences']&&Object['keys'](a['preferences'])['length']&&(b['preferences']=a['preferences']);if(a['requirements']['length'])b['requirements']=a['requirements'];if(a['rules']['length'])b['rules']=a['rules'];return a['profiles']&&Object['keys'](a['profiles'])['length']&&(b['profiles']=a['profiles']),assertAiCurrentDelta(b),b;}export async function applyAnalysisToCurrent(a,b,c,d='merge',e,f){const g=getPersonaStore(),h=a==='account'&&b?await g['get']('account',b):await g['get']('system'),i=e??c['role']??h?.['role']??'customer',j=f??c['industries'],k=h??emptyPersona(a,b,i,j),l=Array['from'](new Set([...k['industries'],...j??[]])),m=analysisToLayerDelta(c),n=mutateLayer(k['current'],m,d),o={...k,'role':i,'industries':l,'current':n,'updated_at':Date['now']()},p=validatePersona(o);if(p['length']>0x0)throw new Error('persona\x20invalid\x20after\x20apply:\x20'+p['join'](';\x20'));return await g['put'](o),o;}export async function applyDeltaToCurrent(a,b,c,d,e){assertAiCurrentDelta(c);const f=getPersonaStore(),g=a==='account'&&b?await f['get']('account',b):await f['get']('system'),h=d??g?.['role']??'customer',i=e??g?.['industries']??[],j=g??emptyPersona(a,b,h,i),k=Array['from'](new Set([...j['industries'],...e??[]])),l=mutateLayer(j['current'],c,'merge'),m={...j,'role':h,'industries':k,'current':l,'updated_at':Date['now']()},n=validatePersona(m);if(n['length']>0x0)throw new Error('persona\x20invalid\x20after\x20apply_delta:\x20'+n['join'](';\x20'));return await f['put'](m),{'persona':m,'effective':await getEffectivePersona(a==='account'?b:undefined,undefined,m['role']),'applied':c};}export async function syncExperienceToCurrent(a,b){const c=getPersonaStore(),d=a?'account':'system',e=a?await c['get']('account',a):await c['get']('system'),f=e??emptyPersona(d,a,'customer',[]),g=profileToCurrentLayer(b??getProfile());assertAiCurrentDelta(g);const h=mutateLayer(f['current'],g,'merge'),i={...f,'current':h,'updated_at':Date['now']()},j=validatePersona(i);if(j['length']>0x0)throw new Error('persona\x20invalid\x20after\x20sync:\x20'+j['join'](';\x20'));return await c['put'](i),{'persona':i,'applied':g,'effective':await getEffectivePersona(a)};}
@@ -1,7 +1,17 @@
1
- import { type EffectivePersona, type Persona, type PersonaLayer, type PersonaMutationMode } from "./types.js";
2
- export declare function mergeLayers(layers: PersonaLayer[]): PersonaLayer;
1
+ import { type EffectivePersona, type Persona, type PersonaLayer, type PersonaMutationMode, type RoleProfile } from "./types.js";
2
+ export declare function mergeRoleProfiles(a: RoleProfile | undefined, b: RoleProfile | undefined): RoleProfile | undefined;
3
+ export declare function mergeProfileMaps(a: PersonaLayer["profiles"], b: PersonaLayer["profiles"]): PersonaLayer["profiles"] | undefined;
4
+ export interface LayerMergeMeta {
5
+ part: "long_term" | "current";
6
+ group: number;
7
+ }
8
+ export declare function mergeLayers(layers: PersonaLayer[], meta?: LayerMergeMeta[]): PersonaLayer;
9
+ export declare function effectiveAnalyzeQuestions(layer: PersonaLayer | undefined): string[];
10
+ export declare function assertAiCurrentDelta(delta: PersonaLayer): void;
3
11
  export declare function mutateLayer(layer: PersonaLayer, delta: PersonaLayer, mode: PersonaMutationMode): PersonaLayer;
4
12
  export declare function resolveEffective(system?: Persona | null, account?: Persona | null, base?: Persona | null): EffectivePersona;
5
13
  export declare function countPersonaLines(persona: Persona): number;
14
+ export declare function validateLayerPolicy(layer: PersonaLayer, label: string): string[];
15
+ export declare function validateLayerProfiles(layer: PersonaLayer, label: string): string[];
6
16
  export declare function validatePersona(persona: Persona): string[];
7
17
  export declare function emptyPersona(scope: "system" | "account", account: string | undefined, role: Persona["role"], industries: Persona["industries"]): Persona;