@wowok/agent-mcp 3.1.2 → 3.1.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 (300) hide show
  1. package/dist/config/runtime.js +1 -1
  2. package/dist/customer/index.d.ts +3 -9
  3. package/dist/customer/index.js +1 -1
  4. package/dist/customer/industry-risks.d.ts +3 -17
  5. package/dist/customer/industry-risks.js +1 -1
  6. package/dist/customer/types.d.ts +1 -165
  7. package/dist/customer/types.js +1 -1
  8. package/dist/customer/user-preferences.d.ts +0 -49
  9. package/dist/customer/user-preferences.js +1 -1
  10. package/dist/evaluation/architecture.spec.d.ts +1 -0
  11. package/dist/evaluation/architecture.spec.js +1 -0
  12. package/dist/evaluation/builtins/graph-service.d.ts +16 -0
  13. package/dist/evaluation/builtins/graph-service.js +1 -0
  14. package/dist/evaluation/builtins/graph-service.spec.d.ts +1 -0
  15. package/dist/evaluation/builtins/graph-service.spec.js +1 -0
  16. package/dist/evaluation/builtins/index.d.ts +1 -1
  17. package/dist/evaluation/builtins/index.js +1 -1
  18. package/dist/evaluation/builtins/purity.spec.d.ts +1 -0
  19. package/dist/evaluation/builtins/purity.spec.js +1 -0
  20. package/dist/evaluation/engine.js +1 -1
  21. package/dist/evaluation/facets/catalog.d.ts +19 -0
  22. package/dist/evaluation/facets/catalog.js +1 -0
  23. package/dist/evaluation/guard-scan.d.ts +10 -0
  24. package/dist/evaluation/guard-scan.js +1 -0
  25. package/dist/evaluation/standards.d.ts +31 -0
  26. package/dist/evaluation/standards.js +1 -0
  27. package/dist/evaluation/standards.spec.d.ts +1 -0
  28. package/dist/evaluation/standards.spec.js +1 -0
  29. package/dist/evaluation/types.d.ts +9 -0
  30. package/dist/experience/realtime-feedback.js +1 -1
  31. package/dist/extensions/index.d.ts +1 -1
  32. package/dist/extensions/index.js +1 -1
  33. package/dist/extensions/industry-layers.d.ts +6 -5
  34. package/dist/extensions/industry-layers.js +1 -1
  35. package/dist/extensions/industry-pack.js +1 -1
  36. package/dist/graph/onchain/analyze.d.ts +13 -0
  37. package/dist/graph/onchain/analyze.js +1 -1
  38. package/dist/graph/onchain/analyze.spec.js +1 -1
  39. package/dist/graph/onchain/dataplane.d.ts +1 -1
  40. package/dist/graph/onchain/dataplane.js +1 -1
  41. package/dist/graph/onchain/edge-batch.spec.d.ts +1 -0
  42. package/dist/graph/onchain/edge-batch.spec.js +1 -0
  43. package/dist/graph/onchain/edge-schema.d.ts +10 -2
  44. package/dist/graph/onchain/edge-schema.js +1 -1
  45. package/dist/graph/onchain/entity-profile.spec.d.ts +1 -0
  46. package/dist/graph/onchain/entity-profile.spec.js +1 -0
  47. package/dist/graph/onchain/event-history.spec.d.ts +1 -0
  48. package/dist/graph/onchain/event-history.spec.js +1 -0
  49. package/dist/graph/onchain/expand.js +1 -1
  50. package/dist/graph/onchain/extract-deep.spec.d.ts +1 -0
  51. package/dist/graph/onchain/extract-deep.spec.js +1 -0
  52. package/dist/graph/onchain/extract.d.ts +11 -3
  53. package/dist/graph/onchain/extract.js +1 -1
  54. package/dist/graph/onchain/facet-projection.d.ts +99 -0
  55. package/dist/graph/onchain/facet-projection.js +1 -0
  56. package/dist/graph/onchain/facet-projection.spec.d.ts +1 -0
  57. package/dist/graph/onchain/facet-projection.spec.js +1 -0
  58. package/dist/graph/onchain/facts.d.ts +103 -0
  59. package/dist/graph/onchain/facts.js +1 -0
  60. package/dist/graph/onchain/facts.spec.d.ts +1 -0
  61. package/dist/graph/onchain/facts.spec.js +1 -0
  62. package/dist/graph/onchain/field-manifest.d.ts +29 -0
  63. package/dist/graph/onchain/field-manifest.js +1 -0
  64. package/dist/graph/onchain/field-manifest.spec.d.ts +1 -0
  65. package/dist/graph/onchain/field-manifest.spec.js +1 -0
  66. package/dist/graph/onchain/fixtures.d.ts +80 -0
  67. package/dist/graph/onchain/fixtures.js +1 -0
  68. package/dist/graph/onchain/fixtures.spec.d.ts +1 -0
  69. package/dist/graph/onchain/fixtures.spec.js +1 -0
  70. package/dist/graph/onchain/index.d.ts +8 -2
  71. package/dist/graph/onchain/index.js +1 -1
  72. package/dist/graph/onchain/interest.js +1 -1
  73. package/dist/graph/onchain/label-lint.spec.d.ts +1 -0
  74. package/dist/graph/onchain/label-lint.spec.js +1 -0
  75. package/dist/graph/onchain/names.d.ts +23 -0
  76. package/dist/graph/onchain/names.js +1 -0
  77. package/dist/graph/onchain/names.spec.d.ts +1 -0
  78. package/dist/graph/onchain/names.spec.js +1 -0
  79. package/dist/graph/onchain/onchain.spec.js +1 -1
  80. package/dist/graph/onchain/proposal-graph.d.ts +11 -0
  81. package/dist/graph/onchain/proposal-graph.js +1 -0
  82. package/dist/graph/onchain/proposal-graph.spec.d.ts +1 -0
  83. package/dist/graph/onchain/proposal-graph.spec.js +1 -0
  84. package/dist/graph/onchain/sdk-batch.d.ts +5 -1
  85. package/dist/graph/onchain/sdk-batch.js +1 -1
  86. package/dist/graph/onchain/strategy.d.ts +16 -0
  87. package/dist/graph/onchain/strategy.js +1 -1
  88. package/dist/graph/onchain/strategy.spec.js +1 -1
  89. package/dist/graph/onchain/table-ledger.spec.d.ts +1 -0
  90. package/dist/graph/onchain/table-ledger.spec.js +1 -0
  91. package/dist/graph/onchain/types.d.ts +46 -6
  92. package/dist/graph/onchain/viewport.d.ts +1 -0
  93. package/dist/graph/onchain/viewport.js +1 -1
  94. package/dist/harness/index.d.ts +1 -5
  95. package/dist/harness/index.js +1 -1
  96. package/dist/harness/verify.d.ts +6 -1
  97. package/dist/harness/verify.js +1 -1
  98. package/dist/index.js +1 -1
  99. package/dist/knowledge/allocation-ledger.js +1 -1
  100. package/dist/knowledge/allocation-risk.d.ts +0 -2
  101. package/dist/knowledge/allocation-risk.js +1 -1
  102. package/dist/knowledge/arb-risk.d.ts +0 -1
  103. package/dist/knowledge/arb-risk.js +1 -1
  104. package/dist/knowledge/arbitration-risk.d.ts +0 -2
  105. package/dist/knowledge/arbitration-risk.js +1 -1
  106. package/dist/knowledge/baselines/evaluation-baselines.json +79 -0
  107. package/dist/knowledge/baselines/guard-lint-baseline.spec.d.ts +1 -0
  108. package/dist/knowledge/baselines/guard-lint-baseline.spec.js +1 -0
  109. package/dist/knowledge/baselines/risk-baselines.spec.d.ts +1 -0
  110. package/dist/knowledge/baselines/risk-baselines.spec.js +1 -0
  111. package/dist/knowledge/baselines/risk-cases.d.ts +8 -0
  112. package/dist/knowledge/baselines/risk-cases.js +1 -0
  113. package/dist/knowledge/bridge-risk.d.ts +0 -1
  114. package/dist/knowledge/bridge-risk.js +1 -1
  115. package/dist/knowledge/contact-risk.d.ts +0 -1
  116. package/dist/knowledge/contact-risk.js +1 -1
  117. package/dist/knowledge/contract-invariants.d.ts +1 -0
  118. package/dist/knowledge/contract-invariants.js +1 -1
  119. package/dist/knowledge/demand-risk.d.ts +0 -1
  120. package/dist/knowledge/demand-risk.js +1 -1
  121. package/dist/knowledge/getting-started.js +1 -1
  122. package/dist/knowledge/guard-eval.d.ts +15 -0
  123. package/dist/knowledge/guard-eval.js +1 -0
  124. package/dist/knowledge/guard-eval.spec.d.ts +1 -0
  125. package/dist/knowledge/guard-eval.spec.js +1 -0
  126. package/dist/knowledge/guard-lint.d.ts +1 -1
  127. package/dist/knowledge/guard-lint.js +1 -1
  128. package/dist/knowledge/guard-risk.d.ts +4 -19
  129. package/dist/knowledge/guard-risk.js +1 -1
  130. package/dist/knowledge/index.d.ts +41 -43
  131. package/dist/knowledge/index.js +1 -1
  132. package/dist/knowledge/industry-registry.js +1 -1
  133. package/dist/knowledge/industry-rule-node.d.ts +7 -0
  134. package/dist/knowledge/industry-rule-node.js +1 -0
  135. package/dist/knowledge/jsonrpc-enum.js +1 -1
  136. package/dist/knowledge/machine-risk.d.ts +0 -6
  137. package/dist/knowledge/machine-risk.js +1 -1
  138. package/dist/knowledge/order-risk.d.ts +1 -9
  139. package/dist/knowledge/order-risk.js +1 -1
  140. package/dist/knowledge/payment-risk.d.ts +0 -1
  141. package/dist/knowledge/payment-risk.js +1 -1
  142. package/dist/knowledge/permission-risk.d.ts +0 -3
  143. package/dist/knowledge/permission-risk.js +1 -1
  144. package/dist/knowledge/personal-risk.d.ts +0 -1
  145. package/dist/knowledge/personal-risk.js +1 -1
  146. package/dist/knowledge/progress-risk.d.ts +0 -2
  147. package/dist/knowledge/progress-risk.js +1 -1
  148. package/dist/knowledge/proof-risk.d.ts +0 -1
  149. package/dist/knowledge/proof-risk.js +1 -1
  150. package/dist/knowledge/puzzle-projections.d.ts +11 -0
  151. package/dist/knowledge/puzzle-projections.js +1 -0
  152. package/dist/knowledge/registrar-risk.d.ts +0 -1
  153. package/dist/knowledge/registrar-risk.js +1 -1
  154. package/dist/knowledge/repository-risk.d.ts +0 -1
  155. package/dist/knowledge/repository-risk.js +1 -1
  156. package/dist/knowledge/resource-risk.d.ts +0 -1
  157. package/dist/knowledge/resource-risk.js +1 -1
  158. package/dist/knowledge/reward-risk.d.ts +1 -5
  159. package/dist/knowledge/reward-risk.js +1 -1
  160. package/dist/knowledge/rule-node-analyzers.d.ts +43 -0
  161. package/dist/knowledge/rule-node-analyzers.js +1 -0
  162. package/dist/knowledge/rule-node-analyzers.spec.d.ts +1 -0
  163. package/dist/knowledge/rule-node-analyzers.spec.js +1 -0
  164. package/dist/knowledge/rule-outcome.d.ts +5 -0
  165. package/dist/knowledge/rule-outcome.js +1 -0
  166. package/dist/knowledge/safety-rules.js +1 -1
  167. package/dist/knowledge/scenario-topology.js +1 -1
  168. package/dist/knowledge/service-risk-node.js +1 -1
  169. package/dist/knowledge/service-risk.d.ts +0 -3
  170. package/dist/knowledge/service-risk.js +1 -1
  171. package/dist/knowledge/template-registry.js +1 -1
  172. package/dist/knowledge/tools-reference.js +1 -1
  173. package/dist/knowledge/treasury-risk.d.ts +2 -3
  174. package/dist/knowledge/treasury-risk.js +1 -1
  175. package/dist/knowledge/util-risk.d.ts +0 -1
  176. package/dist/knowledge/util-risk.js +1 -1
  177. package/dist/monitor/MonitorLoop.js +1 -1
  178. package/dist/persona/bridge.js +1 -1
  179. package/dist/persona/facet-profile.d.ts +33 -0
  180. package/dist/persona/facet-profile.js +1 -0
  181. package/dist/persona/model.d.ts +2 -1
  182. package/dist/persona/model.js +1 -1
  183. package/dist/persona/topology-focus.d.ts +2 -2
  184. package/dist/persona/topology-focus.js +1 -1
  185. package/dist/persona/types.d.ts +12 -0
  186. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  187. package/dist/playbooks/service-build/facet-money.d.ts +22 -0
  188. package/dist/playbooks/service-build/facet-money.js +1 -0
  189. package/dist/playbooks/service-build/facet-money.spec.d.ts +1 -0
  190. package/dist/playbooks/service-build/facet-money.spec.js +1 -0
  191. package/dist/playbooks/service-build/machine-panorama.d.ts +3 -0
  192. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  193. package/dist/playbooks/service-build/object-panorama.d.ts +27 -27
  194. package/dist/playbooks/service-build/object-panorama.js +1 -1
  195. package/dist/playbooks/service-build/pipeline-actions.d.ts +2 -2
  196. package/dist/playbooks/service-build/pipeline-actions.js +1 -1
  197. package/dist/playbooks/service-build/risk-aggregator.d.ts +2 -1
  198. package/dist/playbooks/service-build/risk-aggregator.js +1 -1
  199. package/dist/playbooks/service-build/service-panorama.d.ts +4 -9
  200. package/dist/playbooks/service-build/service-panorama.js +1 -1
  201. package/dist/playbooks/service-build/topology-evaluation.spec.d.ts +1 -0
  202. package/dist/playbooks/service-build/topology-evaluation.spec.js +1 -0
  203. package/dist/playbooks/service-build/topology-query.d.ts +13 -2
  204. package/dist/playbooks/service-build/topology-query.js +1 -1
  205. package/dist/review/arb.d.ts +0 -2
  206. package/dist/review/arb.js +1 -1
  207. package/dist/review/order.d.ts +0 -1
  208. package/dist/review/order.js +1 -1
  209. package/dist/role/profiles.js +1 -1
  210. package/dist/rules.d.ts +1 -2
  211. package/dist/rules.js +1 -1
  212. package/dist/safety/confirm-gate.js +1 -1
  213. package/dist/schema/call/base.d.ts +3372 -668
  214. package/dist/schema/call/base.js +1 -1
  215. package/dist/schema/call/handler.js +1 -1
  216. package/dist/schema/call/receipt.d.ts +28 -0
  217. package/dist/schema/call/receipt.js +1 -0
  218. package/dist/schema/call/semantic-customer-advice.spec.d.ts +1 -0
  219. package/dist/schema/call/semantic-customer-advice.spec.js +1 -0
  220. package/dist/schema/call/semantic.d.ts +5 -2
  221. package/dist/schema/call/semantic.js +1 -1
  222. package/dist/schema/call/treasury.js +1 -1
  223. package/dist/schema/common/index.js +1 -1
  224. package/dist/schema/evaluation/index.d.ts +289 -211
  225. package/dist/schema/evaluation/index.js +1 -1
  226. package/dist/schema/goal/index.d.ts +1 -1
  227. package/dist/schema/goal/planning.d.ts +2 -2
  228. package/dist/schema/index.d.ts +0 -1
  229. package/dist/schema/index.js +1 -1
  230. package/dist/schema/industry-pack/index.d.ts +1 -1
  231. package/dist/schema/keeper/index.d.ts +1 -1
  232. package/dist/schema/local/index.js +1 -1
  233. package/dist/schema/operations.d.ts +26 -10
  234. package/dist/schema/operations.js +1 -1
  235. package/dist/schema/persona/index.d.ts +24 -24
  236. package/dist/schema/query/bi.d.ts +613 -0
  237. package/dist/schema/query/bi.js +1 -1
  238. package/dist/schema/query/index.d.ts +9 -9
  239. package/dist/schema/schema-version.js +1 -1
  240. package/dist/schema/workspace/index.d.ts +2 -2
  241. package/dist/schema-query-impl/index.js +1 -1
  242. package/dist/schemas/account_operation.output.json +1 -1
  243. package/dist/schemas/bridge_operation.output.json +1 -1
  244. package/dist/schemas/evaluation_operation.output.json +691 -163
  245. package/dist/schemas/evaluation_operation.schema.json +0 -429
  246. package/dist/schemas/index.json +1 -7
  247. package/dist/schemas/keeper_operation.output.json +1 -1
  248. package/dist/schemas/local_history_operation.output.json +1 -1
  249. package/dist/schemas/local_info_operation.output.json +1 -1
  250. package/dist/schemas/local_mark_operation.output.json +1 -1
  251. package/dist/schemas/messenger_operation.output.json +1 -1
  252. package/dist/schemas/monitor_events.output.json +1 -1
  253. package/dist/schemas/monitor_subscription.output.json +1 -1
  254. package/dist/schemas/onchain_events.output.json +1 -1
  255. package/dist/schemas/onchain_operations.output.json +6357 -3724
  256. package/dist/schemas/onchain_operations.schema.json +2 -2
  257. package/dist/schemas/onchain_operations_treasury.schema.json +2 -2
  258. package/dist/schemas/onchain_table_data.output.json +61 -71
  259. package/dist/schemas/query_toolkit.output.json +841 -8
  260. package/dist/schemas/query_toolkit.schema.json +59 -1
  261. package/dist/strategy/metrics.js +1 -1
  262. package/dist/tools/handlers/bridge.js +1 -1
  263. package/dist/tools/handlers/config.js +1 -1
  264. package/dist/tools/handlers/dispatch-expectations.d.ts +3 -0
  265. package/dist/tools/handlers/dispatch-expectations.js +1 -0
  266. package/dist/tools/handlers/evaluation.js +1 -1
  267. package/dist/tools/handlers/onchain.js +1 -1
  268. package/dist/tools/handlers/query.js +1 -1
  269. package/dist/tools/index.js +1 -1
  270. package/dist/tools/registry/evaluation.d.ts +2 -0
  271. package/dist/tools/registry/evaluation.js +1 -0
  272. package/dist/tools/registry/query.js +1 -1
  273. package/dist/tools/shared.d.ts +0 -1
  274. package/dist/tools/shared.js +1 -1
  275. package/dist/tools/wrap.js +1 -1
  276. package/package.json +4 -3
  277. package/dist/customer/customer-advice.d.ts +0 -32
  278. package/dist/customer/customer-advice.js +0 -1
  279. package/dist/customer/info-puzzle.d.ts +0 -146
  280. package/dist/customer/info-puzzle.js +0 -1
  281. package/dist/customer/order-strategy.d.ts +0 -17
  282. package/dist/customer/order-strategy.js +0 -1
  283. package/dist/customer/preorder-compare.d.ts +0 -24
  284. package/dist/customer/preorder-compare.js +0 -1
  285. package/dist/customer/reminder-system.d.ts +0 -42
  286. package/dist/customer/reminder-system.js +0 -1
  287. package/dist/customer/risk-assessment.d.ts +0 -13
  288. package/dist/customer/risk-assessment.js +0 -1
  289. package/dist/evaluation/builtins/service-risk.d.ts +0 -7
  290. package/dist/evaluation/builtins/service-risk.js +0 -1
  291. package/dist/knowledge/trust-metrics.d.ts +0 -66
  292. package/dist/knowledge/trust-metrics.js +0 -1
  293. package/dist/schema/trust/index.d.ts +0 -334
  294. package/dist/schema/trust/index.js +0 -1
  295. package/dist/schemas/trust_score.output.json +0 -847
  296. package/dist/schemas/trust_score.schema.json +0 -364
  297. package/dist/tools/handlers/trust.d.ts +0 -16
  298. package/dist/tools/handlers/trust.js +0 -1
  299. package/dist/tools/registry/trust.d.ts +0 -2
  300. package/dist/tools/registry/trust.js +0 -1
