@wowok/agent-mcp 3.3.0 → 3.3.2

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 (167) hide show
  1. package/dist/chain-semantics/field-capability.js +1 -1
  2. package/dist/chain-semantics/freeze-map.js +1 -1
  3. package/dist/chain-semantics/fund-flow.js +1 -1
  4. package/dist/chain-semantics/guard-verbs.js +1 -1
  5. package/dist/chain-semantics/object-graph.js +1 -1
  6. package/dist/composition/audit.d.ts +5 -0
  7. package/dist/composition/audit.js +1 -1
  8. package/dist/composition/blueprint-view.d.ts +0 -1
  9. package/dist/composition/blueprint-view.js +1 -1
  10. package/dist/composition/compile.d.ts +4 -2
  11. package/dist/composition/compile.js +1 -1
  12. package/dist/composition/inflight.d.ts +8 -4
  13. package/dist/composition/inflight.js +1 -1
  14. package/dist/customer/industry-risks.js +1 -1
  15. package/dist/customer/user-preferences.js +1 -1
  16. package/dist/extensions/business-modules.d.ts +7 -2
  17. package/dist/extensions/business-modules.js +1 -1
  18. package/dist/extensions/industry-audit.spec.js +1 -1
  19. package/dist/extensions/industry-pack.d.ts +3 -2
  20. package/dist/extensions/industry-pack.js +1 -1
  21. package/dist/extensions/modes.js +1 -1
  22. package/dist/graph/onchain/project-relationship.js +1 -1
  23. package/dist/knowledge/acquisition-flywheel.js +1 -1
  24. package/dist/knowledge/allocation-ledger.d.ts +4 -1
  25. package/dist/knowledge/allocation-ledger.js +1 -1
  26. package/dist/knowledge/allocation-puzzle.d.ts +1 -0
  27. package/dist/knowledge/allocation-puzzle.js +1 -1
  28. package/dist/knowledge/allocation-risk.d.ts +1 -1
  29. package/dist/knowledge/allocation-risk.js +1 -1
  30. package/dist/knowledge/arb-fund-facts.d.ts +5 -0
  31. package/dist/knowledge/arb-fund-facts.js +1 -1
  32. package/dist/knowledge/audit-rules.d.ts +4 -3
  33. package/dist/knowledge/audit-rules.js +1 -1
  34. package/dist/knowledge/baselines/rules/plan.json +48 -2
  35. package/dist/knowledge/baselines/rules/reward.json +1 -1
  36. package/dist/knowledge/builtin-templates.d.ts +9 -1
  37. package/dist/knowledge/builtin-templates.js +1 -1
  38. package/dist/knowledge/discount-threshold.js +1 -1
  39. package/dist/knowledge/guard-bindings.js +1 -1
  40. package/dist/knowledge/guard-design-patterns.js +1 -1
  41. package/dist/knowledge/guard-field-cognition.js +1 -1
  42. package/dist/knowledge/guard-lint.js +1 -1
  43. package/dist/knowledge/guard-submission-brief.d.ts +5 -0
  44. package/dist/knowledge/guard-submission-brief.js +1 -1
  45. package/dist/knowledge/guard-submission-prompt.d.ts +2 -1
  46. package/dist/knowledge/guard-submission-prompt.js +1 -1
  47. package/dist/knowledge/guard-templates.d.ts +1 -1
  48. package/dist/knowledge/guard-templates.js +1 -1
  49. package/dist/knowledge/industry-generalizer.js +1 -1
  50. package/dist/knowledge/industry-registry.js +1 -1
  51. package/dist/knowledge/industry-strategy.js +1 -1
  52. package/dist/knowledge/reward-ledger.js +1 -1
  53. package/dist/knowledge/reward-puzzle.d.ts +1 -1
  54. package/dist/knowledge/reward-risk.d.ts +1 -1
  55. package/dist/knowledge/scenario-modes.d.ts +2 -2
  56. package/dist/knowledge/scenario-modes.js +1 -1
  57. package/dist/knowledge/scenario-topology.js +1 -1
  58. package/dist/knowledge/strategy-manuals.js +1 -1
  59. package/dist/knowledge/template-index.d.ts +19 -0
  60. package/dist/knowledge/template-index.js +1 -0
  61. package/dist/knowledge/template-loader.d.ts +36 -0
  62. package/dist/knowledge/template-loader.js +1 -1
  63. package/dist/knowledge/template-registry.js +1 -1
  64. package/dist/knowledge/template-scanner.d.ts +7 -0
  65. package/dist/knowledge/template-scanner.js +1 -1
  66. package/dist/knowledge/tool-constraints.js +1 -1
  67. package/dist/knowledge/workflow-guidance.js +1 -1
  68. package/dist/monitor/MonitorLoop.js +1 -1
  69. package/dist/participation/radar-core.d.ts +1 -0
  70. package/dist/participation/radar-core.js +1 -1
  71. package/dist/persona/defaults.js +1 -1
  72. package/dist/persona/topology-focus.js +1 -1
  73. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  74. package/dist/playbooks/service-build/game-theory.d.ts +4 -1
  75. package/dist/playbooks/service-build/game-theory.js +1 -1
  76. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  77. package/dist/playbooks/service-build/merchant-guide.d.ts +25 -1
  78. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  79. package/dist/playbooks/service-build/migration-planner.js +1 -1
  80. package/dist/playbooks/service-build/object-panorama.js +1 -1
  81. package/dist/playbooks/service-build/participation-radar.js +1 -1
  82. package/dist/playbooks/service-build/pipeline-actions.d.ts +4 -1
  83. package/dist/playbooks/service-build/pipeline-actions.js +1 -1
  84. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  85. package/dist/playbooks/service-build/service-panorama.d.ts +4 -0
  86. package/dist/playbooks/service-build/service-panorama.js +1 -1
  87. package/dist/playbooks/service-build/service-quote.js +1 -1
  88. package/dist/relationship/derivation.d.ts +1 -1
  89. package/dist/review/index.js +1 -1
  90. package/dist/rules.js +1 -1
  91. package/dist/safety/confirm-gate.js +1 -1
  92. package/dist/schema/benchmark-migration/index.d.ts +35 -0
  93. package/dist/schema/benchmark-migration/index.js +1 -1
  94. package/dist/schema/call/allocation.d.ts +46 -3
  95. package/dist/schema/call/allocation.js +1 -1
  96. package/dist/schema/call/contact.js +1 -1
  97. package/dist/schema/call/guard.js +1 -1
  98. package/dist/schema/call/handler.js +1 -1
  99. package/dist/schema/call/order.js +1 -1
  100. package/dist/schema/call/progress.d.ts +6 -3
  101. package/dist/schema/call/progress.js +1 -1
  102. package/dist/schema/call/repository.js +1 -1
  103. package/dist/schema/call/reward.d.ts +2 -2
  104. package/dist/schema/call/reward.js +1 -1
  105. package/dist/schema/call/semantic.js +1 -1
  106. package/dist/schema/call/service.d.ts +8 -4
  107. package/dist/schema/call/service.js +1 -1
  108. package/dist/schema/common/index.js +1 -1
  109. package/dist/schema/goal/index.d.ts +54 -0
  110. package/dist/schema/goal/planning.d.ts +86 -0
  111. package/dist/schema/goal/planning.js +1 -1
  112. package/dist/schema/local/index.d.ts +39 -0
  113. package/dist/schema/local/index.js +1 -1
  114. package/dist/schema/operations.d.ts +20 -5
  115. package/dist/schema/operations.js +1 -1
  116. package/dist/schema/query/bi.d.ts +2 -0
  117. package/dist/schema/query/bi.js +1 -1
  118. package/dist/schema/query/index.d.ts +24 -12
  119. package/dist/schema/query/index.js +1 -1
  120. package/dist/schema/schema-version.d.ts +1 -1
  121. package/dist/schema/schema-version.js +1 -1
  122. package/dist/schema/workspace/index.d.ts +9 -0
  123. package/dist/schema/workspace/index.js +1 -1
  124. package/dist/schema-query-impl/index.js +1 -1
  125. package/dist/schemas/account_operation.output.json +28 -3
  126. package/dist/schemas/benchmark_migration_operation.schema.json +87 -0
  127. package/dist/schemas/goal_operation.schema.json +94 -0
  128. package/dist/schemas/index.json +1 -1
  129. package/dist/schemas/onchain_operations.output.json +1 -1
  130. package/dist/schemas/onchain_operations.schema.json +409 -119
  131. package/dist/schemas/onchain_operations_allocation.schema.json +290 -6
  132. package/dist/schemas/onchain_operations_arbitration.schema.json +2 -2
  133. package/dist/schemas/onchain_operations_contact.schema.json +2 -2
  134. package/dist/schemas/onchain_operations_demand.schema.json +3 -3
  135. package/dist/schemas/onchain_operations_gen_passport.schema.json +1 -1
  136. package/dist/schemas/onchain_operations_guard.schema.json +63 -63
  137. package/dist/schemas/onchain_operations_machine.schema.json +1 -1
  138. package/dist/schemas/onchain_operations_order.schema.json +2 -2
  139. package/dist/schemas/onchain_operations_progress.schema.json +7 -3
  140. package/dist/schemas/onchain_operations_proof.schema.json +1 -1
  141. package/dist/schemas/onchain_operations_repository.schema.json +2 -2
  142. package/dist/schemas/onchain_operations_reward.schema.json +8 -8
  143. package/dist/schemas/onchain_operations_service.schema.json +20 -18
  144. package/dist/schemas/onchain_operations_treasury.schema.json +7 -7
  145. package/dist/schemas/query_toolkit.output.json +67 -53
  146. package/dist/schemas/workflow_operation.schema.json +1 -1
  147. package/dist/schemas/workspace_operation.output.json +23 -3
  148. package/dist/schemas/workspace_operation.schema.json +3 -3
  149. package/dist/tools/handlers/benchmark-migration.js +1 -1
  150. package/dist/tools/handlers/config.js +1 -1
  151. package/dist/tools/handlers/file-export.js +1 -1
  152. package/dist/tools/handlers/industry-pack.d.ts +1 -0
  153. package/dist/tools/handlers/industry-pack.js +1 -1
  154. package/dist/tools/handlers/local.js +1 -1
  155. package/dist/tools/handlers/onchain.d.ts +24 -0
  156. package/dist/tools/handlers/onchain.js +1 -1
  157. package/dist/tools/handlers/query.js +1 -1
  158. package/dist/tools/handlers/review-chain.d.ts +1 -1
  159. package/dist/tools/handlers/review-chain.js +1 -1
  160. package/dist/tools/handlers/schema-query.js +1 -1
  161. package/dist/tools/handlers/workflow.js +1 -1
  162. package/dist/tools/handlers/workspace.js +1 -1
  163. package/dist/tools/registry/agent.js +1 -1
  164. package/dist/tools/registry/local.js +1 -1
  165. package/dist/tools/wip-deploy-assist.js +1 -1
  166. package/dist/tools/wrap.js +1 -1
  167. package/package.json +2 -2
@@ -143,7 +143,7 @@
143
143
  "type": "integer",
144
144
  "minimum": 0,
145
145
  "maximum": 255,
146
- "description": "Identifier (0-255) for data lookup in Guard table. Slot consensus (enforced on-chain at guard table construction): 0-220 = user slots (free for business guards); 221-253 = PROTOCOL-RESERVED (rejected on-chain — reserved so future protocol features get fixed slots without colliding with published guards); 255 = ONCE replay-protection slot on Allocation (byte-keyed, the submitted bytes are the once-key — use for per-period keys like period-<N>); 254 = ONCE-FOR-OBJECT slot on Allocation (chain-derived key = bcs(the Allocation's payment_info.for_object); the submitted bytes are ignored and the submission only arms the slot — use for one-shot per-order rails such as full refunds)."
146
+ "description": "Identifier (0-255) for data lookup in Guard table. Slot consensus (enforced on-chain at guard table construction): 0-220 = user slots (free for business guards); 221-253 = PROTOCOL-RESERVED (rejected on-chain — reserved so future protocol features get fixed slots without colliding with published guards); 255 = ONCE replay-protection slot on Allocation (byte-keyed, the submitted bytes are the once-key — use for per-period keys like period-<N>); 254 = ONCE-FOR-OBJECT slot on Allocation (chain-derived key = bcs(the Allocation's payment_info.for_object); the submitted bytes are ignored and the submission only arms the slot — use for one-shot per-order rails such as full refunds). SLOT 0 SEMANTICS (protocol 154): slot 0 carries the transacted Order address by convention. As a submission slot it is legal on order/allocation/machine rails (the order exists when those verify), but FORBIDDEN on a Service buy_guard — the order does not exist when the buy-time passport is verified, so the mount is refused (service abort 43)."
147
147
  },
148
148
  "b_submission": {
149
149
  "type": "boolean",
@@ -353,7 +353,15 @@
353
353
  },
354
354
  "truncated": {
355
355
  "type": "boolean",
356
- "description": "True when matches were cut off by max_results."
356
+ "description": "True when matches were cut off by max_results, the scan budget or the timeout."
357
+ },
358
+ "engine": {
359
+ "description": "Which scanner answered: 'ripgrep' (bundled binary) or 'js' (in-process fallback — ripgrep absent, or a pattern its regex engine rejects).",
360
+ "type": "string",
361
+ "enum": [
362
+ "ripgrep",
363
+ "js"
364
+ ]
357
365
  }
