@wowok/agent-mcp 3.3.1 → 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.
- package/dist/chain-semantics/field-capability.js +1 -1
- package/dist/chain-semantics/freeze-map.js +1 -1
- package/dist/chain-semantics/fund-flow.js +1 -1
- package/dist/chain-semantics/guard-verbs.js +1 -1
- package/dist/chain-semantics/object-graph.js +1 -1
- package/dist/composition/audit.d.ts +5 -0
- package/dist/composition/audit.js +1 -1
- package/dist/composition/blueprint-view.d.ts +0 -1
- package/dist/composition/blueprint-view.js +1 -1
- package/dist/composition/compile.d.ts +4 -2
- package/dist/composition/compile.js +1 -1
- package/dist/composition/inflight.d.ts +8 -4
- package/dist/composition/inflight.js +1 -1
- package/dist/customer/industry-risks.js +1 -1
- package/dist/customer/user-preferences.js +1 -1
- package/dist/extensions/business-modules.d.ts +7 -2
- package/dist/extensions/business-modules.js +1 -1
- package/dist/extensions/industry-audit.spec.js +1 -1
- package/dist/extensions/industry-pack.d.ts +3 -2
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/graph/onchain/project-relationship.js +1 -1
- package/dist/knowledge/acquisition-flywheel.js +1 -1
- package/dist/knowledge/allocation-ledger.d.ts +4 -1
- package/dist/knowledge/allocation-ledger.js +1 -1
- package/dist/knowledge/allocation-puzzle.d.ts +1 -0
- package/dist/knowledge/allocation-puzzle.js +1 -1
- package/dist/knowledge/allocation-risk.d.ts +1 -1
- package/dist/knowledge/allocation-risk.js +1 -1
- package/dist/knowledge/arb-fund-facts.d.ts +5 -0
- package/dist/knowledge/arb-fund-facts.js +1 -1
- package/dist/knowledge/audit-rules.d.ts +4 -3
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/baselines/rules/plan.json +48 -2
- package/dist/knowledge/baselines/rules/reward.json +1 -1
- package/dist/knowledge/builtin-templates.d.ts +9 -1
- package/dist/knowledge/builtin-templates.js +1 -1
- package/dist/knowledge/discount-threshold.js +1 -1
- package/dist/knowledge/guard-bindings.js +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-field-cognition.js +1 -1
- package/dist/knowledge/guard-lint.js +1 -1
- package/dist/knowledge/guard-submission-brief.d.ts +5 -0
- package/dist/knowledge/guard-submission-brief.js +1 -1
- package/dist/knowledge/guard-submission-prompt.d.ts +2 -1
- package/dist/knowledge/guard-submission-prompt.js +1 -1
- package/dist/knowledge/guard-templates.d.ts +1 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/industry-generalizer.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/industry-strategy.js +1 -1
- package/dist/knowledge/reward-ledger.js +1 -1
- package/dist/knowledge/reward-puzzle.d.ts +1 -1
- package/dist/knowledge/reward-risk.d.ts +1 -1
- package/dist/knowledge/scenario-modes.d.ts +2 -2
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/scenario-topology.js +1 -1
- package/dist/knowledge/strategy-manuals.js +1 -1
- package/dist/knowledge/template-index.d.ts +19 -0
- package/dist/knowledge/template-index.js +1 -0
- package/dist/knowledge/template-loader.d.ts +36 -0
- package/dist/knowledge/template-loader.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +7 -0
- package/dist/knowledge/template-scanner.js +1 -1
- package/dist/knowledge/tool-constraints.js +1 -1
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/participation/radar-core.d.ts +1 -0
- package/dist/participation/radar-core.js +1 -1
- package/dist/persona/defaults.js +1 -1
- package/dist/persona/topology-focus.js +1 -1
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/game-theory.d.ts +4 -1
- package/dist/playbooks/service-build/game-theory.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +25 -1
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/migration-planner.js +1 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/pipeline-actions.d.ts +4 -1
- package/dist/playbooks/service-build/pipeline-actions.js +1 -1
- package/dist/playbooks/service-build/relationship-profile.js +1 -1
- package/dist/playbooks/service-build/service-panorama.d.ts +4 -0
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/service-quote.js +1 -1
- package/dist/relationship/derivation.d.ts +1 -1
- package/dist/review/index.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +35 -0
- package/dist/schema/benchmark-migration/index.js +1 -1
- package/dist/schema/call/allocation.d.ts +46 -3
- package/dist/schema/call/allocation.js +1 -1
- package/dist/schema/call/contact.js +1 -1
- package/dist/schema/call/guard.js +1 -1
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/order.js +1 -1
- package/dist/schema/call/progress.d.ts +6 -3
- package/dist/schema/call/progress.js +1 -1
- package/dist/schema/call/repository.js +1 -1
- package/dist/schema/call/reward.d.ts +2 -2
- package/dist/schema/call/reward.js +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +8 -4
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/goal/index.d.ts +54 -0
- package/dist/schema/goal/planning.d.ts +86 -0
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/local/index.d.ts +39 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/operations.d.ts +20 -5
- package/dist/schema/operations.js +1 -1
- package/dist/schema/query/bi.d.ts +2 -0
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +24 -12
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.d.ts +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +28 -3
- package/dist/schemas/benchmark_migration_operation.schema.json +87 -0
- package/dist/schemas/goal_operation.schema.json +94 -0
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/onchain_operations.output.json +1 -1
- package/dist/schemas/onchain_operations.schema.json +409 -119
- package/dist/schemas/onchain_operations_allocation.schema.json +290 -6
- package/dist/schemas/onchain_operations_arbitration.schema.json +2 -2
- package/dist/schemas/onchain_operations_contact.schema.json +2 -2
- package/dist/schemas/onchain_operations_demand.schema.json +3 -3
- package/dist/schemas/onchain_operations_gen_passport.schema.json +1 -1
- package/dist/schemas/onchain_operations_guard.schema.json +63 -63
- package/dist/schemas/onchain_operations_machine.schema.json +1 -1
- package/dist/schemas/onchain_operations_order.schema.json +2 -2
- package/dist/schemas/onchain_operations_progress.schema.json +7 -3
- package/dist/schemas/onchain_operations_proof.schema.json +1 -1
- package/dist/schemas/onchain_operations_repository.schema.json +2 -2
- package/dist/schemas/onchain_operations_reward.schema.json +8 -8
- package/dist/schemas/onchain_operations_service.schema.json +20 -18
- package/dist/schemas/onchain_operations_treasury.schema.json +7 -7
- package/dist/schemas/query_toolkit.output.json +67 -53
- package/dist/schemas/workflow_operation.schema.json +1 -1
- package/dist/tools/handlers/benchmark-migration.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/file-export.js +1 -1
- package/dist/tools/handlers/industry-pack.d.ts +1 -0
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/local.js +1 -1
- package/dist/tools/handlers/onchain.d.ts +24 -0
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/review-chain.d.ts +1 -1
- package/dist/tools/handlers/review-chain.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/handlers/workflow.js +1 -1
- package/dist/tools/registry/agent.js +1 -1
- package/dist/tools/wip-deploy-assist.js +1 -1
- package/dist/tools/wrap.js +1 -1
- 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",
|
|
@@ -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
|
|
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'](
|
|
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 +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 {};
|