@wowok/agent-mcp 3.0.1 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/LICENSE +0 -3
  2. package/dist/harness/recover.js +1 -1
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.js +1 -1
  5. package/dist/intent/types.d.ts +1 -1
  6. package/dist/intent/types.js +1 -1
  7. package/dist/knowledge/account-marks.js +1 -1
  8. package/dist/knowledge/arbitration-risk.js +1 -1
  9. package/dist/knowledge/event-semantics.js +1 -1
  10. package/dist/knowledge/event-semantics.spec.js +1 -1
  11. package/dist/knowledge/flywheel-loop.d.ts +4 -52
  12. package/dist/knowledge/flywheel-loop.js +1 -1
  13. package/dist/knowledge/guard-lint.js +1 -1
  14. package/dist/knowledge/index.d.ts +2 -225
  15. package/dist/knowledge/index.js +1 -1
  16. package/dist/knowledge/industry-registry.js +1 -1
  17. package/dist/knowledge/machine-risk.js +1 -1
  18. package/dist/knowledge/machine-translation.js +1 -1
  19. package/dist/knowledge/migration-preflight.d.ts +27 -0
  20. package/dist/knowledge/migration-preflight.js +1 -0
  21. package/dist/knowledge/onchain-constants.js +1 -1
  22. package/dist/knowledge/order-ledger.d.ts +2 -2
  23. package/dist/knowledge/order-ledger.js +1 -1
  24. package/dist/knowledge/order-puzzle.d.ts +4 -4
  25. package/dist/knowledge/order-puzzle.js +1 -1
  26. package/dist/knowledge/order-risk.d.ts +1 -0
  27. package/dist/knowledge/order-risk.js +1 -1
  28. package/dist/knowledge/order-templates.d.ts +1 -1
  29. package/dist/knowledge/order-templates.js +1 -1
  30. package/dist/knowledge/safety-rules.js +1 -1
  31. package/dist/knowledge/service-ledger.js +1 -1
  32. package/dist/knowledge/service-risk.js +1 -1
  33. package/dist/knowledge/template-registry.js +1 -1
  34. package/dist/knowledge/tools-reference.js +1 -1
  35. package/dist/knowledge/workspace-lists.js +1 -1
  36. package/dist/monitor/MonitorLoop.js +1 -1
  37. package/dist/monitor/normalize.js +1 -1
  38. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  39. package/dist/playbooks/service-build/context-assembly.d.ts +3 -1
  40. package/dist/playbooks/service-build/context-assembly.js +1 -1
  41. package/dist/playbooks/service-build/machine-nodes.d.ts +2 -0
  42. package/dist/playbooks/service-build/machine-nodes.js +1 -1
  43. package/dist/playbooks/service-build/machine-panorama.d.ts +7 -0
  44. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  45. package/dist/playbooks/service-build/mode-actions.d.ts +19 -0
  46. package/dist/playbooks/service-build/mode-actions.js +1 -1
  47. package/dist/review/machine.js +1 -1
  48. package/dist/safety/confirm-gate.js +1 -1
  49. package/dist/schema/call/base.d.ts +12 -3
  50. package/dist/schema/call/base.js +1 -1
  51. package/dist/schema/call/bridge.d.ts +4 -0
  52. package/dist/schema/call/bridge.js +1 -1
  53. package/dist/schema/call/error-codes.d.ts +2 -0
  54. package/dist/schema/call/error-codes.js +1 -0
  55. package/dist/schema/call/guard.d.ts +4 -4
  56. package/dist/schema/call/semantic.d.ts +9 -1
  57. package/dist/schema/call/semantic.js +1 -1
  58. package/dist/schema/common/index.js +1 -1
  59. package/dist/schema/goal/index.d.ts +3 -3
  60. package/dist/schema/goal/planning.d.ts +2 -2
  61. package/dist/schema/industry-pack/index.d.ts +46 -4
  62. package/dist/schema/industry-pack/modes.d.ts +46 -4
  63. package/dist/schema/industry-pack/modes.js +1 -1
  64. package/dist/schema/intent-radar/index.d.ts +3 -0
  65. package/dist/schema/intent-radar/index.js +1 -1
  66. package/dist/schema/local/index.d.ts +558 -0
  67. package/dist/schema/local/index.js +1 -1
  68. package/dist/schema/messenger/index.d.ts +25 -25
  69. package/dist/schema/operations.d.ts +29 -1
  70. package/dist/schema/persona/index.d.ts +2 -2
  71. package/dist/schema/query/bi.d.ts +89 -4
  72. package/dist/schema/query/bi.js +1 -1
  73. package/dist/schema/query/index.d.ts +48 -48
  74. package/dist/schema/query/index.js +1 -1
  75. package/dist/schema/schema-query/index.d.ts +1 -1
  76. package/dist/schema/schema-version.js +1 -1
  77. package/dist/schema/trust/index.d.ts +3 -3
  78. package/dist/schema/workspace/index.d.ts +1 -1
  79. package/dist/schema-query-impl/index.js +1 -1
  80. package/dist/schemas/account_operation.output.json +4 -0
  81. package/dist/schemas/bridge_operation.output.json +4 -0
  82. package/dist/schemas/index.json +7 -1
  83. package/dist/schemas/industry_pack_operation.output.json +162 -6
  84. package/dist/schemas/intent_radar.output.json +2 -0
  85. package/dist/schemas/intent_radar.schema.json +1 -0
  86. package/dist/schemas/local_history_operation.output.json +1458 -0
  87. package/dist/schemas/local_history_operation.schema.json +105 -0
  88. package/dist/schemas/local_info_operation.output.json +4 -0
  89. package/dist/schemas/local_mark_operation.output.json +4 -0
  90. package/dist/schemas/onchain_events.output.json +55 -11
  91. package/dist/schemas/onchain_events.schema.json +4 -0
  92. package/dist/schemas/onchain_operations.output.json +4 -1
  93. package/dist/schemas/onchain_operations.schema.json +30 -10
  94. package/dist/schemas/onchain_operations_guard.schema.json +30 -10
  95. package/dist/schemas/onchain_table_data.output.json +41 -0
  96. package/dist/schemas/query_toolkit.output.json +200 -16
  97. package/dist/schemas/query_toolkit.schema.json +41 -0
  98. package/dist/tools/handlers/config.js +1 -1
  99. package/dist/tools/handlers/intent-radar.js +1 -1
  100. package/dist/tools/handlers/local.d.ts +1 -0
  101. package/dist/tools/handlers/local.js +1 -1
  102. package/dist/tools/handlers/onchain.js +1 -1
  103. package/dist/tools/handlers/query.js +1 -1
  104. package/dist/tools/index.js +1 -1
  105. package/dist/tools/registry/local.js +1 -1
  106. package/dist/tools/registry/query.js +1 -1
  107. package/dist/tools/shared.js +1 -1
  108. package/dist/tools/wrap.js +1 -1
  109. package/package.json +2 -2
  110. package/dist/knowledge/allocation-confirm.d.ts +0 -115
  111. package/dist/knowledge/allocation-confirm.js +0 -1
  112. package/dist/knowledge/allocation-context.d.ts +0 -58
  113. package/dist/knowledge/allocation-context.js +0 -1
  114. package/dist/knowledge/allocation-translation.d.ts +0 -72
  115. package/dist/knowledge/allocation-translation.js +0 -1
  116. package/dist/knowledge/arb-confirm.d.ts +0 -28
  117. package/dist/knowledge/arb-confirm.js +0 -1
  118. package/dist/knowledge/arb-translation.d.ts +0 -48
  119. package/dist/knowledge/arb-translation.js +0 -1
  120. package/dist/knowledge/arbitration-confirm.d.ts +0 -135
  121. package/dist/knowledge/arbitration-confirm.js +0 -1
  122. package/dist/knowledge/arbitration-context.d.ts +0 -81
  123. package/dist/knowledge/arbitration-context.js +0 -1
  124. package/dist/knowledge/arbitration-translation.d.ts +0 -91
  125. package/dist/knowledge/arbitration-translation.js +0 -1
  126. package/dist/knowledge/bridge-confirm.d.ts +0 -26
  127. package/dist/knowledge/bridge-confirm.js +0 -1
  128. package/dist/knowledge/bridge-translation.d.ts +0 -37
  129. package/dist/knowledge/bridge-translation.js +0 -1
  130. package/dist/knowledge/contact-confirm.d.ts +0 -27
  131. package/dist/knowledge/contact-confirm.js +0 -1
  132. package/dist/knowledge/contact-translation.d.ts +0 -39
  133. package/dist/knowledge/contact-translation.js +0 -1
  134. package/dist/knowledge/demand-confirm.d.ts +0 -32
  135. package/dist/knowledge/demand-confirm.js +0 -1
  136. package/dist/knowledge/demand-context.d.ts +0 -17
  137. package/dist/knowledge/demand-context.js +0 -1
  138. package/dist/knowledge/demand-ledger.d.ts +0 -26
  139. package/dist/knowledge/demand-ledger.js +0 -1
  140. package/dist/knowledge/demand-puzzle.d.ts +0 -29
  141. package/dist/knowledge/demand-puzzle.js +0 -1
  142. package/dist/knowledge/demand-templates.d.ts +0 -12
  143. package/dist/knowledge/demand-templates.js +0 -1
  144. package/dist/knowledge/demand-translation.d.ts +0 -55
  145. package/dist/knowledge/demand-translation.js +0 -1
  146. package/dist/knowledge/examples-scanner-cli.d.ts +0 -1
  147. package/dist/knowledge/examples-scanner-cli.js +0 -1
  148. package/dist/knowledge/examples-scanner.d.ts +0 -121
  149. package/dist/knowledge/examples-scanner.js +0 -1
  150. package/dist/knowledge/glossary.d.ts +0 -18
  151. package/dist/knowledge/glossary.js +0 -1
  152. package/dist/knowledge/guard-bytecode-spec.d.ts +0 -82
  153. package/dist/knowledge/guard-bytecode-spec.js +0 -1
  154. package/dist/knowledge/guard-confirm.d.ts +0 -86
  155. package/dist/knowledge/guard-confirm.js +0 -1
  156. package/dist/knowledge/immutability.d.ts +0 -11
  157. package/dist/knowledge/immutability.js +0 -1
  158. package/dist/knowledge/machine-confirm.d.ts +0 -102
  159. package/dist/knowledge/machine-confirm.js +0 -1
  160. package/dist/knowledge/machine-context.d.ts +0 -160
  161. package/dist/knowledge/machine-context.js +0 -1
  162. package/dist/knowledge/machine-render.d.ts +0 -41
  163. package/dist/knowledge/machine-render.js +0 -1
  164. package/dist/knowledge/mcp-schema-audit-cli.d.ts +0 -1
  165. package/dist/knowledge/mcp-schema-audit-cli.js +0 -1
  166. package/dist/knowledge/mcp-schema-audit.d.ts +0 -91
  167. package/dist/knowledge/mcp-schema-audit.js +0 -1
  168. package/dist/knowledge/messenger-guard-guidance.d.ts +0 -17
  169. package/dist/knowledge/messenger-guard-guidance.js +0 -1
  170. package/dist/knowledge/order-confirm.d.ts +0 -115
  171. package/dist/knowledge/order-confirm.js +0 -1
  172. package/dist/knowledge/order-context.d.ts +0 -66
  173. package/dist/knowledge/order-context.js +0 -1
  174. package/dist/knowledge/order-translation.d.ts +0 -78
  175. package/dist/knowledge/order-translation.js +0 -1
  176. package/dist/knowledge/overrides-loader.d.ts +0 -13
  177. package/dist/knowledge/overrides-loader.js +0 -1
  178. package/dist/knowledge/passport-confirm.d.ts +0 -130
  179. package/dist/knowledge/passport-confirm.js +0 -1
  180. package/dist/knowledge/passport-context.d.ts +0 -59
  181. package/dist/knowledge/passport-context.js +0 -1
  182. package/dist/knowledge/passport-puzzle.d.ts +0 -108
  183. package/dist/knowledge/passport-puzzle.js +0 -1
  184. package/dist/knowledge/passport-risk.d.ts +0 -70
  185. package/dist/knowledge/passport-risk.js +0 -1
  186. package/dist/knowledge/passport-translation.d.ts +0 -68
  187. package/dist/knowledge/passport-translation.js +0 -1
  188. package/dist/knowledge/payment-confirm.d.ts +0 -26
  189. package/dist/knowledge/payment-confirm.js +0 -1
  190. package/dist/knowledge/payment-translation.d.ts +0 -37
  191. package/dist/knowledge/payment-translation.js +0 -1
  192. package/dist/knowledge/permission-confirm.d.ts +0 -110
  193. package/dist/knowledge/permission-confirm.js +0 -1
  194. package/dist/knowledge/permission-context.d.ts +0 -69
  195. package/dist/knowledge/permission-context.js +0 -1
  196. package/dist/knowledge/permission-translation.d.ts +0 -57
  197. package/dist/knowledge/permission-translation.js +0 -1
  198. package/dist/knowledge/personal-confirm.d.ts +0 -29
  199. package/dist/knowledge/personal-confirm.js +0 -1
  200. package/dist/knowledge/personal-translation.d.ts +0 -37
  201. package/dist/knowledge/personal-translation.js +0 -1
  202. package/dist/knowledge/process-model.d.ts +0 -14
  203. package/dist/knowledge/process-model.js +0 -1
  204. package/dist/knowledge/progress-confirm.d.ts +0 -108
  205. package/dist/knowledge/progress-confirm.js +0 -1
  206. package/dist/knowledge/progress-context.d.ts +0 -123
  207. package/dist/knowledge/progress-context.js +0 -1
  208. package/dist/knowledge/progress-translation.d.ts +0 -52
  209. package/dist/knowledge/progress-translation.js +0 -1
  210. package/dist/knowledge/proof-confirm.d.ts +0 -31
  211. package/dist/knowledge/proof-confirm.js +0 -1
  212. package/dist/knowledge/proof-context.d.ts +0 -17
  213. package/dist/knowledge/proof-context.js +0 -1
  214. package/dist/knowledge/proof-ledger.d.ts +0 -34
  215. package/dist/knowledge/proof-ledger.js +0 -1
  216. package/dist/knowledge/proof-puzzle.d.ts +0 -35
  217. package/dist/knowledge/proof-puzzle.js +0 -1
  218. package/dist/knowledge/proof-templates.d.ts +0 -22
  219. package/dist/knowledge/proof-templates.js +0 -1
  220. package/dist/knowledge/proof-translation.d.ts +0 -52
  221. package/dist/knowledge/proof-translation.js +0 -1
  222. package/dist/knowledge/registrar-confirm.d.ts +0 -26
  223. package/dist/knowledge/registrar-confirm.js +0 -1
  224. package/dist/knowledge/registrar-translation.d.ts +0 -37
  225. package/dist/knowledge/registrar-translation.js +0 -1
  226. package/dist/knowledge/repository-confirm.d.ts +0 -40
  227. package/dist/knowledge/repository-confirm.js +0 -1
  228. package/dist/knowledge/repository-context.d.ts +0 -12
  229. package/dist/knowledge/repository-context.js +0 -1
  230. package/dist/knowledge/repository-ledger.d.ts +0 -25
  231. package/dist/knowledge/repository-ledger.js +0 -1
  232. package/dist/knowledge/repository-puzzle.d.ts +0 -30
  233. package/dist/knowledge/repository-puzzle.js +0 -1
  234. package/dist/knowledge/repository-templates.d.ts +0 -14
  235. package/dist/knowledge/repository-templates.js +0 -1
  236. package/dist/knowledge/repository-translation.d.ts +0 -58
  237. package/dist/knowledge/repository-translation.js +0 -1
  238. package/dist/knowledge/resource-confirm.d.ts +0 -25
  239. package/dist/knowledge/resource-confirm.js +0 -1
  240. package/dist/knowledge/resource-translation.d.ts +0 -37
  241. package/dist/knowledge/resource-translation.js +0 -1
  242. package/dist/knowledge/reward-confirm.d.ts +0 -116
  243. package/dist/knowledge/reward-confirm.js +0 -1
  244. package/dist/knowledge/reward-context.d.ts +0 -127
  245. package/dist/knowledge/reward-context.js +0 -1
  246. package/dist/knowledge/reward-translation.d.ts +0 -58
  247. package/dist/knowledge/reward-translation.js +0 -1
  248. package/dist/knowledge/service-confirm.d.ts +0 -161
  249. package/dist/knowledge/service-confirm.js +0 -1
  250. package/dist/knowledge/service-context.d.ts +0 -66
  251. package/dist/knowledge/service-context.js +0 -1
  252. package/dist/knowledge/service-translation.d.ts +0 -103
  253. package/dist/knowledge/service-translation.js +0 -1
  254. package/dist/knowledge/treasury-confirm.d.ts +0 -133
  255. package/dist/knowledge/treasury-confirm.js +0 -1
  256. package/dist/knowledge/treasury-context.d.ts +0 -64
  257. package/dist/knowledge/treasury-context.js +0 -1
  258. package/dist/knowledge/treasury-translation.d.ts +0 -78
  259. package/dist/knowledge/treasury-translation.js +0 -1
  260. package/dist/knowledge/util-confirm.d.ts +0 -24
  261. package/dist/knowledge/util-confirm.js +0 -1
  262. package/dist/knowledge/util-translation.d.ts +0 -39
  263. package/dist/knowledge/util-translation.js +0 -1
  264. package/dist/loop-engineering/aggregate.d.ts +0 -50
  265. package/dist/loop-engineering/aggregate.js +0 -1
  266. package/dist/loop-engineering/context-collect.d.ts +0 -7
  267. package/dist/loop-engineering/context-collect.js +0 -1
  268. package/dist/loop-engineering/diagnose.d.ts +0 -22
  269. package/dist/loop-engineering/diagnose.js +0 -1
  270. package/dist/loop-engineering/improve.d.ts +0 -55
  271. package/dist/loop-engineering/improve.js +0 -1
  272. package/dist/loop-engineering/index.d.ts +0 -4
  273. package/dist/loop-engineering/index.js +0 -1
  274. package/dist/loop-engineering/pipeline.d.ts +0 -17
  275. package/dist/loop-engineering/pipeline.js +0 -1
  276. package/dist/schema/utils/object-type-utils.d.ts +0 -12
  277. package/dist/schema/utils/object-type-utils.js +0 -1
  278. package/dist/telemetry/index.d.ts +0 -19
  279. package/dist/telemetry/index.js +0 -1
  280. package/dist/telemetry/redact.d.ts +0 -2
  281. package/dist/telemetry/redact.js +0 -1
  282. package/dist/telemetry/storage.d.ts +0 -8
  283. package/dist/telemetry/storage.js +0 -1
