@wowok/agent-mcp 3.1.3 → 3.1.4

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 (379) hide show
  1. package/dist/config/config-audit.spec.d.ts +1 -0
  2. package/dist/config/config-audit.spec.js +1 -0
  3. package/dist/config/exposure.d.ts +108 -0
  4. package/dist/config/exposure.js +1 -0
  5. package/dist/config/index.d.ts +2 -0
  6. package/dist/config/index.js +1 -1
  7. package/dist/config/judgment.d.ts +1228 -0
  8. package/dist/config/judgment.js +1 -0
  9. package/dist/config/judgment.spec.d.ts +1 -0
  10. package/dist/config/judgment.spec.js +1 -0
  11. package/dist/config/rule-engine.d.ts +299 -0
  12. package/dist/config/rule-engine.js +1 -0
  13. package/dist/config/rule-engine.spec.d.ts +1 -0
  14. package/dist/config/rule-engine.spec.js +1 -0
  15. package/dist/config/severity.d.ts +7 -0
  16. package/dist/config/severity.js +1 -0
  17. package/dist/customer/order-monitor.d.ts +3 -1
  18. package/dist/customer/order-monitor.js +1 -1
  19. package/dist/evaluation/acceptance.d.ts +1 -0
  20. package/dist/evaluation/acceptance.js +1 -1
  21. package/dist/evaluation/arbitration-game.js +1 -1
  22. package/dist/evaluation/builtins/demand-match.js +1 -1
  23. package/dist/evaluation/builtins/graph-service.js +1 -1
  24. package/dist/evaluation/builtins/graph-service.spec.js +1 -1
  25. package/dist/evaluation/engine.js +1 -1
  26. package/dist/evaluation/game-strategy.d.ts +2 -2
  27. package/dist/evaluation/game-strategy.js +1 -1
  28. package/dist/evaluation/match-operation.d.ts +2 -2
  29. package/dist/evaluation/match-operation.js +1 -1
  30. package/dist/evaluation/standards.d.ts +3 -25
  31. package/dist/evaluation/standards.js +1 -1
  32. package/dist/evaluation/types.d.ts +2 -1
  33. package/dist/experience/realtime-feedback.js +1 -1
  34. package/dist/extensions/business-modules.js +1 -1
  35. package/dist/extensions/custom-registry-file.js +1 -1
  36. package/dist/extensions/industry-audit.spec.d.ts +1 -0
  37. package/dist/extensions/industry-audit.spec.js +1 -0
  38. package/dist/extensions/industry-layers.d.ts +8 -0
  39. package/dist/extensions/industry-layers.js +1 -1
  40. package/dist/extensions/industry-pack.d.ts +2 -0
  41. package/dist/extensions/industry-pack.js +1 -1
  42. package/dist/extensions/mode-evaluator.js +1 -1
  43. package/dist/extensions/modes.js +1 -1
  44. package/dist/graph/onchain/analyze.d.ts +3 -1
  45. package/dist/graph/onchain/analyze.js +1 -1
  46. package/dist/graph/onchain/analyze.spec.js +1 -1
  47. package/dist/graph/onchain/edge-schema.d.ts +1 -0
  48. package/dist/graph/onchain/edge-schema.js +1 -1
  49. package/dist/graph/onchain/expand.js +1 -1
  50. package/dist/graph/onchain/exploration.d.ts +28 -0
  51. package/dist/graph/onchain/exploration.js +1 -0
  52. package/dist/graph/onchain/exploration.spec.d.ts +1 -0
  53. package/dist/graph/onchain/exploration.spec.js +1 -0
  54. package/dist/graph/onchain/exposure.d.ts +18 -0
  55. package/dist/graph/onchain/exposure.js +1 -0
  56. package/dist/graph/onchain/exposure.spec.d.ts +1 -0
  57. package/dist/graph/onchain/exposure.spec.js +1 -0
  58. package/dist/graph/onchain/graph-policy.spec.d.ts +1 -0
  59. package/dist/graph/onchain/graph-policy.spec.js +1 -0
  60. package/dist/graph/onchain/index.d.ts +6 -0
  61. package/dist/graph/onchain/index.js +1 -1
  62. package/dist/graph/onchain/interest.js +1 -1
  63. package/dist/graph/onchain/interest.spec.js +1 -1
  64. package/dist/graph/onchain/names.js +1 -1
  65. package/dist/graph/onchain/names.spec.js +1 -1
  66. package/dist/graph/onchain/policy.d.ts +8 -0
  67. package/dist/graph/onchain/policy.js +1 -0
  68. package/dist/graph/onchain/proposal-graph.js +1 -1
  69. package/dist/graph/onchain/proposal-graph.spec.js +1 -1
  70. package/dist/graph/onchain/synthesis.d.ts +20 -0
  71. package/dist/graph/onchain/synthesis.js +1 -0
  72. package/dist/graph/onchain/synthesis.spec.d.ts +1 -0
  73. package/dist/graph/onchain/synthesis.spec.js +1 -0
  74. package/dist/graph/onchain/types.d.ts +11 -1
  75. package/dist/keeper/keeper.spec.js +1 -1
  76. package/dist/knowledge/alloc-audit-policy.spec.d.ts +1 -0
  77. package/dist/knowledge/alloc-audit-policy.spec.js +1 -0
  78. package/dist/knowledge/allocation-ledger.js +1 -1
  79. package/dist/knowledge/allocation-puzzle.d.ts +1 -1
  80. package/dist/knowledge/allocation-puzzle.js +1 -1
  81. package/dist/knowledge/allocation-risk.d.ts +4 -1
  82. package/dist/knowledge/allocation-risk.js +1 -1
  83. package/dist/knowledge/allocation-templates.js +1 -1
  84. package/dist/knowledge/arb-risk.d.ts +6 -5
  85. package/dist/knowledge/arb-risk.js +1 -1
  86. package/dist/knowledge/arbitration-ledger.d.ts +4 -4
  87. package/dist/knowledge/arbitration-ledger.js +1 -1
  88. package/dist/knowledge/arbitration-puzzle.d.ts +1 -1
  89. package/dist/knowledge/arbitration-puzzle.js +1 -1
  90. package/dist/knowledge/arbitration-risk.d.ts +4 -1
  91. package/dist/knowledge/arbitration-risk.js +1 -1
  92. package/dist/knowledge/arbitration-templates.js +1 -1
  93. package/dist/knowledge/baselines/judgment-baselines.json +289 -0
  94. package/dist/knowledge/baselines/risk-baselines.spec.js +1 -1
  95. package/dist/knowledge/baselines/rules/alloc_audit.json +290 -0
  96. package/dist/knowledge/baselines/rules/allocation.json +492 -0
  97. package/dist/knowledge/baselines/rules/arb.json +155 -0
  98. package/dist/knowledge/baselines/rules/arbitration.json +366 -0
  99. package/dist/knowledge/baselines/rules/bridge.json +197 -0
  100. package/dist/knowledge/baselines/rules/contact.json +152 -0
  101. package/dist/knowledge/baselines/rules/demand.json +158 -0
  102. package/dist/knowledge/baselines/rules/graph.json +453 -0
  103. package/dist/knowledge/baselines/rules/guard.json +981 -0
  104. package/dist/knowledge/baselines/rules/machine.json +706 -0
  105. package/dist/knowledge/baselines/rules/order.json +549 -0
  106. package/dist/knowledge/baselines/rules/payment.json +205 -0
  107. package/dist/knowledge/baselines/rules/permission.json +330 -0
  108. package/dist/knowledge/baselines/rules/personal.json +139 -0
  109. package/dist/knowledge/baselines/rules/progress.json +346 -0
  110. package/dist/knowledge/baselines/rules/proof.json +158 -0
  111. package/dist/knowledge/baselines/rules/registrar.json +159 -0
  112. package/dist/knowledge/baselines/rules/repository.json +244 -0
  113. package/dist/knowledge/baselines/rules/resource.json +117 -0
  114. package/dist/knowledge/baselines/rules/reward.json +471 -0
  115. package/dist/knowledge/baselines/rules/service.json +595 -0
  116. package/dist/knowledge/baselines/rules/treasury.json +440 -0
  117. package/dist/knowledge/baselines/rules/util.json +101 -0
  118. package/dist/knowledge/bridge-risk.d.ts +6 -5
  119. package/dist/knowledge/bridge-risk.js +1 -1
  120. package/dist/knowledge/builtin-templates.d.ts +26 -0
  121. package/dist/knowledge/builtin-templates.js +1 -0
  122. package/dist/knowledge/contact-risk.d.ts +6 -5
  123. package/dist/knowledge/contact-risk.js +1 -1
  124. package/dist/knowledge/demand-risk.d.ts +6 -5
  125. package/dist/knowledge/demand-risk.js +1 -1
  126. package/dist/knowledge/event-semantics.js +1 -1
  127. package/dist/knowledge/facts-sync.spec.d.ts +1 -0
  128. package/dist/knowledge/facts-sync.spec.js +1 -0
  129. package/dist/knowledge/getting-started.js +1 -1
  130. package/dist/knowledge/guard-design-patterns.js +1 -1
  131. package/dist/knowledge/guard-field-cognition.d.ts +1 -1
  132. package/dist/knowledge/guard-field-cognition.js +1 -1
  133. package/dist/knowledge/guard-ledger.js +1 -1
  134. package/dist/knowledge/guard-risk.d.ts +4 -1
  135. package/dist/knowledge/guard-risk.js +1 -1
  136. package/dist/knowledge/guard-templates.js +1 -1
  137. package/dist/knowledge/guard-translation.js +1 -1
  138. package/dist/knowledge/index.d.ts +10 -2
  139. package/dist/knowledge/index.js +1 -1
  140. package/dist/knowledge/industry-registry.js +1 -1
  141. package/dist/knowledge/industry-strategy.js +1 -1
  142. package/dist/knowledge/jsonrpc-enum.js +1 -1
  143. package/dist/knowledge/machine-ledger.js +1 -1
  144. package/dist/knowledge/machine-risk.d.ts +4 -1
  145. package/dist/knowledge/machine-risk.js +1 -1
  146. package/dist/knowledge/machine-templates.js +1 -1
  147. package/dist/knowledge/machine-translation.js +1 -1
  148. package/dist/knowledge/migration-preflight.js +1 -1
  149. package/dist/knowledge/operation-dictionary.js +1 -1
  150. package/dist/knowledge/order-ledger.js +1 -1
  151. package/dist/knowledge/order-puzzle.d.ts +3 -3
  152. package/dist/knowledge/order-puzzle.js +1 -1
  153. package/dist/knowledge/order-risk.d.ts +6 -3
  154. package/dist/knowledge/order-risk.js +1 -1
  155. package/dist/knowledge/order-templates.js +1 -1
  156. package/dist/knowledge/passport-ledger.js +1 -1
  157. package/dist/knowledge/passport-templates.js +1 -1
  158. package/dist/knowledge/payment-risk.d.ts +8 -6
  159. package/dist/knowledge/payment-risk.js +1 -1
  160. package/dist/knowledge/payment-tracker.js +1 -1
  161. package/dist/knowledge/permission-ledger.js +1 -1
  162. package/dist/knowledge/permission-puzzle.d.ts +12 -12
  163. package/dist/knowledge/permission-puzzle.js +1 -1
  164. package/dist/knowledge/permission-risk.d.ts +4 -7
  165. package/dist/knowledge/permission-risk.js +1 -1
  166. package/dist/knowledge/permission-templates.js +1 -1
  167. package/dist/knowledge/personal-risk.d.ts +6 -5
  168. package/dist/knowledge/personal-risk.js +1 -1
  169. package/dist/knowledge/progress-ledger.js +1 -1
  170. package/dist/knowledge/progress-puzzle.d.ts +2 -2
  171. package/dist/knowledge/progress-puzzle.js +1 -1
  172. package/dist/knowledge/progress-risk.d.ts +4 -1
  173. package/dist/knowledge/progress-risk.js +1 -1
  174. package/dist/knowledge/progress-templates.js +1 -1
  175. package/dist/knowledge/proof-risk.d.ts +6 -5
  176. package/dist/knowledge/proof-risk.js +1 -1
  177. package/dist/knowledge/puzzle-projections.js +1 -1
  178. package/dist/knowledge/recipient-constraint.d.ts +20 -1
  179. package/dist/knowledge/recipient-constraint.js +1 -1
  180. package/dist/knowledge/registrar-risk.d.ts +6 -5
  181. package/dist/knowledge/registrar-risk.js +1 -1
  182. package/dist/knowledge/repository-risk.d.ts +7 -6
  183. package/dist/knowledge/repository-risk.js +1 -1
  184. package/dist/knowledge/resource-risk.d.ts +6 -5
  185. package/dist/knowledge/resource-risk.js +1 -1
  186. package/dist/knowledge/reward-ledger.d.ts +1 -1
  187. package/dist/knowledge/reward-ledger.js +1 -1
  188. package/dist/knowledge/reward-puzzle.d.ts +2 -2
  189. package/dist/knowledge/reward-puzzle.js +1 -1
  190. package/dist/knowledge/reward-risk.d.ts +4 -1
  191. package/dist/knowledge/reward-risk.js +1 -1
  192. package/dist/knowledge/rule-node-analyzers.spec.js +1 -1
  193. package/dist/knowledge/rule-outcome.js +1 -1
  194. package/dist/knowledge/scenario-modes.d.ts +2 -2
  195. package/dist/knowledge/scenario-modes.js +1 -1
  196. package/dist/knowledge/scenario-topology.js +1 -1
  197. package/dist/knowledge/service-allocator-audit-node.js +1 -1
  198. package/dist/knowledge/service-ledger.js +1 -1
  199. package/dist/knowledge/service-puzzle.d.ts +2 -2
  200. package/dist/knowledge/service-puzzle.js +1 -1
  201. package/dist/knowledge/service-risk-node.js +1 -1
  202. package/dist/knowledge/service-risk.d.ts +4 -1
  203. package/dist/knowledge/service-risk.js +1 -1
  204. package/dist/knowledge/service-templates.js +1 -1
  205. package/dist/knowledge/strategy-manuals.d.ts +1 -1
  206. package/dist/knowledge/strategy-manuals.js +1 -1
  207. package/dist/knowledge/template-loader.d.ts +84 -0
  208. package/dist/knowledge/template-loader.js +1 -0
  209. package/dist/knowledge/template-loader.spec.d.ts +1 -0
  210. package/dist/knowledge/template-loader.spec.js +1 -0
  211. package/dist/knowledge/template-registry.js +1 -1
  212. package/dist/knowledge/template-scanner.d.ts +17 -0
  213. package/dist/knowledge/template-scanner.js +1 -0
  214. package/dist/knowledge/template-scanner.spec.d.ts +1 -0
  215. package/dist/knowledge/template-scanner.spec.js +1 -0
  216. package/dist/knowledge/tools-reference.js +1 -1
  217. package/dist/knowledge/treasury-ledger.d.ts +1 -1
  218. package/dist/knowledge/treasury-ledger.js +1 -1
  219. package/dist/knowledge/treasury-puzzle.d.ts +3 -3
  220. package/dist/knowledge/treasury-puzzle.js +1 -1
  221. package/dist/knowledge/treasury-risk.d.ts +4 -1
  222. package/dist/knowledge/treasury-risk.js +1 -1
  223. package/dist/knowledge/treasury-templates.js +1 -1
  224. package/dist/knowledge/util-risk.d.ts +6 -5
  225. package/dist/knowledge/util-risk.js +1 -1
  226. package/dist/knowledge/workflow-guidance.d.ts +4 -0
  227. package/dist/knowledge/workflow-guidance.js +1 -1
  228. package/dist/knowledge/workspace-lists.js +1 -1
  229. package/dist/monitor/MonitorLoop.js +1 -1
  230. package/dist/participation/arbitrator-interest.js +1 -1
  231. package/dist/participation/radar-core.js +1 -1
  232. package/dist/persona/analyzer.js +1 -1
  233. package/dist/persona/index.js +1 -1
  234. package/dist/persona/model.js +1 -1
  235. package/dist/persona/persona-audit.spec.d.ts +1 -0
  236. package/dist/persona/persona-audit.spec.js +1 -0
  237. package/dist/persona/types.d.ts +2 -0
  238. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  239. package/dist/playbooks/service-build/facet-money.d.ts +11 -0
  240. package/dist/playbooks/service-build/facet-money.js +1 -1
  241. package/dist/playbooks/service-build/machine-panorama.d.ts +17 -0
  242. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  243. package/dist/playbooks/service-build/merchant-guide.d.ts +2 -2
  244. package/dist/playbooks/service-build/migration-planner.d.ts +43 -0
  245. package/dist/playbooks/service-build/migration-planner.js +1 -0
  246. package/dist/playbooks/service-build/object-panorama.d.ts +42 -1
  247. package/dist/playbooks/service-build/object-panorama.js +1 -1
  248. package/dist/playbooks/service-build/participation-radar.js +1 -1
  249. package/dist/playbooks/service-build/pipeline-actions.d.ts +1 -1
  250. package/dist/playbooks/service-build/reverse-mapping.d.ts +1 -0
  251. package/dist/playbooks/service-build/reverse-mapping.js +1 -1
  252. package/dist/playbooks/service-build/risk-aggregator.d.ts +2 -1
  253. package/dist/playbooks/service-build/risk-aggregator.js +1 -1
  254. package/dist/playbooks/service-build/semantic-graph.js +1 -1
  255. package/dist/playbooks/service-build/service-panorama.d.ts +53 -1
  256. package/dist/playbooks/service-build/service-panorama.js +1 -1
  257. package/dist/playbooks/service-build/topology-evaluation.spec.js +1 -1
  258. package/dist/playbooks/service-build/topology-query.js +1 -1
  259. package/dist/playbooks/service-build/workflow-design-assessment.d.ts +2 -2
  260. package/dist/playbooks/service-build/workflow-design-assessment.js +1 -1
  261. package/dist/relationship/registry.js +1 -1
  262. package/dist/review/machine.js +1 -1
  263. package/dist/review/order.js +1 -1
  264. package/dist/review/service.js +1 -1
  265. package/dist/review/types.d.ts +7 -0
  266. package/dist/safety/confirm-gate.js +1 -1
  267. package/dist/schema/benchmark-migration/index.d.ts +207 -0
  268. package/dist/schema/benchmark-migration/index.js +1 -0
  269. package/dist/schema/call/allocation.d.ts +1 -1
  270. package/dist/schema/call/allocation.js +1 -1
  271. package/dist/schema/call/arbitration.d.ts +1 -1
  272. package/dist/schema/call/arbitration.js +1 -1
  273. package/dist/schema/call/base.d.ts +5 -5
  274. package/dist/schema/call/base.js +1 -1
  275. package/dist/schema/call/contact.d.ts +1 -1
  276. package/dist/schema/call/demand.d.ts +1 -1
  277. package/dist/schema/call/guard.d.ts +3 -3
  278. package/dist/schema/call/machine.d.ts +5 -5
  279. package/dist/schema/call/order.d.ts +3 -3
  280. package/dist/schema/call/payment.js +1 -1
  281. package/dist/schema/call/permission-handler.d.ts +1 -1
  282. package/dist/schema/call/permission-handler.js +1 -1
  283. package/dist/schema/call/permission.d.ts +16 -16
  284. package/dist/schema/call/permission.js +1 -1
  285. package/dist/schema/call/personal.d.ts +8 -8
  286. package/dist/schema/call/personal.js +1 -1
  287. package/dist/schema/call/progress.d.ts +3 -3
  288. package/dist/schema/call/repository.d.ts +11 -11
  289. package/dist/schema/call/repository.js +1 -1
  290. package/dist/schema/call/reward.d.ts +1 -1
  291. package/dist/schema/call/semantic.js +1 -1
  292. package/dist/schema/call/service.d.ts +7 -7
  293. package/dist/schema/call/service.js +1 -1
  294. package/dist/schema/call/treasury.d.ts +1 -1
  295. package/dist/schema/common/index.d.ts +6 -6
  296. package/dist/schema/common/index.js +1 -1
  297. package/dist/schema/config/index.d.ts +50 -1
  298. package/dist/schema/config/index.js +1 -1
  299. package/dist/schema/evaluation/index.d.ts +27 -11
  300. package/dist/schema/evaluation/index.js +1 -1
  301. package/dist/schema/goal/index.d.ts +5 -5
  302. package/dist/schema/goal/planning.d.ts +15 -15
  303. package/dist/schema/goal/planning.js +1 -1
  304. package/dist/schema/index.d.ts +1 -0
  305. package/dist/schema/index.js +1 -1
  306. package/dist/schema/interaction/index.d.ts +1 -1
  307. package/dist/schema/local/index.js +1 -1
  308. package/dist/schema/messenger/index.d.ts +26 -26
  309. package/dist/schema/operations.d.ts +33 -33
  310. package/dist/schema/operations.js +1 -1
  311. package/dist/schema/persona/index.d.ts +4708 -0
  312. package/dist/schema/persona/index.js +1 -1
  313. package/dist/schema/query/bi.d.ts +232 -25
  314. package/dist/schema/query/bi.js +1 -1
  315. package/dist/schema/query/index.d.ts +35 -35
  316. package/dist/schema/query/index.js +1 -1
  317. package/dist/schema/schema-version.js +1 -1
  318. package/dist/schema/workflow/index.d.ts +1 -1
  319. package/dist/schema-query-impl/index.d.ts +9 -0
  320. package/dist/schema-query-impl/index.js +1 -1
  321. package/dist/schemas/benchmark_migration_operation.output.json +793 -0
  322. package/dist/schemas/benchmark_migration_operation.schema.json +83 -0
  323. package/dist/schemas/bridge_operation.schema.json +5 -5
  324. package/dist/schemas/config_operation.output.json +252 -0
  325. package/dist/schemas/config_operation.schema.json +21 -1
  326. package/dist/schemas/evaluation_operation.output.json +22 -10
  327. package/dist/schemas/goal_operation.schema.json +8 -8
  328. package/dist/schemas/guard2file.schema.json +1 -1
  329. package/dist/schemas/index.json +7 -1
  330. package/dist/schemas/machineNode2file.schema.json +1 -1
  331. package/dist/schemas/messenger_operation.schema.json +24 -12
  332. package/dist/schemas/onchain_events.output.json +1 -1
  333. package/dist/schemas/onchain_operations.output.json +4 -2
  334. package/dist/schemas/onchain_operations.schema.json +189 -139
  335. package/dist/schemas/onchain_operations_allocation.schema.json +13 -11
  336. package/dist/schemas/onchain_operations_arbitration.schema.json +10 -8
  337. package/dist/schemas/onchain_operations_contact.schema.json +7 -5
  338. package/dist/schemas/onchain_operations_demand.schema.json +7 -5
  339. package/dist/schemas/onchain_operations_gen_passport.schema.json +5 -3
  340. package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
  341. package/dist/schemas/onchain_operations_guard.schema.json +5 -3
  342. package/dist/schemas/onchain_operations_machine.schema.json +22 -18
  343. package/dist/schemas/onchain_operations_order.schema.json +11 -7
  344. package/dist/schemas/onchain_operations_payment.schema.json +3 -3
  345. package/dist/schemas/onchain_operations_permission.schema.json +19 -11
  346. package/dist/schemas/onchain_operations_personal.schema.json +16 -10
  347. package/dist/schemas/onchain_operations_progress.schema.json +11 -7
  348. package/dist/schemas/onchain_operations_proof.schema.json +5 -3
  349. package/dist/schemas/onchain_operations_repository.schema.json +12 -8
  350. package/dist/schemas/onchain_operations_reward.schema.json +11 -9
  351. package/dist/schemas/onchain_operations_service.schema.json +28 -22
  352. package/dist/schemas/onchain_operations_treasury.schema.json +11 -9
  353. package/dist/schemas/onchain_table_data.output.json +27 -17
  354. package/dist/schemas/persona_operation.output.json +15875 -1
  355. package/dist/schemas/persona_operation.schema.json +3056 -478
  356. package/dist/schemas/query_toolkit.output.json +343 -63
  357. package/dist/schemas/query_toolkit.schema.json +1 -1
  358. package/dist/schemas/workflow_operation.schema.json +4 -2
  359. package/dist/strategy/scorecard.js +1 -1
  360. package/dist/tools/handlers/benchmark-migration.d.ts +2 -0
  361. package/dist/tools/handlers/benchmark-migration.js +1 -0
  362. package/dist/tools/handlers/config.js +1 -1
  363. package/dist/tools/handlers/industry-pack.js +1 -1
  364. package/dist/tools/handlers/onchain.js +1 -1
  365. package/dist/tools/handlers/query.js +1 -1
  366. package/dist/tools/handlers/schema-query.js +1 -1
  367. package/dist/tools/index.js +1 -1
  368. package/dist/tools/move-fn-index.gen.d.ts +3 -0
  369. package/dist/tools/move-fn-index.gen.js +1 -0
  370. package/dist/tools/registry/business.js +1 -1
  371. package/dist/tools/registry/config.js +1 -1
  372. package/dist/tools/registry/evaluation.js +1 -1
  373. package/dist/tools/registry/onchain.js +1 -1
  374. package/dist/tools/sanitize-output.d.ts +3 -0
  375. package/dist/tools/sanitize-output.js +1 -0
  376. package/dist/tools/sanitize-output.spec.d.ts +1 -0
  377. package/dist/tools/sanitize-output.spec.js +1 -0
  378. package/package.json +9 -4
  379. package/dist/knowledge/baselines/evaluation-baselines.json +0 -79
