@wowok/agent-mcp 3.3.9 → 3.4.1

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 (480) hide show
  1. package/README.md +8 -0
  2. package/dist/chain-semantics/composition-truth.d.ts +102 -0
  3. package/dist/chain-semantics/composition-truth.js +1 -0
  4. package/dist/chain-semantics/eval-order.js +1 -1
  5. package/dist/chain-semantics/field-capability.js +1 -1
  6. package/dist/chain-semantics/freeze-map.js +1 -1
  7. package/dist/chain-semantics/fund-flow.js +1 -1
  8. package/dist/chain-semantics/guard-verbs.js +1 -1
  9. package/dist/chain-semantics/index.d.ts +1 -0
  10. package/dist/chain-semantics/index.js +1 -1
  11. package/dist/chain-semantics/object-graph.js +1 -1
  12. package/dist/composition/audit.js +1 -1
  13. package/dist/composition/blueprint-view.d.ts +3 -3
  14. package/dist/composition/blueprint-view.js +1 -1
  15. package/dist/composition/compile.d.ts +26 -4
  16. package/dist/composition/compile.js +1 -1
  17. package/dist/composition/emit-phases.d.ts +206 -0
  18. package/dist/composition/emit-phases.js +1 -0
  19. package/dist/composition/generate.d.ts +40 -0
  20. package/dist/composition/generate.js +1 -0
  21. package/dist/composition/guard-fill.d.ts +44 -0
  22. package/dist/composition/guard-fill.js +1 -0
  23. package/dist/composition/inflight.d.ts +26 -2
  24. package/dist/composition/inflight.js +1 -1
  25. package/dist/composition/input-normalize.d.ts +15 -0
  26. package/dist/composition/input-normalize.js +1 -0
  27. package/dist/composition/materialize.d.ts +22 -13
  28. package/dist/composition/materialize.js +1 -1
  29. package/dist/composition/mode-gates.d.ts +35 -0
  30. package/dist/composition/mode-gates.js +1 -0
  31. package/dist/composition/param-disclosure.d.ts +61 -0
  32. package/dist/composition/param-disclosure.js +1 -0
  33. package/dist/composition/plan-retry-ledger.d.ts +21 -0
  34. package/dist/composition/plan-retry-ledger.js +1 -0
  35. package/dist/composition/plan.d.ts +17 -2
  36. package/dist/composition/plan.js +1 -1
  37. package/dist/composition/product-card.d.ts +94 -0
  38. package/dist/composition/product-card.js +1 -0
  39. package/dist/composition/supply-chain-emit.d.ts +46 -0
  40. package/dist/composition/supply-chain-emit.js +1 -0
  41. package/dist/config/config-audit.spec.js +1 -1
  42. package/dist/config/config-warnings.d.ts +2 -0
  43. package/dist/config/config-warnings.js +1 -0
  44. package/dist/config/exposure.d.ts +2 -2
  45. package/dist/config/judgment.d.ts +31 -5
  46. package/dist/config/judgment.js +1 -1
  47. package/dist/config/judgment.spec.js +1 -1
  48. package/dist/config/match-policy-file.d.ts +34 -0
  49. package/dist/config/match-policy-file.js +1 -0
  50. package/dist/config/match-policy-file.spec.d.ts +1 -0
  51. package/dist/config/match-policy-file.spec.js +1 -0
  52. package/dist/config/rule-engine.d.ts +5 -5
  53. package/dist/config/rule-engine.js +1 -1
  54. package/dist/config/runtime.d.ts +0 -1
  55. package/dist/config/runtime.js +1 -1
  56. package/dist/config/severity.d.ts +0 -2
  57. package/dist/config/severity.js +1 -1
  58. package/dist/config/store-policy.spec.js +1 -1
  59. package/dist/config/template-params.d.ts +42 -0
  60. package/dist/config/template-params.js +1 -0
  61. package/dist/config/template-params.spec.d.ts +1 -0
  62. package/dist/config/template-params.spec.js +1 -0
  63. package/dist/customer/account-events.js +1 -1
  64. package/dist/data/api/api.spec.js +1 -1
  65. package/dist/data/api/cli.js +1 -1
  66. package/dist/data/api/server.d.ts +1 -0
  67. package/dist/data/api/server.js +1 -1
  68. package/dist/data/projection/store.d.ts +3 -1
  69. package/dist/data/projection/store.js +1 -1
  70. package/dist/data/projection/types.d.ts +32 -0
  71. package/dist/data/sync/cdc.d.ts +1 -2
  72. package/dist/data/sync/cdc.js +1 -1
  73. package/dist/data/sync/cdc.spec.js +1 -1
  74. package/dist/data/sync/store.d.ts +5 -0
  75. package/dist/data/sync/store.js +1 -1
  76. package/dist/data/sync/types.d.ts +2 -0
  77. package/dist/evaluation/acceptance.d.ts +8 -0
  78. package/dist/evaluation/acceptance.js +1 -1
  79. package/dist/evaluation/builtins/demand-match.js +1 -1
  80. package/dist/evaluation/builtins/graph-service.spec.js +1 -1
  81. package/dist/evaluation/capability.d.ts +2 -0
  82. package/dist/evaluation/category-match-rules.d.ts +0 -1
  83. package/dist/evaluation/category-match-rules.js +1 -1
  84. package/dist/evaluation/composer.d.ts +25 -0
  85. package/dist/evaluation/composer.js +1 -1
  86. package/dist/evaluation/engine.js +1 -1
  87. package/dist/evaluation/extract.d.ts +7 -0
  88. package/dist/evaluation/extract.js +1 -1
  89. package/dist/evaluation/game-strategy.d.ts +0 -3
  90. package/dist/evaluation/game-strategy.js +1 -1
  91. package/dist/evaluation/guard-scan.js +1 -1
  92. package/dist/evaluation/match-operation.d.ts +9 -0
  93. package/dist/evaluation/match-operation.js +1 -1
  94. package/dist/evaluation/match-policy-resolver.d.ts +9 -0
  95. package/dist/evaluation/match-policy-resolver.js +1 -0
  96. package/dist/evaluation/match-policy.d.ts +3 -1
  97. package/dist/evaluation/match-policy.js +1 -1
  98. package/dist/evaluation/region.d.ts +0 -6
  99. package/dist/evaluation/region.js +1 -1
  100. package/dist/evaluation/standards.d.ts +2 -1
  101. package/dist/evaluation/standards.js +1 -1
  102. package/dist/evaluation/structured-lines.d.ts +8 -0
  103. package/dist/evaluation/structured-lines.js +1 -0
  104. package/dist/evaluation/types.d.ts +6 -0
  105. package/dist/experience/realtime-feedback.js +1 -1
  106. package/dist/extensions/capability-manifest.d.ts +1 -0
  107. package/dist/extensions/capability-manifest.js +1 -1
  108. package/dist/extensions/capability.d.ts +91 -0
  109. package/dist/extensions/capability.js +1 -0
  110. package/dist/extensions/industry-audit.spec.js +1 -1
  111. package/dist/extensions/industry-pack.d.ts +13 -0
  112. package/dist/extensions/industry-pack.js +1 -1
  113. package/dist/extensions/modes.js +1 -1
  114. package/dist/extensions/registry.d.ts +0 -2
  115. package/dist/extensions/registry.js +1 -1
  116. package/dist/goal/GoalEngine.js +1 -1
  117. package/dist/graph/onchain/analyze.js +1 -1
  118. package/dist/graph/onchain/expand.js +1 -1
  119. package/dist/graph/onchain/exposure.js +1 -1
  120. package/dist/graph/onchain/facts.js +1 -1
  121. package/dist/graph/onchain/order-status.d.ts +0 -1
  122. package/dist/graph/onchain/order-status.js +1 -1
  123. package/dist/harness/recover.js +1 -1
  124. package/dist/harness/verify.d.ts +0 -3
  125. package/dist/harness/verify.js +1 -1
  126. package/dist/index.js +1 -1
  127. package/dist/intent/types.d.ts +0 -1
  128. package/dist/intent/types.js +1 -1
  129. package/dist/keeper/detectors.js +1 -1
  130. package/dist/keeper/types.d.ts +0 -1
  131. package/dist/keeper/types.js +1 -1
  132. package/dist/knowledge/allocation-risk.d.ts +1 -0
  133. package/dist/knowledge/allocation-risk.js +1 -1
  134. package/dist/knowledge/allocation-templates.js +1 -1
  135. package/dist/knowledge/allocator-rail-verifier.d.ts +6 -1
  136. package/dist/knowledge/allocator-rail-verifier.js +1 -1
  137. package/dist/knowledge/arb-fund-facts.d.ts +1 -0
  138. package/dist/knowledge/arb-fund-facts.js +1 -1
  139. package/dist/knowledge/arbitration-ledger.js +1 -1
  140. package/dist/knowledge/arbitration-puzzle.js +1 -1
  141. package/dist/knowledge/arbitration-risk.d.ts +1 -0
  142. package/dist/knowledge/arbitration-risk.js +1 -1
  143. package/dist/knowledge/audit-rules.d.ts +2 -2
  144. package/dist/knowledge/audit-rules.js +1 -1
  145. package/dist/knowledge/baselines/judgment-baselines.json +21 -2
  146. package/dist/knowledge/baselines/rules/allocation.json +6 -6
  147. package/dist/knowledge/baselines/rules/arb.json +2 -2
  148. package/dist/knowledge/baselines/rules/guard.json +11 -11
  149. package/dist/knowledge/baselines/rules/oracle.json +120 -0
  150. package/dist/knowledge/baselines/rules/order.json +1 -1
  151. package/dist/knowledge/baselines/rules/plan.json +385 -18
  152. package/dist/knowledge/baselines/rules/progress.json +20 -2
  153. package/dist/knowledge/baselines/semantic-facts.js +1 -1
  154. package/dist/knowledge/builtin-templates.d.ts +25 -1
  155. package/dist/knowledge/builtin-templates.js +1 -1
  156. package/dist/knowledge/catalog-facts.d.ts +4 -0
  157. package/dist/knowledge/catalog-facts.js +1 -0
  158. package/dist/knowledge/commission-landing.js +1 -1
  159. package/dist/knowledge/component-schema.d.ts +64 -0
  160. package/dist/knowledge/component-schema.js +1 -0
  161. package/dist/knowledge/contact-templates.d.ts +0 -1
  162. package/dist/knowledge/contact-templates.js +1 -1
  163. package/dist/knowledge/dynamic-pricing.js +1 -1
  164. package/dist/knowledge/entity-recipient-guard.js +1 -1
  165. package/dist/knowledge/event-semantics.js +1 -1
  166. package/dist/knowledge/fee-param-bindings.d.ts +26 -0
  167. package/dist/knowledge/fee-param-bindings.js +1 -0
  168. package/dist/knowledge/fund-layer.d.ts +1 -0
  169. package/dist/knowledge/fund-layer.js +1 -1
  170. package/dist/knowledge/game-scenarios.js +1 -1
  171. package/dist/knowledge/getting-started.d.ts +2 -2
  172. package/dist/knowledge/getting-started.js +1 -1
  173. package/dist/knowledge/guard-anchor-reach.js +1 -1
  174. package/dist/knowledge/guard-binding-table.d.ts +52 -0
  175. package/dist/knowledge/guard-binding-table.js +1 -0
  176. package/dist/knowledge/guard-binding-verifier.d.ts +30 -0
  177. package/dist/knowledge/guard-binding-verifier.js +1 -0
  178. package/dist/knowledge/guard-bindings.js +1 -1
  179. package/dist/knowledge/guard-blueprint.d.ts +68 -0
  180. package/dist/knowledge/guard-blueprint.js +1 -0
  181. package/dist/knowledge/guard-design-patterns.d.ts +1 -1
  182. package/dist/knowledge/guard-design-patterns.js +1 -1
  183. package/dist/knowledge/guard-field-cognition.js +1 -1
  184. package/dist/knowledge/guard-host-context.d.ts +24 -0
  185. package/dist/knowledge/guard-host-context.js +1 -0
  186. package/dist/knowledge/guard-ledger.js +1 -1
  187. package/dist/knowledge/guard-lint.d.ts +1 -0
  188. package/dist/knowledge/guard-lint.js +1 -1
  189. package/dist/knowledge/guard-node-gates.d.ts +3 -0
  190. package/dist/knowledge/guard-node-gates.js +1 -1
  191. package/dist/knowledge/guard-puzzle.js +1 -1
  192. package/dist/knowledge/guard-render.js +1 -1
  193. package/dist/knowledge/guard-risk.js +1 -1
  194. package/dist/knowledge/guard-submission-prompt.d.ts +11 -0
  195. package/dist/knowledge/guard-submission-prompt.js +1 -1
  196. package/dist/knowledge/guard-templates.d.ts +1 -1
  197. package/dist/knowledge/guard-templates.js +1 -1
  198. package/dist/knowledge/guard-translation.js +1 -1
  199. package/dist/knowledge/index.d.ts +1 -1
  200. package/dist/knowledge/index.js +1 -1
  201. package/dist/knowledge/industry-generalizer.d.ts +6 -1
  202. package/dist/knowledge/industry-generalizer.js +1 -1
  203. package/dist/knowledge/industry-registry.js +1 -1
  204. package/dist/knowledge/industry-strategy.js +1 -1
  205. package/dist/knowledge/jsonrpc-enum.d.ts +52 -3
  206. package/dist/knowledge/jsonrpc-enum.js +1 -1
  207. package/dist/knowledge/knob-docs.d.ts +5 -0
  208. package/dist/knowledge/knob-docs.js +1 -0
  209. package/dist/knowledge/machine-templates.js +1 -1
  210. package/dist/knowledge/machine-topology.js +1 -1
  211. package/dist/knowledge/machine-translation.js +1 -1
  212. package/dist/knowledge/object-dependency.d.ts +31 -0
  213. package/dist/knowledge/object-dependency.js +1 -0
  214. package/dist/knowledge/onchain-constants.d.ts +4 -0
  215. package/dist/knowledge/onchain-constants.js +1 -1
  216. package/dist/knowledge/order-ledger.js +1 -1
  217. package/dist/knowledge/param-schema.d.ts +93 -0
  218. package/dist/knowledge/param-schema.js +1 -0
  219. package/dist/knowledge/param-tiers.d.ts +25 -0
  220. package/dist/knowledge/param-tiers.js +1 -0
  221. package/dist/knowledge/passport-ledger.d.ts +1 -1
  222. package/dist/knowledge/passport-ledger.js +1 -1
  223. package/dist/knowledge/path-oracle/coverage.d.ts +16 -0
  224. package/dist/knowledge/path-oracle/coverage.js +1 -0
  225. package/dist/knowledge/path-oracle/index.d.ts +5 -0
  226. package/dist/knowledge/path-oracle/index.js +1 -0
  227. package/dist/knowledge/path-oracle/products/food-delivery.d.ts +2 -0
  228. package/dist/knowledge/path-oracle/products/food-delivery.js +1 -0
  229. package/dist/knowledge/path-oracle/schema.d.ts +188 -0
  230. package/dist/knowledge/path-oracle/schema.js +1 -0
  231. package/dist/knowledge/pattern-resolutions.d.ts +108 -0
  232. package/dist/knowledge/pattern-resolutions.js +1 -0
  233. package/dist/knowledge/progress-ledger.js +1 -1
  234. package/dist/knowledge/progress-risk.js +1 -1
  235. package/dist/knowledge/projection.spec.js +1 -1
  236. package/dist/knowledge/protocol-facts.js +1 -1
  237. package/dist/knowledge/requirement-families.d.ts +13 -0
  238. package/dist/knowledge/requirement-families.js +1 -0
  239. package/dist/knowledge/reward-ledger.js +1 -1
  240. package/dist/knowledge/safety-rules.js +1 -1
  241. package/dist/knowledge/scenario-modes.d.ts +2 -0
  242. package/dist/knowledge/scenario-modes.js +1 -1
  243. package/dist/knowledge/scenario-topology.js +1 -1
  244. package/dist/knowledge/semantic-ir.d.ts +4 -0
  245. package/dist/knowledge/semantic-ir.js +1 -1
  246. package/dist/knowledge/service-allocation-semantics.js +1 -1
  247. package/dist/knowledge/service-ledger.d.ts +1 -1
  248. package/dist/knowledge/service-ledger.js +1 -1
  249. package/dist/knowledge/service-templates.js +1 -1
  250. package/dist/knowledge/sku-name-gate.d.ts +17 -0
  251. package/dist/knowledge/sku-name-gate.js +1 -0
  252. package/dist/knowledge/strategy-manuals.d.ts +1 -1
  253. package/dist/knowledge/strategy-manuals.js +1 -1
  254. package/dist/knowledge/supply-chain.d.ts +9 -0
  255. package/dist/knowledge/supply-chain.js +1 -1
  256. package/dist/knowledge/template-loader.d.ts +114 -6
  257. package/dist/knowledge/template-loader.js +1 -1
  258. package/dist/knowledge/template-nav.d.ts +9 -0
  259. package/dist/knowledge/template-nav.js +1 -0
  260. package/dist/knowledge/template-prose.d.ts +1 -1
  261. package/dist/knowledge/template-registry.js +1 -1
  262. package/dist/knowledge/template-scanner.d.ts +95 -0
  263. package/dist/knowledge/template-scanner.js +1 -1
  264. package/dist/knowledge/template-test-profiles.d.ts +17 -0
  265. package/dist/knowledge/template-test-profiles.js +1 -0
  266. package/dist/knowledge/template-validation.d.ts +1 -0
  267. package/dist/knowledge/template-validation.js +1 -1
  268. package/dist/knowledge/tools-reference.js +1 -1
  269. package/dist/knowledge/treasury-templates.js +1 -1
  270. package/dist/knowledge/workflow-guidance.d.ts +5 -0
  271. package/dist/knowledge/workflow-guidance.js +1 -1
  272. package/dist/monitor/MonitorLoop.js +1 -1
  273. package/dist/participation/radar-core.js +1 -1
  274. package/dist/participation/time-window.d.ts +37 -0
  275. package/dist/participation/time-window.js +1 -0
  276. package/dist/persona/address-format.d.ts +0 -1
  277. package/dist/persona/address-format.js +1 -1
  278. package/dist/persona/bridge.js +1 -1
  279. package/dist/persona/index.d.ts +0 -2
  280. package/dist/persona/index.js +1 -1
  281. package/dist/persona/model.js +1 -1
  282. package/dist/persona/persona-audit.spec.js +1 -1
  283. package/dist/persona/types.d.ts +6 -0
  284. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  285. package/dist/playbooks/service-build/game-theory.d.ts +2 -2
  286. package/dist/playbooks/service-build/intent-analyzer.js +1 -1
  287. package/dist/playbooks/service-build/machine-panorama.d.ts +1 -0
  288. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  289. package/dist/playbooks/service-build/merchant-guide.d.ts +52 -22
  290. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  291. package/dist/playbooks/service-build/migration-planner.d.ts +2 -0
  292. package/dist/playbooks/service-build/migration-planner.js +1 -1
  293. package/dist/playbooks/service-build/mode-actions.js +1 -1
  294. package/dist/playbooks/service-build/object-panorama.d.ts +8 -0
  295. package/dist/playbooks/service-build/object-panorama.js +1 -1
  296. package/dist/playbooks/service-build/participation-radar.d.ts +1 -0
  297. package/dist/playbooks/service-build/participation-radar.js +1 -1
  298. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  299. package/dist/playbooks/service-build/reverse-mapping.d.ts +6 -0
  300. package/dist/playbooks/service-build/reverse-mapping.js +1 -1
  301. package/dist/playbooks/service-build/service-panorama.d.ts +2 -0
  302. package/dist/playbooks/service-build/service-panorama.js +1 -1
  303. package/dist/playbooks/service-build/service-quote.js +1 -1
  304. package/dist/playbooks/service-build/service-quote.spec.js +1 -1
  305. package/dist/playbooks/service-build/workflow-design-assessment.d.ts +10 -1
  306. package/dist/playbooks/service-build/workflow-design-assessment.js +1 -1
  307. package/dist/relationship/registry.js +1 -1
  308. package/dist/review/index.js +1 -1
  309. package/dist/review/repository.js +1 -1
  310. package/dist/runtime/instance-registry.d.ts +7 -1
  311. package/dist/runtime/instance-registry.js +1 -1
  312. package/dist/safety/confirm-gate.js +1 -1
  313. package/dist/schema/benchmark-migration/index.d.ts +106 -0
  314. package/dist/schema/benchmark-migration/index.js +1 -1
  315. package/dist/schema/call/allocation.d.ts +15 -6
  316. package/dist/schema/call/allocation.js +1 -1
  317. package/dist/schema/call/arbitration.js +1 -1
  318. package/dist/schema/call/base.d.ts +264 -0
  319. package/dist/schema/call/base.js +1 -1
  320. package/dist/schema/call/bridge.d.ts +34 -6
  321. package/dist/schema/call/demand.d.ts +15 -6
  322. package/dist/schema/call/demand.js +1 -1
  323. package/dist/schema/call/error-codes.d.ts +1 -1
  324. package/dist/schema/call/error-codes.js +1 -1
  325. package/dist/schema/call/guard.d.ts +8 -8
  326. package/dist/schema/call/guard.js +1 -1
  327. package/dist/schema/call/handler.d.ts +3 -0
  328. package/dist/schema/call/handler.js +1 -1
  329. package/dist/schema/call/machine.d.ts +32 -8
  330. package/dist/schema/call/machine.js +1 -1
  331. package/dist/schema/call/order.d.ts +26 -8
  332. package/dist/schema/call/order.js +1 -1
  333. package/dist/schema/call/payment.d.ts +20 -8
  334. package/dist/schema/call/payment.js +1 -1
  335. package/dist/schema/call/permission-handler.js +1 -1
  336. package/dist/schema/call/permission.d.ts +330 -114
  337. package/dist/schema/call/permission.js +1 -1
  338. package/dist/schema/call/personal.d.ts +10 -4
  339. package/dist/schema/call/personal.js +1 -1
  340. package/dist/schema/call/progress.d.ts +16 -4
  341. package/dist/schema/call/reward.d.ts +10 -4
  342. package/dist/schema/call/reward.js +1 -1
  343. package/dist/schema/call/semantic.d.ts +1 -0
  344. package/dist/schema/call/semantic.js +1 -1
  345. package/dist/schema/call/service.d.ts +131 -43
  346. package/dist/schema/call/service.js +1 -1
  347. package/dist/schema/call/treasury.d.ts +15 -6
  348. package/dist/schema/call/treasury.js +1 -1
  349. package/dist/schema/common/index.js +1 -1
  350. package/dist/schema/config/index.d.ts +61 -0
  351. package/dist/schema/config/index.js +1 -1
  352. package/dist/schema/envelope-unify.d.ts +4 -0
  353. package/dist/schema/envelope-unify.js +1 -0
  354. package/dist/schema/evaluation/index.d.ts +224 -19
  355. package/dist/schema/evaluation/index.js +1 -1
  356. package/dist/schema/goal/index.d.ts +47 -0
  357. package/dist/schema/goal/planning.d.ts +116 -1
  358. package/dist/schema/goal/planning.js +1 -1
  359. package/dist/schema/industry-pack/index.d.ts +166 -6
  360. package/dist/schema/industry-pack/index.js +1 -1
  361. package/dist/schema/industry-pack/modes.d.ts +6 -6
  362. package/dist/schema/keeper/index.d.ts +26 -0
  363. package/dist/schema/local/index.d.ts +157 -0
  364. package/dist/schema/local/index.js +1 -1
  365. package/dist/schema/local/wip.d.ts +6 -0
  366. package/dist/schema/local/wip.js +1 -1
  367. package/dist/schema/messenger/index.d.ts +28 -0
  368. package/dist/schema/messenger/index.js +1 -1
  369. package/dist/schema/operations.d.ts +343 -84
  370. package/dist/schema/operations.js +1 -1
  371. package/dist/schema/persona/index.d.ts +2907 -640
  372. package/dist/schema/persona/index.js +1 -1
  373. package/dist/schema/query/bi.d.ts +251 -4
  374. package/dist/schema/query/bi.js +1 -1
  375. package/dist/schema/query/index.d.ts +271 -78
  376. package/dist/schema/query/index.js +1 -1
  377. package/dist/schema/schema-query/index.d.ts +1 -1
  378. package/dist/schema/schema-query/index.js +1 -1
  379. package/dist/schema/schema-version.js +1 -1
  380. package/dist/schema/utils/permission-machine-check.d.ts +2 -0
  381. package/dist/schema/utils/permission-machine-check.js +1 -1
  382. package/dist/schema/watch/index.d.ts +16 -0
  383. package/dist/schema/watch/index.js +1 -1
  384. package/dist/schema/workflow/index.d.ts +2 -2
  385. package/dist/schema/workflow/index.js +1 -1
  386. package/dist/schema-query-impl/index.d.ts +1 -1
  387. package/dist/schema-query-impl/index.js +1 -1
  388. package/dist/schemas/account_operation.output.json +98 -2
  389. package/dist/schemas/benchmark_migration_operation.output.json +341 -12
  390. package/dist/schemas/benchmark_migration_operation.schema.json +42 -3
  391. package/dist/schemas/bridge_operation.output.json +98 -2
  392. package/dist/schemas/bridge_operation.schema.json +5 -5
  393. package/dist/schemas/config_operation.output.json +352 -0
  394. package/dist/schemas/config_operation.schema.json +20 -2
  395. package/dist/schemas/evaluation_operation.output.json +586 -4
  396. package/dist/schemas/evaluation_operation.schema.json +194 -3
  397. package/dist/schemas/goal_operation.schema.json +183 -0
  398. package/dist/schemas/guard2file.schema.json +1 -1
  399. package/dist/schemas/index.json +1 -1
  400. package/dist/schemas/industry_pack_operation.output.json +771 -1
  401. package/dist/schemas/industry_pack_operation.schema.json +28 -4
  402. package/dist/schemas/keeper_operation.output.json +96 -2
  403. package/dist/schemas/local_cache_operation.output.json +98 -2
  404. package/dist/schemas/local_history_operation.output.json +98 -2
  405. package/dist/schemas/local_info_operation.output.json +98 -2
  406. package/dist/schemas/local_mark_operation.output.json +98 -2
  407. package/dist/schemas/machineNode2file.schema.json +1 -1
  408. package/dist/schemas/messenger_operation.output.json +107 -2
  409. package/dist/schemas/messenger_operation.schema.json +41 -34
  410. package/dist/schemas/monitor_events.output.json +96 -2
  411. package/dist/schemas/monitor_subscription.output.json +96 -2
  412. package/dist/schemas/onchain_events.output.json +108 -14
  413. package/dist/schemas/onchain_operations.output.json +326 -11
  414. package/dist/schemas/onchain_operations.schema.json +1343 -734
  415. package/dist/schemas/onchain_operations_allocation.schema.json +35 -19
  416. package/dist/schemas/onchain_operations_arbitration.schema.json +16 -8
  417. package/dist/schemas/onchain_operations_contact.schema.json +12 -4
  418. package/dist/schemas/onchain_operations_demand.schema.json +33 -17
  419. package/dist/schemas/onchain_operations_gen_passport.schema.json +12 -4
  420. package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
  421. package/dist/schemas/onchain_operations_guard.schema.json +297 -111
  422. package/dist/schemas/onchain_operations_machine.schema.json +56 -39
  423. package/dist/schemas/onchain_operations_order.schema.json +67 -42
  424. package/dist/schemas/onchain_operations_payment.schema.json +27 -12
  425. package/dist/schemas/onchain_operations_permission.schema.json +363 -232
  426. package/dist/schemas/onchain_operations_personal.schema.json +43 -28
  427. package/dist/schemas/onchain_operations_progress.schema.json +49 -32
  428. package/dist/schemas/onchain_operations_proof.schema.json +12 -4
  429. package/dist/schemas/onchain_operations_repository.schema.json +17 -8
  430. package/dist/schemas/onchain_operations_reward.schema.json +36 -20
  431. package/dist/schemas/onchain_operations_service.schema.json +230 -130
  432. package/dist/schemas/onchain_operations_treasury.schema.json +36 -20
  433. package/dist/schemas/onchain_table_data.output.json +276 -19
  434. package/dist/schemas/onchain_table_data.schema.json +104 -64
  435. package/dist/schemas/persona_operation.output.json +7752 -0
  436. package/dist/schemas/persona_operation.schema.json +1232 -4
  437. package/dist/schemas/query_toolkit.output.json +1054 -146
  438. package/dist/schemas/query_toolkit.schema.json +144 -13
  439. package/dist/schemas/schema_query.schema.json +1 -1
  440. package/dist/schemas/watch_operation.output.json +86 -3
  441. package/dist/schemas/wip_file.output.json +8 -0
  442. package/dist/schemas/workflow_operation.schema.json +5 -4
  443. package/dist/schemas/wowok_buildin_info.schema.json +1 -1
  444. package/dist/task/playbook.js +1 -1
  445. package/dist/tools/handlers/benchmark-migration.d.ts +12 -3
  446. package/dist/tools/handlers/benchmark-migration.js +1 -1
  447. package/dist/tools/handlers/config.js +1 -1
  448. package/dist/tools/handlers/evaluation.js +1 -1
  449. package/dist/tools/handlers/evaluation.spec.js +1 -1
  450. package/dist/tools/handlers/industry-pack.js +1 -1
  451. package/dist/tools/handlers/messenger.js +1 -1
  452. package/dist/tools/handlers/onchain.d.ts +24 -0
  453. package/dist/tools/handlers/onchain.js +1 -1
  454. package/dist/tools/handlers/persona.js +1 -1
  455. package/dist/tools/handlers/query.d.ts +8 -0
  456. package/dist/tools/handlers/query.js +1 -1
  457. package/dist/tools/handlers/winner-derivation.d.ts +20 -0
  458. package/dist/tools/handlers/winner-derivation.js +1 -0
  459. package/dist/tools/handlers/wip-upload.js +1 -1
  460. package/dist/tools/index.d.ts +1 -0
  461. package/dist/tools/index.js +1 -1
  462. package/dist/tools/registry/business.js +1 -1
  463. package/dist/tools/registry/config.js +1 -1
  464. package/dist/tools/registry/evaluation.js +1 -1
  465. package/dist/tools/registry/identity.js +1 -1
  466. package/dist/tools/registry/onchain.js +1 -1
  467. package/dist/tools/registry/query.js +1 -1
  468. package/dist/tools/sanitize-output.js +1 -1
  469. package/dist/tools/sanitize-output.spec.js +1 -1
  470. package/dist/tools/transport-integrity.d.ts +7 -0
  471. package/dist/tools/transport-integrity.js +1 -0
  472. package/dist/tools/types.d.ts +1 -0
  473. package/dist/tools/upgrade-check.d.ts +22 -0
  474. package/dist/tools/upgrade-check.js +1 -1
  475. package/dist/tools/wrap.d.ts +6 -1
  476. package/dist/tools/wrap.js +1 -1
  477. package/package.json +7 -6
  478. package/dist/extensions/business-modules.d.ts +0 -54
  479. package/dist/extensions/business-modules.js +0 -1
  480. package/dist/schemas/guard-templates.json +0 -379