@@ -1 +1 @@
1
- import{objectTypeFromAddress,query_affiliations,query_local_mark_list,query_table}from'@wowok/wowok';import{ObjectType}from'@wowok/wowok';import{batchFetchEntityLinker,batchFetchEntityRegistrar,batchQueryObjectsByIds,fetchEntityPermission,fetchEntityContact,fetchObjectLinkerCore,fetchObjectLinkerTx,listLocalAccounts,resolveLocalNamesFor}from'./workflow-guidance.js';import{fetchMachineNodes}from'../playbooks/service-build/machine-nodes.js';const AGG_TTL_MS=0x1d4c0,AGG_CACHE_MAX=0x8,aggCache=new Map(),aggInflight=new Map(),CLASSIFIED_TYPES=new Set([ObjectType['Permission'],ObjectType['Service'],ObjectType['Machine'],ObjectType['Treasury'],ObjectType['Repository'],ObjectType['Reward'],ObjectType['Demand'],ObjectType['Arbitration'],ObjectType['Arb'],ObjectType['Contact'],ObjectType['Order'],ObjectType['Progress']]);function sortItems(a){return a['sort']((c,d)=>(d['time']??0x0)-(c['time']??0x0)||c['object']['localeCompare'](d['object']));}export async function buildWorkspaceLists(a){const b=a['network'],c=a['account']?.['trim']()['toLowerCase']()||undefined,d=a['no_cache']===!![],e=(b??'')+'|'+(c??'');if(!d){const g=aggCache['get'](e);if(g&&Date['now']()-g['at']<AGG_TTL_MS)return{...g['value'],'cached':!![]};const h=aggInflight['get'](e);if(h)return h;}const f=((async()=>{const i=c?[{'address':c,'name':undefined}]:await listLocalAccounts(),j={'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':[],'repositories':[],'contacts':[],'machines':[],'rewards':[],'others':[],'counts':{'treasuries':0x0,'repositories':0x0,'contacts':0x0,'machines':0x0,'rewards':0x0,'others':0x0},'note':i['length']===0x0?'No\x20local\x20accounts\x20found\x20—\x20create\x20or\x20import\x20an\x20account\x20first.':undefined};if(i['length']===0x0)return aggCache['set'](e,{'at':Date['now'](),'value':j}),j;const [k,l,n]=await Promise['all']([Promise['all'](i['map'](Q=>fetchEntityPermission(Q['address'],b,d))),Promise['all'](i['map'](Q=>fetchEntityContact(Q['address'],b,d))),Promise['all'](i['map'](Q=>fetchObjectLinkerTx(Q['address'],b,d)))]),p=[],q=new Set();for(const Q of k){for(const R of Q?.['items']??[]){!q['has'](R['permission'])&&(q['add'](R['permission']),p['push'](R['permission']));}}const s=await Promise['all'](p['map'](S=>fetchObjectLinkerCore(S,b,d))),u={'treasuries':new Map(),'repositories':new Map(),'contacts':new Map(),'machines':new Map(),'rewards':new Map()},v=(S,T,U)=>{const V=T['toLowerCase'](),W=S['get'](V);if(W===undefined||(U??0x0)>W)S['set'](V,U??0x0);};s['forEach'](S=>{for(const T of S?.['items']??[]){const U=objectTypeFromAddress(T['who']);if(U===ObjectType['Treasury'])v(u['treasuries'],T['who'],T['time']);else{if(U===ObjectType['Repository'])v(u['repositories'],T['who'],T['time']);else{if(U===ObjectType['Machine'])v(u['machines'],T['who'],T['time']);else{if(U===ObjectType['Reward'])v(u['rewards'],T['who'],T['time']);else{if(U===ObjectType['Contact'])v(u['contacts'],T['who'],T['time']);}}}}}});for(const S of l){for(const T of S?.['items']??[])v(u['contacts'],T['contact'],T['time']);}const w=new Map();for(const U of n){for(const V of U?.['items']??[]){const W=objectTypeFromAddress(V['who']);if(W&&CLASSIFIED_TYPES['has'](W))continue;v(w,V['who'],V['time']);}}const x=[...u['treasuries']['keys'](),...u['repositories']['keys'](),...u['contacts']['keys'](),...u['machines']['keys'](),...u['rewards']['keys'](),...w['keys']()],y=X=>X['startsWith']('0x00'),z=[],A=[];for(const X of x){if(y(X))A['push'](X);else z['push'](X);}const B=await resolveLocalNamesFor(x);if(a['light']){const Y=a0=>sortItems([...a0['entries']()]['map'](([a1,a2])=>({'object':a1,'object_type':objectTypeFromAddress(a1)??null,'name':B['byAddress']['get'](a1),'time':a2||undefined}))),Z={'treasuries':u['treasuries']['size'],'repositories':u['repositories']['size'],'contacts':u['contacts']['size'],'machines':u['machines']['size'],'rewards':u['rewards']['size'],'others':w['size']};return{'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':Y(u['treasuries']),'repositories':Y(u['repositories']),'contacts':Y(u['contacts']),'machines':Y(u['machines']),'rewards':Y(u['rewards']),'others':Y(w),'counts':Z,'note':i['length']===0x0?'No\x20local\x20accounts\x20found\x20—\x20create\x20or\x20import\x20an\x20account\x20first.':undefined};}const C=new Map(),D=new Map(),E=new Map(),F=new Map(),G=new Map(),H=new Map(),I=new Map();try{const [a0,a1,a2,a3]=await Promise['all']([z['length']>0x0?batchQueryObjectsByIds(z,b,d)['then'](a9=>({'objects':a9})):Promise['resolve']({'objects':[]}),batchFetchEntityRegistrar(A,b,d),query_local_mark_list(undefined),listLocalAccounts()]),a4=new Set((a3??[])['map'](a9=>String(a9?.['address']??'')['toLowerCase']())),a5=new Set((a0?.['objects']??[])['map'](a9=>String(a9?.['object']??a9?.['address']??'')['toLowerCase']())['filter'](Boolean));for(const [a9,aa]of a1){a5['add'](a9);const ab=aa?.['description']??aa?.['info']?.['description'];if(typeof ab==='string'&&ab['trim']())C['set'](a9,ab['trim']());}if(a5['size']>0x0){const ac=ad=>{for(const ae of[...ad['keys']()])if(!a5['has'](ae))ad['delete'](ae);};ac(u['treasuries']),ac(u['repositories']),ac(u['contacts']),ac(u['machines']),ac(u['rewards']),ac(w);}const a6=new Set([...u['treasuries']['keys'](),...u['repositories']['keys'](),...u['contacts']['keys'](),...u['machines']['keys'](),...u['rewards']['keys'](),...w['keys']()]);try{const ad=await batchFetchEntityLinker([...a6],b,d);for(const [ae,af]of ad){const ag=Array['isArray'](af?.['votes'])?af['votes']:[];if(ag['length']===0x0)continue;I['set'](ae,{'like':ag['filter'](ah=>ah&&ah['like'])['length'],'dislike':ag['filter'](ah=>ah&&ah['dislike'])['length'],'favor':ag['filter'](ah=>ah&&ah['favor'])['length'],'votes':ag['map'](ah=>({'who':ah?.['who']??null,'like':!!ah?.['like'],'dislike':!!ah?.['dislike'],'favor':!!ah?.['favor']}))});}}catch{}for(const ah of a0?.['objects']??[]){const ai=String(ah?.['object']??ah?.['address']??'')['toLowerCase'](),aj=ah?.['description']??ah?.['data']?.['description'];ai&&typeof aj==='string'&&aj['trim']()&&C['set'](ai,aj['trim']());if(ai&&u['contacts']['has'](ai)){const ak=Array['isArray'](ah?.['ims'])?ah['ims']:[],al=typeof ah?.['location']==='string'?ah['location']['trim']():'';E['set'](ai,{...al?{'location':al}:{},'members_total':ak['length'],'members_mine':ak['filter'](am=>a4['has'](String(am?.['at']??'')['toLowerCase']()))['length']});}if(ai&&u['rewards']['has'](ai)){const am=/<([0-9a-zA-Z_:]+)>\s*$/['exec'](String(ah?.['type_raw']??'')),an=Array['isArray'](ah?.['guards'])?ah['guards']:[],ao=Number(ah?.['record_count']);H['set'](ai,{...am?{'token':am[0x1]['split']('::')['pop']()}:{},'guards_total':an['length'],...Number['isFinite'](ao)?{'claimers':ao}:{},...ah?.['balance']!=null?{'balance_total':String(ah['balance'])}:{},...ah?.['type_raw']!=null?{'type_raw':String(ah['type_raw'])}:{}});}if(ai&&u['treasuries']['has'](ai)){const ap=/<([0-9a-zA-Z_:]+)>\s*$/['exec'](String(ah?.['type_raw']??'')),aq=ar=>ar===null||ar===undefined||ar===''?undefined:String(ar);H['set'](ai,{...ap?{'token':ap[0x1]['split']('::')['pop']()}:{},...ah?.['balance']!=null?{'balance_total':String(ah['balance'])}:{},...ah?.['type_raw']!=null?{'type_raw':String(ah['type_raw'])}:{},...ah?.['inflow']!=null?{'inflow':aq(ah['inflow'])}:{},...ah?.['outflow']!=null?{'outflow':aq(ah['outflow'])}:{}});}if(ai&&u['repositories']['has'](ai)){const ar=Number(ah?.['data_count']),as=Array['isArray'](ah?.['policies'])?ah['policies']:[],at=Array['isArray'](ah?.['rewards'])?ah['rewards']:[];F['set'](ai,{...Number['isFinite'](ar)?{'records_total':ar}:{},'policies_total':as['length'],'rewards_total':at['length']});}ai&&u['machines']['has'](ai)&&(ah?.['bPublished']!=null||ah?.['bPaused']!=null||ah?.['node_count']!=null)&&G['set'](ai,{'status':ah['bPublished']===!![]?ah['bPaused']===!![]?'PAUSED':'LIVE':'UNPUBLISHED',...Number['isFinite'](Number(ah?.['node_count']))?{'nodes':Number(ah['node_count'])}:{}});}for(const au of a2??[]){const av=String(au?.['address']??'')['toLowerCase']();av&&Array['isArray'](au?.['tags'])&&au['tags']['length']>0x0&&D['set'](av,au['tags']['map'](String));}await Promise['all']([...E['keys'](),...F['keys'](),...[...H['keys']()]['filter'](aw=>u['treasuries']['has'](aw)||u['rewards']['has'](aw))]['map'](async aw=>{try{const ax=await query_affiliations({'address':aw,'no_cache':d,'network':b}),ay=new Set();let az=0x0;for(const aB of ax?.['entries']??[]){const aC=String(aB?.['who']??'')['toLowerCase']();if(!aC||aC==='0x0')continue;if(objectTypeFromAddress(aC)===undefined)continue;const aD=(aB?.['table']??'')+':'+aC;if(ay['has'](aD))continue;ay['add'](aD),az++;}const aA=E['get'](aw)??F['get'](aw)??(u['treasuries']['has'](aw)||u['rewards']['has'](aw)?H['get'](aw):undefined);if(aA)aA['related_objects']=az;}catch{}})),await Promise['all']([...u['machines']['keys']()]['map'](async aw=>{try{const [ax,ay]=await Promise['all']([fetchMachineNodes(aw,b)['catch'](()=>undefined),fetchObjectLinkerTx(aw,b,d)]);if(!G['has'](aw))G['set'](aw,{});const az=G['get'](aw);if(ax){az['nodes']=ax['length'];let aA=0x0;for(const aB of ax){for(const aC of Array['isArray'](aB?.['value'])?aB['value']:[]){if(aC&&typeof aC==='object'&&aC['prev_node'])aA++;}}az['edges']=aA;}if(ay){const aD=new Set();let aE=0x0,aF=0x0;for(const aG of ay['items']??[]){const aH=String(aG?.['who']??'')['toLowerCase']();if(!aH||aH==='0x0'||aD['has'](aH))continue;aD['add'](aH);if(objectTypeFromAddress(aH)===undefined)continue;aE++;if(objectTypeFromAddress(aH)===ObjectType['Progress'])aF++;}az['related_objects']=aE,az['progresses']=aF;}}catch{}}));const a7=0x12c,a8=0xc8;await Promise['all']([...F['keys']()]['map'](async aw=>{try{let ax=undefined,ay=0x0;for(;;){const aA=await query_table({'parent':aw,'cursor':ax,'limit':a8,'no_cache':d,'network':b});ay+=Array['isArray'](aA?.['items'])?aA['items']['length']:0x0;if(!aA?.['hasNextPage']||!aA?.['nextCursor']||ay>=a7)break;ax=String(aA['nextCursor']);}const az=F['get'](aw);if(az)az['records_total']=Math['min'](ay,a7);}catch(aB){if(/query\.parent/i['test'](String(aB?.['message']??aB))){const aC=F['get'](aw);if(aC)aC['records_total']=0x0;}}}));}catch{}const J=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax)}))),K=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...E['get'](ax)??{}}))),L=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...H['get'](ax)??{}}))),M=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...H['get'](ax)??{}}))),N=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...F['get'](ax)??{}}))),O=aw=>sortItems([...aw['entries']()]['map'](([ax,ay])=>({'object':ax,'object_type':objectTypeFromAddress(ax)??null,'name':B['byAddress']['get'](ax),'time':ay||undefined,'description':C['get'](ax),'tags':D['get'](ax),...G['get'](ax)??{}}))),P={'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':M(u['treasuries']),'repositories':N(u['repositories']),'contacts':K(u['contacts']),'machines':O(u['machines']),'rewards':L(u['rewards']),'others':J(w),'counts':{'treasuries':u['treasuries']['size'],'repositories':u['repositories']['size'],'contacts':u['contacts']['size'],'machines':u['machines']['size'],'rewards':u['rewards']['size'],'others':w['size']}};for(const aw of[P['treasuries'],P['repositories'],P['contacts'],P['machines'],P['rewards'],P['others']]){for(const ax of aw){const ay=I['get'](ax['object']);if(ay)ax['rep']=ay;}}aggCache['set'](e,{'at':Date['now'](),'value':P});if(aggCache['size']>AGG_CACHE_MAX){const az=aggCache['keys']()['next']()['value'];if(az!==undefined)aggCache['delete'](az);}return P;})());if(!d)aggInflight['set'](e,f);try{return await f;}finally{if(!d)aggInflight['delete'](e);}}
1
+ import{objectTypeFromAddress,query_affiliations,query_local_mark_list,query_table}from'@wowok/wowok';import{ObjectType}from'@wowok/wowok';import{batchFetchEntityLinker,batchFetchEntityRegistrar,batchQueryObjectsByIds,fetchEntityPermission,fetchEntityContact,fetchObjectLinkerCore,fetchObjectLinkerTx,listLocalAccounts,resolveLocalNamesFor}from'./workflow-guidance.js';import{fetchMachineNodes,buildMachineGraph}from'../playbooks/service-build/machine-nodes.js';const AGG_TTL_MS=0x1d4c0,AGG_CACHE_MAX=0x8,aggCache=new Map(),aggInflight=new Map(),CLASSIFIED_TYPES=new Set([ObjectType['Permission'],ObjectType['Service'],ObjectType['Machine'],ObjectType['Treasury'],ObjectType['Repository'],ObjectType['Reward'],ObjectType['Demand'],ObjectType['Arbitration'],ObjectType['Arb'],ObjectType['Contact'],ObjectType['Order'],ObjectType['Progress']]);function sortItems(a){return a['sort']((c,d)=>(d['time']??0x0)-(c['time']??0x0)||c['object']['localeCompare'](d['object']));}export async function buildWorkspaceLists(a){const b=a['network'],c=a['account']?.['trim']()['toLowerCase']()||undefined,d=a['no_cache']===!![],e=(b??'')+'|'+(c??'');if(!d){const g=aggCache['get'](e);if(g&&Date['now']()-g['at']<AGG_TTL_MS)return{...g['value'],'cached':!![]};const h=aggInflight['get'](e);if(h)return h;}const f=((async()=>{const i=c?[{'address':c,'name':undefined}]:await listLocalAccounts(),j={'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':[],'repositories':[],'contacts':[],'machines':[],'rewards':[],'others':[],'counts':{'treasuries':0x0,'repositories':0x0,'contacts':0x0,'machines':0x0,'rewards':0x0,'others':0x0},'note':i['length']===0x0?'No\x20local\x20accounts\x20found\x20—\x20create\x20or\x20import\x20an\x20account\x20first.':undefined};if(i['length']===0x0)return aggCache['set'](e,{'at':Date['now'](),'value':j}),j;const [k,l,n]=await Promise['all']([Promise['all'](i['map'](S=>fetchEntityPermission(S['address'],b,d))),Promise['all'](i['map'](S=>fetchEntityContact(S['address'],b,d))),Promise['all'](i['map'](S=>fetchObjectLinkerTx(S['address'],b,d)))]),p=[],q=new Set();for(const S of k){for(const T of S?.['items']??[]){!q['has'](T['permission'])&&(q['add'](T['permission']),p['push'](T['permission']));}}const s=await Promise['all'](p['map'](U=>fetchObjectLinkerCore(U,b,d))),u={'treasuries':new Map(),'repositories':new Map(),'contacts':new Map(),'machines':new Map(),'rewards':new Map()},v=(U,V,W)=>{const X=V['toLowerCase'](),Y=U['get'](X);if(Y===undefined||(W??0x0)>Y)U['set'](X,W??0x0);};s['forEach'](U=>{for(const V of U?.['items']??[]){const W=objectTypeFromAddress(V['who']);if(W===ObjectType['Treasury'])v(u['treasuries'],V['who'],V['time']);else{if(W===ObjectType['Repository'])v(u['repositories'],V['who'],V['time']);else{if(W===ObjectType['Machine'])v(u['machines'],V['who'],V['time']);else{if(W===ObjectType['Reward'])v(u['rewards'],V['who'],V['time']);else{if(W===ObjectType['Contact'])v(u['contacts'],V['who'],V['time']);}}}}}});for(const U of l){for(const V of U?.['items']??[])v(u['contacts'],V['contact'],V['time']);}const w=new Map();for(const W of n){for(const X of W?.['items']??[]){const Y=objectTypeFromAddress(X['who']);if(Y&&CLASSIFIED_TYPES['has'](Y))continue;v(w,X['who'],X['time']);}}const x=[...u['treasuries']['keys'](),...u['repositories']['keys'](),...u['contacts']['keys'](),...u['machines']['keys'](),...u['rewards']['keys'](),...w['keys']()],y=Z=>Z['startsWith']('0x00'),z=[],A=[];for(const Z of x){if(y(Z))A['push'](Z);else z['push'](Z);}const B=await resolveLocalNamesFor(x);if(a['light']){const a0=a2=>sortItems([...a2['entries']()]['map'](([a3,a4])=>({'object':a3,'object_type':objectTypeFromAddress(a3)??null,'name':B['byAddress']['get'](a3),'time':a4||undefined}))),a1={'treasuries':u['treasuries']['size'],'repositories':u['repositories']['size'],'contacts':u['contacts']['size'],'machines':u['machines']['size'],'rewards':u['rewards']['size'],'others':w['size']};return{'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':a0(u['treasuries']),'repositories':a0(u['repositories']),'contacts':a0(u['contacts']),'machines':a0(u['machines']),'rewards':a0(u['rewards']),'others':a0(w),'counts':a1,'note':i['length']===0x0?'No\x20local\x20accounts\x20found\x20—\x20create\x20or\x20import\x20an\x20account\x20first.':undefined};}const C=new Map(),D=new Map(),E=new Map(),F=new Map(),G=new Map(),H=new Map(),I=new Map();let J=![];try{const [a2,a3,a4,a5]=await Promise['all']([z['length']>0x0?batchQueryObjectsByIds(z,b,d)['then'](ab=>({'objects':ab})):Promise['resolve']({'objects':[]}),batchFetchEntityRegistrar(A,b,d),query_local_mark_list(undefined),listLocalAccounts()]),a6=new Set((a5??[])['map'](ab=>String(ab?.['address']??'')['toLowerCase']())),a7=new Set((a2?.['objects']??[])['map'](ab=>String(ab?.['object']??ab?.['address']??'')['toLowerCase']())['filter'](Boolean));for(const [ab,ac]of a3){a7['add'](ab);const ad=ac?.['description']??ac?.['info']?.['description'];if(typeof ad==='string'&&ad['trim']())C['set'](ab,ad['trim']());}if(a7['size']>0x0){const ae=af=>{for(const ag of[...af['keys']()])if(!a7['has'](ag))af['delete'](ag);};ae(u['treasuries']),ae(u['repositories']),ae(u['contacts']),ae(u['machines']),ae(u['rewards']),ae(w);}const a8=new Set([...u['treasuries']['keys'](),...u['repositories']['keys'](),...u['contacts']['keys'](),...u['machines']['keys'](),...u['rewards']['keys'](),...w['keys']()]);try{const af=await batchFetchEntityLinker([...a8],b,d);J=!![];for(const [ag,ah]of af){const ai=Array['isArray'](ah?.['votes'])?ah['votes']:[];I['set'](ag,{'like':ai['filter'](aj=>aj&&aj['like'])['length'],'dislike':ai['filter'](aj=>aj&&aj['dislike'])['length'],'favor':ai['filter'](aj=>aj&&aj['favor'])['length'],...ai['length']>0x0?{'votes':ai['map'](aj=>({'who':aj?.['who']??null,'like':!!aj?.['like'],'dislike':!!aj?.['dislike'],'favor':!!aj?.['favor']}))}:{}});}}catch{}for(const aj of a2?.['objects']??[]){const ak=String(aj?.['object']??aj?.['address']??'')['toLowerCase'](),al=aj?.['description']??aj?.['data']?.['description'];ak&&typeof al==='string'&&al['trim']()&&C['set'](ak,al['trim']());if(ak&&u['contacts']['has'](ak)){const am=Array['isArray'](aj?.['ims'])?aj['ims']:[],an=typeof aj?.['location']==='string'?aj['location']['trim']():'';E['set'](ak,{...an?{'location':an}:{},'members_total':am['length'],'members_mine':am['filter'](ao=>a6['has'](String(ao?.['at']??'')['toLowerCase']()))['length']});}if(ak&&u['rewards']['has'](ak)){const ao=/<([0-9a-zA-Z_:]+)>\s*$/['exec'](String(aj?.['type_raw']??'')),ap=Array['isArray'](aj?.['guards'])?aj['guards']:[],aq=Number(aj?.['record_count']);H['set'](ak,{...ao?{'token':ao[0x1]['split']('::')['pop']()}:{},'guards_total':ap['length'],...Number['isFinite'](aq)?{'claimers':aq}:{},...aj?.['balance']!=null?{'balance_total':String(aj['balance'])}:{},...aj?.['type_raw']!=null?{'type_raw':String(aj['type_raw'])}:{}});}if(ak&&u['treasuries']['has'](ak)){const ar=/<([0-9a-zA-Z_:]+)>\s*$/['exec'](String(aj?.['type_raw']??'')),as=at=>at===null||at===undefined||at===''?undefined:String(at);H['set'](ak,{...ar?{'token':ar[0x1]['split']('::')['pop']()}:{},...aj?.['balance']!=null?{'balance_total':String(aj['balance'])}:{},...aj?.['type_raw']!=null?{'type_raw':String(aj['type_raw'])}:{},...aj?.['inflow']!=null?{'inflow':as(aj['inflow'])}:{},...aj?.['outflow']!=null?{'outflow':as(aj['outflow'])}:{}});}if(ak&&u['repositories']['has'](ak)){const at=Number(aj?.['data_count']),au=Array['isArray'](aj?.['policies'])?aj['policies']:[],av=Array['isArray'](aj?.['rewards'])?aj['rewards']:[];F['set'](ak,{...Number['isFinite'](at)?{'records_total':at}:{},'policies_total':au['length'],'rewards_total':av['length']});}ak&&u['machines']['has'](ak)&&(aj?.['bPublished']!=null||aj?.['bPaused']!=null||aj?.['node_count']!=null)&&G['set'](ak,{'status':aj['bPublished']===!![]?aj['bPaused']===!![]?'PAUSED':'LIVE':'UNPUBLISHED',...Number['isFinite'](Number(aj?.['node_count']))?{'nodes':Number(aj['node_count'])}:{}});}for(const aw of a4??[]){const ax=String(aw?.['address']??'')['toLowerCase']();ax&&Array['isArray'](aw?.['tags'])&&aw['tags']['length']>0x0&&D['set'](ax,aw['tags']['map'](String));}await Promise['all']([...E['keys'](),...F['keys'](),...[...H['keys']()]['filter'](ay=>u['treasuries']['has'](ay)||u['rewards']['has'](ay))]['map'](async ay=>{try{const az=await query_affiliations({'address':ay,'no_cache':d,'network':b}),aA=new Set();let aB=0x0;for(const aD of az?.['entries']??[]){const aE=String(aD?.['who']??'')['toLowerCase']();if(!aE||aE==='0x0')continue;if(objectTypeFromAddress(aE)===undefined)continue;const aF=(aD?.['table']??'')+':'+aE;if(aA['has'](aF))continue;aA['add'](aF),aB++;}const aC=E['get'](ay)??F['get'](ay)??(u['treasuries']['has'](ay)||u['rewards']['has'](ay)?H['get'](ay):undefined);if(aC)aC['related_objects']=aB;}catch{}})),await Promise['all']([...u['machines']['keys']()]['map'](async ay=>{try{const [az,aA]=await Promise['all']([fetchMachineNodes(ay,b)['catch'](()=>undefined),fetchObjectLinkerTx(ay,b,d)]);if(!G['has'](ay))G['set'](ay,{});const aB=G['get'](ay);if(az){const aC=buildMachineGraph(az);!Number['isFinite'](Number(aB['nodes']))&&(aB['nodes']=aC['nodes']['filter'](aD=>!aD['is_start']&&aD['name']!=='')['length']),aB['edges']=aC['edges']['length'];}else Number(aB['nodes'])===0x0&&(aB['edges']=0x0);if(aA){const aD=new Set();let aE=0x0,aF=0x0;for(const aG of aA['items']??[]){const aH=String(aG?.['who']??'')['toLowerCase']();if(!aH||aH==='0x0'||aD['has'](aH))continue;aD['add'](aH);if(objectTypeFromAddress(aH)===undefined)continue;aE++;if(objectTypeFromAddress(aH)===ObjectType['Progress'])aF++;}aB['related_objects']=aE,aB['progresses']=aF;}}catch{}}));const a9=0x12c,aa=0xc8;await Promise['all']([...F['keys']()]['map'](async ay=>{try{let az=undefined,aA=0x0;for(;;){const aC=await query_table({'parent':ay,'cursor':az,'limit':aa,'no_cache':d,'network':b});aA+=Array['isArray'](aC?.['items'])?aC['items']['length']:0x0;if(!aC?.['hasNextPage']||!aC?.['nextCursor']||aA>=a9)break;az=String(aC['nextCursor']);}const aB=F['get'](ay);if(aB)aB['records_total']=Math['min'](aA,a9);}catch(aD){if(/query\.parent/i['test'](String(aD?.['message']??aD))){const aE=F['get'](ay);if(aE)aE['records_total']=0x0;}}}));}catch{}const K=ay=>sortItems([...ay['entries']()]['map'](([az,aA])=>({'object':az,'object_type':objectTypeFromAddress(az)??null,'name':B['byAddress']['get'](az),'time':aA||undefined,'description':C['get'](az),'tags':D['get'](az)}))),L=ay=>sortItems([...ay['entries']()]['map'](([az,aA])=>({'object':az,'object_type':objectTypeFromAddress(az)??null,'name':B['byAddress']['get'](az),'time':aA||undefined,'description':C['get'](az),'tags':D['get'](az),...E['get'](az)??{}}))),M=ay=>sortItems([...ay['entries']()]['map'](([az,aA])=>({'object':az,'object_type':objectTypeFromAddress(az)??null,'name':B['byAddress']['get'](az),'time':aA||undefined,'description':C['get'](az),'tags':D['get'](az),...H['get'](az)??{}}))),N=ay=>sortItems([...ay['entries']()]['map'](([az,aA])=>({'object':az,'object_type':objectTypeFromAddress(az)??null,'name':B['byAddress']['get'](az),'time':aA||undefined,'description':C['get'](az),'tags':D['get'](az),...H['get'](az)??{}}))),O=ay=>sortItems([...ay['entries']()]['map'](([az,aA])=>({'object':az,'object_type':objectTypeFromAddress(az)??null,'name':B['byAddress']['get'](az),'time':aA||undefined,'description':C['get'](az),'tags':D['get'](az),...F['get'](az)??{}}))),P=ay=>sortItems([...ay['entries']()]['map'](([az,aA])=>({'object':az,'object_type':objectTypeFromAddress(az)??null,'name':B['byAddress']['get'](az),'time':aA||undefined,'description':C['get'](az),'tags':D['get'](az),...G['get'](az)??{}}))),Q={'action':'workspace_lists','network':b,'updated_at_ms':Date['now'](),'cached':![],'treasuries':N(u['treasuries']),'repositories':O(u['repositories']),'contacts':L(u['contacts']),'machines':P(u['machines']),'rewards':M(u['rewards']),'others':K(w),'counts':{'treasuries':u['treasuries']['size'],'repositories':u['repositories']['size'],'contacts':u['contacts']['size'],'machines':u['machines']['size'],'rewards':u['rewards']['size'],'others':w['size']}},R={'like':0x0,'dislike':0x0,'favor':0x0};for(const ay of[Q['treasuries'],Q['repositories'],Q['contacts'],Q['machines'],Q['rewards'],Q['others']]){for(const az of ay){const aA=I['get'](az['object']);if(aA)az['rep']=aA;else{if(J)az['rep']=R;}}}aggCache['set'](e,{'at':Date['now'](),'value':Q});if(aggCache['size']>AGG_CACHE_MAX){const aB=aggCache['keys']()['next']()['value'];if(aB!==undefined)aggCache['delete'](aB);}return Q;})());if(!d)aggInflight['set'](e,f);try{return await f;}finally{if(!d)aggInflight['delete'](e);}}
@@ -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 a259a,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)=>a259a(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 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 +1 @@
1
- export const MONITOR_CAPTURE_TYPES=['NewOrderEvent','ArbEvent','VoteEvent','FeedbackEvent','DemandPresentEvent','DemandFeedbackEvent','DemandChangedEvent','ProgressEvent','AllocationEvent','TreasuryEvent','RewardClaimEvent','RewardFundEvent','ServiceEvent','NewEntityEvent'];export const PAYMENT_EVENT_TYPE='NewPaymentEvent';export const MONITOR_KNOWN_TYPES=[...MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE];export const EVENT_MODULE_OF={'NewOrderEvent':'order','ArbEvent':'arb','VoteEvent':'arb','FeedbackEvent':'arb','DemandPresentEvent':'demand','DemandFeedbackEvent':'demand','DemandChangedEvent':'demand','ProgressEvent':'progress','AllocationEvent':'treasury','TreasuryEvent':'treasury','RewardClaimEvent':'reward','RewardFundEvent':'reward','ServiceEvent':'service','NewEntityEvent':'entity','NewPaymentEvent':'payment'};export function monitorEventShortType(a){if(!a||typeof a!=='string')return null;if(a['includes']('::order::NewOrderEvent'))return'NewOrderEvent';if(a['includes']('::demand::PresentEvent'))return'DemandPresentEvent';if(a['includes']('::demand::DemandChangedEvent'))return'DemandChangedEvent';if(a['includes']('::demand::DemandEvent'))return'DemandFeedbackEvent';if(a['includes']('::progress::ProgressEvent'))return'ProgressEvent';if(a['includes']('::arb::VoteEvent'))return'VoteEvent';if(a['includes']('::arb::FeedbackEvent'))return'FeedbackEvent';if(a['includes']('::arb::ArbEvent'))return'ArbEvent';if(a['includes']('::registrar::NewEntityEvent'))return'NewEntityEvent';if(a['includes']('::service::ServiceEvent'))return'ServiceEvent';if(a['includes']('::allocation::AllocationEvent'))return'AllocationEvent';if(a['includes']('::treasury::TreasuryEvent'))return'TreasuryEvent';if(a['includes']('::reward::RewardClaimEvent'))return'RewardClaimEvent';if(a['includes']('::reward::RewardFundEvent'))return'RewardFundEvent';if(a['includes']('::payment::NewPaymentEvent'))return'NewPaymentEvent';return null;}export function normalizeMonitorEvent(a){if(!a||typeof a!=='object')return a;if(MONITOR_KNOWN_TYPES['includes'](a['type'])&&!a['parsedJson_raw'])return a;const b=MONITOR_KNOWN_TYPES['includes'](a['type'])?a['type']:monitorEventShortType(a['type_raw']??a['type']);if(!b)return a;const c=a['parsedJson_raw']??{},d=f=>f&&typeof f==='object'&&!Array['isArray'](f)&&'some'in f?f['some']:f,e={...a,'type':b};switch(b){case'NewOrderEvent':return{...e,'order':d(c['object']),'service':d(c['service'])??null,'progress':d(c['progress'])??null,'discount':d(c['discount'])??null,'allocation':d(c['allocation'])??null,'amount':d(c['amount'])??null};case'DemandPresentEvent':return{...e,'demand':d(c['object']),'service':d(c['service'])??null,'recommend':d(c['recommend'])??null};case'DemandFeedbackEvent':return{...e,'demand':d(c['object']),'service':d(c['service'])??null,'feedback':d(c['feedback'])??null,'acceptance_score':d(c['acceptance_score'])??null};case'ProgressEvent':return{...e,'progress':d(c['object']),'machine':d(c['machine'])??null,'task':d(c['task'])??null,'node':d(c['node'])??null,'forward':d(c['forward'])??null,'hold':d(c['hold'])??null};case'ArbEvent':return{...e,'arb':d(c['object']),'arbitration':d(c['arbitration'])??null,'order':d(c['order'])??null,'status':d(c['status'])??null};case'NewEntityEvent':return{...e,'resource':d(c['resource'])??null,'address':a['sender'],'referrer':d(c['referrer'])??null};case'ServiceEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null};case'DemandChangedEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null,'rewards':d(c['rewards'])??[]};case'VoteEvent':return{...e,'object':d(c['object']),'voter':d(c['voter'])??null,'agrees':d(c['agrees'])??[],'weight':d(c['weight'])??null};case'FeedbackEvent':return{...e,'object':d(c['object']),'feedback':d(c['feedback'])??null};case'AllocationEvent':return{...e,'object':d(c['object']),'payment':d(c['payment'])??null,'guard':d(c['guard'])??null,'amount':d(c['amount'])??null};case'TreasuryEvent':return{...e,'object':d(c['object']),'op':d(c['op'])??null,'payment':d(c['payment'])??null,'amount':d(c['amount'])??null,'external_guard':d(c['external_guard'])??null,'store_from_id':d(c['store_from_id'])??null};case'RewardClaimEvent':return{...e,'object':d(c['object']),'guard':d(c['guard'])??null,'recipient':d(c['recipient'])??null,'amount':d(c['amount'])??null,'total':d(c['total'])??null,'balance_left':d(c['balance_left'])??null,'store_from_id':d(c['store_from_id'])??null};case'RewardFundEvent':return{...e,'object':d(c['object']),'amount':d(c['amount'])??null,'balance':d(c['balance'])??null,'from_payment':d(c['from_payment'])??null};case'NewPaymentEvent':return{...e,'object':d(c['object']),'info':c['info']?{...c['info'],'for_object':d(c['info']?.['for_object'])??null,'for_guard':d(c['info']?.['for_guard'])??null}:null,'record':Array['isArray'](c['record'])?c['record']:[],'amount':d(c['amount'])??null,'from_object':d(c['from_object'])??null};default:return e;}}export const EVENT_ADDRESS_FIELDS=['object','order','service','demand','progress','arb','arbitration','allocation','discount','machine','task','address','resource','payment','from_payment','from_object'];
1
+ export const MONITOR_CAPTURE_TYPES=['NewOrderEvent','ArbEvent','VoteEvent','FeedbackEvent','DemandPresentEvent','DemandFeedbackEvent','DemandChangedEvent','ProgressEvent','AllocationEvent','TreasuryEvent','RewardClaimEvent','RewardFundEvent','ServiceEvent','NewEntityEvent'];export const PAYMENT_EVENT_TYPE='NewPaymentEvent';export const MONITOR_KNOWN_TYPES=[...MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE];export const EVENT_MODULE_OF={'NewOrderEvent':'order','ArbEvent':'arb','VoteEvent':'arb','FeedbackEvent':'arb','DemandPresentEvent':'demand','DemandFeedbackEvent':'demand','DemandChangedEvent':'demand','ProgressEvent':'progress','AllocationEvent':'treasury','TreasuryEvent':'treasury','RewardClaimEvent':'reward','RewardFundEvent':'reward','ServiceEvent':'service','NewEntityEvent':'entity','NewPaymentEvent':'payment'};export function monitorEventShortType(a){if(!a||typeof a!=='string')return null;if(a['includes']('::order::NewOrderEvent'))return'NewOrderEvent';if(a['includes']('::demand::PresentEvent'))return'DemandPresentEvent';if(a['includes']('::demand::DemandChangedEvent'))return'DemandChangedEvent';if(a['includes']('::demand::DemandEvent'))return'DemandFeedbackEvent';if(a['includes']('::progress::ProgressEvent'))return'ProgressEvent';if(a['includes']('::arb::VoteEvent'))return'VoteEvent';if(a['includes']('::arb::FeedbackEvent'))return'FeedbackEvent';if(a['includes']('::arb::ArbEvent'))return'ArbEvent';if(a['includes']('::registrar::NewEntityEvent'))return'NewEntityEvent';if(a['includes']('::service::ServiceEvent'))return'ServiceEvent';if(a['includes']('::arbitration::ArbitrationEvent'))return'ArbitrationEvent';if(a['includes']('::allocation::AllocationEvent'))return'AllocationEvent';if(a['includes']('::treasury::TreasuryEvent'))return'TreasuryEvent';if(a['includes']('::reward::RewardClaimEvent'))return'RewardClaimEvent';if(a['includes']('::reward::RewardFundEvent'))return'RewardFundEvent';if(a['includes']('::payment::NewPaymentEvent'))return'NewPaymentEvent';return null;}export function normalizeMonitorEvent(a){if(!a||typeof a!=='object')return a;if(MONITOR_KNOWN_TYPES['includes'](a['type'])&&!a['parsedJson_raw'])return a;const b=MONITOR_KNOWN_TYPES['includes'](a['type'])?a['type']:monitorEventShortType(a['type_raw']??a['type']);if(!b)return a;const c=a['parsedJson_raw']??{},d=f=>f&&typeof f==='object'&&!Array['isArray'](f)&&'some'in f?f['some']:f,e={...a,'type':b};switch(b){case'NewOrderEvent':return{...e,'order':d(c['object']),'service':d(c['service'])??null,'progress':d(c['progress'])??null,'discount':d(c['discount'])??null,'allocation':d(c['allocation'])??null,'amount':d(c['amount'])??null};case'DemandPresentEvent':return{...e,'demand':d(c['object']),'service':d(c['service'])??null,'recommend':d(c['recommend'])??null};case'DemandFeedbackEvent':return{...e,'demand':d(c['object']),'service':d(c['service'])??null,'feedback':d(c['feedback'])??null,'acceptance_score':d(c['acceptance_score'])??null};case'ProgressEvent':return{...e,'progress':d(c['object']),'machine':d(c['machine'])??null,'task':d(c['task'])??null,'node':d(c['node'])??null,'forward':d(c['forward'])??null,'hold':d(c['hold'])??null};case'ArbEvent':return{...e,'arb':d(c['object']),'arbitration':d(c['arbitration'])??null,'order':d(c['order'])??null,'status':d(c['status'])??null};case'NewEntityEvent':return{...e,'resource':d(c['resource'])??null,'address':a['sender'],'referrer':d(c['referrer'])??null};case'ServiceEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null};case'ArbitrationEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null,'fee':d(c['fee'])??null,'voting_guard_count':d(c['voting_guard_count'])??null};case'DemandChangedEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null,'rewards':d(c['rewards'])??[]};case'VoteEvent':return{...e,'object':d(c['object']),'voter':d(c['voter'])??null,'agrees':d(c['agrees'])??[],'weight':d(c['weight'])??null};case'FeedbackEvent':return{...e,'object':d(c['object']),'feedback':d(c['feedback'])??null};case'AllocationEvent':return{...e,'object':d(c['object']),'payment':d(c['payment'])??null,'guard':d(c['guard'])??null,'amount':d(c['amount'])??null};case'TreasuryEvent':return{...e,'object':d(c['object']),'op':d(c['op'])??null,'payment':d(c['payment'])??null,'amount':d(c['amount'])??null,'external_guard':d(c['external_guard'])??null,'store_from_id':d(c['store_from_id'])??null};case'RewardClaimEvent':return{...e,'object':d(c['object']),'guard':d(c['guard'])??null,'recipient':d(c['recipient'])??null,'amount':d(c['amount'])??null,'total':d(c['total'])??null,'balance_left':d(c['balance_left'])??null,'store_from_id':d(c['store_from_id'])??null};case'RewardFundEvent':return{...e,'object':d(c['object']),'amount':d(c['amount'])??null,'balance':d(c['balance'])??null,'from_payment':d(c['from_payment'])??null};case'NewPaymentEvent':return{...e,'object':d(c['object']),'info':c['info']?{...c['info'],'for_object':d(c['info']?.['for_object'])??null,'for_guard':d(c['info']?.['for_guard'])??null}:null,'record':Array['isArray'](c['record'])?c['record']:[],'amount':d(c['amount'])??null,'from_object':d(c['from_object'])??null};default:return e;}}export const EVENT_ADDRESS_FIELDS=['object','order','service','demand','progress','arb','arbitration','allocation','discount','machine','task','address','resource','payment','from_payment','from_object'];
@@ -1 +1 @@
1
- import{initServicePuzzleFromIntent,initMachinePuzzleFromIntent,initAllocationPuzzleFromIntent,initTreasuryPuzzleFromIntent,initArbitrationPuzzleFromIntent,initRewardPuzzleFromIntent,initProgressPuzzleFromIntent,initOrderPuzzleFromIntent,initPuzzleFromIntent as a292a,checkServicePuzzleCompleteness,checkMachinePuzzleCompleteness,checkAllocationPuzzleCompleteness,checkTreasuryPuzzleCompleteness,checkArbitrationPuzzleCompleteness,checkRewardPuzzleCompleteness,checkProgressPuzzleCompleteness,checkOrderPuzzleCompleteness,checkPuzzleCompleteness as a292b}from'../../knowledge/index.js';import{initPuzzleFromIntent as a292c,checkPuzzleCompleteness as a292d}from'../../knowledge/permission-puzzle.js';const KEYWORD_TABLE=[{'category':'Product/Service','keywords_zh':['product','selling','sell','sales','store','open\x20shop'],'keywords_en':['sell','product','sale','shop','store'],'objects':['service','order','progress'],'required_level':'R','scene_id':'retail'},{'category':'Subscription','keywords_zh':['subscription','cycle','renewal'],'keywords_en':['subscribe','recurring','subscription'],'objects':['service','machine','reward'],'required_level':'C','scene_id':'subscription'},{'category':'Rental','keywords_zh':['rent','lease','return'],'keywords_en':['rent','lease','return'],'objects':['service','machine','arb'],'required_level':'C','scene_id':'rental_return'},{'category':'Trust','keywords_zh':['deposit','pledge','verify','trust'],'keywords_en':['deposit','trust','verify'],'objects':['guard','permission','treasury'],'required_level':'R','scene_id':'trust_deposit'},{'category':'Funds','keywords_zh':['split','collect','share\x20profit','income','incentive'],'keywords_en':['split','revenue','reward'],'objects':['allocation','treasury','reward'],'required_level':'R','scene_id':'revenue_split'},{'category':'Workflow','keywords_zh':['node','stage','process','workflow'],'keywords_en':['workflow','stage','node'],'objects':['machine','progress'],'required_level':'R','scene_id':'workflow'},{'category':'Dispute','keywords_zh':['arbitration','refund','conflict','rights\x20protection'],'keywords_en':['arbitration','refund','dispute'],'objects':['arb','proof'],'required_level':'C','scene_id':'arbitration_dispute'},{'category':'Contact','keywords_zh':['customer\x20service','contact','communication'],'keywords_en':['contact','support','im'],'objects':['contact'],'required_level':'C','scene_id':'contact_im'},{'category':'Data','keywords_zh':['evidence','record','data'],'keywords_en':['evidence','record','data'],'objects':['repository','proof'],'required_level':'C','scene_id':'evidence_record'},{'category':'User\x20Profile','keywords_zh':['personal\x20info','preference','privacy'],'keywords_en':['personal','profile','privacy'],'objects':['personal','contact'],'required_level':'OPTIONAL','scene_id':'user_profile'},{'category':'Demand\x20Submission','keywords_zh':['demand','publish','inquiry'],'keywords_en':['demand','request','inquiry'],'objects':['demand'],'required_level':'OPTIONAL','scene_id':'demand_inquiry'}],INDUSTRY_KEYWORDS=[{'industry':'freelance','words':['freelance','outsourcing','freelance','gig']},{'industry':'rental','words':['rental','lease','rental','rent']},{'industry':'education','words':['education','course','training','education','course']},{'industry':'travel','words':['travel','tour','itinerary','travel','trip']},{'industry':'subscription','words':['subscription','cycle','subscription','recurring']}];function buildPuzzleDispatch(){const a=(c,d)=>{try{return c(d);}catch{return undefined;}},b=(c,d)=>{if(!c)return{'missing':[],'complete':![],'next_step':'init\x20failed'};try{return d(c);}catch{return{'missing':[],'complete':![],'next_step':'check\x20failed'};}};return{'service':{'init':c=>a(initServicePuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkServicePuzzleCompleteness)},'machine':{'init':c=>a(initMachinePuzzleFromIntent,c),'check':c=>b(c,checkMachinePuzzleCompleteness)},'allocation':{'init':c=>a(initAllocationPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkAllocationPuzzleCompleteness)},'treasury':{'init':c=>a(initTreasuryPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkTreasuryPuzzleCompleteness)},'arb':{'init':c=>a(initArbitrationPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkArbitrationPuzzleCompleteness)},'reward':{'init':c=>a(initRewardPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkRewardPuzzleCompleteness)},'progress':{'init':c=>a(initProgressPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkProgressPuzzleCompleteness)},'order':{'init':c=>a(initOrderPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkOrderPuzzleCompleteness)},'permission':{'init':c=>a(a292c,{'primary_goal':c}),'check':c=>b(c,a292d)},'guard':{'init':c=>a(a292a,{'primary_goal':c}),'check':c=>b(c,a292b)}};}export function extractKeywords(a){if(!a||typeof a!=='string')return[];const b=[];for(const c of KEYWORD_TABLE){const d=[...c['keywords_zh'],...c['keywords_en']];for(const e of d){try{const f=new RegExp(escapeRegex(e),'gi'),g=(a['match'](f)||[])['length'];g>0x0&&b['push']({'keyword':e,'category':c['category'],'matched_objects':[...c['objects']],'required_level':c['required_level'],'match_count':g});}catch{}}}return b['sort']((h,i)=>i['match_count']-h['match_count']),b;}function escapeRegex(a){return a['replace'](/[.*+?^${}()|[\]\\]/g,'\x5c$&');}export function resolveIndustry(a,b){const c=((a??'')+'\x20'+(b??''))['toLowerCase']();for(const d of INDUSTRY_KEYWORDS){for(const e of d['words']){if(c['includes'](e['toLowerCase']()))return d['industry'];}}return'general';}export function identifyObjects(a,b){if(b['length']===0x0)return{'primary':'service','secondary':['permission','machine','progress'],'scenes':[{'object':'service','scene_id':'general'}]};const c=b['find'](i=>i['required_level']==='R'),d=(c??b[0x0])['matched_objects'][0x0],e=new Set([d]),f=[];for(const i of b){for(const j of i['matched_objects']){!e['has'](j)&&(e['add'](j),f['push'](j));}}const g=[],h=new Set();for(const k of KEYWORD_TABLE){const l=b['find'](n=>n['category']===k['category']);if(!l)continue;if(h['has'](k['scene_id']))continue;h['add'](k['scene_id']),g['push']({'object':k['objects'][0x0],'scene_id':k['scene_id']});}return{'primary':d,'secondary':f,'scenes':g};}export function analyzeBusinessIntent(a){const b=[];if(!a||!a['user_intent']||typeof a['user_intent']!=='string')return{'intent_parsed':{'primary_object':'service','secondary_objects':[],'detected_scenes':[],'industry':'general','keyword_matches':[]},'puzzles':{},'overall_completeness':'empty','next_step':'Please\x20provide\x20a\x20non-empty\x20business\x20intent.','recommended_creation_order':[],'warnings':['input.user_intent\x20is\x20empty']};const c=a['user_intent'],e=extractKeywords(c),f=resolveIndustry(c,a['industry']),{primary:g,secondary:h,scenes:i}=identifyObjects(c,e);let j=[g,...h];if(a['target_objects']&&a['target_objects']['length']>0x0){const p=a['target_objects']['filter'](q=>['service','machine','guard','permission','reward','arb','progress','treasury','demand','repository','contact','order','allocation','personal','payment','proof']['includes'](q));if(p['length']>0x0)j=p;}const k=buildPuzzleDispatch(),l={};for(const q of j){const r=k[q];if(!r){b['push']('No\x20puzzle\x20module\x20for\x20\x27'+q+'\x27\x20—\x20skipped\x20(L3\x20object)');continue;}const s=r['init'](c),t=s?r['check'](s):undefined,u=extractMissingDimensions(t);l[q]={'puzzle':s,'completeness':t,'missing_dimensions':u},!s&&b['push']('Puzzle\x20init\x20failed\x20for\x20\x27'+q+'\x27');}const m=aggregatePuzzleCompleteness(l),n=suggestNextPuzzleStep({'intent_parsed':{'primary_object':g,'secondary_objects':h,'detected_scenes':i,'industry':f,'keyword_matches':e},'puzzles':l,'overall_completeness':m,'next_step':'','recommended_creation_order':[],'warnings':b}),o=['permission','progress','guard','allocation','machine','service'];return{'intent_parsed':{'primary_object':g,'secondary_objects':h,'detected_scenes':i,'industry':f,'keyword_matches':e},'puzzles':l,'overall_completeness':m,'next_step':n,'recommended_creation_order':o,'warnings':b};}function extractMissingDimensions(a){if(!a||typeof a!=='object')return[];const b=a,d=b['missing'];if(Array['isArray'](d))return d['map'](f=>String(f));const e=b['missing_details'];if(Array['isArray'](e))return e['map'](f=>String(f?.['dimension']??f));return[];}export function aggregatePuzzleCompleteness(a){const b=Object['values'](a??{});if(b['length']===0x0)return'empty';const c=b['filter'](f=>!f['puzzle'])['length'];if(c===b['length'])return'empty';const d=b['reduce']((f,g)=>f+(g['missing_dimensions']?.['length']??0x0),0x0);if(d===0x0)return'complete';return'partial';}export function suggestNextPuzzleStep(a){if(!a)return'No\x20result\x20to\x20suggest\x20from.';if(a['overall_completeness']==='complete')return'All\x20puzzle\x20dimensions\x20are\x20complete\x20—\x20ready\x20for\x20risk\x20calibration\x20(stage\x203).';if(a['overall_completeness']==='empty')return'No\x20puzzle\x20has\x20been\x20initialized.\x20Provide\x20more\x20concrete\x20business\x20intent\x20so\x20the\x20primary\x20object\x20can\x20be\x20identified.';const b=['permission','treasury','allocation','guard','machine','service','order','progress','arb','reward','proof','repository','demand','contact','personal','payment'],d=a['puzzles']??{},e=b['filter'](f=>d[f]);for(const f of e){const g=d[f];if(!g)continue;const h=g['missing_dimensions']??[];if(h['length']===0x0)continue;const i=g['completeness'],j=i&&typeof i==='object'?i['next_step']:undefined;if(typeof j==='string'&&j['trim']())return'['+f+']\x20'+j;return'['+f+']\x20Complete\x20dimension'+(h['length']>0x1?'s':'')+'\x20'+h['join'](',\x20')+'\x20to\x20advance\x20the\x20puzzle.';}return'Continue\x20dialog\x20to\x20fill\x20remaining\x20pending\x20fields.';}
1
+ import{initServicePuzzleFromIntent,initMachinePuzzleFromIntent,initAllocationPuzzleFromIntent,initTreasuryPuzzleFromIntent,initArbitrationPuzzleFromIntent,initRewardPuzzleFromIntent,initProgressPuzzleFromIntent,initOrderPuzzleFromIntent,initPuzzleFromIntent as a210a,checkServicePuzzleCompleteness,checkMachinePuzzleCompleteness,checkAllocationPuzzleCompleteness,checkTreasuryPuzzleCompleteness,checkArbitrationPuzzleCompleteness,checkRewardPuzzleCompleteness,checkProgressPuzzleCompleteness,checkOrderPuzzleCompleteness,checkPuzzleCompleteness as a210b}from'../../knowledge/index.js';import{initPuzzleFromIntent as a210c,checkPuzzleCompleteness as a210d}from'../../knowledge/permission-puzzle.js';const KEYWORD_TABLE=[{'category':'Product/Service','keywords_zh':['product','selling','sell','sales','store','open\x20shop'],'keywords_en':['sell','product','sale','shop','store'],'objects':['service','order','progress'],'required_level':'R','scene_id':'retail'},{'category':'Subscription','keywords_zh':['subscription','cycle','renewal'],'keywords_en':['subscribe','recurring','subscription'],'objects':['service','machine','reward'],'required_level':'C','scene_id':'subscription'},{'category':'Rental','keywords_zh':['rent','lease','return'],'keywords_en':['rent','lease','return'],'objects':['service','machine','arb'],'required_level':'C','scene_id':'rental_return'},{'category':'Trust','keywords_zh':['deposit','pledge','verify','trust'],'keywords_en':['deposit','trust','verify'],'objects':['guard','permission','treasury'],'required_level':'R','scene_id':'trust_deposit'},{'category':'Funds','keywords_zh':['split','collect','share\x20profit','income','incentive'],'keywords_en':['split','revenue','reward'],'objects':['allocation','treasury','reward'],'required_level':'R','scene_id':'revenue_split'},{'category':'Workflow','keywords_zh':['node','stage','process','workflow'],'keywords_en':['workflow','stage','node'],'objects':['machine','progress'],'required_level':'R','scene_id':'workflow'},{'category':'Dispute','keywords_zh':['arbitration','refund','conflict','rights\x20protection'],'keywords_en':['arbitration','refund','dispute'],'objects':['arb','proof'],'required_level':'C','scene_id':'arbitration_dispute'},{'category':'Contact','keywords_zh':['customer\x20service','contact','communication'],'keywords_en':['contact','support','im'],'objects':['contact'],'required_level':'C','scene_id':'contact_im'},{'category':'Data','keywords_zh':['evidence','record','data'],'keywords_en':['evidence','record','data'],'objects':['repository','proof'],'required_level':'C','scene_id':'evidence_record'},{'category':'User\x20Profile','keywords_zh':['personal\x20info','preference','privacy'],'keywords_en':['personal','profile','privacy'],'objects':['personal','contact'],'required_level':'OPTIONAL','scene_id':'user_profile'},{'category':'Demand\x20Submission','keywords_zh':['demand','publish','inquiry'],'keywords_en':['demand','request','inquiry'],'objects':['demand'],'required_level':'OPTIONAL','scene_id':'demand_inquiry'}],INDUSTRY_KEYWORDS=[{'industry':'freelance','words':['freelance','outsourcing','freelance','gig']},{'industry':'rental','words':['rental','lease','rental','rent']},{'industry':'education','words':['education','course','training','education','course']},{'industry':'travel','words':['travel','tour','itinerary','travel','trip']},{'industry':'subscription','words':['subscription','cycle','subscription','recurring']}];function buildPuzzleDispatch(){const a=(c,d)=>{try{return c(d);}catch{return undefined;}},b=(c,d)=>{if(!c)return{'missing':[],'complete':![],'next_step':'init\x20failed'};try{return d(c);}catch{return{'missing':[],'complete':![],'next_step':'check\x20failed'};}};return{'service':{'init':c=>a(initServicePuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkServicePuzzleCompleteness)},'machine':{'init':c=>a(initMachinePuzzleFromIntent,c),'check':c=>b(c,checkMachinePuzzleCompleteness)},'allocation':{'init':c=>a(initAllocationPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkAllocationPuzzleCompleteness)},'treasury':{'init':c=>a(initTreasuryPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkTreasuryPuzzleCompleteness)},'arb':{'init':c=>a(initArbitrationPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkArbitrationPuzzleCompleteness)},'reward':{'init':c=>a(initRewardPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkRewardPuzzleCompleteness)},'progress':{'init':c=>a(initProgressPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkProgressPuzzleCompleteness)},'order':{'init':c=>a(initOrderPuzzleFromIntent,{'primary_goal':c}),'check':c=>b(c,checkOrderPuzzleCompleteness)},'permission':{'init':c=>a(a210c,{'primary_goal':c}),'check':c=>b(c,a210d)},'guard':{'init':c=>a(a210a,{'primary_goal':c}),'check':c=>b(c,a210b)}};}export function extractKeywords(a){if(!a||typeof a!=='string')return[];const b=[];for(const c of KEYWORD_TABLE){const d=[...c['keywords_zh'],...c['keywords_en']];for(const e of d){try{const f=new RegExp(escapeRegex(e),'gi'),g=(a['match'](f)||[])['length'];g>0x0&&b['push']({'keyword':e,'category':c['category'],'matched_objects':[...c['objects']],'required_level':c['required_level'],'match_count':g});}catch{}}}return b['sort']((h,i)=>i['match_count']-h['match_count']),b;}function escapeRegex(a){return a['replace'](/[.*+?^${}()|[\]\\]/g,'\x5c$&');}export function resolveIndustry(a,b){const c=((a??'')+'\x20'+(b??''))['toLowerCase']();for(const d of INDUSTRY_KEYWORDS){for(const e of d['words']){if(c['includes'](e['toLowerCase']()))return d['industry'];}}return'general';}export function identifyObjects(a,b){if(b['length']===0x0)return{'primary':'service','secondary':['permission','machine','progress'],'scenes':[{'object':'service','scene_id':'general'}]};const c=b['find'](i=>i['required_level']==='R'),d=(c??b[0x0])['matched_objects'][0x0],e=new Set([d]),f=[];for(const i of b){for(const j of i['matched_objects']){!e['has'](j)&&(e['add'](j),f['push'](j));}}const g=[],h=new Set();for(const k of KEYWORD_TABLE){const l=b['find'](n=>n['category']===k['category']);if(!l)continue;if(h['has'](k['scene_id']))continue;h['add'](k['scene_id']),g['push']({'object':k['objects'][0x0],'scene_id':k['scene_id']});}return{'primary':d,'secondary':f,'scenes':g};}export function analyzeBusinessIntent(a){const b=[];if(!a||!a['user_intent']||typeof a['user_intent']!=='string')return{'intent_parsed':{'primary_object':'service','secondary_objects':[],'detected_scenes':[],'industry':'general','keyword_matches':[]},'puzzles':{},'overall_completeness':'empty','next_step':'Please\x20provide\x20a\x20non-empty\x20business\x20intent.','recommended_creation_order':[],'warnings':['input.user_intent\x20is\x20empty']};const c=a['user_intent'],e=extractKeywords(c),f=resolveIndustry(c,a['industry']),{primary:g,secondary:h,scenes:i}=identifyObjects(c,e);let j=[g,...h];if(a['target_objects']&&a['target_objects']['length']>0x0){const p=a['target_objects']['filter'](q=>['service','machine','guard','permission','reward','arb','progress','treasury','demand','repository','contact','order','allocation','personal','payment','proof']['includes'](q));if(p['length']>0x0)j=p;}const k=buildPuzzleDispatch(),l={};for(const q of j){const r=k[q];if(!r){b['push']('No\x20puzzle\x20module\x20for\x20\x27'+q+'\x27\x20—\x20skipped\x20(L3\x20object)');continue;}const s=r['init'](c),t=s?r['check'](s):undefined,u=extractMissingDimensions(t);l[q]={'puzzle':s,'completeness':t,'missing_dimensions':u},!s&&b['push']('Puzzle\x20init\x20failed\x20for\x20\x27'+q+'\x27');}const m=aggregatePuzzleCompleteness(l),n=suggestNextPuzzleStep({'intent_parsed':{'primary_object':g,'secondary_objects':h,'detected_scenes':i,'industry':f,'keyword_matches':e},'puzzles':l,'overall_completeness':m,'next_step':'','recommended_creation_order':[],'warnings':b}),o=['permission','progress','guard','allocation','machine','service'];return{'intent_parsed':{'primary_object':g,'secondary_objects':h,'detected_scenes':i,'industry':f,'keyword_matches':e},'puzzles':l,'overall_completeness':m,'next_step':n,'recommended_creation_order':o,'warnings':b};}function extractMissingDimensions(a){if(!a||typeof a!=='object')return[];const b=a,d=b['missing'];if(Array['isArray'](d))return d['map'](f=>String(f));const e=b['missing_details'];if(Array['isArray'](e))return e['map'](f=>String(f?.['dimension']??f));return[];}export function aggregatePuzzleCompleteness(a){const b=Object['values'](a??{});if(b['length']===0x0)return'empty';const c=b['filter'](f=>!f['puzzle'])['length'];if(c===b['length'])return'empty';const d=b['reduce']((f,g)=>f+(g['missing_dimensions']?.['length']??0x0),0x0);if(d===0x0)return'complete';return'partial';}export function suggestNextPuzzleStep(a){if(!a)return'No\x20result\x20to\x20suggest\x20from.';if(a['overall_completeness']==='complete')return'All\x20puzzle\x20dimensions\x20are\x20complete\x20—\x20ready\x20for\x20risk\x20calibration\x20(stage\x203).';if(a['overall_completeness']==='empty')return'No\x20puzzle\x20has\x20been\x20initialized.\x20Provide\x20more\x20concrete\x20business\x20intent\x20so\x20the\x20primary\x20object\x20can\x20be\x20identified.';const b=['permission','treasury','allocation','guard','machine','service','order','progress','arb','reward','proof','repository','demand','contact','personal','payment'],d=a['puzzles']??{},e=b['filter'](f=>d[f]);for(const f of e){const g=d[f];if(!g)continue;const h=g['missing_dimensions']??[];if(h['length']===0x0)continue;const i=g['completeness'],j=i&&typeof i==='object'?i['next_step']:undefined;if(typeof j==='string'&&j['trim']())return'['+f+']\x20'+j;return'['+f+']\x20Complete\x20dimension'+(h['length']>0x1?'s':'')+'\x20'+h['join'](',\x20')+'\x20to\x20advance\x20the\x20puzzle.';}return'Continue\x20dialog\x20to\x20fill\x20remaining\x20pending\x20fields.';}
@@ -1,6 +1,5 @@
1
1
  import type { ObjectBase } from "@wowok/wowok";
2
2
  import type { AssembleContextInput } from "../../schema/query/bi.js";
3
- import { type ContextCollectionResult } from "../../loop-engineering/context-collect.js";
4
3
  type ValidatedInput = AssembleContextInput;
5
4
  export interface DependencyEdge {
6
5
  object: string;
@@ -21,6 +20,9 @@ export interface AssembleContextResult {
21
20
  next_action: string;
22
21
  flywheel_collected?: ContextCollectionResult;
23
22
  }
23
+ export interface ContextCollectionResult {
24
+ signature_recorded: boolean;
25
+ }
24
26
  export declare function assembleContext(validated: ValidatedInput): Promise<AssembleContextResult>;
25
27
  export declare function extractAddressFields(obj: ObjectBase): Array<{
26
28
  address: string;
@@ -1 +1 @@
1
- import{createHash}from'crypto';import{query_objects,query_events}from'@wowok/wowok';import{annotateEventsMonetaryFields}from'../../knowledge/fund-layer.js';import{batchQueryObjectsByIds}from'../../knowledge/workflow-guidance.js';import{buildDataSemantic}from'../../schema/call/semantic.js';import{collectContextExperience}from'../../loop-engineering/context-collect.js';const STATE_TRANSITION_EVENTS=['NewOrderEvent','ProgressEvent','ArbEvent','DemandPresentEvent','DemandFeedbackEvent','NewEntityEvent'],MAX_OBJECTS_PER_QUERY=0x32;export async function assembleContext(a){const b=a['context_objects'];if(!b||b['length']===0x0)throw new Error('assemble_context\x20requires\x20\x27context_objects\x27\x20—\x20an\x20array\x20of\x20object\x20IDs\x20or\x20LocalMark\x20names.');const c=a['context_network']??'testnet',d=a['include_events']??![],e=Math['max'](0x0,Math['min'](0x5,a['context_depth']??0x0)),g=a['context_include']?.['length']?new Set(a['context_include']):null,h=await batchQueryObjectsByIds(b,c,![]),k=[],l=[];if(e>0x0){const z=new Set();for(const B of h){const C=B?.['object'];if(typeof C==='string')z['add'](C);}let A=[];for(const D of h){const E=safeExtractAddressFields(D);for(const F of E){if(g&&!g['has'](F['field']))continue;if(z['has'](F['address']))continue;A['push']({'id':F['address'],'parent':D?.['object']??'','viaField':F['field'],'viaType':F['type'],'depth':0x1});}}for(let G=0x1;G<=e&&A['length']>0x0;G++){const H=new Set(),I=[];for(const K of A){if(z['has'](K['id'])||H['has'](K['id']))continue;H['add'](K['id']),z['add'](K['id']),I['push'](K);}if(I['length']===0x0)break;const J=[];for(let L=0x0;L<I['length'];L+=MAX_OBJECTS_PER_QUERY){const M=I['slice'](L,L+MAX_OBJECTS_PER_QUERY);let N;try{N=await query_objects({'objects':M['map'](P=>P['id']),'no_cache':![],'network':c});}catch{continue;}const O=N?.['objects']??[];for(let P=0x0;P<M['length'];P++){const Q=M[P],R=O[P];if(!R)continue;k['push']({'object':Q['id'],'depth':Q['depth'],'via_field':Q['viaField'],'via_type':Q['viaType'],'parent':Q['parent']}),l['push'](R);if(G<e){const S=safeExtractAddressFields(R);for(const T of S){if(g&&!g['has'](T['field']))continue;if(z['has'](T['address']))continue;J['push']({'id':T['address'],'parent':Q['id'],'viaField':T['field'],'viaType':T['type'],'depth':G+0x1});}}}}A=J;}}const m=[...h,...l],n=extractEmbeddedHistory(m),p=Object['keys'](n)['length']>0x0;let q;if(d){q=[];for(const U of STATE_TRANSITION_EVENTS){try{const V=await query_events({'type':U,'limit':0x5,'order':'descending','network':c});V?.['data']&&V['data']['length']>0x0&&q['push'](...V['data']);}catch{}}if(q['length']===0x0)q=undefined;else try{await annotateEventsMonetaryFields(q,c);}catch{}}const s={'operation_type':'assemble_context','data':{'context_objects':h,'embedded_history':n,'events':q}},t=buildDataSemantic({'objects':h,'embedded_history':n,'events':q},s),u=h['map'](W=>(W?.['object']??W?.['data']?.['object']??'?')+':'+(W?.['version']??W?.['data']?.['version']??'?'));l['length']>0x0&&u['push']('deps:'+l['map'](W=>(W?.['object']??'?')+':'+(W?.['version']??'?'))['join'](','));u['push']('ts:'+Date['now']());const v=createHash('sha256')['update'](u['join']('|'))['digest']('hex')['substring'](0x0,0x10),w=k['length']>0x0,x=w?'Context\x20assembled\x20with\x20'+k['length']+'\x20dependency\x20object(s)\x20across\x20'+e+'\x20level(s).\x20'+'Use\x20onchain_transaction\x20with\x20a\x20specific\x20digest\x20to\x20verify\x20a\x20past\x20operation,\x20'+'or\x20proceed\x20with\x20onchain_operations\x20(consider\x20dry_run=true\x20first\x20to\x20validate).':p?'Context\x20assembled\x20with\x20embedded\x20operation\x20history.\x20Use\x20onchain_transaction\x20with\x20a\x20specific\x20digest\x20to\x20verify\x20a\x20past\x20operation,\x20or\x20proceed\x20with\x20onchain_operations\x20(consider\x20dry_run=true\x20first\x20to\x20validate).':q&&q['length']>0x0?'Context\x20assembled\x20with\x20recent\x20events.\x20Use\x20onchain_transaction\x20with\x20a\x20specific\x20digest\x20to\x20verify\x20any\x20event\x27s\x20tx,\x20or\x20proceed\x20with\x20onchain_operations.':'Context\x20assembled\x20(current\x20state\x20only).\x20Proceed\x20with\x20onchain_operations\x20(consider\x20dry_run=true\x20first\x20to\x20validate).';let y;try{y=collectContextExperience({'action':'assemble_context','objects':h,'events':q,'embedded_history':p?n:undefined,'semantic_summary':t,'context_digest':v,'next_action':x},c);}catch{}return{'action':'assemble_context','objects':h,'events':q,'embedded_history':p?n:undefined,'dependencies':w?k:undefined,'dependency_objects':w?l:undefined,'semantic_summary':t,'context_digest':v,'next_action':x,'flywheel_collected':y};}export function extractAddressFields(a){const b=[],c=a['type'];let d=c;if(c&&c['includes']('::')){const k=c['split']('::');d=k[k['length']-0x1];}const e=l=>typeof l==='string'&&l['startsWith']('0x')&&l['length']>=0xa,f=(l,m,n)=>{e(l)&&l!=='0x0'&&l!==a['object']&&b['push']({'address':l,'field':m,'type':n});},h=(l,m,n)=>{if(Array['isArray'](l))for(const o of l){f(o,m,n);}},i=(l,m,n)=>{l!==null&&l!==undefined&&f(l,m,n);},j=a;switch(d){case'Service':{i(j['machine'],'machine','bind'),i(j['buy_guard'],'buy_guard','validate'),i(j['um'],'um','bind'),f(j['permission'],'permission','validate'),h(j['repositories'],'repositories','consume'),h(j['arbitrations'],'arbitrations','trigger'),h(j['rewards'],'rewards','trigger');if(j['order_allocators']?.['allocators']){for(const m of j['order_allocators']['allocators']){f(m['guard'],'allocator_guard','validate');}const l=j['order_allocators']['allocators'][0x0]?.['guard'];f(l,'order_allocators','create');}break;}case'Machine':{f(j['permission'],'permission','validate'),h(j['consensus_repositories'],'consensus_repositories','consume');break;}case'Order':{f(j['service'],'service','consume'),i(j['machine'],'machine','consume'),i(j['progress'],'progress','trigger'),h(j['dispute'],'dispute','trigger'),i(j['allocation'],'allocation','bind');break;}case'Progress':{f(j['machine'],'machine','bind'),h(j['context_repositories'],'context_repositories','consume');break;}case'Treasury':{f(j['permission'],'permission','validate');if(Array['isArray'](j['external_deposit_guard'])){for(const n of j['external_deposit_guard'])f(n?.['guard'],'external_deposit_guard','validate');}if(Array['isArray'](j['external_withdraw_guard'])){for(const o of j['external_withdraw_guard'])f(o?.['guard'],'external_withdraw_guard','validate');}break;}case'Allocation':{if(Array['isArray'](j['allocators'])){for(const p of j['allocators'])f(p?.['guard'],'allocator_guard','validate');}i(j['payment_info']?.['for_object'],'for_object','bind'),i(j['payment_info']?.['for_guard'],'for_guard','validate'),h(j['payment'],'payment','trigger');break;}case'Arbitration':{f(j['permission'],'permission','validate');if(Array['isArray'](j['voting_guard'])){for(const q of j['voting_guard'])f(q?.['guard'],'voting_guard','validate');}i(j['usage_guard'],'usage_guard','validate');break;}case'Reward':{f(j['permission'],'permission','validate');if(Array['isArray'](j['guards'])){for(const s of j['guards'])f(s?.['guard'],'guard','validate');}break;}case'Repository':{f(j['permission'],'permission','validate'),h(j['rewards'],'rewards','trigger');if(Array['isArray'](j['policies']))for(const t of j['policies']){if(Array['isArray'](t?.['write_guard'])){for(const u of t['write_guard'])f(u?.['guard'],'write_guard','validate');}i(t?.['quote_guard'],'quote_guard','validate');}break;}case'Demand':{f(j['permission'],'permission','validate');if(Array['isArray'](j['guards'])){for(const v of j['guards'])f(v?.['guard'],'guard','validate');}h(j['rewards'],'rewards','trigger');break;}case'Contact':{f(j['permission'],'permission','validate');break;}case'Permission':{break;}case'Payment':{i(j['info']?.['for_object'],'for_object','bind'),i(j['info']?.['for_guard'],'for_guard','validate');if(Array['isArray'](j['record']))for(const w of j['record']){const x=w?.['recipient'];x&&typeof x==='object'&&typeof x['Entity']==='string'&&f(x['Entity'],'recipient_entity','consume');}break;}case'Guard':{break;}default:break;}return b;}function safeExtractAddressFields(a){if(!a||typeof a!=='object')return[];try{return extractAddressFields(a);}catch{return[];}}function extractEmbeddedHistory(a){const b={};for(const c of a){const d=c?.['data']??c,e=c?.['object']??d?.['object'];if(!e)continue;const f=d?.['type']??'',g={};f['includes']('Progress')&&d?.['session']?.['forwards']&&(g['operation_history']=d['session']['forwards']['map'](h=>({'operation':h['forward'],'operator':h['who'],'accomplished':h['accomplished'],'time':h['time'],'message':h['msg']})),g['next_node']=d['session']?.['next_node'],g['threshold']=d['session']?.['threshold']),f['includes']('Order')&&(d?.['dispute']&&Array['isArray'](d['dispute'])&&d['dispute']['length']>0x0&&(g['disputes']=d['dispute']),d?.['claimed_by']&&(g['claimed_by']=d['claimed_by']),d?.['progress']&&(g['progress_object']=d['progress'])),f['includes']('Service')&&d?.['sales']&&(g['sale_count']=Array['isArray'](d['sales'])?d['sales']['length']:0x0),Object['keys'](g)['length']>0x0&&(b[e]=g);}return b;}
1
+ import{createHash}from'crypto';import{query_objects,query_events}from'@wowok/wowok';import{annotateEventsMonetaryFields}from'../../knowledge/fund-layer.js';import{batchQueryObjectsByIds}from'../../knowledge/workflow-guidance.js';import{buildDataSemantic}from'../../schema/call/semantic.js';import{recordSignature}from'../../experience/index.js';const STATE_TRANSITION_EVENTS=['NewOrderEvent','ProgressEvent','ArbEvent','DemandPresentEvent','DemandFeedbackEvent','NewEntityEvent'],MAX_OBJECTS_PER_QUERY=0x32;export async function assembleContext(a){const b=a['context_objects'];if(!b||b['length']===0x0)throw new Error('assemble_context\x20requires\x20\x27context_objects\x27\x20—\x20an\x20array\x20of\x20object\x20IDs\x20or\x20LocalMark\x20names.');const c=a['context_network']??'testnet',d=a['include_events']??![],e=Math['max'](0x0,Math['min'](0x5,a['context_depth']??0x0)),g=a['context_include']?.['length']?new Set(a['context_include']):null,h=await batchQueryObjectsByIds(b,c,![]),k=[],l=[];if(e>0x0){const z=new Set();for(const B of h){const C=B?.['object'];if(typeof C==='string')z['add'](C);}let A=[];for(const D of h){const E=safeExtractAddressFields(D);for(const F of E){if(g&&!g['has'](F['field']))continue;if(z['has'](F['address']))continue;A['push']({'id':F['address'],'parent':D?.['object']??'','viaField':F['field'],'viaType':F['type'],'depth':0x1});}}for(let G=0x1;G<=e&&A['length']>0x0;G++){const H=new Set(),I=[];for(const K of A){if(z['has'](K['id'])||H['has'](K['id']))continue;H['add'](K['id']),z['add'](K['id']),I['push'](K);}if(I['length']===0x0)break;const J=[];for(let L=0x0;L<I['length'];L+=MAX_OBJECTS_PER_QUERY){const M=I['slice'](L,L+MAX_OBJECTS_PER_QUERY);let N;try{N=await query_objects({'objects':M['map'](P=>P['id']),'no_cache':![],'network':c});}catch{continue;}const O=N?.['objects']??[];for(let P=0x0;P<M['length'];P++){const Q=M[P],R=O[P];if(!R)continue;k['push']({'object':Q['id'],'depth':Q['depth'],'via_field':Q['viaField'],'via_type':Q['viaType'],'parent':Q['parent']}),l['push'](R);if(G<e){const S=safeExtractAddressFields(R);for(const T of S){if(g&&!g['has'](T['field']))continue;if(z['has'](T['address']))continue;J['push']({'id':T['address'],'parent':Q['id'],'viaField':T['field'],'viaType':T['type'],'depth':G+0x1});}}}}A=J;}}const m=[...h,...l],n=extractEmbeddedHistory(m),p=Object['keys'](n)['length']>0x0;let q;if(d){q=[];for(const U of STATE_TRANSITION_EVENTS){try{const V=await query_events({'type':U,'limit':0x5,'order':'descending','network':c});V?.['data']&&V['data']['length']>0x0&&q['push'](...V['data']);}catch{}}if(q['length']===0x0)q=undefined;else try{await annotateEventsMonetaryFields(q,c);}catch{}}const s={'operation_type':'assemble_context','data':{'context_objects':h,'embedded_history':n,'events':q}},t=buildDataSemantic({'objects':h,'embedded_history':n,'events':q},s),u=h['map'](W=>(W?.['object']??W?.['data']?.['object']??'?')+':'+(W?.['version']??W?.['data']?.['version']??'?'));l['length']>0x0&&u['push']('deps:'+l['map'](W=>(W?.['object']??'?')+':'+(W?.['version']??'?'))['join'](','));u['push']('ts:'+Date['now']());const v=createHash('sha256')['update'](u['join']('|'))['digest']('hex')['substring'](0x0,0x10),w=k['length']>0x0,x=w?'Context\x20assembled\x20with\x20'+k['length']+'\x20dependency\x20object(s)\x20across\x20'+e+'\x20level(s).\x20'+'Use\x20onchain_transaction\x20with\x20a\x20specific\x20digest\x20to\x20verify\x20a\x20past\x20operation,\x20'+'or\x20proceed\x20with\x20onchain_operations\x20(consider\x20dry_run=true\x20first\x20to\x20validate).':p?'Context\x20assembled\x20with\x20embedded\x20operation\x20history.\x20Use\x20onchain_transaction\x20with\x20a\x20specific\x20digest\x20to\x20verify\x20a\x20past\x20operation,\x20or\x20proceed\x20with\x20onchain_operations\x20(consider\x20dry_run=true\x20first\x20to\x20validate).':q&&q['length']>0x0?'Context\x20assembled\x20with\x20recent\x20events.\x20Use\x20onchain_transaction\x20with\x20a\x20specific\x20digest\x20to\x20verify\x20any\x20event\x27s\x20tx,\x20or\x20proceed\x20with\x20onchain_operations.':'Context\x20assembled\x20(current\x20state\x20only).\x20Proceed\x20with\x20onchain_operations\x20(consider\x20dry_run=true\x20first\x20to\x20validate).';let y;try{y=collectContextExperience({'action':'assemble_context','objects':h,'events':q,'embedded_history':p?n:undefined,'semantic_summary':t,'context_digest':v,'next_action':x},c);}catch{}return{'action':'assemble_context','objects':h,'events':q,'embedded_history':p?n:undefined,'dependencies':w?k:undefined,'dependency_objects':w?l:undefined,'semantic_summary':t,'context_digest':v,'next_action':x,'flywheel_collected':y};}function collectContextExperience(a,b){const c=extractObjectTypes(a['objects']),d={'intent':'assemble_context','signals':{'object_types':c,'object_count':a['objects']['length'],'has_embedded_history':!!a['embedded_history'],'has_events':!!a['events']&&a['events']['length']>0x0,'context_digest':a['context_digest'],'network':b},'timestamp':Date['now'](),'outcome':'success'};let e=![];try{recordSignature(d),e=!![];}catch{}return{'signature_recorded':e};}function extractObjectTypes(a){const b=new Set();for(const c of a){const d=c?.['data']??c,e=d?.['type'];if(typeof e==='string'){const f=e['match'](/::(\w+)$/);f&&b['add'](f[0x1]);}}return Array['from'](b);}export function extractAddressFields(a){const b=[],c=a['type'];let d=c;if(c&&c['includes']('::')){const k=c['split']('::');d=k[k['length']-0x1];}const e=l=>typeof l==='string'&&l['startsWith']('0x')&&l['length']>=0xa,f=(l,m,n)=>{e(l)&&l!=='0x0'&&l!==a['object']&&b['push']({'address':l,'field':m,'type':n});},h=(l,m,n)=>{if(Array['isArray'](l))for(const o of l){f(o,m,n);}},i=(l,m,n)=>{l!==null&&l!==undefined&&f(l,m,n);},j=a;switch(d){case'Service':{i(j['machine'],'machine','bind'),i(j['buy_guard'],'buy_guard','validate'),i(j['um'],'um','bind'),f(j['permission'],'permission','validate'),h(j['repositories'],'repositories','consume'),h(j['arbitrations'],'arbitrations','trigger'),h(j['rewards'],'rewards','trigger');if(j['order_allocators']?.['allocators']){for(const m of j['order_allocators']['allocators']){f(m['guard'],'allocator_guard','validate');}const l=j['order_allocators']['allocators'][0x0]?.['guard'];f(l,'order_allocators','create');}break;}case'Machine':{f(j['permission'],'permission','validate'),h(j['consensus_repositories'],'consensus_repositories','consume');break;}case'Order':{f(j['service'],'service','consume'),i(j['machine'],'machine','consume'),i(j['progress'],'progress','trigger'),h(j['dispute'],'dispute','trigger'),i(j['allocation'],'allocation','bind');break;}case'Progress':{f(j['machine'],'machine','bind'),h(j['context_repositories'],'context_repositories','consume');break;}case'Treasury':{f(j['permission'],'permission','validate');if(Array['isArray'](j['external_deposit_guard'])){for(const n of j['external_deposit_guard'])f(n?.['guard'],'external_deposit_guard','validate');}if(Array['isArray'](j['external_withdraw_guard'])){for(const o of j['external_withdraw_guard'])f(o?.['guard'],'external_withdraw_guard','validate');}break;}case'Allocation':{if(Array['isArray'](j['allocators'])){for(const p of j['allocators'])f(p?.['guard'],'allocator_guard','validate');}i(j['payment_info']?.['for_object'],'for_object','bind'),i(j['payment_info']?.['for_guard'],'for_guard','validate'),h(j['payment'],'payment','trigger');break;}case'Arbitration':{f(j['permission'],'permission','validate');if(Array['isArray'](j['voting_guard'])){for(const q of j['voting_guard'])f(q?.['guard'],'voting_guard','validate');}i(j['usage_guard'],'usage_guard','validate');break;}case'Reward':{f(j['permission'],'permission','validate');if(Array['isArray'](j['guards'])){for(const s of j['guards'])f(s?.['guard'],'guard','validate');}break;}case'Repository':{f(j['permission'],'permission','validate'),h(j['rewards'],'rewards','trigger');if(Array['isArray'](j['policies']))for(const t of j['policies']){if(Array['isArray'](t?.['write_guard'])){for(const u of t['write_guard'])f(u?.['guard'],'write_guard','validate');}i(t?.['quote_guard'],'quote_guard','validate');}break;}case'Demand':{f(j['permission'],'permission','validate');if(Array['isArray'](j['guards'])){for(const v of j['guards'])f(v?.['guard'],'guard','validate');}h(j['rewards'],'rewards','trigger');break;}case'Contact':{f(j['permission'],'permission','validate');break;}case'Permission':{break;}case'Payment':{i(j['info']?.['for_object'],'for_object','bind'),i(j['info']?.['for_guard'],'for_guard','validate');if(Array['isArray'](j['record']))for(const w of j['record']){const x=w?.['recipient'];x&&typeof x==='object'&&typeof x['Entity']==='string'&&f(x['Entity'],'recipient_entity','consume');}break;}case'Guard':{break;}default:break;}return b;}function safeExtractAddressFields(a){if(!a||typeof a!=='object')return[];try{return extractAddressFields(a);}catch{return[];}}function extractEmbeddedHistory(a){const b={};for(const c of a){const d=c?.['data']??c,e=c?.['object']??d?.['object'];if(!e)continue;const f=d?.['type']??'',g={};f['includes']('Progress')&&d?.['session']?.['forwards']&&(g['operation_history']=d['session']['forwards']['map'](h=>({'operation':h['forward'],'operator':h['who'],'accomplished':h['accomplished'],'time':h['time'],'message':h['msg']})),g['next_node']=d['session']?.['next_node'],g['threshold']=d['session']?.['threshold']),f['includes']('Order')&&(d?.['dispute']&&Array['isArray'](d['dispute'])&&d['dispute']['length']>0x0&&(g['disputes']=d['dispute']),d?.['claimed_by']&&(g['claimed_by']=d['claimed_by']),d?.['progress']&&(g['progress_object']=d['progress'])),f['includes']('Service')&&d?.['sales']&&(g['sale_count']=Array['isArray'](d['sales'])?d['sales']['length']:0x0),Object['keys'](g)['length']>0x0&&(b[e]=g);}return b;}
@@ -17,7 +17,9 @@ export interface MachineGraphEdge {
17
17
  export interface MachineGraphNode {
18
18
  name: string;
19
19
  description: string | null;
20
+ is_start?: boolean;
20
21
  }
22
+ export declare const MACHINE_START_NODE = "";
21
23
  export declare function normalizeForwards(raw: unknown): MachineGraphForward[];
22
24
  export declare function buildMachineGraph(rawNodes: TableItem_MachineNode[]): {
23
25
  nodes: MachineGraphNode[];
@@ -1 +1 @@
1
- import{batchQueryTableItems}from'../../knowledge/workflow-guidance.js';export async function fetchMachineNodes(a,b){const {items:c}=await batchQueryTableItems(a,{'network':b}),d=[];for(const e of c){e['object']?.['type']==='TableItem_MachineNode'&&d['push'](e['object']);}return d;}export function normalizeForwards(a){if(!Array['isArray'](a))return[];return a['map'](b=>{const c=b?.['guard'],d=c&&typeof c==='object'&&typeof c['guard']==='string';return{'name':typeof b?.['name']==='string'?b['name']:'','weight':typeof b?.['weight']==='number'?b['weight']:0x0,'guard':d?c['guard']:typeof c==='string'?c:null,'retained_submission':d&&Array['isArray'](c['retained_submission'])?c['retained_submission']:null,'named_operator':typeof b?.['namedOperator']==='string'?b['namedOperator']:null,'permission_index':typeof b?.['permissionIndex']==='number'?b['permissionIndex']:null};});}export function buildMachineGraph(a){const b=new Map(),c=[];for(const d of a){const e=d['name'];if(!e)continue;!b['has'](e)&&b['set'](e,{'name':e,'description':null});const f=Array['isArray'](d['value'])?d['value']:[];for(const g of f){if(!g||typeof g!=='object')continue;const h=typeof g['prev_node']==='string'?g['prev_node']:'';if(!h)continue;c['push']({'from':h,'to':e,'threshold':typeof g['threshold']==='number'?g['threshold']:0x1,'forwards':normalizeForwards(g['forwards'])});}}for(const i of c){!b['has'](i['from'])&&b['set'](i['from'],{'name':i['from'],'description':null}),!b['has'](i['to'])&&b['set'](i['to'],{'name':i['to'],'description':null});}return{'nodes':Array['from'](b['values']()),'edges':c};}
1
+ import{batchQueryTableItems}from'../../knowledge/workflow-guidance.js';export async function fetchMachineNodes(a,b){const {items:c}=await batchQueryTableItems(a,{'network':b}),d=[];for(const e of c){e['object']?.['type']==='TableItem_MachineNode'&&d['push'](e['object']);}return d;}export const MACHINE_START_NODE='';export function normalizeForwards(a){if(!Array['isArray'](a))return[];return a['map'](b=>{const c=b?.['guard'],d=c&&typeof c==='object'&&typeof c['guard']==='string';return{'name':typeof b?.['name']==='string'?b['name']:'','weight':typeof b?.['weight']==='number'?b['weight']:0x0,'guard':d?c['guard']:typeof c==='string'?c:null,'retained_submission':d&&Array['isArray'](c['retained_submission'])?c['retained_submission']:null,'named_operator':typeof b?.['namedOperator']==='string'?b['namedOperator']:null,'permission_index':typeof b?.['permissionIndex']==='number'?b['permissionIndex']:null};});}export function buildMachineGraph(a){const b=new Map(),c=[];let d=![];for(const f of a){const g=f['name'];if(!g)continue;!b['has'](g)&&b['set'](g,{'name':g,'description':null});const h=Array['isArray'](f['value'])?f['value']:[];for(const i of h){if(!i||typeof i!=='object')continue;const j=typeof i['prev_node']==='string'?i['prev_node']:MACHINE_START_NODE;if(j===MACHINE_START_NODE)d=!![];c['push']({'from':j,'to':g,'threshold':typeof i['threshold']==='number'?i['threshold']:0x1,'forwards':normalizeForwards(i['forwards'])});}}const e=[];d&&e['push']({'name':MACHINE_START_NODE,'description':'Initial\x20node\x20—\x20the\x20workflow\x20entry\x20point.\x20Orders\x20start\x20here.','is_start':!![]});for(const k of c){k['from']!==MACHINE_START_NODE&&!b['has'](k['from'])&&b['set'](k['from'],{'name':k['from'],'description':null}),!b['has'](k['to'])&&b['set'](k['to'],{'name':k['to'],'description':null});}return e['push'](...b['values']()),{'nodes':e,'edges':c};}
@@ -36,6 +36,13 @@ export interface MachinePanoramaResult {
36
36
  };
37
37
  related: {
38
38
  count: number;
39
+ groups: {
40
+ label: string;
41
+ items: {
42
+ address: string;
43
+ time: number | null;
44
+ }[];
45
+ }[];
39
46
  };
40
47
  data_gaps: string[];
41
48
  }
@@ -1 +1 @@
1
- import{Config,LocalMark,query_objects,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{fetchMachineNodes,buildMachineGraph}from'./machine-nodes.js';import{batchQueryObjectsByIds,fetchObjectLinkerTx}from'../../knowledge/workflow-guidance.js';export async function handleMachinePanorama(a){const b=a['object_address'];if(!b)throw new Error('\x27object_address\x27\x20is\x20required\x20for\x20machine_panorama');let c=a['context_network']??undefined;const d=[];let f=b;if(!/^0x[0-9a-fA-F]{32,64}$/['test'](b)){const p=await LocalMark['Instance']()['get_address'](b);if(!p)throw new Error('Cannot\x20resolve\x20machine\x20\x27'+b+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.\x20'+'Pass\x20the\x200x\x20Machine\x20object\x20address\x20directly\x20or\x20register\x20the\x20name\x20via\x20local_mark_operation.');f=p;}let g=null;try{if(!c)c=await Config['Instance']()['network_get']();const q=await query_objects({'objects':[f],'network':c});g=q?.['objects']?.[0x0]??null;if(!g&&a['context_network']){const s=await Config['Instance']()['network_get']();if(s&&s!==c){const t=await query_objects({'objects':[f],'network':s,'no_cache':!![]}),u=t?.['objects']?.[0x0]??null;u&&(g=u,c=s);}}}catch(w){throw new Error('Failed\x20to\x20query\x20Machine\x20'+f+'\x20on\x20'+c+':\x20'+(''+(w instanceof Error?w['message']:String(w))));}if(!g)throw new Error('Machine\x20'+f+'\x20not\x20found\x20on\x20'+c+'.\x20It\x20may\x20not\x20exist\x20on\x20this\x20network.');f=g['object']??f;let h=null,j=[];try{const x=await LocalMark['Instance']()['list']({'address':f});x['length']>0x0&&(h=x[0x0]['name']??null,j=(x[0x0]['tags']??[])['map'](y=>String(y)));}catch{d['push']('head:\x20LocalMark\x20lookup\x20failed');}let k={'nodes':[],'edges':[]};try{const y=await fetchMachineNodes(f,c);k=buildMachineGraph(y);}catch{d['push']('graph:\x20node\x20fetch\x20failed\x20(non-blocking)');}const l=[];let m=0x0,n=0x0;try{const z=await fetchObjectLinkerTx(f,c,!![]),A=z?.['items']??[],B=new Set();for(const G of A){const H=typeof G?.['who']==='string'?G['who']['toLowerCase']():'';if(!H||H==='0x0')continue;if(!objectTypeFromAddress(H))continue;B['add'](H);}n=B['size'];const C=A['filter'](I=>objectTypeFromAddress(I['who'])===ObjectType['Progress']);m=C['length'];const D=C['slice'](-0x32)['reverse'](),E=D['map'](I=>I['who']),F=new Map();if(E['length']>0x0)try{const I=await batchQueryObjectsByIds(E,c,!![]);for(const J of I){if(J?.['object'])F['set'](J['object'],J);}}catch{d['push']('progresses:\x20detail\x20fetch\x20failed');}for(const K of D){const L=typeof K?.['who']==='string'?K['who']:'';if(!L)continue;const M=F['get'](L);l['push']({'progress':L,'name':null,'current':M?.['current']??null,'task':M?.['task']??null,'history_count':typeof M?.['history_count']==='number'?M['history_count']:null,'current_time':typeof M?.['current_time']==='number'?M['current_time']:null,'created_at':typeof K?.['time']==='number'?K['time']:null});}}catch{d['push']('progresses:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}return{'action':'machine_panorama','machineAddress':f,'network':String(c),'head':{'name':h,'tags':j,'description':typeof g['description']==='string'?g['description']:null,'published':typeof g['bPublished']==='boolean'?g['bPublished']:null,'paused':typeof g['bPaused']==='boolean'?g['bPaused']:null},'fields':{'permission':g['permission']??null,'um':g['um']??null,'node_count':typeof g['node_count']==='number'?g['node_count']:null,'consensus_repositories':Array['isArray'](g['consensus_repositories'])?g['consensus_repositories']:[]},'graph':k,'progresses':{'count':m,'items':l},'related':{'count':n},'data_gaps':d};}
1
+ import{Config,LocalMark,query_objects,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{fetchMachineNodes,buildMachineGraph}from'./machine-nodes.js';import{batchQueryObjectsByIds,fetchObjectLinkerTx}from'../../knowledge/workflow-guidance.js';export async function handleMachinePanorama(a){const b=a['object_address'];if(!b)throw new Error('\x27object_address\x27\x20is\x20required\x20for\x20machine_panorama');let c=a['context_network']??undefined;const d=[];let f=b;if(!/^0x[0-9a-fA-F]{32,64}$/['test'](b)){const q=await LocalMark['Instance']()['get_address'](b);if(!q)throw new Error('Cannot\x20resolve\x20machine\x20\x27'+b+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.\x20'+'Pass\x20the\x200x\x20Machine\x20object\x20address\x20directly\x20or\x20register\x20the\x20name\x20via\x20local_mark_operation.');f=q;}let g=null;try{if(!c)c=await Config['Instance']()['network_get']();const s=await query_objects({'objects':[f],'network':c});g=s?.['objects']?.[0x0]??null;if(!g&&a['context_network']){const u=await Config['Instance']()['network_get']();if(u&&u!==c){const w=await query_objects({'objects':[f],'network':u,'no_cache':!![]}),x=w?.['objects']?.[0x0]??null;x&&(g=x,c=u);}}}catch(y){throw new Error('Failed\x20to\x20query\x20Machine\x20'+f+'\x20on\x20'+c+':\x20'+(''+(y instanceof Error?y['message']:String(y))));}if(!g)throw new Error('Machine\x20'+f+'\x20not\x20found\x20on\x20'+c+'.\x20It\x20may\x20not\x20exist\x20on\x20this\x20network.');f=g['object']??f;let h=null,j=[];try{const z=await LocalMark['Instance']()['list']({'address':f});z['length']>0x0&&(h=z[0x0]['name']??null,j=(z[0x0]['tags']??[])['map'](A=>String(A)));}catch{d['push']('head:\x20LocalMark\x20lookup\x20failed');}let k={'nodes':[],'edges':[]};try{const A=await fetchMachineNodes(f,c);k=buildMachineGraph(A);}catch{d['push']('graph:\x20node\x20fetch\x20failed\x20(non-blocking)');}const l=[];let m=0x0,n=0x0,p=[];try{const B=await fetchObjectLinkerTx(f,c,!![]),C=B?.['items']??[],D=new Map();for(const K of C){const L=typeof K?.['who']==='string'?K['who']['toLowerCase']():'';if(!L||L==='0x0')continue;if(!objectTypeFromAddress(L))continue;const M=typeof K?.['time']==='number'?K['time']:null,N=D['get'](L);D['set'](L,N==null?M:M==null?N:Math['max'](N,M));}n=D['size'];const E=new Map();for(const [O,P]of D){const Q=String(objectTypeFromAddress(O)),R=E['get'](Q)??[];R['push']({'address':O,'time':P}),E['set'](Q,R);}for(const S of E['values']()){S['sort']((T,U)=>(U['time']??0x0)-(T['time']??0x0));}const F=['Progress','Allocation','Payment','Guard'];p=[];for(const T of F){const U=E['get'](T);U&&U['length']>0x0&&(p['push']({'label':T,'items':U}),E['delete'](T));}for(const [V,W]of E){if(W['length']>0x0)p['push']({'label':V,'items':W});}const G=C['filter'](X=>objectTypeFromAddress(X['who'])===ObjectType['Progress']);m=G['length'];const H=G['slice'](-0x32)['reverse'](),I=H['map'](X=>X['who']),J=new Map();if(I['length']>0x0)try{const X=await batchQueryObjectsByIds(I,c,!![]);for(const Y of X){if(Y?.['object'])J['set'](Y['object'],Y);}}catch{d['push']('progresses:\x20detail\x20fetch\x20failed');}for(const Z of H){const a0=typeof Z?.['who']==='string'?Z['who']:'';if(!a0)continue;const a1=J['get'](a0);l['push']({'progress':a0,'name':null,'current':a1?.['current']??null,'task':a1?.['task']??null,'history_count':typeof a1?.['history_count']==='number'?a1['history_count']:null,'current_time':typeof a1?.['current_time']==='number'?a1['current_time']:null,'created_at':typeof Z?.['time']==='number'?Z['time']:null});}}catch{d['push']('progresses:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}return{'action':'machine_panorama','machineAddress':f,'network':String(c),'head':{'name':h,'tags':j,'description':typeof g['description']==='string'?g['description']:null,'published':typeof g['bPublished']==='boolean'?g['bPublished']:null,'paused':typeof g['bPaused']==='boolean'?g['bPaused']:null},'fields':{'permission':g['permission']??null,'um':g['um']??null,'node_count':typeof g['node_count']==='number'?g['node_count']:null,'consensus_repositories':Array['isArray'](g['consensus_repositories'])?g['consensus_repositories']:[]},'graph':k,'progresses':{'count':m,'items':l},'related':{'count':n,'groups':p},'data_gaps':d};}
@@ -1,5 +1,6 @@
1
1
  import { type MetricType, type MetricScale, type ConstraintRule, type ConstraintSeverity, type ConstraintViolationAction } from "../../extensions/index.js";
2
2
  import { type InfrastructureLever } from "../../persona/strategy-intent.js";
3
+ import type { LocationSensitivity } from "../../evaluation/location-match.js";
3
4
  export declare const LOCAL_MODE_OWNER = "local";
4
5
  export interface RecommendIndustryInput {
5
6
  intent?: string;
@@ -19,6 +20,9 @@ export declare function handleRecommendIndustry(v: RecommendIndustryInput): {
19
20
  industry: string;
20
21
  similarity: number;
21
22
  matched_traits: string[];
23
+ location_sensitivity: LocationSensitivity;
24
+ trust_selling_points: string[];
25
+ build_notes: string[];
22
26
  strategy_alignment: {
23
27
  score: number;
24
28
  matched_levers: InfrastructureLever[];
@@ -36,6 +40,9 @@ export declare function handleListModes(): Promise<{
36
40
  key_risk: string;
37
41
  machine_nodes: string[];
38
42
  similar_industries: string[];
43
+ location_sensitivity: LocationSensitivity;
44
+ trust_selling_points: string[];
45
+ build_notes: string[];
39
46
  }[];
40
47
  user_modes: {
41
48
  name: string;
@@ -44,6 +51,9 @@ export declare function handleListModes(): Promise<{
44
51
  derived_from: string | null;
45
52
  key_risk: string;
46
53
  machine_nodes: string[];
54
+ location_sensitivity: LocationSensitivity;
55
+ trust_selling_points: string[];
56
+ build_notes: string[];
47
57
  evolution_history: {
48
58
  version: string;
49
59
  changed_at: number;
@@ -69,6 +79,9 @@ export declare function handleDeriveUserMode(v: DeriveUserModeInput): Promise<{
69
79
  owner: string;
70
80
  key_risk: string;
71
81
  machine_nodes: string[];
82
+ location_sensitivity: LocationSensitivity;
83
+ trust_selling_points: string[];
84
+ build_notes: string[];
72
85
  evolution_history: {
73
86
  version: string;
74
87
  changed_at: number;
@@ -93,6 +106,9 @@ export declare function handleEvolveUserMode(v: EvolveUserModeInput): Promise<{
93
106
  owner: string;
94
107
  key_risk: string;
95
108
  machine_nodes: string[];
109
+ location_sensitivity: LocationSensitivity;
110
+ trust_selling_points: string[];
111
+ build_notes: string[];
96
112
  evolution_history: {
97
113
  version: string;
98
114
  changed_at: number;
@@ -116,6 +132,9 @@ export declare function handleRegisterUserMode(v: RegisterUserModeInput): Promis
116
132
  owner: string;
117
133
  key_risk: string;
118
134
  machine_nodes: string[];
135
+ location_sensitivity: LocationSensitivity;
136
+ trust_selling_points: string[];
137
+ build_notes: string[];
119
138
  evolution_history: {
120
139
  version: string;
121
140
  changed_at: number;
@@ -1 +1 @@
1
- import{getIndustryModeRegistry,getMetricRegistry,getConstraintRegistry}from'../../extensions/index.js';import{inferTraitsFromDescription,findSimilarIndustries}from'../../knowledge/industry-generalizer.js';import{resolveObjective,buildStrategyIntent,suggestLevers}from'../../persona/strategy-intent.js';export const LOCAL_MODE_OWNER='local';const RM1_11_NODE_REGEX=/(^|_)(disputed?|refund(?:ed)?|arbitration|arb)(_|$)/i;function validateMachineShape(a,b){const c=[];if(!Array['isArray'](a))return c;const d=new Set();for(const e of a){const f=e?.['name'];if(typeof f!=='string'||!f){c['push'](b+':\x20every\x20node\x20must\x20have\x20a\x20non-empty\x20string\x20\x27name\x27');continue;}d['has'](f)&&c['push'](b+':\x20duplicate\x20node\x20name\x20\x27'+f+'\x27\x20(R-M1-10)'),d['add'](f),RM1_11_NODE_REGEX['test'](f)&&c['push'](b+':\x20node\x20\x27'+f+'\x27\x20violates\x20R-M1-11\x20—\x20dispute/refund\x20flows\x20must\x20NOT\x20be\x20'+'modeled\x20as\x20Machine\x20nodes.\x20Disputes\x20flow\x20through\x20Service.arbitrations\x20→\x20Arbitration.dispute()\x20'+'independently\x20of\x20the\x20Machine.\x20Use\x20business-state\x20nodes\x20(e.g.\x20\x27cancelled\x27,\x20\x27return_approved\x27)\x20'+'and\x20route\x20fund\x20refunds\x20via\x20Allocator\x20triggered\x20by\x20those\x20states.');}return c;}function modeLevers(a){const b=[];return(a['capabilities_used']['some'](d=>d['startsWith']('reward.'))||a['flywheel']?.['rewardStrategy']&&a['flywheel']['rewardStrategy']!=='User-defined')&&b['push']('reward'),(a['flywheel']?.['discountStrategy']&&a['flywheel']['discountStrategy']!=='User-defined'||a['config_overrides']?.['service']?.['first_order_discount']===!![])&&b['push']('discount'),(a['capabilities_used']['includes']('guard.validate_buy')||a['guards']['some'](c=>c['template_id']['includes']('buy')))&&b['push']('buy_guard'),a['capabilities_used']['includes']('machine.node_topology')&&a['machine_shape']['length']>0x0&&b['push']('machine_design'),b;}function resolveStrategyObjectives(a){const b=typeof a==='string'?[a]:a??[],c=new Set();for(const d of b){const e=resolveObjective(d);if(e)c['add'](e);}return[...c];}export function handleRecommendIndustry(a){const b=(a['intent']??a['project_description']??a['project_name']??'')['trim']();if(!b)throw new Error('recommend_industry\x20requires\x20\x27intent\x27\x20(business\x20description\x20text).\x20'+'Example:\x20intent=\x27I\x20rent\x20cameras\x20to\x20photographers\x20with\x20deposit\x20and\x20damage\x20inspection\x27.');const c=inferTraitsFromDescription(b),d=findSimilarIndustries(c['traits'],0x3),e=resolveStrategyObjectives(a['strategy']),f=e['map'](k=>buildStrategyIntent(k)),g=[...new Set(f['flatMap'](k=>k['levers']))],h=getIndustryModeRegistry(),i=d['map'](k=>{const l=h['getMode'](k['industry']),n=l?modeLevers(l):[],o=g['filter'](q=>n['includes'](q)),p=g['length']>0x0?{'score':o['length']/g['length'],'matched_levers':o,'missing_levers':g['filter'](q=>!n['includes'](q))}:undefined;return{'industry':k['industry'],'similarity':k['similarity'],'matched_traits':k['matched_traits'],'strategy_alignment':p};});g['length']>0x0&&i['sort']((k,l)=>{const m=k['similarity']*0.7+(k['strategy_alignment']?.['score']??0x0)*0.3,n=l['similarity']*0.7+(l['strategy_alignment']?.['score']??0x0)*0.3;return n-m;});const j=i[0x0];return{'action':'recommend_industry','intent':b,'inferred_traits':c['traits'],'inference_confidence':c['confidence'],'matched_keywords':c['matched_keywords'],'strategy_intents':f,'lever_suggestions':f['flatMap'](k=>suggestLevers(k)),'recommendations':i,'hint':j?'Top\x20match:\x20\x27'+j['industry']+'\x27\x20(similarity\x20'+(j['similarity']*0x64)['toFixed'](0x0)+'%'+(g['length']>0x0?',\x20strategy\x20alignment\x20'+((j['strategy_alignment']?.['score']??0x0)*0x64)['toFixed'](0x0)+'%':'')+').\x20Use\x20it\x20to\x20shape\x20the\x20build\x20—\x20run\x20goal_operation\x20action=\x27merchant_guide\x27\x20(or\x20\x27analyze_intent\x27)\x20with\x20this\x20industry\x20context,\x20'+'or\x20choose\x20another\x20industry\x20from\x20\x27recommendations\x27.':'No\x20similar\x20industry\x20found.\x20Shape\x20the\x20build\x20from\x20scratch\x20via\x20goal_operation\x20action=\x27merchant_guide\x27.'};}export async function handleListModes(){const a=getIndustryModeRegistry(),b=a['listModes']()['filter'](d=>d['source']==='builtin')['map'](d=>({'name':d['name'],'display_name':d['display_name'],'version':d['version'],'key_risk':d['key_risk'],'machine_nodes':d['machine_shape']['map'](e=>e['name']),'similar_industries':d['similar_industries']??[]})),c=(await a['listUserModes'](LOCAL_MODE_OWNER))['map'](d=>({'name':d['name'],'display_name':d['display_name'],'version':d['version'],'derived_from':d['derived_from']??null,'key_risk':d['key_risk'],'machine_nodes':d['machine_shape']['map'](e=>e['name']),'evolution_history':(d['evolution_history']??[])['map'](e=>({'version':e['version'],'changed_at':e['changed_at'],'changes':e['changes']}))}));return{'action':'list_modes','builtin_modes':b,'user_modes':c,'owner':LOCAL_MODE_OWNER,'hint':'Use\x20a\x20builtin\x20mode\x20name\x20as\x20the\x20industry/mode\x20context\x20for\x20your\x20build\x20(see\x20recommend_industry\x20/\x20merchant_guide).\x20'+'Use\x20derive_user_mode\x20to\x20customize\x20a\x20builtin\x20mode,\x20or\x20register_user_mode\x20for\x20a\x20fully\x20custom\x20mode.\x20'+'User\x20modes\x20are\x20referenced\x20as\x20\x27<name>\x27\x20in\x20derive/evolve/unregister\x20actions.'};}export async function handleDeriveUserMode(a){const b=requireField(a['mode_source'],'mode_source'),c=requireField(a['mode_name'],'mode_name'),d=a['mode_changes']??{},e=validateMachineShape(d['machine_shape'],'mode_changes.machine_shape');if(e['length']>0x0)throw new Error('derive_user_mode\x20blocked:\x0a'+e['join']('\x0a'));const f=getIndustryModeRegistry(),g=await f['deriveMode'](b,d,LOCAL_MODE_OWNER,c,a['mode_display_name']);if(!g)throw new Error('derive_user_mode\x20failed:\x20source\x20mode\x20\x27'+b+'\x27\x20not\x20found,\x20or\x20name\x20\x27'+c+'\x27\x20conflicts\x20'+'with\x20a\x20builtin/existing\x20user\x20mode.\x20Call\x20list_modes\x20to\x20see\x20available\x20names.');return{'action':'derive_user_mode','mode':summarizeUserMode(g),'hint':'Mode\x20\x27'+c+'\x27\x20derived\x20from\x20\x27'+b+'\x27.\x20Use\x20it\x20as\x20the\x20industry/mode\x20context\x20for\x20your\x20build.\x20'+'Iterate\x20with\x20evolve_user_mode.'};}export async function handleEvolveUserMode(a){const b=requireField(a['mode_name'],'mode_name'),c=requireField(a['mode_change_description'],'mode_change_description'),d=a['mode_changes']??{},e=validateMachineShape(d['machine_shape'],'mode_changes.machine_shape');if(e['length']>0x0)throw new Error('evolve_user_mode\x20blocked:\x0a'+e['join']('\x0a'));const f=getIndustryModeRegistry(),g=await f['evolveMode'](b,d,LOCAL_MODE_OWNER,c,a['mode_bump_version']??!![]);if(!g)throw new Error('evolve_user_mode\x20failed:\x20user\x20mode\x20\x27'+b+'\x27\x20not\x20found\x20for\x20owner\x20\x27'+LOCAL_MODE_OWNER+'\x27.\x20'+'Call\x20list_modes\x20to\x20see\x20your\x20modes.');return{'action':'evolve_user_mode','mode':summarizeUserMode(g),'hint':'Mode\x20\x27'+b+'\x27\x20evolved\x20to\x20'+g['version']+'.\x20Evolution\x20history\x20recorded.'};}export async function handleRegisterUserMode(a){const b=requireField(a['mode_name'],'mode_name'),c=a['mode_changes']??{},d=[];(!Array['isArray'](c['machine_shape'])||c['machine_shape']['length']===0x0)&&d['push']('machine_shape\x20(non-empty\x20array\x20of\x20{name,\x20role})');(typeof c['key_risk']!=='string'||!c['key_risk'])&&d['push']('key_risk\x20(string\x20describing\x20the\x20industry\x27s\x20key\x20risk)');if(d['length']>0x0)throw new Error('register_user_mode\x20requires\x20these\x20fields\x20in\x20mode_changes:\x20'+d['join'](',\x20')+'.\x20'+'Tip:\x20derive_user_mode\x20from\x20a\x20builtin\x20mode\x20is\x20usually\x20easier\x20than\x20registering\x20from\x20scratch.');const e=validateMachineShape(c['machine_shape'],'mode_changes.machine_shape');if(e['length']>0x0)throw new Error('register_user_mode\x20blocked:\x0a'+e['join']('\x0a'));const f=getIndustryModeRegistry(),g=f['getMode']('general');if(!g)throw new Error('Builtin\x20mode\x20\x27general\x27\x20not\x20registered\x20—\x20cannot\x20build\x20custom\x20mode\x20defaults');const h={...g,...c,'name':b,'display_name':a['mode_display_name']??b,'version':'v1','source':'custom','owner':LOCAL_MODE_OWNER,'derived_from':undefined,'evolution_history':[]},i=await f['registerUserMode'](h,LOCAL_MODE_OWNER);if(!i)throw new Error('register_user_mode\x20failed:\x20name\x20\x27'+b+'\x27\x20conflicts\x20with\x20a\x20builtin/existing\x20user\x20mode,\x20'+'or\x20payload\x20is\x20invalid.\x20Call\x20list_modes\x20to\x20see\x20available\x20names.');return{'action':'register_user_mode','mode':summarizeUserMode(h),'hint':'Custom\x20mode\x20\x27'+b+'\x27\x20registered.\x20Use\x20it\x20as\x20the\x20industry/mode\x20context\x20for\x20your\x20build.'};}export async function handleUnregisterUserMode(a){const b=requireField(a['mode_name'],'mode_name'),c=getIndustryModeRegistry(),d=await c['unregisterUserMode'](b,LOCAL_MODE_OWNER);if(!d)throw new Error('unregister_user_mode\x20failed:\x20user\x20mode\x20\x27'+b+'\x27\x20not\x20found\x20for\x20owner\x20\x27'+LOCAL_MODE_OWNER+'\x27.');return{'action':'unregister_user_mode','removed':!![],'mode_name':b};}export async function handleRegisterCustomMetric(a){const b=requireField(a['metric_id'],'metric_id'),c=requireField(a['metric_display_name'],'metric_display_name'),d=requireField(a['metric_description'],'metric_description'),e=requireField(a['metric_type'],'metric_type'),f=requireField(a['metric_scale'],'metric_scale'),g=await getMetricRegistry()['registerCustomMetric'](b,c,d,e,f,LOCAL_MODE_OWNER,a['metric_weight']);if(!g)throw new Error('register_custom_metric\x20failed:\x20metric_id\x20\x27'+b+'\x27\x20already\x20exists\x20or\x20fields\x20are\x20invalid.');return{'action':'register_custom_metric','metric':{'metric_id':b,'display_name':c,'description':d,'type':e,'scale':f,'weight':a['metric_weight']??0x1,'scope':'custom','owner':LOCAL_MODE_OWNER},'hint':'Custom\x20metric\x20\x27'+b+'\x27\x20registered\x20globally\x20and\x20persisted\x20(survives\x20restart)\x20—\x20all\x20modes\x20reference\x20it\x20in\x20evaluation.'};}export async function handleUnregisterCustomMetric(a){const b=requireField(a['metric_id'],'metric_id'),c=await getMetricRegistry()['unregisterMetric'](b,LOCAL_MODE_OWNER);if(!c)throw new Error('unregister_custom_metric\x20failed:\x20custom\x20metric\x20\x27'+b+'\x27\x20not\x20found\x20(builtin\x20metrics\x20cannot\x20be\x20deleted).\x20'+'Call\x20list_metrics_constraints\x20with\x20scope_filter=\x27custom\x27\x20to\x20see\x20deletable\x20metrics.');return{'action':'unregister_custom_metric','removed':!![],'metric_id':b};}export async function handleRegisterCustomConstraint(a){const b=requireField(a['constraint_id'],'constraint_id'),c=requireField(a['constraint_display_name'],'constraint_display_name'),d=requireField(a['constraint_description'],'constraint_description'),e=a['constraint_rule'];if(!e||typeof e!=='object'||!('type'in e))throw new Error('constraint_rule\x20is\x20required\x20and\x20must\x20be\x20one\x20of:\x20'+'{type:\x27capability_required\x27,\x20capability_id}\x20|\x20{type:\x27capability_forbidden\x27,\x20capability_id}\x20|\x20'+'{type:\x27numeric_limit\x27,\x20field,\x20max?,\x20min?}\x20|\x20{type:\x27condition_required\x27,\x20condition,\x20ai_evaluated:true}');const f=await getConstraintRegistry()['registerCustomConstraint'](b,c,d,e,LOCAL_MODE_OWNER,a['constraint_severity']??'soft',a['constraint_on_violation']??'warn');if(!f)throw new Error('register_custom_constraint\x20failed:\x20constraint_id\x20\x27'+b+'\x27\x20already\x20exists\x20or\x20rule\x20is\x20invalid.');return{'action':'register_custom_constraint','constraint':{'constraint_id':b,'display_name':c,'description':d,'rule':e,'severity':a['constraint_severity']??'soft','on_violation':a['constraint_on_violation']??'warn','scope':'custom','owner':LOCAL_MODE_OWNER},'hint':'Custom\x20constraint\x20\x27'+b+'\x27\x20registered\x20and\x20persisted\x20(survives\x20restart).\x20\x27hard\x27\x20constraints\x20mark\x20a\x20mode\x20not\x20applicable\x20on\x20violation;\x20\x27soft\x27\x20only\x20warn.'};}export async function handleUnregisterCustomConstraint(a){const b=requireField(a['constraint_id'],'constraint_id'),c=await getConstraintRegistry()['unregisterConstraint'](b,LOCAL_MODE_OWNER);if(!c)throw new Error('unregister_custom_constraint\x20failed:\x20custom\x20constraint\x20\x27'+b+'\x27\x20not\x20found\x20(builtin\x20constraints\x20cannot\x20be\x20deleted).\x20'+'Call\x20list_metrics_constraints\x20with\x20scope_filter=\x27custom\x27\x20to\x20see\x20deletable\x20constraints.');return{'action':'unregister_custom_constraint','removed':!![],'constraint_id':b};}export async function handleListMetricsConstraints(a){const b=(await getMetricRegistry()['listMetrics']({'type':a['metric_type_filter'],'scope':a['scope_filter']}))['map'](d=>({'metric_id':d['metric_id'],'display_name':d['display_name'],'description':d['description'],'type':d['type'],'scale':d['scale'],'weight':d['weight'],'scope':d['scope']})),c=(await getConstraintRegistry()['listConstraints']({'scope':a['scope_filter']}))['map'](d=>({'constraint_id':d['constraint_id'],'display_name':d['display_name'],'description':d['description'],'rule':d['rule'],'severity':d['severity'],'on_violation':d['on_violation'],'scope':d['scope']}));return{'action':'list_metrics_constraints','metrics':b,'constraints':c,'hint':'Register\x20custom\x20entries\x20via\x20register_custom_metric\x20/\x20register_custom_constraint;\x20'+'delete\x20via\x20unregister_custom_metric\x20/\x20unregister_custom_constraint\x20(custom\x20only).\x20'+'Custom\x20entries\x20are\x20persisted\x20and\x20survive\x20restart.\x20'+'Filter\x20with\x20metric_type_filter\x20(\x27risk\x27|\x27benefit\x27)\x20or\x20scope_filter\x20(\x27builtin\x27|\x27custom\x27).'};}function requireField(a,b){if(a===undefined||a===null||typeof a==='string'&&!a['trim']())throw new Error('\x27'+b+'\x27\x20is\x20required\x20for\x20this\x20action');return a;}function summarizeUserMode(a){return{'name':a['name'],'display_name':a['display_name'],'version':a['version'],'derived_from':a['derived_from']??null,'owner':a['owner'],'key_risk':a['key_risk'],'machine_nodes':a['machine_shape']['map'](b=>b['name']),'evolution_history':(a['evolution_history']??[])['map'](b=>({'version':b['version'],'changed_at':b['changed_at'],'changes':b['changes']}))};}
1
+ import{getIndustryModeRegistry,getMetricRegistry,getConstraintRegistry}from'../../extensions/index.js';import{inferTraitsFromDescription,findSimilarIndustries}from'../../knowledge/industry-generalizer.js';import{resolveObjective,buildStrategyIntent,suggestLevers}from'../../persona/strategy-intent.js';export const LOCAL_MODE_OWNER='local';function locationSensitivity(a){if(a['has_logistics'])return'logistics';if(a['pure_digital'])return'near';return'strict';}const RM1_11_NODE_REGEX=/(^|_)(disputed?|refund(?:ed)?|arbitration|arb)(_|$)/i;function validateMachineShape(a,b){const c=[];if(!Array['isArray'](a))return c;const d=new Set();for(const e of a){const f=e?.['name'];if(typeof f!=='string'||!f){c['push'](b+':\x20every\x20node\x20must\x20have\x20a\x20non-empty\x20string\x20\x27name\x27');continue;}d['has'](f)&&c['push'](b+':\x20duplicate\x20node\x20name\x20\x27'+f+'\x27\x20(R-M1-10)'),d['add'](f),RM1_11_NODE_REGEX['test'](f)&&c['push'](b+':\x20node\x20\x27'+f+'\x27\x20violates\x20R-M1-11\x20—\x20dispute/refund\x20flows\x20must\x20NOT\x20be\x20'+'modeled\x20as\x20Machine\x20nodes.\x20Disputes\x20flow\x20through\x20Service.arbitrations\x20→\x20Arbitration.dispute()\x20'+'independently\x20of\x20the\x20Machine.\x20Use\x20business-state\x20nodes\x20(e.g.\x20\x27cancelled\x27,\x20\x27return_approved\x27)\x20'+'and\x20route\x20fund\x20refunds\x20via\x20Allocator\x20triggered\x20by\x20those\x20states.');}return c;}function modeLevers(a){const b=[];return(a['capabilities_used']['some'](d=>d['startsWith']('reward.'))||a['flywheel']?.['rewardStrategy']&&a['flywheel']['rewardStrategy']!=='User-defined')&&b['push']('reward'),(a['flywheel']?.['discountStrategy']&&a['flywheel']['discountStrategy']!=='User-defined'||a['config_overrides']?.['service']?.['first_order_discount']===!![])&&b['push']('discount'),(a['capabilities_used']['includes']('guard.validate_buy')||a['guards']['some'](c=>c['template_id']['includes']('buy')))&&b['push']('buy_guard'),a['capabilities_used']['includes']('machine.node_topology')&&a['machine_shape']['length']>0x0&&b['push']('machine_design'),b;}function resolveStrategyObjectives(a){const b=typeof a==='string'?[a]:a??[],c=new Set();for(const d of b){const e=resolveObjective(d);if(e)c['add'](e);}return[...c];}export function handleRecommendIndustry(a){const b=(a['intent']??a['project_description']??a['project_name']??'')['trim']();if(!b)throw new Error('recommend_industry\x20requires\x20\x27intent\x27\x20(business\x20description\x20text).\x20'+'Example:\x20intent=\x27I\x20rent\x20cameras\x20to\x20photographers\x20with\x20deposit\x20and\x20damage\x20inspection\x27.');const c=inferTraitsFromDescription(b),d=findSimilarIndustries(c['traits'],0x3),e=resolveStrategyObjectives(a['strategy']),f=e['map'](k=>buildStrategyIntent(k)),g=[...new Set(f['flatMap'](k=>k['levers']))],h=getIndustryModeRegistry(),i=d['map'](k=>{const l=h['getMode'](k['industry']),n=l?modeLevers(l):[],o=g['filter'](q=>n['includes'](q)),p=g['length']>0x0?{'score':o['length']/g['length'],'matched_levers':o,'missing_levers':g['filter'](q=>!n['includes'](q))}:undefined;return{'industry':k['industry'],'similarity':k['similarity'],'matched_traits':k['matched_traits'],'location_sensitivity':l?locationSensitivity(l['traits']):'strict','trust_selling_points':l?l['flywheel']?.['trustSellingPoints']??[]:[],'build_notes':l?.['build_notes']??[],'strategy_alignment':p};});g['length']>0x0&&i['sort']((k,l)=>{const m=k['similarity']*0.7+(k['strategy_alignment']?.['score']??0x0)*0.3,n=l['similarity']*0.7+(l['strategy_alignment']?.['score']??0x0)*0.3;return n-m;});const j=i[0x0];return{'action':'recommend_industry','intent':b,'inferred_traits':c['traits'],'inference_confidence':c['confidence'],'matched_keywords':c['matched_keywords'],'strategy_intents':f,'lever_suggestions':f['flatMap'](k=>suggestLevers(k)),'recommendations':i,'hint':j?'Top\x20match:\x20\x27'+j['industry']+'\x27\x20(similarity\x20'+(j['similarity']*0x64)['toFixed'](0x0)+'%'+(g['length']>0x0?',\x20strategy\x20alignment\x20'+((j['strategy_alignment']?.['score']??0x0)*0x64)['toFixed'](0x0)+'%':'')+').\x20Use\x20it\x20to\x20shape\x20the\x20build\x20—\x20run\x20goal_operation\x20action=\x27merchant_guide\x27\x20(or\x20\x27analyze_intent\x27)\x20with\x20this\x20industry\x20context,\x20'+'or\x20choose\x20another\x20industry\x20from\x20\x27recommendations\x27.':'No\x20similar\x20industry\x20found.\x20Shape\x20the\x20build\x20from\x20scratch\x20via\x20goal_operation\x20action=\x27merchant_guide\x27.'};}export async function handleListModes(){const a=getIndustryModeRegistry(),b=a['listModes']()['filter'](d=>d['source']==='builtin')['map'](d=>({'name':d['name'],'display_name':d['display_name'],'version':d['version'],'key_risk':d['key_risk'],'machine_nodes':d['machine_shape']['map'](e=>e['name']),'similar_industries':d['similar_industries']??[],'location_sensitivity':locationSensitivity(d['traits']),'trust_selling_points':d['flywheel']?.['trustSellingPoints']??[],'build_notes':d['build_notes']??[]})),c=(await a['listUserModes'](LOCAL_MODE_OWNER))['map'](d=>({'name':d['name'],'display_name':d['display_name'],'version':d['version'],'derived_from':d['derived_from']??null,'key_risk':d['key_risk'],'machine_nodes':d['machine_shape']['map'](e=>e['name']),'location_sensitivity':locationSensitivity(d['traits']),'trust_selling_points':d['flywheel']?.['trustSellingPoints']??[],'build_notes':d['build_notes']??[],'evolution_history':(d['evolution_history']??[])['map'](e=>({'version':e['version'],'changed_at':e['changed_at'],'changes':e['changes']}))}));return{'action':'list_modes','builtin_modes':b,'user_modes':c,'owner':LOCAL_MODE_OWNER,'hint':'Use\x20a\x20builtin\x20mode\x20name\x20as\x20the\x20industry/mode\x20context\x20for\x20your\x20build\x20(see\x20recommend_industry\x20/\x20merchant_guide).\x20'+'Use\x20derive_user_mode\x20to\x20customize\x20a\x20builtin\x20mode,\x20or\x20register_user_mode\x20for\x20a\x20fully\x20custom\x20mode.\x20'+'User\x20modes\x20are\x20referenced\x20as\x20\x27<name>\x27\x20in\x20derive/evolve/unregister\x20actions.'};}export async function handleDeriveUserMode(a){const b=requireField(a['mode_source'],'mode_source'),c=requireField(a['mode_name'],'mode_name'),d=a['mode_changes']??{},e=validateMachineShape(d['machine_shape'],'mode_changes.machine_shape');if(e['length']>0x0)throw new Error('derive_user_mode\x20blocked:\x0a'+e['join']('\x0a'));const f=getIndustryModeRegistry(),g=await f['deriveMode'](b,d,LOCAL_MODE_OWNER,c,a['mode_display_name']);if(!g)throw new Error('derive_user_mode\x20failed:\x20source\x20mode\x20\x27'+b+'\x27\x20not\x20found,\x20or\x20name\x20\x27'+c+'\x27\x20conflicts\x20'+'with\x20a\x20builtin/existing\x20user\x20mode.\x20Call\x20list_modes\x20to\x20see\x20available\x20names.');return{'action':'derive_user_mode','mode':summarizeUserMode(g),'hint':'Mode\x20\x27'+c+'\x27\x20derived\x20from\x20\x27'+b+'\x27.\x20Use\x20it\x20as\x20the\x20industry/mode\x20context\x20for\x20your\x20build.\x20'+'Iterate\x20with\x20evolve_user_mode.'};}export async function handleEvolveUserMode(a){const b=requireField(a['mode_name'],'mode_name'),c=requireField(a['mode_change_description'],'mode_change_description'),d=a['mode_changes']??{},e=validateMachineShape(d['machine_shape'],'mode_changes.machine_shape');if(e['length']>0x0)throw new Error('evolve_user_mode\x20blocked:\x0a'+e['join']('\x0a'));const f=getIndustryModeRegistry(),g=await f['evolveMode'](b,d,LOCAL_MODE_OWNER,c,a['mode_bump_version']??!![]);if(!g)throw new Error('evolve_user_mode\x20failed:\x20user\x20mode\x20\x27'+b+'\x27\x20not\x20found\x20for\x20owner\x20\x27'+LOCAL_MODE_OWNER+'\x27.\x20'+'Call\x20list_modes\x20to\x20see\x20your\x20modes.');return{'action':'evolve_user_mode','mode':summarizeUserMode(g),'hint':'Mode\x20\x27'+b+'\x27\x20evolved\x20to\x20'+g['version']+'.\x20Evolution\x20history\x20recorded.'};}export async function handleRegisterUserMode(a){const b=requireField(a['mode_name'],'mode_name'),c=a['mode_changes']??{},d=[];(!Array['isArray'](c['machine_shape'])||c['machine_shape']['length']===0x0)&&d['push']('machine_shape\x20(non-empty\x20array\x20of\x20{name,\x20role})');(typeof c['key_risk']!=='string'||!c['key_risk'])&&d['push']('key_risk\x20(string\x20describing\x20the\x20industry\x27s\x20key\x20risk)');if(d['length']>0x0)throw new Error('register_user_mode\x20requires\x20these\x20fields\x20in\x20mode_changes:\x20'+d['join'](',\x20')+'.\x20'+'Tip:\x20derive_user_mode\x20from\x20a\x20builtin\x20mode\x20is\x20usually\x20easier\x20than\x20registering\x20from\x20scratch.');const e=validateMachineShape(c['machine_shape'],'mode_changes.machine_shape');if(e['length']>0x0)throw new Error('register_user_mode\x20blocked:\x0a'+e['join']('\x0a'));const f=getIndustryModeRegistry(),g=f['getMode']('general');if(!g)throw new Error('Builtin\x20mode\x20\x27general\x27\x20not\x20registered\x20—\x20cannot\x20build\x20custom\x20mode\x20defaults');const h={...g,...c,'name':b,'display_name':a['mode_display_name']??b,'version':'v1','source':'custom','owner':LOCAL_MODE_OWNER,'derived_from':undefined,'evolution_history':[]},i=await f['registerUserMode'](h,LOCAL_MODE_OWNER);if(!i)throw new Error('register_user_mode\x20failed:\x20name\x20\x27'+b+'\x27\x20conflicts\x20with\x20a\x20builtin/existing\x20user\x20mode,\x20'+'or\x20payload\x20is\x20invalid.\x20Call\x20list_modes\x20to\x20see\x20available\x20names.');return{'action':'register_user_mode','mode':summarizeUserMode(h),'hint':'Custom\x20mode\x20\x27'+b+'\x27\x20registered.\x20Use\x20it\x20as\x20the\x20industry/mode\x20context\x20for\x20your\x20build.'};}export async function handleUnregisterUserMode(a){const b=requireField(a['mode_name'],'mode_name'),c=getIndustryModeRegistry(),d=await c['unregisterUserMode'](b,LOCAL_MODE_OWNER);if(!d)throw new Error('unregister_user_mode\x20failed:\x20user\x20mode\x20\x27'+b+'\x27\x20not\x20found\x20for\x20owner\x20\x27'+LOCAL_MODE_OWNER+'\x27.');return{'action':'unregister_user_mode','removed':!![],'mode_name':b};}export async function handleRegisterCustomMetric(a){const b=requireField(a['metric_id'],'metric_id'),c=requireField(a['metric_display_name'],'metric_display_name'),d=requireField(a['metric_description'],'metric_description'),e=requireField(a['metric_type'],'metric_type'),f=requireField(a['metric_scale'],'metric_scale'),g=await getMetricRegistry()['registerCustomMetric'](b,c,d,e,f,LOCAL_MODE_OWNER,a['metric_weight']);if(!g)throw new Error('register_custom_metric\x20failed:\x20metric_id\x20\x27'+b+'\x27\x20already\x20exists\x20or\x20fields\x20are\x20invalid.');return{'action':'register_custom_metric','metric':{'metric_id':b,'display_name':c,'description':d,'type':e,'scale':f,'weight':a['metric_weight']??0x1,'scope':'custom','owner':LOCAL_MODE_OWNER},'hint':'Custom\x20metric\x20\x27'+b+'\x27\x20registered\x20globally\x20and\x20persisted\x20(survives\x20restart)\x20—\x20all\x20modes\x20reference\x20it\x20in\x20evaluation.'};}export async function handleUnregisterCustomMetric(a){const b=requireField(a['metric_id'],'metric_id'),c=await getMetricRegistry()['unregisterMetric'](b,LOCAL_MODE_OWNER);if(!c)throw new Error('unregister_custom_metric\x20failed:\x20custom\x20metric\x20\x27'+b+'\x27\x20not\x20found\x20(builtin\x20metrics\x20cannot\x20be\x20deleted).\x20'+'Call\x20list_metrics_constraints\x20with\x20scope_filter=\x27custom\x27\x20to\x20see\x20deletable\x20metrics.');return{'action':'unregister_custom_metric','removed':!![],'metric_id':b};}export async function handleRegisterCustomConstraint(a){const b=requireField(a['constraint_id'],'constraint_id'),c=requireField(a['constraint_display_name'],'constraint_display_name'),d=requireField(a['constraint_description'],'constraint_description'),e=a['constraint_rule'];if(!e||typeof e!=='object'||!('type'in e))throw new Error('constraint_rule\x20is\x20required\x20and\x20must\x20be\x20one\x20of:\x20'+'{type:\x27capability_required\x27,\x20capability_id}\x20|\x20{type:\x27capability_forbidden\x27,\x20capability_id}\x20|\x20'+'{type:\x27numeric_limit\x27,\x20field,\x20max?,\x20min?}\x20|\x20{type:\x27condition_required\x27,\x20condition,\x20ai_evaluated:true}');const f=await getConstraintRegistry()['registerCustomConstraint'](b,c,d,e,LOCAL_MODE_OWNER,a['constraint_severity']??'soft',a['constraint_on_violation']??'warn');if(!f)throw new Error('register_custom_constraint\x20failed:\x20constraint_id\x20\x27'+b+'\x27\x20already\x20exists\x20or\x20rule\x20is\x20invalid.');return{'action':'register_custom_constraint','constraint':{'constraint_id':b,'display_name':c,'description':d,'rule':e,'severity':a['constraint_severity']??'soft','on_violation':a['constraint_on_violation']??'warn','scope':'custom','owner':LOCAL_MODE_OWNER},'hint':'Custom\x20constraint\x20\x27'+b+'\x27\x20registered\x20and\x20persisted\x20(survives\x20restart).\x20\x27hard\x27\x20constraints\x20mark\x20a\x20mode\x20not\x20applicable\x20on\x20violation;\x20\x27soft\x27\x20only\x20warn.'};}export async function handleUnregisterCustomConstraint(a){const b=requireField(a['constraint_id'],'constraint_id'),c=await getConstraintRegistry()['unregisterConstraint'](b,LOCAL_MODE_OWNER);if(!c)throw new Error('unregister_custom_constraint\x20failed:\x20custom\x20constraint\x20\x27'+b+'\x27\x20not\x20found\x20(builtin\x20constraints\x20cannot\x20be\x20deleted).\x20'+'Call\x20list_metrics_constraints\x20with\x20scope_filter=\x27custom\x27\x20to\x20see\x20deletable\x20constraints.');return{'action':'unregister_custom_constraint','removed':!![],'constraint_id':b};}export async function handleListMetricsConstraints(a){const b=(await getMetricRegistry()['listMetrics']({'type':a['metric_type_filter'],'scope':a['scope_filter']}))['map'](d=>({'metric_id':d['metric_id'],'display_name':d['display_name'],'description':d['description'],'type':d['type'],'scale':d['scale'],'weight':d['weight'],'scope':d['scope']})),c=(await getConstraintRegistry()['listConstraints']({'scope':a['scope_filter']}))['map'](d=>({'constraint_id':d['constraint_id'],'display_name':d['display_name'],'description':d['description'],'rule':d['rule'],'severity':d['severity'],'on_violation':d['on_violation'],'scope':d['scope']}));return{'action':'list_metrics_constraints','metrics':b,'constraints':c,'hint':'Register\x20custom\x20entries\x20via\x20register_custom_metric\x20/\x20register_custom_constraint;\x20'+'delete\x20via\x20unregister_custom_metric\x20/\x20unregister_custom_constraint\x20(custom\x20only).\x20'+'Custom\x20entries\x20are\x20persisted\x20and\x20survive\x20restart.\x20'+'Filter\x20with\x20metric_type_filter\x20(\x27risk\x27|\x27benefit\x27)\x20or\x20scope_filter\x20(\x27builtin\x27|\x27custom\x27).'};}function requireField(a,b){if(a===undefined||a===null||typeof a==='string'&&!a['trim']())throw new Error('\x27'+b+'\x27\x20is\x20required\x20for\x20this\x20action');return a;}function summarizeUserMode(a){return{'name':a['name'],'display_name':a['display_name'],'version':a['version'],'derived_from':a['derived_from']??null,'owner':a['owner'],'key_risk':a['key_risk'],'machine_nodes':a['machine_shape']['map'](b=>b['name']),'location_sensitivity':locationSensitivity(a['traits']),'trust_selling_points':a['flywheel']?.['trustSellingPoints']??[],'build_notes':a['build_notes']??[],'evolution_history':(a['evolution_history']??[])['map'](b=>({'version':b['version'],'changed_at':b['changed_at'],'changes':b['changes']}))};}