@@ -1 +1 @@
1
- import{deriveCommercialRole,CORE_PERMISSION_INDEX}from'../role/derivation.js';import{annotateNodeName}from'../graph/onchain/order-status.js';const ORDER_HOLDER_CALL={'tool':'onchain_operations','path':'data.progress','reason':'namedOperator=\x22\x22\x20=\x20OrderHolder:\x20execute\x20via\x20onchain_operations\x20operation_type=\x22order\x22\x20data.progress\x20—\x20order::progress\x20runs\x20with\x20the\x20Order\x20as\x20holder\x20(short-circuit\x20set\x20by\x20service::buy).\x20Calling\x20workflow_operation\x20operate\x20(progress::next)\x20directly\x20aborts\x20permission#5\x20\x22Permission\x20denied\x22:\x20Progress-level\x20checks\x20do\x20not\x20recognize\x20the\x20OrderHolder.'},PROGRESS_OPERATE_CALL={'tool':'workflow_operation','path':'data.operate','reason':'Forward\x20requires\x20a\x20permission\x20index\x20or\x20a\x20named\x20operator:\x20execute\x20on\x20the\x20Progress\x20object\x20via\x20workflow_operation\x20action=operate.\x20The\x20OrderHolder\x20short-circuit\x20(order.data.progress)\x20does\x20not\x20apply\x20to\x20this\x20forward.'},GUARD_PASSPORT_SUFFIX='\x20The\x20forward\x20binds\x20a\x20Guard:\x20a\x20validated\x20passport\x20is\x20mandatory\x20on\x20either\x20route\x20(progress#9\x20\x22Passport\x20required\x22)\x20and\x20cannot\x20be\x20bypassed.';export function recommendedCallForExecutionPath(a,b){const c=a==='order_holder'?ORDER_HOLDER_CALL:a==='permission'||a==='named_operator'?PROGRESS_OPERATE_CALL:undefined;if(!c)return undefined;return b?{...c,'reason':c['reason']+GUARD_PASSPORT_SUFFIX}:c;}export function recommendedCallForForwardBinding(a){const b=a['permissionIndex']!=null?'permission':a['namedOperator']===''?'order_holder':a['namedOperator']!=null?'named_operator':'not_available';return recommendedCallForExecutionPath(b,a['hasGuard']);}export function analyzeOrderParticipation(a){const b=a['node_annotations'],c=a['current_node']??'',d=!!a['order_holder']&&a['order_holder']===a['account'],e=new Set();if(a['permission']?.['entityPermissions'])for(const [u,v]of a['permission']['entityPermissions']){if(u===a['account']){for(const w of v)e['add'](w);}}if(a['permission']){const x=a['permission']['admin']??[],y=a['permission']['owner'];(x['some'](z=>z['toLowerCase']()===a['account']['toLowerCase']())||y&&y['toLowerCase']()===a['account']['toLowerCase']())&&e['add'](CORE_PERMISSION_INDEX['service']);}const f=[];if(a['named_accounts'])for(const [z,A]of Object['entries'](a['named_accounts'])){if(nameResolvesTo(A,a['account']))f['push'](z);}const g=deriveCommercialRole({'account':a['account'],'order_holder':a['order_holder'],'held_permission_indexes':Array['from'](e),'named_operator_names':f,'demand_presenters':a['demand_presenters'],'has_active_order':!![]}),h=g['role'],i=g['collaborator_kind'],j=[],k=[],l=!a['workflow'];let m;if(a['workflow'])for(const B of a['workflow']['transitions']){if(B['prevNode']!==c)continue;m=B['threshold'];const C={'name':B['forward']??'(unnamed)','permissionIndex':B['permissionIndex']??null,'namedOperator':B['namedOperator']??null,'guard':B['guard']??null,'weight':B['weight']??null},D=resolveForward(C,B['node'],a,d,e,b);if(D['execution_path']==='not_available'){const E=C['permissionIndex']!=null?'permission\x20index\x20'+C['permissionIndex']:C['namedOperator']===''?'OrderHolder\x20(customer)':'named\x20operator\x20\x27'+C['namedOperator']+'\x27',F=k['find'](G=>G['role']===E);if(F)F['forwards']['push'](D['name']);else k['push']({'role':E,'forwards':[D['name']]});}else j['push'](D);}const n=[];d&&n['push']({'label':'OrderHolder\x20(customer)','can_act_now':j['some'](G=>G['execution_path']==='order_holder')});for(const G of[...e]['sort']((H,I)=>H-I)){n['push']({'label':'permission\x20index\x20'+G,'can_act_now':j['some'](H=>H['permission_index']===G)});}if(a['named_accounts'])for(const [H,I]of Object['entries'](a['named_accounts'])){nameResolvesTo(I,a['account'])&&n['push']({'label':'named\x20operator\x20\x27'+H+'\x27','can_act_now':j['some'](J=>J['named_operator']===H)});}let o;j['length']>0x1&&(o={'message':j['length']+'\x20operations\x20are\x20available\x20to\x20you\x20at\x20node\x20\x27'+(c||'(entry)')+'\x27.\x20'+'Each\x20leads\x20to\x20a\x20different\x20outcome\x20—\x20review\x20the\x20consequences\x20and\x20choose;\x20no\x20one\x20else\x20can\x20make\x20this\x20decision\x20for\x20you.','options':j['map'](J=>({'forward':J['name'],'to_node':J['to_node'],'consequence':J['consequence']}))});const p=[];for(const J of a['claimable_rewards']??[]){if(J['already_claimed'])continue;p['push']({'kind':'reward','label':J['description']??'Reward\x20'+J['address'],'how':'onchain_operations\x20reward\x20op=\x27claim\x27\x20(object=\x27'+J['address']+'\x27)'});}a['pending_compensation']&&p['push']({'kind':'compensation','label':a['pending_compensation']['note']??'Arbitration\x20indemnity\x20awarded\x20to\x20you','how':'onchain_operations\x20service\x20op=\x27compensation_claim\x27\x20(arbitration=\x27'+a['pending_compensation']['arbitration']+'\x27)\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund'});a['discount_available']&&p['push']({'kind':'discount','label':a['discount_available'],'how':'Mention\x20the\x20discount\x20when\x20placing\x20the\x20next\x20order\x20(reward\x20discount\x20config\x20applies\x20at\x20purchase)'});a['rating_pending']&&p['push']({'kind':'rating','label':'Rate\x20this\x20transaction\x20(like/dislike)\x20—\x20builds\x20on-chain\x20reputation\x20for\x20both\x20sides','how':'onchain_operations\x20operation_type=\x27personal\x27,\x20data.mark={op:\x27like\x27|\x27dislike\x27,\x20address:\x27<merchant\x20address>\x27}\x20—\x20votes\x20through\x20registrar::like/dislike\x20into\x20the\x20PUBLIC\x20aggregate\x20count'});const q=buildInterestHints(a,h,j,k,c),s=buildSummary(a,h,n,j,k,p,l,c);return{'account':a['account'],'progress':a['progress_address'],'order':a['order_address'],'current_node':c,'perspective':h,'collaborator_kind':i,'roles':n,'operable':j,'branch_choice':o,'waiting_on':k,'pending_claims':p,'interest_hints':q,'workflow_unknown':l,'threshold':m,'summary':s};}export function aggregateRadar(a,b){const c=a['filter'](g=>g['operable']['length']>0x0||g['pending_claims']['length']>0x0)['sort']((g,h)=>(g['perspective']==='customer'?0x0:0x1)-(h['perspective']==='customer'?0x0:0x1)),d=a['filter'](g=>g['operable']['length']===0x0&&g['pending_claims']['length']===0x0),e=a['flatMap'](g=>g['pending_claims']['map'](h=>({...h,'progress':g['progress']}))),f=a['length']===0x0?'No\x20in-flight\x20orders\x20found\x20for\x20this\x20account.':a['length']+'\x20in-flight\x20order(s):\x20'+c['length']+'\x20need\x20your\x20action\x20or\x20have\x20claims,\x20'+d['length']+'\x20are\x20waiting\x20on\x20other\x20roles.\x20'+(e['length']>0x0?e['length']+'\x20unclaimed\x20benefit(s)\x20detected.\x20':'')+(c['length']>0x0?'Top\x20priority:\x20'+c[0x0]['summary']:'Nothing\x20requires\x20your\x20action\x20right\x20now.');return{'account':a[0x0]?.['account']??'','orders_analyzed':a['length'],'actionable':c,'waiting':d,'all_pending_claims':e,'unread_messages_total':b??0x0,'summary':f};}function nameResolvesTo(a,b){if(!a)return![];return Array['isArray'](a)?a['includes'](b):a===b;}export function isConsequenceNode(a,b,c){const d=(a??'')['toLowerCase'](),e=c?.[b];if(e?.['some'](g=>!!g&&d['includes'](g['toLowerCase']())))return!![];const f=annotateNodeName(a??'');return b==='completed'?f==='completion':f==='refund'||f==='exception';}function resolveForward(a,b,c,d,e,f){let g='not_available';if(a['permissionIndex']!=null){if(e['has'](a['permissionIndex']))g='permission';}else{if(a['namedOperator']===''){if(d)g='order_holder';}else{if(a['namedOperator']!=null){const k=c['named_accounts']?.[a['namedOperator']];if(nameResolvesTo(k,c['account']))g='named_operator';}}}const h=b,i=describeForward(a['name']??'',h,g,a['permissionIndex'],a['namedOperator']),j=consequenceOf(h,f);return{'name':a['name']??'(unnamed)','to_node':h,'execution_path':g,'permission_index':a['permissionIndex']??undefined,'named_operator':a['namedOperator']??undefined,'guard':a['guard']??undefined,'semantics':i,'consequence':j,'weight':a['weight']??undefined,'recommended_call':recommendedCallForExecutionPath(g,!!a['guard'])};}function describeForward(a,b,c,d,e){const f=d!=null?'requires\x20permission\x20index\x20'+d:e===''?'executable\x20by\x20the\x20order\x20holder\x20(customer)':'executable\x20by\x20named\x20operator\x20\x27'+e+'\x27',g=c==='not_available'?'You\x20CANNOT\x20execute\x20this':'You\x20CAN\x20execute\x20this';return'\x27'+a+'\x27\x20advances\x20the\x20order\x20to\x20node\x20\x27'+b+'\x27\x20('+f+').\x20'+g+'.';}export function consequenceOf(a,b){if(isConsequenceNode(a,'completed',b))return'Completion\x20path\x20—\x20funds\x20are\x20released\x20to\x20the\x20merchant\x20per\x20the\x20Allocation\x20waterfall;\x20refunds\x20become\x20harder\x20after\x20this\x20point.';if(isConsequenceNode(a,'refunded',b))return'Refund/cancellation\x20path\x20—\x20escrowed\x20funds\x20return\x20to\x20the\x20buyer\x20per\x20the\x20Allocation\x20configuration.';return undefined;}function buildInterestHints(a,b,c,d,e){const f=[],g=a['now']??Date['now'](),h=a['last_progress_at']!=null?(g-a['last_progress_at'])/0x36ee80:undefined;if(b==='customer')c['length']>0x0&&f['push']('Your\x20confirmation\x20is\x20the\x20fund-release\x20trigger:\x20escrowed\x20money\x20stays\x20locked\x20until\x20YOU\x20act\x20—\x20only\x20confirm\x20when\x20the\x20deliverable\x20matches\x20the\x20agreement.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Delivery\x20depends\x20on\x20the\x20merchant-side\x20roles\x20listed\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20Messenger\x20first,\x20then\x20consider\x20dispute\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x18&&f['push']('Order\x20has\x20not\x20advanced\x20for\x20'+Math['round'](h)+'h.\x20Your\x20leverage:\x20compensation_fund\x20(if\x20any)\x20+\x20arbitration\x20+\x20on-chain\x20reputation\x20(dislike)\x20—\x20in\x20that\x20order.');else{if(b==='supplier')c['length']>0x0&&f['push']('Advancing\x20your\x20sub-order\x20NOW\x20unlocks\x20YOUR\x20settlement\x20—\x20upload\x20delivery\x20evidence\x20first\x20to\x20protect\x20your\x20payment\x20claim\x20against\x20the\x20upstream\x20merchant.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Your\x20settlement\x20depends\x20on\x20upstream\x20roles\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20a\x20Messenger\x20nudge\x20first,\x20then\x20arbitration\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x30&&f['push']('Sub-order\x20stalled\x20'+Math['round'](h)+'h:\x20your\x20claim\x20erodes\x20with\x20time\x20—\x20evidence\x20+\x20a\x20Messenger\x20nudge\x20are\x20your\x20cheapest\x20protections.');else{if(b==='collaborator'||b==='merchant'){const i=d['filter'](j=>j['role']['startsWith']('permission\x20index'));c['length']>0x0&&f['push']('Advancing\x20the\x20workflow\x20NOW\x20improves\x20flow\x20efficiency\x20and\x20shortens\x20your\x20fund-settlement\x20cycle;\x20stalled\x20orders\x20degrade\x20your\x20on-chain\x20reputation\x20metrics\x20(dispute\x20rate,\x20stall\x20statistics).'),i['length']>0x0&&f['push']('Nodes\x20waiting\x20on\x20YOUR\x20permission\x20indexes\x20are\x20your\x20responsibility\x20surface:\x20prolonged\x20inaction\x20may\x20trigger\x20timeout\x20penalties\x20or\x20disputes\x20recorded\x20permanently\x20on-chain.'),e&&c['length']===0x0&&f['push']('Nothing\x20for\x20you\x20to\x20execute\x20at\x20this\x20node\x20—\x20monitor\x20only;\x20avoid\x20unnecessary\x20interference\x20that\x20creates\x20semantic\x20responsibility.');}else f['push']('You\x20hold\x20no\x20operative\x20role\x20on\x20this\x20order\x20(neutral).\x20On-chain\x20data\x20remains\x20transparent\x20to\x20you\x20for\x20auditing.');}}return(a['unread_messages']??0x0)>0x0&&f['push'](a['unread_messages']+'\x20unread\x20Messenger\x20message(s)\x20—\x20negotiation\x20evidence\x20(WTS)\x20forms\x20the\x20arbitration\x20record;\x20timely\x20replies\x20protect\x20your\x20position.'),f;}function buildSummary(a,b,c,d,e,f,g,h){const i=c['length']>0x0?c['map'](m=>m['label'])['join'](',\x20'):'no\x20operative\x20role',j=h===''?'(entry,\x20not\x20started)':'\x27'+h+'\x27';if(g)return'Order\x20'+a['progress_address']+'\x20is\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+').\x20Machine\x20workflow\x20data\x20unavailable\x20—\x20fetch\x20the\x20bound\x20Machine\x20to\x20see\x20executable\x20operations.';const k=d['length']>0x0?'you\x20can\x20execute:\x20'+d['map'](m=>'\x27'+m['name']+'\x27→\x27'+m['to_node']+'\x27')['join'](',\x20'):e['length']>0x0?'waiting\x20on\x20'+e['map'](m=>m['role'])['join'](',\x20'):'no\x20pending\x20operations\x20at\x20this\x20node',l=f['length']>0x0?'\x20'+f['length']+'\x20unclaimed\x20benefit(s).':'';return'Order\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+')\x20—\x20'+k+'.'+l;}
1
+ import{deriveCommercialRole,CORE_PERMISSION_INDEX}from'../role/derivation.js';import{annotateNodeName}from'../graph/onchain/order-status.js';const ORDER_HOLDER_CALL={'tool':'onchain_operations','path':'data.progress','reason':'namedOperator=\x22\x22\x20=\x20OrderHolder:\x20execute\x20via\x20onchain_operations\x20operation_type=\x22order\x22\x20data.progress\x20—\x20order::progress\x20runs\x20with\x20the\x20Order\x20as\x20holder\x20(OrderHolder\x20short-circuit\x20established\x20at\x20purchase).\x20Calling\x20workflow_operation\x20operate\x20(direct\x20Progress\x20execution)\x20aborts\x20permission#5\x20\x22Permission\x20denied\x22:\x20Progress-level\x20checks\x20do\x20not\x20recognize\x20the\x20OrderHolder.'},PROGRESS_OPERATE_CALL={'tool':'workflow_operation','path':'data.operate','reason':'Forward\x20requires\x20a\x20permission\x20index\x20or\x20a\x20named\x20operator:\x20execute\x20on\x20the\x20Progress\x20object\x20via\x20workflow_operation\x20action=operate.\x20The\x20OrderHolder\x20short-circuit\x20(order.data.progress)\x20does\x20not\x20apply\x20to\x20this\x20forward.'},GUARD_PASSPORT_SUFFIX='\x20The\x20forward\x20binds\x20a\x20Guard:\x20a\x20validated\x20passport\x20is\x20mandatory\x20on\x20either\x20route\x20(progress#9\x20\x22Passport\x20required\x22)\x20and\x20cannot\x20be\x20bypassed.';export function recommendedCallForExecutionPath(a,b){const c=a==='order_holder'?ORDER_HOLDER_CALL:a==='permission'||a==='named_operator'?PROGRESS_OPERATE_CALL:undefined;if(!c)return undefined;return b?{...c,'reason':c['reason']+GUARD_PASSPORT_SUFFIX}:c;}export function recommendedCallForForwardBinding(a){const b=a['permissionIndex']!=null?'permission':a['namedOperator']===''?'order_holder':a['namedOperator']!=null?'named_operator':'not_available';return recommendedCallForExecutionPath(b,a['hasGuard']);}export function analyzeOrderParticipation(a){const b=a['node_annotations'],c=a['current_node']??'',d=!!a['order_holder']&&a['order_holder']===a['account'],e=new Set();if(a['permission']?.['entityPermissions'])for(const [u,v]of a['permission']['entityPermissions']){if(u===a['account']){for(const w of v)e['add'](w);}}if(a['permission']){const x=a['permission']['admin']??[],y=a['permission']['owner'];(x['some'](z=>z['toLowerCase']()===a['account']['toLowerCase']())||y&&y['toLowerCase']()===a['account']['toLowerCase']())&&e['add'](CORE_PERMISSION_INDEX['service']);}const f=[];if(a['named_accounts'])for(const [z,A]of Object['entries'](a['named_accounts'])){if(nameResolvesTo(A,a['account']))f['push'](z);}const g=deriveCommercialRole({'account':a['account'],'order_holder':a['order_holder'],'held_permission_indexes':Array['from'](e),'named_operator_names':f,'demand_presenters':a['demand_presenters'],'has_active_order':!![]}),h=g['role'],i=g['collaborator_kind'],j=[],k=[],l=!a['workflow'];let m;if(a['workflow'])for(const B of a['workflow']['transitions']){if(B['prevNode']!==c)continue;m=B['threshold'];const C={'name':B['forward']??'(unnamed)','permissionIndex':B['permissionIndex']??null,'namedOperator':B['namedOperator']??null,'guard':B['guard']??null,'weight':B['weight']??null},D=resolveForward(C,B['node'],a,d,e,b);if(D['execution_path']==='not_available'){const E=C['permissionIndex']!=null?'permission\x20index\x20'+C['permissionIndex']:C['namedOperator']===''?'OrderHolder\x20(customer)':'named\x20operator\x20\x27'+C['namedOperator']+'\x27',F=k['find'](G=>G['role']===E);if(F)F['forwards']['push'](D['name']);else k['push']({'role':E,'forwards':[D['name']]});}else j['push'](D);}const n=[];d&&n['push']({'label':'OrderHolder\x20(customer)','can_act_now':j['some'](G=>G['execution_path']==='order_holder')});for(const G of[...e]['sort']((H,I)=>H-I)){n['push']({'label':'permission\x20index\x20'+G,'can_act_now':j['some'](H=>H['permission_index']===G)});}if(a['named_accounts'])for(const [H,I]of Object['entries'](a['named_accounts'])){nameResolvesTo(I,a['account'])&&n['push']({'label':'named\x20operator\x20\x27'+H+'\x27','can_act_now':j['some'](J=>J['named_operator']===H)});}let o;j['length']>0x1&&(o={'message':j['length']+'\x20operations\x20are\x20available\x20to\x20you\x20at\x20node\x20\x27'+(c||'(entry)')+'\x27.\x20'+'Each\x20leads\x20to\x20a\x20different\x20outcome\x20—\x20review\x20the\x20consequences\x20and\x20choose;\x20no\x20one\x20else\x20can\x20make\x20this\x20decision\x20for\x20you.','options':j['map'](J=>({'forward':J['name'],'to_node':J['to_node'],'consequence':J['consequence']}))});const p=[];for(const J of a['claimable_rewards']??[]){if(J['already_claimed'])continue;p['push']({'kind':'reward','label':J['description']??'Reward\x20'+J['address'],'how':'onchain_operations\x20reward\x20op=\x27claim\x27\x20(object=\x27'+J['address']+'\x27)'});}a['pending_compensation']&&p['push']({'kind':'compensation','label':a['pending_compensation']['note']??'Arbitration\x20indemnity\x20awarded\x20to\x20you','how':'onchain_operations\x20order\x20op=\x27arb_claim_compensation\x27\x20(arb=\x27'+a['pending_compensation']['arbitration']+'\x27)\x20—\x20paid\x20directly\x20from\x20the\x20Service\x20compensation_fund'});a['discount_available']&&p['push']({'kind':'discount','label':a['discount_available'],'how':'Mention\x20the\x20discount\x20when\x20placing\x20the\x20next\x20order\x20(reward\x20discount\x20config\x20applies\x20at\x20purchase)'});a['rating_pending']&&p['push']({'kind':'rating','label':'Rate\x20this\x20transaction\x20(like/dislike)\x20—\x20builds\x20on-chain\x20reputation\x20for\x20both\x20sides','how':'onchain_operations\x20operation_type=\x27personal\x27,\x20data.mark={op:\x27like\x27|\x27dislike\x27,\x20address:\x27<merchant\x20address>\x27}\x20—\x20counts\x20into\x20the\x20PUBLIC\x20aggregate\x20via\x20the\x20on-chain\x20reputation\x20registry'});const q=buildInterestHints(a,h,j,k,c),s=buildSummary(a,h,n,j,k,p,l,c);return{'account':a['account'],'progress':a['progress_address'],'order':a['order_address'],'current_node':c,'perspective':h,'collaborator_kind':i,'roles':n,'operable':j,'branch_choice':o,'waiting_on':k,'pending_claims':p,'interest_hints':q,'workflow_unknown':l,'threshold':m,'summary':s};}export function aggregateRadar(a,b){const c=a['filter'](g=>g['operable']['length']>0x0||g['pending_claims']['length']>0x0)['sort']((g,h)=>(g['perspective']==='customer'?0x0:0x1)-(h['perspective']==='customer'?0x0:0x1)),d=a['filter'](g=>g['operable']['length']===0x0&&g['pending_claims']['length']===0x0),e=a['flatMap'](g=>g['pending_claims']['map'](h=>({...h,'progress':g['progress']}))),f=a['length']===0x0?'No\x20in-flight\x20orders\x20found\x20for\x20this\x20account.':a['length']+'\x20in-flight\x20order(s):\x20'+c['length']+'\x20need\x20your\x20action\x20or\x20have\x20claims,\x20'+d['length']+'\x20are\x20waiting\x20on\x20other\x20roles.\x20'+(e['length']>0x0?e['length']+'\x20unclaimed\x20benefit(s)\x20detected.\x20':'')+(c['length']>0x0?'Top\x20priority:\x20'+c[0x0]['summary']:'Nothing\x20requires\x20your\x20action\x20right\x20now.');return{'account':a[0x0]?.['account']??'','orders_analyzed':a['length'],'actionable':c,'waiting':d,'all_pending_claims':e,'unread_messages_total':b??0x0,'summary':f};}function nameResolvesTo(a,b){if(!a)return![];return Array['isArray'](a)?a['includes'](b):a===b;}export function isConsequenceNode(a,b,c){const d=(a??'')['toLowerCase'](),e=c?.[b];if(e?.['some'](g=>!!g&&d['includes'](g['toLowerCase']())))return!![];const f=annotateNodeName(a??'');return b==='completed'?f==='completion':f==='refund'||f==='exception';}function resolveForward(a,b,c,d,e,f){let g='not_available';if(a['permissionIndex']!=null){if(e['has'](a['permissionIndex']))g='permission';}else{if(a['namedOperator']===''){if(d)g='order_holder';}else{if(a['namedOperator']!=null){const k=c['named_accounts']?.[a['namedOperator']];if(nameResolvesTo(k,c['account']))g='named_operator';}}}const h=b,i=describeForward(a['name']??'',h,g,a['permissionIndex'],a['namedOperator']),j=consequenceOf(h,f);return{'name':a['name']??'(unnamed)','to_node':h,'execution_path':g,'permission_index':a['permissionIndex']??undefined,'named_operator':a['namedOperator']??undefined,'guard':a['guard']??undefined,'semantics':i,'consequence':j,'weight':a['weight']??undefined,'recommended_call':recommendedCallForExecutionPath(g,!!a['guard'])};}function describeForward(a,b,c,d,e){const f=d!=null?'requires\x20permission\x20index\x20'+d:e===''?'executable\x20by\x20the\x20order\x20holder\x20(customer)':'executable\x20by\x20named\x20operator\x20\x27'+e+'\x27',g=c==='not_available'?'You\x20CANNOT\x20execute\x20this':'You\x20CAN\x20execute\x20this';return'\x27'+a+'\x27\x20advances\x20the\x20order\x20to\x20node\x20\x27'+b+'\x27\x20('+f+').\x20'+g+'.';}export function consequenceOf(a,b){if(isConsequenceNode(a,'completed',b))return'Completion\x20path\x20—\x20funds\x20are\x20released\x20to\x20the\x20merchant\x20per\x20the\x20Allocation\x20waterfall;\x20refunds\x20become\x20harder\x20after\x20this\x20point.';if(isConsequenceNode(a,'refunded',b))return'Refund/cancellation\x20path\x20—\x20escrowed\x20funds\x20return\x20to\x20the\x20buyer\x20per\x20the\x20Allocation\x20configuration.';return undefined;}function buildInterestHints(a,b,c,d,e){const f=[],g=a['now']??Date['now'](),h=a['last_progress_at']!=null?(g-a['last_progress_at'])/0x36ee80:undefined;if(b==='customer')c['length']>0x0&&f['push']('Your\x20confirmation\x20is\x20the\x20fund-release\x20trigger:\x20escrowed\x20money\x20stays\x20locked\x20until\x20YOU\x20act\x20—\x20only\x20confirm\x20when\x20the\x20deliverable\x20matches\x20the\x20agreement.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Delivery\x20depends\x20on\x20the\x20merchant-side\x20roles\x20listed\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20Messenger\x20first,\x20then\x20consider\x20dispute\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x18&&f['push']('Order\x20has\x20not\x20advanced\x20for\x20'+Math['round'](h)+'h.\x20Your\x20leverage:\x20compensation_fund\x20(if\x20any)\x20+\x20arbitration\x20+\x20on-chain\x20reputation\x20(dislike)\x20—\x20in\x20that\x20order.');else{if(b==='supplier')c['length']>0x0&&f['push']('Advancing\x20your\x20sub-order\x20NOW\x20unlocks\x20YOUR\x20settlement\x20—\x20upload\x20delivery\x20evidence\x20first\x20to\x20protect\x20your\x20payment\x20claim\x20against\x20the\x20upstream\x20merchant.'),d['some'](i=>i['role']!=='OrderHolder\x20(customer)')&&f['push']('Your\x20settlement\x20depends\x20on\x20upstream\x20roles\x20in\x20waiting_on;\x20if\x20they\x20stall,\x20a\x20Messenger\x20nudge\x20first,\x20then\x20arbitration\x20via\x20the\x20bound\x20Arbitration.'),h!=null&&h>0x30&&f['push']('Sub-order\x20stalled\x20'+Math['round'](h)+'h:\x20your\x20claim\x20erodes\x20with\x20time\x20—\x20evidence\x20+\x20a\x20Messenger\x20nudge\x20are\x20your\x20cheapest\x20protections.');else{if(b==='collaborator'||b==='merchant'){const i=d['filter'](j=>j['role']['startsWith']('permission\x20index'));c['length']>0x0&&f['push']('Advancing\x20the\x20workflow\x20NOW\x20improves\x20flow\x20efficiency\x20and\x20shortens\x20your\x20fund-settlement\x20cycle;\x20stalled\x20orders\x20degrade\x20your\x20on-chain\x20reputation\x20metrics\x20(dispute\x20rate,\x20stall\x20statistics).'),i['length']>0x0&&f['push']('Nodes\x20waiting\x20on\x20YOUR\x20permission\x20indexes\x20are\x20your\x20responsibility\x20surface:\x20prolonged\x20inaction\x20may\x20trigger\x20timeout\x20penalties\x20or\x20disputes\x20recorded\x20permanently\x20on-chain.'),e&&c['length']===0x0&&f['push']('Nothing\x20for\x20you\x20to\x20execute\x20at\x20this\x20node\x20—\x20monitor\x20only;\x20avoid\x20unnecessary\x20interference\x20that\x20creates\x20semantic\x20responsibility.');}else f['push']('You\x20hold\x20no\x20operative\x20role\x20on\x20this\x20order\x20(neutral).\x20On-chain\x20data\x20remains\x20transparent\x20to\x20you\x20for\x20auditing.');}}return(a['unread_messages']??0x0)>0x0&&f['push'](a['unread_messages']+'\x20unread\x20Messenger\x20message(s)\x20—\x20negotiation\x20evidence\x20(WTS)\x20forms\x20the\x20arbitration\x20record;\x20timely\x20replies\x20protect\x20your\x20position.'),f;}function buildSummary(a,b,c,d,e,f,g,h){const i=c['length']>0x0?c['map'](m=>m['label'])['join'](',\x20'):'no\x20operative\x20role',j=h===''?'(entry,\x20not\x20started)':'\x27'+h+'\x27';if(g)return'Order\x20'+a['progress_address']+'\x20is\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+').\x20Machine\x20workflow\x20data\x20unavailable\x20—\x20fetch\x20the\x20bound\x20Machine\x20to\x20see\x20executable\x20operations.';const k=d['length']>0x0?'you\x20can\x20execute:\x20'+d['map'](m=>'\x27'+m['name']+'\x27→\x27'+m['to_node']+'\x27')['join'](',\x20'):e['length']>0x0?'waiting\x20on\x20'+e['map'](m=>m['role'])['join'](',\x20'):'no\x20pending\x20operations\x20at\x20this\x20node',l=f['length']>0x0?'\x20'+f['length']+'\x20unclaimed\x20benefit(s).':'';return'Order\x20at\x20'+j+';\x20you\x20are\x20'+b+'\x20('+i+')\x20—\x20'+k+'.'+l;}
@@ -1 +1 @@
1
- const INDUSTRY_KEYWORDS={'freelance':['freelance','upwork'],'rental':['rental','airbnb'],'education':['education','coursera'],'travel':['travel','booking'],'subscription':['subscription','patreon'],'retail':['retail','amazon']},ROLE_KEYWORDS={'merchant':['merchant','seller','provider'],'customer':['customer','buyer'],'demander':['demander','demand','requester','looking\x20for'],'prospect':['prospect','considering\x20a\x20purchase','shopping\x20for'],'supplier':['supplier','subcontractor','sub-order'],'collaborator':['collaborator','operator','staff','named\x20operator'],'arbitrator':['arbitrator','arbiter','judge']},RISK_KEYWORDS={'conservative':['conservative'],'aggressive':['aggressive']};export function analyzePersonaContext(a){const b=a['toLowerCase'](),c={'industries':[],'preferences':{},'requirements':[],'rules':[],'suggestions':[],'confidence':0x0};for(const [f,g]of Object['entries'](ROLE_KEYWORDS)){if(g['some'](h=>b['includes'](h))){c['role']=f,c['suggestions']['push']({'field':'role','value':f,'reason':'role\x20keyword\x20matched'});break;}}for(const [h,i]of Object['entries'](INDUSTRY_KEYWORDS)){i['some'](j=>b['includes'](j))&&(c['industries']['push'](h),c['suggestions']['push']({'field':'industries','value':h,'reason':'industry\x20keyword\x20matched'}));}if(RISK_KEYWORDS['conservative']['some'](j=>b['includes'](j)))c['preferences']['risk_appetite']='conservative',c['suggestions']['push']({'field':'preferences.risk_appetite','value':'conservative','reason':'conservative\x20keyword'});else RISK_KEYWORDS['aggressive']['some'](j=>b['includes'](j))&&(c['preferences']['risk_appetite']='aggressive',c['suggestions']['push']({'field':'preferences.risk_appetite','value':'aggressive','reason':'aggressive\x20keyword'}));const d=['must','forbid','never','require'],e=['learned','avoid'];for(const j of a['split'](/[;.\n]/)){const k=j['trim']();if(!k)continue;if(d['some'](l=>k['toLowerCase']()['includes'](l['toLowerCase']())))c['requirements']['push'](k),c['suggestions']['push']({'field':'requirements','value':k,'reason':'red-line\x20keyword'});else e['some'](l=>k['toLowerCase']()['includes'](l['toLowerCase']()))&&(c['rules']['push'](k),c['suggestions']['push']({'field':'rules','value':k,'reason':'experience\x20keyword'}));}return c['confidence']=Math['min'](0x1,c['suggestions']['length']*0.2),c;}
1
+ const INDUSTRY_KEYWORDS={'freelance':['freelance','gig','talent\x20marketplace'],'rental':['rental','homestay','short-term\x20rental'],'education':['education','online\x20course','tutoring'],'travel':['travel','hotel','tour'],'subscription':['subscription','membership','creator'],'retail':['retail','marketplace','ecommerce']},ROLE_KEYWORDS={'merchant':['merchant','seller','provider'],'customer':['customer','buyer'],'demander':['demander','demand','requester','looking\x20for'],'prospect':['prospect','considering\x20a\x20purchase','shopping\x20for'],'supplier':['supplier','subcontractor','sub-order'],'collaborator':['collaborator','operator','staff','named\x20operator'],'arbitrator':['arbitrator','arbiter','judge']},RISK_KEYWORDS={'conservative':['conservative'],'aggressive':['aggressive']};export function analyzePersonaContext(a){const b=a['toLowerCase'](),c={'industries':[],'preferences':{},'requirements':[],'rules':[],'suggestions':[],'confidence':0x0};for(const [f,g]of Object['entries'](ROLE_KEYWORDS)){if(g['some'](h=>b['includes'](h))){c['role']=f,c['suggestions']['push']({'field':'role','value':f,'reason':'role\x20keyword\x20matched'});break;}}for(const [h,i]of Object['entries'](INDUSTRY_KEYWORDS)){i['some'](j=>b['includes'](j))&&(c['industries']['push'](h),c['suggestions']['push']({'field':'industries','value':h,'reason':'industry\x20keyword\x20matched'}));}if(RISK_KEYWORDS['conservative']['some'](j=>b['includes'](j)))c['preferences']['risk_appetite']='conservative',c['suggestions']['push']({'field':'preferences.risk_appetite','value':'conservative','reason':'conservative\x20keyword'});else RISK_KEYWORDS['aggressive']['some'](j=>b['includes'](j))&&(c['preferences']['risk_appetite']='aggressive',c['suggestions']['push']({'field':'preferences.risk_appetite','value':'aggressive','reason':'aggressive\x20keyword'}));const d=['must','forbid','never','require'],e=['learned','avoid'];for(const j of a['split'](/[;.\n]/)){const k=j['trim']();if(!k)continue;if(d['some'](l=>k['toLowerCase']()['includes'](l['toLowerCase']())))c['requirements']['push'](k),c['suggestions']['push']({'field':'requirements','value':k,'reason':'red-line\x20keyword'});else e['some'](l=>k['toLowerCase']()['includes'](l['toLowerCase']()))&&(c['rules']['push'](k),c['suggestions']['push']({'field':'rules','value':k,'reason':'experience\x20keyword'}));}return c['confidence']=Math['min'](0x1,c['suggestions']['length']*0.2),c;}
@@ -1 +1 @@
1
- import{GENERIC_PERSONA,getIndustryDefault}from'./defaults.js';import{getPersonaStore}from'./store.js';import{assertAiCurrentDelta,emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';import{getIndustryPersona}from'./pack-personae.js';import{resolveOverrides}from'./overrides.js';import{profileToCurrentLayer}from'./experience-bridge.js';import{getProfile}from'../experience/index.js';import{ADDRESS_FORMAT_DEFAULT,ADDRESS_FORMAT_PREF_KEY,isAddressFormat}from'./address-format.js';export{GENERIC_PERSONA,getIndustryDefault,listIndustryDefaults}from'./defaults.js';export{SqlitePersonaStore,getPersonaStore,setPersonaStore}from'./store.js';export{assertAiCurrentDelta,countPersonaLines,effectiveAnalyzeQuestions,emptyPersona,mergeLayers,mergeRoleProfiles,mergeProfileMaps,mutateLayer,resolveEffective,validatePersona,validateLayerProfiles}from'./model.js';export{personaToContextText,personaToInjection,mergeInjections}from'./bridge.js';export{analyzePersonaContext}from'./analyzer.js';export{profileToCurrentLayer}from'./experience-bridge.js';export{distillGoalToProposal,gatherGoalEvidence}from'./distill-goal.js';export{registerIndustryPersonae,getIndustryPersona,listPersonaeIndustries,unregisterIndustryPersonae}from'./pack-personae.js';export{resolveOverrides,validateLayerOverrides,getOverrideDefault,SYSTEM_OVERRIDE_SETTINGS}from'./overrides.js';export*from'./strategy-intent.js';export*from'./local-region.js';export*from'./address-format.js';export{ROLE_TOPOLOGY_DEFAULTS,INDUSTRY_TOPOLOGY_DEFAULTS,getIndustryTopologyTemplate,resolvePersonaTopologyFocus,resolveTopologyContext,describeIntents,assertIntent}from'./topology-focus.js';export async function getEffectivePersona(a,b,c){const d=getPersonaStore(),e=await d['get']('system'),f=a?await d['get']('account',a):null,g=b?mergeIndustryExternal(c??'customer',b):{...GENERIC_PERSONA,'role':c??'customer'},h=resolveEffective(e,f,g);return c?{...h,'role':c}:h;}export async function resolveAddressFormat(a,b,c){try{const d=await getEffectivePersona(a,b,c),e=d['layer']['preferences']?.[ADDRESS_FORMAT_PREF_KEY];if(isAddressFormat(e))return e;}catch{}return ADDRESS_FORMAT_DEFAULT;}function mergeIndustryExternal(a,b){const c=getIndustryDefault(a,b),d=getIndustryPersona(b,a);if(!d)return c;return{...c,'long_term':mergeLayers([c['long_term'],d['long_term']]),'current':mergeLayers([c['current'],d['current']])};}async function collectGatePairs(a){const b=getPersonaStore(),c=await b['get']('system'),d=a?await b['get']('account',a):null,e=[],f=[];return c&&(e['push'](c['long_term'],c['current']),f['push']({'part':'long_term','group':0x0},{'part':'current','group':0x0})),d&&(e['push'](d['long_term'],d['current']),f['push']({'part':'long_term','group':0x2},{'part':'current','group':0x2})),{'layers':e,'meta':f};}export async function resolveGateControls(a){const {layers:b,meta:c}=await collectGatePairs(a),d=mergeLayers(b,c);return{'overrides':resolveOverrides([d]),'policy':d['policy']??{}};}export async function resolveEffectiveOverrides(a){return(await resolveGateControls(a))['overrides'];}export function analysisToLayerDelta(a){const b={};a['preferences']&&Object['keys'](a['preferences'])['length']&&(b['preferences']=a['preferences']);if(a['requirements']['length'])b['requirements']=a['requirements'];if(a['rules']['length'])b['rules']=a['rules'];return a['profiles']&&Object['keys'](a['profiles'])['length']&&(b['profiles']=a['profiles']),assertAiCurrentDelta(b),b;}export async function applyAnalysisToCurrent(a,b,c,d='merge',e,f){const g=getPersonaStore(),h=a==='account'&&b?await g['get']('account',b):await g['get']('system'),i=e??c['role']??h?.['role']??'customer',j=f??c['industries'],k=h??emptyPersona(a,b,i,j),l=Array['from'](new Set([...k['industries'],...j??[]])),m=analysisToLayerDelta(c),n=mutateLayer(k['current'],m,d),o={...k,'role':i,'industries':l,'current':n,'updated_at':Date['now']()},p=validatePersona(o);if(p['length']>0x0)throw new Error('persona\x20invalid\x20after\x20apply:\x20'+p['join'](';\x20'));return await g['put'](o),o;}export async function applyDeltaToCurrent(a,b,c,d,e){assertAiCurrentDelta(c);const f=getPersonaStore(),g=a==='account'&&b?await f['get']('account',b):await f['get']('system'),h=d??g?.['role']??'customer',i=e??g?.['industries']??[],j=g??emptyPersona(a,b,h,i),k=Array['from'](new Set([...j['industries'],...e??[]])),l=mutateLayer(j['current'],c,'merge'),m={...j,'role':h,'industries':k,'current':l,'updated_at':Date['now']()},n=validatePersona(m);if(n['length']>0x0)throw new Error('persona\x20invalid\x20after\x20apply_delta:\x20'+n['join'](';\x20'));return await f['put'](m),{'persona':m,'effective':await getEffectivePersona(a==='account'?b:undefined,undefined,m['role']),'applied':c};}export async function syncExperienceToCurrent(a,b){const c=getPersonaStore(),d=a?'account':'system',e=a?await c['get']('account',a):await c['get']('system'),f=e??emptyPersona(d,a,'customer',[]),g=profileToCurrentLayer(b??getProfile());assertAiCurrentDelta(g);const h=mutateLayer(f['current'],g,'merge'),i={...f,'current':h,'updated_at':Date['now']()},j=validatePersona(i);if(j['length']>0x0)throw new Error('persona\x20invalid\x20after\x20sync:\x20'+j['join'](';\x20'));return await c['put'](i),{'persona':i,'applied':g,'effective':await getEffectivePersona(a)};}
1
+ import{GENERIC_PERSONA,getIndustryDefault}from'./defaults.js';import{getPersonaStore}from'./store.js';import{assertAiCurrentDelta,emptyPersona,mergeLayers,mutateLayer,resolveEffective,validatePersona}from'./model.js';import{getIndustryPersona}from'./pack-personae.js';import{resolveOverrides}from'./overrides.js';import{mergedBaselinesOverlay}from'../extensions/industry-layers.js';import{setJudgmentIndustryOverlay,setJudgmentPersonaFragment}from'../config/judgment.js';import{profileToCurrentLayer}from'./experience-bridge.js';import{getProfile}from'../experience/index.js';import{ADDRESS_FORMAT_DEFAULT,ADDRESS_FORMAT_PREF_KEY,isAddressFormat}from'./address-format.js';export{GENERIC_PERSONA,getIndustryDefault,listIndustryDefaults}from'./defaults.js';export{SqlitePersonaStore,getPersonaStore,setPersonaStore}from'./store.js';export{assertAiCurrentDelta,countPersonaLines,effectiveAnalyzeQuestions,emptyPersona,mergeLayers,mergeRoleProfiles,mergeProfileMaps,mutateLayer,resolveEffective,validatePersona,validateLayerProfiles}from'./model.js';export{personaToContextText,personaToInjection,mergeInjections}from'./bridge.js';export{analyzePersonaContext}from'./analyzer.js';export{profileToCurrentLayer}from'./experience-bridge.js';export{distillGoalToProposal,gatherGoalEvidence}from'./distill-goal.js';export{registerIndustryPersonae,getIndustryPersona,listPersonaeIndustries,unregisterIndustryPersonae}from'./pack-personae.js';export{resolveOverrides,validateLayerOverrides,getOverrideDefault,SYSTEM_OVERRIDE_SETTINGS}from'./overrides.js';export*from'./strategy-intent.js';export*from'./local-region.js';export*from'./address-format.js';export{ROLE_TOPOLOGY_DEFAULTS,INDUSTRY_TOPOLOGY_DEFAULTS,getIndustryTopologyTemplate,resolvePersonaTopologyFocus,resolveTopologyContext,describeIntents,assertIntent}from'./topology-focus.js';export async function getEffectivePersona(a,b,c){const d=getPersonaStore(),e=await d['get']('system'),f=a?await d['get']('account',a):null,g=b?mergeIndustryExternal(c??'customer',b):{...GENERIC_PERSONA,'role':c??'customer'},h=resolveEffective(e,f,g);return b&&!h['industries']['includes'](b)&&(h['industries']=[...h['industries'],b]),syncJudgmentChannel(h),c?{...h,'role':c}:h;}function syncJudgmentChannel(a){setJudgmentPersonaFragment(a['layer']['judgment']??null),setJudgmentIndustryOverlay(mergedBaselinesOverlay(a['industries']));}export async function resolveAddressFormat(a,b,c){try{const d=await getEffectivePersona(a,b,c),e=d['layer']['preferences']?.[ADDRESS_FORMAT_PREF_KEY];if(isAddressFormat(e))return e;}catch{}return ADDRESS_FORMAT_DEFAULT;}function mergeIndustryExternal(a,b){const c=getIndustryDefault(a,b),d=getIndustryPersona(b,a);if(!d)return c;return{...c,'long_term':mergeLayers([c['long_term'],d['long_term']]),'current':mergeLayers([c['current'],d['current']])};}async function collectGatePairs(a){const b=getPersonaStore(),c=await b['get']('system'),d=a?await b['get']('account',a):null,e=[],f=[];return c&&(e['push'](c['long_term'],c['current']),f['push']({'part':'long_term','group':0x0},{'part':'current','group':0x0})),d&&(e['push'](d['long_term'],d['current']),f['push']({'part':'long_term','group':0x2},{'part':'current','group':0x2})),{'layers':e,'meta':f};}export async function resolveGateControls(a){const {layers:b,meta:c}=await collectGatePairs(a),d=mergeLayers(b,c);return{'overrides':resolveOverrides([d]),'policy':d['policy']??{}};}export async function resolveEffectiveOverrides(a){return(await resolveGateControls(a))['overrides'];}export function analysisToLayerDelta(a){const b={};a['preferences']&&Object['keys'](a['preferences'])['length']&&(b['preferences']=a['preferences']);if(a['requirements']['length'])b['requirements']=a['requirements'];if(a['rules']['length'])b['rules']=a['rules'];return a['profiles']&&Object['keys'](a['profiles'])['length']&&(b['profiles']=a['profiles']),assertAiCurrentDelta(b),b;}export async function applyAnalysisToCurrent(a,b,c,d='merge',e,f){const g=getPersonaStore(),h=a==='account'&&b?await g['get']('account',b):await g['get']('system'),i=e??c['role']??h?.['role']??'customer',j=f??c['industries'],k=h??emptyPersona(a,b,i,j),l=Array['from'](new Set([...k['industries'],...j??[]])),m=analysisToLayerDelta(c),n=mutateLayer(k['current'],m,d),o={...k,'role':i,'industries':l,'current':n,'updated_at':Date['now']()},p=validatePersona(o);if(p['length']>0x0)throw new Error('persona\x20invalid\x20after\x20apply:\x20'+p['join'](';\x20'));return await g['put'](o),o;}export async function applyDeltaToCurrent(a,b,c,d,e){assertAiCurrentDelta(c);const f=getPersonaStore(),g=a==='account'&&b?await f['get']('account',b):await f['get']('system'),h=d??g?.['role']??'customer',i=e??g?.['industries']??[],j=g??emptyPersona(a,b,h,i),k=Array['from'](new Set([...j['industries'],...e??[]])),l=mutateLayer(j['current'],c,'merge'),m={...j,'role':h,'industries':k,'current':l,'updated_at':Date['now']()},n=validatePersona(m);if(n['length']>0x0)throw new Error('persona\x20invalid\x20after\x20apply_delta:\x20'+n['join'](';\x20'));return await f['put'](m),{'persona':m,'effective':await getEffectivePersona(a==='account'?b:undefined,undefined,m['role']),'applied':c};}export async function syncExperienceToCurrent(a,b){const c=getPersonaStore(),d=a?'account':'system',e=a?await c['get']('account',a):await c['get']('system'),f=e??emptyPersona(d,a,'customer',[]),g=profileToCurrentLayer(b??getProfile());assertAiCurrentDelta(g);const h=mutateLayer(f['current'],g,'merge'),i={...f,'current':h,'updated_at':Date['now']()},j=validatePersona(i);if(j['length']>0x0)throw new Error('persona\x20invalid\x20after\x20sync:\x20'+j['join'](';\x20'));return await c['put'](i),{'persona':i,'applied':g,'effective':await getEffectivePersona(a)};}
@@ -1 +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 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
+ import{PERSONA_MAX_LINES,PERSONA_ROLES,PERSONA_VERSION}from'./types.js';import{validateLayerOverrides}from'./overrides.js';import{normalizeTopologyFocusPref}from'../graph/onchain/strategy.js';import{mergeJudgmentValues,validateJudgmentFragment}from'../config/judgment.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([...f['analyze']['key_questions'],...c['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'])}:{}}),f['judgment']&&(c['judgment']=mergeJudgmentValues(c['judgment']??{},f['judgment']));}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','judgment'];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=(l,m,n,o,p)=>{d['push'](m),e['push']({'part':n,'group':o}),f['push'](p==='account'?{'scope':p,'account':l['account'],'part':n}:{'scope':p,'part':n});};c&&(g(c,c['long_term'],'long_term',0x0,c['scope']),g(c,c['current'],'current',0x0,c['scope']));a&&(g(a,a['long_term'],'long_term',0x1,'system'),g(a,a['current'],'current',0x1,'system'));b&&(g(b,b['long_term'],'long_term',0x2,'account'),g(b,b['current'],'current',0x2,'account'));const h=l=>!!l&&(!isEmptyLayer(l['long_term'])||!isEmptyLayer(l['current'])),i=h(b),j=h(a),k=i?b:j?a:c;return{'scope':b?'account':'system','account':b?.['account']??a?.['account'],'role':k?.['role']??'customer','industries':k?.['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'));for(const d of['long_term','current']){const e=a[d]['judgment'];if(e!==undefined){const f=validateJudgmentFragment(e,d+'.judgment');if(f)b['push'](f);}}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']()};}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{afterEach,beforeEach,describe,expect,it}from'vitest';import{existsSync,mkdtempSync,rmSync}from'node:fs';import{tmpdir}from'node:os';import{join}from'node:path';import{handlePersonaOperation}from'../tools/handlers/persona.js';import{clearJudgmentLayers,clearJudgmentOverrides,getJudgmentDoc}from'../config/judgment.js';import{setPersonaStore}from'./store.js';class MemoryStore{['map']=new Map();['key'](a,b){return a+':'+(b??'system');}async['get'](a,b){return this['map']['get'](this['key'](a,b))??null;}async['list'](){return Array['from'](this['map']['values']());}async['put'](a){this['map']['set'](this['key'](a['scope'],a['account']),a);}async['delete'](a,b){return this['map']['delete'](this['key'](a,b));}}const store=new MemoryStore();let configDir;async function personaGet(a={}){const b=await handlePersonaOperation({'action':'get',...a});return b['structuredContent']['result'];}async function personaSet(a,b={}){const c=await handlePersonaOperation({'action':'set','scope':b['scope']??'system',...b['account']?{'account':b['account']}:{},'role':b['role']??'customer','industries':b['industries']??[],'long_term':a});return c['structuredContent']['result']['persona'];}beforeEach(()=>{configDir=mkdtempSync(join(tmpdir(),'wowok-persona-audit-')),process['env']['WOWOK_CONFIG_DIR']=configDir,setPersonaStore(store);}),afterEach(async()=>{for(const a of await store['list']())await store['delete'](a['scope'],a['account']);delete process['env']['WOWOK_CONFIG_DIR'];if(existsSync(configDir))rmSync(configDir,{'recursive':!![],'force':!![]});clearJudgmentLayers(),clearJudgmentOverrides();}),describe('persona\x20audit\x20—\x20identity\x20&\x20free-text\x20fields\x20(context_text)',()=>{it('1.\x20identity.self_description\x20/\x20region\x20/\x20languages\x20win\x20on\x20the\x20SYSTEM\x20channel;\x20base\x20only\x20backfills',async()=>{const a=await personaGet();expect(a['context_text'])['toContain']('-\x20self:\x20generic\x20WoWok\x20user'),expect(a['context_text'])['not']['toContain']('-\x20region:\x20AUDIT-REGION'),await personaSet({'identity':{'self_description':'AUDIT\x20persona\x20self','region':'AUDIT-REGION','languages':['zh','en']}});const b=await personaGet();expect(b['context_text'])['toContain']('-\x20self:\x20AUDIT\x20persona\x20self'),expect(b['context_text'])['not']['toContain']('generic\x20WoWok\x20user'),expect(b['context_text'])['toContain']('-\x20region:\x20AUDIT-REGION'),expect(b['context_text'])['toContain']('-\x20languages:\x20zh,\x20en');}),it('2.\x20long_term.preferences\x20custom\x20key-values\x20surface\x20in\x20injection.preferences',async()=>{const a=await personaGet();expect(a['injection']['preferences']?.['audit_color'])['toBeUndefined'](),await personaSet({'preferences':{'audit_color':'teal','prefers_weekend_slots':!![]}});const b=await personaGet();expect(b['injection']['preferences']?.['audit_color'])['toBe']('teal'),expect(b['injection']['preferences']?.['prefers_weekend_slots'])['toBe'](!![]),expect(b['context_text'])['not']['toContain']('audit_color');}),it('3.\x20strategy\x20/\x20rules\x20/\x20requirements\x20each\x20render\x20as\x20their\x20own\x20context\x20section',async()=>{const a=await personaGet();expect(a['context_text'])['not']['toContain']('-\x20strategy:'),expect(a['context_text'])['not']['toContain']('-\x20rules:'),expect(a['context_text'])['not']['toContain']('-\x20requirements:'),await personaSet({'strategy':['AUDIT\x20strategy:\x20ship\x20weekly'],'rules':['AUDIT\x20rule:\x20never\x20auto-accept'],'requirements':['AUDIT\x20requirement:\x20escrow\x20only']});const b=await personaGet();expect(b['context_text'])['toContain']('-\x20strategy:\x0a\x20\x20-\x20AUDIT\x20strategy:\x20ship\x20weekly'),expect(b['context_text'])['toContain']('-\x20rules:\x0a\x20\x20-\x20AUDIT\x20rule:\x20never\x20auto-accept'),expect(b['context_text'])['toContain']('-\x20requirements:\x0a\x20\x20-\x20AUDIT\x20requirement:\x20escrow\x20only');}),it('4.\x20long_term.spec\x20free\x20text\x20lands\x20verbatim\x20under\x20\x27-\x20spec:\x27',async()=>{const a=await personaGet();expect(a['context_text'])['not']['toContain']('-\x20spec:'),await personaSet({'spec':'AUDIT\x20spec\x20free\x20text:\x20prefer\x20written\x20confirmations.'});const b=await personaGet();expect(b['context_text'])['toContain']('-\x20spec:\x0aAUDIT\x20spec\x20free\x20text:\x20prefer\x20written\x20confirmations.');}),it('13.\x20unset\x20fields\x20produce\x20NO\x20context\x20noise\x20(no\x20empty\x20sections)',async()=>{const a=(await personaGet())['context_text'];expect(a)['not']['toContain']('-\x20strategy:'),expect(a)['not']['toContain']('-\x20rules:'),expect(a)['not']['toContain']('-\x20requirements:'),expect(a)['not']['toContain']('-\x20spec:'),expect(a)['not']['toContain']('safety\x20policy'),expect(a)['not']['toContain']('-\x20active\x20role\x20profile:');});}),describe('persona\x20audit\x20—\x20role-slot\x20profiles',()=>{it('5.\x20profiles.merchant.posture/pricing_style\x20reach\x20context\x20AND\x20injection\x20(account\x20channel)',async()=>{const a='0xaudit-merchant',b=await personaGet({'account':a});expect(b['context_text'])['not']['toContain']('strategic\x20posture'),await personaSet({'profiles':{'merchant':{'merchant':{'posture':'volume','pricing_style':'competitive'}}}},{'scope':'account','account':a,'role':'merchant'});const c=await personaGet({'account':a});expect(c['context_text'])['toContain']('strategic\x20posture:\x20volume'),expect(c['context_text'])['toContain']('pricing\x20style:\x20competitive'),expect(c['injection']['preferences']?.['merchant_posture'])['toBe']('volume'),expect(c['injection']['preferences']?.['merchant_pricing_style'])['toBe']('competitive'),expect(c['injection']['preferences']?.['active_role'])['toBe']('merchant');}),it('6.\x20profiles.customer.tastes/consumption\x20reach\x20context\x20AND\x20injection',async()=>{const a=await personaGet();expect(a['injection']['preferences']?.['taste_tags'])['toBeUndefined'](),await personaSet({'profiles':{'customer':{'tastes':{'tags':['minimalist'],'avoid':['loud\x20colors']},'consumption':{'price_band':'premium','decision_speed':'deliberate'}}}});const b=await personaGet();expect(b['context_text'])['toContain']('taste\x20tags:\x20minimalist'),expect(b['context_text'])['toContain']('taste\x20avoid:\x20loud\x20colors'),expect(b['context_text'])['toContain']('price\x20band:\x20premium'),expect(b['context_text'])['toContain']('decision\x20speed:\x20deliberate'),expect(b['injection']['preferences']?.['taste_tags'])['toEqual'](['minimalist']),expect(b['injection']['preferences']?.['buy_price_band'])['toBe']('premium');});}),describe('persona\x20audit\x20—\x20safety\x20controls\x20(policy\x20/\x20overrides)',()=>{it('7.\x20policy.confirm.mode\x20/\x20budget.daily_wow\x20/\x20allowlist\x20/\x20audit\x20reflect\x20in\x20context;\x20policy_keys\x20list\x20the\x20surface',async()=>{const a=await personaGet();expect(a['context_text'])['not']['toContain']('safety\x20policy'),await personaSet({'policy':{'confirm':{'mode':'quiet'},'budget':{'daily_wow':'5000'},'allowlist':['0xallow'],'audit':!![]}});const b=await personaGet();expect(b['context_text'])['toContain']('confirm\x20mode:\x20quiet'),expect(b['context_text'])['toContain']('daily\x20spend\x20ceiling:\x205000\x20base\x20units'),expect(b['context_text'])['toContain']('allowlist:\x200xallow'),expect(b['context_text'])['toContain']('audit\x20logging:\x20on');const c=b['controls']?.['policy_keys']??[];expect(c)['toContain']('confirm.mode'),expect(c)['toContain']('budget.daily_wow'),expect(c)['toContain']('allowlist'),expect(c)['toContain']('audit');}),it('8.\x20overrides\x20value\x20reaches\x20context_text;\x20controls\x20catalog\x20lists\x20the\x20id\x20as\x20client-surface',async()=>{const a=await personaGet();expect(a['context_text'])['not']['toContain']('rule\x20override'),await personaSet({'overrides':{'client.account_switch':'block'}});const b=await personaGet();expect(b['context_text'])['toContain']('rule\x20override\x20client.account_switch:\x20block');const c=b['controls']?.['overrides']['find'](d=>d['id']==='client.account_switch');expect(c?.['surface'])['toBe']('client'),expect(c?.['default'])['toBe']('prompt');}),it('12.\x20apply_delta\x20rejects\x20policy\x20/\x20overrides\x20/\x20judgment\x20(AI_DELTA_FORBIDDEN_KEYS),\x20allows\x20plain\x20deltas',async()=>{const a=await handlePersonaOperation({'action':'apply_delta','scope':'system','delta':{'strategy':['audit\x20delta\x20strategy']}}),b=a['structuredContent']['result'];expect(b['persona']['current']['strategy'])['toContain']('audit\x20delta\x20strategy'),await expect(handlePersonaOperation({'action':'apply_delta','scope':'system','delta':{'policy':{'confirm':{'mode':'quiet'}}}}))['rejects']['toThrow'](/policy/),await expect(handlePersonaOperation({'action':'apply_delta','scope':'system','delta':{'overrides':{'confirm.default_values':'auto'}}}))['rejects']['toThrow'](/overrides/),await expect(handlePersonaOperation({'action':'apply_delta','scope':'system','delta':{'judgment':{'game':{'scoring':{'base':0x46}}}}}))['rejects']['toThrow'](/judgment/);});}),describe('persona\x20audit\x20—\x20analyze,\x20role\x20and\x20judgment\x20channels',()=>{it('9.\x20analyze.key_questions\x20(4\x20stored)\x20collapse\x20to\x20exactly\x20the\x20FIRST\x202\x20in\x20analyze_questions',async()=>{const a=await personaGet();expect(a['analyze_questions'])['toEqual']([]),await personaSet({'analyze':{'key_questions':['AUDIT\x20Q1','AUDIT\x20Q2','AUDIT\x20Q3','AUDIT\x20Q4']}});const b=await personaGet();expect(b['analyze_questions'])['toEqual'](['AUDIT\x20Q1','AUDIT\x20Q2']);}),it('10.\x20system\x20persona\x20role/industries\x20win\x20the\x20vote;\x20account\x20channel\x20still\x20outranks\x20system',async()=>{const a=await personaGet();expect(a['context_text'])['toContain']('#\x20Effective\x20Persona\x20(role=customer,\x20industries=any)'),expect(a['injection']['intent'])['toContain']('role=customer'),await personaSet({'strategy':['AUDIT\x20system\x20strategy']},{'role':'arbitrator','industries':['rental']});const b=await personaGet();expect(b['context_text'])['toContain']('#\x20Effective\x20Persona\x20(role=arbitrator,\x20industries=rental)'),expect(b['injection']['intent'])['toContain']('role=arbitrator;\x20industries=rental'),expect(b['context_text'])['toContain']('AUDIT\x20system\x20strategy');const c='0xaudit-role';await personaSet({'strategy':['AUDIT\x20account\x20strategy']},{'scope':'account','account':c,'role':'supplier','industries':['education']});const d=await personaGet({'account':c});expect(d['context_text'])['toContain']('#\x20Effective\x20Persona\x20(role=supplier,\x20industries=education)'),expect(d['injection']['intent'])['toContain']('role=supplier;\x20industries=education');}),it('11.\x20persona\x20set\x20accepts\x20a\x20judgment\x20fragment\x20and\x20the\x20fragment\x20reaches\x20getJudgmentDoc',async()=>{expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x3c);const a=await personaSet({'judgment':{'game':{'scoring':{'base':0x4b}}}});expect(a['long_term']['judgment'])['toBeDefined'](),await personaGet(),expect(getJudgmentDoc()['game']['scoring']['base'])['toBe'](0x4b);});});
@@ -1,5 +1,6 @@
1
1
  import { type CommercialRole } from "../role/types.js";
2
2
  import type { TopologyFocusPref } from "../graph/onchain/strategy.js";
3
+ import type { JudgmentLayerFragment } from "../config/judgment.js";
3
4
  export type PersonaScope = "system" | "account";
4
5
  export type PersonaRole = Exclude<CommercialRole, "system" | "neutral">;
5
6
  export declare const PERSONA_ROLES: readonly PersonaRole[];
@@ -97,6 +98,7 @@ export interface PersonaLayer {
97
98
  profiles?: Partial<Record<PersonaRole, RoleProfile>>;
98
99
  analyze?: PersonaAnalyzeDefaults;
99
100
  evaluation?: PersonaEvaluationStandards;
101
+ judgment?: JudgmentLayerFragment;
100
102
  }
101
103
  export interface PersonaEvaluationStandards {
102
104
  weights?: Record<string, number>;
@@ -1 +1 @@
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.';}
1
+ import{initServicePuzzleFromIntent,initMachinePuzzleFromIntent,initAllocationPuzzleFromIntent,initTreasuryPuzzleFromIntent,initArbitrationPuzzleFromIntent,initRewardPuzzleFromIntent,initProgressPuzzleFromIntent,initOrderPuzzleFromIntent,initPuzzleFromIntent as a296a,checkServicePuzzleCompleteness,checkMachinePuzzleCompleteness,checkAllocationPuzzleCompleteness,checkTreasuryPuzzleCompleteness,checkArbitrationPuzzleCompleteness,checkRewardPuzzleCompleteness,checkProgressPuzzleCompleteness,checkOrderPuzzleCompleteness,checkPuzzleCompleteness as a296b}from'../../knowledge/index.js';import{initPuzzleFromIntent as a296c,checkPuzzleCompleteness as a296d}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(a296c,{'primary_goal':c}),'check':c=>b(c,a296d)},'guard':{'init':c=>a(a296a,{'primary_goal':c}),'check':c=>b(c,a296b)}};}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.';}
@@ -20,3 +20,14 @@ export interface MoneyAnnotation {
20
20
  }