@@ -1 +1 @@
1
- import{afterEach,beforeEach,describe,expect,it,vi}from'vitest';import{handleEvaluationOperation}from'./evaluation.js';import{enumerateDemands,enumerateServices,matchServicesViaIndex,weiToWowDecimal}from'../../knowledge/jsonrpc-enum.js';vi['mock']('../../knowledge/jsonrpc-enum.js',async a=>({...await a(),'enumerateServices':vi['fn'](),'enumerateDemands':vi['fn'](),'matchServicesViaIndex':vi['fn']()}));function resultOf(a){return a['structuredContent']['result'];}const demandCap={'id':'0xdemand1','kind':'demand','industry':'freelance','region':{'mode':'physical','city':'Shanghai','raw':'Shanghai'},'keywords':['design'],'capabilities':{'has_arbitration':![],'has_refund_path':![],'has_milestone_nodes':![],'has_compensation_fund':![],'has_wip_verification':![],'has_messenger':![],'has_buy_guard':![],'has_dynamic_pricing':![],'is_published':!![],'is_paused':![]}},service={'object':'0xsvc1','description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'price':'100','wip_hash':'abc'}],'bPublished':!![],'bPaused':![]};describe('evaluation_operation\x20demand_match\x20presenter_history\x20(P2-2)',()=>{it('acceptance\x20rule\x20scores\x20the\x20rated\x20history\x20in\x20the\x20breakdown',async()=>{const a=await handleEvaluationOperation({'action':'demand_match','demand_cap':demandCap,'services':[service],'presenter_history':[{'acceptance_score':0x50},{'acceptance_score':0x5a}]}),c=resultOf(a);expect(c['action'])['toBe']('demand_match');const d=c['matches'][0x0]['result']['breakdown']['find'](e=>e['rule_id']==='acceptance');expect(d)['toBeDefined'](),expect(d['score'])['toBe'](0x55);}),it('omitted\x20history\x20→\x20acceptance\x20stays\x20neutral',async()=>{const a=await handleEvaluationOperation({'action':'demand_match','demand_cap':demandCap,'services':[service]}),c=resultOf(a)['matches'][0x0]['result']['breakdown']['find'](d=>d['rule_id']==='acceptance');expect(c)['toBeDefined'](),expect(c['score'])['toBe'](0x32),expect(c['reason'])['toContain']('neutral');}),it('schema\x20rejects\x20a\x20malformed\x20presenter_history\x20entry',async()=>{await expect(handleEvaluationOperation({'action':'demand_match','demand_cap':demandCap,'services':[service],'presenter_history':[{'acceptance_score':0x50,'bogus':!![]}]}))['rejects']['toThrow']();});}),describe('evaluation_operation\x20demand_match\x20order\x20bridge\x20(N-2\x20/\x2008\x20§7)',()=>{it('each\x20match\x20carries\x20the\x20service.order_new\x20transaction-formation\x20bridge',async()=>{const a=await handleEvaluationOperation({'action':'demand_match','demand_cap':demandCap,'services':[service]}),b=resultOf(a)['matches'][0x0];expect(b['order'])['toBeDefined'](),expect(b['order']['operation'])['toBe']('service.order_new'),expect(b['order']['operation_type'])['toBe']('service'),expect(b['order']['preconditions']['some'](c=>c['includes']('acceptance_score')))['toBe'](!![]),expect(b['order']['rationale'])['toContain']('0xsvc1'),expect(b['next']['operation'])['toBe']('demand.publish'),expect(b['next']['operation_type'])['toBe']('demand'),expect(b['next']['rationale'])['toContain']('service.order_new');});}),describe('evaluation_operation\x20match_discover\x20indexed\x20candidate\x20mapping',()=>{it('scores\x20wrapped\x20sales\x20fields\x20instead\x20of\x20replacing\x20them\x20with\x20zero\x20values',async()=>{vi['mocked'](enumerateServices)['mockResolvedValueOnce']({'services':[{'object':'0xsvc1','name':'Logo\x20design','location':'Shanghai','json':{'description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'fields':{'name':'logo','price':'100','wip_hash':'abc'}}],'bPublished':!![],'bPaused':![]}}],'total_enumerated':0x1,'has_more':![],'coverage':{'mode':'known_objects','complete':![],'truncated':![],'total_enumerated':0x1,'chain_id':'chain_test','degraded_reasons':[]}});const a=await handleEvaluationOperation({'action':'match_discover','description':'freelance\x20logo\x20design','location':'Shanghai','sensitivity':'strict','budget':'50','required_capabilities':['has_wip_verification'],'context_network':'testnet'}),b=resultOf(a)['matches'][0x0];expect(b['service']['sales'])['toEqual']([{'name':'logo','price':'100','wip_hash':'abc'}]),expect(b['result']['breakdown']['find'](c=>c['rule_id']==='price'))['toMatchObject']({'score':0x0,'reason':'over\x20budget'}),expect(b['result']['breakdown']['find'](c=>c['rule_id']==='capabilities'))['toMatchObject']({'score':0x64,'matched':['has_wip_verification']});});}),describe('evaluation_operation\x20evidence_review\x20list\x20mode\x20(P2-3)',()=>{it('items\x20mode\x20→\x20structured\x20usable/manual/rejected\x20+\x20proof\x20candidates',async()=>{const a=await handleEvaluationOperation({'action':'evidence_review','items':[{'id':'chat.wts','kind':'signature_photo','hash_committed':!![],'digital_check_passed':!![],'proof_ref':'0xproof1'},{'id':'waybill.jpg','kind':'delivery_proof','hash_committed':!![]},{'id':'voice.mp3','kind':'voice_recording','hash_committed':![]}]}),b=resultOf(a);expect(b['action'])['toBe']('evidence_review'),expect(b['list']['items'])['toHaveLength'](0x3),expect(b['list']['usable'])['toHaveLength'](0x1),expect(b['list']['manual'])['toHaveLength'](0x1),expect(b['list']['rejected'])['toHaveLength'](0x1),expect(b['list']['proof_candidates'])['toHaveLength'](0x1),expect(b['list']['proof_candidates'][0x0]['proof_ref'])['toBe']('0xproof1'),expect(b['list']['dispute_hint'])['toContain']('1\x20Proof\x20reference\x20candidate(s)\x20ready');}),it('single-item\x20mode\x20still\x20works\x20(backwards\x20compatible)',async()=>{const a=await handleEvaluationOperation({'action':'evidence_review','kind':'signature_photo','hash_committed':!![],'digital_check_passed':!![]});expect(resultOf(a)['review']['status'])['toBe']('auto_pass');}),it('schema\x20refinement:\x20neither\x20items\x20nor\x20kind+hash_committed\x20→\x20error',async()=>{await expect(handleEvaluationOperation({'action':'evidence_review'}))['rejects']['toThrow']();});});function remoteCandidate(a,b={}){return{'objectId':a,'verifiedKind':'Service','objectVersion':'3','facetVersion':'facets-1','channels':['bm25','structured'],'rrf':0.032786885246,'publicFeatures':{'industry':'freelance','industryConfidence':0.7,'location':'Shanghai','priceMin':'100','priceMax':'100','capabilities':['has_wip_verification'],'published':!![],'paused':![],'keywords':['design']},'serverEvaluation':{'policyVersion':'public-baseline-1','total':87.5,'breakdown':[{'dimension':'text','weight':0x1e,'score':0x64}],'unknownRules':['trust:\x20cold-start\x20prior\x20withheld'],'redFlags':[]},'payloadJson':{'description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'fields':{'name':'logo','price':'100','wip_hash':'abc'}}],'bPublished':!![],'bPaused':![]},...b};}function remotePage(a){return{'policyVersion':'public-baseline-1','candidates':a,'recall':{'liveSet':a['length']+0x2,'gated':a['length'],'structured':a['length'],'bm25':a['length'],'merged':a['length'],'channelsActive':['structured','bm25']},'truncated':![],'coverage':{'mode':'known_objects','complete':![],'truncated':![],'total_enumerated':a['length'],'chain_id':'chain_test','degraded_reasons':[]}};}function legacyAnswer(){return{'services':[{'object':'0xsvc1','name':'Logo\x20design','location':'Shanghai','json':{'description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'fields':{'name':'logo','price':'100','wip_hash':'abc'}}],'bPublished':!![],'bPaused':![]}}],'total_enumerated':0x1,'has_more':![],'coverage':{'mode':'event_window','complete':![],'truncated':![],'total_enumerated':0x1,'chain_id':'chain_test','degraded_reasons':['EVENT_BACKED_ENUMERATION']}};}const MATCH_INPUT={'action':'match_discover','description':'freelance\x20logo\x20design','location':'Shanghai','sensitivity':'strict','budget':'100','required_capabilities':['has_wip_verification'],'context_network':'testnet'};describe('evaluation_operation\x20match_discover\x20remote\x20index\x20route\x20(K5-11\x20R3)',()=>{beforeEach(()=>{vi['mocked'](enumerateServices)['mockReset'](),vi['mocked'](matchServicesViaIndex)['mockReset']();}),afterEach(()=>{delete process['env']['WOWOK_DATA_SOURCE'],delete process['env']['WOWOK_INDEX_URL'];}),it('converts\x20wei\x20budgets\x20to\x20WOW\x20decimals\x20for\x20the\x20match\x20API',()=>{expect(weiToWowDecimal('0'))['toBe']('0'),expect(weiToWowDecimal('6000000000'))['toBe']('6'),expect(weiToWowDecimal('7500000000'))['toBe']('7.5'),expect(weiToWowDecimal('123456789'))['toBe']('0.123456789'),expect(weiToWowDecimal('1000000000000'))['toBe']('1000'),expect(()=>weiToWowDecimal('12.5'))['toThrow']();}),it('one-shot\x20remote\x20match:\x20no\x20enumeration,\x20dual\x20breakdown,\x20private\x20re-rank',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchServicesViaIndex)['mockResolvedValueOnce'](remotePage([remoteCandidate('0xsvc1'),remoteCandidate('0xsvc2',{'payloadJson':{'description':'mural\x20painting','location':'Shanghai','sales':[{'fields':{'name':'mural','price':'90'}}],'bPublished':!![],'bPaused':![]}})]));const a=await handleEvaluationOperation({...MATCH_INPUT}),b=resultOf(a);expect(b['match_route'])['toBe']('remote_index'),expect(enumerateServices)['not']['toHaveBeenCalled'](),expect(vi['mocked'](matchServicesViaIndex)['mock']['calls'][0x0][0x1])['toMatchObject']({'q':'freelance\x20logo\x20design','location':'Shanghai','budgetWei':'100','capabilities':['has_wip_verification']}),expect(b['matches'])['toHaveLength'](0x2),expect(b['total_enumerated'])['toBe'](0x4);const c=b['matches']['find'](e=>e['service']['object']==='0xsvc1');expect(c['server_match'])['toMatchObject']({'policy_version':'public-baseline-1','total':87.5,'channels':['bm25','structured']}),expect(c['server_match']['unknown_rules'])['toEqual'](['trust:\x20cold-start\x20prior\x20withheld']),expect(c['result']['breakdown']['some'](e=>e['rule_id']==='capabilities'))['toBe'](!![]);const d=b['matches']['find'](e=>e['service']['object']==='0xsvc2');expect(d['service']['description'])['toBe']('mural\x20painting'),expect(d['server_match'])['toBeDefined'](),expect(b['coverage']['mode'])['toBe']('known_objects');}),it('auto\x20mode\x20degrades\x20to\x20legacy\x20enumeration\x20with\x20honest\x20coverage',async()=>{process['env']['WOWOK_DATA_SOURCE']='auto',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchServicesViaIndex)['mockRejectedValueOnce'](Object['assign'](new Error('Remote\x20index\x20returned\x20HTTP\x20503'),{'code':'INDEX_HTTP_ERROR'})),vi['mocked'](enumerateServices)['mockResolvedValueOnce'](legacyAnswer());const a=await handleEvaluationOperation({...MATCH_INPUT}),b=resultOf(a);expect(b['match_route'])['toBe']('legacy_enumeration'),expect(enumerateServices)['toHaveBeenCalledTimes'](0x1),expect(b['coverage']['degraded_reasons'])['toContain']('MATCH_INDEX_FALLBACK'),expect(b['coverage']['degraded_reasons'])['toContain']('INDEX_HTTP_ERROR'),expect(b['matches'])['toHaveLength'](0x1),expect(b['matches'][0x0]['server_match'])['toBeUndefined']();}),it('strict\x20remote\x20mode\x20surfaces\x20the\x20index\x20failure',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchServicesViaIndex)['mockRejectedValueOnce'](Object['assign'](new Error('Remote\x20index\x20request\x20failed'),{'code':'INDEX_UNAVAILABLE'})),await expect(handleEvaluationOperation({...MATCH_INPUT}))['rejects']['toThrow'](/Remote index request failed/),expect(enumerateServices)['not']['toHaveBeenCalled']();}),it('filters\x20the\x20match\x20API\x20cannot\x20express\x20keep\x20the\x20legacy\x20route',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](enumerateServices)['mockResolvedValueOnce'](legacyAnswer());const a=await handleEvaluationOperation({...MATCH_INPUT,'coin_type':'0x2::wow::WOW'}),b=resultOf(a);expect(b['match_route'])['toBe']('legacy_enumeration'),expect(matchServicesViaIndex)['not']['toHaveBeenCalled'](),expect(enumerateServices)['toHaveBeenCalledTimes'](0x1);});}),describe('evaluation_operation\x20match_discover\x20private\x20policy\x20DSL\x20(K5-11\x20R4)',()=>{beforeEach(()=>{vi['mocked'](enumerateServices)['mockReset'](),vi['mocked'](matchServicesViaIndex)['mockReset']();}),afterEach(()=>{delete process['env']['WOWOK_DATA_SOURCE'],delete process['env']['WOWOK_INDEX_URL'];});function a(){return{'services':[{'object':'0xgood','name':'Logo\x20design','location':'Shanghai','json':{'description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'fields':{'name':'logo','price':'100','wip_hash':'abc'}}],'arbitrations':['0xarb1'],'owner':'0xownerA','bPublished':!![],'bPaused':![]}},{'object':'0xpaused','name':'Paused\x20shop','location':'Shanghai','json':{'description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'fields':{'name':'logo','price':'100'}}],'owner':'0xownerB','bPublished':!![],'bPaused':!![]}}],'total_enumerated':0x2,'has_more':![],'coverage':{'mode':'event_window','complete':![],'truncated':![],'total_enumerated':0x2,'chain_id':'chain_test','degraded_reasons':['EVENT_BACKED_ENUMERATION']}};}it('preset\x20gate\x20drops\x20the\x20paused\x20candidate\x20and\x20reports\x20it\x20in\x20policy_effect',async()=>{vi['mocked'](enumerateServices)['mockResolvedValueOnce'](a());const b=await handleEvaluationOperation({'action':'match_discover','description':'freelance\x20logo\x20design','location':'Shanghai','sensitivity':'strict','context_network':'testnet','match_policy':'trust_first'}),c=resultOf(b);expect(c['matches']['map'](d=>d['service']['object']))['toEqual'](['0xgood']),expect(c['policy_effect']['policy_id'])['toBe']('trust_first'),expect(c['policy_effect']['privacy'])['toContain']('never\x20leave\x20this\x20device'),expect(c['policy_effect']['dropped']['some'](e=>e['object']==='0xpaused'))['toBe'](!![]),expect(c['policy_effect']['weights_applied']['trust'])['toBe'](0x1e),expect(typeof c['policy_effect']['policy_hash'])['toBe']('string');}),it('a\x20weight-only\x20policy\x20re-anchors\x20the\x20trust\x20dimension\x20(weight_source=override)',async()=>{vi['mocked'](enumerateServices)['mockResolvedValueOnce'](a());const b=await handleEvaluationOperation({'action':'match_discover','description':'freelance\x20logo\x20design','location':'Shanghai','sensitivity':'strict','context_network':'testnet','match_policy':{'policy_id':'custom','weights':{'trust':0x2d}}}),c=resultOf(b),d=c['matches'][0x0]['result']['breakdown']['find'](e=>e['rule_id']==='trust');expect(d['weight'])['toBe'](0x2d),expect(d['weight_source'])['toBe']('override'),expect(c['policy_effect']['weights_applied'])['toEqual']({'trust':0x2d});}),it('the\x20private\x20policy\x20never\x20reaches\x20the\x20remote\x20match\x20request',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchServicesViaIndex)['mockResolvedValueOnce'](remotePage([remoteCandidate('0xsvc1')])),await handleEvaluationOperation({...MATCH_INPUT,'match_policy':'trust_first'});const b=vi['mocked'](matchServicesViaIndex)['mock']['calls'][0x0][0x1];expect(b['match_policy'])['toBeUndefined'](),expect(b['policy'])['toBeUndefined'](),expect(JSON['stringify'](b))['not']['toContain']('trust_first');}),it('unknown\x20preset\x20id\x20throws\x20with\x20the\x20available\x20list',async()=>{await expect(handleEvaluationOperation({...MATCH_INPUT,'match_policy':'does_not_exist'}))['rejects']['toThrow'](/unknown match_policy preset/);}),it('a\x20supply_to_demand\x20policy\x20is\x20rejected\x20by\x20match_discover',async()=>{await expect(handleEvaluationOperation({...MATCH_INPUT,'match_policy':'supplier_hunting'}))['rejects']['toThrow'](/direction/);});}),describe('evaluation_operation\x20demand_present\x20private\x20policy\x20(K5-11\x20R4-W2)',()=>{const a={'id':'0xsvc1','kind':'service','industry':'freelance','region':{'mode':'physical','city':'Shanghai','raw':'Shanghai'},'keywords':['design'],'capabilities':{'has_arbitration':!![],'has_refund_path':!![],'has_milestone_nodes':![],'has_compensation_fund':![],'has_wip_verification':!![],'has_messenger':!![],'has_buy_guard':![],'has_dynamic_pricing':![],'is_published':!![],'is_paused':![]}};function b(){return{'demands':[{'object':'0xdesign','description':'need\x20a\x20freelance\x20logo\x20redesign\x20for\x20a\x20coffee\x20brand','location':'Shanghai','rewards':['0xr1','0xr2'],'guards':[],'presenters_count':0x0,'um':'0xum1','permission':'0xperm1'},{'object':'0xcleaning','description':'deep\x20cleaning\x20for\x20a\x203-bedroom\x20apartment','location':'Beijing','rewards':['0xr3'],'guards':[{'guard':'0xg'}],'presenters_count':0x2,'um':null,'permission':'0xperm2'}],'total_enumerated':0x2,'has_more':![],'coverage':{'mode':'event_window','complete':![],'truncated':![],'total_enumerated':0x2,'chain_id':'chain_test','degraded_reasons':['EVENT_BACKED_ENUMERATION']}};}beforeEach(()=>{vi['mocked'](enumerateDemands)['mockReset'](),vi['mocked'](matchServicesViaIndex)['mockReset']();}),it('supply_to_demand\x20policy\x20gates\x20demands\x20and\x20reports\x20the\x20effect',async()=>{vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](b());const c=await handleEvaluationOperation({'action':'demand_present','service_cap':a,'context_network':'testnet','match_policy':{'policy_id':'pick-design','direction':'supply_to_demand','gates':[{'dim':'text','op':'must_contain','value':'logo'},{'dim':'messenger','op':'eq','value':!![]}]}}),d=resultOf(c);expect(d['matches']['map'](e=>e['demand']['object']))['toEqual'](['0xdesign']),expect(d['policy_effect']['policy_id'])['toBe']('pick-design'),expect(d['policy_effect']['direction'])['toBe']('supply_to_demand'),expect(d['policy_effect']['dropped']['some'](e=>e['object']==='0xcleaning'))['toBe'](!![]),expect(d['policy_effect']['privacy'])['toContain']('never\x20leave\x20this\x20device'),expect(d['matches'][0x0]['next'])['toBeDefined'](),expect(matchServicesViaIndex)['not']['toHaveBeenCalled']();}),it('preset\x20supplier_hunting\x20drives\x20demand_present\x20end-to-end',async()=>{vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](b());const c=await handleEvaluationOperation({'action':'demand_present','service_cap':a,'context_network':'testnet','match_policy':'supplier_hunting'}),d=resultOf(c);expect(d['policy_effect']['policy_id'])['toBe']('supplier_hunting'),expect(d['matches'])['toHaveLength'](0x2);}),it('a\x20demand_to_supply\x20policy\x20is\x20rejected\x20by\x20demand_present',async()=>{await expect(handleEvaluationOperation({'action':'demand_present','service_cap':a,'context_network':'testnet','match_policy':'trust_first'}))['rejects']['toThrow'](/direction/),expect(enumerateDemands)['not']['toHaveBeenCalled']();}),it('weights\x20re-anchor\x20the\x20demand_match\x20scoring\x20dims\x20on\x20the\x20supply-to-demand\x20path',async()=>{vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](b());const c=await handleEvaluationOperation({'action':'demand_present','service_cap':a,'context_network':'testnet','match_policy':{'policy_id':'custom','direction':'supply_to_demand','weights':{'capabilities':0x32}}}),d=resultOf(c),e=d['matches'][0x0]['result']['breakdown']['find'](f=>f['rule_id']==='capabilities');expect(e['weight'])['toBe'](0x32),expect(e['weight_source'])['toBe']('override'),expect(d['policy_effect']['weights_applied'])['toEqual']({'capabilities':0x32});});}),describe('evaluation_operation\x20discover_demands\x20policy\x20gates\x20(K5-11\x20R4-W2)',()=>{function a(){return{'demands':[{'object':'0xdesign','description':'need\x20a\x20freelance\x20logo\x20redesign','location':'Shanghai','rewards':['0xr1'],'guards':[],'presenters_count':0x0,'um':'0xum1','permission':'0xperm1'},{'object':'0xcleaning','description':'deep\x20cleaning\x20for\x20a\x203-bedroom\x20apartment','location':'Beijing','rewards':[],'guards':[],'presenters_count':0x0,'um':null,'permission':'0xperm2'}],'total_enumerated':0x2,'has_more':![],'coverage':{'mode':'event_window','complete':![],'truncated':![],'total_enumerated':0x2,'chain_id':'chain_test','degraded_reasons':['EVENT_BACKED_ENUMERATION']}};}beforeEach(()=>{vi['mocked'](enumerateDemands)['mockReset']();}),it('gates\x20filter\x20the\x20enumerated\x20set;\x20weights/rerank\x20are\x20reported\x20not\x20applicable',async()=>{vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](a());const b=await handleEvaluationOperation({'action':'discover_demands','context_network':'testnet','match_policy':{'policy_id':'pick-design','direction':'supply_to_demand','gates':[{'dim':'text','op':'must_contain','value':'logo'}],'weights':{'trust':0x1e},'rerank':{'diversity':{'by':'owner','max_per_group':0x1}}}}),c=resultOf(b);expect(c['demands']['map'](e=>e['object']))['toEqual'](['0xdesign']),expect(c['policy_effect']['policy_id'])['toBe']('pick-design'),expect(c['policy_effect']['ignored']['join']('|'))['toContain']('weights\x20not\x20applicable'),expect(c['policy_effect']['ignored']['join']('|'))['toContain']('rerank\x20not\x20applicable'),expect(c['policy_effect']['weights_applied'])['toEqual']({});}),it('violated\x20reward\x20gates\x20eliminate\x20demands\x20from\x20the\x20enumerated\x20set',async()=>{vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](a());const b=await handleEvaluationOperation({'action':'discover_demands','context_network':'testnet','match_policy':{'policy_id':'multi-reward','direction':'supply_to_demand','gates':[{'dim':'reward','op':'gte','value':0x2}]}}),c=resultOf(b);expect(c['demands'])['toHaveLength'](0x0),expect(c['policy_effect']['dropped'])['toHaveLength'](0x2);});});
1
+ import{afterEach,beforeEach,describe,expect,it,vi}from'vitest';import{handleEvaluationOperation}from'./evaluation.js';import{ENTRYPOINT}from'@wowok/wowok';import{enumerateDemands,enumerateServices,indexUrlFor,matchDemandsViaIndex,matchServicesViaIndex,weiToWowDecimal}from'../../knowledge/jsonrpc-enum.js';import{enrichFromDescription}from'../../evaluation/extract.js';vi['mock']('../../knowledge/jsonrpc-enum.js',async a=>({...await a(),'enumerateServices':vi['fn'](),'enumerateDemands':vi['fn'](),'matchServicesViaIndex':vi['fn'](),'matchDemandsViaIndex':vi['fn']()}));function resultOf(a){return a['structuredContent']['result'];}const demandCap={'id':'0xdemand1','kind':'demand','industry':'freelance','region':{'mode':'physical','city':'Shanghai','raw':'Shanghai'},'keywords':['design'],'capabilities':{'has_arbitration':![],'has_refund_path':![],'has_milestone_nodes':![],'has_compensation_fund':![],'has_wip_verification':![],'has_messenger':![],'has_buy_guard':![],'has_dynamic_pricing':![],'is_published':!![],'is_paused':![]}},service={'object':'0xsvc1','description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'price':'100','wip_hash':'abc'}],'bPublished':!![],'bPaused':![]};describe('evaluation_operation\x20demand_match\x20presenter_history\x20(P2-2)',()=>{it('acceptance\x20rule\x20scores\x20the\x20rated\x20history\x20in\x20the\x20breakdown',async()=>{const a=await handleEvaluationOperation({'action':'demand_match','demand_cap':demandCap,'services':[service],'presenter_history':[{'acceptance_score':0x50},{'acceptance_score':0x5a}]}),c=resultOf(a);expect(c['action'])['toBe']('demand_match');const d=c['matches'][0x0]['result']['breakdown']['find'](e=>e['rule_id']==='acceptance');expect(d)['toBeDefined'](),expect(d['score'])['toBe'](0x55);}),it('omitted\x20history\x20→\x20acceptance\x20stays\x20neutral',async()=>{const a=await handleEvaluationOperation({'action':'demand_match','demand_cap':demandCap,'services':[service]}),c=resultOf(a)['matches'][0x0]['result']['breakdown']['find'](d=>d['rule_id']==='acceptance');expect(c)['toBeDefined'](),expect(c['score'])['toBe'](0x32),expect(c['reason'])['toContain']('neutral');}),it('schema\x20rejects\x20a\x20malformed\x20presenter_history\x20entry',async()=>{await expect(handleEvaluationOperation({'action':'demand_match','demand_cap':demandCap,'services':[service],'presenter_history':[{'acceptance_score':0x50,'bogus':!![]}]}))['rejects']['toThrow']();});}),describe('evaluation_operation\x20demand_match\x20order\x20bridge\x20(N-2\x20/\x2008\x20§7)',()=>{it('each\x20match\x20carries\x20the\x20service.order_new\x20transaction-formation\x20bridge',async()=>{const a=await handleEvaluationOperation({'action':'demand_match','demand_cap':demandCap,'services':[service]}),b=resultOf(a)['matches'][0x0];expect(b['order'])['toBeDefined'](),expect(b['order']['operation'])['toBe']('service.order_new'),expect(b['order']['operation_type'])['toBe']('service'),expect(b['order']['preconditions']['some'](c=>c['includes']('acceptance_score')))['toBe'](!![]),expect(b['order']['rationale'])['toContain']('0xsvc1'),expect(b['next']['operation'])['toBe']('demand.publish'),expect(b['next']['operation_type'])['toBe']('demand'),expect(b['next']['rationale'])['toContain']('service.order_new');});}),describe('evaluation_operation\x20match_discover\x20indexed\x20candidate\x20mapping',()=>{it('scores\x20wrapped\x20sales\x20fields\x20instead\x20of\x20replacing\x20them\x20with\x20zero\x20values',async()=>{vi['mocked'](enumerateServices)['mockResolvedValueOnce']({'services':[{'object':'0xsvc1','name':'Logo\x20design','location':'Shanghai','json':{'description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'fields':{'name':'logo','price':'100','wip_hash':'abc'}}],'bPublished':!![],'bPaused':![]}}],'total_enumerated':0x1,'has_more':![],'coverage':{'mode':'known_objects','complete':![],'truncated':![],'total_enumerated':0x1,'chain_id':'chain_test','degraded_reasons':[]}});const a=await handleEvaluationOperation({'action':'match_discover','description':'freelance\x20logo\x20design','location':'Shanghai','sensitivity':'strict','budget':'50','required_capabilities':['has_wip_verification'],'context_network':'testnet'}),b=resultOf(a)['matches'][0x0];expect(b['service']['sales'])['toEqual']([{'name':'logo','price':'100','wip_hash':'abc'}]),expect(b['result']['breakdown']['find'](c=>c['rule_id']==='price'))['toMatchObject']({'score':0x0,'reason':'over\x20budget'}),expect(b['result']['breakdown']['find'](c=>c['rule_id']==='capabilities'))['toMatchObject']({'score':0x64,'matched':['has_wip_verification']});});}),describe('evaluation_operation\x20evidence_review\x20list\x20mode\x20(P2-3)',()=>{it('items\x20mode\x20→\x20structured\x20usable/manual/rejected\x20+\x20proof\x20candidates',async()=>{const a=await handleEvaluationOperation({'action':'evidence_review','items':[{'id':'chat.wts','kind':'signature_photo','hash_committed':!![],'digital_check_passed':!![],'proof_ref':'0xproof1'},{'id':'waybill.jpg','kind':'delivery_proof','hash_committed':!![]},{'id':'voice.mp3','kind':'voice_recording','hash_committed':![]}]}),b=resultOf(a);expect(b['action'])['toBe']('evidence_review'),expect(b['list']['items'])['toHaveLength'](0x3),expect(b['list']['usable'])['toHaveLength'](0x1),expect(b['list']['manual'])['toHaveLength'](0x1),expect(b['list']['rejected'])['toHaveLength'](0x1),expect(b['list']['proof_candidates'])['toHaveLength'](0x1),expect(b['list']['proof_candidates'][0x0]['proof_ref'])['toBe']('0xproof1'),expect(b['list']['dispute_hint'])['toContain']('1\x20Proof\x20reference\x20candidate(s)\x20ready');}),it('single-item\x20mode\x20still\x20works\x20(backwards\x20compatible)',async()=>{const a=await handleEvaluationOperation({'action':'evidence_review','kind':'signature_photo','hash_committed':!![],'digital_check_passed':!![]});expect(resultOf(a)['review']['status'])['toBe']('auto_pass');}),it('schema\x20refinement:\x20neither\x20items\x20nor\x20kind+hash_committed\x20→\x20error',async()=>{await expect(handleEvaluationOperation({'action':'evidence_review'}))['rejects']['toThrow']();});});function remoteCandidate(a,b={}){return{'objectId':a,'verifiedKind':'Service','objectVersion':'3','facetVersion':'facets-1','channels':['bm25','structured'],'rrf':0.032786885246,'publicFeatures':{'industry':'freelance','industryConfidence':0.7,'location':'Shanghai','priceMin':'100','priceMax':'100','capabilities':['has_wip_verification'],'published':!![],'paused':![],'keywords':['design']},'serverEvaluation':{'policyVersion':'public-baseline-1','total':87.5,'breakdown':[{'dimension':'text','weight':0x1e,'score':0x64}],'unknownRules':['trust:\x20cold-start\x20prior\x20withheld'],'redFlags':[]},'payloadJson':{'description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'fields':{'name':'logo','price':'100','wip_hash':'abc'}}],'bPublished':!![],'bPaused':![]},...b};}function remotePage(a){return{'policyVersion':'public-baseline-1','candidates':a,'recall':{'liveSet':a['length']+0x2,'gated':a['length'],'structured':a['length'],'bm25':a['length'],'merged':a['length'],'channelsActive':['structured','bm25']},'truncated':![],'coverage':{'mode':'known_objects','complete':![],'truncated':![],'total_enumerated':a['length'],'chain_id':'chain_test','degraded_reasons':[]}};}function legacyAnswer(){return{'services':[{'object':'0xsvc1','name':'Logo\x20design','location':'Shanghai','json':{'description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'fields':{'name':'logo','price':'100','wip_hash':'abc'}}],'bPublished':!![],'bPaused':![]}}],'total_enumerated':0x1,'has_more':![],'coverage':{'mode':'event_window','complete':![],'truncated':![],'total_enumerated':0x1,'chain_id':'chain_test','degraded_reasons':['EVENT_BACKED_ENUMERATION']}};}const MATCH_INPUT={'action':'match_discover','description':'freelance\x20logo\x20design','location':'Shanghai','sensitivity':'strict','budget':'100','required_capabilities':['has_wip_verification'],'context_network':'testnet'};describe('evaluation_operation\x20match_discover\x20remote\x20index\x20route\x20(K5-11\x20R3)',()=>{beforeEach(()=>{vi['mocked'](enumerateServices)['mockReset'](),vi['mocked'](matchServicesViaIndex)['mockReset']();}),afterEach(()=>{delete process['env']['WOWOK_DATA_SOURCE'],delete process['env']['WOWOK_INDEX_URL'];}),it('converts\x20wei\x20budgets\x20to\x20WOW\x20decimals\x20for\x20the\x20match\x20API',()=>{expect(weiToWowDecimal('0'))['toBe']('0'),expect(weiToWowDecimal('6000000000'))['toBe']('6'),expect(weiToWowDecimal('7500000000'))['toBe']('7.5'),expect(weiToWowDecimal('123456789'))['toBe']('0.123456789'),expect(weiToWowDecimal('1000000000000'))['toBe']('1000'),expect(()=>weiToWowDecimal('12.5'))['toThrow']();}),it('one-shot\x20remote\x20match:\x20no\x20enumeration,\x20dual\x20breakdown,\x20private\x20re-rank',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchServicesViaIndex)['mockResolvedValueOnce'](remotePage([remoteCandidate('0xsvc1'),remoteCandidate('0xsvc2',{'payloadJson':{'description':'mural\x20painting','location':'Shanghai','sales':[{'fields':{'name':'mural','price':'90'}}],'bPublished':!![],'bPaused':![]}})]));const a=await handleEvaluationOperation({...MATCH_INPUT}),b=resultOf(a);expect(b['match_route'])['toBe']('remote_index'),expect(enumerateServices)['not']['toHaveBeenCalled'](),expect(vi['mocked'](matchServicesViaIndex)['mock']['calls'][0x0][0x1])['toMatchObject']({'q':'freelance\x20logo\x20design','location':'Shanghai','budgetWei':'100','capabilities':['has_wip_verification'],'industry':undefined}),expect(b['matches'])['toHaveLength'](0x2),expect(b['total_enumerated'])['toBe'](0x4);const c=b['matches']['find'](e=>e['service']['object']==='0xsvc1');expect(c['server_match'])['toMatchObject']({'policy_version':'public-baseline-1','total':87.5,'channels':['bm25','structured']}),expect(c['server_match']['unknown_rules'])['toEqual'](['trust:\x20cold-start\x20prior\x20withheld']),expect(c['result']['breakdown']['some'](e=>e['rule_id']==='capabilities'))['toBe'](!![]);const d=b['matches']['find'](e=>e['service']['object']==='0xsvc2');expect(d['service']['description'])['toBe']('mural\x20painting'),expect(d['server_match'])['toBeDefined'](),expect(b['coverage']['mode'])['toBe']('known_objects');}),it('auto\x20mode\x20degrades\x20to\x20legacy\x20enumeration\x20with\x20honest\x20coverage',async()=>{process['env']['WOWOK_DATA_SOURCE']='auto',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchServicesViaIndex)['mockRejectedValueOnce'](Object['assign'](new Error('Remote\x20index\x20returned\x20HTTP\x20503'),{'code':'INDEX_HTTP_ERROR'})),vi['mocked'](enumerateServices)['mockResolvedValueOnce'](legacyAnswer());const a=await handleEvaluationOperation({...MATCH_INPUT}),b=resultOf(a);expect(b['match_route'])['toBe']('legacy_enumeration'),expect(enumerateServices)['toHaveBeenCalledTimes'](0x1),expect(b['coverage']['degraded_reasons'])['toContain']('MATCH_INDEX_FALLBACK'),expect(b['coverage']['degraded_reasons'])['toContain']('INDEX_HTTP_ERROR'),expect(b['matches'])['toHaveLength'](0x1),expect(b['matches'][0x0]['server_match'])['toBeUndefined']();}),it('strict\x20remote\x20mode\x20surfaces\x20the\x20index\x20failure',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchServicesViaIndex)['mockRejectedValueOnce'](Object['assign'](new Error('Remote\x20index\x20request\x20failed'),{'code':'INDEX_UNAVAILABLE'})),await expect(handleEvaluationOperation({...MATCH_INPUT}))['rejects']['toThrow'](/Remote index request failed/),expect(enumerateServices)['not']['toHaveBeenCalled']();}),it('never\x20uploads\x20the\x20no-signal\x20general\x20industry\x20(the\x20facet\x20stores\x20it\x20as\x20null)',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchServicesViaIndex)['mockResolvedValueOnce'](remotePage([remoteCandidate('0xsvc1')])),expect(enrichFromDescription('\x20\x20\x20')['industry'])['toBe']('general'),await handleEvaluationOperation({...MATCH_INPUT,'description':'\x20\x20\x20'}),expect(vi['mocked'](matchServicesViaIndex)['mock']['calls'][0x0][0x1]?.['industry'])['toBeUndefined']();}),it('filters\x20the\x20match\x20API\x20cannot\x20express\x20keep\x20the\x20legacy\x20route',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](enumerateServices)['mockResolvedValueOnce'](legacyAnswer());const a=await handleEvaluationOperation({...MATCH_INPUT,'coin_type':'0x2::wow::WOW'}),b=resultOf(a);expect(b['match_route'])['toBe']('legacy_enumeration'),expect(matchServicesViaIndex)['not']['toHaveBeenCalled'](),expect(enumerateServices)['toHaveBeenCalledTimes'](0x1);});}),describe('evaluation_operation\x20match_discover\x20private\x20policy\x20DSL\x20(K5-11\x20R4)',()=>{beforeEach(()=>{process['env']['WOWOK_DATA_SOURCE']='legacy',vi['mocked'](enumerateServices)['mockReset'](),vi['mocked'](matchServicesViaIndex)['mockReset']();}),afterEach(()=>{delete process['env']['WOWOK_DATA_SOURCE'],delete process['env']['WOWOK_INDEX_URL'];});function a(){return{'services':[{'object':'0xgood','name':'Logo\x20design','location':'Shanghai','json':{'description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'fields':{'name':'logo','price':'100','wip_hash':'abc'}}],'arbitrations':['0xarb1'],'owner':'0xownerA','bPublished':!![],'bPaused':![]}},{'object':'0xpaused','name':'Paused\x20shop','location':'Shanghai','json':{'description':'freelance\x20logo\x20design','location':'Shanghai','sales':[{'fields':{'name':'logo','price':'100'}}],'owner':'0xownerB','bPublished':!![],'bPaused':!![]}}],'total_enumerated':0x2,'has_more':![],'coverage':{'mode':'event_window','complete':![],'truncated':![],'total_enumerated':0x2,'chain_id':'chain_test','degraded_reasons':['EVENT_BACKED_ENUMERATION']}};}it('preset\x20gate\x20drops\x20the\x20paused\x20candidate\x20and\x20reports\x20it\x20in\x20policy_effect',async()=>{vi['mocked'](enumerateServices)['mockResolvedValueOnce'](a());const b=await handleEvaluationOperation({'action':'match_discover','description':'freelance\x20logo\x20design','location':'Shanghai','sensitivity':'strict','context_network':'testnet','match_policy':'trust_first'}),c=resultOf(b);expect(c['matches']['map'](d=>d['service']['object']))['toEqual'](['0xgood']),expect(c['policy_effect']['policy_id'])['toBe']('trust_first'),expect(c['policy_effect']['privacy'])['toContain']('never\x20leave\x20this\x20device'),expect(c['policy_effect']['dropped']['some'](e=>e['object']==='0xpaused'))['toBe'](!![]),expect(c['policy_effect']['weights_applied']['trust'])['toBe'](0x1e),expect(typeof c['policy_effect']['policy_hash'])['toBe']('string');}),it('a\x20weight-only\x20policy\x20re-anchors\x20the\x20trust\x20dimension\x20(weight_source=override)',async()=>{vi['mocked'](enumerateServices)['mockResolvedValueOnce'](a());const b=await handleEvaluationOperation({'action':'match_discover','description':'freelance\x20logo\x20design','location':'Shanghai','sensitivity':'strict','context_network':'testnet','match_policy':{'policy_id':'custom','weights':{'trust':0x2d}}}),c=resultOf(b),d=c['matches'][0x0]['result']['breakdown']['find'](e=>e['rule_id']==='trust');expect(d['weight'])['toBe'](0x2d),expect(d['weight_source'])['toBe']('override'),expect(c['policy_effect']['weights_applied'])['toEqual']({'trust':0x2d});}),it('the\x20private\x20policy\x20never\x20reaches\x20the\x20remote\x20match\x20request',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchServicesViaIndex)['mockResolvedValueOnce'](remotePage([remoteCandidate('0xsvc1')])),await handleEvaluationOperation({...MATCH_INPUT,'match_policy':'trust_first'});const b=vi['mocked'](matchServicesViaIndex)['mock']['calls'][0x0][0x1];expect(b['match_policy'])['toBeUndefined'](),expect(b['policy'])['toBeUndefined'](),expect(JSON['stringify'](b))['not']['toContain']('trust_first');}),it('unknown\x20preset\x20id\x20throws\x20with\x20the\x20available\x20list',async()=>{await expect(handleEvaluationOperation({...MATCH_INPUT,'match_policy':'does_not_exist'}))['rejects']['toThrow'](/unknown match_policy preset/);}),it('a\x20supply_to_demand\x20policy\x20is\x20rejected\x20by\x20match_discover',async()=>{await expect(handleEvaluationOperation({...MATCH_INPUT,'match_policy':'supplier_hunting'}))['rejects']['toThrow'](/direction/);});}),describe('evaluation_operation\x20demand_present\x20private\x20policy\x20(K5-11\x20R4-W2)',()=>{const a={'id':'0xsvc1','kind':'service','industry':'freelance','region':{'mode':'physical','city':'Shanghai','raw':'Shanghai'},'keywords':['design'],'capabilities':{'has_arbitration':!![],'has_refund_path':!![],'has_milestone_nodes':![],'has_compensation_fund':![],'has_wip_verification':!![],'has_messenger':!![],'has_buy_guard':![],'has_dynamic_pricing':![],'is_published':!![],'is_paused':![]}};function b(){return{'demands':[{'object':'0xdesign','description':'need\x20a\x20freelance\x20logo\x20redesign\x20for\x20a\x20coffee\x20brand','location':'Shanghai','rewards':['0xr1','0xr2'],'guards':[],'presenters_count':0x0,'um':'0xum1','permission':'0xperm1'},{'object':'0xcleaning','description':'deep\x20cleaning\x20for\x20a\x203-bedroom\x20apartment','location':'Beijing','rewards':['0xr3'],'guards':[{'guard':'0xg'}],'presenters_count':0x2,'um':null,'permission':'0xperm2'}],'total_enumerated':0x2,'has_more':![],'coverage':{'mode':'event_window','complete':![],'truncated':![],'total_enumerated':0x2,'chain_id':'chain_test','degraded_reasons':['EVENT_BACKED_ENUMERATION']}};}beforeEach(()=>{process['env']['WOWOK_DATA_SOURCE']='legacy',vi['mocked'](enumerateDemands)['mockReset'](),vi['mocked'](matchServicesViaIndex)['mockReset'](),vi['mocked'](matchDemandsViaIndex)['mockReset']();}),it('supply_to_demand\x20policy\x20gates\x20demands\x20and\x20reports\x20the\x20effect',async()=>{vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](b());const c=await handleEvaluationOperation({'action':'demand_present','service_cap':a,'context_network':'testnet','match_policy':{'policy_id':'pick-design','direction':'supply_to_demand','gates':[{'dim':'text','op':'must_contain','value':'logo'},{'dim':'messenger','op':'eq','value':!![]}]}}),d=resultOf(c);expect(d['matches']['map'](e=>e['demand']['object']))['toEqual'](['0xdesign']),expect(d['policy_effect']['policy_id'])['toBe']('pick-design'),expect(d['policy_effect']['direction'])['toBe']('supply_to_demand'),expect(d['policy_effect']['dropped']['some'](e=>e['object']==='0xcleaning'))['toBe'](!![]),expect(d['policy_effect']['privacy'])['toContain']('never\x20leave\x20this\x20device'),expect(d['matches'][0x0]['next'])['toBeDefined'](),expect(matchServicesViaIndex)['not']['toHaveBeenCalled']();}),it('preset\x20supplier_hunting\x20drives\x20demand_present\x20end-to-end',async()=>{vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](b());const c=await handleEvaluationOperation({'action':'demand_present','service_cap':a,'context_network':'testnet','match_policy':'supplier_hunting'}),d=resultOf(c);expect(d['policy_effect']['policy_id'])['toBe']('supplier_hunting'),expect(d['matches'])['toHaveLength'](0x2);}),it('a\x20demand_to_supply\x20policy\x20is\x20rejected\x20by\x20demand_present',async()=>{await expect(handleEvaluationOperation({'action':'demand_present','service_cap':a,'context_network':'testnet','match_policy':'trust_first'}))['rejects']['toThrow'](/direction/),expect(enumerateDemands)['not']['toHaveBeenCalled']();}),it('weights\x20re-anchor\x20the\x20demand_match\x20scoring\x20dims\x20on\x20the\x20supply-to-demand\x20path',async()=>{vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](b());const c=await handleEvaluationOperation({'action':'demand_present','service_cap':a,'context_network':'testnet','match_policy':{'policy_id':'custom','direction':'supply_to_demand','weights':{'capabilities':0x32}}}),d=resultOf(c),e=d['matches'][0x0]['result']['breakdown']['find'](f=>f['rule_id']==='capabilities');expect(e['weight'])['toBe'](0x32),expect(e['weight_source'])['toBe']('override'),expect(d['policy_effect']['weights_applied'])['toEqual']({'capabilities':0x32});});}),describe('evaluation_operation\x20discover_demands\x20policy\x20gates\x20(K5-11\x20R4-W2)',()=>{function a(){return{'demands':[{'object':'0xdesign','description':'need\x20a\x20freelance\x20logo\x20redesign','location':'Shanghai','rewards':['0xr1'],'guards':[],'presenters_count':0x0,'um':'0xum1','permission':'0xperm1'},{'object':'0xcleaning','description':'deep\x20cleaning\x20for\x20a\x203-bedroom\x20apartment','location':'Beijing','rewards':[],'guards':[],'presenters_count':0x0,'um':null,'permission':'0xperm2'}],'total_enumerated':0x2,'has_more':![],'coverage':{'mode':'event_window','complete':![],'truncated':![],'total_enumerated':0x2,'chain_id':'chain_test','degraded_reasons':['EVENT_BACKED_ENUMERATION']}};}beforeEach(()=>{process['env']['WOWOK_DATA_SOURCE']='legacy',vi['mocked'](enumerateDemands)['mockReset'](),vi['mocked'](matchDemandsViaIndex)['mockReset']();}),it('gates\x20filter\x20the\x20enumerated\x20set;\x20weights/rerank\x20are\x20reported\x20not\x20applicable',async()=>{vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](a());const b=await handleEvaluationOperation({'action':'discover_demands','context_network':'testnet','match_policy':{'policy_id':'pick-design','direction':'supply_to_demand','gates':[{'dim':'text','op':'must_contain','value':'logo'}],'weights':{'trust':0x1e},'rerank':{'diversity':{'by':'owner','max_per_group':0x1}}}}),c=resultOf(b);expect(c['demands']['map'](e=>e['object']))['toEqual'](['0xdesign']),expect(c['policy_effect']['policy_id'])['toBe']('pick-design'),expect(c['policy_effect']['ignored']['join']('|'))['toContain']('weights\x20not\x20applicable'),expect(c['policy_effect']['ignored']['join']('|'))['toContain']('rerank\x20not\x20applicable'),expect(c['policy_effect']['weights_applied'])['toEqual']({});}),it('violated\x20reward\x20gates\x20eliminate\x20demands\x20from\x20the\x20enumerated\x20set',async()=>{vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](a());const b=await handleEvaluationOperation({'action':'discover_demands','context_network':'testnet','match_policy':{'policy_id':'multi-reward','direction':'supply_to_demand','gates':[{'dim':'reward','op':'gte','value':0x2}]}}),c=resultOf(b);expect(c['demands'])['toHaveLength'](0x0),expect(c['policy_effect']['dropped'])['toHaveLength'](0x2);});});const SUPPLY_CAP={'id':'0xsvc1','kind':'service','industry':'freelance','region':{'mode':'physical','city':'Shanghai','raw':'Shanghai'},'keywords':['design'],'capabilities':{'has_arbitration':!![],'has_refund_path':!![],'has_milestone_nodes':![],'has_compensation_fund':![],'has_wip_verification':!![],'has_messenger':!![],'has_buy_guard':![],'has_dynamic_pricing':![],'is_published':!![],'is_paused':![]}};function demandPair(){return[{'object':'0xdesign','type':'Demand','description':'need\x20a\x20freelance\x20logo\x20redesign','location':'Shanghai','rewards':['0xr1'],'guards':[],'presenters_count':0x0,'um':'0xum1','permission':'0xperm1'},{'object':'0xcleaning','type':'Demand','description':'deep\x20cleaning\x20for\x20a\x203-bedroom\x20apartment','location':'Beijing','rewards':[],'guards':[{'guard':'0xg','service_identifier':null}],'presenters_count':0x2,'um':null,'permission':'0xperm2'}];}function remoteDemandAnswer(){return{'demands':demandPair(),'total_enumerated':0x6,'has_more':![],'coverage':{'mode':'known_objects','complete':![],'truncated':![],'total_enumerated':0x6,'chain_id':'chain_a','degraded_reasons':[]}};}function legacyDemandAnswer(){return{'demands':demandPair(),'total_enumerated':0x2,'has_more':![],'coverage':{'mode':'event_window','complete':![],'truncated':![],'total_enumerated':0x2,'chain_id':'chain_test','degraded_reasons':['EVENT_BACKED_ENUMERATION']}};}describe('evaluation_operation\x20demand\x20remote\x20index\x20route\x20(K5-10\x20§4.2)',()=>{beforeEach(()=>{vi['mocked'](enumerateDemands)['mockReset'](),vi['mocked'](matchDemandsViaIndex)['mockReset']();}),afterEach(()=>{delete process['env']['WOWOK_DATA_SOURCE'],delete process['env']['WOWOK_INDEX_URL'];}),it('discover_demands\x20recalls\x20server-side\x20instead\x20of\x20downloading\x20the\x20Demand\x20universe',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchDemandsViaIndex)['mockResolvedValueOnce'](remoteDemandAnswer());const a=await handleEvaluationOperation({'action':'discover_demands','location':'Shanghai','context_network':'testnet'}),b=resultOf(a);expect(b['match_route'])['toBe']('remote_index'),expect(enumerateDemands)['not']['toHaveBeenCalled'](),expect(vi['mocked'](matchDemandsViaIndex)['mock']['calls'][0x0][0x1])['toMatchObject']({'location':'Shanghai','limit':0x64,'recallLimit':0xc8}),expect(vi['mocked'](matchDemandsViaIndex)['mock']['calls'][0x0][0x1]?.['industry'])['toBeUndefined'](),expect(b['demands']['map'](c=>c['object']))['toEqual'](['0xdesign']),expect(b['total_enumerated'])['toBe'](0x6),expect(b['coverage']['mode'])['toBe']('known_objects');}),it('demand_present\x20uploads\x20the\x20service\x27s\x20own\x20industry\x20as\x20the\x20public\x20query\x20signal',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchDemandsViaIndex)['mockResolvedValueOnce'](remoteDemandAnswer());const a=await handleEvaluationOperation({'action':'demand_present','service_cap':SUPPLY_CAP,'context_network':'testnet'}),b=resultOf(a);expect(b['match_route'])['toBe']('remote_index'),expect(vi['mocked'](matchDemandsViaIndex)['mock']['calls'][0x0][0x1])['toMatchObject']({'industry':'freelance'}),expect(b['matches'][0x0]['result']['breakdown']['some'](c=>c['rule_id']==='capabilities'))['toBe'](!![]),expect(b['matches']['map'](c=>c['demand']['object']))['toEqual'](['0xdesign','0xcleaning']);}),it('never\x20uploads\x20the\x20no-signal\x20general\x20industry',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchDemandsViaIndex)['mockResolvedValueOnce'](remoteDemandAnswer()),await handleEvaluationOperation({'action':'demand_present','service_cap':{...SUPPLY_CAP,'industry':'general'},'context_network':'testnet'}),expect(vi['mocked'](matchDemandsViaIndex)['mock']['calls'][0x0][0x1]?.['industry'])['toBeUndefined']();}),it('keeps\x20the\x20private\x20policy\x20on\x20device:\x20the\x20demand\x20read\x20carries\x20no\x20policy\x20at\x20all',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchDemandsViaIndex)['mockResolvedValueOnce'](remoteDemandAnswer()),await handleEvaluationOperation({'action':'demand_present','service_cap':SUPPLY_CAP,'context_network':'testnet','match_policy':'supplier_hunting'});const a=vi['mocked'](matchDemandsViaIndex)['mock']['calls'][0x0][0x1];expect(a['match_policy'])['toBeUndefined'](),expect(a['policy'])['toBeUndefined'](),expect(JSON['stringify'](a))['not']['toContain']('supplier_hunting');}),it('an\x20owner-dimension\x20policy\x20keeps\x20the\x20enumeration\x20route\x20(owner\x20is\x20not\x20in\x20the\x20match\x20payload)',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](legacyDemandAnswer());const a=await handleEvaluationOperation({'action':'discover_demands','context_network':'testnet','match_policy':{'policy_id':'not-blacklisted','direction':'supply_to_demand','excludes':[{'dim':'blacklist','owners':['0xownerBad']}]}}),b=resultOf(a);expect(b['match_route'])['toBe']('legacy_enumeration'),expect(matchDemandsViaIndex)['not']['toHaveBeenCalled'](),expect(enumerateDemands)['toHaveBeenCalledTimes'](0x1);}),it('auto\x20mode\x20degrades\x20to\x20enumeration\x20with\x20an\x20honest\x20coverage\x20stamp',async()=>{process['env']['WOWOK_DATA_SOURCE']='auto',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchDemandsViaIndex)['mockRejectedValueOnce'](Object['assign'](new Error('Remote\x20index\x20returned\x20HTTP\x20503'),{'code':'INDEX_HTTP_ERROR'})),vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](legacyDemandAnswer());const a=await handleEvaluationOperation({'action':'discover_demands','context_network':'testnet'}),b=resultOf(a);expect(b['match_route'])['toBe']('legacy_enumeration'),expect(enumerateDemands)['toHaveBeenCalledTimes'](0x1),expect(b['coverage']['degraded_reasons'])['toContain']('MATCH_INDEX_FALLBACK'),expect(b['coverage']['degraded_reasons'])['toContain']('INDEX_HTTP_ERROR');}),it('strict\x20remote\x20mode\x20surfaces\x20the\x20index\x20failure\x20instead\x20of\x20substituting\x20events',async()=>{process['env']['WOWOK_DATA_SOURCE']='remote',process['env']['WOWOK_INDEX_URL']='http://index.test',vi['mocked'](matchDemandsViaIndex)['mockRejectedValueOnce'](Object['assign'](new Error('Remote\x20index\x20request\x20failed'),{'code':'INDEX_UNAVAILABLE'})),await expect(handleEvaluationOperation({'action':'discover_demands','context_network':'testnet'}))['rejects']['toThrow'](/Remote index request failed/),expect(enumerateDemands)['not']['toHaveBeenCalled']();}),it('product\x20default:\x20testnet\x20routes\x20remotely\x20with\x20no\x20configuration\x20at\x20all',async()=>{vi['mocked'](matchDemandsViaIndex)['mockResolvedValueOnce'](remoteDemandAnswer());const a=await handleEvaluationOperation({'action':'discover_demands','context_network':'testnet'});expect(resultOf(a)['match_route'])['toBe']('remote_index'),expect(enumerateDemands)['not']['toHaveBeenCalled'](),expect(indexUrlFor(ENTRYPOINT['Testnet']))['toBeTruthy']();}),it('product\x20default:\x20mainnet\x20keeps\x20the\x20enumeration\x20because\x20it\x20ships\x20no\x20index',async()=>{expect(indexUrlFor(ENTRYPOINT['Mainnet']))['toBeUndefined'](),vi['mocked'](enumerateDemands)['mockResolvedValueOnce'](legacyDemandAnswer());const a=await handleEvaluationOperation({'action':'discover_demands','context_network':'mainnet'}),b=resultOf(a);expect(b['match_route'])['toBe']('legacy_enumeration'),expect(matchDemandsViaIndex)['not']['toHaveBeenCalled'](),expect(b['coverage']['mode'])['toBe']('event_window');});});
@@ -1 +1 @@
1
- import{readdirSync,readFileSync,writeFileSync,existsSync,mkdirSync,statSync,cpSync,renameSync,rmSync}from'node:fs';import{join,relative,resolve,sep,dirname,basename}from'node:path';import{strictParse}from'../../schema/index.js';import{IndustryPackOperationInputSchema}from'../../schema/industry-pack/index.js';import{validateJudgmentFragment}from'../../config/judgment.js';import{scaffoldIndustryPack,listRegisteredPacks,getRegisteredPack,packKind,scanDefaultIndustryPacks,seedBuiltinIndustryTemplates,seedBuiltinStrategyManuals,ensureIndustryReadme,resolveIndustryPackDir,rescanPack,resolveDisputeRules,resolveComplianceRules,resolveSupplyRules,resolveIndustryRules,resolveIndustryPlaybook,diffIndustryPack,resetIndustryPath}from'../../extensions/index.js';import{getIndustryModeRegistry}from'../../extensions/registry.js';import{getBuiltinTemplate,listBuiltinTemplates}from'../../knowledge/builtin-templates.js';import{handleRecommendIndustry,handleListModes,handleDeriveUserMode,handleEvolveUserMode,handleRegisterUserMode,handleUnregisterUserMode,handleRegisterCustomMetric,handleUnregisterCustomMetric,handleRegisterCustomConstraint,handleUnregisterCustomConstraint,handleListMetricsConstraints}from'../../playbooks/service-build/mode-actions.js';import{repairBuiltinTemplates,builtinTemplateDrift,resolveTemplatesDir,parseTemplateFile,TemplateFrontmatterSchema,canonicalTemplateContent,renderTemplateFile,matchBuiltinTemplateFile,TEMPLATE_SENTINEL_KIND}from'../../knowledge/template-loader.js';import{stripReleaseSentinel}from'../../knowledge/release-sentinel.js';import{BUILTIN_TEMPLATES_VERSION}from'../../knowledge/builtin-templates.js';const INDUSTRY_ROOT=resolveIndustryPackDir(),resolveTemplatesDirSafe=resolveTemplatesDir;function resolveIndustryPath(a){const b=resolve(INDUSTRY_ROOT,a);if(b!==INDUSTRY_ROOT&&!b['startsWith'](INDUSTRY_ROOT+sep))throw new Error('path\x20\x27'+a+'\x27\x20escapes\x20the\x20industry\x20root');return b;}function isTemplateTreePath(a){const b=a['split'](/[\\/]+/)['filter'](c=>c['length']>0x0);return b['length']>=0x2&&b[0x1]==='templates';}function assertTemplateWriteAuthorized(a,b,c){if(c===!![])return;const d=b['find'](e=>e!==undefined&&isTemplateTreePath(e));if(!d)return;throw new Error('action=\x27'+a+'\x27\x20modifies\x20the\x20user-editable\x20template\x20file\x20\x27'+d+'\x27.\x20'+'Present\x20the\x20intended\x20change\x20to\x20the\x20user\x20first;\x20after\x20the\x20user\x20explicitly\x20confirms,\x20'+'re-call\x20with\x20authorize=true\x20(C5).');}function rescanAffectedPack(a){const b=a['split'](/[\\/]+/)['find'](c=>c['length']>0x0);if(!b)return;rescanPack(b);}const BASELINES_FILENAME='baselines.json',PACK_FILENAME='pack.json';function assertBaselinesContentValid(a,b){const c=a['split'](/[\\/]+/)['pop']()??'';if(c!==BASELINES_FILENAME&&c!==PACK_FILENAME)return;let d;try{d=JSON['parse'](b);}catch{return;}if(!d||typeof d!=='object'||Array['isArray'](d))return;const e=d,f=c===BASELINES_FILENAME?d:e['baselines'];if(f===undefined||f===null)return;const g=validateJudgmentFragment(f,a+'\x20baselines');if(g)throw new Error('write\x20rejected\x20—\x20the\x20baselines\x20fragment\x20in\x20\x27'+a+'\x27\x20is\x20not\x20a\x20valid\x20judgment\x20fragment:\x20'+g);}function assertTemplateContentValid(a,b){if(!isTemplateTreePath(a)||!a['endsWith']('.md'))return;let c;try{({frontmatter:c}=parseTemplateFile(b));}catch(e){throw new Error('write\x20rejected\x20—\x20\x27'+a+'\x27\x20is\x20a\x20template\x20file\x20but\x20the\x20frontmatter\x20block\x20is\x20malformed:\x20'+e['message']);}const d=TemplateFrontmatterSchema['safeParse'](c);if(!d['success']){const f=d['error']['issues']['map'](g=>'\x20\x20'+g['path']['join']('.')+':\x20'+g['message'])['join']('\x0a');throw new Error('write\x20rejected\x20—\x20the\x20template\x20frontmatter\x20in\x20\x27'+a+'\x27\x20violates\x20the\x20schema\x20(the\x20editor\x20whitelist\x20IS\x20the\x20zod\x20schema):\x0a'+f);}}function listRecursive(a,b,c,d=0x0){if(d>0x8)return;let f;try{f=readdirSync(a,{'withFileTypes':!![]});}catch{return;}for(const g of f){const h=join(a,g['name']),i=relative(b,h)['split'](sep)['join']('/');let j=0x0,k=0x0;try{const l=statSync(h);k=l['size'],j=l['mtimeMs'];}catch{}g['isDirectory']()?(c['push']({'path':i,'is_dir':!![],'size':0x0,'mtime':j}),listRecursive(h,b,c,d+0x1)):c['push']({'path':i,'is_dir':![],'size':k,'mtime':j});}}export function isShellPayload(a){if(a===null||a===undefined)return!![];if(typeof a==='string')return a['length']===0x0;if(Array['isArray'](a))return a['every'](b=>isShellPayload(b));if(typeof a==='object')return Object['entries'](a)['filter'](([b])=>b!=='category')['every'](([,b])=>isShellPayload(b));return![];}export async function handleIndustryPackOperation(a){const b=strictParse(IndustryPackOperationInputSchema,a,'industry_pack_operation\x20input');mkdirSync(INDUSTRY_ROOT,{'recursive':!![]}),seedBuiltinIndustryTemplates(),seedBuiltinStrategyManuals(),ensureIndustryReadme();let c;switch(b['action']){case'scaffold':{if(!b['name'])throw new Error('\x27name\x27\x20is\x20required\x20for\x20action=\x27scaffold\x27');const d=scaffoldIndustryPack(b['name']);c={'action':'scaffold','ok':d['ok'],'dir':d['dir'],'files':d['files'],'errors':d['errors']};if(d['ok'])rescanPack(b['name']);break;}case'list':{c={'action':'list','packs':listRegisteredPacks()};break;}case'scan':{c={'action':'scan','results':scanDefaultIndustryPacks()};break;}case'repair_builtin_templates':{const e=b['include_user_edited'];if(b['authorize']!==!![]){const h=repairBuiltinTemplates({'backup':!![],'dryRun':!![],'includeUserEdited':e}),i=h['filter'](j=>j['status']==='would_update');c={'action':'repair_builtin_templates','dir':resolveTemplatesDirSafe(),'reseeded_count':0x0,'requires_authorization':!![],'results':h,'note':i['length']?'PLAN\x20ONLY\x20(no\x20writes)\x20—\x20'+i['length']+'\x20builtin\x20file(s)\x20differ\x20from\x20the\x20in-code\x20catalog\x20and\x20would\x20be\x20reseeded\x20(each\x20result\x20carries\x20a\x20field-level\x20diff;\x20previous\x20bodies\x20preserved\x20as\x20<file>.bak).\x20Present\x20this\x20plan\x20to\x20the\x20user;\x20after\x20the\x20user\x20explicitly\x20confirms,\x20re-call\x20with\x20authorize=true\x20to\x20execute'+(e?.['length']?'\x20(keep\x20include_user_edited\x20on\x20the\x20execute\x20call)':'')+'.':'Nothing\x20to\x20repair\x20—\x20every\x20on-disk\x20builtin\x20template\x20either\x20matches\x20the\x20in-code\x20catalog\x20or\x20carries\x20user\x20edits\x20(which\x20are\x20never\x20overwritten\x20without\x20an\x20explicit\x20include_user_edited\x20authorization).'};break;}const f=repairBuiltinTemplates({'backup':!![],'includeUserEdited':e}),g=f['filter'](j=>j['status']==='updated');c={'action':'repair_builtin_templates','dir':resolveTemplatesDirSafe(),'reseeded_count':g['length'],'results':f,'note':g['length']?'Diverging\x20builtin\x20files\x20were\x20reseeded\x20from\x20the\x20in-code\x20catalog.\x20Each\x20previous\x20body\x20is\x20preserved\x20as\x20<file>.bak.':'Nothing\x20repaired\x20—\x20every\x20on-disk\x20builtin\x20template\x20either\x20matches\x20the\x20in-code\x20catalog\x20or\x20carries\x20user\x20edits\x20(which\x20are\x20never\x20overwritten\x20without\x20an\x20explicit\x20include_user_edited\x20authorization).'};break;}case'template_drift':{const j=builtinTemplateDrift({'includeUserEdited':b['include_user_edited']}),k=j['filter'](l=>l['repairable'])['length'];c={'action':'template_drift','dir':resolveTemplatesDirSafe(),'drift_count':j['length'],'repairable_count':k,'drift':j,'note':j['length']?k>0x0?k+'\x20of\x20'+j['length']+'\x20diverging\x20builtin\x20template(s)\x20can\x20be\x20reseeded\x20without\x20losing\x20user\x20work\x20(including\x20ids\x20listed\x20in\x20include_user_edited)\x20—\x20run\x20action=\x27repair_builtin_templates\x27\x20(plan-only\x20preview\x20first,\x20then\x20authorize=true\x20after\x20the\x20user\x20confirms,\x20keeping\x20include_user_edited\x20on\x20both\x20calls).\x20The\x20rest\x20carry\x20user\x20edits\x20and\x20are\x20never\x20overwritten.':'All\x20diverging\x20builtin\x20templates\x20carry\x20user\x20edits\x20—\x20never\x20overwritten\x20automatically;\x20pass\x20include_user_edited\x20with\x20the\x20explicitly\x20authorized\x20ids\x20to\x20make\x20them\x20reseedable,\x20or\x20resolve\x20by\x20hand.':'Every\x20builtin\x20template\x20on\x20disk\x20matches\x20the\x20in-code\x20catalog.'};break;}case'resolve':{c={'action':'resolve','dir':INDUSTRY_ROOT};break;}case'list_files':{const l=[];listRecursive(INDUSTRY_ROOT,INDUSTRY_ROOT,l),c={'action':'list_files','dir':INDUSTRY_ROOT,'files':l};break;}case'read_file':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27read_file\x27');const m=resolveIndustryPath(b['path']);if(!existsSync(m))throw new Error('file\x20not\x20found:\x20'+b['path']);c={'action':'read_file','path':m,'content':readFileSync(m,'utf-8')};break;}case'write_file':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27write_file\x27');if(b['content']===undefined)throw new Error('\x27content\x27\x20is\x20required\x20for\x20action=\x27write_file\x27');assertTemplateWriteAuthorized('write_file',[b['path']],b['authorize']);const n=resolveIndustryPath(b['path']);assertBaselinesContentValid(b['path'],b['content']),assertTemplateContentValid(b['path'],b['content']);let o=b['content'],p=![];const q=matchBuiltinTemplateFile(n);if(q){const u=stripReleaseSentinel(o,TEMPLATE_SENTINEL_KIND)['content'];u===canonicalTemplateContent(q)&&(o=renderTemplateFile(q),p=!![]);}mkdirSync(dirname(n),{'recursive':!![]}),writeFileSync(n,o,'utf-8'),c={'action':'write_file','path':n,'ok':!![],...p?{'restamped':!![],'note':'content\x20equals\x20the\x20canonical\x20body\x20of\x20builtin\x20template\x20\x27'+q['id']+'\x27\x20—\x20written\x20with\x20the\x20current\x20release\x20stamp\x20(v'+BUILTIN_TEMPLATES_VERSION+')\x20so\x20the\x20sentinel\x20hash\x20binds\x20again'}:{}},rescanAffectedPack(b['path']);break;}case'get':{if(!b['name'])throw new Error('\x27name\x27\x20is\x20required\x20for\x20action=\x27get\x27');const v=b['name'],w=getRegisteredPack(v),x=w?.['layers']??[],y=()=>w?{'kind':packKind(x),'layers':x}:{},z=()=>{const G=getIndustryModeRegistry()['getMode'](v);return G?{'name':G['name'],'display_name':G['display_name'],'key_risk':G['key_risk'],'needs':G['needs']['map'](H=>H['description']),...G['analyze']?.['key_questions']?.['length']?{'analyze_questions':G['analyze']['key_questions']['slice'](0x0,0x2)}:{}}:undefined;};if(b['layer']==='template'){if(b['template']){const G=getBuiltinTemplate(b['template']);if(!G)throw new Error('template\x20\x27'+b['template']+'\x27\x20is\x20not\x20in\x20the\x20builtin\x20catalog\x20'+('(available:\x20'+listBuiltinTemplates()['map'](H=>H['id'])['join'](',\x20')+')'));if(G['industry']!==v)throw new Error('template\x20\x27'+G['id']+'\x27\x20belongs\x20to\x20industry\x20\x27'+G['industry']+'\x27,\x20not\x20\x27'+v+'\x27\x20—\x20'+'set\x20\x27name\x27\x20to\x20the\x20template\x27s\x20industry');c={'action':'get','category':v,'layer':'template','template':JSON['parse'](JSON['stringify'](G))};}else{const H=listBuiltinTemplates()['filter'](I=>I['industry']===v)['map'](I=>({'id':I['id'],'variant':I['variant'],'product_ref':I['product_ref'],'key_risk':I['key_risk']}));if(!H['length'])throw new Error('industry\x20\x27'+v+'\x27\x20has\x20no\x20builtin\x20templates\x20(ids\x20use\x20\x27<industry>/<variant>\x27)');c={'action':'get','category':v,'layer':'template','templates':H,'note':'Re-call\x20with\x20layer=\x27template\x27\x20+\x20template=\x27<id>\x27\x20for\x20the\x20full\x20projection\x20'+'(machine_shape/guards/allocator\x20rows/fee_params/build_notes).'};}break;}if(b['layer']){const I=b['layer'];if(I==='match')throw new Error('layer\x20\x27match\x27\x20is\x20consumed\x20internally\x20by\x20the\x20recommend\x20matching\x20flow\x20—\x20not\x20exposed\x20via\x20get');if(!x['includes'](I))throw new Error('pack\x20\x27'+v+'\x27\x20does\x20not\x20register\x20layer\x20\x27'+I+'\x27'+(w?'\x20(kind='+packKind(x)+',\x20layers=['+x['join'](',\x20')+'])':'\x20(the\x20pack\x20is\x20not\x20registered)')+(I!=='mode'?';\x20layer=\x27template\x27\x20reads\x20the\x20builtin\x20catalog\x20instead\x20if\x20that\x20is\x20what\x20you\x20need':''));const J=I==='mode'?z():I==='dispute'?resolveDisputeRules(v):I==='compliance'?resolveComplianceRules(v):I==='supply'?resolveSupplyRules(v):I==='rules'?resolveIndustryRules(v):resolveIndustryPlaybook(v);if(J===undefined)throw new Error('layer\x20\x27'+I+'\x27\x20is\x20registered\x20for\x20pack\x20\x27'+v+'\x27\x20but\x20resolved\x20to\x20no\x20data');c={'action':'get','category':v,'layer':I,[I]:J,...y()};break;}const A=z(),B=[{'name':'dispute','payload':resolveDisputeRules(v)},{'name':'compliance','payload':resolveComplianceRules(v)},{'name':'supply','payload':resolveSupplyRules(v)},{'name':'rules','payload':resolveIndustryRules(v)},{'name':'playbook','payload':resolveIndustryPlaybook(v)}],C=B['filter'](K=>K['payload']!==undefined&&isShellPayload(K['payload']))['map'](K=>K['name']),D=B['filter'](K=>K['payload']!==undefined&&!isShellPayload(K['payload'])),E=['dispute','compliance','supply','rules','playbook']['filter'](K=>!x['includes'](K)),F=x['filter'](K=>!C['includes'](K));c={'action':'get','category':v,...w?{'kind':packKind(F),'layers':F,...F['length']!==x['length']?{'registered_layers':x}:{}}:{},...A?{'mode':A}:{},...Object['fromEntries'](D['map'](K=>[K['name'],K['payload']])),...C['length']?{'empty_layers':C}:{},...E['length']?{'missing_layers':E}:{},...E['length']||C['length']?{'note':[...E['length']?['pack\x20\x27'+v+'\x27\x20('+(w?packKind(F):'unregistered')+')\x20does\x20not\x20register\x20'+('['+E['join'](',\x20')+']\x20—\x20stub\x20packs\x20(builtin-mode\x20aliases)\x20carry\x20only\x20mode/match\x20')+'data;\x20scaffold\x20a\x20pack\x20or\x20place\x20a\x20pack.json\x20to\x20add\x20business\x20layers.']:[],...C['length']?['registered-but-empty\x20layer(s)\x20['+C['join'](',\x20')+']\x20carry\x20no\x20content\x20and\x20are\x20treated\x20'+'as\x20absent\x20(empty_layers)\x20—\x20the\x20echoed\x20kind\x20reflects\x20content-bearing\x20coverage,\x20not\x20raw\x20registration.']:[]]['join']('\x20')}:{}};break;}case'diff':{if(!b['name'])throw new Error('\x27name\x27\x20is\x20required\x20for\x20action=\x27diff\x27');c={'action':'diff',...diffIndustryPack(b['name'])};break;}case'reset':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27reset\x27');assertTemplateWriteAuthorized('reset',[b['path']],b['authorize']);const K=resetIndustryPath(b['path']);c={'action':'reset','ok':K['ok'],'layout':K['layout'],'target':K['target'],'restored_files':K['restored_files'],'errors':K['errors']},rescanAffectedPack(b['path']);break;}case'delete_file':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27delete_file\x27');assertTemplateWriteAuthorized('delete_file',[b['path']],b['authorize']);const L=resolveIndustryPath(b['path']);if(!existsSync(L))throw new Error('file\x20not\x20found:\x20'+b['path']);rmSync(L,{'recursive':!![],'force':!![]}),c={'action':'delete_file','path':L,'ok':!![]},rescanAffectedPack(b['path']);break;}case'create_file':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27create_file\x27');const M=resolveIndustryPath(b['path']);if(existsSync(M))throw new Error('file\x20already\x20exists:\x20'+b['path']);if(b['content']!==undefined)assertBaselinesContentValid(b['path'],b['content']);mkdirSync(dirname(M),{'recursive':!![]}),writeFileSync(M,b['content']??'','utf-8'),c={'action':'create_file','path':M,'ok':!![]},rescanAffectedPack(b['path']);break;}case'create_dir':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27create_dir\x27');const N=resolveIndustryPath(b['path']);mkdirSync(N,{'recursive':!![]}),c={'action':'create_dir','path':N,'ok':!![]},rescanAffectedPack(b['path']);break;}case'copy':{if(!b['from'])throw new Error('\x27from\x27\x20is\x20required\x20for\x20action=\x27copy\x27');if(!b['to'])throw new Error('\x27to\x27\x20is\x20required\x20for\x20action=\x27copy\x27');const O=resolveIndustryPath(b['from']);let P=resolveIndustryPath(b['to']);if(!existsSync(O))throw new Error('source\x20not\x20found:\x20'+b['from']);try{existsSync(P)&&statSync(P)['isDirectory']()&&(P=join(P,basename(O)));}catch{}if(P===O)throw new Error('\x27copy\x27\x20cannot\x20copy\x20a\x20file\x20onto\x20itself');existsSync(P)&&isTemplateTreePath(b['to'])&&assertTemplateWriteAuthorized('copy',[b['to']],b['authorize']);mkdirSync(dirname(P),{'recursive':!![]}),cpSync(O,P,{'recursive':!![],'force':!![]}),c={'action':'copy','from':O,'to':P,'ok':!![]},rescanAffectedPack(b['to']);break;}case'move':case'rename':{if(!b['from'])throw new Error('\x27from\x27\x20is\x20required\x20for\x20action=\x27'+b['action']+'\x27');if(!b['to'])throw new Error('\x27to\x27\x20is\x20required\x20for\x20action=\x27'+b['action']+'\x27');assertTemplateWriteAuthorized(b['action'],[b['from'],b['to']],b['authorize']);const Q=resolveIndustryPath(b['from']);let R=resolveIndustryPath(b['to']);if(!existsSync(Q))throw new Error('source\x20not\x20found:\x20'+b['from']);try{existsSync(R)&&statSync(R)['isDirectory']()&&(R=join(R,basename(Q)));}catch{}if(R===Q)throw new Error('\x27'+b['action']+'\x27\x20cannot\x20move\x20onto\x20itself');mkdirSync(dirname(R),{'recursive':!![]}),renameSync(Q,R),c={'action':b['action'],'from':Q,'to':R,'ok':!![]},rescanAffectedPack(b['from']),rescanAffectedPack(b['to']);break;}case'recommend_industry':c=await handleRecommendIndustry(b);break;case'list_modes':c=await handleListModes();break;case'derive_user_mode':c=await handleDeriveUserMode(b);break;case'evolve_user_mode':c=await handleEvolveUserMode(b);break;case'register_user_mode':c=await handleRegisterUserMode(b);break;case'unregister_user_mode':c=await handleUnregisterUserMode(b);break;case'register_custom_metric':c=await handleRegisterCustomMetric(b);break;case'unregister_custom_metric':c=await handleUnregisterCustomMetric(b);break;case'register_custom_constraint':c=await handleRegisterCustomConstraint(b);break;case'unregister_custom_constraint':c=await handleUnregisterCustomConstraint(b);break;case'list_metrics_constraints':c=await handleListMetricsConstraints(b);break;default:throw new Error('Unknown\x20industry_pack_operation\x20action:\x20'+String(b['action']));}return{'content':[{'type':'text','text':JSON['stringify']({'result':c})}],'structuredContent':{'result':c}};}
1
+ import{readdirSync,readFileSync,writeFileSync,existsSync,mkdirSync,statSync,cpSync,renameSync,rmSync}from'node:fs';import{join,relative,resolve,sep,dirname,basename}from'node:path';import{strictParse}from'../../schema/index.js';import{IndustryPackOperationInputSchema}from'../../schema/industry-pack/index.js';import{validateJudgmentFragment}from'../../config/judgment.js';import{scaffoldIndustryPack,listRegisteredPacks,getRegisteredPack,packKind,scanDefaultIndustryPacks,seedBuiltinIndustryTemplates,seedBuiltinStrategyManuals,ensureIndustryReadme,resolveIndustryPackDir,rescanPack,resolveDisputeRules,resolveComplianceRules,resolveSupplyRules,resolveIndustryRules,resolveIndustryPlaybook,diffIndustryPack,resetIndustryPath}from'../../extensions/index.js';import{getIndustryModeRegistry}from'../../extensions/registry.js';import{getBuiltinTemplate,listBuiltinTemplates}from'../../knowledge/builtin-templates.js';import{ALL_CAPABILITIES,getCapability}from'../../extensions/capability.js';import{composeProbe}from'../../evaluation/composer.js';import{productCard,productCards}from'../../composition/product-card.js';import{paramPlane}from'../../composition/param-disclosure.js';import{matchParams}from'../../knowledge/param-schema.js';import{componentPlane,matchComponents,summarizeComponents}from'../../knowledge/component-schema.js';import{handleRecommendIndustry,handleListModes,handleDeriveUserMode,handleEvolveUserMode,handleRegisterUserMode,handleUnregisterUserMode,handleRegisterCustomMetric,handleUnregisterCustomMetric,handleRegisterCustomConstraint,handleUnregisterCustomConstraint,handleListMetricsConstraints}from'../../playbooks/service-build/mode-actions.js';import{repairBuiltinTemplates,builtinTemplateDrift,resolveTemplatesDir,parseTemplateFile,foldKnobFrontmatter,TemplateFrontmatterSchema,TemplateKnobOverlaySchema,canonicalTemplateContent,canonicalKnobContent,renderTemplateFile,renderKnobFile,matchBuiltinTemplateSlot,TEMPLATE_SENTINEL_KIND,TEMPLATE_KNOBS_SENTINEL_KIND,TEMPLATE_KNOBS_VERSION}from'../../knowledge/template-loader.js';import{stripReleaseSentinel}from'../../knowledge/release-sentinel.js';import{BUILTIN_TEMPLATES_VERSION}from'../../knowledge/builtin-templates.js';const INDUSTRY_ROOT=resolveIndustryPackDir(),resolveTemplatesDirSafe=resolveTemplatesDir;function resolveIndustryPath(a){const b=resolve(INDUSTRY_ROOT,a);if(b!==INDUSTRY_ROOT&&!b['startsWith'](INDUSTRY_ROOT+sep))throw new Error('path\x20\x27'+a+'\x27\x20escapes\x20the\x20industry\x20root');return b;}function isTemplateTreePath(a){const b=a['split'](/[\\/]+/)['filter'](c=>c['length']>0x0);return b['length']>=0x2&&b[0x1]==='templates';}function assertTemplateWriteAuthorized(a,b,c){if(c===!![])return;const d=b['find'](e=>e!==undefined&&isTemplateTreePath(e));if(!d)return;throw new Error('action=\x27'+a+'\x27\x20modifies\x20the\x20user-editable\x20template\x20file\x20\x27'+d+'\x27.\x20'+'Present\x20the\x20intended\x20change\x20to\x20the\x20user\x20first;\x20after\x20the\x20user\x20explicitly\x20confirms,\x20'+'re-call\x20with\x20authorize=true\x20(C5).');}function rescanAffectedPack(a){const b=a['split'](/[\\/]+/)['find'](c=>c['length']>0x0);if(!b)return;rescanPack(b);}const BASELINES_FILENAME='baselines.json',PACK_FILENAME='pack.json';function assertBaselinesContentValid(a,b){const c=a['split'](/[\\/]+/)['pop']()??'';if(c!==BASELINES_FILENAME&&c!==PACK_FILENAME)return;let d;try{d=JSON['parse'](b);}catch{return;}if(!d||typeof d!=='object'||Array['isArray'](d))return;const e=d,f=c===BASELINES_FILENAME?d:e['baselines'];if(f===undefined||f===null)return;const g=validateJudgmentFragment(f,a+'\x20baselines');if(g)throw new Error('write\x20rejected\x20—\x20the\x20baselines\x20fragment\x20in\x20\x27'+a+'\x27\x20is\x20not\x20a\x20valid\x20judgment\x20fragment:\x20'+g);}function assertTemplateContentValid(a,b){if(!isTemplateTreePath(a)||!a['endsWith']('.md'))return;let c;try{({frontmatter:c}=parseTemplateFile(b));}catch(f){throw new Error('write\x20rejected\x20—\x20\x27'+a+'\x27\x20is\x20a\x20template\x20file\x20but\x20the\x20frontmatter\x20block\x20is\x20malformed:\x20'+f['message']);}const d=matchBuiltinTemplateSlot(resolveIndustryPath(a));if(d?.['part']==='knobs'){const g=TemplateKnobOverlaySchema['safeParse'](foldKnobFrontmatter(c));if(!g['success']){const h=g['error']['issues']['map'](j=>'\x20\x20'+j['path']['join']('.')+':\x20'+j['message'])['join']('\x0a');throw new Error('write\x20rejected\x20—\x20the\x20knob\x20frontmatter\x20in\x20\x27'+a+'\x27\x20violates\x20the\x20knob\x20schema\x20'+('(fee_params\x20may\x20also\x20be\x20written\x20one\x20per\x20line\x20as\x20\x27fee_params.<name>:\x20<value>\x27):\x0a'+h));}if(g['data']['id']!==d['template']['id'])throw new Error('write\x20rejected\x20—\x20knob\x20file\x20\x27'+a+'\x27\x20declares\x20id\x20\x27'+g['data']['id']+'\x27,\x20which\x20does\x20not\x20own\x20this\x20slot');return;}const e=TemplateFrontmatterSchema['safeParse'](c);if(!e['success']){const i=e['error']['issues']['map'](j=>'\x20\x20'+j['path']['join']('.')+':\x20'+j['message'])['join']('\x0a');throw new Error('write\x20rejected\x20—\x20the\x20template\x20frontmatter\x20in\x20\x27'+a+'\x27\x20violates\x20the\x20schema\x20(the\x20editor\x20whitelist\x20IS\x20the\x20zod\x20schema):\x0a'+i);}}function listRecursive(a,b,c,d=0x0){if(d>0x8)return;let f;try{f=readdirSync(a,{'withFileTypes':!![]});}catch{return;}for(const g of f){if(g['name']['startsWith']('.'))continue;const h=join(a,g['name']),i=relative(b,h)['split'](sep)['join']('/');let j=0x0,k=0x0;try{const l=statSync(h);k=l['size'],j=l['mtimeMs'];}catch{}g['isDirectory']()?(c['push']({'path':i,'is_dir':!![],'size':0x0,'mtime':j}),listRecursive(h,b,c,d+0x1)):c['push']({'path':i,'is_dir':![],'size':k,'mtime':j});}}export function isShellPayload(a){if(a===null||a===undefined)return!![];if(typeof a==='string')return a['length']===0x0;if(Array['isArray'](a))return a['every'](b=>isShellPayload(b));if(typeof a==='object')return Object['entries'](a)['filter'](([b])=>b!=='category')['every'](([,b])=>isShellPayload(b));return![];}export async function handleIndustryPackOperation(a){const b=strictParse(IndustryPackOperationInputSchema,a,'industry_pack_operation\x20input');mkdirSync(INDUSTRY_ROOT,{'recursive':!![]}),seedBuiltinIndustryTemplates(),seedBuiltinStrategyManuals(),ensureIndustryReadme();let c;switch(b['action']){case'scaffold':{if(!b['name'])throw new Error('\x27name\x27\x20is\x20required\x20for\x20action=\x27scaffold\x27');const d=scaffoldIndustryPack(b['name']);c={'action':'scaffold','ok':d['ok'],'dir':d['dir'],'files':d['files'],'errors':d['errors']};if(d['ok'])rescanPack(b['name']);break;}case'list':{c={'action':'list','packs':listRegisteredPacks()};break;}case'scan':{c={'action':'scan','results':scanDefaultIndustryPacks()};break;}case'repair_builtin_templates':{const e=b['include_user_edited'];if(b['authorize']!==!![]){const h=repairBuiltinTemplates({'backup':!![],'dryRun':!![],'includeUserEdited':e}),i=h['filter'](j=>j['status']==='would_update');c={'action':'repair_builtin_templates','dir':resolveTemplatesDirSafe(),'reseeded_count':0x0,'requires_authorization':!![],'results':h,'note':i['length']?'PLAN\x20ONLY\x20(no\x20writes)\x20—\x20'+i['length']+'\x20builtin\x20file(s)\x20differ\x20from\x20the\x20in-code\x20catalog\x20and\x20would\x20be\x20reseeded\x20(each\x20result\x20carries\x20a\x20field-level\x20diff;\x20previous\x20bodies\x20preserved\x20under\x20templates/.archive/).\x20Present\x20this\x20plan\x20to\x20the\x20user;\x20after\x20the\x20user\x20explicitly\x20confirms,\x20re-call\x20with\x20authorize=true\x20to\x20execute'+(e?.['length']?'\x20(keep\x20include_user_edited\x20on\x20the\x20execute\x20call)':'')+'.':'Nothing\x20to\x20repair\x20—\x20every\x20on-disk\x20builtin\x20template\x20either\x20matches\x20the\x20in-code\x20catalog\x20or\x20carries\x20user\x20edits\x20(which\x20are\x20never\x20overwritten\x20without\x20an\x20explicit\x20include_user_edited\x20authorization).'};break;}const f=repairBuiltinTemplates({'backup':!![],'includeUserEdited':e}),g=f['filter'](j=>j['status']==='updated');c={'action':'repair_builtin_templates','dir':resolveTemplatesDirSafe(),'reseeded_count':g['length'],'results':f,'note':g['length']?'Diverging\x20builtin\x20files\x20were\x20reseeded\x20from\x20the\x20in-code\x20catalog.\x20Each\x20previous\x20body\x20is\x20preserved\x20under\x20templates/.archive/.':'Nothing\x20repaired\x20—\x20every\x20on-disk\x20builtin\x20template\x20either\x20matches\x20the\x20in-code\x20catalog\x20or\x20carries\x20user\x20edits\x20(which\x20are\x20never\x20overwritten\x20without\x20an\x20explicit\x20include_user_edited\x20authorization).'};break;}case'template_drift':{const j=builtinTemplateDrift({'includeUserEdited':b['include_user_edited']}),k=j['filter'](l=>l['repairable'])['length'];c={'action':'template_drift','dir':resolveTemplatesDirSafe(),'drift_count':j['length'],'repairable_count':k,'drift':j,'note':j['length']?k>0x0?k+'\x20of\x20'+j['length']+'\x20diverging\x20builtin\x20template(s)\x20can\x20be\x20reseeded\x20without\x20losing\x20user\x20work\x20(including\x20ids\x20listed\x20in\x20include_user_edited)\x20—\x20run\x20action=\x27repair_builtin_templates\x27\x20(plan-only\x20preview\x20first,\x20then\x20authorize=true\x20after\x20the\x20user\x20confirms,\x20keeping\x20include_user_edited\x20on\x20both\x20calls).\x20The\x20rest\x20carry\x20user\x20edits\x20and\x20are\x20never\x20overwritten.':'All\x20diverging\x20builtin\x20templates\x20carry\x20user\x20edits\x20—\x20never\x20overwritten\x20automatically;\x20pass\x20include_user_edited\x20with\x20the\x20explicitly\x20authorized\x20ids\x20to\x20make\x20them\x20reseedable,\x20or\x20resolve\x20by\x20hand.':'Every\x20builtin\x20template\x20on\x20disk\x20matches\x20the\x20in-code\x20catalog.'};break;}case'resolve':{c={'action':'resolve','dir':INDUSTRY_ROOT};break;}case'list_files':{const l=[];listRecursive(INDUSTRY_ROOT,INDUSTRY_ROOT,l),c={'action':'list_files','dir':INDUSTRY_ROOT,'files':l};break;}case'read_file':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27read_file\x27');const m=resolveIndustryPath(b['path']);if(!existsSync(m))throw new Error('file\x20not\x20found:\x20'+b['path']);c={'action':'read_file','path':m,'content':readFileSync(m,'utf-8')};break;}case'write_file':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27write_file\x27');if(b['content']===undefined)throw new Error('\x27content\x27\x20is\x20required\x20for\x20action=\x27write_file\x27');assertTemplateWriteAuthorized('write_file',[b['path']],b['authorize']);const n=resolveIndustryPath(b['path']);assertBaselinesContentValid(b['path'],b['content']),assertTemplateContentValid(b['path'],b['content']);let o=b['content'],p=![],q;const u=matchBuiltinTemplateSlot(n);if(u){if(u['part']==='machine'){const v=stripReleaseSentinel(o,TEMPLATE_SENTINEL_KIND)['content'];v===canonicalTemplateContent(u['template'])&&(o=renderTemplateFile(u['template']),p=!![],q='content\x20equals\x20the\x20canonical\x20machine\x20release\x20of\x20builtin\x20template\x20\x27'+u['template']['id']+'\x27\x20—\x20written\x20with\x20the\x20current\x20release\x20stamp\x20(v'+BUILTIN_TEMPLATES_VERSION+')\x20so\x20the\x20sentinel\x20hash\x20binds\x20again');}else{const w=stripReleaseSentinel(o,TEMPLATE_KNOBS_SENTINEL_KIND)['content'];w===canonicalKnobContent(u['template'])&&(o=renderKnobFile(u['template']),p=!![],q='content\x20equals\x20the\x20canonical\x20knob\x20release\x20of\x20builtin\x20template\x20\x27'+u['template']['id']+'\x27\x20—\x20written\x20with\x20the\x20current\x20release\x20stamp\x20(v'+TEMPLATE_KNOBS_VERSION+')\x20so\x20the\x20sentinel\x20hash\x20binds\x20again');}}mkdirSync(dirname(n),{'recursive':!![]}),writeFileSync(n,o,'utf-8'),c={'action':'write_file','path':n,'ok':!![],...p?{'restamped':!![],'note':q}:{}},rescanAffectedPack(b['path']);break;}case'get':{if(!b['name']&&b['layer']!=='params'&&b['layer']!=='components')throw new Error('\x27name\x27\x20is\x20required\x20for\x20action=\x27get\x27');const x=b['name']??'all',y=getRegisteredPack(x),z=y?.['layers']??[],A=()=>y?{'kind':packKind(z),'layers':z}:{},B=()=>{const I=getIndustryModeRegistry()['getMode'](x);return I?{'name':I['name'],'display_name':I['display_name'],'key_risk':I['key_risk'],'needs':I['needs']['map'](J=>J['description']),...I['analyze']?.['key_questions']?.['length']?{'analyze_questions':I['analyze']['key_questions']['slice'](0x0,0x2)}:{}}:undefined;};if(b['layer']==='params'){const I=M=>({'total':M['length'],'editable':M['filter'](N=>N['editable'])['length'],'live':M['filter'](N=>N['status']==='live')['length'],'inert':M['filter'](N=>N['status']==='inert')['length'],'not_flippable':M['filter'](N=>N['status']==='not-flippable')['length'],'hidden':M['filter'](N=>N['disclosure']==='hidden')['length'],'undescribed':M['filter'](N=>N['meaning']['startsWith']('Not\x20yet\x20described'))['length']}),J=b['query']?.['trim']();if(b['template']){const M=getBuiltinTemplate(b['template']);if(!M)throw new Error('template\x20\x27'+b['template']+'\x27\x20is\x20not\x20in\x20the\x20builtin\x20catalog\x20'+('(available:\x20'+listBuiltinTemplates()['map'](P=>P['id'])['join'](',\x20')+')'));if(b['name']&&M['industry']!==b['name'])throw new Error('template\x20\x27'+M['id']+'\x27\x20belongs\x20to\x20industry\x20\x27'+M['industry']+'\x27,\x20not\x20\x27'+b['name']+'\x27\x20—\x20'+'set\x20\x27name\x27\x20to\x20the\x20template\x27s\x20industry\x20(or\x20omit\x20it)');const N=paramPlane(M),O=J?matchParams(J,N,0x8):undefined;c={'action':'get','category':M['industry'],'layer':'params','template':M['id'],'param_summary':I(N),'params':N,...O?{'param_matches':O['map'](P=>({...P['row'],'score':P['score'],'reasons':P['reasons']})),'note':O['length']===0x0?'No\x20declared\x20parameter\x20of\x20\x27'+M['id']+'\x27\x20matches\x20\x27'+J+'\x27\x20—\x20that\x20phrase\x20names\x20no\x20setting\x20here\x20(nothing\x20was\x20guessed).':undefined}:{},'query':J};break;}if(!J)throw new Error('\x27query\x27\x20is\x20required\x20for\x20layer=\x27params\x27\x20without\x20a\x20template\x20id\x20—\x20name\x20the\x20business\x20facet\x20'+'(e.g.\x20\x27settlement\x20window\x27,\x20\x27take\x20rate\x27,\x20\x27cancel\x20fee\x27)\x20to\x20search\x20every\x20template');const K=b['name']?listBuiltinTemplates()['filter'](P=>P['industry']===b['name']):listBuiltinTemplates();if(K['length']===0x0)throw new Error('industry\x20\x27'+b['name']+'\x27\x20has\x20no\x20builtin\x20templates');const L=K['flatMap'](P=>matchParams(J,paramPlane(P),0x3)['map'](Q=>({'template':P['id'],'key':Q['row']['key'],'tier':Q['row']['tier'],'tier_name':Q['row']['tier_name'],'meaning':Q['row']['meaning'],'default':Q['row']['default'],'unit':Q['row']['unit'],'unit_hint':Q['row']['unit_hint'],'disclosure':Q['row']['disclosure'],'status':Q['row']['status'],'editable':Q['row']['editable'],'score':Q['score'],'reasons':Q['reasons']})))['sort']((P,Q)=>Q['score']-P['score']||P['template']['localeCompare'](Q['template']))['slice'](0x0,0x14);c={'action':'get','category':b['name']??'all','layer':'params','param_matches':L,'query':J,'note':L['length']===0x0?'No\x20template\x20parameter\x20matches\x20\x27'+J+'\x27\x20—\x20that\x20facet\x20is\x20not\x20a\x20setting\x20anywhere\x20in\x20the\x20catalog\x20(nothing\x20was\x20guessed).':undefined};break;}if(b['layer']==='components'){const P=b['query']?.['trim']();if(b['template']){const S=getBuiltinTemplate(b['template']);if(!S)throw new Error('template\x20\x27'+b['template']+'\x27\x20is\x20not\x20in\x20the\x20builtin\x20catalog\x20'+('(available:\x20'+listBuiltinTemplates()['map'](V=>V['id'])['join'](',\x20')+')'));if(b['name']&&S['industry']!==b['name'])throw new Error('template\x20\x27'+S['id']+'\x27\x20belongs\x20to\x20industry\x20\x27'+S['industry']+'\x27,\x20not\x20\x27'+b['name']+'\x27\x20—\x20'+'set\x20\x27name\x27\x20to\x20the\x20template\x27s\x20industry\x20(or\x20omit\x20it)');const T=componentPlane(S),U=P?matchComponents(P,T,0x8):undefined;c={'action':'get','category':S['industry'],'layer':'components','template':S['id'],'component_summary':summarizeComponents(T),'components':T,...U?{'component_matches':U,'note':U['length']===0x0?'No\x20component\x20of\x20\x27'+S['id']+'\x27\x20matches\x20\x27'+P+'\x27\x20—\x20that\x20phrase\x20names\x20no\x20component\x20here\x20(nothing\x20was\x20guessed).':undefined}:{},'query':P};break;}if(!P)throw new Error('\x27query\x27\x20is\x20required\x20for\x20layer=\x27components\x27\x20without\x20a\x20template\x20id\x20—\x20name\x20the\x20component\x20'+'(e.g.\x20\x27allocator\x20split\x27,\x20\x27repository\x20policy\x27,\x20\x27machine\x27,\x20\x27arbitration\x20venue\x27)\x20to\x20search\x20every\x20template');const Q=b['name']?listBuiltinTemplates()['filter'](V=>V['industry']===b['name']):listBuiltinTemplates();if(Q['length']===0x0)throw new Error('industry\x20\x27'+b['name']+'\x27\x20has\x20no\x20builtin\x20templates');const R=Q['flatMap'](V=>matchComponents(P,componentPlane(V),0x3)['map'](W=>({'template':V['id'],'id':W['id'],'family':W['family'],'what':W['what'],'how':W['how'],'effect':W['effect'],'related':W['related'],'configurable':W['configurable'],'why_not':W['why_not']})))['slice'](0x0,0x14);c={'action':'get','category':b['name']??'all','layer':'components','component_matches':R,'query':P,'note':R['length']===0x0?'No\x20template\x20component\x20matches\x20\x27'+P+'\x27\x20—\x20that\x20phrase\x20names\x20no\x20component\x20in\x20the\x20catalog\x20(nothing\x20was\x20guessed).':undefined};break;}if(b['layer']==='template'){if(b['template']){const V=getBuiltinTemplate(b['template']);if(!V)throw new Error('template\x20\x27'+b['template']+'\x27\x20is\x20not\x20in\x20the\x20builtin\x20catalog\x20'+('(available:\x20'+listBuiltinTemplates()['map'](W=>W['id'])['join'](',\x20')+')'));if(V['industry']!==x)throw new Error('template\x20\x27'+V['id']+'\x27\x20belongs\x20to\x20industry\x20\x27'+V['industry']+'\x27,\x20not\x20\x27'+x+'\x27\x20—\x20'+'set\x20\x27name\x27\x20to\x20the\x20template\x27s\x20industry');c={'action':'get','category':x,'layer':'template','template':JSON['parse'](JSON['stringify'](V))};}else{const W=listBuiltinTemplates()['filter'](X=>X['industry']===x)['map'](X=>({'id':X['id'],'variant':X['variant'],'product_ref':X['product_ref'],'key_risk':X['key_risk']}));if(!W['length'])throw new Error('industry\x20\x27'+x+'\x27\x20has\x20no\x20builtin\x20templates\x20(ids\x20use\x20\x27<industry>/<variant>\x27)');c={'action':'get','category':x,'layer':'template','templates':W,'note':'Re-call\x20with\x20layer=\x27template\x27\x20+\x20template=\x27<id>\x27\x20for\x20the\x20full\x20projection\x20'+'(machine_shape/guards/allocator\x20rows/fee_params/build_notes).'};}break;}if(b['layer']){const X=b['layer'];if(X==='match')throw new Error('layer\x20\x27match\x27\x20is\x20consumed\x20internally\x20by\x20the\x20recommend\x20matching\x20flow\x20—\x20not\x20exposed\x20via\x20get');if(!z['includes'](X))throw new Error('pack\x20\x27'+x+'\x27\x20does\x20not\x20register\x20layer\x20\x27'+X+'\x27'+(y?'\x20(kind='+packKind(z)+',\x20layers=['+z['join'](',\x20')+'])':'\x20(the\x20pack\x20is\x20not\x20registered)')+(X!=='mode'?';\x20layer=\x27template\x27\x20reads\x20the\x20builtin\x20catalog\x20instead\x20if\x20that\x20is\x20what\x20you\x20need':''));const Y=X==='mode'?B():X==='dispute'?resolveDisputeRules(x):X==='compliance'?resolveComplianceRules(x):X==='supply'?resolveSupplyRules(x):X==='rules'?resolveIndustryRules(x):resolveIndustryPlaybook(x);if(Y===undefined)throw new Error('layer\x20\x27'+X+'\x27\x20is\x20registered\x20for\x20pack\x20\x27'+x+'\x27\x20but\x20resolved\x20to\x20no\x20data');c={'action':'get','category':x,'layer':X,[X]:Y,...A()};break;}const C=B(),D=[{'name':'dispute','payload':resolveDisputeRules(x)},{'name':'compliance','payload':resolveComplianceRules(x)},{'name':'supply','payload':resolveSupplyRules(x)},{'name':'rules','payload':resolveIndustryRules(x)},{'name':'playbook','payload':resolveIndustryPlaybook(x)}],E=D['filter'](Z=>Z['payload']!==undefined&&isShellPayload(Z['payload']))['map'](Z=>Z['name']),F=D['filter'](Z=>Z['payload']!==undefined&&!isShellPayload(Z['payload'])),G=['dispute','compliance','supply','rules','playbook']['filter'](Z=>!z['includes'](Z)),H=z['filter'](Z=>!E['includes'](Z));c={'action':'get','category':x,...y?{'kind':packKind(H),'layers':H,...H['length']!==z['length']?{'registered_layers':z}:{}}:{},...C?{'mode':C}:{},...Object['fromEntries'](F['map'](Z=>[Z['name'],Z['payload']])),...E['length']?{'empty_layers':E}:{},...G['length']?{'missing_layers':G}:{},...G['length']||E['length']?{'note':[...G['length']?['pack\x20\x27'+x+'\x27\x20('+(y?packKind(H):'unregistered')+')\x20does\x20not\x20register\x20'+('['+G['join'](',\x20')+']\x20—\x20stub\x20packs\x20(builtin-mode\x20aliases)\x20carry\x20only\x20mode/match\x20')+'data;\x20scaffold\x20a\x20pack\x20or\x20place\x20a\x20pack.json\x20to\x20add\x20business\x20layers.']:[],...E['length']?['registered-but-empty\x20layer(s)\x20['+E['join'](',\x20')+']\x20carry\x20no\x20content\x20and\x20are\x20treated\x20'+'as\x20absent\x20(empty_layers)\x20—\x20the\x20echoed\x20kind\x20reflects\x20content-bearing\x20coverage,\x20not\x20raw\x20registration.']:[]]['join']('\x20')}:{}};break;}case'capability_list':{const Z=b['group']?.['trim'](),a0=Z?ALL_CAPABILITIES['filter'](a1=>a1['group']===Z):ALL_CAPABILITIES;if(Z&&a0['length']===0x0)throw new Error('unknown\x20capability\x20group\x20\x27'+Z+'\x27\x20'+('(valid:\x20'+[...new Set(ALL_CAPABILITIES['map'](a1=>a1['group']))]['join'](',\x20')+')'));c={'action':'capability_list','total':a0['length'],'capabilities':a0['map'](a1=>({'id':a1['id'],'name':a1['name'],'group':a1['group'],'description':a1['description'],'source':a1['source'],'requires':a1['requires'],'excludes':a1['excludes'],'provides':a1['provides'],'requires_keeper':a1['requiresKeeper']}))};break;}case'capability_get':{const a1=b['capabilities']?.[0x0]??b['template'];if(!a1)throw new Error('pass\x20the\x20capability\x20id\x20in\x20\x27capabilities[0]\x27\x20(or\x20\x27template\x27)\x20for\x20action=\x27capability_get\x27\x20—\x20'+'list\x20ids\x20via\x20action=\x27capability_list\x27\x20first');const a2=getCapability(a1);if(!a2)throw new Error('\x27'+a1+'\x27\x20is\x20not\x20a\x20registered\x20capability\x20—\x20list\x20ids\x20via\x20action=\x27capability_list\x27\x20'+('(available:\x20'+ALL_CAPABILITIES['map'](a3=>a3['id'])['join'](',\x20')+')'));c={'action':'capability_get','capability':{'id':a2['id'],'name':a2['name'],'group':a2['group'],'description':a2['description'],'source':a2['source'],'object_types':a2['objectTypes'],'intent':a2['intent'],'binds':a2['binds'],'requires':a2['requires'],'excludes':a2['excludes'],'provides':a2['provides'],'params':a2['params'],'risks':a2['risks'],'disclosures':a2['disclosures'],'cost':a2['cost'],'required_constraints':a2['requiredConstraints'],'evaluation_impact':a2['evaluationImpact'],'industry_fit':a2['industryFit'],'user_protections':a2['userProtections'],'merchant_obligations':a2['merchantObligations'],'requires_keeper':a2['requiresKeeper'],'keeper_hint':a2['keeperHint']}};break;}case'compose_probe':{const a3=b['capabilities']??[];if(a3['length']===0x0)throw new Error('\x27capabilities\x27\x20is\x20required\x20for\x20action=\x27compose_probe\x27\x20—\x20the\x20selection\x20to\x20probe\x20'+'(list\x20ids\x20via\x20action=\x27capability_list\x27)');c={'action':'compose_probe',...composeProbe(a3,b['template']?{'baseTemplate':b['template']}:undefined)};break;}case'product_cards':{const a4=b['name']?.['trim'](),a5=productCards(a4);c={'action':'product_cards','industry':a4??'all','total':a5['length'],'cards':a5};break;}case'product_card':{const a6=b['template']??b['capabilities']?.[0x0];if(!a6)throw new Error('pass\x20the\x20template\x20id\x20in\x20\x27template\x27\x20for\x20action=\x27product_card\x27\x20—\x20'+'list\x20ids\x20via\x20action=\x27product_cards\x27\x20(or\x20benchmark_migration_operation\x20template_list)');c={'action':'product_card',...productCard(a6)};break;}case'diff':{if(!b['name'])throw new Error('\x27name\x27\x20is\x20required\x20for\x20action=\x27diff\x27');c={'action':'diff',...diffIndustryPack(b['name'])};break;}case'reset':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27reset\x27');assertTemplateWriteAuthorized('reset',[b['path']],b['authorize']);const a7=resetIndustryPath(b['path']);c={'action':'reset','ok':a7['ok'],'layout':a7['layout'],'target':a7['target'],'restored_files':a7['restored_files'],'errors':a7['errors']},rescanAffectedPack(b['path']);break;}case'delete_file':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27delete_file\x27');assertTemplateWriteAuthorized('delete_file',[b['path']],b['authorize']);const a8=resolveIndustryPath(b['path']);if(!existsSync(a8))throw new Error('file\x20not\x20found:\x20'+b['path']);rmSync(a8,{'recursive':!![],'force':!![]}),c={'action':'delete_file','path':a8,'ok':!![]},rescanAffectedPack(b['path']);break;}case'create_file':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27create_file\x27');const a9=resolveIndustryPath(b['path']);if(existsSync(a9))throw new Error('file\x20already\x20exists:\x20'+b['path']);if(b['content']!==undefined)assertBaselinesContentValid(b['path'],b['content']);mkdirSync(dirname(a9),{'recursive':!![]}),writeFileSync(a9,b['content']??'','utf-8'),c={'action':'create_file','path':a9,'ok':!![]},rescanAffectedPack(b['path']);break;}case'create_dir':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27create_dir\x27');const aa=resolveIndustryPath(b['path']);mkdirSync(aa,{'recursive':!![]}),c={'action':'create_dir','path':aa,'ok':!![]},rescanAffectedPack(b['path']);break;}case'copy':{if(!b['from'])throw new Error('\x27from\x27\x20is\x20required\x20for\x20action=\x27copy\x27');if(!b['to'])throw new Error('\x27to\x27\x20is\x20required\x20for\x20action=\x27copy\x27');const ab=resolveIndustryPath(b['from']);let ac=resolveIndustryPath(b['to']);if(!existsSync(ab))throw new Error('source\x20not\x20found:\x20'+b['from']);try{existsSync(ac)&&statSync(ac)['isDirectory']()&&(ac=join(ac,basename(ab)));}catch{}if(ac===ab)throw new Error('\x27copy\x27\x20cannot\x20copy\x20a\x20file\x20onto\x20itself');existsSync(ac)&&isTemplateTreePath(b['to'])&&assertTemplateWriteAuthorized('copy',[b['to']],b['authorize']);mkdirSync(dirname(ac),{'recursive':!![]}),cpSync(ab,ac,{'recursive':!![],'force':!![]}),c={'action':'copy','from':ab,'to':ac,'ok':!![]},rescanAffectedPack(b['to']);break;}case'move':case'rename':{if(!b['from'])throw new Error('\x27from\x27\x20is\x20required\x20for\x20action=\x27'+b['action']+'\x27');if(!b['to'])throw new Error('\x27to\x27\x20is\x20required\x20for\x20action=\x27'+b['action']+'\x27');assertTemplateWriteAuthorized(b['action'],[b['from'],b['to']],b['authorize']);const ad=resolveIndustryPath(b['from']);let ae=resolveIndustryPath(b['to']);if(!existsSync(ad))throw new Error('source\x20not\x20found:\x20'+b['from']);try{existsSync(ae)&&statSync(ae)['isDirectory']()&&(ae=join(ae,basename(ad)));}catch{}if(ae===ad)throw new Error('\x27'+b['action']+'\x27\x20cannot\x20move\x20onto\x20itself');mkdirSync(dirname(ae),{'recursive':!![]}),renameSync(ad,ae),c={'action':b['action'],'from':ad,'to':ae,'ok':!![]},rescanAffectedPack(b['from']),rescanAffectedPack(b['to']);break;}case'recommend_industry':c=await handleRecommendIndustry(b);break;case'list_modes':c=await handleListModes();break;case'derive_user_mode':c=await handleDeriveUserMode(b);break;case'evolve_user_mode':c=await handleEvolveUserMode(b);break;case'register_user_mode':c=await handleRegisterUserMode(b);break;case'unregister_user_mode':c=await handleUnregisterUserMode(b);break;case'register_custom_metric':c=await handleRegisterCustomMetric(b);break;case'unregister_custom_metric':c=await handleUnregisterCustomMetric(b);break;case'register_custom_constraint':c=await handleRegisterCustomConstraint(b);break;case'unregister_custom_constraint':c=await handleUnregisterCustomConstraint(b);break;case'list_metrics_constraints':c=await handleListMetricsConstraints(b);break;default:throw new Error('Unknown\x20industry_pack_operation\x20action:\x20'+String(b['action']));}return{'content':[{'type':'text','text':JSON['stringify']({'result':c})}],'structuredContent':{'result':c}};}
@@ -1 +1 @@
1
- import{strictParse,MessengerOperationInputSchema}from'../../schema/index.js';import{watch_conversations,send_message,send_file,watch_messages,export_attachment,pull_messages,generate_wts,verify_wts,sign_wts,wts2html,proof_message,mark_messages_as_viewed,mark_conversation_as_viewed,blacklist,friendslist,guardlist,settings,LocalInfo,GetAccountOrMark_Address,Config}from'@wowok/wowok';import{classifyError,buildDataSemantic}from'../../schema/call/semantic.js';import{classifyCommunicationEvidence}from'../../communication/evidence.js';import{pageMessagesBySeq,recordConversationRead,getConversationReadReceipt}from'../../communication/message-cursors.js';import{noteProofIssued}from'../../communication/proof-reuse.js';import{isModuleLoadError,noteRuntimeModuleFault}from'../runtime-health.js';import{attestWtsFile,evaluateWtsSealedAvailability}from'../../communication/wts-attestation.js';import{goalEngine}from'../../goal/GoalEngine.js';export function normalizeAccountOrMark(a){if(typeof a==='string')return{'name_or_address':a,'local_mark_first':!![]};return a;}export function normalizeOptionalAccountOrMark(a){if(a===undefined||a===null)return undefined;return normalizeAccountOrMark(a);}export function normalizeManyAccountOrMark(a){if(a===undefined||a===null)return undefined;if(Array['isArray'](a))return{'entities':a['map'](b=>typeof b==='string'?{'name_or_address':b,'local_mark_first':!![]}:b),'check_all_founded':!![]};return a;}function communicationEvidencePayload(a,b){const c=b??{};switch(a){case'send_message':case'send_file':{const d=typeof c['messageId']==='string'?c['messageId']:undefined;return{'detail':d?'message\x20'+d:'message\x20sent','data':d?{'message_id':d}:{}};}case'send_required_info':{const e=typeof c['messageId']==='string'?c['messageId']:undefined,f=Array['isArray'](c['sent_fields'])?c['sent_fields']:undefined;return{'detail':'required-info\x20confirmation\x20sent','data':{...e?{'message_id':e}:{},...f?{'sent_fields':f}:{}}};}case'generate_wts':{const g=typeof c['totalMessageCount']==='number'?c['totalMessageCount']:undefined,h=Array['isArray'](c['files'])?c['files']:undefined,i=Array['isArray'](c['htmlFiles'])?c['htmlFiles']:undefined;return{'detail':'WTS\x20evidence\x20packet\x20generated','data':{...g!==undefined?{'message_count':g}:{},...h?{'files':h}:{},...i?{'html_reports':i}:{}}};}case'verify_wts':{const j=c['attestation'],k=typeof c['error']==='string'?c['error']:undefined;return{'detail':j?'WTS\x20verification\x20—\x20'+j['attested_count']+'/'+j['total_messages']+'\x20message(s)\x20server-attested':'WTS\x20verification\x20—\x20server\x20attestation\x20unavailable','data':{'valid':c['valid']===!![],'hash_valid':c['hashValid']===!![],'has_signature':c['hasSignature']===!![],...c['signatureValid']===undefined?{}:{'packet_signature_valid':c['signatureValid']===!![]},...k?{'error':k}:{},...j?{'attested_messages':j['attested_count'],'total_messages':j['total_messages'],'fully_attested':j['fully_attested'],'packet_signed':j['packet_signed'],'server_public_keys':j['server_public_keys'],'verdict':j['verdict']}:{'attestation':'unavailable\x20—\x20cross-check\x20the\x20seal\x20signer\x20and\x20server\x20keys\x20independently\x20before\x20treating\x20the\x20packet\x20as\x20third-party\x20evidence'}}};}case'sign_wts':{return{'detail':typeof b==='string'?b:'WTS\x20evidence\x20signed','data':{}};}case'proof_message':{const l=typeof c['proofAddress']==='string'?c['proofAddress']:undefined;return{'detail':l?'proof\x20'+l:'message\x20proofed\x20on-chain','data':l?{'proof_address':l}:{}};}default:return{'detail':a,'data':{}};}}export function throwIfTransportAmbiguous(a,b){const c=b instanceof Error?b['message']:String(b);if(/timeout|timed out|ETIMEDOUT|ECONNRESET|ECONNREFUSED|EAI_AGAIN|socket\s+hang\s+up|connection\s+(refused|reset|lost)|fetch\s+failed|unexpected\s+status\s+code:\s*5\d\d/i['test'](c))throw new Error('messenger\x20delivery\x20state\x20UNKNOWN\x20on\x20'+a+':\x20the\x20transport\x20failed\x20AFTER\x20submission\x20('+c+')\x20—\x20'+'the\x20relay\x20may\x20have\x20already\x20committed\x20the\x20message\x20despite\x20the\x20client-side\x20failure.\x20'+'Do\x20NOT\x20re-send\x20blindly:\x20first\x20check\x20the\x20conversation\x20(watch_conversations\x20/\x20read\x20messages)\x20'+'for\x20the\x20same\x20payload;\x20re-send\x20only\x20after\x20confirming\x20it\x20never\x20arrived.\x20A\x20blind\x20re-send\x20DOUBLE-DELIVERS.');throw b instanceof Error?b:new Error(c);}const LOCAL_SCAN_PAGE_SIZE=0x3e8,LOCAL_SCAN_MAX_PAGES=0xa;async function scanConversationMessages(a,b){const c=[];let d=0x0;for(let e=0x0;e<LOCAL_SCAN_MAX_PAGES;e++){const f=await watch_messages({'account':a,'peerAddress':b,'sortOrder':'desc','skipAutoMarkViewed':!![],'limit':LOCAL_SCAN_PAGE_SIZE,'offset':d});c['push'](...f);if(f['length']<LOCAL_SCAN_PAGE_SIZE)return{'messages':c,'truncated':![]};d+=LOCAL_SCAN_PAGE_SIZE;}return{'messages':c,'truncated':!![]};}async function resolveMessengerAddress(a,b){try{const d=await GetAccountOrMark_Address(a);if(typeof d==='string'&&d['length']>0x0)return d;}catch{}const c=typeof a==='string'?a:a?.['name_or_address'];if(typeof c==='string'&&c['length']>0x0)return c;throw new Error(b+'\x20could\x20not\x20be\x20resolved\x20to\x20a\x20messenger\x20account\x20address');}export async function handleMessengerOperation(a){let b;try{b=strictParse(MessengerOperationInputSchema,a,'messenger_operation\x20input');const c=b['operation'];let d;switch(b['operation']){case'watch_conversations':{const h=await watch_conversations(b['filter']);d={'operation':'watch_conversations','result':h};break;}case'send_message':{let i;try{i=await send_message(normalizeOptionalAccountOrMark(b['from']),normalizeAccountOrMark(b['to']),b['content'],b['options']);}catch(l){throwIfTransportAmbiguous('send_message',l);}if(i['authRequired']){d={'operation':'send_message','result':i};break;}const j=i,k={...j,'merkleData':j['merkleData']?{'leafIndex':j['merkleData']['leafIndex'],'prevRoot':j['merkleData']['prevRoot'],'newRoot':j['merkleData']['newRoot'],'serverSignature':j['merkleData']['serverSignature'],'serverTimestamp':j['merkleData']['serverTimestamp'],'serverPublicKey':j['merkleData']['serverPublicKey']}:undefined};d={'operation':'send_message','result':k};break;}case'send_file':{let m;try{m=await send_file(normalizeOptionalAccountOrMark(b['from']),normalizeAccountOrMark(b['to']),b['filePath'],b['options']);}catch(p){throwIfTransportAmbiguous('send_file',p);}const n=m,o={...n,'merkleData':n['merkleData']?{'leafIndex':n['merkleData']['leafIndex'],'prevRoot':n['merkleData']['prevRoot'],'newRoot':n['merkleData']['newRoot'],'serverSignature':n['merkleData']['serverSignature'],'serverTimestamp':n['merkleData']['serverTimestamp'],'serverPublicKey':n['merkleData']['serverPublicKey']}:undefined};d={'operation':'send_file','result':o};break;}case'send_required_info':{let q=b['content'];const r=[];if(!q){const v=await GetAccountOrMark_Address(b['from']),w=await LocalInfo['Instance']()['list'](undefined,v),x=b['fields'],y=x&&x['length']>0x0?w['filter'](z=>x['includes'](z['name'])):w;if(y['length']===0x0)throw new Error('No\x20LocalInfo\x20fields\x20available.\x20Add\x20private\x20info\x20first\x20via\x20local_info_operation.');q=y['map'](z=>z['name']+':\x20'+z['default'])['join']('\x0a'),r['push'](...y['map'](z=>z['name']));}const s=await send_message(normalizeOptionalAccountOrMark(b['from']),normalizeAccountOrMark(b['to']),q,b['options']),t=s,u={...t,'merkleData':t['merkleData']?{'leafIndex':t['merkleData']['leafIndex'],'prevRoot':t['merkleData']['prevRoot'],'newRoot':t['merkleData']['newRoot'],'serverSignature':t['merkleData']['serverSignature'],'serverTimestamp':t['merkleData']['serverTimestamp'],'serverPublicKey':t['merkleData']['serverPublicKey']}:undefined,'sent_fields':r};d={'operation':'send_required_info','result':u};break;}case'watch_messages':{const z=b['filter']?{...b['filter'],'peerAddress':b['filter']['peerAddress']?normalizeAccountOrMark(b['filter']['peerAddress']):undefined,'account':b['filter']['account']?normalizeOptionalAccountOrMark(b['filter']['account']):undefined}:undefined,A=await watch_messages(z);d={'operation':'watch_messages','result':A};break;}case'save_attachment':{const B=await export_attachment(normalizeOptionalAccountOrMark(b['account']),b['messageId'],{'outputDir':b['outputDir'],'saveAs':b['saveAs']});d={'operation':'save_attachment','result':B};break;}case'generate_wts':{const C=b['params']?{...b['params'],'peerAccount':normalizeAccountOrMark(b['params']['peerAccount']),'myAccount':normalizeOptionalAccountOrMark(b['params']['myAccount'])}:undefined,D=await generate_wts(C);let E={'sealed_available':null,'sealed_available_note':null};try{const F=D?.['files'],G=Array['isArray'](F)&&typeof F[0x0]==='string'&&F[0x0]?F[0x0]:undefined;G?E=evaluateWtsSealedAvailability(await verify_wts(G)):E={'sealed_available':null,'sealed_available_note':'Evidence-tier\x20pre-check\x20UNVERIFIED:\x20no\x20packet\x20file\x20was\x20returned\x20to\x20probe\x20—\x20the\x20third-party-verifiable\x20tier\x20is\x20UNKNOWN;\x20run\x20sign_wts\x20then\x20verify_wts\x20and\x20read\x20serverKeysOfficial/serverKeyAnchor\x20there.'};}catch{E={'sealed_available':null,'sealed_available_note':'Evidence-tier\x20pre-check\x20UNVERIFIED:\x20the\x20anchor\x20probe\x20failed\x20(the\x20key\x20book\x20or\x20chain\x20was\x20unreachable)\x20—\x20the\x20WTS\x20itself\x20was\x20generated\x20normally;\x20treat\x20the\x20third-party-verifiable\x20tier\x20as\x20UNKNOWN\x20and\x20re-probe\x20with\x20verify_wts\x20after\x20sign_wts.'};}d={'operation':'generate_wts','result':{...D??{},'sealed_available':E['sealed_available'],'sealed_available_note':E['sealed_available_note']}};break;}case'verify_wts':{const H=await verify_wts(b['wtsFilePath']),I=H?.['valid']===![]?'A\x20packet\x20generated\x20by\x20generate_wts\x20is\x20UNSEALED\x20(no\x20meta.signature)\x20and\x20always\x20fails\x20verification\x20—\x20run\x20sign_wts\x20on\x20this\x20file\x20first,\x20then\x20verify_wts\x20the\x20SIGNED\x20output.':undefined,J=await attestWtsFile(b['wtsFilePath']);let K;if(H?.['serverKeysOfficial']===!![]){const L=H?.['serverKeysOfficialNetwork'],M=H?.['serverKeyAnchor']?.['network'],N=[];if(L){let O;try{O=String(await Config['Instance']()['network_get']());}catch{}O&&O!==L&&N['push']('NETWORK\x20MISMATCH:\x20official-key\x20verification\x20scored\x20in\x20the\x20\x27'+L+'\x27\x20key\x20partition,\x20but\x20this\x20call\x20was\x20served\x20on\x20network\x20\x27'+O+'\x27.\x20'+('The\x20verdict\x20is\x20evidence\x20for\x20\x27'+L+'\x27\x20only\x20—\x20quote\x20this\x20transcript\x20with\x20its\x20partition\x20stated,\x20or\x20switch\x20env.network\x20to\x20\x27'+L+'\x27\x20and\x20re-verify.')),L!=='mainnet'&&N['push']('PARTITION\x20RULE:\x20this\x20official\x20verdict\x20is\x20bound\x20to\x20the\x20\x27'+L+'\x27\x20partition\x20(anchor\x20network:\x20'+(M??L)+').\x20'+'For\x20a\x20MAINNET\x20case\x20the\x20ONLY\x20network-level\x20truth\x20is\x20an\x20on-chain\x20Proof\x20anchor\x20—\x20a\x20proof_message\x20re-anchored\x20on\x20mainnet.\x20'+'A\x20file-level\x20official\x20verdict\x20from\x20a\x20non-mainnet\x20partition\x20is\x20rehearsal\x20evidence\x20and\x20can\x20never\x20ground\x20a\x20mainnet\x20ruling.');}if(N['length']>0x0)K=N['join']('\x20');}d={'operation':'verify_wts','result':J?{...H,...I?{'hint':I}:{},...K?{'network_caveat':K}:{},'attestation':J}:{...H,...I?{'hint':I}:{},...K?{'network_caveat':K}:{},'attestation_unavailable':'Per-message\x20server\x20attestation\x20could\x20not\x20be\x20computed\x20(file\x20not\x20readable\x20locally\x20or\x20not\x20JSON).\x20The\x20guarded\x20verifier\x27s\x20valid\x20flag\x20already\x20required\x20server\x20attestation\x20+\x20seal;\x20cross-check\x20the\x20seal\x20signer\x20and\x20server\x20keys\x20yourself\x20before\x20treating\x20it\x20as\x20third-party\x20evidence.'}};break;}case'sign_wts':{const P=await sign_wts(b['wtsFilePath'],normalizeOptionalAccountOrMark(b['account']),b['outputPath']);d={'operation':'sign_wts','result':P};break;}case'wts2html':{const Q=await wts2html(b['wtsPath'],b['options']);d={'operation':'wts2html','result':Q};break;}case'proof_message':{let R;try{R=await proof_message(normalizeOptionalAccountOrMark(b['account']),b['messageId'],b['network']);}catch(T){if(isModuleLoadError(T)){const U=noteRuntimeModuleFault('proof_message',T);throw new Error('SDK\x20runtime\x20is\x20stale\x20in\x20this\x20process:\x20the\x20loaded\x20module\x20graph\x20references\x20chunk\x20\x22'+U['module']+'\x22\x20'+'which\x20no\x20longer\x20exists\x20on\x20disk\x20(the\x20SDK\x20dist\x20was\x20rebuilt\x20after\x20this\x20MCP\x20process\x20started).\x20'+'Restart\x20the\x20MCP\x20server\x20to\x20reload\x20the\x20rebuilt\x20dist;\x20this\x20operation\x20cannot\x20succeed\x20until\x20then.');}throw T;}const S=R?.['proofAddress'];if(typeof S==='string')noteProofIssued(S);d={'operation':'proof_message','result':R};break;}case'blacklist':{const V={'account':normalizeOptionalAccountOrMark(b['account']),'op':b['blacklist']['op']};'users'in b['blacklist']&&(V['users']=normalizeManyAccountOrMark(b['blacklist']['users']));const W=await blacklist(V);d={'operation':'blacklist','op':b['blacklist']['op'],'result':W['result']};break;}case'friendslist':{const X={'account':normalizeOptionalAccountOrMark(b['account']),'op':b['friendslist']['op']};'users'in b['friendslist']&&(X['users']=normalizeManyAccountOrMark(b['friendslist']['users']));const Y=await friendslist(X);d={'operation':'friendslist','op':b['friendslist']['op'],'result':Y['result']};break;}case'guardlist':{const Z=await guardlist({'account':normalizeOptionalAccountOrMark(b['account']),...b['guardlist']});d={'operation':'guardlist','op':b['guardlist']['op'],'result':Z['result']};break;}case'settings':{const a0=await settings({'account':normalizeOptionalAccountOrMark(b['account']),...b['settings']});d={'operation':'settings','op':b['settings']['op'],'result':a0['result']};break;}case'mark_messages_as_viewed':{const a1=await mark_messages_as_viewed(b['messageIds'],normalizeOptionalAccountOrMark(b['account']));d={'operation':'mark_messages_as_viewed','result':a1};break;}case'mark_conversation_as_viewed':{const a2=await mark_conversation_as_viewed(normalizeAccountOrMark(b['peerAddress']),normalizeOptionalAccountOrMark(b['account']));d={'operation':'mark_conversation_as_viewed','result':a2};break;}case'mark_conversation_read':{const a3=await resolveMessengerAddress(b['account'],'mark_conversation_read.account'),a4=await resolveMessengerAddress(b['peerAddress'],'mark_conversation_read.peerAddress'),a5=await scanConversationMessages(a3,normalizeAccountOrMark(b['peerAddress'])),a6=a5['messages']['filter'](ad=>ad['direction']==='received'&&typeof ad['leafIndex']==='number')['map'](ad=>ad['leafIndex']),a7=a6['length']>0x0?Math['max'](...a6):null,a8=typeof b['through_seq']==='number'?b['through_seq']:null;let a9=a8??a7,aa=![];a9!==null&&(a7===null||a9>a7)&&(a9=a7,aa=!![]);const ab=await mark_conversation_as_viewed(normalizeAccountOrMark(b['peerAddress']),normalizeOptionalAccountOrMark(b['account'])),ac=recordConversationRead(a3,a4,a9);d={'operation':'mark_conversation_read','result':{...ac,'marked_count':ab,'capped':aa,'requested_through_seq':a8}};break;}case'pull_messages':{if(b['after']!==undefined){if(b['allAccounts']||b['accounts']?.['length'])throw new Error('pull_messages.after\x20is\x20conversation-scoped\x20and\x20cannot\x20be\x20combined\x20with\x20allAccounts/accounts\x20fan-out\x20—\x20call\x20it\x20once\x20per\x20account\x20and\x20conversation.');if(!b['peerAddress'])throw new Error('pull_messages.after\x20requires\x20peerAddress:\x20the\x20message\x20sequence\x20(leafIndex)\x20is\x20per\x20conversation,\x20so\x20an\x20incremental\x20cursor\x20must\x20name\x20the\x20conversation.\x20Omit\x20`after`\x20for\x20the\x20legacy\x20bare-array\x20pull.');const ae=await resolveMessengerAddress(b['account'],'pull_messages.account'),af=await resolveMessengerAddress(b['peerAddress'],'pull_messages.peerAddress'),ag=typeof b['limit']==='number'?b['limit']:0x32,ah=[];try{await pull_messages(normalizeOptionalAccountOrMark(b['account']),b['limit']);}catch(al){const am=al instanceof Error?al['message']:String(al);ah['push']('server\x20refresh\x20failed,\x20so\x20this\x20page\x20is\x20served\x20from\x20the\x20local\x20store\x20only\x20('+am+')');}const ai=await scanConversationMessages(ae,normalizeAccountOrMark(b['peerAddress'])),aj=pageMessagesBySeq(ai['messages'],b['after'],ag,{'scanTruncated':ai['truncated']}),ak=[...ah,...aj['degraded_reasons']];d={'operation':'pull_messages','result':{'mode':'incremental','account':ae,'peer':af,'after':aj['after'],'messages':aj['messages'],'highest_seq':aj['highest_seq'],'latest_seq':aj['latest_seq'],'has_more':aj['has_more'],'gap':aj['gap'],'degraded':ak['length']>0x0,'degraded_reasons':ak,'read_receipt':getConversationReadReceipt(ae,af)}};break;}const ad=await pull_messages(normalizeOptionalAccountOrMark(b['account']),b['limit'],{'allAccounts':b['allAccounts'],'accounts':b['accounts']?.['map'](an=>normalizeAccountOrMark(an)),'concurrency':b['concurrency']});d={'operation':'pull_messages','result':ad};break;}default:throw new Error('Unknown\x20messenger\x20operation:\x20'+c);}const f=classifyCommunicationEvidence(c),g=b['goal_id'];if(f&&g){const an=d['result'],{detail:ao,data:ap}=communicationEvidencePayload(c,an);await goalEngine['recordCommunicationEvidence'](g,{'operation':c,'kind':f['kind'],'title':f['title'],'detail':ao,'data':ap},b['network']??'default');}return{'content':[{'type':'text','text':JSON['stringify'](d)}],'structuredContent':{'result':d}};}catch(aq){const ar=aq instanceof Error?aq['message']:String(aq),as=b?{'operation_type':'messenger_'+b['operation'],'data':b}:undefined,at=classifyError(ar),au={'operation':'error','error':ar};if(at['error_code']!==undefined)au['error_code']=at['error_code'];if(at['retryable']!==undefined)au['retryable']=at['retryable'];if(at['recovery_hint']!==undefined)au['recovery_hint']=at['recovery_hint'];return{'content':[{'type':'text','text':'Error:\x20'+ar}],'structuredContent':{'result':au,'semantic':buildDataSemantic(undefined,as,!![],ar)}};}}
1
+ import{strictParse,MessengerOperationInputSchema}from'../../schema/index.js';import{watch_conversations,send_message,send_file,watch_messages,export_attachment,pull_messages,generate_wts,verify_wts,sign_wts,wts2html,proof_message,mark_messages_as_viewed,mark_conversation_as_viewed,blacklist,friendslist,guardlist,settings,LocalInfo,GetAccountOrMark_Address,Config}from'@wowok/wowok';import{classifyError,buildDataSemantic}from'../../schema/call/semantic.js';import{classifyCommunicationEvidence}from'../../communication/evidence.js';import{pageMessagesBySeq,recordConversationRead,getConversationReadReceipt}from'../../communication/message-cursors.js';import{noteProofIssued}from'../../communication/proof-reuse.js';import{isModuleLoadError,noteRuntimeModuleFault}from'../runtime-health.js';import{attestWtsFile,evaluateWtsSealedAvailability}from'../../communication/wts-attestation.js';import{goalEngine}from'../../goal/GoalEngine.js';export function normalizeAccountOrMark(a){if(typeof a==='string')return{'name_or_address':a,'local_mark_first':!![]};return a;}export function normalizeOptionalAccountOrMark(a){if(a===undefined||a===null)return undefined;return normalizeAccountOrMark(a);}export function normalizeManyAccountOrMark(a){if(a===undefined||a===null)return undefined;if(Array['isArray'](a))return{'entities':a['map'](b=>typeof b==='string'?{'name_or_address':b,'local_mark_first':!![]}:b),'check_all_founded':!![]};return a;}function communicationEvidencePayload(a,b){const c=b??{};switch(a){case'send_message':case'send_file':{const d=typeof c['messageId']==='string'?c['messageId']:undefined;return{'detail':d?'message\x20'+d:'message\x20sent','data':d?{'message_id':d}:{}};}case'send_required_info':{const e=typeof c['messageId']==='string'?c['messageId']:undefined,f=Array['isArray'](c['sent_fields'])?c['sent_fields']:undefined;return{'detail':'required-info\x20confirmation\x20sent','data':{...e?{'message_id':e}:{},...f?{'sent_fields':f}:{}}};}case'generate_wts':{const g=typeof c['totalMessageCount']==='number'?c['totalMessageCount']:undefined,h=Array['isArray'](c['files'])?c['files']:undefined,i=Array['isArray'](c['htmlFiles'])?c['htmlFiles']:undefined;return{'detail':'WTS\x20evidence\x20packet\x20generated','data':{...g!==undefined?{'message_count':g}:{},...h?{'files':h}:{},...i?{'html_reports':i}:{}}};}case'verify_wts':{const j=c['attestation'],k=typeof c['error']==='string'?c['error']:undefined;return{'detail':j?'WTS\x20verification\x20—\x20'+j['attested_count']+'/'+j['total_messages']+'\x20message(s)\x20server-attested':'WTS\x20verification\x20—\x20server\x20attestation\x20unavailable','data':{'valid':c['valid']===!![],'hash_valid':c['hashValid']===!![],'has_signature':c['hasSignature']===!![],...c['signatureValid']===undefined?{}:{'packet_signature_valid':c['signatureValid']===!![]},...k?{'error':k}:{},...j?{'attested_messages':j['attested_count'],'total_messages':j['total_messages'],'fully_attested':j['fully_attested'],'packet_signed':j['packet_signed'],'server_public_keys':j['server_public_keys'],'verdict':j['verdict']}:{'attestation':'unavailable\x20—\x20cross-check\x20the\x20seal\x20signer\x20and\x20server\x20keys\x20independently\x20before\x20treating\x20the\x20packet\x20as\x20third-party\x20evidence'}}};}case'sign_wts':{return{'detail':typeof b==='string'?b:'WTS\x20evidence\x20signed','data':{}};}case'proof_message':{const l=typeof c['proofAddress']==='string'?c['proofAddress']:undefined;return{'detail':l?'proof\x20'+l:'message\x20proofed\x20on-chain','data':l?{'proof_address':l}:{}};}default:return{'detail':a,'data':{}};}}export function throwIfTransportAmbiguous(a,b){const c=b instanceof Error?b['message']:String(b);if(/timeout|timed out|ETIMEDOUT|ECONNRESET|ECONNREFUSED|EAI_AGAIN|socket\s+hang\s+up|connection\s+(refused|reset|lost)|fetch\s+failed|unexpected\s+status\s+code:\s*5\d\d/i['test'](c))throw new Error('messenger\x20delivery\x20state\x20UNKNOWN\x20on\x20'+a+':\x20the\x20transport\x20failed\x20AFTER\x20submission\x20('+c+')\x20—\x20'+'the\x20relay\x20may\x20have\x20already\x20committed\x20the\x20message\x20despite\x20the\x20client-side\x20failure.\x20'+'Do\x20NOT\x20re-send\x20blindly:\x20first\x20check\x20the\x20conversation\x20(watch_conversations\x20/\x20read\x20messages)\x20'+'for\x20the\x20same\x20payload;\x20re-send\x20only\x20after\x20confirming\x20it\x20never\x20arrived.\x20A\x20blind\x20re-send\x20DOUBLE-DELIVERS.');throw b instanceof Error?b:new Error(c);}const LOCAL_SCAN_PAGE_SIZE=0x3e8,LOCAL_SCAN_MAX_PAGES=0xa;async function scanConversationMessages(a,b){const c=[];let d=0x0;for(let e=0x0;e<LOCAL_SCAN_MAX_PAGES;e++){const f=await watch_messages({'account':a,'peerAddress':b,'sortOrder':'desc','skipAutoMarkViewed':!![],'limit':LOCAL_SCAN_PAGE_SIZE,'offset':d});c['push'](...f);if(f['length']<LOCAL_SCAN_PAGE_SIZE)return{'messages':c,'truncated':![]};d+=LOCAL_SCAN_PAGE_SIZE;}return{'messages':c,'truncated':!![]};}async function resolveMessengerAddress(a,b){try{const d=await GetAccountOrMark_Address(a);if(typeof d==='string'&&d['length']>0x0)return d;}catch{}const c=typeof a==='string'?a:a?.['name_or_address'];if(typeof c==='string'&&c['length']>0x0)return c;throw new Error(b+'\x20could\x20not\x20be\x20resolved\x20to\x20a\x20messenger\x20account\x20address');}export async function handleMessengerOperation(a){let b;try{b=strictParse(MessengerOperationInputSchema,a,'messenger_operation\x20input');const c=b['operation'];let d,f;switch(b['operation']){case'watch_conversations':{const i=await watch_conversations(b['filter']);d={'operation':'watch_conversations','result':i};break;}case'send_message':{let j;try{j=await send_message(normalizeOptionalAccountOrMark(b['from']),normalizeAccountOrMark(b['to']),b['content'],b['options']);}catch(m){throwIfTransportAmbiguous('send_message',m);}if(j['authRequired']){d={'operation':'send_message','result':j};break;}const k=j,l={...k,'merkleData':k['merkleData']?{'leafIndex':k['merkleData']['leafIndex'],'prevRoot':k['merkleData']['prevRoot'],'newRoot':k['merkleData']['newRoot'],'serverSignature':k['merkleData']['serverSignature'],'serverTimestamp':k['merkleData']['serverTimestamp'],'serverPublicKey':k['merkleData']['serverPublicKey']}:undefined};d={'operation':'send_message','result':l};break;}case'send_file':{let n;try{n=await send_file(normalizeOptionalAccountOrMark(b['from']),normalizeAccountOrMark(b['to']),b['filePath'],b['options']);}catch(q){throwIfTransportAmbiguous('send_file',q);}const o=n,p={...o,'merkleData':o['merkleData']?{'leafIndex':o['merkleData']['leafIndex'],'prevRoot':o['merkleData']['prevRoot'],'newRoot':o['merkleData']['newRoot'],'serverSignature':o['merkleData']['serverSignature'],'serverTimestamp':o['merkleData']['serverTimestamp'],'serverPublicKey':o['merkleData']['serverPublicKey']}:undefined};d={'operation':'send_file','result':p};break;}case'send_required_info':{let r=b['content'];const s=[];let t;if(!r){const x=await GetAccountOrMark_Address(b['from']),y=await LocalInfo['Instance']()['list'](undefined,x),z=b['fields'],A=z&&z['length']>0x0?y['filter'](B=>z['includes'](B['name'])):y;if(A['length']===0x0)throw new Error('No\x20LocalInfo\x20fields\x20available.\x20Add\x20private\x20info\x20first\x20via\x20local_info_operation.');r=A['map'](B=>B['name']+':\x20'+B['default'])['join']('\x0a'),s['push'](...A['map'](B=>B['name']));}else b['fields']&&b['fields']['length']>0x0&&(t=[...b['fields']]);const u=await send_message(normalizeOptionalAccountOrMark(b['from']),normalizeAccountOrMark(b['to']),r,b['options']),v=u,w={...v,'merkleData':v['merkleData']?{'leafIndex':v['merkleData']['leafIndex'],'prevRoot':v['merkleData']['prevRoot'],'newRoot':v['merkleData']['newRoot'],'serverSignature':v['merkleData']['serverSignature'],'serverTimestamp':v['merkleData']['serverTimestamp'],'serverPublicKey':v['merkleData']['serverPublicKey']}:undefined,...t?{'fields_ignored':t,'note':'content\x20took\x20precedence:\x20the\x20requested\x20LocalInfo\x20fields\x20listed\x20in\x20fields_ignored\x20were\x20NOT\x20assembled\x20and\x20NOT\x20sent\x20—\x20only\x20the\x20explicit\x20content\x20was\x20delivered.\x20To\x20send\x20the\x20LocalInfo\x20assembly\x20instead,\x20re-call\x20WITHOUT\x20content.'}:{},'sent_fields':s};d={'operation':'send_required_info','result':w};break;}case'watch_messages':{const B=b['filter']?{...b['filter'],'peerAddress':b['filter']['peerAddress']?normalizeAccountOrMark(b['filter']['peerAddress']):undefined,'account':b['filter']['account']?normalizeOptionalAccountOrMark(b['filter']['account']):undefined}:undefined,C=await watch_messages(B);d={'operation':'watch_messages','result':C};Array['isArray'](C)&&C['length']===0x0&&(f='watch_messages\x20returned\x200\x20messages:\x20it\x20reads\x20the\x20LOCAL\x20message\x20cache\x20only\x20and\x20never\x20contacts\x20the\x20'+'messenger\x20server,\x20so\x20messages\x20not\x20yet\x20pulled\x20are\x20invisible\x20here.\x20Run\x20pull_messages\x20for\x20this\x20'+'account/peer\x20first,\x20then\x20watch_messages\x20again.\x20(watch_messages\x20intentionally\x20never\x20advances\x20the\x20'+'pull\x20cursor\x20—\x20this\x20is\x20by\x20contract,\x20not\x20a\x20fault.)');break;}case'save_attachment':{const D=await export_attachment(normalizeOptionalAccountOrMark(b['account']),b['messageId'],{'outputDir':b['outputDir'],'saveAs':b['saveAs']});d={'operation':'save_attachment','result':D};break;}case'generate_wts':{const E=b['params']?{...b['params'],'peerAccount':normalizeAccountOrMark(b['params']['peerAccount']),'myAccount':normalizeOptionalAccountOrMark(b['params']['myAccount'])}:undefined,F=await generate_wts(E);let G={'sealed_available':null,'sealed_available_note':null};try{const H=F?.['files'],I=Array['isArray'](H)&&typeof H[0x0]==='string'&&H[0x0]?H[0x0]:undefined;I?G=evaluateWtsSealedAvailability(await verify_wts(I)):G={'sealed_available':null,'sealed_available_note':'Evidence-tier\x20pre-check\x20UNVERIFIED:\x20no\x20packet\x20file\x20was\x20returned\x20to\x20probe\x20—\x20the\x20third-party-verifiable\x20tier\x20is\x20UNKNOWN;\x20run\x20sign_wts\x20then\x20verify_wts\x20and\x20read\x20serverKeysOfficial/serverKeyAnchor\x20there.'};}catch{G={'sealed_available':null,'sealed_available_note':'Evidence-tier\x20pre-check\x20UNVERIFIED:\x20the\x20anchor\x20probe\x20failed\x20(the\x20key\x20book\x20or\x20chain\x20was\x20unreachable)\x20—\x20the\x20WTS\x20itself\x20was\x20generated\x20normally;\x20treat\x20the\x20third-party-verifiable\x20tier\x20as\x20UNKNOWN\x20and\x20re-probe\x20with\x20verify_wts\x20after\x20sign_wts.'};}d={'operation':'generate_wts','result':{...F??{},'sealed_available':G['sealed_available'],'sealed_available_note':G['sealed_available_note']}};break;}case'verify_wts':{const J=await verify_wts(b['wtsFilePath']),K=J?.['valid']===![]?'A\x20packet\x20generated\x20by\x20generate_wts\x20is\x20UNSEALED\x20(no\x20meta.signature)\x20and\x20always\x20fails\x20verification\x20—\x20run\x20sign_wts\x20on\x20this\x20file\x20first,\x20then\x20verify_wts\x20the\x20SIGNED\x20output.':undefined,L=await attestWtsFile(b['wtsFilePath']);let M;if(J?.['serverKeysOfficial']===!![]){const N=J?.['serverKeysOfficialNetwork'],O=J?.['serverKeyAnchor']?.['network'],P=[];if(N){let Q;try{Q=String(await Config['Instance']()['network_get']());}catch{}Q&&Q!==N&&P['push']('NETWORK\x20MISMATCH:\x20official-key\x20verification\x20scored\x20in\x20the\x20\x27'+N+'\x27\x20key\x20partition,\x20but\x20this\x20call\x20was\x20served\x20on\x20network\x20\x27'+Q+'\x27.\x20'+('The\x20verdict\x20is\x20evidence\x20for\x20\x27'+N+'\x27\x20only\x20—\x20quote\x20this\x20transcript\x20with\x20its\x20partition\x20stated,\x20or\x20switch\x20env.network\x20to\x20\x27'+N+'\x27\x20and\x20re-verify.')),N!=='mainnet'&&P['push']('PARTITION\x20RULE:\x20this\x20official\x20verdict\x20is\x20bound\x20to\x20the\x20\x27'+N+'\x27\x20partition\x20(anchor\x20network:\x20'+(O??N)+').\x20'+'For\x20a\x20MAINNET\x20case\x20the\x20ONLY\x20network-level\x20truth\x20is\x20an\x20on-chain\x20Proof\x20anchor\x20—\x20a\x20proof_message\x20re-anchored\x20on\x20mainnet.\x20'+'A\x20file-level\x20official\x20verdict\x20from\x20a\x20non-mainnet\x20partition\x20is\x20rehearsal\x20evidence\x20and\x20can\x20never\x20ground\x20a\x20mainnet\x20ruling.');}if(P['length']>0x0)M=P['join']('\x20');}d={'operation':'verify_wts','result':L?{...J,...K?{'hint':K}:{},...M?{'network_caveat':M}:{},'attestation':L}:{...J,...K?{'hint':K}:{},...M?{'network_caveat':M}:{},'attestation_unavailable':'Per-message\x20server\x20attestation\x20could\x20not\x20be\x20computed\x20(file\x20not\x20readable\x20locally\x20or\x20not\x20JSON).\x20The\x20guarded\x20verifier\x27s\x20valid\x20flag\x20already\x20required\x20server\x20attestation\x20+\x20seal;\x20cross-check\x20the\x20seal\x20signer\x20and\x20server\x20keys\x20yourself\x20before\x20treating\x20it\x20as\x20third-party\x20evidence.'}};break;}case'sign_wts':{const R=await sign_wts(b['wtsFilePath'],normalizeOptionalAccountOrMark(b['account']),b['outputPath']);d={'operation':'sign_wts','result':R};break;}case'wts2html':{const S=await wts2html(b['wtsPath'],b['options']);d={'operation':'wts2html','result':S};break;}case'proof_message':{let T;try{T=await proof_message(normalizeOptionalAccountOrMark(b['account']),b['messageId'],b['network']);}catch(V){if(isModuleLoadError(V)){const W=noteRuntimeModuleFault('proof_message',V);throw new Error('SDK\x20runtime\x20is\x20stale\x20in\x20this\x20process:\x20the\x20loaded\x20module\x20graph\x20references\x20chunk\x20\x22'+W['module']+'\x22\x20'+'which\x20no\x20longer\x20exists\x20on\x20disk\x20(the\x20SDK\x20dist\x20was\x20rebuilt\x20after\x20this\x20MCP\x20process\x20started).\x20'+'Restart\x20the\x20MCP\x20server\x20to\x20reload\x20the\x20rebuilt\x20dist;\x20this\x20operation\x20cannot\x20succeed\x20until\x20then.');}throw V;}const U=T?.['proofAddress'];if(typeof U==='string')noteProofIssued(U);d={'operation':'proof_message','result':T};break;}case'blacklist':{const X={'account':normalizeOptionalAccountOrMark(b['account']),'op':b['blacklist']['op']};'users'in b['blacklist']&&(X['users']=normalizeManyAccountOrMark(b['blacklist']['users']));const Y=await blacklist(X);d={'operation':'blacklist','op':b['blacklist']['op'],'result':Y['result']};break;}case'friendslist':{const Z={'account':normalizeOptionalAccountOrMark(b['account']),'op':b['friendslist']['op']};'users'in b['friendslist']&&(Z['users']=normalizeManyAccountOrMark(b['friendslist']['users']));const a0=await friendslist(Z);d={'operation':'friendslist','op':b['friendslist']['op'],'result':a0['result']};break;}case'guardlist':{const a1=await guardlist({'account':normalizeOptionalAccountOrMark(b['account']),...b['guardlist']});d={'operation':'guardlist','op':b['guardlist']['op'],'result':a1['result']};break;}case'settings':{const a2=await settings({'account':normalizeOptionalAccountOrMark(b['account']),...b['settings']});d={'operation':'settings','op':b['settings']['op'],'result':a2['result']};break;}case'mark_messages_as_viewed':{const a3=await mark_messages_as_viewed(b['messageIds'],normalizeOptionalAccountOrMark(b['account']));d={'operation':'mark_messages_as_viewed','result':a3};break;}case'mark_conversation_as_viewed':{const a4=await mark_conversation_as_viewed(normalizeAccountOrMark(b['peerAddress']),normalizeOptionalAccountOrMark(b['account']));d={'operation':'mark_conversation_as_viewed','result':a4};break;}case'mark_conversation_read':{const a5=await resolveMessengerAddress(b['account'],'mark_conversation_read.account'),a6=await resolveMessengerAddress(b['peerAddress'],'mark_conversation_read.peerAddress'),a7=await scanConversationMessages(a5,normalizeAccountOrMark(b['peerAddress'])),a8=a7['messages']['filter'](af=>af['direction']==='received'&&typeof af['leafIndex']==='number')['map'](af=>af['leafIndex']),a9=a8['length']>0x0?Math['max'](...a8):null,aa=typeof b['through_seq']==='number'?b['through_seq']:null;let ab=aa??a9,ac=![];ab!==null&&(a9===null||ab>a9)&&(ab=a9,ac=!![]);const ad=await mark_conversation_as_viewed(normalizeAccountOrMark(b['peerAddress']),normalizeOptionalAccountOrMark(b['account'])),ae=recordConversationRead(a5,a6,ab);d={'operation':'mark_conversation_read','result':{...ae,'marked_count':ad,'capped':ac,'requested_through_seq':aa}};break;}case'pull_messages':{if(b['after']!==undefined){if(b['allAccounts']||b['accounts']?.['length'])throw new Error('pull_messages.after\x20is\x20conversation-scoped\x20and\x20cannot\x20be\x20combined\x20with\x20allAccounts/accounts\x20fan-out\x20—\x20call\x20it\x20once\x20per\x20account\x20and\x20conversation.');if(!b['peerAddress'])throw new Error('pull_messages.after\x20requires\x20peerAddress:\x20the\x20message\x20sequence\x20(leafIndex)\x20is\x20per\x20conversation,\x20so\x20an\x20incremental\x20cursor\x20must\x20name\x20the\x20conversation.\x20Omit\x20`after`\x20for\x20the\x20legacy\x20bare-array\x20pull.');const ag=await resolveMessengerAddress(b['account'],'pull_messages.account'),ah=await resolveMessengerAddress(b['peerAddress'],'pull_messages.peerAddress'),ai=typeof b['limit']==='number'?b['limit']:0x32,aj=[];try{await pull_messages(normalizeOptionalAccountOrMark(b['account']),b['limit']);}catch(an){const ao=an instanceof Error?an['message']:String(an);aj['push']('server\x20refresh\x20failed,\x20so\x20this\x20page\x20is\x20served\x20from\x20the\x20local\x20store\x20only\x20('+ao+')');}const ak=await scanConversationMessages(ag,normalizeAccountOrMark(b['peerAddress'])),al=pageMessagesBySeq(ak['messages'],b['after'],ai,{'scanTruncated':ak['truncated']}),am=[...aj,...al['degraded_reasons']];d={'operation':'pull_messages','result':{'mode':'incremental','account':ag,'peer':ah,'after':al['after'],'messages':al['messages'],'highest_seq':al['highest_seq'],'latest_seq':al['latest_seq'],'has_more':al['has_more'],'gap':al['gap'],'degraded':am['length']>0x0,'degraded_reasons':am,'read_receipt':getConversationReadReceipt(ag,ah)}};break;}const af=await pull_messages(normalizeOptionalAccountOrMark(b['account']),b['limit'],{'allAccounts':b['allAccounts'],'accounts':b['accounts']?.['map'](ap=>normalizeAccountOrMark(ap)),'concurrency':b['concurrency']});d={'operation':'pull_messages','result':af};break;}default:throw new Error('Unknown\x20messenger\x20operation:\x20'+c);}const g=classifyCommunicationEvidence(c),h=b['goal_id'];if(g&&h){const ap=d['result'],{detail:aq,data:ar}=communicationEvidencePayload(c,ap);await goalEngine['recordCommunicationEvidence'](h,{'operation':c,'kind':g['kind'],'title':g['title'],'detail':aq,'data':ar},b['network']??'default');}return{'content':[{'type':'text','text':f?JSON['stringify'](d)+'\x0a'+f:JSON['stringify'](d)}],'structuredContent':{'result':d}};}catch(as){const at=as instanceof Error?as['message']:String(as),au=b?{'operation_type':'messenger_'+b['operation'],'data':b}:undefined,av=classifyError(at),aw={'operation':'error','error':at};if(av['error_code']!==undefined)aw['error_code']=av['error_code'];if(av['retryable']!==undefined)aw['retryable']=av['retryable'];if(av['recovery_hint']!==undefined)aw['recovery_hint']=av['recovery_hint'];return{'content':[{'type':'text','text':'Error:\x20'+at}],'structuredContent':{'result':aw,'semantic':buildDataSemantic(undefined,au,!![],at)}};}}
@@ -1,8 +1,10 @@
1
1
  import { type ParsedMachineNode } from "../../graph/onchain/sdk-batch.js";