@@ -1 +1 @@
1
- import{PERSONA_MAX_LINES,PERSONA_ROLES,PERSONA_VERSION}from'./types.js';import{validateLayerOverrides}from'./overrides.js';import{normalizeTopologyFocusPref}from'../graph/onchain/strategy.js';function dedupe(a){return Array['from'](new Set(a['filter'](b=>typeof b==='string'&&b['length']>0x0)));}const OVERRIDE_RANK={'auto':0x0,'warn':0x1,'prompt':0x2,'block':0x3},MODE_SUPPRESSION_RANK={'full':0x0,'streamlined':0x1,'quiet':0x2};function stricterOverride(c,d){if(!c)return d;if(!d)return c;return OVERRIDE_RANK[c]>=OVERRIDE_RANK[d]?c:d;}function mergePolicySequence(a){const b={};for(const c of a){if(!c)continue;if(c['confirm'])b['confirm']={...b['confirm'],...c['confirm']};if(c['budget'])b['budget']={...b['budget'],...c['budget']};if(c['allowlist']!==undefined)b['allowlist']=c['allowlist'];if(c['audit']!==undefined)b['audit']=c['audit'];}return b;}function parseDailyWow(a){if(a===undefined)return undefined;if(a===null)return null;if(!/^\d+$/['test'](a['trim']()))return undefined;try{return BigInt(a['trim']());}catch{return undefined;}}function tightenPolicy(a,b){const c={},d=a['confirm']?.['mode'],e=b['confirm']?.['mode'];let f=d;if(e){if(!d)f=e;else{if(MODE_SUPPRESSION_RANK[e]<MODE_SUPPRESSION_RANK[d])f=e;}}const g=a['confirm']?.['batch_standard'],h=a['confirm']?.['session_remember'];let i=a['confirm']?.['intent_bypass'];if(b['confirm']?.['intent_bypass']===![])i=![];if(f!==undefined||g!==undefined||h!==undefined||i!==undefined){c['confirm']={};if(f!==undefined)c['confirm']['mode']=f;if(g!==undefined)c['confirm']['batch_standard']=g;if(h!==undefined)c['confirm']['session_remember']=h;if(i!==undefined)c['confirm']['intent_bypass']=i;}const j=parseDailyWow(a['budget']?.['daily_wow']),k=parseDailyWow(b['budget']?.['daily_wow']);let l=j;if(k!==undefined){if(j===undefined)l=k;else{if(j===null)l=k;else{if(k!==null)l=j<k?j:k;}}}if(l!==undefined)c['budget']={'daily_wow':l===null?null:l['toString']()};if(a['allowlist']!==undefined)c['allowlist']=a['allowlist'];const m=a['audit']===!![]||b['audit']===!![];if(m)c['audit']=!![];return c;}function clampOverrideMap(a,b){const c={...a};for(const [d,e]of Object['entries'](b)){c[d]=stricterOverride(a[d],e)??e;}return c;}function mergeSafetyControls(a){const b=new Map(),c=new Map(),d=new Map(),e=new Map(),f=(l,n)=>{let o=l['get'](n);return!o&&(o={},l['set'](n,o)),o;},g=(l,m)=>{let n=l['get'](m);return!n&&(n=[],l['set'](m,n)),n;};for(const {layer:l,part:m,group:n}of a){l['overrides']&&Object['assign'](f(m==='current'?c:b,n),l['overrides']);if(l['policy'])g(m==='current'?e:d,n)['push'](l['policy']);}const h=Array['from'](new Set(a['map'](o=>o['group'])))['sort']((o,p)=>o-p);let i={};const j=[];for(const o of h){const p=clampOverrideMap(b['get'](o)??{},c['get'](o)??{});i={...i,...p};const q=tightenPolicy(mergePolicySequence(d['get'](o)??[]),mergePolicySequence(e['get'](o)??[]));j['push'](q);}const k=mergePolicySequence(j);return{'overrides':Object['keys'](i)['length']>0x0?i:undefined,'policy':Object['keys'](k)['length']>0x0?k:undefined};}const ROLE_PROFILE_SECTIONS=['tastes','consumption','merchant','supplier','collaborator','arbitrator','demander','topology'];function isPlainObject(a){return typeof a==='object'&&a!==null&&!Array['isArray'](a);}function mergeProfileSection(c,d){if(!d)return c;const e={...c??{}};for(const [f,g]of Object['entries'](d)){const h=e[f];if(Array['isArray'](g)){const i=Array['isArray'](h)?[...h,...g]:g;e[f]=dedupe(i['filter'](j=>typeof j==='string'));}else isPlainObject(g)?e[f]=isPlainObject(h)?{...h,...g}:{...g}:e[f]=g;}return Object['keys'](e)['length']>0x0?e:undefined;}export function mergeRoleProfiles(c,d){if(!d)return c;const e={...c??{}};for(const f of ROLE_PROFILE_SECTIONS){const g=mergeProfileSection(c?.[f],d[f]);if(g)e[f]=g;}return d['preferences']&&(e['preferences']={...c?.['preferences']??{},...d['preferences']}),Object['keys'](e)['length']>0x0?e:undefined;}export function mergeProfileMaps(c,d){if(!d)return c;const e={...c??{}};for(const [f,g]of Object['entries'](d)){e[f]=mergeRoleProfiles(e[f],g);}return Object['keys'](e)['length']>0x0?e:undefined;}export function mergeLayers(a,b){const c={},d=[];for(let e=0x0;e<a['length'];e++){const f=a[e];if(!f)continue;d['push']({'layer':f,'part':b?.[e]?.['part']??'long_term','group':b?.[e]?.['group']??0x0}),f['identity']&&(c['identity']={...c['identity'],...f['identity']},f['identity']['languages']&&(c['identity']['languages']=dedupe([...c['identity']['languages']??[],...f['identity']['languages']]))),f['preferences']&&(c['preferences']={...c['preferences'],...f['preferences']}),f['strategy']&&(c['strategy']=dedupe([...c['strategy']??[],...f['strategy']])),f['rules']&&(c['rules']=dedupe([...c['rules']??[],...f['rules']])),f['requirements']&&(c['requirements']=dedupe([...c['requirements']??[],...f['requirements']])),f['spec']&&(c['spec']=[c['spec'],f['spec']]['filter'](Boolean)['join']('\x0a\x0a')),f['profiles']&&(c['profiles']=mergeProfileMaps(c['profiles'],f['profiles'])),f['analyze']?.['key_questions']?.['length']&&(c['analyze']={...c['analyze'],'key_questions':dedupe([...c['analyze']?.['key_questions']??[],...f['analyze']['key_questions']])});}if(b){const g=mergeSafetyControls(d);if(g['overrides'])c['overrides']=g['overrides'];if(g['policy'])c['policy']=g['policy'];}else for(const {layer:h}of d){if(h['overrides'])c['overrides']={...c['overrides'],...h['overrides']};if(h['policy'])c['policy']=mergePolicySequence([c['policy']??{},h['policy']]);}return c;}export function effectiveAnalyzeQuestions(a){return(a?.['analyze']?.['key_questions']??[])['slice'](0x0,0x2);}const AI_DELTA_FORBIDDEN_KEYS=['policy','overrides'];export function assertAiCurrentDelta(a){for(const b of AI_DELTA_FORBIDDEN_KEYS){if(b in a)throw new Error('AI-generated\x20persona\x20delta\x20must\x20not\x20contain\x20\x27'+b+'\x27:\x20safety\x20controls\x20are\x20user-driven\x20only\x20'+'(use\x20persona_operation\x20action=\x27set\x27\x20with\x20an\x20explicit\x20user\x20payload)');}}export function mutateLayer(a,b,c){if(c==='replace')return{...b};return mergeLayers([a,b]);}function isEmptyLayer(a){return!a||Object['keys'](a)['length']===0x0;}export function resolveEffective(a,b,c){const d=[],e=[],f=[],g=(j,k,l,m,n)=>{d['push'](k),e['push']({'part':l,'group':m}),f['push'](n==='account'?{'scope':n,'account':j['account'],'part':l}:{'scope':n,'part':l});};a&&(g(a,a['long_term'],'long_term',0x0,'system'),g(a,a['current'],'current',0x0,'system'));c&&(g(c,c['long_term'],'long_term',0x1,c['scope']),g(c,c['current'],'current',0x1,c['scope']));b&&(g(b,b['long_term'],'long_term',0x2,'account'),g(b,b['current'],'current',0x2,'account'));const h=!!b&&(!isEmptyLayer(b['long_term'])||!isEmptyLayer(b['current'])),i=h?b:c??a;return{'scope':b?'account':'system','account':b?.['account']??a?.['account'],'role':i?.['role']??'customer','industries':i?.['industries']??[],'layer':mergeLayers(d,e),'sources':f};}export function countPersonaLines(a){return JSON['stringify'](a,null,0x2)['split']('\x0a')['length'];}export function validateLayerPolicy(a,b){const d=[],e=a['policy'];if(!e)return d;const f='policy\x20('+b+')';if(e['confirm']){const g=e['confirm'];g['mode']!==undefined&&!['full','streamlined','quiet']['includes'](g['mode'])&&d['push'](f+'.confirm.mode\x20must\x20be\x20full|streamlined|quiet');for(const h of['batch_standard','intent_bypass']){g[h]!==undefined&&typeof g[h]!=='boolean'&&d['push'](f+'.confirm.'+h+'\x20must\x20be\x20a\x20boolean');}g['session_remember']!==undefined&&((!Array['isArray'](g['session_remember'])||!g['session_remember']['every'](i=>typeof i==='string'))&&d['push'](f+'.confirm.session_remember\x20must\x20be\x20an\x20array\x20of\x20strings'));}if(e['budget']?.['daily_wow']!==undefined&&e['budget']['daily_wow']!==null){const i=e['budget']['daily_wow'];(typeof i!=='string'||!/^\d+$/['test'](i['trim']()))&&d['push'](f+'.budget.daily_wow\x20must\x20be\x20a\x20decimal\x20string\x20(WOW\x20base\x20units)\x20or\x20null');}return e['allowlist']!==undefined&&((!Array['isArray'](e['allowlist'])||!e['allowlist']['every'](j=>typeof j==='string'))&&d['push'](f+'.allowlist\x20must\x20be\x20an\x20array\x20of\x20address\x20strings')),e['audit']!==undefined&&typeof e['audit']!=='boolean'&&d['push'](f+'.audit\x20must\x20be\x20a\x20boolean'),d;}const ENUM_FIELDS={'consumption.frequency':['rare','occasional','regular','frequent'],'consumption.price_band':['budget','mid','premium','luxury'],'consumption.decision_speed':['fast','deliberate','slow'],'consumption.repeat_orientation':['novelty','balanced','loyal'],'merchant.posture':['volume','balanced','margin'],'merchant.pricing_style':['competitive','value','premium','custom_quote'],'collaborator.scope_discipline':['strict','balanced','flexible'],'collaborator.notifications':['minimal','digest','realtime'],'arbitrator.response_speed':['fast','standard','thorough'],'arbitrator.ruling_style':['concise','detailed'],'demander.rfp_openness':['open','passport_gated','invite_only']},STRING_ARRAY_FIELDS=['tastes.materials','tastes.colors','tastes.styles','tastes.tags','tastes.brands','tastes.avoid','consumption.channels','consumption.notes','merchant.service_style','merchant.growth_focus','supplier.settlement_terms','supplier.categories','collaborator.advance_style','arbitrator.case_types','demander.decision_basis'],STRING_FIELDS=['consumption.avg_order_range','merchant.communication','supplier.min_order','supplier.lead_time','supplier.capacity','collaborator.working_hours','demander.pilot_budget'];function isObject(a){return typeof a==='object'&&a!==null&&!Array['isArray'](a);}export function validateLayerProfiles(a,b){const c=[],d=a['profiles'];if(!d)return c;if(!isObject(d))return c['push']('profiles\x20('+b+')\x20must\x20be\x20an\x20object\x20keyed\x20by\x20persona\x20role'),c;for(const [e,f]of Object['entries'](d)){const g='profiles.'+e+'\x20('+b+')';if(!PERSONA_ROLES['includes'](e)){c['push'](g+':\x20unknown\x20role\x20\x27'+e+'\x27');continue;}if(!isObject(f)){c['push'](g+'\x20must\x20be\x20an\x20object');continue;}for(const [h,i]of Object['entries'](f)){if(h==='preferences'){if(!isObject(i))c['push'](g+'.preferences\x20must\x20be\x20an\x20object');continue;}if(h==='topology'){const j=normalizeTopologyFocusPref(i);!j&&Object['keys'](isObject(i)?i:{})['length']>0x0&&c['push'](g+'.topology\x20has\x20no\x20valid\x20field\x20(see\x20TopologyFocusPref)');continue;}if(!ROLE_PROFILE_SECTIONS['includes'](h)){c['push'](g+':\x20unknown\x20section\x20\x27'+h+'\x27');continue;}if(!isObject(i)){c['push'](g+'.'+h+'\x20must\x20be\x20an\x20object');continue;}for(const [k,l]of Object['entries'](i)){const m=h+'.'+k,n=ENUM_FIELDS[m];if(n){(typeof l!=='string'||!n['includes'](l))&&c['push'](g+'.'+m+'\x20must\x20be\x20one\x20of:\x20'+n['join']('|'));continue;}if(STRING_ARRAY_FIELDS['includes'](m)){(!Array['isArray'](l)||!l['every'](o=>typeof o==='string'))&&c['push'](g+'.'+m+'\x20must\x20be\x20an\x20array\x20of\x20strings');continue;}if(STRING_FIELDS['includes'](m)){if(typeof l!=='string')c['push'](g+'.'+m+'\x20must\x20be\x20a\x20string');continue;}if(k==='award_weights'){(!isObject(l)||!Object['values'](l)['every'](o=>typeof o==='number'&&isFinite(o)))&&c['push'](g+'.demander.award_weights\x20must\x20be\x20an\x20object\x20of\x20finite\x20numbers');continue;}c['push'](g+'.'+m+'\x20is\x20not\x20a\x20known\x20field');}}}return c;}export function validatePersona(a){const b=[];a['version']!==PERSONA_VERSION&&b['push']('version\x20must\x20be\x20'+PERSONA_VERSION);a['scope']==='account'&&!a['account']&&b['push']('account\x20is\x20required\x20when\x20scope=account');a['scope']!=='account'&&a['account']&&b['push']('account\x20should\x20only\x20be\x20set\x20when\x20scope=account');(!a['role']||!PERSONA_ROLES['includes'](a['role']))&&b['push']('role\x20must\x20be\x20a\x20persona\x20role\x20(merchant|customer|demander|prospect|supplier|collaborator|arbitrator)');!Array['isArray'](a['industries'])&&b['push']('industries\x20must\x20be\x20an\x20array');b['push'](...validateLayerOverrides(a['long_term'])),b['push'](...validateLayerOverrides(a['current'])),b['push'](...validateLayerPolicy(a['long_term'],'long_term')),b['push'](...validateLayerPolicy(a['current'],'current')),b['push'](...validateLayerProfiles(a['long_term'],'long_term')),b['push'](...validateLayerProfiles(a['current'],'current'));const c=countPersonaLines(a);return c>PERSONA_MAX_LINES&&b['push']('persona\x20is\x20'+c+'\x20lines\x20(max\x20'+PERSONA_MAX_LINES+')'),b;}export function emptyPersona(a,b,c,d){return{'version':PERSONA_VERSION,'scope':a,'account':b,'role':c,'industries':d,'long_term':{},'current':{},'updated_at':Date['now']()};}
1
+ import{PERSONA_MAX_LINES,PERSONA_ROLES,PERSONA_VERSION}from'./types.js';import{validateLayerOverrides}from'./overrides.js';import{normalizeTopologyFocusPref}from'../graph/onchain/strategy.js';function dedupe(a){return Array['from'](new Set(a['filter'](b=>typeof b==='string'&&b['length']>0x0)));}const OVERRIDE_RANK={'auto':0x0,'warn':0x1,'prompt':0x2,'block':0x3},MODE_SUPPRESSION_RANK={'full':0x0,'streamlined':0x1,'quiet':0x2};function stricterOverride(c,d){if(!c)return d;if(!d)return c;return OVERRIDE_RANK[c]>=OVERRIDE_RANK[d]?c:d;}function mergePolicySequence(a){const b={};for(const c of a){if(!c)continue;if(c['confirm'])b['confirm']={...b['confirm'],...c['confirm']};if(c['budget'])b['budget']={...b['budget'],...c['budget']};if(c['allowlist']!==undefined)b['allowlist']=c['allowlist'];if(c['audit']!==undefined)b['audit']=c['audit'];}return b;}function parseDailyWow(a){if(a===undefined)return undefined;if(a===null)return null;if(!/^\d+$/['test'](a['trim']()))return undefined;try{return BigInt(a['trim']());}catch{return undefined;}}function tightenPolicy(a,b){const c={},d=a['confirm']?.['mode'],e=b['confirm']?.['mode'];let f=d;if(e){if(!d)f=e;else{if(MODE_SUPPRESSION_RANK[e]<MODE_SUPPRESSION_RANK[d])f=e;}}const g=a['confirm']?.['batch_standard'],h=a['confirm']?.['session_remember'];let i=a['confirm']?.['intent_bypass'];if(b['confirm']?.['intent_bypass']===![])i=![];if(f!==undefined||g!==undefined||h!==undefined||i!==undefined){c['confirm']={};if(f!==undefined)c['confirm']['mode']=f;if(g!==undefined)c['confirm']['batch_standard']=g;if(h!==undefined)c['confirm']['session_remember']=h;if(i!==undefined)c['confirm']['intent_bypass']=i;}const j=parseDailyWow(a['budget']?.['daily_wow']),k=parseDailyWow(b['budget']?.['daily_wow']);let l=j;if(k!==undefined){if(j===undefined)l=k;else{if(j===null)l=k;else{if(k!==null)l=j<k?j:k;}}}if(l!==undefined)c['budget']={'daily_wow':l===null?null:l['toString']()};if(a['allowlist']!==undefined)c['allowlist']=a['allowlist'];const m=a['audit']===!![]||b['audit']===!![];if(m)c['audit']=!![];return c;}function clampOverrideMap(a,b){const c={...a};for(const [d,e]of Object['entries'](b)){c[d]=stricterOverride(a[d],e)??e;}return c;}function mergeSafetyControls(a){const b=new Map(),c=new Map(),d=new Map(),e=new Map(),f=(l,n)=>{let o=l['get'](n);return!o&&(o={},l['set'](n,o)),o;},g=(l,m)=>{let n=l['get'](m);return!n&&(n=[],l['set'](m,n)),n;};for(const {layer:l,part:m,group:n}of a){l['overrides']&&Object['assign'](f(m==='current'?c:b,n),l['overrides']);if(l['policy'])g(m==='current'?e:d,n)['push'](l['policy']);}const h=Array['from'](new Set(a['map'](o=>o['group'])))['sort']((o,p)=>o-p);let i={};const j=[];for(const o of h){const p=clampOverrideMap(b['get'](o)??{},c['get'](o)??{});i={...i,...p};const q=tightenPolicy(mergePolicySequence(d['get'](o)??[]),mergePolicySequence(e['get'](o)??[]));j['push'](q);}const k=mergePolicySequence(j);return{'overrides':Object['keys'](i)['length']>0x0?i:undefined,'policy':Object['keys'](k)['length']>0x0?k:undefined};}const ROLE_PROFILE_SECTIONS=['tastes','consumption','merchant','supplier','collaborator','arbitrator','demander','topology'];function isPlainObject(a){return typeof a==='object'&&a!==null&&!Array['isArray'](a);}function mergeProfileSection(c,d){if(!d)return c;const e={...c??{}};for(const [f,g]of Object['entries'](d)){const h=e[f];if(Array['isArray'](g)){const i=Array['isArray'](h)?[...h,...g]:g;e[f]=dedupe(i['filter'](j=>typeof j==='string'));}else isPlainObject(g)?e[f]=isPlainObject(h)?{...h,...g}:{...g}:e[f]=g;}return Object['keys'](e)['length']>0x0?e:undefined;}export function mergeRoleProfiles(c,d){if(!d)return c;const e={...c??{}};for(const f of ROLE_PROFILE_SECTIONS){const g=mergeProfileSection(c?.[f],d[f]);if(g)e[f]=g;}return d['preferences']&&(e['preferences']={...c?.['preferences']??{},...d['preferences']}),Object['keys'](e)['length']>0x0?e:undefined;}export function mergeProfileMaps(c,d){if(!d)return c;const e={...c??{}};for(const [f,g]of Object['entries'](d)){e[f]=mergeRoleProfiles(e[f],g);}return Object['keys'](e)['length']>0x0?e:undefined;}export function mergeFacetSettings(c,d){if(!d)return c;const e={...c??{}};for(const [f,g]of Object['entries'](d)){const h=e[f]??{},i={...g['visible']!==undefined?{'visible':g['visible']}:{},...g['order']!==undefined?{'order':g['order']}:{},...g['weight']!==undefined?{'weight':g['weight']}:{},...g['threshold']!==undefined?{'threshold':g['threshold']}:{}},j={...h['visible']!==undefined&&i['visible']===undefined?{'visible':h['visible']}:{},...h['order']!==undefined&&i['order']===undefined?{'order':h['order']}:{},...h['weight']!==undefined&&i['weight']===undefined?{'weight':h['weight']}:{},...h['threshold']!==undefined&&i['threshold']===undefined?{'threshold':h['threshold']}:{},...i};e[f]=j;}return Object['keys'](e)['length']>0x0?e:undefined;}export function mergeLayers(a,b){const c={},d=[];for(let e=0x0;e<a['length'];e++){const f=a[e];if(!f)continue;d['push']({'layer':f,'part':b?.[e]?.['part']??'long_term','group':b?.[e]?.['group']??0x0}),f['identity']&&(c['identity']={...c['identity'],...f['identity']},f['identity']['languages']&&(c['identity']['languages']=dedupe([...c['identity']['languages']??[],...f['identity']['languages']]))),f['preferences']&&(c['preferences']={...c['preferences'],...f['preferences']}),f['strategy']&&(c['strategy']=dedupe([...c['strategy']??[],...f['strategy']])),f['rules']&&(c['rules']=dedupe([...c['rules']??[],...f['rules']])),f['requirements']&&(c['requirements']=dedupe([...c['requirements']??[],...f['requirements']])),f['spec']&&(c['spec']=[c['spec'],f['spec']]['filter'](Boolean)['join']('\x0a\x0a')),f['profiles']&&(c['profiles']=mergeProfileMaps(c['profiles'],f['profiles'])),f['analyze']?.['key_questions']?.['length']&&(c['analyze']={...c['analyze'],'key_questions':dedupe([...c['analyze']?.['key_questions']??[],...f['analyze']['key_questions']])}),f['evaluation']&&(c['evaluation']={...c['evaluation'],'weights':{...c['evaluation']?.['weights']??{},...f['evaluation']['weights']},...f['evaluation']['facets']?{'facets':mergeFacetSettings(c['evaluation']?.['facets'],f['evaluation']['facets'])}:{}});}if(b){const g=mergeSafetyControls(d);if(g['overrides'])c['overrides']=g['overrides'];if(g['policy'])c['policy']=g['policy'];}else for(const {layer:h}of d){if(h['overrides'])c['overrides']={...c['overrides'],...h['overrides']};if(h['policy'])c['policy']=mergePolicySequence([c['policy']??{},h['policy']]);}return c;}export function effectiveAnalyzeQuestions(a){return(a?.['analyze']?.['key_questions']??[])['slice'](0x0,0x2);}const AI_DELTA_FORBIDDEN_KEYS=['policy','overrides'];export function assertAiCurrentDelta(a){for(const b of AI_DELTA_FORBIDDEN_KEYS){if(b in a)throw new Error('AI-generated\x20persona\x20delta\x20must\x20not\x20contain\x20\x27'+b+'\x27:\x20safety\x20controls\x20are\x20user-driven\x20only\x20'+'(use\x20persona_operation\x20action=\x27set\x27\x20with\x20an\x20explicit\x20user\x20payload)');}}export function mutateLayer(a,b,c){if(c==='replace')return{...b};return mergeLayers([a,b]);}function isEmptyLayer(a){return!a||Object['keys'](a)['length']===0x0;}export function resolveEffective(a,b,c){const d=[],e=[],f=[],g=(j,k,l,m,n)=>{d['push'](k),e['push']({'part':l,'group':m}),f['push'](n==='account'?{'scope':n,'account':j['account'],'part':l}:{'scope':n,'part':l});};a&&(g(a,a['long_term'],'long_term',0x0,'system'),g(a,a['current'],'current',0x0,'system'));c&&(g(c,c['long_term'],'long_term',0x1,c['scope']),g(c,c['current'],'current',0x1,c['scope']));b&&(g(b,b['long_term'],'long_term',0x2,'account'),g(b,b['current'],'current',0x2,'account'));const h=!!b&&(!isEmptyLayer(b['long_term'])||!isEmptyLayer(b['current'])),i=h?b:c??a;return{'scope':b?'account':'system','account':b?.['account']??a?.['account'],'role':i?.['role']??'customer','industries':i?.['industries']??[],'layer':mergeLayers(d,e),'sources':f};}export function countPersonaLines(a){return JSON['stringify'](a,null,0x2)['split']('\x0a')['length'];}export function validateLayerPolicy(a,b){const d=[],e=a['policy'];if(!e)return d;const f='policy\x20('+b+')';if(e['confirm']){const g=e['confirm'];g['mode']!==undefined&&!['full','streamlined','quiet']['includes'](g['mode'])&&d['push'](f+'.confirm.mode\x20must\x20be\x20full|streamlined|quiet');for(const h of['batch_standard','intent_bypass']){g[h]!==undefined&&typeof g[h]!=='boolean'&&d['push'](f+'.confirm.'+h+'\x20must\x20be\x20a\x20boolean');}g['session_remember']!==undefined&&((!Array['isArray'](g['session_remember'])||!g['session_remember']['every'](i=>typeof i==='string'))&&d['push'](f+'.confirm.session_remember\x20must\x20be\x20an\x20array\x20of\x20strings'));}if(e['budget']?.['daily_wow']!==undefined&&e['budget']['daily_wow']!==null){const i=e['budget']['daily_wow'];(typeof i!=='string'||!/^\d+$/['test'](i['trim']()))&&d['push'](f+'.budget.daily_wow\x20must\x20be\x20a\x20decimal\x20string\x20(WOW\x20base\x20units)\x20or\x20null');}return e['allowlist']!==undefined&&((!Array['isArray'](e['allowlist'])||!e['allowlist']['every'](j=>typeof j==='string'))&&d['push'](f+'.allowlist\x20must\x20be\x20an\x20array\x20of\x20address\x20strings')),e['audit']!==undefined&&typeof e['audit']!=='boolean'&&d['push'](f+'.audit\x20must\x20be\x20a\x20boolean'),d;}const ENUM_FIELDS={'consumption.frequency':['rare','occasional','regular','frequent'],'consumption.price_band':['budget','mid','premium','luxury'],'consumption.decision_speed':['fast','deliberate','slow'],'consumption.repeat_orientation':['novelty','balanced','loyal'],'merchant.posture':['volume','balanced','margin'],'merchant.pricing_style':['competitive','value','premium','custom_quote'],'collaborator.scope_discipline':['strict','balanced','flexible'],'collaborator.notifications':['minimal','digest','realtime'],'arbitrator.response_speed':['fast','standard','thorough'],'arbitrator.ruling_style':['concise','detailed'],'demander.rfp_openness':['open','passport_gated','invite_only']},STRING_ARRAY_FIELDS=['tastes.materials','tastes.colors','tastes.styles','tastes.tags','tastes.brands','tastes.avoid','consumption.channels','consumption.notes','merchant.service_style','merchant.growth_focus','supplier.settlement_terms','supplier.categories','collaborator.advance_style','arbitrator.case_types','demander.decision_basis'],STRING_FIELDS=['consumption.avg_order_range','merchant.communication','supplier.min_order','supplier.lead_time','supplier.capacity','collaborator.working_hours','demander.pilot_budget'];function isObject(a){return typeof a==='object'&&a!==null&&!Array['isArray'](a);}export function validateLayerProfiles(a,b){const c=[],d=a['profiles'];if(!d)return c;if(!isObject(d))return c['push']('profiles\x20('+b+')\x20must\x20be\x20an\x20object\x20keyed\x20by\x20persona\x20role'),c;for(const [e,f]of Object['entries'](d)){const g='profiles.'+e+'\x20('+b+')';if(!PERSONA_ROLES['includes'](e)){c['push'](g+':\x20unknown\x20role\x20\x27'+e+'\x27');continue;}if(!isObject(f)){c['push'](g+'\x20must\x20be\x20an\x20object');continue;}for(const [h,i]of Object['entries'](f)){if(h==='preferences'){if(!isObject(i))c['push'](g+'.preferences\x20must\x20be\x20an\x20object');continue;}if(h==='topology'){const j=normalizeTopologyFocusPref(i);!j&&Object['keys'](isObject(i)?i:{})['length']>0x0&&c['push'](g+'.topology\x20has\x20no\x20valid\x20field\x20(see\x20TopologyFocusPref)');continue;}if(!ROLE_PROFILE_SECTIONS['includes'](h)){c['push'](g+':\x20unknown\x20section\x20\x27'+h+'\x27');continue;}if(!isObject(i)){c['push'](g+'.'+h+'\x20must\x20be\x20an\x20object');continue;}for(const [k,l]of Object['entries'](i)){const m=h+'.'+k,n=ENUM_FIELDS[m];if(n){(typeof l!=='string'||!n['includes'](l))&&c['push'](g+'.'+m+'\x20must\x20be\x20one\x20of:\x20'+n['join']('|'));continue;}if(STRING_ARRAY_FIELDS['includes'](m)){(!Array['isArray'](l)||!l['every'](o=>typeof o==='string'))&&c['push'](g+'.'+m+'\x20must\x20be\x20an\x20array\x20of\x20strings');continue;}if(STRING_FIELDS['includes'](m)){if(typeof l!=='string')c['push'](g+'.'+m+'\x20must\x20be\x20a\x20string');continue;}if(k==='award_weights'){(!isObject(l)||!Object['values'](l)['every'](o=>typeof o==='number'&&isFinite(o)))&&c['push'](g+'.demander.award_weights\x20must\x20be\x20an\x20object\x20of\x20finite\x20numbers');continue;}c['push'](g+'.'+m+'\x20is\x20not\x20a\x20known\x20field');}}}return c;}export function validatePersona(a){const b=[];a['version']!==PERSONA_VERSION&&b['push']('version\x20must\x20be\x20'+PERSONA_VERSION);a['scope']==='account'&&!a['account']&&b['push']('account\x20is\x20required\x20when\x20scope=account');a['scope']!=='account'&&a['account']&&b['push']('account\x20should\x20only\x20be\x20set\x20when\x20scope=account');(!a['role']||!PERSONA_ROLES['includes'](a['role']))&&b['push']('role\x20must\x20be\x20a\x20persona\x20role\x20(merchant|customer|demander|prospect|supplier|collaborator|arbitrator)');!Array['isArray'](a['industries'])&&b['push']('industries\x20must\x20be\x20an\x20array');b['push'](...validateLayerOverrides(a['long_term'])),b['push'](...validateLayerOverrides(a['current'])),b['push'](...validateLayerPolicy(a['long_term'],'long_term')),b['push'](...validateLayerPolicy(a['current'],'current')),b['push'](...validateLayerProfiles(a['long_term'],'long_term')),b['push'](...validateLayerProfiles(a['current'],'current'));const c=countPersonaLines(a);return c>PERSONA_MAX_LINES&&b['push']('persona\x20is\x20'+c+'\x20lines\x20(max\x20'+PERSONA_MAX_LINES+')'),b;}export function emptyPersona(a,b,c,d){return{'version':PERSONA_VERSION,'scope':a,'account':b,'role':c,'industries':d,'long_term':{},'current':{},'updated_at':Date['now']()};}
@@ -1,9 +1,8 @@
1
- import type { Industry, PersonaRole } from "./types.js";
1
+ import type { Industry, PersonaEvaluationStandards, PersonaRole } from "./types.js";
2
2
  import type { PersonaDrive } from "../evaluation/game-strategy.js";