21
21
  export declare function formatMoneyAnnotation(raw: string | null | undefined, coinType: string | null | undefined, network?: ENTRYPOINT): Promise<MoneyAnnotation>;
22
22
  export declare function annotateFacetMoney(items: AnnotatableFacet[], network?: ENTRYPOINT, resolve?: CoinResolver): Promise<void>;
23
+ export interface AnnotatableFinding {
24
+ detail: string;
25
+ suggestion?: string;
26
+ amounts?: Array<{
27
+ key: string;
28
+ label: string;
29
+ raw: string;
30
+ coin_type?: string;
31
+ }>;
32
+ }
33
+ export declare function annotateFindingMoney(findings: AnnotatableFinding[], network?: ENTRYPOINT, resolve?: CoinResolver): Promise<void>;
@@ -1 +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+'}')));}}
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':![]};}}function createCoinMetaCache(a,b){const c=new Map(),d=e=>{const f=c['get'](e);if(f)return f;const g=a(e,b)['then'](h=>h?{'precisionKnown':h['precision_known'],...h['precision_known']&&h['decimals']!==undefined?{'decimals':h['decimals'],'symbol':h['symbol']}:{}}:undefined);return c['set'](e,g),g;};return d;}export async function annotateFacetMoney(a,b,c=defaultCoinResolver){const d=createCoinMetaCache(c,b);for(const e of a){if(!e['amounts']?.['length'])continue;const f=new Map();for(const g of e['amounts']){const h=g['money'];let i=h['raw'];if(!h['coin_type']){f['set'](g['key'],i);continue;}let j;try{j=await d(h['coin_type']);}catch{j=undefined;}if(j?.['precisionKnown']&&j['decimals']!==undefined){let k=h['raw'];try{k=withMinDecimals(formatUnits(BigInt(h['raw']),j['decimals']));}catch{}h['display']=k,h['decimals']=j['decimals'];if(j['symbol'])h['symbol']=j['symbol'];h['precision_known']=!![],i=j['symbol']?k+'\x20'+j['symbol']:k;}else h['precision_known']=![],h['tip']=unknownCoinTip(h['coin_type']),i=h['raw'];f['set'](g['key'],i);}f['size']>0x0&&(e['evidence']=e['evidence']['map'](l=>l['replace'](/\{(\w+)\}/g,(n,o)=>f['get'](o)??'{'+o+'}')));}}export async function annotateFindingMoney(a,b,c=defaultCoinResolver){const d=createCoinMetaCache(c,b);for(const e of a){if(!e['amounts']?.['length'])continue;const f=new Map();for(const h of e['amounts']){let i=h['raw']+'\x20base\x20units';if(h['coin_type']){let j;try{j=await d(h['coin_type']);}catch{j=undefined;}if(j?.['precisionKnown']&&j['decimals']!==undefined){let k=h['raw'];try{k=withMinDecimals(formatUnits(BigInt(h['raw']),j['decimals']));}catch{}i=j['symbol']?k+'\x20'+j['symbol']:k;}}f['set'](h['key'],i);}const g=l=>l['replace'](/\{(\w+)\}/g,(m,n)=>f['get'](n)??'{'+n+'}');e['detail']=g(e['detail']);if(e['suggestion'])e['suggestion']=g(e['suggestion']);}}
@@ -16,16 +16,33 @@ export interface MachinePanoramaResult {
16
16
  permission: string | null;
17
17
  um: string | null;
18
18
  node_count: number | null;
19
+ onchain_table_node_count: number | null;
19
20
  consensus_repositories: string[];
20
21
  };