2
2
  import type { ToolDispatchResult } from "../types.js";
3
3
  export declare function assertRewardReplayStamp(entries: unknown, network?: string, warnings?: string[]): Promise<void>;
4
+ export declare function rewardWindowTimingAdvisory(guardRef: string, root: unknown, table: unknown, warnings: string[]): void;
4
5
  export declare function checkRewardOnceArming(data: unknown, network?: string, warnings?: string[]): Promise<void>;
5
6
  export declare function verifyRewardEvidenceBindings(result: unknown, rewardRef: unknown, guardAdds: unknown, network?: string): Promise<string[]>;
7
+ export declare function permissionEchoWarning(result: any, objectKind: string, data: any): string | null;
6
8
  export declare function warnMerchantCompensationFundLow(data: any, network: string | undefined, constraintWarnings: string[]): Promise<{
7
9
  content: Array<{
8
10
  type: "text";
@@ -12,6 +14,8 @@ export declare function warnMerchantCompensationFundLow(data: any, network: stri
12
14
  } | undefined>;
13
15
  export declare function deriveTotalPayIfOmitted(data: any, network: unknown): Promise<string | undefined>;
14
16
  export declare function warnOrderNewFundCoverage(data: any, network: unknown): Promise<string | null>;
17
+ export declare function warnBuyCustomerRequiredSelfAttested(data: any, network: unknown): Promise<string | null>;
18
+ export declare function warnBuyGuardTimeCutoff(data: any, network: unknown): Promise<string | null>;
15
19
  export declare function gateServiceBuyGuardMount(data: any, network: unknown): Promise<ToolDispatchResult | null>;
16
20
  export declare function parseTotalPayRaw(buy: any): bigint | undefined;
17
21
  export declare function gateOrderNewZeroTotal(data: any): ToolDispatchResult | null;
@@ -33,6 +37,23 @@ export declare function arbClaimEscrowEmptyDualPayout(inputs: {
33
37
  poolValue?: number;
34
38
  acknowledged: boolean;
35
39
  }): "refuse" | "acknowledged" | null;
40
+ export declare function awardPoolCapacityPosture(inputs: {
41
+ indemnity: number;
42
+ pool?: number;
43
+ orderAmount?: number;
44
+ }): "zero_award" | "over_ceiling" | "pool_empty" | "pool_underfunded" | "covered" | "pool_unknown";
45
+ export declare function awardPoolCapacityReceipt(posture: ReturnType<typeof awardPoolCapacityPosture>, inputs: {
46
+ indemnity: number;
47
+ pool?: number;
48
+ orderAmount?: number;
49
+ }): string;
50
+ export declare function claimPoolInsufficient(inputs: {
51
+ indemnity?: number;
52
+ pool?: number;
53
+ }): boolean;
54
+ export declare function disputeFeeReceipt(inputs: {
55
+ venueFee?: number;
56
+ }): string | undefined;
36
57
  export declare function gateOrderNewAmountLegCoverage(data: any, network: unknown): Promise<ToolDispatchResult | null>;
37
58
  interface SaleItemOpPreparation {
38
59
  op: string;
@@ -54,6 +75,8 @@ export declare function emitSaleItemOpReadback(prep: SaleItemOpPreparation, data
54
75
  export declare function prepareSalesAddDuplicateGate(data: any, network: unknown, env?: {
55
76
  confirmed?: boolean;
56
77
  }): Promise<ToolDispatchResult | null>;
78
+ export declare function prepareSaleWipSetOp(data: any, network: unknown): Promise<ToolDispatchResult | null>;
79
+ export declare function gateBuyWipPinDoctrine(data: any, network: unknown, constraintWarnings: string[]): Promise<ToolDispatchResult | null>;
57
80
  export declare function gateServicePublishPreflight(data: any): ToolDispatchResult | null;
58
81
  export declare function invalidateResolvedNameCache(): void;
59
82
  export declare function isPassportVerifyFailure(msg: string, hasGuardContext: boolean): boolean;
@@ -66,4 +89,5 @@ export declare function synthesizeBuyGuardSubmissionForDiagnosis(validated: any)
66
89
  } | undefined>;
67
90
  export declare function isBuyGuardAbortContext(validated: any, errorMessage: string): boolean;
68
91
  export declare function handleOnchainOperations(args: unknown): Promise<ToolDispatchResult>;
92
+ export declare function onchainTimeoutVerify(args: unknown): Promise<string | undefined>;
69
93
  export {};