3
3
  import { type StrategyFragment, type TopologyFocusPref, type TopologyIntent } from "../graph/onchain/strategy.js";
4
4
  export interface RoleTopologyDefault {
5
5
  intents: TopologyIntent[];
6
- fragment?: StrategyFragment;
7
6
  rationale: string;
8
7
  }
9
8
  export declare const ROLE_TOPOLOGY_DEFAULTS: Record<PersonaRole, RoleTopologyDefault>;
@@ -19,6 +18,7 @@ export interface ResolvedTopologyContext {
19
18
  personaPref?: TopologyFocusPref;
20
19
  drive?: PersonaDrive;
21
20
  personaRole?: PersonaRole;
21
+ evaluation?: PersonaEvaluationStandards;
22
22
  }
23
23
  export declare function resolveTopologyContext(params: {
24
24
  account?: string;
@@ -1 +1 @@
1
- import{getEffectivePersona}from'./index.js';import{INTENT_PRESETS,isTopologyIntent,normalizeTopologyFocusPref}from'../graph/onchain/strategy.js';export const ROLE_TOPOLOGY_DEFAULTS={'customer':{'intents':['order_health','counterparty'],'rationale':'track\x20own\x20orders\x20to\x20completion\x20and\x20know\x20who\x20is\x20on\x20the\x20other\x20side'},'prospect':{'intents':['counterparty','reputation','fund_flow'],'rationale':'pre-order\x20due\x20diligence:\x20seller\x20credibility,\x20fund\x20safety,\x20social\x20proof'},'merchant':{'intents':['order_health','supply_chain'],'rationale':'track\x20incoming\x20orders\x20and\x20the\x20settlement\x20waterfall\x20of\x20each'},'supplier':{'intents':['supply_chain','workflow'],'rationale':'sub-order\x20settlement\x20structure\x20and\x20the\x20process\x20it\x20hangs\x20on'},'collaborator':{'intents':['workflow','permission'],'rationale':'which\x20forwards\x20exist\x20and\x20what\x20is\x20within\x20own\x20permission\x20scope'},'arbitrator':{'intents':['arbitration','reputation'],'rationale':'cases\x20at\x20hand\x20plus\x20the\x20parties\x27\x20track\x20record'},'demander':{'intents':['demand_match','counterparty'],'rationale':'evaluate\x20presenters\x20against\x20the\x20demand\x20and\x20know\x20who\x20they\x20are'}};export const INDUSTRY_TOPOLOGY_DEFAULTS={'freelance':{'label':'freelance','familyDepths':{'W':0x4,'M':0x3},'tableEdges':['machine.node']},'rental':{'label':'rental','familyDepths':{'M':0x4,'W':0x2}},'education':{'label':'education','familyDepths':{'W':0x4,'M':0x2},'tableEdges':['machine.node']},'travel':{'label':'travel','familyDepths':{'W':0x4,'M':0x3},'tableEdges':['machine.node']},'subscription':{'label':'subscription','familyDepths':{'M':0x3,'W':0x2}},'retail':{'label':'retail','familyDepths':{'M':0x3}}};export function getIndustryTopologyTemplate(a){if(!a)return undefined;return INDUSTRY_TOPOLOGY_DEFAULTS[a];}export async function resolvePersonaTopologyFocus(a,b,c){try{const d=await getEffectivePersona(a,b,c),e=c??d['role'],f=d['layer']['profiles']?.[e]?.['topology'];if(f===undefined)return undefined;return normalizeTopologyFocusPref(f)??undefined;}catch{return undefined;}}export async function resolveTopologyContext(a){const b=a['role']?ROLE_TOPOLOGY_DEFAULTS[a['role']]:undefined,c=getIndustryTopologyTemplate(a['industry']);let d,e,f;try{const g=await getEffectivePersona(a['account'],a['industry'],a['role']),h=a['role']??g['role'];f=h;const i=g['layer']['profiles']?.[h]?.['topology'];if(i!==undefined)d=normalizeTopologyFocusPref(i)??undefined;const j=g['layer']['preferences']?.['risk_appetite'],k=j==='conservative'||j==='balanced'||j==='aggressive'?j:undefined,l=g['layer']['requirements'];(k!=null||(l?.['length']??0x0)>0x0)&&(e={...k!=null?{'risk_appetite':k}:{},...l?.['length']?{'requirements':l}:{}});}catch{}return{'roleDefault':b,'industryTemplate':c,'personaPref':d,'drive':e,...f?{'personaRole':f}:{}};}export function describeIntents(){return Object['entries'](INTENT_PRESETS)['map'](([a,b])=>{const c=b['families']?'\x20families\x20'+b['families']['join']('/'):'',d=b['familyDepths']?'\x20depths\x20'+Object['entries'](b['familyDepths'])['map'](([e,g])=>e+'≤'+g)['join']('\x20'):'';return a+':\x20'+b['description']+c+d;});}export function assertIntent(a){if(!isTopologyIntent(a))throw new Error('unknown\x20topology\x20intent\x20\x27'+a+'\x27\x20(valid:\x20'+Object['keys'](INTENT_PRESETS)['join'](',\x20')+')');return a;}
1
+ import{getEffectivePersona}from'./index.js';import{INTENT_PRESETS,isTopologyIntent,normalizeTopologyFocusPref}from'../graph/onchain/strategy.js';export const ROLE_TOPOLOGY_DEFAULTS={'customer':{'intents':['order_health','counterparty'],'rationale':'track\x20own\x20orders\x20to\x20completion\x20and\x20know\x20who\x20is\x20on\x20the\x20other\x20side'},'prospect':{'intents':['counterparty','reputation','fund_flow'],'rationale':'pre-order\x20due\x20diligence:\x20seller\x20credibility,\x20fund\x20safety,\x20social\x20proof'},'merchant':{'intents':['order_health','supply_chain'],'rationale':'track\x20incoming\x20orders\x20and\x20the\x20settlement\x20waterfall\x20of\x20each'},'supplier':{'intents':['supply_chain','workflow'],'rationale':'sub-order\x20settlement\x20structure\x20and\x20the\x20process\x20it\x20hangs\x20on'},'collaborator':{'intents':['workflow','permission'],'rationale':'which\x20forwards\x20exist\x20and\x20what\x20is\x20within\x20own\x20permission\x20scope'},'arbitrator':{'intents':['arbitration','reputation'],'rationale':'cases\x20at\x20hand\x20plus\x20the\x20parties\x27\x20track\x20record'},'demander':{'intents':['demand_match','counterparty'],'rationale':'evaluate\x20presenters\x20against\x20the\x20demand\x20and\x20know\x20who\x20they\x20are'}};export const INDUSTRY_TOPOLOGY_DEFAULTS={'freelance':{'label':'freelance','familyDepths':{'W':0x4,'M':0x3},'tableEdges':['machine.node']},'rental':{'label':'rental','familyDepths':{'M':0x4,'W':0x2}},'education':{'label':'education','familyDepths':{'W':0x4,'M':0x2},'tableEdges':['machine.node']},'travel':{'label':'travel','familyDepths':{'W':0x4,'M':0x3},'tableEdges':['machine.node']},'subscription':{'label':'subscription','familyDepths':{'M':0x3,'W':0x2}},'retail':{'label':'retail','familyDepths':{'M':0x3}}};export function getIndustryTopologyTemplate(a){if(!a)return undefined;return INDUSTRY_TOPOLOGY_DEFAULTS[a];}export async function resolvePersonaTopologyFocus(a,b,c){try{const d=await getEffectivePersona(a,b,c),e=c??d['role'],f=d['layer']['profiles']?.[e]?.['topology'];if(f===undefined)return undefined;return normalizeTopologyFocusPref(f)??undefined;}catch{return undefined;}}export async function resolveTopologyContext(a){const b=a['role']?ROLE_TOPOLOGY_DEFAULTS[a['role']]:undefined,c=getIndustryTopologyTemplate(a['industry']);let d,e,f,g;try{const h=await getEffectivePersona(a['account'],a['industry'],a['role']),i=a['role']??h['role'];f=i,g=h['layer']['evaluation'];const j=h['layer']['profiles']?.[i]?.['topology'];if(j!==undefined)d=normalizeTopologyFocusPref(j)??undefined;const k=h['layer']['preferences']?.['risk_appetite'],l=k==='conservative'||k==='balanced'||k==='aggressive'?k:undefined,m=h['layer']['requirements'];(l!=null||(m?.['length']??0x0)>0x0)&&(e={...l!=null?{'risk_appetite':l}:{},...m?.['length']?{'requirements':m}:{}});}catch{}return{'roleDefault':b,'industryTemplate':c,'personaPref':d,'drive':e,...f?{'personaRole':f}:{},...g?{'evaluation':g}:{}};}export function describeIntents(){return Object['entries'](INTENT_PRESETS)['map'](([a,b])=>{const c=b['families']?'\x20families\x20'+b['families']['join']('/'):'',d=b['familyDepths']?'\x20depths\x20'+Object['entries'](b['familyDepths'])['map'](([e,g])=>e+'≤'+g)['join']('\x20'):'';return a+':\x20'+b['description']+c+d;});}export function assertIntent(a){if(!isTopologyIntent(a))throw new Error('unknown\x20topology\x20intent\x20\x27'+a+'\x27\x20(valid:\x20'+Object['keys'](INTENT_PRESETS)['join'](',\x20')+')');return a;}
@@ -96,6 +96,18 @@ export interface PersonaLayer {
96
96
  policy?: PersonaPolicy;
97
97
  profiles?: Partial<Record<PersonaRole, RoleProfile>>;
98
98
  analyze?: PersonaAnalyzeDefaults;
99
+ evaluation?: PersonaEvaluationStandards;
100
+ }
101
+ export interface PersonaEvaluationStandards {
102
+ weights?: Record<string, number>;
103
+ facets?: PersonaFacetSettings;
104
+ }
105
+ export type PersonaFacetSettings = Record<string, PersonaFacetSetting>;
106
+ export interface PersonaFacetSetting {
107
+ visible?: boolean;
108
+ order?: number;
109
+ weight?: number;
110
+ threshold?: number;
99
111
  }
100
112
  export interface PersonaAnalyzeDefaults {
101
113
  key_questions?: string[];
@@ -1 +1 @@
1
- import{initServicePuzzleFromIntent,initMachinePuzzleFromIntent,initAllocationPuzzleFromIntent,initTreasuryPuzzleFromIntent,initArbitrationPuzzleFromIntent,initRewardPuzzleFromIntent,initProgressPuzzleFromIntent,initOrderPuzzleFromIntent,initPuzzleFromIntent as a243a,checkServicePuzzleCompleteness,checkMachinePuzzleCompleteness,checkAllocationPuzzleCompleteness,checkTreasuryPuzzleCompleteness,checkArbitrationPuzzleCompleteness,checkRewardPuzzleCompleteness,checkProgressPuzzleCompleteness,checkOrderPuzzleCompleteness,checkPuzzleCompleteness as a243b}from'../../knowledge/index.js';import{initPuzzleFromIntent as a243c,checkPuzzleCompleteness as a243d}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(a243c,{'primary_goal':c}),'check':c=>b(c,a243d)},'guard':{'init':c=>a(a243a,{'primary_goal':c}),'check':c=>b(c,a243b)}};}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','machine','guard','allocation','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 a272a,checkServicePuzzleCompleteness,checkMachinePuzzleCompleteness,checkAllocationPuzzleCompleteness,checkTreasuryPuzzleCompleteness,checkArbitrationPuzzleCompleteness,checkRewardPuzzleCompleteness,checkProgressPuzzleCompleteness,checkOrderPuzzleCompleteness,checkPuzzleCompleteness as a272b}from'../../knowledge/index.js';import{initPuzzleFromIntent as a272c,checkPuzzleCompleteness as a272d}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(a272c,{'primary_goal':c}),'check':c=>b(c,a272d)},'guard':{'init':c=>a(a272a,{'primary_goal':c}),'check':c=>b(c,a272b)}};}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','machine','guard','allocation','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.';}
@@ -0,0 +1,22 @@
1
+ import { type ENTRYPOINT } from "@wowok/wowok";
2
+ import { type ChainValueDisplay } from "../../knowledge/fund-layer.js";
3
+ import type { FacetMoney } from "../../graph/onchain/facet-projection.js";
4
+ export type CoinResolver = (coinType: string, network?: ENTRYPOINT) => Promise<ChainValueDisplay | undefined>;
5
+ export interface AnnotatableFacet {
6
+ amounts?: Array<{
7
+ key: string;
8
+ label: string;
9
+ money: FacetMoney;
10
+ }>;
11
+ evidence: string[];
12
+ }
13
+ export declare function withMinDecimals(text: string, min?: number): string;
14
+ export interface MoneyAnnotation {
15
+ display: string;
16
+ tip: string;
17
+ precision_known: boolean;
18
+ symbol?: string;
19
+ decimals?: number;
20
+ }
21
+ export declare function formatMoneyAnnotation(raw: string | null | undefined, coinType: string | null | undefined, network?: ENTRYPOINT): Promise<MoneyAnnotation>;
22
+ export declare function annotateFacetMoney(items: AnnotatableFacet[], network?: ENTRYPOINT, resolve?: CoinResolver): Promise<void>;
@@ -0,0 +1 @@
1
+ import{formatUnits}from'@wowok/wowok';import{formatChainValue}from'../../knowledge/fund-layer.js';const defaultCoinResolver=async(a,b)=>{try{return await formatChainValue('0',a,b);}catch{return undefined;}};function unknownCoinTip(a){return'Raw\x20smallest\x20units\x20—\x20token\x20precision\x20unavailable\x20for\x20'+a+';\x20this\x20is\x20NOT\x20a\x20unit\x20value\x20'+'(unit\x20=\x20raw\x20/\x2010^N\x20once\x20decimals\x20N\x20are\x20known).';}export function withMinDecimals(a,b=0x2){const c=a['indexOf']('.');if(c<0x0)return a+'.'+'0'['repeat'](b);const d=a['length']-c-0x1;return d<b?a+'0'['repeat'](b-d):a;}export async function formatMoneyAnnotation(a,b,c){if(a===null||a===undefined||a==='')return{'display':'','tip':'','precision_known':![]};if(!b)return{'display':a,'tip':unknownCoinTip('unknown\x20coin\x20(payment\x20token\x20unresolved)'),'precision_known':![]};try{const d=await formatChainValue(a,b,c);if(d['precision_known']){const e=withMinDecimals(d['display']);return{'display':d['symbol']?e+'\x20'+d['symbol']:e,'tip':d['text'],'precision_known':!![],...d['symbol']?{'symbol':d['symbol']}:{},...d['decimals']!==undefined?{'decimals':d['decimals']}:{}};}return{'display':a,'tip':unknownCoinTip(b),'precision_known':![]};}catch{return{'display':a,'tip':unknownCoinTip(b),'precision_known':![]};}}export async function annotateFacetMoney(a,b,c=defaultCoinResolver){const d=new Map(),e=f=>{const g=d['get'](f);if(g)return g;const h=c(f,b)['then'](i=>i?{'precisionKnown':i['precision_known'],...i['precision_known']&&i['decimals']!==undefined?{'decimals':i['decimals'],'symbol':i['symbol']}:{}}:undefined);return d['set'](f,h),h;};for(const f of a){if(!f['amounts']?.['length'])continue;const g=new Map();for(const h of f['amounts']){const i=h['money'];let j=i['raw'];if(!i['coin_type']){g['set'](h['key'],j);continue;}let k;try{k=await e(i['coin_type']);}catch{k=undefined;}if(k?.['precisionKnown']&&k['decimals']!==undefined){let l=i['raw'];try{l=withMinDecimals(formatUnits(BigInt(i['raw']),k['decimals']));}catch{}i['display']=l,i['decimals']=k['decimals'];if(k['symbol'])i['symbol']=k['symbol'];i['precision_known']=!![],j=k['symbol']?l+'\x20'+k['symbol']:l;}else i['precision_known']=![],i['tip']=unknownCoinTip(i['coin_type']),j=i['raw'];g['set'](h['key'],j);}g['size']>0x0&&(f['evidence']=f['evidence']['map'](n=>n['replace'](/\{(\w+)\}/g,(o,p)=>g['get'](p)??'{'+p+'}')));}}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{describe,expect,it,vi}from'vitest';import{annotateFacetMoney}from'./facet-money.js';const WOW='0x2::wow::WOW',USDT='0x2::wow::coins::USDT',XYZ='0x99::meme::XYZ';function display(a,b,c,d){return{'raw':'0','display':'0','token_type':a,'precision_known':b,...c?{'symbol':c}:{},...d!==undefined?{'decimals':d}:{},'text':''};}function facet(a,b,c){return{'id':a,'label':a,'question':'q','state':'present','evidence':c,...b?{'amounts':b}:{}};}describe('annotateFacetMoney',()=>{it('resolves\x20each\x20coin\x20type\x20once\x20and\x20converts\x20with\x20a\x20two-decimal\x20floor',async()=>{const c=vi['fn'](async i=>{if(i===WOW)return display(WOW,!![],'WOW',0x9);if(i===USDT)return display(USDT,!![],'USDT',0x6);return display(i,![]);}),d=[facet('fund_safety',[{'key':'a','label':'A','money':{'raw':'2000000000','coin_type':WOW,'precision_known':![]}},{'key':'b','label':'B','money':{'raw':'200000000','coin_type':WOW,'precision_known':![]}}],['price\x20{a}\x20and\x20{b}']),facet('offering_price',[{'key':'p','label':'P','money':{'raw':'1500000','coin_type':USDT,'precision_known':![]}},{'key':'x','label':'X','money':{'raw':'7','coin_type':XYZ,'precision_known':![]}}],['offer\x20{p};\x20unknown\x20{x}'])];await annotateFacetMoney(d,undefined,c),expect(c)['toHaveBeenCalledTimes'](0x3),expect(c)['toHaveBeenCalledWith'](WOW,undefined),expect(c)['toHaveBeenCalledWith'](XYZ,undefined);const [e,f]=[d[0x0]['amounts'][0x0]['money'],d[0x0]['amounts'][0x1]['money']];expect(e)['toMatchObject']({'raw':'2000000000','display':'2.00','symbol':'WOW','decimals':0x9,'precision_known':!![]}),expect(f['display'])['toBe']('0.20'),expect(d[0x0]['evidence'][0x0])['toBe']('price\x202.00\x20WOW\x20and\x200.20\x20WOW');const g=d[0x1]['amounts'][0x0]['money'];expect(g['display'])['toBe']('1.50'),expect(d[0x1]['evidence'][0x0])['toContain']('offer\x201.50\x20USDT');const h=d[0x1]['amounts'][0x1]['money'];expect(h['precision_known'])['toBe'](![]),expect(h['display'])['toBeUndefined'](),expect(h['tip'])['toContain'](XYZ),expect(d[0x1]['evidence'][0x0])['toContain']('unknown\x207');}),it('keeps\x20micro\x20fractions\x20exact\x20beyond\x20the\x20two-decimal\x20floor',async()=>{const a=vi['fn'](async()=>display(WOW,!![],'WOW',0x9)),b=[facet('fund_safety',[{'key':'m','label':'M','money':{'raw':'1','coin_type':WOW,'precision_known':![]}}],['{m}'])];await annotateFacetMoney(b,undefined,a),expect(b[0x0]['amounts'][0x0]['money']['display'])['toBe']('0.000000001'),expect(b[0x0]['evidence'][0x0])['toBe']('0.000000001\x20WOW');}),it('fails\x20soft\x20when\x20the\x20resolver\x20throws',async()=>{const a=vi['fn'](async()=>{throw new Error('network\x20down');}),b=[facet('fund_safety',[{'key':'a','label':'A','money':{'raw':'42','coin_type':WOW,'precision_known':![]}}],['{a}\x20raw'])];await expect(annotateFacetMoney(b,undefined,a))['resolves']['toBeUndefined']();const c=b[0x0]['amounts'][0x0]['money'];expect(c['precision_known'])['toBe'](![]),expect(c['display'])['toBeUndefined'](),expect(c['raw'])['toBe']('42'),expect(c['tip'])['toContain'](WOW),expect(b[0x0]['evidence'][0x0])['toBe']('42\x20raw');}),it('never\x20resolves\x20amounts\x20without\x20a\x20coin\x20type',async()=>{const a=vi['fn'](async()=>display(WOW,!![],'WOW',0x9)),b=[facet('fund_safety',[{'key':'a','label':'A','money':{'raw':'99','precision_known':![]}}],['bare\x20{a}']),facet('supply_chain',undefined,['no\x20money\x20here'])];await annotateFacetMoney(b,undefined,a),expect(a)['not']['toHaveBeenCalled'](),expect(b[0x0]['evidence'][0x0])['toBe']('bare\x2099'),expect(b[0x0]['amounts'][0x0]['money']['precision_known'])['toBe'](![]);}),it('leaves\x20unknown\x20placeholders\x20intact',async()=>{const a=vi['fn'](async()=>display(WOW,!![],'WOW',0x9)),b=[facet('fund_safety',[{'key':'a','label':'A','money':{'raw':'1','coin_type':WOW,'precision_known':![]}}],['{a}\x20/\x20{missing}'])];await annotateFacetMoney(b,undefined,a),expect(b[0x0]['evidence'][0x0])['toBe']('0.000000001\x20WOW\x20/\x20{missing}');});});
@@ -24,6 +24,8 @@ export interface MachinePanoramaResult {
24
24
  };