21
22
  graph: {
22
23
  nodes: MachineGraphNode[];
23
24
  edges: MachineGraphEdge[];
25
+ permission?: {
26
+ address: string;
27
+ remarks: {
28
+ index: number;
29
+ remark: string;
30
+ }[];
31
+ };
24
32
  };
25
33
  progresses: {
26
34
  count: number;
27
35
  window_saturated: boolean;
28
36
  preview_truncated: boolean;
37
+ stats: {
38
+ first_created_ms: number | null;
39
+ last_created_ms: number | null;
40
+ };
41
+ drilldown?: {
42
+ total_count: number;
43
+ analyzed_count: number;
44
+ prompt: string;
45
+ };
29
46
  items: {
30
47
  progress: string;
31
48
  name: string | null;
@@ -1 +1 @@
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
+ 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 x=await LocalMark['Instance']()['get_address'](b);if(!x)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=x;}let g=null;try{if(!c)c=await Config['Instance']()['network_get']();const y=await query_objects({'objects':[f],'network':c});g=y?.['objects']?.[0x0]??null;if(!g&&a['context_network']){const z=await Config['Instance']()['network_get']();if(z&&z!==c){const A=await query_objects({'objects':[f],'network':z,'no_cache':!![]}),B=A?.['objects']?.[0x0]??null;B&&(g=B,c=z);}}}catch(C){throw new Error('Failed\x20to\x20query\x20Machine\x20'+f+'\x20on\x20'+c+':\x20'+(''+(C instanceof Error?C['message']:String(C))));}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 D=await LocalMark['Instance']()['list']({'address':f});D['length']>0x0&&(h=D[0x0]['name']??null,j=(D[0x0]['tags']??[])['map'](E=>String(E)));}catch{d['push']('head:\x20LocalMark\x20lookup\x20failed');}let k={'nodes':[],'edges':[]};try{const E=await fetchMachineNodes(f,c);k=buildMachineGraph(E);}catch{d['push']('graph:\x20node\x20fetch\x20failed\x20(non-blocking)');}if(typeof g['permission']==='string'&&g['permission'])try{const F=await query_objects({'objects':[g['permission']],'network':c}),G=F?.['objects']?.[0x0]??null,H=Array['isArray'](G?.['perm_remark'])?G['perm_remark']:Array['isArray'](G?.['remark'])?G['remark']:[],I=H['map'](J=>({'index':typeof J?.['index']==='number'?J['index']:parseInt(J?.['index'],0xa),'remark':typeof J?.['remark']==='string'?J['remark']:''}))['filter'](J=>Number['isFinite'](J['index']));k['permission']={'address':g['permission'],'remarks':I};}catch{d['push']('graph:\x20permission\x20read\x20failed\x20(non-blocking)');}const l=[];let m=0x0,n=null,p=null,q=0x0,s=![],u=[];try{const J=await fetchObjectLinkerTx(f,c,!![]),K=J?.['items']??[];s=ringWindowSaturated(K['length']);const L=new Map();for(const S of K){const T=typeof S?.['who']==='string'?S['who']['toLowerCase']():'';if(!T||T==='0x0')continue;if(!objectTypeFromAddress(T))continue;const U=typeof S?.['time']==='number'?S['time']:null,V=L['get'](T);L['set'](T,V==null?U:U==null?V:Math['max'](V,U));}q=L['size'];const M=new Map();for(const [W,X]of L){const Y=String(objectTypeFromAddress(W)),Z=M['get'](Y)??[];Z['push']({'address':W,'time':X}),M['set'](Y,Z);}for(const a0 of M['values']()){a0['sort']((a1,a2)=>(a2['time']??0x0)-(a1['time']??0x0));}const N=['Progress','Allocation','Payment','Guard'];u=[];for(const a1 of N){const a2=M['get'](a1);a2&&a2['length']>0x0&&(u['push']({'label':a1,'items':a2}),M['delete'](a1));}for(const [a3,a4]of M){if(a4['length']>0x0)u['push']({'label':a3,'items':a4});}const O=K['filter'](a5=>objectTypeFromAddress(a5['who'])===ObjectType['Progress']);m=O['length'];for(const a5 of O){if(typeof a5?.['time']==='number'){if(n===null||a5['time']<n)n=a5['time'];if(p===null||a5['time']>p)p=a5['time'];}}const P=O['slice'](-0x3)['reverse'](),Q=P['map'](a6=>a6['who']),R=new Map();if(Q['length']>0x0)try{const a6=await batchQueryObjectsByIds(Q,c,!![]);for(const a7 of a6){if(a7?.['object'])R['set'](a7['object'],a7);}}catch{d['push']('progresses:\x20detail\x20fetch\x20failed');}for(const a8 of P){const a9=typeof a8?.['who']==='string'?a8['who']:'';if(!a9)continue;const aa=R['get'](a9);l['push']({'progress':a9,'name':null,'current':aa?.['current']??null,'task':aa?.['task']??null,'history_count':typeof aa?.['history_count']==='number'?aa['history_count']:null,'current_time':typeof aa?.['current_time']==='number'?aa['current_time']:null,'created_at':typeof a8?.['time']==='number'?a8['time']:null});}}catch{d['push']('progresses:\x20global-table\x20lookup\x20failed\x20(non-blocking)');}const w='Analyze\x20ALL\x20workflow\x20progresses\x20of\x20Machine\x20'+f+'\x20('+c+')\x20one\x20by\x20one,\x20newest\x20first.\x20'+('The\x20progresses\x20live\x20in\x20the\x20machine\x27s\x20FIFO\x20tx-linker\x20window\x20holding\x20at\x20most\x205200\x20newest\x20entries\x20—\x20the\x20retained\x20count\x20is\x20a\x20lower\x20bound\x20when\x20the\x20window\x20is\x20saturated\x20(currently\x20'+m+(s?',\x20saturated':'')+').\x20')+'For\x20each\x20progress\x20call\x20object_panorama\x20with\x20the\x20progress\x27s\x20FULL\x200x\x20address\x20(collect\x20the\x20addresses\x20from\x20the\x20same\x20reverse-index\x20source;\x20work\x20newest-first)\x20and\x20render\x20ONE\x20table\x20row\x20per\x20progress:\x20'+'progress\x20address\x20chip\x20(first\x20column)\x20|\x20current\x20node\x20|\x20task\x20|\x20history\x20events\x20|\x20last\x20activity\x20(local\x20date)\x20|\x20registered\x20(local\x20date).\x20'+'Close\x20with\x20the\x203\x20most\x20valuable\x20patterns\x20across\x20the\x20rows\x20(stuck\x20nodes,\x20age\x20of\x20active\x20progresses,\x20throughput).\x20Progresses\x20only\x20—\x20do\x20not\x20re-analyze\x20the\x20Machine\x20graph\x20itself.';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':k['nodes']['length']>0x0?k['nodes']['length']:typeof g['node_count']==='number'?g['node_count']+0x1:null,'onchain_table_node_count':typeof g['node_count']==='number'?g['node_count']:k['nodes']['length']>0x0?k['nodes']['length']-0x1:null,'consensus_repositories':Array['isArray'](g['consensus_repositories'])?g['consensus_repositories']:[]},'graph':k,'progresses':{'count':m,'window_saturated':s,'preview_truncated':m>l['length'],'stats':{'first_created_ms':n,'last_created_ms':p},...m>l['length']?{'drilldown':{'total_count':m,'analyzed_count':l['length'],'prompt':w}}:{},'items':l},'related':{'count':q,'window_saturated':s,'groups':u},'data_gaps':d};}
@@ -181,7 +181,7 @@ export declare function handleMerchantGuide(v: MerchantGuideInput): Promise<{
181
181
  summary: string;
182
182
  findings: {
183
183
  kind: "business_loophole" | "semantic_loophole";
184
- severity: "info" | "critical" | "warning";
184
+ severity: "info" | "critical" | "medium";
185
185
  message: string;
186
186
  fix: string;
187
187
  }[];
@@ -189,7 +189,7 @@ export declare function handleMerchantGuide(v: MerchantGuideInput): Promise<{
189
189
  id: string;
190
190
  dimension: "value" | "intent" | "game";
191
191
  passed: boolean;
192
- severity: "info" | "critical" | "warning";
192
+ severity: "info" | "critical" | "medium";
193
193
  message: string;
194
194
  fix: string | undefined;
195
195
  }[];
@@ -0,0 +1,43 @@
1
+ import { type IndustryTemplate } from "../../knowledge/template-loader.js";
2
+ import type { Industry } from "../../customer/index.js";
3
+ export interface MigrationEntry {
4
+ source_element: string;
5
+ target_object?: string;
6
+ mapping_note: string;
7
+ reason?: string;
8
+ }
9
+ export interface MigrationLog {
10
+ source: {
11
+ url?: string;
12
+ description: string;
13
+ detected_industry: string;
14
+ matched_template: string;
15
+ };
16
+ mapped: MigrationEntry[];
17
+ unmapped: MigrationEntry[];
18
+ manual_review: MigrationEntry[];
19
+ wowok_advantages: string[];
20
+ customizable_modules: string[];
21
+ role_assessment: {
22
+ recommended: string;
23
+ rationale: string;
24
+ alternatives: string[];
25
+ };
26
+ risk_check: {
27
+ passed: boolean;
28
+ findings: string[];
29
+ };
30
+ network: "testnet" | "mainnet";
31
+ }
32
+ export interface MigrationPlanInput {
33
+ url?: string;
34
+ description: string;
35
+ template_id?: string;
36
+ industry?: Industry;
37
+ network?: "testnet" | "mainnet";
38
+ }
39
+ export declare function matchTemplate(description: string): {
40
+ template: IndustryTemplate;
41
+ confidence: number;
42
+ } | undefined;
43
+ export declare function planMigration(input: MigrationPlanInput): MigrationLog | undefined;
@@ -0,0 +1 @@
1
+ import{matchScenarioMode}from'../../knowledge/scenario-modes.js';import{getTemplate,listTemplates}from'../../knowledge/template-loader.js';import{TEMPLATE_KEYWORDS}from'../../knowledge/builtin-templates.js';export function matchTemplate(a){const b=a['toLowerCase'](),{templates:c}=listTemplates(),{mode:e,confidence:f}=matchScenarioMode(a);let g;for(const h of c){const i=TEMPLATE_KEYWORDS[h['id']]??[];let j=0x0;for(const l of i){if(b['includes'](l))j+=0x1;}if(e['name']===h['industry'])j+=f;const k=i['length']+0x1;if(!g||j>g['score'])g={'template':h,'score':j,'max':k};}if(!g||g['score']<=0x0)return undefined;return{'template':g['template'],'confidence':Math['min'](0x1,g['score']/g['max'])};}const RM1_11_NODE_REGEX=/(^|_)(disputed?|refund(?:ed)?|arbitration|arb)(_|$)/i;function dryRunRiskCheck(a){const b=[];for(const e of a['machine_shape']){RM1_11_NODE_REGEX['test'](e['name'])&&b['push']('R-M1-11:\x20node\x20\x27'+e['name']+'\x27\x20models\x20dispute/refund\x20flow\x20—\x20must\x20route\x20via\x20Allocator/Arbitration');}a['machine_shape']['length']===0x0&&b['push']('machine_shape\x20is\x20empty\x20—\x20no\x20entry\x20node');const c=a['guards']['some'](f=>f['template_id']['includes']('refund')||f['template_id']['includes']('cancel'))||/refund/i['test'](a['allocator']['description']);!c&&b['push']('R1:\x20no\x20refund\x20path\x20detected\x20(no\x20refund/cancel\x20guard\x20and\x20no\x20refund\x20route\x20in\x20the\x20allocator)');const d=a['guards']['some'](f=>f['host']==='arbitration')||a['trust_mechanisms']['some'](f=>f['startsWith']('R2'));return!d&&b['push']('R2:\x20no\x20independent\x20Arbitration\x20reference\x20detected'),a['keeper_dependencies']['length']===0x0&&b['push']('R9:\x20no\x20keeper\x20dependencies\x20declared\x20for\x20time-driven\x20flows'),{'passed':b['length']===0x0,'findings':b};}function genericMappedEntries(a){return[{'source_element':'Order\x20lifecycle\x20/\x20status\x20flow','target_object':'Machine','mapping_note':a['machine_shape']['length']+'-node\x20workflow\x20adopted\x20from\x20the\x20'+a['id']+'\x20template'},{'source_element':'Business\x20rules\x20and\x20time\x20windows','target_object':'Guard','mapping_note':a['guards']['length']+'\x20guard\x20templates\x20carry\x20the\x20rule\x20parameters\x20as\x20immutable\x20on-chain\x20conditions'},{'source_element':'Payment\x20split\x20/\x20settlement','target_object':'Allocator','mapping_note':a['allocator']['description']},{'source_element':'Refund\x20policy','target_object':'Allocator\x20(refund\x20route)','mapping_note':'Refunds\x20route\x20via\x20Allocators\x20triggered\x20by\x20business\x20states\x20—\x20never\x20Machine\x20terminal\x20nodes\x20(R-M1-11)'},{'source_element':'Dispute\x20resolution','target_object':'Arbitration','mapping_note':'Independent\x20Arbitration\x20object\x20with\x20its\x20own\x20Permission\x20—\x20disputes\x20flow\x20off-Machine'},{'source_element':'Operator\x20roles\x20(staff/fulfiller/finance)','target_object':'Permission','mapping_note':'Role\x20slots\x20as\x20Permission\x20entities;\x20the\x20order\x20payer\x20acts\x20as\x20the\x20named\x20operator\x20without\x20occupying\x20a\x20slot'},{'source_element':'Evidence\x20and\x20records','target_object':'Repository','mapping_note':'Write-guarded\x20Repository\x20policies\x20anchor\x20evidence\x20hashes\x20(delivery,\x20inspection,\x20settlement\x20ledger)'},{'source_element':'Service\x20listing\x20and\x20pricing','target_object':'Service','mapping_note':'Service\x20carries\x20the\x20sale\x20structure,\x20buy\x20gate,\x20and\x20bound\x20Machine/Guards/Arbitration\x20before\x20publish'}];}function genericUnmappedEntries(a){const b=[{'source_element':'Incumbent\x20platform\x20internal\x20ranking\x20/\x20search\x20algorithm','mapping_note':'Marketplace\x20discovery\x20logic\x20has\x20no\x20on-chain\x20equivalent','reason':'Off-chain\x20platform\x20intelligence\x20—\x20use\x20the\x20WoWok\x20market\x20layer\x20(demand\x20matching)\x20instead'},{'source_element':'Incumbent\x20platform\x20user\x20account\x20/\x20login\x20system','mapping_note':'Identity\x20lives\x20in\x20wallets\x20and\x20Passports,\x20not\x20platform\x20accounts','reason':'WoWok\x20is\x20account-less\x20by\x20design\x20—\x20addresses\x20+\x20Passports\x20replace\x20platform\x20logins'},{'source_element':'Automatic\x20recurring\x20charges\x20(card\x20auto-debit)','mapping_note':'Recurring\x20charges\x20are\x20replaced\x20by\x20explicit\x20per-period\x20subscriber\x20signatures','reason':'Silent\x20auto-charge\x20is\x20an\x20anti-pattern\x20on\x20WoWok\x20—\x20renewal\x20requires\x20the\x20payer\x27s\x20signature\x20every\x20period'}];return a['industry']==='subscription'&&b['push']({'source_element':'Content\x20moderation\x20/\x20takedown\x20pipeline','mapping_note':'Only\x20content\x20hashes\x20live\x20on-chain;\x20content\x20bodies\x20stay\x20off-chain','reason':'Content\x20governance\x20is\x20structurally\x20out\x20of\x20scope\x20for\x20on-chain\x20objects\x20—\x20handle\x20it\x20at\x20the\x20hosting\x20layer'}),(a['industry']==='retail'||a['industry']==='rental')&&b['push']({'source_element':'Physical\x20logistics\x20/\x20courier\x20integration','mapping_note':'Logistics\x20stays\x20off-chain;\x20tracking\x20evidence\x20is\x20anchored\x20via\x20WIP\x20hashes','reason':'Carriers\x20are\x20external\x20systems\x20—\x20the\x20Machine\x20consumes\x20their\x20evidence,\x20not\x20their\x20API'}),b;}function manualReviewEntries(a){const b=[{'source_element':'Fee\x20and\x20split\x20parameters','mapping_note':'Template\x20defaults:\x20'+Object['entries'](a['fee_params'])['map'](([c,d])=>c+'='+d)['join'](',\x20'),'reason':'Confirm\x20or\x20override\x20each\x20parameter\x20before\x20generation'},{'source_element':'Operating\x20role','mapping_note':'Recommended:\x20'+a['recommended_role']+'\x20—\x20'+a['role_rationale'],'reason':'The\x20user\x20may\x20switch\x20role\x20(merchant\x20<->\x20supplier)\x20before\x20apply'},{'source_element':'Target\x20network','mapping_note':'Default\x20testnet\x20for\x20the\x20first\x20deployment','reason':'Mainnet\x20deployment\x20requires\x20explicit\x20user\x20confirmation'}];return a['keeper_dependencies']['length']>0x0&&b['push']({'source_element':'Off-chain\x20keeper\x20operations','mapping_note':'Declared\x20keepers:\x20'+a['keeper_dependencies']['join'](';\x20'),'reason':'Time-driven\x20transitions\x20only\x20ALLOW\x20advancement\x20—\x20someone\x20must\x20run\x20the\x20keepers'}),b;}function wowokAdvantages(a){const b=['Every\x20rule\x20is\x20an\x20immutable\x20on-chain\x20Guard\x20—\x20customers\x20can\x20verify\x20the\x20exact\x20policy\x20before\x20paying','Disputes\x20resolve\x20through\x20independent\x20Arbitration\x20with\x20a\x20funded\x20compensation\x20pool','Fund\x20splits\x20execute\x20by\x20contract\x20at\x20the\x20configured\x20release\x20points\x20—\x20no\x20platform\x20discretion'];return a['industry']==='subscription'&&b['push']('Per-period\x20explicit-signature\x20renewal\x20—\x20the\x20anti-auto-renew\x20trap\x20is\x20a\x20selling\x20point'),a['industry']==='freelance'&&b['push']('Chain-verifiable\x200%\x20(or\x20low)\x20commission\x20via\x20the\x20allocator\x20split\x20itself'),a['industry']==='travel'&&b['push']('Two-tier\x20allocation\x20pays\x20each\x20supplier\x20at\x20its\x20own\x20segment\x20release\x20—\x20multi-party\x20transparency'),a['industry']==='education'&&b['push']('Regulatory\x20prepay\x20caps\x20and\x20per-session\x20release\x20protect\x20students\x20from\x20run-away\x20institutions'),a['industry']==='rental'&&b['push']('Deposit\x20escrow\x20+\x20evidence-gated\x20deduction\x20—\x20neither\x20side\x20can\x20unilaterally\x20seize\x20the\x20deposit'),a['industry']==='retail'&&b['push']('Escrow\x20+\x20confirm-on-receipt\x20release\x20—\x20the\x20buyer\x27s\x20confirmation\x20is\x20the\x20only\x20release\x20trigger'),b;}function customizableModules(a){const b=['independent_arbitration','refund_guarantee','reputation_on_chain','wip_provenance'];switch(a['industry']){case'freelance':return[...b,'milestone_escrow','accept_timeout_protection'];case'rental':return[...b,'damage_attestation'];case'education':return[...b,'accept_timeout_protection'];case'travel':return[...b,'multi_tier_allocation','supplier_collaboration'];case'subscription':return[...b,'subscription_with_proof'];case'retail':return[...b,'accept_timeout_protection'];default:return b;}}export function planMigration(a){let b;if(a['template_id']){b=getTemplate(a['template_id']);if(b&&a['industry']&&b['industry']!==a['industry']){const c=matchTemplate(a['industry']+'\x20'+a['description']);if(c&&c['template']['industry']===a['industry'])b=c['template'];}}else{const d=a['industry']?a['industry']+'\x20'+a['description']:a['description'],e=matchTemplate(d);b=e?.['template'],!b&&a['industry']&&(b=listTemplates()['templates']['find'](f=>f['industry']===a['industry']&&f['archetype']==='leader'));}if(!b)return undefined;return{'source':{'url':a['url'],'description':a['description'],'detected_industry':b['industry'],'matched_template':b['id']},'mapped':genericMappedEntries(b),'unmapped':genericUnmappedEntries(b),'manual_review':manualReviewEntries(b),'wowok_advantages':wowokAdvantages(b),'customizable_modules':customizableModules(b),'role_assessment':{'recommended':b['recommended_role'],'rationale':b['role_rationale'],'alternatives':['merchant','supplier','both']['filter'](f=>f!==b['recommended_role'])},'risk_check':dryRunRiskCheck(b),'network':a['network']??'testnet'};}