358
366
  },
359
367
  "required": [
@@ -405,11 +413,23 @@
405
413
  ],
406
414
  "additionalProperties": false
407
415
  },
408
- "description": "Files whose workspace-relative path matches the pattern."
416
+ "description": "Files matching the pattern, at most 1000."
409
417
  },
410
418
  "count": {
411
419
  "type": "number",
412
- "description": "Number of matching files."
420
+ "description": "Number of files returned (at most 1000)."
421
+ },
422
+ "truncated": {
423
+ "description": "True when more files matched than the 1000-file cap, or the listing was cut short.",
424
+ "type": "boolean"
425
+ },
426
+ "engine": {
427
+ "description": "Which scanner answered: 'ripgrep' (bundled binary) or 'js' (in-process fallback).",
428
+ "type": "string",
429
+ "enum": [
430
+ "ripgrep",
431
+ "js"
432
+ ]
413
433
  }
414
434
  },
415
435
  "required": [
@@ -22,7 +22,7 @@
22
22
  "glob",
23
23
  "edit"
24
24
  ],
25
- "description": "Action: 'resolve' = return the workspace root directory; 'list' = list files; 'read' = read a file (path required); 'write' = write/overwrite a file (path + content required); 'delete' = delete a file or directory (path required). 'create_file' = create an empty file (path required; content optional). 'create_dir' = create a directory recursively (path required). 'copy' = copy a file or directory (from + to required). 'move' / 'rename' = move or rename a file or directory (from + to required). 'search' = regex content search across workspace files (pattern required). 'glob' = list files whose workspace-relative path matches a wildcard pattern (pattern required). 'edit' = exact string replacement inside a file (path + old_string + new_string required)."
25
+ "description": "Action: 'resolve' = return the workspace root directory; 'list' = list files; 'read' = read a file (path required); 'write' = write/overwrite a file (path + content required); 'delete' = delete a file or directory (path required). 'create_file' = create an empty file (path required; content optional). 'create_dir' = create a directory recursively (path required). 'copy' = copy a file or directory (from + to required). 'move' / 'rename' = move or rename a file or directory (from + to required). 'search' = regex content search across workspace files (pattern required). 'glob' = list files by wildcard name / path pattern (pattern required). 'edit' = exact string replacement inside a file (path + old_string + new_string required)."
26
26
  },
27
27
  "path": {
28
28
  "description": "Path relative to the workspace root (required for read/write/delete/create_file/create_dir).",
@@ -41,11 +41,11 @@
41
41
  "type": "string"
42
42
  },
43
43
  "pattern": {
44
- "description": "search: regular expression matched against every file line (required for search). glob: wildcard pattern matched against workspace-relative paths — '**' spans directory segments, '*' stays within one segment, '?' is a single char (e.g. '**/*.json', '*.md'; required for glob).",
44
+ "description": "search: regular expression matched against every file line (required for search). Runs on the bundled ripgrep engine, so no lookaround or backreferences; such patterns fall back to a JavaScript scan. glob: wildcard pattern matched against file names — '*' stays within one path segment, '?' is a single char, '**/' spans directories. A pattern without '/' matches the BASENAME at any depth ('*.json', 'readme*'); one containing '/' is anchored to the search scope — the 'path' directory, or the workspace root when 'path' is absent — and a leading '/' states that anchor explicitly (required for glob).",
45
45
  "type": "string"
46
46
  },
47
47
  "glob": {
48
- "description": "search only: optional filename wildcard filter matched on the file basename (e.g. '*.md', '*.{ts,tsx}').",
48
+ "description": "search only: optional filename filter, ripgrep --glob syntax — '*.md' matches at any depth, 'src/*.md' is anchored to the search scope, a leading '!' negates.",
49
49
  "type": "string"
50
50
  },