25
25
  progresses: {
26
26
  count: number;
27
+ window_saturated: boolean;
28
+ preview_truncated: boolean;
27
29
  items: {
28
30
  progress: string;
29
31
  name: string | null;
@@ -36,6 +38,7 @@ export interface MachinePanoramaResult {
36
38
  };
37
39
  related: {
38
40
  count: number;
41
+ window_saturated: boolean;
39
42
  groups: {
40
43
  label: string;
41
44
  items: {
@@ -1 +1 @@
1
- import{Config,LocalMark,query_objects,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{fetchMachineNodes,buildMachineGraph}from'./machine-nodes.js';import{batchQueryObjectsByIds,fetchObjectLinkerTx}from'../../graph/onchain/sdk-batch.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
+ import{Config,LocalMark,query_objects,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{fetchMachineNodes,buildMachineGraph}from'./machine-nodes.js';import{batchQueryObjectsByIds,fetchObjectLinkerTx,ringWindowSaturated}from'../../graph/onchain/sdk-batch.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 s=await LocalMark['Instance']()['get_address'](b);if(!s)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=s;}let g=null;try{if(!c)c=await Config['Instance']()['network_get']();const u=await query_objects({'objects':[f],'network':c});g=u?.['objects']?.[0x0]??null;if(!g&&a['context_network']){const w=await Config['Instance']()['network_get']();if(w&&w!==c){const x=await query_objects({'objects':[f],'network':w,'no_cache':!![]}),y=x?.['objects']?.[0x0]??null;y&&(g=y,c=w);}}}catch(z){throw new Error('Failed\x20to\x20query\x20Machine\x20'+f+'\x20on\x20'+c+':\x20'+(''+(z instanceof Error?z['message']:String(z))));}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 A=await LocalMark['Instance']()['list']({'address':f});A['length']>0x0&&(h=A[0x0]['name']??null,j=(A[0x0]['tags']??[])['map'](B=>String(B)));}catch{d['push']('head:\x20LocalMark\x20lookup\x20failed');}let k={'nodes':[],'edges':[]};try{const B=await fetchMachineNodes(f,c);k=buildMachineGraph(B);}catch{d['push']('graph:\x20node\x20fetch\x20failed\x20(non-blocking)');}const l=[];let m=0x0,n=0x0,p=![],q=[];try{const C=await fetchObjectLinkerTx(f,c,!![]),D=C?.['items']??[];p=ringWindowSaturated(D['length']);const E=new Map();for(const L of D){const M=typeof L?.['who']==='string'?L['who']['toLowerCase']():'';if(!M||M==='0x0')continue;if(!objectTypeFromAddress(M))continue;const N=typeof L?.['time']==='number'?L['time']:null,O=E['get'](M);E['set'](M,O==null?N:N==null?O:Math['max'](O,N));}n=E['size'];const F=new Map();for(const [P,Q]of E){const R=String(objectTypeFromAddress(P)),S=F['get'](R)??[];S['push']({'address':P,'time':Q}),F['set'](R,S);}for(const T of F['values']()){T['sort']((U,V)=>(V['time']??0x0)-(U['time']??0x0));}const G=['Progress','Allocation','Payment','Guard'];q=[];for(const U of G){const V=F['get'](U);V&&V['length']>0x0&&(q['push']({'label':U,'items':V}),F['delete'](U));}for(const [W,X]of F){if(X['length']>0x0)q['push']({'label':W,'items':X});}const H=D['filter'](Y=>objectTypeFromAddress(Y['who'])===ObjectType['Progress']);m=H['length'];const I=H['slice'](-0x32)['reverse'](),J=I['map'](Y=>Y['who']),K=new Map();if(J['length']>0x0)try{const Y=await batchQueryObjectsByIds(J,c,!![]);for(const Z of Y){if(Z?.['object'])K['set'](Z['object'],Z);}}catch{d['push']('progresses:\x20detail\x20fetch\x20failed');}for(const a0 of I){const a1=typeof a0?.['who']==='string'?a0['who']:'';if(!a1)continue;const a2=K['get'](a1);l['push']({'progress':a1,'name':null,'current':a2?.['current']??null,'task':a2?.['task']??null,'history_count':typeof a2?.['history_count']==='number'?a2['history_count']:null,'current_time':typeof a2?.['current_time']==='number'?a2['current_time']:null,'created_at':typeof a0?.['time']==='number'?a0['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,'window_saturated':p,'preview_truncated':m>l['length'],'items':l},'related':{'count':n,'window_saturated':p,'groups':q},'data_gaps':d};}
@@ -1,5 +1,16 @@
1
1
  import type { ObjectPanoramaInput } from "../../schema/query/bi.js";
2
2
  type ProjectInput = ObjectPanoramaInput;
3
+ interface PanoRelatedList {
4
+ key: string | null;
5
+ items: {
6
+ address: string;
7
+ object_type: string;
8
+ time: number | null;
9
+ }[];
10
+ count: number;
11
+ window_saturated: boolean;
12
+ preview_truncated: boolean;
13
+ }
3
14
  interface PanoBase {
4
15
  action: "object_panorama";
5
16
  object: string;
@@ -37,15 +48,7 @@ export interface ProgressPanoramaResult extends PanoBase {
37
48
  time: number | null;
38
49
  }[];
39
50
  } | null;
40
- related: {
41
- key: string | null;
42
- items: {
43
- address: string;
44
- object_type: string;
45
- time: number | null;
46
- }[];
47
- count: number;
48
- };
51
+ related: PanoRelatedList;
49
52
  }
50
53
  export interface DemandPanoramaResult extends PanoBase {
51
54
  object_type: "Demand";
@@ -61,6 +64,8 @@ export interface DemandPanoramaResult extends PanoBase {
61
64
  }[];
62
65
  presenters: {
63
66
  count: number;
67
+ window_saturated: boolean;
68
+ preview_truncated: boolean;
64
69
  items: {
65
70
  service: string;
66
71
  recommend: string | null;
@@ -73,6 +78,7 @@ export interface DemandPanoramaResult extends PanoBase {
73
78
  }
74
79
  export interface OrderPanoramaResult extends PanoBase {
75
80
  object_type: "Order";
81
+ coin_type: string | null;
76
82
  fields: {
77
83
  service: string | null;
78
84
  machine: string | null;
@@ -80,6 +86,8 @@ export interface OrderPanoramaResult extends PanoBase {
80
86
  allocation: string | null;
81
87
  discount: string | null;
82
88
  amount: string | null;
89
+ amount_display: string;
90
+ amount_tip: string;
83
91
  owner: string | null;
84
92
  claimed_by: string | null;
85
93
  required_info: string | null;
@@ -88,6 +96,8 @@ export interface OrderPanoramaResult extends PanoBase {
88
96
  items: {
89
97
  name: string | null;
90
98
  price: string | null;
99
+ price_display: string;
100
+ price_tip: string;
91
101
  quantity: string | null;
92
102
  wip_hash: string | null;
93
103
  }[];
@@ -97,26 +107,23 @@ export interface OrderPanoramaResult extends PanoBase {
97
107
  disputes: string[];
98
108
  agents: string[];
99
109
  updated_ms: number | null;
100
- related: {
101
- key: string | null;
102
- items: {
103
- address: string;
104
- object_type: string;
105
- time: number | null;
106
- }[];
107
- count: number;
108
- };
110
+ related: PanoRelatedList;
109
111
  }
110
112
  export interface ArbPanoramaResult extends PanoBase {
111
113
  object_type: "Arb";
114
+ coin_type: string | null;
112
115
  fields: {
113
116
  arbitration: string | null;
114
117
  order: string | null;
115
118
  service: string | null;
116
119
  fee: string | null;
120
+ fee_display: string;
121
+ fee_tip: string;
117
122
  feedback: string | null;
118
123
  indemnity: {
119
124
  amount: string | null;
125
+ amount_display: string;
126
+ amount_tip: string;
120
127
  time: number | null;
121
128
  } | null;
122
129
  voting_deadline: number | null;
@@ -137,15 +144,7 @@ export interface ArbPanoramaResult extends PanoBase {
137
144
  votes: number;
138
145
  }[];
139
146
  updated_ms: number | null;
140
- related: {
141
- key: string | null;
142
- items: {
143
- address: string;
144
- object_type: string;
145
- time: number | null;
146
- }[];
147
- count: number;
148
- };
147
+ related: PanoRelatedList;
149
148
  }
150
149
  export interface RepositoryPanoramaResult extends PanoBase {
151
150
  object_type: "Repository";
@@ -174,5 +173,6 @@ export interface RepositoryPanoramaResult extends PanoBase {
174
173
  };
175
174
  }
176
175
  export type ObjectPanoramaResult = ProgressPanoramaResult | DemandPanoramaResult | OrderPanoramaResult | ArbPanoramaResult | RepositoryPanoramaResult;
176
+ export declare function coinOfTypeRaw(typeRaw: unknown): string | null;
177
177
  export declare function handleObjectPanorama(v: ProjectInput): Promise<ObjectPanoramaResult>;
178
178
  export {};
@@ -1 +1 @@
1
- import{Config,LocalMark,query_objects,query_object_last_updated,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{batchReadAddressKeyedFields,fetchObjectLinkerTx}from'../../graph/onchain/sdk-batch.js';const js=a=>{if(typeof a==='bigint')return a['toString']();if(a&&typeof a==='object'&&!Array['isArray'](a)){const b={};for(const [c,d]of Object['entries'](a)){b[c]=js(d);}return b;}if(Array['isArray'](a))return a['map'](js);return a;},str=a=>a===null||a===undefined?null:String(a),ownerAddr=a=>{if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];const c=Object['values'](b)['find'](d=>typeof d==='string'&&d['length']>0x14);if(typeof c==='string')return c;}return null;},num=a=>{if(typeof a==='bigint')return Number(a);if(typeof a==='number')return Number['isFinite'](a)?a:null;if(typeof a==='string'&&a['trim']()!==''){const b=Number(a);return Number['isFinite'](b)?b:null;}return null;},arr=a=>Array['isArray'](a)?a:[],ARB_STATUS_NAMES={0x0:'Principal_confirming',0x1:'Arbitrator_confirming',0x2:'Voting',0x3:'Arbitrated',0x4:'Objectionable',0x5:'Finished',0x6:'Withdrawn'};async function resolveObject(a,b){let c=a;if(!/^0x[0-9a-fA-F]{32,64}$/['test'](c)){const g=await LocalMark['Instance']()['get_address'](c);if(!g)throw new Error('Cannot\x20resolve\x20\x27'+c+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.');c=g;}let d=b??undefined,f=null;if(!d)d=await Config['Instance']()['network_get']();try{const h=await query_objects({'objects':[c],'network':d});f=h?.['objects']?.[0x0]??null;if(!f&&b){const i=await Config['Instance']()['network_get']();if(i&&i!==d){const j=await query_objects({'objects':[c],'network':i,'no_cache':!![]}),k=j?.['objects']?.[0x0]??null;k&&(f=k,d=i);}}}catch(l){throw new Error('Failed\x20to\x20query\x20'+c+'\x20on\x20'+d+':\x20'+(l instanceof Error?l['message']:String(l)));}if(!f)throw new Error(c+'\x20not\x20found\x20on\x20'+d+'.\x20It\x20may\x20not\x20exist\x20on\x20this\x20network.');return f['object']=f['object']??c,{'network':String(d),'obj':f};}async function resolveHead(a,b,c){let d=null,e=[];try{const f=await LocalMark['Instance']()['list']({'address':a});f['length']>0x0&&(d=f[0x0]['name']??null,e=(f[0x0]['tags']??[])['map'](g=>String(g)));}catch{c['push']('head:\x20LocalMark\x20lookup\x20failed');}return{'name':d,'tags':e,'description':str(b['description'])};}async function buildPresenters(a,b,c){const d=[];let e=0x0;try{const f=await fetchObjectLinkerTx(a,b,!![]),g=(f?.['items']??[])['map'](j=>({'service':String(j?.['who']??''),'time':typeof j?.['time']==='number'?j['time']:null}))['filter'](j=>objectTypeFromAddress(j['service'])===ObjectType['Service']);e=g['length'];const h=g['slice'](-0x32)['reverse'](),i=await batchReadAddressKeyedFields(a,h['map'](j=>j['service']),b,!![]);for(const j of h){const k=i['get'](j['service']['toLowerCase']());d['push']({'service':j['service'],'recommend':str(k?.['recommend']),'acceptance_score':num(k?.['acceptance_score']),'feedback':str(k?.['feedback']),'feedback_time':num(k?.['feedback_time']),'update_time':num(k?.['update_time'])??j['time']});}}catch{c['push']('presenters:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}return{'count':e,'items':d};}async function buildRepositoryData(a,b,c){return void a,void b,c['push']('data:\x20per-key\x20enumeration\x20requires\x20the\x20{entity,name}\x20pair\x20—\x20showing\x20count\x20only'),{'count':null,'items':[]};}export async function handleObjectPanorama(b){const c=b['object_address']??b['filter'];if(!c)throw new Error('\x27object_address\x27\x20is\x20required\x20for\x20object_panorama\x20(a\x20LocalMark\x20NAME\x20is\x20also\x20accepted).\x20Example:\x20{\x22query_type\x22:\x20\x22object_panorama\x22,\x20\x22object_address\x22:\x20\x220x...\x22}');const {network:d,obj:e}=await resolveObject(c,b['context_network']),f=String(e['object']),g=[],h=await resolveHead(f,e,g),j=String(e['type']??'');if(j==='Progress'){const k=arr(e['session'])[0x0],l=k?{'next_node':str(k['next_node']),'weights':num(k['weights']),'threshold':num(k['threshold']),'forwards':arr(k['forwards'])['map'](n=>{const o=n;return{'forward':str(o['forward'])??'','who':str(o['who']),'accomplished':o['accomplished']===!![],'msg':str(o['msg']),'time':num(o['time'])};})}:null,m={'key':typeof e['machine']==='string'?e['machine']:null,'items':[],'count':0x0};if(m['key'])try{const n=await fetchObjectLinkerTx(m['key'],d,!![]),o=n?.['items']??[];for(const q of o['slice'](-0x32)['reverse']()){const r=typeof q?.['who']==='string'?q['who']:'';if(!r||r['toLowerCase']()===f['toLowerCase']())continue;let s;try{s=objectTypeFromAddress(r);}catch{}if(!s)continue;m['items']['push']({'address':r,'object_type':s,'time':typeof q?.['time']==='number'?q['time']:null});}m['count']=m['items']['length'];}catch{g['push']('related:\x20ObjectLinkerTx(machine)\x20lookup\x20failed');}return{'action':'object_panorama','object':f,'object_type':'Progress','network':d,'head':h,'fields':{'machine':str(e['machine']),'current':str(e['current']),'task':str(e['task']),'history_count':num(e['history_count']),'current_time':num(e['current_time'])},'context_repositories':arr(e['context_repositories'])['map'](t=>String(t)),'operators':arr(e['namedOperator'])['map'](t=>{const u=t;return{'name':str(u['name'])??'','operators':arr(u['operators'])['map'](w=>String(w))};}),'session':l,'related':m,'data_gaps':g};}if(j==='Demand')return{'action':'object_panorama','object':f,'object_type':'Demand','network':d,'head':h,'fields':{'location':str(e['location']),'um':str(e['um']),'permission':str(e['permission']),'presenters_count':num(e['presenters_count'])},'rewards':arr(e['rewards'])['map'](t=>String(t)),'guards':arr(e['guards'])['map'](t=>({'guard':str(t['guard'])??''})),'presenters':await buildPresenters(f,d,g),'data_gaps':g};if(j==='Order'){let t=null;try{const C=await query_object_last_updated({'object':f,'network':d,'previous_transaction':str(e['previousTransaction'])});t=C?.['timestamp_ms']?Number(C['timestamp_ms'])||null:null;}catch{}let u='none',w=null,x=null;const y=str(e['allocation']),z=str(e['progress']),A=[y,z]['filter'](D=>!!D);if(A['length']>0x0)try{const D=await query_objects({'objects':A,'network':d}),E=D?.['objects']??[];if(y){u='pending';const F=E['find'](H=>H?.['object']===y),G=Number(F?.['balance']??NaN);if(Number['isFinite'](G)&&G===0x0)u='allocated';}if(z){const H=E['find'](I=>I?.['object']===z);w=str(H?.['current']),x=num(H?.['current_time']);}}catch{}const B={'key':f,'items':[],'count':0x0};try{const I=await fetchObjectLinkerTx(f,d,!![]),J=I?.['items']??[];for(const K of J['slice'](-0x32)['reverse']()){const L=typeof K?.['who']==='string'?K['who']:'';if(!L||L['toLowerCase']()===f['toLowerCase']())continue;let M;try{M=objectTypeFromAddress(L);}catch{}if(!M)continue;B['items']['push']({'address':L,'object_type':M,'time':typeof K?.['time']==='number'?K['time']:null});}B['count']=B['items']['length'];}catch{g['push']('related:\x20ObjectLinkerTx(order)\x20lookup\x20failed');}return{'action':'object_panorama','object':f,'object_type':'Order','network':d,'head':h,'fields':{'service':str(e['service']),'machine':str(e['machine']),'progress':z,'allocation':y,'discount':str(e['discount']),'amount':str(e['amount']),'owner':ownerAddr(e['builder']??e['owner']),'claimed_by':str(e['claimed_by']),'required_info':str(e['required_info']),'time':num(e['time'])},'updated_ms':t,'related':B,'allocation_state':u,'progress_next':w,'progress_since':x,'items':arr(e['items'])['map'](N=>{const O=N;return{'name':str(O['name']),'price':str(O['price']),'quantity':str(O['quantity']),'wip_hash':str(O['wip_hash'])};}),'disputes':arr(e['dispute'])['map'](N=>String(N)),'agents':arr(e['agent'])['map'](N=>String(N)),'data_gaps':g};}if(j==='Arb'){const N=e['indemnity'];let O=null;try{const S=await query_object_last_updated({'object':f,'network':d,'previous_transaction':str(e['previousTransaction'])});O=S?.['timestamp_ms']?Number(S['timestamp_ms'])||null:null;}catch{}const P=str(e['order']);let Q=null;if(P)try{const T=await query_objects({'objects':[P],'network':d}),U=T?.['objects']?.[0x0];Q=str(U?.['service']);}catch{}const R={'key':f,'items':[],'count':0x0};try{const V=await fetchObjectLinkerTx(f,d,!![]),W=V?.['items']??[];for(const X of W['slice'](-0x32)['reverse']()){const Y=typeof X?.['who']==='string'?X['who']:'';if(!Y||Y['toLowerCase']()===f['toLowerCase']())continue;let Z;try{Z=objectTypeFromAddress(Y);}catch{}if(!Z)continue;R['items']['push']({'address':Y,'object_type':Z,'time':typeof X?.['time']==='number'?X['time']:null});}R['count']=R['items']['length'];}catch{g['push']('related:\x20ObjectLinkerTx(arb)\x20lookup\x20failed');}return{'action':'object_panorama','object':f,'object_type':'Arb','network':d,'head':h,'fields':{'arbitration':str(e['arbitration']),'order':str(e['order']),'service':Q,'fee':str(e['fee']),'feedback':str(e['feedback']),'indemnity':N?{'amount':str(N['amount']),'time':num(N['time'])}:null,'voting_deadline':num(e['voting_deadline']),'objection':str(e['objection']),'status':ARB_STATUS_NAMES[num(e['status'])??-0x1]??str(e['status']),'compensation_time':num(e['compensation_time']),'time':num(e['time']),'type_raw':str(e['type_raw'])},'voted':arr(e['voted'])['map'](a0=>{const a1=a0;return{'voter':str(a1['voter'])??'','agrees':arr(a1['agrees'])['map'](a2=>Number(a2)),'weight':num(a1['weight'])??0x0,'time':num(a1['time'])??0x0};}),'proposition':arr(e['proposition'])['map'](a0=>{const a1=a0;return{'name':str(a1['name'])??'','votes':num(a1['votes'])??0x0};}),'related':R,'updated_ms':O,'data_gaps':g};}if(j==='Repository')return{'action':'object_panorama','object':f,'object_type':'Repository','network':d,'head':h,'fields':{'um':str(e['um']),'permission':str(e['permission']),'data_count':num(e['data_count'])},'policies':arr(e['policies'])['map'](a0=>{const a1=a0;return{'name':str(a1['name'])??'','description':str(a1['description']),'id_from':str(a1['id_from']),'value_type':str(a1['value_type']),'write_guards':arr(a1['write_guard'])['length'],'quote_guard':str(a1['quote_guard'])};}),'rewards':arr(e['rewards'])['map'](a0=>String(a0)),'data_entries':await buildRepositoryData(f,d,g),'data_gaps':g};throw new Error('object_panorama:\x20unsupported\x20object\x20type\x20\x27'+(j||'unknown')+'\x27\x20for\x20'+f+'.\x20'+'Supported:\x20Progress\x20/\x20Demand\x20/\x20Order\x20/\x20Arb\x20/\x20Repository.');}
1
+ import{Config,LocalMark,query_objects,query_object_last_updated,objectTypeFromAddress,ObjectType}from'@wowok/wowok';import{batchReadAddressKeyedFields,fetchObjectLinkerTx,ringWindowSaturated}from'../../graph/onchain/sdk-batch.js';import{formatMoneyAnnotation}from'./facet-money.js';const js=a=>{if(typeof a==='bigint')return a['toString']();if(a&&typeof a==='object'&&!Array['isArray'](a)){const b={};for(const [c,d]of Object['entries'](a)){b[c]=js(d);}return b;}if(Array['isArray'](a))return a['map'](js);return a;},str=a=>a===null||a===undefined?null:String(a),ownerAddr=a=>{if(typeof a==='string')return a;const b=a;if(b&&typeof b==='object'){if(typeof b['AddressOwner']==='string')return b['AddressOwner'];if(typeof b['ObjectOwner']==='string')return b['ObjectOwner'];const c=Object['values'](b)['find'](d=>typeof d==='string'&&d['length']>0x14);if(typeof c==='string')return c;}return null;},num=a=>{if(typeof a==='bigint')return Number(a);if(typeof a==='number')return Number['isFinite'](a)?a:null;if(typeof a==='string'&&a['trim']()!==''){const b=Number(a);return Number['isFinite'](b)?b:null;}return null;},arr=a=>Array['isArray'](a)?a:[];export function coinOfTypeRaw(a){if(typeof a!=='string'||!a)return null;const b=a['match'](/<(.+)>$/),c=b?.[0x1]?.['trim']();return c&&c['includes']('::')?c:null;}const RELATED_PREVIEW_CAP=0x32;async function buildRelatedList(a,b,c,d,e){const f={'key':a,'items':[],'count':0x0,'window_saturated':![],'preview_truncated':![]};if(!a)return f;try{const g=await fetchObjectLinkerTx(a,c,!![]),h=g?.['items']??[];f['window_saturated']=ringWindowSaturated(h['length']);const j=[];for(const k of h){const l=typeof k?.['who']==='string'?k['who']:'';if(!l||l['toLowerCase']()===b['toLowerCase']())continue;let m;try{m=objectTypeFromAddress(l);}catch{}if(!m)continue;j['push']({'address':l,'object_type':m,'time':typeof k?.['time']==='number'?k['time']:null});}f['count']=j['length'],f['items']=j['slice'](-RELATED_PREVIEW_CAP)['reverse'](),f['preview_truncated']=j['length']>f['items']['length'];}catch{d['push']('related:\x20ObjectLinkerTx('+e+')\x20lookup\x20failed');}return f;}const ARB_STATUS_NAMES={0x0:'Principal_confirming',0x1:'Arbitrator_confirming',0x2:'Voting',0x3:'Arbitrated',0x4:'Objectionable',0x5:'Finished',0x6:'Withdrawn'};async function resolveObject(a,b){let c=a;if(!/^0x[0-9a-fA-F]{32,64}$/['test'](c)){const g=await LocalMark['Instance']()['get_address'](c);if(!g)throw new Error('Cannot\x20resolve\x20\x27'+c+'\x27\x20—\x20not\x20a\x20valid\x20address\x20and\x20no\x20LocalMark\x20entry\x20found.');c=g;}let d=b??undefined,f=null;if(!d)d=await Config['Instance']()['network_get']();try{const h=await query_objects({'objects':[c],'network':d});f=h?.['objects']?.[0x0]??null;if(!f&&b){const i=await Config['Instance']()['network_get']();if(i&&i!==d){const j=await query_objects({'objects':[c],'network':i,'no_cache':!![]}),k=j?.['objects']?.[0x0]??null;k&&(f=k,d=i);}}}catch(l){throw new Error('Failed\x20to\x20query\x20'+c+'\x20on\x20'+d+':\x20'+(l instanceof Error?l['message']:String(l)));}if(!f)throw new Error(c+'\x20not\x20found\x20on\x20'+d+'.\x20It\x20may\x20not\x20exist\x20on\x20this\x20network.');return f['object']=f['object']??c,{'network':String(d),'obj':f};}async function resolveHead(a,b,c){let d=null,e=[];try{const f=await LocalMark['Instance']()['list']({'address':a});f['length']>0x0&&(d=f[0x0]['name']??null,e=(f[0x0]['tags']??[])['map'](g=>String(g)));}catch{c['push']('head:\x20LocalMark\x20lookup\x20failed');}return{'name':d,'tags':e,'description':str(b['description'])};}async function buildPresenters(a,b,c){const d=[];let e=0x0,f=![];try{const g=await fetchObjectLinkerTx(a,b,!![]),h=Array['isArray'](g?.['items'])?g['items']:[];f=ringWindowSaturated(h['length']);const i=h['map'](l=>({'service':String(l?.['who']??''),'time':typeof l?.['time']==='number'?l['time']:null}))['filter'](l=>objectTypeFromAddress(l['service'])===ObjectType['Service']);e=i['length'];const j=i['slice'](-0x32)['reverse'](),k=await batchReadAddressKeyedFields(a,j['map'](l=>l['service']),b,!![]);for(const l of j){const m=k['get'](l['service']['toLowerCase']());d['push']({'service':l['service'],'recommend':str(m?.['recommend']),'acceptance_score':num(m?.['acceptance_score']),'feedback':str(m?.['feedback']),'feedback_time':num(m?.['feedback_time']),'update_time':num(m?.['update_time'])??l['time']});}}catch{c['push']('presenters:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}return{'count':e,'window_saturated':f,'preview_truncated':e>d['length'],'items':d};}async function buildRepositoryData(a,b,c){return void a,void b,c['push']('data:\x20per-key\x20enumeration\x20requires\x20the\x20{entity,name}\x20pair\x20—\x20showing\x20count\x20only'),{'count':null,'items':[]};}export async function handleObjectPanorama(b){const c=b['object_address']??b['filter'];if(!c)throw new Error('\x27object_address\x27\x20is\x20required\x20for\x20object_panorama\x20(a\x20LocalMark\x20NAME\x20is\x20also\x20accepted).\x20Example:\x20{\x22query_type\x22:\x20\x22object_panorama\x22,\x20\x22object_address\x22:\x20\x220x...\x22}');const {network:d,obj:e}=await resolveObject(c,b['context_network']),f=String(e['object']),g=[],h=await resolveHead(f,e,g),i=String(e['type']??'');if(i==='Progress'){const j=arr(e['session'])[0x0],k=j?{'next_node':str(j['next_node']),'weights':num(j['weights']),'threshold':num(j['threshold']),'forwards':arr(j['forwards'])['map'](m=>{const n=m;return{'forward':str(n['forward'])??'','who':str(n['who']),'accomplished':n['accomplished']===!![],'msg':str(n['msg']),'time':num(n['time'])};})}:null,l=await buildRelatedList(typeof e['machine']==='string'?e['machine']:null,f,d,g,'machine');return{'action':'object_panorama','object':f,'object_type':'Progress','network':d,'head':h,'fields':{'machine':str(e['machine']),'current':str(e['current']),'task':str(e['task']),'history_count':num(e['history_count']),'current_time':num(e['current_time'])},'context_repositories':arr(e['context_repositories'])['map'](m=>String(m)),'operators':arr(e['namedOperator'])['map'](m=>{const n=m;return{'name':str(n['name'])??'','operators':arr(n['operators'])['map'](q=>String(q))};}),'session':k,'related':l,'data_gaps':g};}if(i==='Demand')return{'action':'object_panorama','object':f,'object_type':'Demand','network':d,'head':h,'fields':{'location':str(e['location']),'um':str(e['um']),'permission':str(e['permission']),'presenters_count':num(e['presenters_count'])},'rewards':arr(e['rewards'])['map'](m=>String(m)),'guards':arr(e['guards'])['map'](m=>({'guard':str(m['guard'])??''})),'presenters':await buildPresenters(f,d,g),'data_gaps':g};if(i==='Order'){let m=null;try{const C=await query_object_last_updated({'object':f,'network':d,'previous_transaction':str(e['previousTransaction'])});m=C?.['timestamp_ms']?Number(C['timestamp_ms'])||null:null;}catch{}let n='none',o=null,q=null;const r=str(e['allocation']),t=str(e['progress']),u=str(e['service']),w=[r,t,u]['filter'](D=>!!D);let x=null;if(w['length']>0x0)try{const D=await query_objects({'objects':w,'network':d}),E=D?.['objects']??[];if(r){n='pending';const F=E['find'](H=>H?.['object']===r),G=Number(F?.['balance']??NaN);if(Number['isFinite'](G)&&G===0x0)n='allocated';}if(t){const H=E['find'](I=>I?.['object']===t);o=str(H?.['current']),q=num(H?.['current_time']);}if(u){const I=E['find'](J=>J?.['object']===u);x=coinOfTypeRaw(I?.['type_raw']??I?.['type']);}}catch{}const y=await buildRelatedList(f,f,d,g,'order'),z=str(e['amount']),A=await formatMoneyAnnotation(z,x,d),B=await Promise['all'](arr(e['items'])['map'](async J=>{const K=J,L=str(K['price']),M=await formatMoneyAnnotation(L,x,d);return{'name':str(K['name']),'price':L,'price_display':M['display'],'price_tip':M['tip'],'quantity':str(K['quantity']),'wip_hash':str(K['wip_hash'])};}));return{'action':'object_panorama','object':f,'object_type':'Order','network':d,'head':h,'coin_type':x,'fields':{'service':u,'machine':str(e['machine']),'progress':t,'allocation':r,'discount':str(e['discount']),'amount':z,'amount_display':A['display'],'amount_tip':A['tip'],'owner':ownerAddr(e['builder']??e['owner']),'claimed_by':str(e['claimed_by']),'required_info':str(e['required_info']),'time':num(e['time'])},'updated_ms':m,'related':y,'allocation_state':n,'progress_next':o,'progress_since':q,'items':B,'disputes':arr(e['dispute'])['map'](J=>String(J)),'agents':arr(e['agent'])['map'](J=>String(J)),'data_gaps':g};}if(i==='Arb'){const J=e['indemnity'];let K=null;try{const T=await query_object_last_updated({'object':f,'network':d,'previous_transaction':str(e['previousTransaction'])});K=T?.['timestamp_ms']?Number(T['timestamp_ms'])||null:null;}catch{}const L=str(e['order']);let M=null;if(L)try{const U=await query_objects({'objects':[L],'network':d}),V=U?.['objects']?.[0x0];M=str(V?.['service']);}catch{}const N=await buildRelatedList(f,f,d,g,'arb'),O=coinOfTypeRaw(e['type_raw']),P=str(e['fee']),Q=await formatMoneyAnnotation(P,O,d),R=J?str(J['amount']):null,S=await formatMoneyAnnotation(R,O,d);return{'action':'object_panorama','object':f,'object_type':'Arb','network':d,'head':h,'coin_type':O,'fields':{'arbitration':str(e['arbitration']),'order':str(e['order']),'service':M,'fee':P,'fee_display':Q['display'],'fee_tip':Q['tip'],'feedback':str(e['feedback']),'indemnity':J?{'amount':R,'amount_display':S['display'],'amount_tip':S['tip'],'time':num(J['time'])}:null,'voting_deadline':num(e['voting_deadline']),'objection':str(e['objection']),'status':ARB_STATUS_NAMES[num(e['status'])??-0x1]??str(e['status']),'compensation_time':num(e['compensation_time']),'time':num(e['time']),'type_raw':str(e['type_raw'])},'voted':arr(e['voted'])['map'](W=>{const X=W;return{'voter':str(X['voter'])??'','agrees':arr(X['agrees'])['map'](Y=>Number(Y)),'weight':num(X['weight'])??0x0,'time':num(X['time'])??0x0};}),'proposition':arr(e['proposition'])['map'](W=>{const X=W;return{'name':str(X['name'])??'','votes':num(X['votes'])??0x0};}),'related':N,'updated_ms':K,'data_gaps':g};}if(i==='Repository')return{'action':'object_panorama','object':f,'object_type':'Repository','network':d,'head':h,'fields':{'um':str(e['um']),'permission':str(e['permission']),'data_count':num(e['data_count'])},'policies':arr(e['policies'])['map'](W=>{const X=W;return{'name':str(X['name'])??'','description':str(X['description']),'id_from':str(X['id_from']),'value_type':str(X['value_type']),'write_guards':arr(X['write_guard'])['length'],'quote_guard':str(X['quote_guard'])};}),'rewards':arr(e['rewards'])['map'](W=>String(W)),'data_entries':await buildRepositoryData(f,d,g),'data_gaps':g};throw new Error('object_panorama:\x20unsupported\x20object\x20type\x20\x27'+(i||'unknown')+'\x27\x20for\x20'+f+'.\x20'+'Supported:\x20Progress\x20/\x20Demand\x20/\x20Order\x20/\x20Arb\x20/\x20Repository.');}
@@ -43,7 +43,7 @@ export interface AggregateRisksInput {
43
43
  name?: string;
44
44
  }[];
45
45
  }
46
- export declare function handleAggregateRisks(v: AggregateRisksInput): {
46
+ export declare function handleAggregateRisks(v: AggregateRisksInput): Promise<{
47
47
  intent_echo?: {
48
48
  primary_object: string;
49
49
  industry: string;
@@ -75,7 +75,7 @@ export declare function handleAggregateRisks(v: AggregateRisksInput): {
75
75
  }>>;
76
76
  warnings: string[];
77
77
  action: "aggregate_risks";
78
- };
78
+ }>;
79
79
  export interface TraceSubstepsInput {
80
80
  project?: string;
81
81
  version?: string;
@@ -1 +1 @@
1
- import{analyzeBusinessIntent}from'./business-puzzle.js';import{Config}from'@wowok/wowok/w/local';import{aggregateProjectRisks}from'./risk-aggregator.js';import{traceSubsteps}from'../../task/substep-trace.js';import{updateStageCache}from'./index.js';import{checkObjectReuseRules,checkImmutabilityRules}from'../../knowledge/safety-rules.js';export function handleAnalyzeIntent(a){const b=(a['intent']??a['project_description']??a['project_name']??'')['trim']();if(!b)throw new Error('analyze_intent\x20requires\x20\x27intent\x27\x20(business\x20description\x20text).\x20'+'Example:\x20intent=\x27I\x20want\x20to\x20open\x20an\x20online\x20toy\x20store\x20with\x20escrow\x20and\x20dispute\x20resolution\x27.');const c=analyzeBusinessIntent({'user_intent':b,'project_name':a['project_name'],'target_objects':a['target_objects'],'industry':a['project_industry']}),d=(a['project']??'')['trim']();return d&&updateStageCache(d,(a['version']??'v1')['trim'](),{'stage':'puzzle','puzzles':c['puzzles'],'business_intent':b,'industry':c['intent_parsed']['industry']}),{'action':'analyze_intent',...c};}export function handleAggregateRisks(a){const b=(a['project']??'')['trim']();if(!b)throw new Error('aggregate_risks\x20requires\x20\x27project\x27\x20(project\x20prefix,\x20e.g.\x20\x27myshop\x27).\x20'+'Use\x20one\x20stable\x20prefix\x20per\x20build\x20so\x20findings\x20map\x20to\x20the\x20service-build\x20stage\x20cache\x20namespace.');const c=(a['version']??'v1')['trim']();let d,e;if(a['puzzles'])d=Object['fromEntries'](Object['entries'](a['puzzles'])['map'](([h,i])=>[h,{'puzzle':i['puzzle'],'completeness':i['completeness'],'missing_dimensions':i['missing_dimensions']}]));else{const h=(a['intent']??a['project_description']??a['project_name']??'')['trim']();if(!h)throw new Error('aggregate_risks\x20requires\x20\x27puzzles\x27\x20(from\x20a\x20prior\x20analyze_intent\x20result)\x20'+'OR\x20\x27intent\x27\x20(business\x20description\x20—\x20analyze_intent\x20runs\x20automatically\x20first).');const i=analyzeBusinessIntent({'user_intent':h,'project_name':a['project_name'],'industry':a['project_industry']});d=i['puzzles'],e={'primary_object':i['intent_parsed']['primary_object'],'industry':i['intent_parsed']['industry'],'overall_completeness':i['overall_completeness']};}const f=aggregateProjectRisks({'project_prefix':b,'version':c,'industry':a['project_industry'],'puzzles':d,'severity_threshold':a['severity_threshold'],'user_confirmed_high_risks':a['user_confirmed_high_risks']}),g=[...a['planned_objects']?checkObjectReuseRules(a['planned_objects']):[],...a['planned_operations']?checkImmutabilityRules(a['planned_operations']):[]];return updateStageCache(b,c,{'stage':'risk','risk_status':f['status'],'risk_can_proceed':f['status']==='RISK_PASSED'}),{'action':'aggregate_risks',...f,...g['length']>0x0?{'safety_findings':g}:{},...e?{'intent_echo':e}:{}};}export async function handleTraceSubsteps(a){const b=(a['project']??'')['trim']();if(!b)throw new Error('trace_substeps\x20requires\x20\x27project\x27\x20(project\x20prefix,\x20e.g.\x20\x27myshop\x27).');if(!a['substeps']||a['substeps']['length']===0x0)throw new Error('trace_substeps\x20requires\x20\x27substeps\x27\x20(non-empty\x20array\x20of\x20substep\x20execution\x20records,\x20'+'63-spec\x20§2.1).\x20Construct\x20them\x20from\x20your\x20deployment\x20execution\x20trace:\x20each\x20onchain_operations\x20'+'call\x20=\x20one\x20substep\x20with\x20step_id\x20\x27T<step>.<substep>\x27,\x20input_refs\x20pointing\x20at\x20upstream\x20substeps.');const c=traceSubsteps({'project_prefix':b,'version':(a['version']??'v1')['trim'](),'network':a['network']??await Config['Instance']()['network_get'](),'substeps':a['substeps'],'edges':a['substep_edges']});return updateStageCache(b,(a['version']??'v1')['trim'](),{'stage':'substeps','trace_coherent':c['coherent'],'trace_can_proceed':c['coherent']}),{'action':'trace_substeps',...c};}
1
+ import{analyzeBusinessIntent}from'./business-puzzle.js';import{Config}from'@wowok/wowok/w/local';import{aggregateProjectRisks}from'./risk-aggregator.js';import{traceSubsteps}from'../../task/substep-trace.js';import{updateStageCache}from'./index.js';import{checkObjectReuseRules,checkImmutabilityRules}from'../../knowledge/safety-rules.js';export function handleAnalyzeIntent(a){const b=(a['intent']??a['project_description']??a['project_name']??'')['trim']();if(!b)throw new Error('analyze_intent\x20requires\x20\x27intent\x27\x20(business\x20description\x20text).\x20'+'Example:\x20intent=\x27I\x20want\x20to\x20open\x20an\x20online\x20toy\x20store\x20with\x20escrow\x20and\x20dispute\x20resolution\x27.');const c=analyzeBusinessIntent({'user_intent':b,'project_name':a['project_name'],'target_objects':a['target_objects'],'industry':a['project_industry']}),d=(a['project']??'')['trim']();return d&&updateStageCache(d,(a['version']??'v1')['trim'](),{'stage':'puzzle','puzzles':c['puzzles'],'business_intent':b,'industry':c['intent_parsed']['industry']}),{'action':'analyze_intent',...c};}export async function handleAggregateRisks(a){const b=(a['project']??'')['trim']();if(!b)throw new Error('aggregate_risks\x20requires\x20\x27project\x27\x20(project\x20prefix,\x20e.g.\x20\x27myshop\x27).\x20'+'Use\x20one\x20stable\x20prefix\x20per\x20build\x20so\x20findings\x20map\x20to\x20the\x20service-build\x20stage\x20cache\x20namespace.');const c=(a['version']??'v1')['trim']();let d,e;if(a['puzzles'])d=Object['fromEntries'](Object['entries'](a['puzzles'])['map'](([h,i])=>[h,{'puzzle':i['puzzle'],'completeness':i['completeness'],'missing_dimensions':i['missing_dimensions']}]));else{const h=(a['intent']??a['project_description']??a['project_name']??'')['trim']();if(!h)throw new Error('aggregate_risks\x20requires\x20\x27puzzles\x27\x20(from\x20a\x20prior\x20analyze_intent\x20result)\x20'+'OR\x20\x27intent\x27\x20(business\x20description\x20—\x20analyze_intent\x20runs\x20automatically\x20first).');const i=analyzeBusinessIntent({'user_intent':h,'project_name':a['project_name'],'industry':a['project_industry']});d=i['puzzles'],e={'primary_object':i['intent_parsed']['primary_object'],'industry':i['intent_parsed']['industry'],'overall_completeness':i['overall_completeness']};}const f=await aggregateProjectRisks({'project_prefix':b,'version':c,'industry':a['project_industry'],'puzzles':d,'severity_threshold':a['severity_threshold'],'user_confirmed_high_risks':a['user_confirmed_high_risks']}),g=[...a['planned_objects']?checkObjectReuseRules(a['planned_objects']):[],...a['planned_operations']?checkImmutabilityRules(a['planned_operations']):[]];return updateStageCache(b,c,{'stage':'risk','risk_status':f['status'],'risk_can_proceed':f['status']==='RISK_PASSED'}),{'action':'aggregate_risks',...f,...g['length']>0x0?{'safety_findings':g}:{},...e?{'intent_echo':e}:{}};}export async function handleTraceSubsteps(a){const b=(a['project']??'')['trim']();if(!b)throw new Error('trace_substeps\x20requires\x20\x27project\x27\x20(project\x20prefix,\x20e.g.\x20\x27myshop\x27).');if(!a['substeps']||a['substeps']['length']===0x0)throw new Error('trace_substeps\x20requires\x20\x27substeps\x27\x20(non-empty\x20array\x20of\x20substep\x20execution\x20records,\x20'+'63-spec\x20§2.1).\x20Construct\x20them\x20from\x20your\x20deployment\x20execution\x20trace:\x20each\x20onchain_operations\x20'+'call\x20=\x20one\x20substep\x20with\x20step_id\x20\x27T<step>.<substep>\x27,\x20input_refs\x20pointing\x20at\x20upstream\x20substeps.');const c=traceSubsteps({'project_prefix':b,'version':(a['version']??'v1')['trim'](),'network':a['network']??await Config['Instance']()['network_get'](),'substeps':a['substeps'],'edges':a['substep_edges']});return updateStageCache(b,(a['version']??'v1')['trim'](),{'stage':'substeps','trace_coherent':c['coherent'],'trace_can_proceed':c['coherent']}),{'action':'trace_substeps',...c};}
@@ -21,6 +21,7 @@ export interface AggregatedRisk {
21
21
  actual_value?: unknown;
22
22
  expected_value?: unknown;
23
23
  rule_source?: string;
24
+ proposal_node?: string;
24
25
  };
25
26
  }
26
27
  export interface RiskAggregationResult {
@@ -49,7 +50,7 @@ export interface RiskAggregationResult {
49
50
  }>>;
50
51
  warnings: string[];
51
52
  }
52
- export declare function aggregateProjectRisks(input: RiskAggregationInput): RiskAggregationResult;
53
+ export declare function aggregateProjectRisks(input: RiskAggregationInput): Promise<RiskAggregationResult>;
53
54
  export declare function sortFindings(findings: AggregatedRisk[]): AggregatedRisk[];
54
55
  export declare function countBySeverity(findings: AggregatedRisk[]): Record<RiskSeverity, number>;
55
56
  export declare function determineStatus(severity_summary: Record<RiskSeverity, number>, threshold: RiskSeverity, user_confirmed_high_risks: string[], findings: AggregatedRisk[]): RiskAggregationResult["status"];