51
51
  "ignore_case": {
@@ -1 +1 @@
1
- import{strictParse}from'../../schema/index.js';import{BenchmarkMigrationSchema}from'../../schema/benchmark-migration/index.js';import{getTemplate,listTemplates,validateAllocatorRows,platformShareBps,builtinTemplateDrift}from'../../knowledge/template-loader.js';import{BUILTIN_TEMPLATES,BUILTIN_TEMPLATES_VERSION}from'../../knowledge/builtin-templates.js';import{scanTemplate,buildFeeParamLandingTable}from'../../knowledge/template-scanner.js';import{planMigration}from'../../playbooks/service-build/migration-planner.js';import{handleMerchantGuide}from'../../playbooks/service-build/merchant-guide.js';import{inferArbitration}from'../../playbooks/service-build/intent-analyzer.js';import{getIndustryModeRegistry}from'../../extensions/index.js';import{resolveIndustryName}from'../../knowledge/industry-registry.js';function templateSummary(a){return{'id':a['id'],'industry':a['industry'],'variant':a['variant'],'product_ref':a['product_ref'],'archetype':a['archetype'],'key_risk':a['key_risk'],'node_count':a['machine_shape']['length'],'guard_count':a['guards']['length'],'recommended_role':a['recommended_role']};}function requireTemplate(a,b){if(!a)throw new Error('\x27template_id\x27\x20is\x20required\x20for\x20action=\x27'+b+'\x27');const c=getTemplate(a);if(!c)throw new Error('Unknown\x20template\x20id:\x20'+a+'\x20(use\x20action=\x27template_list\x27\x20to\x20see\x20valid\x20ids)');return c;}function driftFace(a){const b=builtinTemplateDrift()['find'](c=>c['template']===a);if(!b){const c=BUILTIN_TEMPLATES['some'](d=>d['id']===a);return c?{'template':a,'state':'current','catalog_version':BUILTIN_TEMPLATES_VERSION,'blocked':![],'repairable':![],'detail':'disk\x20body\x20matches\x20the\x20shipped\x20catalog\x20(hash-verified\x20sentinel)'}:{'template':a,'state':'untracked','catalog_version':undefined,'blocked':![],'repairable':![],'detail':'user-authored\x20template\x20—\x20no\x20builtin\x20catalog\x20binding\x20to\x20compare\x20against'};}return{'template':b['template'],'state':b['state'],'catalog_version':BUILTIN_TEMPLATES_VERSION,'blocked':!![],'repairable':b['repairable'],'detail':b['detail']};}function scanSummary(a,b){const c={};for(const d of a['findings'])c[d['severity']]=(c[d['severity']]??0x0)+0x1;return{'risk_level':a['risk_level'],'passed':a['passed'],'finding_count':a['findings']['length'],'findings_by_severity':c,'red_flags':a['red_flags'],'findings':a['findings'],'drift':b};}function assertScanPassed(a,b){if(a['passed'])return;throw new Error('action=\x27'+b+'\x27\x20blocked:\x20pre-deploy\x20scan\x20of\x20template\x20\x27'+a['template_id']+'\x27\x20found\x20CRITICAL\x20risk\x20—\x20'+a['red_flags']['join'](';\x20')+'.\x20Fix\x20the\x20template\x20(frontmatter\x20or\x20body)\x20and\x20re-run\x20action=\x27template_scan\x27.');}export function buildVerdict(a,b){const c=[];!a['passed']&&c['push']('scan:\x20'+(a['findings_by_severity']['critical']??0x0)+'\x20CRITICAL\x20finding(s)\x20(scan.passed=false)');const d=b['graph_validation'];if(d&&d['valid']===![]){const f=Array['isArray'](d['hard_violations'])?d['hard_violations']['length']:0x0,g=Array['isArray'](d['hard_violations'])?d['hard_violations']['map'](h=>h['id'])['join'](',\x20'):'';c['push']('graph_validation:\x20'+f+'\x20hard\x20violation(s)'+(g?'\x20('+g+')':''));}const e=b['audit'];return e&&e['blocking']===!![]&&c['push']('audit:\x20guide\x20audit\x20flagged\x20blocking\x20issue(s)\x20(plan.audit)'),{'buildable':c['length']===0x0,'blockers':c};}export function planNextAction(a,b,c){const d=a['next_action'];if(typeof d==='string'&&d['startsWith']('Plan\x20ready.'))return d;if(c?.['buildable']){const f=Array['isArray'](a['pending_guard_designs'])?a['pending_guard_designs']['length']:0x0;return'Plan\x20is\x20buildable\x20(verdict.buildable=true).\x20Materialize\x20the\x20objects\x20in\x20plan.steps\x20order'+(f>0x0?',\x20resolving\x20the\x20'+f+'\x20pending\x20guard\x20design(s)\x20in\x20plan.pending_guard_designs\x20via\x20guard_resolutions\x20before\x20the\x20Machine\x20publish':'')+'.';}const e=Array['isArray'](a['pending_guard_designs'])?a['pending_guard_designs']['length']:0x0;return'Plan\x20BLOCKED\x20by\x20the\x20guide\x20audit\x20(see\x20plan.audit\x20/\x20plan.next_action).\x20Do\x20NOT\x20materialize,\x20'+'and\x20do\x20NOT\x20hand-build\x20the\x20objects\x20instead:\x20this\x20plan\x20is\x20the\x20wiring\x20authority\x20(Arbitration\x20+\x20'+'compensation-fund,\x20Contact/um,\x20allocator\x20rows)\x20and\x20hand-built\x20replicas\x20silently\x20drop\x20those\x20wirings.\x20'+(e>0x0?'Resolve\x20the\x20'+e+'\x20pending\x20guard\x20design(s)\x20in\x20plan.pending_guard_designs\x20via\x20guard_resolutions\x20(kind\x20\x27inline\x27\x20with\x20the\x20Guard\x20table+root,\x20kind\x20\x27template\x27\x20with\x20a\x20tpl_*\x20id,\x20or\x20{kind:\x27omit\x27}\x20for\x20advisory\x20designs\x20that\x20do\x20not\x20apply\x20to\x20this\x20shop),\x20':'Adjust\x20fee_overrides,\x20pick\x20another\x20template\x20variant,\x20or\x20fix\x20the\x20template,\x20')+('then\x20re-run\x20action=\x27'+b+'\x27.');}function templateIntent(a,b){if(b&&b['trim']())return b['trim']();return'Adopt\x20the\x20'+a['id']+'\x20industry\x20archetype\x20template\x20('+a['archetype']+')\x20for\x20the\x20'+a['industry']+'\x20industry.\x20'+('Primary\x20risk\x20to\x20mitigate:\x20'+a['key_risk']+'.');}function effectiveFeeParams(a,b){return{...a['fee_params'],...b??{}};}const REWARD_POOL_PATTERNS=[/(?:reward|review|bonus|tip|prize)[\s-]*pools?\s*(?:of|is|at|:|=)?\s*([0-9][0-9_,]*(?:\.[0-9]+)?)/i,/([0-9][0-9_,]*(?:\.[0-9]+)?)\s*(?:reward|review|bonus|tip|prize)[\s-]*pools?\b/i,/(?:奖(?:金|励)?池|打赏池|好评(?:奖励)?池)\s*(?:为|是|:|:|=)?\s*([0-9][0-9_,]*(?:\.[0-9]+)?)/,/([0-9][0-9_,]*(?:\.[0-9]+)?)\s*的?\s*(?:奖(?:金|励)?池|打赏池|好评(?:奖励)?池)/];export function extractRewardPoolCandidate(a){if(!a)return undefined;for(const b of REWARD_POOL_PATTERNS){const c=b['exec'](a);if(!c)continue;const d=Number(c[0x1]['replaceAll'](/[,_]/g,''));if(Number['isFinite'](d)&&d>=0x0)return d;}return undefined;}function rewardPoolPrefill(a,b,c){if(a['fee_params']['review_reward_pool']===undefined)return undefined;if(c?.['review_reward_pool']!==undefined)return undefined;const d=extractRewardPoolCandidate(b);return d===undefined?undefined:{'fee_key':'review_reward_pool','value':d};}function validateFeeParams(a,b){const c=[];let d=0x0;for(const [e,f]of Object['entries'](a)){if(typeof f!=='number'||!Number['isFinite'](f))continue;if(e['endsWith']('_bps')){(!Number['isInteger'](f)||f<0x0||f>0x2710)&&c['push'](e+'='+f+'\x20is\x20not\x20an\x20integer\x20rate\x20in\x20[0,\x2010000]\x20bps');if(e['endsWith']('_share_bps'))d+=Math['max'](0x0,f);}else{if(e['endsWith']('_days')){if(f<=0x0||f>0xe42)c['push'](e+'='+f+'\x20is\x20outside\x20the\x20sane\x20window\x20range\x20(0,\x203650]\x20days');}else{if(e['endsWith']('_hours')){if(f<=0x0||f>0x2238)c['push'](e+'='+f+'\x20is\x20outside\x20the\x20sane\x20window\x20range\x20(0,\x208760]\x20hours');}}}}if(d>0x2710)c['push']('*_share_bps\x20sum\x20'+d+'\x20exceeds\x2010000\x20(a\x20pool\x20splits\x20into\x20at\x20most\x20100%)');if(c['length']>0x0)throw new Error('invalid\x20fee\x20parameters\x20for\x20template\x20\x27'+b+'\x27:\x20'+c['join'](';\x20')+'.\x20'+'Correct\x20the\x20template\x27s\x20fee_params\x20or\x20pass\x20valid\x20\x27fee_overrides\x27.');}export{validateAllocatorRows};export function variantPaymentModel(a){if(a['payment_model'])return a['payment_model'];const b=a['allocator']['rows']??[];if(b['some'](d=>d['track']==='refund'))return'escrow';const c=a['machine_shape']['map'](d=>d['name'])['join']('\x20')['toLowerCase']();if(/\b(milestone|revision|revis|draft|deliverable)\b/['test'](c))return'milestone';if(/\b(charge|renew|subscription|cycle|billing|monthly)\b/['test'](c))return'subscription';return'escrow';}function variantRefundPolicy(a){const b=a['allocator']['description']['toLowerCase']();if(/full[ -]?refund|100% refund|refund .*100/['test'](b))return'full';if(/pro-?rata|prorated/['test'](b))return'milestone_prorated';if(/partial/['test'](b))return'partial';return undefined;}export function variantDeliverables(a,b){const c=a['machine_shape']['filter'](g=>g['semantic_role']==='final'),d=c[c['length']-0x1]??[...a['machine_shape']]['reverse']()['find'](g=>!/refund|cancel|dispute|terminat/i['test'](g['name']+'\x20'+g['role']))??a['machine_shape'][a['machine_shape']['length']-0x1],e=b?.['has_logistics']?'physical':b?.['pure_digital']?'digital':'service_session',f=(a['guards']??[])['filter'](h=>/repository_data_check|required_info_evidence_gate|allocator_order_anchor/['test'](h['template_id']));return[{'name':a['variant']+'\x20fulfillment','type':e,'acceptanceCriteria':'Order\x20reaches\x20the\x20terminal\x20workflow\x20node\x20\x27'+d['name']+'\x27\x20('+d['role']+')','proofOfDelivery':f['length']>0x0?'wip_hash':'manual_confirm'}];}function validateConditionalParams(a,b){for(const d of a['conditional_guards']??[]){const e=b[d['param']];if(e===undefined)continue;if(typeof e!=='string'||!d['values']['includes'](e))throw new Error('invalid\x20\x27'+d['param']+'='+String(e)+'\x27\x20for\x20template\x20\x27'+a['id']+'\x27:\x20must\x20be\x20one\x20of\x20'+d['values']['map'](f=>'\x27'+f+'\x27')['join']('\x20|\x20')+('\x20(the\x20guard\x20variant\x20mounts\x20at\x20\x27'+d['emit_value']+'\x27)'));}}async function runGuide(a,b,c,d,e){const f=effectiveFeeParams(a,c),g=rewardPoolPrefill(a,b,c);if(g)f[g['fee_key']]=g['value'];validateFeeParams(f,a['id']),validateConditionalParams(a,f);const h=getIndustryModeRegistry()['getMode'](a['industry']),i=platformShareBps(f),j={'model':variantPaymentModel(a)},k=[],l=(a['allocator']['rows']?.['length']??0x0)>0x0;if(i!==undefined&&i>0x0&&!l&&a['allocator']['mode']==='rate'){const p=Math['round'](i)/0x64;k['push']({'recipient':'merchant','percentage':Math['round']((0x64-p)*0x64)/0x64}),k['push']({'recipient':'platform','percentage':p}),j['allocation']=k;}const m=variantRefundPolicy(a),n={'escrow':!![]};if(m)n['refundPolicy']=m;n['arbitration']=a['arbitration_mode']??n['arbitration']??inferArbitration(templateIntent(a,b));const o=await handleMerchantGuide({'intent':templateIntent(a,b),'guide_confirm':{'industry':a['industry'],'payment':j,'trust':n,'deliverables':variantDeliverables(a,h?.['traits']),...d&&Object['keys'](d)['length']>0x0?{'guard_resolutions':d}:{},...e?.['review_mode']?{'review_mode':e['review_mode']}:{},...e?.['reward_funding']!==undefined?{'reward_funding':e['reward_funding']}:{}},'template_override':{...a,'fee_params':f},'name_base':a['id']});if(a['allocator']['rows']?.['length'])o['template_allocator_rows']=a['allocator']['rows']['map'](q=>({...q}));o['template']={'id':a['id'],'archetype':a['archetype'],'recommended_role':a['recommended_role'],'fee_params':f},o['template_fee_param_landings']=buildFeeParamLandingTable(a,f);if(c&&Object['keys'](c)['length']>0x0)o['template_fee_overrides']=c;return g&&(o['fee_overrides_prefill']=g,o['next_action']=o['next_action']+'\x20Reward\x20pool\x20prefilled\x20from\x20your\x20request:\x20'+g['value']+'\x20—\x20adjust\x20via\x20fee_overrides.'),o;}export async function handleBenchmarkMigrationOperation(a){const b=strictParse(BenchmarkMigrationSchema,a,'benchmark_migration_operation\x20input'),c=b['industry']?resolveIndustryName(b['industry'])??b['industry']['toLowerCase']():undefined;let d;switch(b['action']){case'template_list':{const {templates:e,errors:f}=listTemplates(),g=c?e['filter'](i=>i['industry']===c):e,h=new Map(builtinTemplateDrift()['map'](i=>[i['template'],i['state']]));d={'action':'template_list','count':g['length'],'templates':g['map'](i=>({...templateSummary(i),'disk_state':h['get'](i['id'])??(BUILTIN_TEMPLATES['some'](j=>j['id']===i['id'])?'current':'untracked')})),'load_errors':f};break;}case'template_get':{const i=requireTemplate(b['template_id'],'template_get');d={'action':'template_get','template':{...i}};break;}case'template_generate':{const j=requireTemplate(b['template_id'],'template_generate'),k=scanTemplate(j);assertScanPassed(k,'template_generate');const l=await runGuide(j,b['description'],b['fee_overrides'],b['guard_resolutions'],{'review_mode':b['review_mode'],'reward_funding':b['reward_funding']});d=((()=>{const m=scanSummary(k,driftFace(j['id'])),n=buildVerdict(m,l);return{'action':'template_generate','template_id':j['id'],'scan':m,'plan':l,'verdict':n,'next_action':planNextAction(l,'template_generate',n)};})());break;}case'template_scan':{const m=requireTemplate(b['template_id'],'template_scan');d={'action':'template_scan','scan':{...scanTemplate(m),'drift':driftFace(m['id'])}};break;}case'migration_import':{if(!b['description']||!b['description']['trim']())throw new Error('\x27description\x27\x20is\x20required\x20for\x20action=\x27migration_import\x27');const n=planMigration({'url':b['url'],'description':b['description'],'industry':c,'network':b['network']});if(!n)throw new Error('No\x20industry\x20template\x20matched\x20the\x20description.\x20Refine\x20the\x20description\x20or\x20pass\x20an\x20explicit\x20\x27industry\x27\x20hint.');d={'action':'migration_import','log':n,'next_action':'MigrationLog\x20ready.\x20Next:\x20call\x20action=\x27migration_review\x27\x20with\x20this\x20log\x20to\x20surface\x20the\x20mapped/unmapped/manual_review\x20items\x20for\x20user\x20confirmation.'};break;}case'migration_review':{if(!b['log'])throw new Error('\x27log\x27\x20is\x20required\x20for\x20action=\x27migration_review\x27');const o=b['log'],p=Array['isArray'](o['mapped'])?o['mapped']:[],q=Array['isArray'](o['unmapped'])?o['unmapped']:[],r=Array['isArray'](o['manual_review'])?o['manual_review']:[],s=o['risk_check']??{},t=o['source']?.['matched_template']??'',u=q['length']===0x0&&r['length']===0x0&&s['passed']===!![];d={'action':'migration_review','log':o,'review_summary':{'mapped_count':p['length'],'unmapped_count':q['length'],'manual_review_count':r['length'],'risk_passed':s['passed']===!![]},'next_action':u?'Review\x20clean.\x20Proceed:\x20call\x20action=\x27migration_apply\x27\x20with\x20template_id=\x27'+t+'\x27\x20to\x20produce\x20the\x20creation\x20plan\x20(network\x20defaults\x20to\x20testnet;\x20mainnet\x20requires\x20explicit\x20user\x20confirmation).':'Surface\x20the\x20'+q['length']+'\x20unmapped\x20and\x20'+r['length']+'\x20manual_review\x20items'+(s['passed']===!![]?'':'\x20plus\x20the\x20risk_check\x20findings')+'\x20to\x20the\x20user\x20for\x20a\x20decision\x20before\x20action=\x27migration_apply\x27\x20(template_id=\x27'+t+'\x27).'};break;}case'migration_apply':{const v=requireTemplate(b['template_id'],'migration_apply'),w=scanTemplate(v);assertScanPassed(w,'migration_apply');const x=b['network']??'testnet',y=await runGuide(v,b['description'],b['fee_overrides'],b['guard_resolutions'],{'review_mode':b['review_mode'],'reward_funding':b['reward_funding']});d=((()=>{const z=scanSummary(w,driftFace(v['id'])),A=buildVerdict(z,y);return{'action':'migration_apply','template_id':v['id'],'network':x,'scan':z,'plan':y,'verdict':A,'next_action':planNextAction(y,'migration_apply',A)};})());break;}default:throw new Error('Unknown\x20benchmark_migration_operation\x20action:\x20'+String(b['action']));}return{'content':[{'type':'text','text':JSON['stringify']({'result':d})}],'structuredContent':{'result':d}};}
1
+ import{strictParse}from'../../schema/index.js';import{BenchmarkMigrationSchema}from'../../schema/benchmark-migration/index.js';import{getTemplate,listTemplates,validateAllocatorRows,platformShareBps,builtinTemplateDrift}from'../../knowledge/template-loader.js';import{BUILTIN_TEMPLATES,BUILTIN_TEMPLATES_VERSION}from'../../knowledge/builtin-templates.js';import{scanTemplate,buildFeeParamLandingTable}from'../../knowledge/template-scanner.js';import{planMigration}from'../../playbooks/service-build/migration-planner.js';import{handleMerchantGuide}from'../../playbooks/service-build/merchant-guide.js';import{inferArbitration}from'../../playbooks/service-build/intent-analyzer.js';import{getIndustryModeRegistry}from'../../extensions/index.js';import{resolveIndustryName}from'../../knowledge/industry-registry.js';function templateSummary(a){return{'id':a['id'],'industry':a['industry'],'variant':a['variant'],'product_ref':a['product_ref'],'archetype':a['archetype'],'key_risk':a['key_risk'],'node_count':a['machine_shape']['length'],'guard_count':a['guards']['length'],'recommended_role':a['recommended_role']};}function requireTemplate(a,b){if(!a)throw new Error('\x27template_id\x27\x20is\x20required\x20for\x20action=\x27'+b+'\x27');const c=getTemplate(a);if(!c)throw new Error('Unknown\x20template\x20id:\x20'+a+'\x20(use\x20action=\x27template_list\x27\x20to\x20see\x20valid\x20ids)');return c;}function driftFace(a){const b=builtinTemplateDrift()['find'](c=>c['template']===a);if(!b){const c=BUILTIN_TEMPLATES['some'](d=>d['id']===a);return c?{'template':a,'state':'current','catalog_version':BUILTIN_TEMPLATES_VERSION,'blocked':![],'repairable':![],'detail':'disk\x20body\x20matches\x20the\x20shipped\x20catalog\x20(hash-verified\x20sentinel)'}:{'template':a,'state':'untracked','catalog_version':undefined,'blocked':![],'repairable':![],'detail':'user-authored\x20template\x20—\x20no\x20builtin\x20catalog\x20binding\x20to\x20compare\x20against'};}return{'template':b['template'],'state':b['state'],'catalog_version':BUILTIN_TEMPLATES_VERSION,'blocked':!![],'repairable':b['repairable'],'detail':b['detail']};}function scanSummary(a,b){const c={};for(const d of a['findings'])c[d['severity']]=(c[d['severity']]??0x0)+0x1;return{'risk_level':a['risk_level'],'passed':a['passed'],'finding_count':a['findings']['length'],'findings_by_severity':c,'red_flags':a['red_flags'],'findings':a['findings'],'drift':b};}function assertScanPassed(a,b){if(a['passed'])return;throw new Error('action=\x27'+b+'\x27\x20blocked:\x20pre-deploy\x20scan\x20of\x20template\x20\x27'+a['template_id']+'\x27\x20found\x20CRITICAL\x20risk\x20—\x20'+a['red_flags']['join'](';\x20')+'.\x20Fix\x20the\x20template\x20(frontmatter\x20or\x20body)\x20and\x20re-run\x20action=\x27template_scan\x27.');}export function buildVerdict(a,b){const c=[];!a['passed']&&c['push']('scan:\x20'+(a['findings_by_severity']['critical']??0x0)+'\x20CRITICAL\x20finding(s)\x20(scan.passed=false)');const d=b['graph_validation'];if(d&&d['valid']===![]){const f=Array['isArray'](d['hard_violations'])?d['hard_violations']['length']:0x0,g=Array['isArray'](d['hard_violations'])?d['hard_violations']['map'](h=>h['id'])['join'](',\x20'):'';c['push']('graph_validation:\x20'+f+'\x20hard\x20violation(s)'+(g?'\x20('+g+')':''));}const e=b['audit'];return e&&e['blocking']===!![]&&c['push']('audit:\x20guide\x20audit\x20flagged\x20blocking\x20issue(s)\x20(plan.audit)'),{'buildable':c['length']===0x0,'blockers':c};}export function planNextAction(a,b,c){const d=a['next_action'];if(typeof d==='string'&&d['startsWith']('Plan\x20ready.'))return d;if(c?.['buildable']){const f=Array['isArray'](a['pending_guard_designs'])?a['pending_guard_designs']['length']:0x0;return'Plan\x20is\x20buildable\x20(verdict.buildable=true).\x20Materialize\x20the\x20objects\x20in\x20plan.steps\x20order'+(f>0x0?',\x20resolving\x20the\x20'+f+'\x20pending\x20guard\x20design(s)\x20in\x20plan.pending_guard_designs\x20via\x20guard_resolutions\x20before\x20the\x20Machine\x20publish':'')+'.';}const e=Array['isArray'](a['pending_guard_designs'])?a['pending_guard_designs']['length']:0x0;return'Plan\x20BLOCKED\x20by\x20the\x20guide\x20audit\x20(see\x20plan.audit\x20/\x20plan.next_action).\x20Do\x20NOT\x20materialize,\x20'+'and\x20do\x20NOT\x20hand-build\x20the\x20objects\x20instead:\x20this\x20plan\x20is\x20the\x20wiring\x20authority\x20(Arbitration\x20+\x20'+'compensation-fund,\x20Contact/um,\x20allocator\x20rows)\x20and\x20hand-built\x20replicas\x20silently\x20drop\x20those\x20wirings.\x20'+(e>0x0?'Resolve\x20the\x20'+e+'\x20pending\x20guard\x20design(s)\x20in\x20plan.pending_guard_designs\x20via\x20guard_resolutions\x20(kind\x20\x27inline\x27\x20with\x20the\x20Guard\x20table+root,\x20kind\x20\x27template\x27\x20with\x20a\x20tpl_*\x20id,\x20or\x20{kind:\x27omit\x27}\x20for\x20advisory\x20designs\x20that\x20do\x20not\x20apply\x20to\x20this\x20shop),\x20':'Adjust\x20fee_overrides,\x20pick\x20another\x20template\x20variant,\x20or\x20fix\x20the\x20template,\x20')+('then\x20re-run\x20action=\x27'+b+'\x27.');}function templateIntent(a,b){if(b&&b['trim']())return b['trim']();return'Adopt\x20the\x20'+a['id']+'\x20industry\x20archetype\x20template\x20('+a['archetype']+')\x20for\x20the\x20'+a['industry']+'\x20industry.\x20'+('Primary\x20risk\x20to\x20mitigate:\x20'+a['key_risk']+'.');}function effectiveFeeParams(a,b){return{...a['fee_params'],...b??{}};}const REWARD_POOL_PATTERNS=[/(?:reward|review|bonus|tip|prize)[\s-]*pools?\s*(?:of|is|at|:|=)?\s*([0-9][0-9_,]*(?:\.[0-9]+)?)/i,/([0-9][0-9_,]*(?:\.[0-9]+)?)\s*(?:reward|review|bonus|tip|prize)[\s-]*pools?\b/i,/(?:奖(?:金|励)?池|打赏池|好评(?:奖励)?池)\s*(?:为|是|:|:|=)?\s*([0-9][0-9_,]*(?:\.[0-9]+)?)/,/([0-9][0-9_,]*(?:\.[0-9]+)?)\s*的?\s*(?:奖(?:金|励)?池|打赏池|好评(?:奖励)?池)/];export function extractRewardPoolCandidate(a){if(!a)return undefined;for(const b of REWARD_POOL_PATTERNS){const c=b['exec'](a);if(!c)continue;const d=Number(c[0x1]['replaceAll'](/[,_]/g,''));if(Number['isFinite'](d)&&d>=0x0)return d;}return undefined;}function rewardPoolPrefill(a,b,c){if(a['fee_params']['review_reward_pool']===undefined)return undefined;if(c?.['review_reward_pool']!==undefined)return undefined;const d=extractRewardPoolCandidate(b);return d===undefined?undefined:{'fee_key':'review_reward_pool','value':d};}function validateFeeParams(a,b){const c=[];let d=0x0;for(const [e,f]of Object['entries'](a)){if(typeof f!=='number'||!Number['isFinite'](f))continue;if(e['endsWith']('_bps')){(!Number['isInteger'](f)||f<0x0||f>0x2710)&&c['push'](e+'='+f+'\x20is\x20not\x20an\x20integer\x20rate\x20in\x20[0,\x2010000]\x20bps');if(e['endsWith']('_share_bps'))d+=Math['max'](0x0,f);}else{if(e['endsWith']('_days')){if(f<=0x0||f>0xe42)c['push'](e+'='+f+'\x20is\x20outside\x20the\x20sane\x20window\x20range\x20(0,\x203650]\x20days');}else{if(e['endsWith']('_hours')){if(f<=0x0||f>0x2238)c['push'](e+'='+f+'\x20is\x20outside\x20the\x20sane\x20window\x20range\x20(0,\x208760]\x20hours');}}}}if(d>0x2710)c['push']('*_share_bps\x20sum\x20'+d+'\x20exceeds\x2010000\x20(a\x20pool\x20splits\x20into\x20at\x20most\x20100%)');if(c['length']>0x0)throw new Error('invalid\x20fee\x20parameters\x20for\x20template\x20\x27'+b+'\x27:\x20'+c['join'](';\x20')+'.\x20'+'Correct\x20the\x20template\x27s\x20fee_params\x20or\x20pass\x20valid\x20\x27fee_overrides\x27.');}export{validateAllocatorRows};export function variantPaymentModel(a){if(a['payment_model'])return a['payment_model'];const b=a['allocator']['rows']??[];if(b['some'](d=>d['track']==='refund'))return'escrow';const c=a['machine_shape']['map'](d=>d['name'])['join']('\x20')['toLowerCase']();if(/\b(milestone|revision|revis|draft|deliverable)\b/['test'](c))return'milestone';if(/\b(charge|renew|subscription|cycle|billing|monthly)\b/['test'](c))return'subscription';return'escrow';}function variantRefundPolicy(a){const b=a['allocator']['description']['toLowerCase']();if(/full[ -]?refund|100% refund|refund .*100/['test'](b))return'full';if(/pro-?rata|prorated/['test'](b))return'milestone_prorated';if(/partial/['test'](b))return'partial';return undefined;}export function variantDeliverables(a,b){const c=a['machine_shape']['filter'](g=>g['semantic_role']==='final'),d=c[c['length']-0x1]??[...a['machine_shape']]['reverse']()['find'](g=>!/refund|cancel|dispute|terminat/i['test'](g['name']+'\x20'+g['role']))??a['machine_shape'][a['machine_shape']['length']-0x1],e=b?.['has_logistics']?'physical':b?.['pure_digital']?'digital':'service_session',f=(a['guards']??[])['filter'](h=>/repository_data_check|required_info_evidence_gate|allocator_order_anchor/['test'](h['template_id']));return[{'name':a['variant']+'\x20fulfillment','type':e,'acceptanceCriteria':'Order\x20reaches\x20the\x20terminal\x20workflow\x20node\x20\x27'+d['name']+'\x27\x20('+d['role']+')','proofOfDelivery':f['length']>0x0?'wip_hash':'manual_confirm'}];}function validateConditionalParams(a,b){for(const d of a['conditional_guards']??[]){const e=b[d['param']];if(e===undefined)continue;if(typeof e!=='string'||!d['values']['includes'](e))throw new Error('invalid\x20\x27'+d['param']+'='+String(e)+'\x27\x20for\x20template\x20\x27'+a['id']+'\x27:\x20must\x20be\x20one\x20of\x20'+d['values']['map'](f=>'\x27'+f+'\x27')['join']('\x20|\x20')+('\x20(the\x20guard\x20variant\x20mounts\x20at\x20\x27'+d['emit_value']+'\x27)'));}}async function runGuide(a,b,c,d,e,f){const g=effectiveFeeParams(a,c),h=rewardPoolPrefill(a,b,c);if(h)g[h['fee_key']]=h['value'];validateFeeParams(g,a['id']),validateConditionalParams(a,g);const i=getIndustryModeRegistry()['getMode'](a['industry']),j=platformShareBps(g),k={'model':variantPaymentModel(a)},l=[],m=(a['allocator']['rows']?.['length']??0x0)>0x0;if(j!==undefined&&j>0x0&&!m&&a['allocator']['mode']==='rate'){const q=Math['round'](j)/0x64;l['push']({'recipient':'merchant','percentage':Math['round']((0x64-q)*0x64)/0x64}),l['push']({'recipient':'platform','percentage':q}),k['allocation']=l;}const n=variantRefundPolicy(a),o={'escrow':!![]};if(n)o['refundPolicy']=n;o['arbitration']=a['arbitration_mode']??o['arbitration']??inferArbitration(templateIntent(a,b));const p=await handleMerchantGuide({'intent':templateIntent(a,b),'guide_confirm':{'industry':a['industry'],'payment':k,'trust':o,'deliverables':variantDeliverables(a,i?.['traits']),...d&&Object['keys'](d)['length']>0x0?{'guard_resolutions':d}:{},...e?.['review_mode']?{'review_mode':e['review_mode']}:{},...e?.['reward_funding']!==undefined?{'reward_funding':e['reward_funding']}:{},...e?.['after_sales_mode']?{'after_sales_mode':e['after_sales_mode']}:{},...e?.['acceptance_mode']?{'acceptance_mode':e['acceptance_mode']}:{},...e?.['installment_mode']?{'installment_mode':e['installment_mode']}:{},...e?.['affiliate_mode']?{'affiliate_mode':e['affiliate_mode']}:{},...e?.['crowdfunding_mode']?{'crowdfunding_mode':e['crowdfunding_mode']}:{},...f?.['length']?{'sales':f}:{}},'template_override':{...a,'fee_params':g},'name_base':a['id']});if(a['allocator']['rows']?.['length'])p['template_allocator_rows']=a['allocator']['rows']['map'](s=>({...s}));p['template']={'id':a['id'],'archetype':a['archetype'],'recommended_role':a['recommended_role'],'fee_params':g},p['template_fee_param_landings']=buildFeeParamLandingTable(a,g);if(c&&Object['keys'](c)['length']>0x0)p['template_fee_overrides']=c;return h&&(p['fee_overrides_prefill']=h,p['next_action']=p['next_action']+'\x20Reward\x20pool\x20prefilled\x20from\x20your\x20request:\x20'+h['value']+'\x20—\x20adjust\x20via\x20fee_overrides.'),p;}export async function handleBenchmarkMigrationOperation(a){const b=strictParse(BenchmarkMigrationSchema,a,'benchmark_migration_operation\x20input'),c=b['industry']?resolveIndustryName(b['industry'])??b['industry']['toLowerCase']():undefined;let d;switch(b['action']){case'template_list':{const {templates:e,errors:f}=listTemplates(),g=c?e['filter'](i=>i['industry']===c):e,h=new Map(builtinTemplateDrift()['map'](i=>[i['template'],i['state']]));d={'action':'template_list','count':g['length'],'templates':g['map'](i=>({...templateSummary(i),'disk_state':h['get'](i['id'])??(BUILTIN_TEMPLATES['some'](j=>j['id']===i['id'])?'current':'untracked')})),'load_errors':f};break;}case'template_get':{const i=requireTemplate(b['template_id'],'template_get');d={'action':'template_get','template':{...i}};break;}case'template_generate':{const j=requireTemplate(b['template_id'],'template_generate'),k=scanTemplate(j);assertScanPassed(k,'template_generate');const l=await runGuide(j,b['description'],b['fee_overrides'],b['guard_resolutions'],{'review_mode':b['review_mode'],'reward_funding':b['reward_funding'],'after_sales_mode':b['after_sales_mode'],'acceptance_mode':b['acceptance_mode'],'installment_mode':b['installment_mode'],'affiliate_mode':b['affiliate_mode'],'crowdfunding_mode':b['crowdfunding_mode']},b['sales']);d=((()=>{const m=scanSummary(k,driftFace(j['id'])),n=buildVerdict(m,l);return{'action':'template_generate','template_id':j['id'],'scan':m,'plan':l,'verdict':n,'next_action':planNextAction(l,'template_generate',n)};})());break;}case'template_scan':{const m=requireTemplate(b['template_id'],'template_scan');d={'action':'template_scan','scan':{...scanTemplate(m),'drift':driftFace(m['id'])}};break;}case'migration_import':{if(!b['description']||!b['description']['trim']())throw new Error('\x27description\x27\x20is\x20required\x20for\x20action=\x27migration_import\x27');const n=planMigration({'url':b['url'],'description':b['description'],'industry':c,'network':b['network']});if(!n)throw new Error('No\x20industry\x20template\x20matched\x20the\x20description.\x20Refine\x20the\x20description\x20or\x20pass\x20an\x20explicit\x20\x27industry\x27\x20hint.');d={'action':'migration_import','log':n,'next_action':'MigrationLog\x20ready.\x20Next:\x20call\x20action=\x27migration_review\x27\x20with\x20this\x20log\x20to\x20surface\x20the\x20mapped/unmapped/manual_review\x20items\x20for\x20user\x20confirmation.'};break;}case'migration_review':{if(!b['log'])throw new Error('\x27log\x27\x20is\x20required\x20for\x20action=\x27migration_review\x27');const o=b['log'],p=Array['isArray'](o['mapped'])?o['mapped']:[],q=Array['isArray'](o['unmapped'])?o['unmapped']:[],r=Array['isArray'](o['manual_review'])?o['manual_review']:[],s=o['risk_check']??{},t=o['source']?.['matched_template']??'',u=q['length']===0x0&&r['length']===0x0&&s['passed']===!![];d={'action':'migration_review','log':o,'review_summary':{'mapped_count':p['length'],'unmapped_count':q['length'],'manual_review_count':r['length'],'risk_passed':s['passed']===!![]},'next_action':u?'Review\x20clean.\x20Proceed:\x20call\x20action=\x27migration_apply\x27\x20with\x20template_id=\x27'+t+'\x27\x20to\x20produce\x20the\x20creation\x20plan\x20(network\x20defaults\x20to\x20testnet;\x20mainnet\x20requires\x20explicit\x20user\x20confirmation).':'Surface\x20the\x20'+q['length']+'\x20unmapped\x20and\x20'+r['length']+'\x20manual_review\x20items'+(s['passed']===!![]?'':'\x20plus\x20the\x20risk_check\x20findings')+'\x20to\x20the\x20user\x20for\x20a\x20decision\x20before\x20action=\x27migration_apply\x27\x20(template_id=\x27'+t+'\x27).'};break;}case'migration_apply':{const v=requireTemplate(b['template_id'],'migration_apply'),w=scanTemplate(v);assertScanPassed(w,'migration_apply');const x=b['network']??'testnet',y=await runGuide(v,b['description'],b['fee_overrides'],b['guard_resolutions'],{'review_mode':b['review_mode'],'reward_funding':b['reward_funding'],'after_sales_mode':b['after_sales_mode'],'acceptance_mode':b['acceptance_mode'],'installment_mode':b['installment_mode'],'affiliate_mode':b['affiliate_mode'],'crowdfunding_mode':b['crowdfunding_mode']},b['sales']);d=((()=>{const z=scanSummary(w,driftFace(v['id'])),A=buildVerdict(z,y);return{'action':'migration_apply','template_id':v['id'],'network':x,'scan':z,'plan':y,'verdict':A,'next_action':planNextAction(y,'migration_apply',A)};})());break;}default:throw new Error('Unknown\x20benchmark_migration_operation\x20action:\x20'+String(b['action']));}return{'content':[{'type':'text','text':JSON['stringify']({'result':d})}],'structuredContent':{'result':d}};}
@@ -1 +1 @@
1
- import{listServices,getServiceInfo,toggle as a450a,setEnabled as a450b,reset as a450c}from'../../config/index.js';import{judgmentStatus,setJudgmentOverride,clearJudgmentOverride,clearJudgmentOverrides,patchUserJudgmentDoc,readUserJudgmentDocView}from'../../config/judgment.js';import{strictParse}from'../../schema/index.js';import{ConfigOperationInputSchema}from'../../schema/config/index.js';export async function handleConfigOperation(a){const b=strictParse(ConfigOperationInputSchema,a,'config_operation\x20input'),{action:c,service:d,path:e,value:f}=b;let g;switch(c){case'list':g={'action':'list','services':listServices()};break;case'toggle':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20toggle');const h=d,i=getServiceInfo(h);if(!i)throw new Error('Unknown\x20service:\x20'+h+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');if(h==='confirm_gate'&&i['enabled'])throw new Error('confirm_gate\x20cannot\x20be\x20disabled\x20at\x20runtime.\x20'+'Set\x20WOWOK_CONFIRM_GATE=0\x20in\x20the\x20server\x20environment\x20and\x20restart\x20if\x20you\x20really\x20want\x20it\x20off.');const j=a450a(h);g={'action':'toggle','service':h,'enabled':j,'reminder':i['reminder']};break;}case'disable':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20disable');const k=d,l=getServiceInfo(k);if(!l)throw new Error('Unknown\x20service:\x20'+k+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');if(k==='confirm_gate')throw new Error('confirm_gate\x20cannot\x20be\x20disabled\x20at\x20runtime.\x20'+'Set\x20WOWOK_CONFIRM_GATE=0\x20in\x20the\x20server\x20environment\x20and\x20restart\x20if\x20you\x20really\x20want\x20it\x20off.');a450b(k,![]),g={'action':'disable','service':k,'enabled':![],'reminder':l['reminder']};break;}case'enable':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20enable');const m=d,n=getServiceInfo(m);if(!n)throw new Error('Unknown\x20service:\x20'+m+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');a450b(m,!![]),g={'action':'enable','service':m,'enabled':!![],'reminder':n['reminder']};break;}case'reset':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20reset');const o=d,p=getServiceInfo(o);if(!p)throw new Error('Unknown\x20service:\x20'+o+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');a450c(o),g={'action':'reset','service':o,'enabled':getServiceInfo(o)?.['enabled'],'reminder':p['reminder'],'reset':!![]};break;}case'info':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20info');const q=d,r=getServiceInfo(q);if(!r)throw new Error('Unknown\x20service:\x20'+q+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');g={'action':'info',...r};break;}case'judgment_list':g={'action':'judgment_list',...judgmentStatus()};break;case'judgment_set':{if(!e)throw new Error('\x27path\x27\x20param\x20is\x20required\x20for\x20judgment_set\x20(dotted,\x20e.g.\x20\x27evaluation.weights.trust_reviews\x27)');if(!('value'in b))throw new Error('\x27value\x27\x20param\x20is\x20required\x20for\x20judgment_set');const s=setJudgmentOverride(e,f);if(!s['ok'])throw new Error(s['error']);g={'action':'judgment_set','path':e,'value':f,'applied':!![]};break;}case'judgment_reset':{const t=e?clearJudgmentOverride(e)?0x1:0x0:clearJudgmentOverrides();g={'action':'judgment_reset',...e?{'path':e}:{},'cleared':t};break;}case'judgment_doc_read':{g={'action':'judgment_doc_read',...readUserJudgmentDocView()};break;}case'judgment_doc_patch':{if(!b['patch']||typeof b['patch']!=='object'||Array['isArray'](b['patch']))throw new Error('\x27patch\x27\x20param\x20is\x20required\x20for\x20judgment_doc_patch\x20(a\x20partial\x20judgment\x20document\x20object,\x20e.g.\x20{\x22evaluation\x22:\x20{\x22weights\x22:\x20{…}}})');g={'action':'judgment_doc_patch',...patchUserJudgmentDoc(b['patch'])};break;}default:throw new Error('Unknown\x20config_operation\x20action:\x20'+String(c));}return{'content':[{'type':'text','text':JSON['stringify']({'result':g})}],'structuredContent':{'result':g}};}
1
+ import{listServices,getServiceInfo,toggle as a451a,setEnabled as a451b,reset as a451c}from'../../config/index.js';import{judgmentStatus,setJudgmentOverride,clearJudgmentOverride,clearJudgmentOverrides,patchUserJudgmentDoc,readUserJudgmentDocView}from'../../config/judgment.js';import{strictParse}from'../../schema/index.js';import{ConfigOperationInputSchema}from'../../schema/config/index.js';export async function handleConfigOperation(a){const b=strictParse(ConfigOperationInputSchema,a,'config_operation\x20input'),{action:c,service:d,path:e,value:f}=b;let g;switch(c){case'list':g={'action':'list','services':listServices()};break;case'toggle':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20toggle');const h=d,i=getServiceInfo(h);if(!i)throw new Error('Unknown\x20service:\x20'+h+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');if(h==='confirm_gate'&&i['enabled'])throw new Error('confirm_gate\x20cannot\x20be\x20disabled\x20at\x20runtime.\x20'+'Set\x20WOWOK_CONFIRM_GATE=0\x20in\x20the\x20server\x20environment\x20and\x20restart\x20if\x20you\x20really\x20want\x20it\x20off.');const j=a451a(h);g={'action':'toggle','service':h,'enabled':j,'reminder':i['reminder']};break;}case'disable':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20disable');const k=d,l=getServiceInfo(k);if(!l)throw new Error('Unknown\x20service:\x20'+k+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');if(k==='confirm_gate')throw new Error('confirm_gate\x20cannot\x20be\x20disabled\x20at\x20runtime.\x20'+'Set\x20WOWOK_CONFIRM_GATE=0\x20in\x20the\x20server\x20environment\x20and\x20restart\x20if\x20you\x20really\x20want\x20it\x20off.');a451b(k,![]),g={'action':'disable','service':k,'enabled':![],'reminder':l['reminder']};break;}case'enable':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20enable');const m=d,n=getServiceInfo(m);if(!n)throw new Error('Unknown\x20service:\x20'+m+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');a451b(m,!![]),g={'action':'enable','service':m,'enabled':!![],'reminder':n['reminder']};break;}case'reset':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20reset');const o=d,p=getServiceInfo(o);if(!p)throw new Error('Unknown\x20service:\x20'+o+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');a451c(o),g={'action':'reset','service':o,'enabled':getServiceInfo(o)?.['enabled'],'reminder':p['reminder'],'reset':!![]};break;}case'info':{if(!d)throw new Error('\x27service\x27\x20param\x20is\x20required\x20for\x20info');const q=d,r=getServiceInfo(q);if(!r)throw new Error('Unknown\x20service:\x20'+q+'.\x20Use\x20action=\x27list\x27\x20to\x20see\x20all\x20valid\x20services.');g={'action':'info',...r};break;}case'judgment_list':g={'action':'judgment_list',...judgmentStatus()};break;case'judgment_set':{if(!e)throw new Error('\x27path\x27\x20param\x20is\x20required\x20for\x20judgment_set\x20(dotted,\x20e.g.\x20\x27evaluation.weights.trust_reviews\x27)');if(!('value'in b))throw new Error('\x27value\x27\x20param\x20is\x20required\x20for\x20judgment_set');const s=setJudgmentOverride(e,f);if(!s['ok'])throw new Error(s['error']);g={'action':'judgment_set','path':e,'value':f,'applied':!![]};break;}case'judgment_reset':{const t=e?clearJudgmentOverride(e)?0x1:0x0:clearJudgmentOverrides();g={'action':'judgment_reset',...e?{'path':e}:{},'cleared':t};break;}case'judgment_doc_read':{g={'action':'judgment_doc_read',...readUserJudgmentDocView()};break;}case'judgment_doc_patch':{if(!b['patch']||typeof b['patch']!=='object'||Array['isArray'](b['patch']))throw new Error('\x27patch\x27\x20param\x20is\x20required\x20for\x20judgment_doc_patch\x20(a\x20partial\x20judgment\x20document\x20object,\x20e.g.\x20{\x22evaluation\x22:\x20{\x22weights\x22:\x20{…}}})');g={'action':'judgment_doc_patch',...patchUserJudgmentDoc(b['patch'])};break;}default:throw new Error('Unknown\x20config_operation\x20action:\x20'+String(c));}return{'content':[{'type':'text','text':JSON['stringify']({'result':g})}],'structuredContent':{'result':g}};}
@@ -1 +1 @@
1
- import{resolve}from'path';import{Config}from'@wowok/wowok';import{strictParse,getEnvConfig,Guard2File_InputSchema,MachineNode2File_InputSchema}from'../../schema/index.js';import{guard2file,machineNode2file}from'@wowok/wowok';async function effectiveNetwork(a,b){return Config['Instance']()['network_get'](a??b);}export async function handleGuard2File(a){const b=strictParse(Guard2File_InputSchema,a,'guard2file\x20input'),c=getEnvConfig(b['env']),d=await effectiveNetwork(b['network'],c['network']);try{const e=await guard2file(b['guard'],b['file_path'],b['format']||'json',d),f={'result':{'status':'success','data':{'file_path':resolve(e),'format':b['format']||'json','guard':b['guard'],'network':d}}};return{'content':[{'type':'text','text':JSON['stringify'](f)}],'structuredContent':f};}catch(g){const h={'result':{'status':'error','error':g['message']}};return{'content':[{'type':'text','text':JSON['stringify'](h)}],'structuredContent':h};}}export async function handleMachineNode2File(a){const b=strictParse(MachineNode2File_InputSchema,a,'machineNode2file\x20input'),c=getEnvConfig(b['env']),d=await effectiveNetwork(b['network'],c['network']);try{const e=await machineNode2file(b['machine'],b['file_path'],b['format']||'json',d);let f=undefined;try{const h=resolve(e),i=await import('fs/promises')['then'](j=>j['readFile'](h,'utf-8'));if((b['format']||'json')==='json'){const j=JSON['parse'](i);Array['isArray'](j)&&(f=j['length']);}else{const k=i['match'](/^##\s+Node:/gm);f=k?k['length']:0x0;}}catch{f=undefined;}const g={'result':{'status':'success','data':{'file_path':resolve(e),'format':b['format']||'json','machine_object':b['machine'],'network':d}}};return f!==undefined&&(g['result']['data']['node_count']=f),{'content':[{'type':'text','text':JSON['stringify'](g)}],'structuredContent':g};}catch(l){const m={'result':{'status':'error','error':l['message']}};return{'content':[{'type':'text','text':JSON['stringify'](m)}],'structuredContent':m};}}
1
+ import{resolve}from'path';import{Config}from'@wowok/wowok';import{strictParse,getEnvConfig,Guard2File_InputSchema,MachineNode2File_InputSchema}from'../../schema/index.js';import{guard2file,machineNode2file}from'@wowok/wowok';import{requiredSubmissionSlots}from'../../knowledge/guard-submission-brief.js';async function effectiveNetwork(a,b){return Config['Instance']()['network_get'](a??b);}export async function handleGuard2File(a){const b=strictParse(Guard2File_InputSchema,a,'guard2file\x20input'),c=getEnvConfig(b['env']),d=await effectiveNetwork(b['network'],c['network']);try{const e=await guard2file(b['guard'],b['file_path'],b['format']||'json',d);let f=undefined;if((b['format']||'json')==='json')try{const h=await import('fs/promises')['then'](j=>j['readFile'](resolve(e),'utf-8')),i=JSON['parse'](h);f=requiredSubmissionSlots(i['table']);}catch{}const g={'result':{'status':'success','data':{'file_path':resolve(e),'format':b['format']||'json','guard':b['guard'],'network':d,...f?{'required_submission_slots':f,'required_submission_slots_note':'Submitting\x20to\x20a\x20Machine\x20forward\x20(or\x20any\x20Guard-triggering\x20operation)\x20requires\x20EVERY\x20slot\x20below\x20in\x20the\x20submission\x20identifier\x20list\x20—\x20the\x20on-chain\x20forward\x20aborts\x20(code\x2011)\x20otherwise.'}:{}}}};return{'content':[{'type':'text','text':JSON['stringify'](g)}],'structuredContent':g};}catch(j){const k={'result':{'status':'error','error':j['message']}};return{'content':[{'type':'text','text':JSON['stringify'](k)}],'structuredContent':k};}}export async function handleMachineNode2File(a){const b=strictParse(MachineNode2File_InputSchema,a,'machineNode2file\x20input'),c=getEnvConfig(b['env']),d=await effectiveNetwork(b['network'],c['network']);try{const e=await machineNode2file(b['machine'],b['file_path'],b['format']||'json',d);let f=undefined;try{const h=resolve(e),i=await import('fs/promises')['then'](j=>j['readFile'](h,'utf-8'));if((b['format']||'json')==='json'){const j=JSON['parse'](i);Array['isArray'](j)&&(f=j['length']);}else{const k=i['match'](/^##\s+Node:/gm);f=k?k['length']:0x0;}}catch{f=undefined;}const g={'result':{'status':'success','data':{'file_path':resolve(e),'format':b['format']||'json','machine_object':b['machine'],'network':d}}};return f!==undefined&&(g['result']['data']['node_count']=f),{'content':[{'type':'text','text':JSON['stringify'](g)}],'structuredContent':g};}catch(l){const m={'result':{'status':'error','error':l['message']}};return{'content':[{'type':'text','text':JSON['stringify'](m)}],'structuredContent':m};}}
@@ -1,2 +1,3 @@
1
1
  import type { ToolDispatchResult } from "../types.js";
2
+ export declare function isShellPayload(payload: unknown): boolean;
2
3
  export declare function handleIndustryPackOperation(args: unknown): Promise<ToolDispatchResult>;
@@ -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 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 C=getIndustryModeRegistry()['getMode'](v);return C?{'name':C['name'],'display_name':C['display_name'],'key_risk':C['key_risk'],'needs':C['needs']['map'](D=>D['description']),...C['analyze']?.['key_questions']?.['length']?{'analyze_questions':C['analyze']['key_questions']['slice'](0x0,0x2)}:{}}:undefined;};if(b['layer']==='template'){if(b['template']){const C=getBuiltinTemplate(b['template']);if(!C)throw new Error('template\x20\x27'+b['template']+'\x27\x20is\x20not\x20in\x20the\x20builtin\x20catalog\x20'+('(available:\x20'+listBuiltinTemplates()['map'](D=>D['id'])['join'](',\x20')+')'));if(C['industry']!==v)throw new Error('template\x20\x27'+C['id']+'\x27\x20belongs\x20to\x20industry\x20\x27'+C['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'](C))};}else{const D=listBuiltinTemplates()['filter'](E=>E['industry']===v)['map'](E=>({'id':E['id'],'variant':E['variant'],'product_ref':E['product_ref'],'key_risk':E['key_risk']}));if(!D['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':D,'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 E=b['layer'];if(E==='match')throw new Error('layer\x20\x27match\x27\x20is\x20consumed\x20internally\x20by\x20the\x20recommend\x20matching\x20flow\x20—\x20not\x20exposed\x20via\x20get');if(!x['includes'](E))throw new Error('pack\x20\x27'+v+'\x27\x20does\x20not\x20register\x20layer\x20\x27'+E+'\x27'+(w?'\x20(kind='+packKind(x)+',\x20layers=['+x['join'](',\x20')+'])':'\x20(the\x20pack\x20is\x20not\x20registered)')+(E!=='mode'?';\x20layer=\x27template\x27\x20reads\x20the\x20builtin\x20catalog\x20instead\x20if\x20that\x20is\x20what\x20you\x20need':''));const F=E==='mode'?z():E==='dispute'?resolveDisputeRules(v):E==='compliance'?resolveComplianceRules(v):E==='supply'?resolveSupplyRules(v):E==='rules'?resolveIndustryRules(v):resolveIndustryPlaybook(v);if(F===undefined)throw new Error('layer\x20\x27'+E+'\x27\x20is\x20registered\x20for\x20pack\x20\x27'+v+'\x27\x20but\x20resolved\x20to\x20no\x20data');c={'action':'get','category':v,'layer':E,[E]:F,...y()};break;}const A=z(),B=['dispute','compliance','supply','rules','playbook']['filter'](G=>!x['includes'](G));c={'action':'get','category':v,...y(),...A?{'mode':A}:{},...resolveDisputeRules(v)?{'dispute':resolveDisputeRules(v)}:{},...resolveComplianceRules(v)?{'compliance':resolveComplianceRules(v)}:{},...resolveSupplyRules(v)?{'supply':resolveSupplyRules(v)}:{},...resolveIndustryRules(v)?{'rules':resolveIndustryRules(v)}:{},...resolveIndustryPlaybook(v)?{'playbook':resolveIndustryPlaybook(v)}:{},...B['length']?{'missing_layers':B,'note':'pack\x20\x27'+v+'\x27\x20('+(w?packKind(x):'unregistered')+')\x20does\x20not\x20register\x20'+('['+B['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.'}:{}};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 G=resetIndustryPath(b['path']);c={'action':'reset','ok':G['ok'],'layout':G['layout'],'target':G['target'],'restored_files':G['restored_files'],'errors':G['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 H=resolveIndustryPath(b['path']);if(!existsSync(H))throw new Error('file\x20not\x20found:\x20'+b['path']);rmSync(H,{'recursive':!![],'force':!![]}),c={'action':'delete_file','path':H,'ok':!![]},rescanAffectedPack(b['path']);break;}case'create_file':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27create_file\x27');const I=resolveIndustryPath(b['path']);if(existsSync(I))throw new Error('file\x20already\x20exists:\x20'+b['path']);if(b['content']!==undefined)assertBaselinesContentValid(b['path'],b['content']);mkdirSync(dirname(I),{'recursive':!![]}),writeFileSync(I,b['content']??'','utf-8'),c={'action':'create_file','path':I,'ok':!![]},rescanAffectedPack(b['path']);break;}case'create_dir':{if(!b['path'])throw new Error('\x27path\x27\x20is\x20required\x20for\x20action=\x27create_dir\x27');const J=resolveIndustryPath(b['path']);mkdirSync(J,{'recursive':!![]}),c={'action':'create_dir','path':J,'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 K=resolveIndustryPath(b['from']);let L=resolveIndustryPath(b['to']);if(!existsSync(K))throw new Error('source\x20not\x20found:\x20'+b['from']);try{existsSync(L)&&statSync(L)['isDirectory']()&&(L=join(L,basename(K)));}catch{}if(L===K)throw new Error('\x27copy\x27\x20cannot\x20copy\x20a\x20file\x20onto\x20itself');existsSync(L)&&isTemplateTreePath(b['to'])&&assertTemplateWriteAuthorized('copy',[b['to']],b['authorize']);mkdirSync(dirname(L),{'recursive':!![]}),cpSync(K,L,{'recursive':!![],'force':!![]}),c={'action':'copy','from':K,'to':L,'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 M=resolveIndustryPath(b['from']);let N=resolveIndustryPath(b['to']);if(!existsSync(M))throw new Error('source\x20not\x20found:\x20'+b['from']);try{existsSync(N)&&statSync(N)['isDirectory']()&&(N=join(N,basename(M)));}catch{}if(N===M)throw new Error('\x27'+b['action']+'\x27\x20cannot\x20move\x20onto\x20itself');mkdirSync(dirname(N),{'recursive':!![]}),renameSync(M,N),c={'action':b['action'],'from':M,'to':N,'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{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 +1 @@
1
- import{wrapLocalHandler}from'../shared.js';import{withFaucetRetry}from'../retry.js';import{strictParse}from'../../schema/index.js';import{AccountOperationSchema,LocalMarkOperationSchema,LocalInfoOperationSchema,LocalHistoryOperationSchema,LocalCacheOperationSchema}from'../../schema/index.js';import{Cache}from'@wowok/wowok/w/local/cache';import{Account}from'@wowok/wowok/w/local';import{clearChainScope,resolveChainIdentity}from'@wowok/wowok/w/local/chain-scope';import{account_operation,local_mark_operation,local_info_operation,local_history_operation,GasTokenType,isFundApprovalExempt}from'@wowok/wowok';import{parseAmount,generateFundConfirmation,generateSkillsHint,formatAmountText}from'../../knowledge/fund-layer.js';import{buildDataSemantic}from'../../schema/call/semantic.js';function deriveOpType(a,b){for(const c of Object['keys'](b)){if(b[c]!==undefined)return a+'_'+String(c);}return a+'_unknown';}function accountError(a,b){return{'content':[{'type':'text','text':'Error:\x20'+a}],'structuredContent':{'result':{'status':'error','error':a},'semantic':buildDataSemantic(undefined,b,!![],a)}};}function buildAccountContext(a){return{'operation_type':deriveOpType('account',a),'data':a};}const DEFAULT_ACCOUNT_CLIENT_ONLY='The\x20default\x20account\x20is\x20the\x20app\x27s\x20root\x20identity\x20and\x20is\x20managed\x20by\x20the\x20'+'client\x20Wallet\x20app\x20only\x20—\x20it\x20cannot\x20be\x20renamed\x20or\x20suspended\x20via\x20MCP.\x20'+'Ask\x20the\x20user\x20to\x20rename\x20or\x20suspend\x20it\x20in\x20the\x20client\x27s\x20Wallet\x20tab,\x20or\x20'+'target\x20a\x20named\x20(non-default)\x20account\x20instead.',SWAP_DEFAULT_ACCOUNT_CLIENT_ONLY='Swapping\x20a\x20name\x20with\x20the\x20default\x20account\x20is\x20not\x20allowed\x20via\x20MCP\x20—\x20the\x20'+'default\x20account\x20is\x20the\x20app\x27s\x20root\x20identity\x20and\x20is\x20managed\x20by\x20the\x20client\x20'+'Wallet\x20app\x20only.\x20Ask\x20the\x20user\x20to\x20manage\x20it\x20in\x20the\x20client\x27s\x20Wallet\x20tab,\x20'+'or\x20swap\x20two\x20named\x20(non-default)\x20accounts\x20instead.';async function isDefaultAccountTarget(a){if(a===undefined||a['trim']()==='')return!![];try{const b=await Account['Instance']()['get'](a);return!!b&&!b['suspended']&&(b['name']??'')==='';}catch{return![];}}function isDefaultNameRef(a){return a===undefined||a['trim']()==='';}async function fundProcessCoinAmount(a,b,c){try{const d=await parseAmount(a,b,c);return{'parsed':d};}catch(f){return{'error':f instanceof Error?f['message']:String(f)};}}async function coinFundGate(a,b,c,d,e,f){const {parsed:g,error:h}=await fundProcessCoinAmount(a,b,c);if(h||!g)return{'blocked':accountError(h??'Amount\x20parsing\x20failed',f)};try{const j=await Account['Instance']()['balance'](b,e['accountRef'],c),k=j?.['totalBalance'];if(k!==undefined&&BigInt(k)<g['smallestUnit']){const l=e['accountRef']?'\x27'+e['accountRef']+'\x27':'(default\x20account)';return{'blocked':accountError('Insufficient\x20balance:\x20'+e['key']+'\x20requires\x20'+(formatAmountText(g['smallestUnit'],g['decimals'],g['tokenSymbol'])+'\x20but\x20account\x20'+l+'\x20holds\x20')+(formatAmountText(k,g['decimals'],g['tokenSymbol'])+'.\x20')+'Fund\x20the\x20account\x20first\x20(faucet\x20on\x20testnet/localnet)\x20or\x20lower\x20the\x20amount.',f)};}}catch{}const i=isFundApprovalExempt(c,b,g['smallestUnit']['toString']());if(!i&&d!==!![]){const m=generateFundConfirmation([{'path':e['amountPath'],'displayAmount':g['displayAmount'],'tokenType':g['tokenType'],'tokenSymbol':g['tokenSymbol'],'decimals':g['decimals'],'smallestUnit':g['smallestUnit']['toString'](),'verified':g['verified'],'source':g['source'],'converted':g['converted'],'context':e['context']}],[]),n=generateSkillsHint(m),o=[m['message'],'',...e['detailLines'],n??'','The\x20'+e['key']+'\x20was\x20NOT\x20executed.\x20If\x20the\x20user\x20consents,\x20re-call\x20with\x20the\x20SAME\x20parameters\x20plus\x20'+e['key']+'.confirmed=true.']['filter'](p=>p!=='')['join']('\x0a');return{'blocked':{'content':[{'type':'text','text':o}],'structuredContent':{'result':{'status':'pending_confirmation','operation':e['operation'],'message':o,'rule_id':e['ruleId']},'semantic':{...buildDataSemantic(undefined,f,!![],'pending\x20user\x20confirmation'),'summary':e['summary']}}}};}return{'parsed':g};}async function executeAccountOperation(a,b){try{const c=await withFaucetRetry(account_operation)(a);return{'content':[{'type':'text','text':JSON['stringify'](c)}],'structuredContent':{'result':{'status':'success','data':c},'semantic':buildDataSemantic(c,b)}};}catch(d){const e=d instanceof Error?d['message']:String(d);return accountError(e,b);}}export const handleAccountOperation=async a=>{let b;try{b=strictParse(AccountOperationSchema,a,'account_operation\x20input');}catch(d){return accountError('Parameter\x20validation\x20failed:\x20'+(d?.['message']??String(d)));}const c=buildAccountContext(b);if(b['suspend']!==undefined||b['rename']!==undefined){const f=b['suspend']?.['name_or_address']??b['rename']?.['name_or_address'];if(await isDefaultAccountTarget(f))return accountError(DEFAULT_ACCOUNT_CLIENT_ONLY,c);}if(b['swap_name']!==undefined){const {name1:g,name2:h}=b['swap_name'];if(isDefaultNameRef(g)||isDefaultNameRef(h))return accountError(SWAP_DEFAULT_ACCOUNT_CLIENT_ONLY,c);}if(b['transfer']!==undefined){const i=b['transfer'],j=await coinFundGate(i['amount'],i['token_type']??GasTokenType,i['network'],i['confirmed'],{'key':'transfer','amountPath':'transfer.amount','context':'Account\x20token\x20transfer','operation':'account_transfer','ruleId':'account_transfer_fund_movement','summary':'Token\x20transfer\x20blocked\x20pending\x20user\x20confirmation.\x20Re-call\x20with\x20transfer.confirmed=true\x20to\x20proceed.','detailLines':['Recipient:\x20'+(i['name_or_address_to']??'(default\x20account)'),'Sender:\x20'+(i['name_or_address_from']??'(default\x20account)')],'accountRef':i['name_or_address_from']},c);if('blocked'in j)return j['blocked'];const k={...b,'transfer':{...i,'amount':j['parsed']['smallestUnit']['toString']()}};return delete k['transfer']['confirmed'],executeAccountOperation(k,c);}if(b['get']!==undefined){const l=b['get'],m=await coinFundGate(l['balance_required'],l['token_type']??GasTokenType,l['network'],l['confirmed'],{'key':'get','amountPath':'get.balance_required','context':'Coin\x20object\x20production\x20(split/merge\x20+\x20self-delivery)','operation':'account_get_coin_object','ruleId':'account_get_fund_movement','summary':'Coin\x20object\x20production\x20blocked\x20pending\x20user\x20confirmation.\x20Re-call\x20with\x20get.confirmed=true\x20to\x20proceed.','detailLines':['Account:\x20'+(l['name_or_address']??'(default\x20account)'),'Effect:\x20splits/merges\x20the\x20account\x27s\x20coins\x20and\x20self-delivers\x20a\x20coin\x20object;\x20funds\x20never\x20leave\x20the\x20account\x20but\x20GAS\x20IS\x20SPENT.','On\x20success\x20the\x20result\x20reports\x20the\x20coin\x27s\x20ACTUAL\x20on-chain\x20balance\x20—\x20check\x20it\x20against\x20the\x20amount\x20you\x20need\x20before\x20relying\x20on\x20it.'],'accountRef':l['name_or_address']},c);if('blocked'in m)return m['blocked'];const n={...b,'get':{...l,'balance_required':m['parsed']['smallestUnit']['toString']()}};return delete n['get']['confirmed'],executeAccountOperation(n,c);}return executeAccountOperation(b,c);};export const handleMarkOperation=wrapLocalHandler({'schema':LocalMarkOperationSchema,'operationFn':local_mark_operation,'parseLabel':'local_mark_operation\x20input','buildContext':a=>{const b={'operation_type':deriveOpType('mark',a),'data':a},c=a;return c['add']&&Array['isArray'](c['add']['data'])&&c['add']['data']['length']>0x0&&(b['pre_warnings']=['Cross-network\x20consistency\x20(FIX-011):\x20LocalMark\x20names\x20are\x20scoped\x20per\x20network.\x20'+'When\x20creating\x20marks\x20for\x20the\x20same\x20logical\x20object\x20on\x20different\x20networks\x20'+'(e.g.\x20testnet\x20and\x20mainnet),\x20use\x20the\x20SAME\x20name\x20value\x20to\x20keep\x20name-based\x20'+'references\x20portable.\x20Before\x20creating\x20a\x20mark\x20on\x20mainnet,\x20consider\x20querying\x20'+'testnet\x20via\x20query_local\x20with\x20network=\x27testnet\x27\x20to\x20check\x20for\x20an\x20existing\x20'+'same-named\x20mark\x20and\x20replicate\x20it.']),b;}});export const handleInfoOperation=wrapLocalHandler({'schema':LocalInfoOperationSchema,'operationFn':local_info_operation,'parseLabel':'local_info_operation\x20input','buildContext':a=>({'operation_type':deriveOpType('local_info',a),'data':a})});export const handleHistoryOperation=wrapLocalHandler({'schema':LocalHistoryOperationSchema,'operationFn':local_history_operation,'parseLabel':'local_history_operation\x20input','buildContext':a=>({'operation_type':deriveOpType('local_history',a),'data':a})});async function readStorageStats(){if(!Cache['hasStorage']())return{'rows':null,'bytes':null};const a=Cache['storage']?.['getStats'];if(typeof a!=='function')return{'rows':null,'bytes':null};try{const b=await a['call'](Cache['storage']);return{'rows':b?.['count']??null,'bytes':b?.['totalBytes']??null};}catch{return{'rows':null,'bytes':null};}}function buildCacheContext(a){return{'operation_type':deriveOpType('cache',a),'data':a};}function cacheSuccess(a,b){return{'content':[{'type':'text','text':JSON['stringify'](a,null,0x2)}],'structuredContent':{'result':{'status':'success','data':a},'semantic':buildDataSemantic(a,b)}};}export const handleCacheOperation=async a=>{let b;try{b=strictParse(LocalCacheOperationSchema,a,'local_cache_operation\x20input');}catch(d){return{'content':[{'type':'text','text':'Error:\x20'+(d instanceof Error?d['message']:String(d))}],'structuredContent':{'result':{'status':'error','error':d instanceof Error?d['message']:String(d),'error_code':'invalid_param','retryable':![],'recovery_hint':'Pass\x20exactly\x20one\x20nested\x20operation:\x20{status:{op:\x27status\x27}},\x20{clear_prefix:{op:\x27clear_prefix\x27,prefix:\x27objectv2\x27}},\x20{clear:{op:\x27clear\x27}},\x20or\x20{refresh_chain_scope:{op:\x27refresh_chain_scope\x27}}.'}}};}const c=buildCacheContext(b);try{if(b['status']){const {rows:f,bytes:g}=await readStorageStats();return cacheSuccess({'op':'status','chain_identity':Cache['chainIdentityOf']()??null,'storage_attached':Cache['hasStorage'](),'memory_entries':Cache['memory']['size'],'storage_rows':f,'storage_bytes':g},c);}if(b['clear_prefix']){const {prefix:h}=b['clear_prefix'];return await Cache['clearPrefix'](h),cacheSuccess({'op':'clear_prefix','prefix':h,'chain_identity':Cache['chainIdentityOf']()??null},c);}if(b['clear'])return await Cache['clear'](),cacheSuccess({'op':'clear','cleared':!![],'chain_identity':Cache['chainIdentityOf']()??null},c);if(b['refresh_chain_scope']){const i=Cache['chainIdentityOf']()??null;clearChainScope();const j=await resolveChainIdentity(b['refresh_chain_scope']['network'])??null;return cacheSuccess({'op':'refresh_chain_scope','previous_chain_identity':i,'chain_identity':j,'changed':j!==null&&j!==i,'resolved':j!==null},c);}return accountError('No\x20cache\x20operation\x20specified',c);}catch(k){const l=k instanceof Error?k['message']:String(k);return{'content':[{'type':'text','text':'Error:\x20'+l}],'structuredContent':{'result':{'status':'error','error':l,'error_code':'unknown_error','retryable':!![],'recovery_hint':'If\x20the\x20cache\x20backend\x20is\x20locked\x20or\x20corrupt,\x20use\x20{clear:\x20{op:\x27clear\x27}}\x20to\x20drop\x20everything,\x20or\x20{refresh_chain_scope:\x20{op:\x27refresh_chain_scope\x27}}\x20if\x20the\x20node\x20was\x20reset.'},'semantic':buildDataSemantic(undefined,c,!![],l)}};}};
1
+ import{wrapLocalHandler}from'../shared.js';import{withFaucetRetry}from'../retry.js';import{strictParse}from'../../schema/index.js';import{AccountOperationSchema,LocalMarkOperationSchema,LocalInfoOperationSchema,LocalHistoryOperationSchema,LocalCacheOperationSchema}from'../../schema/index.js';import{Cache}from'@wowok/wowok/w/local/cache';import{Account}from'@wowok/wowok/w/local';import{clearChainScope,resolveChainIdentity}from'@wowok/wowok/w/local/chain-scope';import{account_operation,local_mark_operation,local_info_operation,local_history_operation,GasTokenType,isFundApprovalExempt}from'@wowok/wowok';import{parseAmount,generateFundConfirmation,generateSkillsHint,formatAmountText}from'../../knowledge/fund-layer.js';import{buildDataSemantic}from'../../schema/call/semantic.js';import{resolveNetwork}from'./network.js';function deriveOpType(a,b){for(const c of Object['keys'](b)){if(b[c]!==undefined)return a+'_'+String(c);}return a+'_unknown';}function accountError(a,b){return{'content':[{'type':'text','text':'Error:\x20'+a}],'structuredContent':{'result':{'status':'error','error':a},'semantic':buildDataSemantic(undefined,b,!![],a)}};}function buildAccountContext(a){return{'operation_type':deriveOpType('account',a),'data':a};}const DEFAULT_ACCOUNT_CLIENT_ONLY='The\x20default\x20account\x20is\x20the\x20app\x27s\x20root\x20identity\x20and\x20is\x20managed\x20by\x20the\x20'+'client\x20Wallet\x20app\x20only\x20—\x20it\x20cannot\x20be\x20renamed\x20or\x20suspended\x20via\x20MCP.\x20'+'Ask\x20the\x20user\x20to\x20rename\x20or\x20suspend\x20it\x20in\x20the\x20client\x27s\x20Wallet\x20tab,\x20or\x20'+'target\x20a\x20named\x20(non-default)\x20account\x20instead.',SWAP_DEFAULT_ACCOUNT_CLIENT_ONLY='Swapping\x20a\x20name\x20with\x20the\x20default\x20account\x20is\x20not\x20allowed\x20via\x20MCP\x20—\x20the\x20'+'default\x20account\x20is\x20the\x20app\x27s\x20root\x20identity\x20and\x20is\x20managed\x20by\x20the\x20client\x20'+'Wallet\x20app\x20only.\x20Ask\x20the\x20user\x20to\x20manage\x20it\x20in\x20the\x20client\x27s\x20Wallet\x20tab,\x20'+'or\x20swap\x20two\x20named\x20(non-default)\x20accounts\x20instead.';async function isDefaultAccountTarget(a){if(a===undefined||a['trim']()==='')return!![];try{const b=await Account['Instance']()['get'](a);return!!b&&!b['suspended']&&(b['name']??'')==='';}catch{return![];}}function isDefaultNameRef(a){return a===undefined||a['trim']()==='';}async function fundProcessCoinAmount(a,b,c){try{const d=await parseAmount(a,b,c);return{'parsed':d};}catch(f){return{'error':f instanceof Error?f['message']:String(f)};}}async function coinFundGate(a,b,c,d,e,f){const {parsed:g,error:h}=await fundProcessCoinAmount(a,b,c);if(h||!g)return{'blocked':accountError(h??'Amount\x20parsing\x20failed',f)};try{const j=await Account['Instance']()['balance'](b,e['accountRef'],c),k=j?.['totalBalance'];if(k!==undefined&&BigInt(k)<g['smallestUnit']){const l=e['accountRef']?'\x27'+e['accountRef']+'\x27':'(default\x20account)';return{'blocked':accountError('Insufficient\x20balance:\x20'+e['key']+'\x20requires\x20'+(formatAmountText(g['smallestUnit'],g['decimals'],g['tokenSymbol'])+'\x20but\x20account\x20'+l+'\x20holds\x20')+(formatAmountText(k,g['decimals'],g['tokenSymbol'])+'.\x20')+'Fund\x20the\x20account\x20first\x20(faucet\x20on\x20testnet/localnet)\x20or\x20lower\x20the\x20amount.',f)};}}catch{}const i=isFundApprovalExempt(c,b,g['smallestUnit']['toString']());if(!i&&d!==!![]){const m=generateFundConfirmation([{'path':e['amountPath'],'displayAmount':g['displayAmount'],'tokenType':g['tokenType'],'tokenSymbol':g['tokenSymbol'],'decimals':g['decimals'],'smallestUnit':g['smallestUnit']['toString'](),'verified':g['verified'],'source':g['source'],'converted':g['converted'],'context':e['context']}],[]),n=generateSkillsHint(m),o=[m['message'],'',...e['detailLines'],n??'','The\x20'+e['key']+'\x20was\x20NOT\x20executed.\x20If\x20the\x20user\x20consents,\x20re-call\x20with\x20the\x20SAME\x20parameters\x20plus\x20'+e['key']+'.confirmed=true.']['filter'](p=>p!=='')['join']('\x0a');return{'blocked':{'content':[{'type':'text','text':o}],'structuredContent':{'result':{'status':'pending_confirmation','operation':e['operation'],'message':o,'rule_id':e['ruleId']},'semantic':{...buildDataSemantic(undefined,f,!![],'pending\x20user\x20confirmation'),'summary':e['summary']}}}};}return{'parsed':g};}async function executeAccountOperation(a,b){try{const c=await withFaucetRetry(account_operation)(a);try{if(c['transfer']){const d=c['transfer'];d['network']=await resolveNetwork(a['transfer']?.['network']),d['network_source']=a['transfer']?.['network']?'request':'session_default';}if(c['get']){const e=c['get'];e['network']=await resolveNetwork(a['get']?.['network']),e['network_source']=a['get']?.['network']?'request':'session_default';}}catch{}return{'content':[{'type':'text','text':JSON['stringify'](c)}],'structuredContent':{'result':{'status':'success','data':c},'semantic':buildDataSemantic(c,b)}};}catch(f){const g=f instanceof Error?f['message']:String(f);return accountError(g,b);}}export const handleAccountOperation=async a=>{let b;try{b=strictParse(AccountOperationSchema,a,'account_operation\x20input');}catch(d){return accountError('Parameter\x20validation\x20failed:\x20'+(d?.['message']??String(d)));}const c=buildAccountContext(b);if(b['suspend']!==undefined||b['rename']!==undefined){const f=b['suspend']?.['name_or_address']??b['rename']?.['name_or_address'];if(await isDefaultAccountTarget(f))return accountError(DEFAULT_ACCOUNT_CLIENT_ONLY,c);}if(b['swap_name']!==undefined){const {name1:g,name2:h}=b['swap_name'];if(isDefaultNameRef(g)||isDefaultNameRef(h))return accountError(SWAP_DEFAULT_ACCOUNT_CLIENT_ONLY,c);}if(b['transfer']!==undefined){const i=b['transfer'],j=await coinFundGate(i['amount'],i['token_type']??GasTokenType,i['network'],i['confirmed'],{'key':'transfer','amountPath':'transfer.amount','context':'Account\x20token\x20transfer','operation':'account_transfer','ruleId':'account_transfer_fund_movement','summary':'Token\x20transfer\x20blocked\x20pending\x20user\x20confirmation.\x20Re-call\x20with\x20transfer.confirmed=true\x20to\x20proceed.','detailLines':['Recipient:\x20'+(i['name_or_address_to']??'(default\x20account)'),'Sender:\x20'+(i['name_or_address_from']??'(default\x20account)')],'accountRef':i['name_or_address_from']},c);if('blocked'in j)return j['blocked'];const k={...b,'transfer':{...i,'amount':j['parsed']['smallestUnit']['toString']()}};return delete k['transfer']['confirmed'],executeAccountOperation(k,c);}if(b['get']!==undefined){const l=b['get'],m=await coinFundGate(l['balance_required'],l['token_type']??GasTokenType,l['network'],l['confirmed'],{'key':'get','amountPath':'get.balance_required','context':'Coin\x20object\x20production\x20(split/merge\x20+\x20self-delivery)','operation':'account_get_coin_object','ruleId':'account_get_fund_movement','summary':'Coin\x20object\x20production\x20blocked\x20pending\x20user\x20confirmation.\x20Re-call\x20with\x20get.confirmed=true\x20to\x20proceed.','detailLines':['Account:\x20'+(l['name_or_address']??'(default\x20account)'),'Effect:\x20splits/merges\x20the\x20account\x27s\x20coins\x20and\x20self-delivers\x20a\x20coin\x20object;\x20funds\x20never\x20leave\x20the\x20account\x20but\x20GAS\x20IS\x20SPENT.','On\x20success\x20the\x20result\x20reports\x20the\x20coin\x27s\x20ACTUAL\x20on-chain\x20balance\x20—\x20check\x20it\x20against\x20the\x20amount\x20you\x20need\x20before\x20relying\x20on\x20it.'],'accountRef':l['name_or_address']},c);if('blocked'in m)return m['blocked'];const n={...b,'get':{...l,'balance_required':m['parsed']['smallestUnit']['toString']()}};return delete n['get']['confirmed'],executeAccountOperation(n,c);}return executeAccountOperation(b,c);};export const handleMarkOperation=wrapLocalHandler({'schema':LocalMarkOperationSchema,'operationFn':local_mark_operation,'parseLabel':'local_mark_operation\x20input','buildContext':a=>{const b={'operation_type':deriveOpType('mark',a),'data':a},c=a;return c['add']&&Array['isArray'](c['add']['data'])&&c['add']['data']['length']>0x0&&(b['pre_warnings']=['Cross-network\x20consistency\x20(FIX-011):\x20LocalMark\x20names\x20are\x20scoped\x20per\x20network.\x20'+'When\x20creating\x20marks\x20for\x20the\x20same\x20logical\x20object\x20on\x20different\x20networks\x20'+'(e.g.\x20testnet\x20and\x20mainnet),\x20use\x20the\x20SAME\x20name\x20value\x20to\x20keep\x20name-based\x20'+'references\x20portable.\x20Before\x20creating\x20a\x20mark\x20on\x20mainnet,\x20consider\x20querying\x20'+'testnet\x20via\x20query_local\x20with\x20network=\x27testnet\x27\x20to\x20check\x20for\x20an\x20existing\x20'+'same-named\x20mark\x20and\x20replicate\x20it.']),b;}});export const handleInfoOperation=wrapLocalHandler({'schema':LocalInfoOperationSchema,'operationFn':local_info_operation,'parseLabel':'local_info_operation\x20input','buildContext':a=>({'operation_type':deriveOpType('local_info',a),'data':a})});export const handleHistoryOperation=wrapLocalHandler({'schema':LocalHistoryOperationSchema,'operationFn':local_history_operation,'parseLabel':'local_history_operation\x20input','buildContext':a=>({'operation_type':deriveOpType('local_history',a),'data':a})});async function readStorageStats(){if(!Cache['hasStorage']())return{'rows':null,'bytes':null};const a=Cache['storage']?.['getStats'];if(typeof a!=='function')return{'rows':null,'bytes':null};try{const b=await a['call'](Cache['storage']);return{'rows':b?.['count']??null,'bytes':b?.['totalBytes']??null};}catch{return{'rows':null,'bytes':null};}}function buildCacheContext(a){return{'operation_type':deriveOpType('cache',a),'data':a};}function cacheSuccess(a,b){return{'content':[{'type':'text','text':JSON['stringify'](a,null,0x2)}],'structuredContent':{'result':{'status':'success','data':a},'semantic':buildDataSemantic(a,b)}};}export const handleCacheOperation=async a=>{let b;try{b=strictParse(LocalCacheOperationSchema,a,'local_cache_operation\x20input');}catch(d){return{'content':[{'type':'text','text':'Error:\x20'+(d instanceof Error?d['message']:String(d))}],'structuredContent':{'result':{'status':'error','error':d instanceof Error?d['message']:String(d),'error_code':'invalid_param','retryable':![],'recovery_hint':'Pass\x20exactly\x20one\x20nested\x20operation:\x20{status:{op:\x27status\x27}},\x20{clear_prefix:{op:\x27clear_prefix\x27,prefix:\x27objectv2\x27}},\x20{clear:{op:\x27clear\x27}},\x20or\x20{refresh_chain_scope:{op:\x27refresh_chain_scope\x27}}.'}}};}const c=buildCacheContext(b);try{if(b['status']){const {rows:f,bytes:g}=await readStorageStats();return cacheSuccess({'op':'status','chain_identity':Cache['chainIdentityOf']()??null,'storage_attached':Cache['hasStorage'](),'memory_entries':Cache['memory']['size'],'storage_rows':f,'storage_bytes':g},c);}if(b['clear_prefix']){const {prefix:h}=b['clear_prefix'];return await Cache['clearPrefix'](h),cacheSuccess({'op':'clear_prefix','prefix':h,'chain_identity':Cache['chainIdentityOf']()??null},c);}if(b['clear'])return await Cache['clear'](),cacheSuccess({'op':'clear','cleared':!![],'chain_identity':Cache['chainIdentityOf']()??null},c);if(b['refresh_chain_scope']){const i=Cache['chainIdentityOf']()??null;clearChainScope();const j=await resolveChainIdentity(b['refresh_chain_scope']['network'])??null;return cacheSuccess({'op':'refresh_chain_scope','previous_chain_identity':i,'chain_identity':j,'changed':j!==null&&j!==i,'resolved':j!==null},c);}return accountError('No\x20cache\x20operation\x20specified',c);}catch(k){const l=k instanceof Error?k['message']:String(k);return{'content':[{'type':'text','text':'Error:\x20'+l}],'structuredContent':{'result':{'status':'error','error':l,'error_code':'unknown_error','retryable':!![],'recovery_hint':'If\x20the\x20cache\x20backend\x20is\x20locked\x20or\x20corrupt,\x20use\x20{clear:\x20{op:\x27clear\x27}}\x20to\x20drop\x20everything,\x20or\x20{refresh_chain_scope:\x20{op:\x27refresh_chain_scope\x27}}\x20if\x20the\x20node\x20was\x20reset.'},'semantic':buildDataSemantic(undefined,c,!![],l)}};}};
@@ -1,3 +1,4 @@
1
+ import { type ParsedMachineNode } from "../../graph/onchain/sdk-batch.js";
1
2
  import type { ToolDispatchResult } from "../types.js";
2
3
  export declare function assertRewardReplayStamp(entries: unknown, network?: string, warnings?: string[]): Promise<void>;
3
4
  export declare function warnMerchantCompensationFundLow(data: any, network: string | undefined, constraintWarnings: string[]): Promise<{
@@ -9,7 +10,30 @@ export declare function warnMerchantCompensationFundLow(data: any, network: stri
9
10
  } | undefined>;
10
11
  export declare function deriveTotalPayIfOmitted(data: any, network: unknown): Promise<string | undefined>;
11
12
  export declare function gateOrderNewFundCoverage(data: any, network: unknown): Promise<ToolDispatchResult | null>;
13
+ export declare function gateServiceBuyGuardMount(data: any, network: unknown): Promise<ToolDispatchResult | null>;
14
+ export declare function parseTotalPayRaw(buy: any): bigint | undefined;
15
+ export declare function gateOrderNewZeroTotal(data: any): ToolDispatchResult | null;
16
+ export declare function minCompletionFixedFloor(groups: {
17
+ guard: string;
18
+ sum: bigint;
19
+ }[], nodes: ParsedMachineNode[]): bigint | undefined;
12
20
  export declare function gateOrderNewAmountLegCoverage(data: any, network: unknown): Promise<ToolDispatchResult | null>;
21
+ interface SaleItemOpPreparation {
22
+ op: string;
23
+ saleName: string;
24
+ before: {
25
+ price?: bigint;
26
+ stock?: bigint;
27
+ suspension?: boolean;
28
+ };
29
+ }
30
+ export declare function prepareSaleItemOp(data: any, network: unknown): Promise<{
31
+ block: ToolDispatchResult;
32
+ } | {
33
+ prep: SaleItemOpPreparation;
34
+ } | null>;
35
+ export declare function emitSaleItemOpReadback(prep: SaleItemOpPreparation, data: any, network: unknown, warnings: string[]): Promise<void>;
13
36
  export declare function gateServicePublishPreflight(data: any): ToolDispatchResult | null;
14
37
  export declare function invalidateResolvedNameCache(): void;
15
38
  export declare function handleOnchainOperations(args: unknown): Promise<ToolDispatchResult>;
39
+ export {};