@wowok/agent-mcp 3.4.4 → 3.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/dist/.build-stamp.json +3 -3
  2. package/dist/chain-semantics/composition-truth.js +1 -1
  3. package/dist/composition/audit.js +1 -1
  4. package/dist/composition/compile.js +1 -1
  5. package/dist/composition/emit-phases.js +1 -1
  6. package/dist/composition/guard-fill.js +1 -1
  7. package/dist/composition/input-normalize.js +1 -1
  8. package/dist/composition/materialize.js +1 -1
  9. package/dist/composition/mode-gates.js +1 -1
  10. package/dist/composition/param-disclosure.js +1 -1
  11. package/dist/composition/plan-run-store.js +1 -0
  12. package/dist/composition/reflux.js +1 -1
  13. package/dist/composition/role-bindings.js +1 -0
  14. package/dist/composition/shape-expand.js +1 -1
  15. package/dist/composition/supply-chain-emit.js +1 -1
  16. package/dist/config/judgment.d.ts +13 -25
  17. package/dist/config/judgment.js +1 -1
  18. package/dist/config/match-policy-file.js +1 -1
  19. package/dist/config/rule-engine.d.ts +4 -10
  20. package/dist/config/rule-engine.js +1 -1
  21. package/dist/config/template-params.js +1 -1
  22. package/dist/evaluation/engine.js +1 -1
  23. package/dist/experience/realtime-feedback.js +1 -1
  24. package/dist/extensions/capability.js +1 -1
  25. package/dist/graph/onchain/expand.js +1 -1
  26. package/dist/graph/onchain/exposure.js +1 -1
  27. package/dist/harness/forward-roster-preflight.js +1 -0
  28. package/dist/keeper/detectors.js +1 -1
  29. package/dist/knowledge/allocator-rail-verifier.js +1 -1
  30. package/dist/knowledge/arb-operation-face.js +1 -1
  31. package/dist/knowledge/arbitration-rail-verifier.js +1 -1
  32. package/dist/knowledge/audit-rules.d.ts +17 -1
  33. package/dist/knowledge/audit-rules.js +1 -1
  34. package/dist/knowledge/baselines/rules/alloc_audit.json.good.sha256 +1 -0
  35. package/dist/knowledge/baselines/rules/allocation.json.good.sha256 +1 -0
  36. package/dist/knowledge/baselines/rules/arb.json.good.sha256 +1 -0
  37. package/dist/knowledge/baselines/rules/arbitration.json.good.sha256 +1 -0
  38. package/dist/knowledge/baselines/rules/bridge.json.good.sha256 +1 -0
  39. package/dist/knowledge/baselines/rules/contact.json.good.sha256 +1 -0
  40. package/dist/knowledge/baselines/rules/demand.json.good.sha256 +1 -0
  41. package/dist/knowledge/baselines/rules/graph.json.good.sha256 +1 -0
  42. package/dist/knowledge/baselines/rules/guard.json.good.sha256 +1 -0
  43. package/dist/knowledge/baselines/rules/machine.json.good.sha256 +1 -0
  44. package/dist/knowledge/baselines/rules/oracle.json.good.sha256 +1 -0
  45. package/dist/knowledge/baselines/rules/order.json.good.sha256 +1 -0
  46. package/dist/knowledge/baselines/rules/payment.json.good.sha256 +1 -0
  47. package/dist/knowledge/baselines/rules/permission.json.good.sha256 +1 -0
  48. package/dist/knowledge/baselines/rules/personal.json.good.sha256 +1 -0
  49. package/dist/knowledge/baselines/rules/plan.json +153 -33
  50. package/dist/knowledge/baselines/rules/plan.json.good +153 -33
  51. package/dist/knowledge/baselines/rules/plan.json.good.sha256 +1 -0
  52. package/dist/knowledge/baselines/rules/progress.json.good.sha256 +1 -0
  53. package/dist/knowledge/baselines/rules/proof.json.good.sha256 +1 -0
  54. package/dist/knowledge/baselines/rules/registrar.json.good.sha256 +1 -0
  55. package/dist/knowledge/baselines/rules/repository.json.good.sha256 +1 -0
  56. package/dist/knowledge/baselines/rules/resource.json.good.sha256 +1 -0
  57. package/dist/knowledge/baselines/rules/reward.json.good.sha256 +1 -0
  58. package/dist/knowledge/baselines/rules/service.json.good.sha256 +1 -0
  59. package/dist/knowledge/baselines/rules/treasury.json.good.sha256 +1 -0
  60. package/dist/knowledge/baselines/rules/util.json.good.sha256 +1 -0
  61. package/dist/knowledge/builtin-templates.d.ts +1 -1
  62. package/dist/knowledge/builtin-templates.js +1 -1
  63. package/dist/knowledge/discount-threshold.js +1 -1
  64. package/dist/knowledge/fee-param-bindings.js +1 -1
  65. package/dist/knowledge/getting-started.js +1 -1
  66. package/dist/knowledge/guard-binding-table.js +1 -1
  67. package/dist/knowledge/guard-design-patterns.js +1 -1
  68. package/dist/knowledge/guard-templates.d.ts +3 -2
  69. package/dist/knowledge/guard-templates.js +1 -1
  70. package/dist/knowledge/index.js +1 -1
  71. package/dist/knowledge/industry-registry.js +1 -1
  72. package/dist/knowledge/jsonrpc-enum.js +1 -1
  73. package/dist/knowledge/knob-docs.js +1 -1
  74. package/dist/knowledge/machine-topology.js +1 -1
  75. package/dist/knowledge/param-schema.js +1 -1
  76. package/dist/knowledge/param-tiers.js +1 -1
  77. package/dist/knowledge/path-oracle/products/alibaba-1688.js +1 -1
  78. package/dist/knowledge/path-oracle/products/amazon.js +1 -1
  79. package/dist/knowledge/path-oracle/products/booking-com.js +1 -1
  80. package/dist/knowledge/path-oracle/products/contra.js +1 -1
  81. package/dist/knowledge/path-oracle/products/costco.js +1 -1
  82. package/dist/knowledge/path-oracle/products/duoduo-maicai.js +1 -1
  83. package/dist/knowledge/path-oracle/products/etsy.js +1 -1
  84. package/dist/knowledge/path-oracle/products/gamefound.js +1 -1
  85. package/dist/knowledge/path-oracle/products/gofundme.js +1 -1
  86. package/dist/knowledge/path-oracle/products/klook.js +1 -1
  87. package/dist/knowledge/path-oracle/products/ninety-nine-designs.js +1 -1
  88. package/dist/knowledge/path-oracle/products/pinduoduo-kuaituantuan.js +1 -1
  89. package/dist/knowledge/path-oracle/products/shansong.js +1 -1
  90. package/dist/knowledge/path-oracle/products/taobao-presale.js +1 -1
  91. package/dist/knowledge/path-oracle/products/upwork-catalog.js +1 -1
  92. package/dist/knowledge/path-oracle/products/upwork.js +1 -1
  93. package/dist/knowledge/pattern-resolutions.js +1 -1
  94. package/dist/knowledge/protocol-facts.js +1 -1
  95. package/dist/knowledge/publish-gate.js +1 -1
  96. package/dist/knowledge/publish-surface-contract.js +1 -1
  97. package/dist/knowledge/template-loader.js +1 -1
  98. package/dist/knowledge/template-registry.js +1 -1
  99. package/dist/knowledge/template-scanner.js +1 -1
  100. package/dist/knowledge/time-units.js +1 -0
  101. package/dist/knowledge/tools-reference.js +1 -1
  102. package/dist/knowledge/workflow-guidance.js +1 -1
  103. package/dist/monitor/MonitorLoop.js +1 -1
  104. package/dist/participation/radar-core.js +1 -1
  105. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  106. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  107. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  108. package/dist/playbooks/service-build/migration-planner.js +1 -1
  109. package/dist/playbooks/service-build/object-panorama.js +1 -1
  110. package/dist/playbooks/service-build/participation-radar.js +1 -1
  111. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  112. package/dist/playbooks/service-build/service-panorama.js +1 -1
  113. package/dist/playbooks/service-build/service-quote.js +1 -1
  114. package/dist/review/index.js +1 -1
  115. package/dist/safety/confirm-gate.js +1 -1
  116. package/dist/schema/benchmark-migration/index.d.ts +110 -2
  117. package/dist/schema/benchmark-migration/index.js +1 -1
  118. package/dist/schema/boundary-coercion.js +1 -0
  119. package/dist/schema/call/arbitration.js +1 -1
  120. package/dist/schema/call/base.js +1 -1
  121. package/dist/schema/call/handler.js +1 -1
  122. package/dist/schema/call/machine.d.ts +56 -8
  123. package/dist/schema/call/order.d.ts +37 -10
  124. package/dist/schema/call/order.js +1 -1
  125. package/dist/schema/call/permission.d.ts +210 -30
  126. package/dist/schema/call/personal.d.ts +56 -8
  127. package/dist/schema/call/progress.d.ts +28 -4
  128. package/dist/schema/call/semantic.js +1 -1
  129. package/dist/schema/call/service.d.ts +84 -12
  130. package/dist/schema/common/index.d.ts +14 -2
  131. package/dist/schema/common/index.js +1 -1
  132. package/dist/schema/evaluation/index.js +1 -1
  133. package/dist/schema/goal/index.d.ts +1 -1
  134. package/dist/schema/goal/planning.js +1 -1
  135. package/dist/schema/local/index.js +1 -1
  136. package/dist/schema/messenger/index.d.ts +168 -24
  137. package/dist/schema/messenger/index.js +1 -1
  138. package/dist/schema/operations.d.ts +655 -22
  139. package/dist/schema/operations.js +1 -1
  140. package/dist/schema/persona/index.d.ts +22 -110
  141. package/dist/schema/query/index.js +1 -1
  142. package/dist/schema/schema-version.js +1 -1
  143. package/dist/schema/workflow/index.d.ts +4 -0
  144. package/dist/schema/workflow/index.js +1 -1
  145. package/dist/schema-query-impl/index.js +1 -1
  146. package/dist/schemas/benchmark_migration_operation.schema.json +1 -1
  147. package/dist/schemas/evaluation_operation.schema.json +1 -1
  148. package/dist/schemas/goal_operation.schema.json +1 -1
  149. package/dist/schemas/guard_rebind_replacement.schema.json +1 -0
  150. package/dist/schemas/index.json +1 -1
  151. package/dist/schemas/messenger_operation.schema.json +1 -1
  152. package/dist/schemas/onchain_operations.schema.json +1 -1
  153. package/dist/schemas/onchain_operations_allocation.schema.json +1 -1
  154. package/dist/schemas/onchain_operations_arbitration.schema.json +1 -1
  155. package/dist/schemas/onchain_operations_contact.schema.json +1 -1
  156. package/dist/schemas/onchain_operations_demand.schema.json +1 -1
  157. package/dist/schemas/onchain_operations_gen_passport.schema.json +1 -1
  158. package/dist/schemas/onchain_operations_machine.schema.json +1 -1
  159. package/dist/schemas/onchain_operations_order.schema.json +1 -1
  160. package/dist/schemas/onchain_operations_permission.schema.json +1 -1
  161. package/dist/schemas/onchain_operations_personal.schema.json +1 -1
  162. package/dist/schemas/onchain_operations_progress.schema.json +1 -1
  163. package/dist/schemas/onchain_operations_proof.schema.json +1 -1
  164. package/dist/schemas/onchain_operations_repository.schema.json +1 -1
  165. package/dist/schemas/onchain_operations_reward.schema.json +1 -1
  166. package/dist/schemas/onchain_operations_service.schema.json +1 -1
  167. package/dist/schemas/onchain_operations_treasury.schema.json +1 -1
  168. package/dist/schemas/persona_operation.schema.json +1 -1
  169. package/dist/schemas/time_convert.schema.json +1 -0
  170. package/dist/schemas/wip_file.schema.json +1 -1
  171. package/dist/schemas/workflow_operation.schema.json +1 -1
  172. package/dist/tools/handlers/benchmark-migration.js +1 -1
  173. package/dist/tools/handlers/config.js +1 -1
  174. package/dist/tools/handlers/fund-rail-recipe.js +1 -1
  175. package/dist/tools/handlers/guard-rebind-replacement.js +1 -0
  176. package/dist/tools/handlers/local.js +1 -1
  177. package/dist/tools/handlers/mark-namespace.js +1 -1
  178. package/dist/tools/handlers/onchain.js +1 -1
  179. package/dist/tools/handlers/query.js +1 -1
  180. package/dist/tools/handlers/settle-sweep.js +1 -1
  181. package/dist/tools/handlers/time-convert.js +1 -0
  182. package/dist/tools/handlers/wip.js +1 -1
  183. package/dist/tools/handlers/workflow.js +1 -1
  184. package/dist/tools/index.d.ts +1 -0
  185. package/dist/tools/index.js +1 -1
  186. package/dist/tools/registry/business.js +1 -1
  187. package/dist/tools/registry/local.js +1 -1
  188. package/dist/tools/registry/onchain.js +1 -1
  189. package/dist/tools/wip-verify-ledger.js +1 -1
  190. package/dist/tools/wrap.js +1 -1
  191. package/package.json +6 -5
@@ -1 +1 @@
1
- import{listServices,getServiceInfo,toggle as a532a,setEnabled as a532b,reset as a532c}from'../../config/index.js';import{judgmentStatus,setJudgmentOverride,clearJudgmentOverride,clearJudgmentOverrides,patchUserJudgmentDoc,readUserJudgmentDocView}from'../../config/judgment.js';import{getStoreDualPayoutPolicy,setStoreDualPayoutPreauthorization,clearStoreDualPayoutPreauthorization}from'../../config/store-policy.js';import{getMatchPolicyFile,patchMatchPolicyFile,clearMatchPolicyFile}from'../../config/match-policy-file.js';import{getTemplateParamFileState,patchTemplateParamFile,clearTemplateParamFile}from'../../config/template-params.js';import{strictParse}from'../../schema/index.js';import{ConfigOperationInputSchema}from'../../schema/config/index.js';import{LocalMark}from'@wowok/wowok';async function resolvePolicyAccount(a){const b=a['trim']();if(/^0x[0-9a-fA-F]{64}$/['test'](b))return b['toLowerCase']();try{const c=await LocalMark['Instance']()['get_address'](b)['catch'](()=>undefined)??undefined;if(typeof c==='string'&&/^0x[0-9a-fA-F]{64}$/['test'](c))return c['toLowerCase']();}catch{}return b['toLowerCase']();}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=a532a(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.');a532b(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.');a532b(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.');a532c(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 t=setJudgmentOverride(e,f);if(!t['ok'])throw new Error(t['error']);g={'action':'judgment_set','path':e,'value':f,'applied':!![]};break;}case'judgment_reset':{const u=e?clearJudgmentOverride(e)?0x1:0x0:clearJudgmentOverrides();g={'action':'judgment_reset',...e?{'path':e}:{},'cleared':u};break;}case'judgment_doc_read':{g={'action':'judgment_doc_read',...readUserJudgmentDocView()};break;}case'judgment_doc_patch':{if(b['confirm']!==!![])throw new Error('judgment_doc_patch\x20writes\x20the\x20PERSISTENT\x20user\x20judgment\x20document\x20and\x20requires\x20explicit\x20human\x20'+'confirmation:\x20show\x20the\x20user\x20exactly\x20which\x20paths\x20change\x20from\x20what\x20to\x20what,\x20then\x20set\x20'+'confirm=true\x20only\x20after\x20they\x20approve.\x20If\x20the\x20user\x20declined,\x20do\x20NOT\x20retry\x20the\x20same\x20patch.');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;}case'match_policy_read':{g={'action':'match_policy_read',...getMatchPolicyFile()};break;}case'match_policy_patch':{if(b['confirm']!==!![])throw new Error('match_policy_patch\x20writes\x20the\x20PERSISTENT\x20match-policy.json\x20and\x20requires\x20explicit\x20human\x20'+'confirmation:\x20show\x20the\x20user\x20exactly\x20which\x20values\x20change\x20from\x20what\x20to\x20what,\x20then\x20set\x20'+'confirm=true\x20only\x20after\x20they\x20approve.\x20If\x20the\x20user\x20declined,\x20do\x20NOT\x20retry\x20the\x20same\x20patch.');if(!b['patch']||typeof b['patch']!=='object'||Array['isArray'](b['patch']))throw new Error('\x27patch\x27\x20param\x20is\x20required\x20for\x20match_policy_patch\x20(e.g.\x20{\x22demand_to_supply\x22:\x20{\x22policy_id\x22:\x20\x22my_style\x22,\x20…}})');g={'action':'match_policy_patch',...patchMatchPolicyFile(b['patch'])};break;}case'match_policy_clear':{if(b['confirm']!==!![])throw new Error('match_policy_clear\x20removes\x20PERSISTENT\x20match-strategy\x20config\x20and\x20requires\x20explicit\x20human\x20'+'confirmation:\x20state\x20exactly\x20what\x20is\x20removed\x20(whole\x20file\x20vs\x20one\x20direction),\x20then\x20set\x20'+'confirm=true\x20only\x20after\x20the\x20user\x20approves.');const v=clearMatchPolicyFile(b['direction']);g={'action':'match_policy_clear','cleared':v['cleared'],'path':v['path'],'scope':v['scope'],'backup_path':v['backup_path']};break;}case'template_params_read':{const w=getTemplateParamFileState();g={'action':'template_params_read','path':w['path'],'exists':w['exists'],'error':w['error'],...w['comment']!==undefined?{'comment':w['comment']}:{},...w['defaults']!==undefined?{'defaults':w['defaults']}:{},...w['templates']!==undefined?{'templates':w['templates']}:{}};break;}case'template_params_patch':{if(b['confirm']!==!![])throw new Error('template_params_patch\x20writes\x20the\x20PERSISTENT\x20template-params.json\x20and\x20requires\x20explicit\x20human\x20'+'confirmation:\x20show\x20the\x20user\x20exactly\x20which\x20fee\x20params\x20change\x20from\x20what\x20to\x20what,\x20then\x20set\x20'+'confirm=true\x20only\x20after\x20they\x20approve.\x20If\x20the\x20user\x20declined,\x20do\x20NOT\x20retry\x20the\x20same\x20patch.');if(!b['patch']||typeof b['patch']!=='object'||Array['isArray'](b['patch']))throw new Error('\x27patch\x27\x20param\x20is\x20required\x20for\x20template_params_patch\x20(e.g.\x20{\x22defaults\x22:\x20{\x22review_window_days\x22:\x207},\x20\x22templates\x22:\x20{\x22travel/global-ota\x22:\x20{\x22escrow_release_days\x22:\x203}}})');g={'action':'template_params_patch',...patchTemplateParamFile(b['patch'])};break;}case'template_params_clear':{if(b['confirm']!==!![])throw new Error('template_params_clear\x20removes\x20PERSISTENT\x20template\x20business-parameter\x20config\x20and\x20requires\x20explicit\x20'+'human\x20confirmation:\x20state\x20exactly\x20what\x20is\x20removed\x20(whole\x20file\x20/\x20defaults\x20/\x20one\x20template\x20section),\x20'+'then\x20set\x20confirm=true\x20only\x20after\x20the\x20user\x20approves.');const x=clearTemplateParamFile(b['template']);g={'action':'template_params_clear','cleared':x['cleared'],'path':x['path'],'scope':x['scope'],...x['template_id']!==undefined?{'template_id':x['template_id']}:{},'backup_path':x['backup_path']};break;}case'store_dual_payout_get':{if(!b['account'])throw new Error('\x27account\x27\x20param\x20is\x20required\x20for\x20store_dual_payout_get\x20(the\x20store\x27s\x20signing\x20account)');const y=await resolvePolicyAccount(b['account']),z=getStoreDualPayoutPolicy(y);g={'action':'store_dual_payout_get','account':b['account'],'preauthorized':z?.['preauthorized']===!![],...z?.['authorized_at']?{'authorized_at':z['authorized_at']}:{},...z?.['note']?{'note':z['note']}:{},...z?.['network']?{'network':z['network']}:{}};break;}case'store_dual_payout_set':{if(!b['account'])throw new Error('\x27account\x27\x20param\x20is\x20required\x20for\x20store_dual_payout_set\x20(the\x20store\x27s\x20signing\x20account)');const A=await resolvePolicyAccount(b['account']),B=setStoreDualPayoutPreauthorization(A,{'confirm':b['confirm']===!![],...b['note']?{'note':b['note']}:{}});g={'action':'store_dual_payout_set','account':b['account'],'preauthorized':!![],'authorized_at':B['authorized_at'],...B['note']?{'note':B['note']}:{},'reminder':'Recorded\x20as\x20a\x20HUMAN\x20merchant\x20decision\x20(D-1).\x20The\x20allocation\x20gate\x20now\x20honors\x20acknowledge_dual_payout\x20'+'for\x20this\x20store.\x20Keep\x20the\x20note\x20meaningful\x20—\x20this\x20is\x20the\x20audit\x20trail\x20for\x20a\x20standing\x20commercial\x20netting\x20policy.'};break;}case'store_dual_payout_clear':{if(!b['account'])throw new Error('\x27account\x27\x20param\x20is\x20required\x20for\x20store_dual_payout_clear\x20(the\x20store\x27s\x20signing\x20account)');const C=await resolvePolicyAccount(b['account']),D=clearStoreDualPayoutPreauthorization(C);g={'action':'store_dual_payout_clear','account':b['account'],'cleared':D};break;}default:throw new Error('Unknown\x20config_operation\x20action:\x20'+String(c));}return{'content':[{'type':'text','text':JSON['stringify']({'result':g})}],'structuredContent':{'result':g}};}
1
+ import{listServices,getServiceInfo,toggle as a537a,setEnabled as a537b,reset as a537c}from'../../config/index.js';import{judgmentStatus,setJudgmentOverride,clearJudgmentOverride,clearJudgmentOverrides,patchUserJudgmentDoc,readUserJudgmentDocView}from'../../config/judgment.js';import{getStoreDualPayoutPolicy,setStoreDualPayoutPreauthorization,clearStoreDualPayoutPreauthorization}from'../../config/store-policy.js';import{getMatchPolicyFile,patchMatchPolicyFile,clearMatchPolicyFile}from'../../config/match-policy-file.js';import{getTemplateParamFileState,patchTemplateParamFile,clearTemplateParamFile}from'../../config/template-params.js';import{strictParse}from'../../schema/index.js';import{ConfigOperationInputSchema}from'../../schema/config/index.js';import{LocalMark}from'@wowok/wowok';async function resolvePolicyAccount(a){const b=a['trim']();if(/^0x[0-9a-fA-F]{64}$/['test'](b))return b['toLowerCase']();try{const c=await LocalMark['Instance']()['get_address'](b)['catch'](()=>undefined)??undefined;if(typeof c==='string'&&/^0x[0-9a-fA-F]{64}$/['test'](c))return c['toLowerCase']();}catch{}return b['toLowerCase']();}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=a537a(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.');a537b(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.');a537b(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.');a537c(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 t=setJudgmentOverride(e,f);if(!t['ok'])throw new Error(t['error']);g={'action':'judgment_set','path':e,'value':f,'applied':!![]};break;}case'judgment_reset':{const u=e?clearJudgmentOverride(e)?0x1:0x0:clearJudgmentOverrides();g={'action':'judgment_reset',...e?{'path':e}:{},'cleared':u};break;}case'judgment_doc_read':{g={'action':'judgment_doc_read',...readUserJudgmentDocView()};break;}case'judgment_doc_patch':{if(b['confirm']!==!![])throw new Error('judgment_doc_patch\x20writes\x20the\x20PERSISTENT\x20user\x20judgment\x20document\x20and\x20requires\x20explicit\x20human\x20'+'confirmation:\x20show\x20the\x20user\x20exactly\x20which\x20paths\x20change\x20from\x20what\x20to\x20what,\x20then\x20set\x20'+'confirm=true\x20only\x20after\x20they\x20approve.\x20If\x20the\x20user\x20declined,\x20do\x20NOT\x20retry\x20the\x20same\x20patch.');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;}case'match_policy_read':{g={'action':'match_policy_read',...getMatchPolicyFile()};break;}case'match_policy_patch':{if(b['confirm']!==!![])throw new Error('match_policy_patch\x20writes\x20the\x20PERSISTENT\x20match-policy.json\x20and\x20requires\x20explicit\x20human\x20'+'confirmation:\x20show\x20the\x20user\x20exactly\x20which\x20values\x20change\x20from\x20what\x20to\x20what,\x20then\x20set\x20'+'confirm=true\x20only\x20after\x20they\x20approve.\x20If\x20the\x20user\x20declined,\x20do\x20NOT\x20retry\x20the\x20same\x20patch.');if(!b['patch']||typeof b['patch']!=='object'||Array['isArray'](b['patch']))throw new Error('\x27patch\x27\x20param\x20is\x20required\x20for\x20match_policy_patch\x20(e.g.\x20{\x22demand_to_supply\x22:\x20{\x22policy_id\x22:\x20\x22my_style\x22,\x20…}})');g={'action':'match_policy_patch',...patchMatchPolicyFile(b['patch'])};break;}case'match_policy_clear':{if(b['confirm']!==!![])throw new Error('match_policy_clear\x20removes\x20PERSISTENT\x20match-strategy\x20config\x20and\x20requires\x20explicit\x20human\x20'+'confirmation:\x20state\x20exactly\x20what\x20is\x20removed\x20(whole\x20file\x20vs\x20one\x20direction),\x20then\x20set\x20'+'confirm=true\x20only\x20after\x20the\x20user\x20approves.');const v=clearMatchPolicyFile(b['direction']);g={'action':'match_policy_clear','cleared':v['cleared'],'path':v['path'],'scope':v['scope'],'backup_path':v['backup_path']};break;}case'template_params_read':{const w=getTemplateParamFileState();g={'action':'template_params_read','path':w['path'],'exists':w['exists'],'error':w['error'],...w['comment']!==undefined?{'comment':w['comment']}:{},...w['defaults']!==undefined?{'defaults':w['defaults']}:{},...w['templates']!==undefined?{'templates':w['templates']}:{}};break;}case'template_params_patch':{if(b['confirm']!==!![])throw new Error('template_params_patch\x20writes\x20the\x20PERSISTENT\x20template-params.json\x20and\x20requires\x20explicit\x20human\x20'+'confirmation:\x20show\x20the\x20user\x20exactly\x20which\x20fee\x20params\x20change\x20from\x20what\x20to\x20what,\x20then\x20set\x20'+'confirm=true\x20only\x20after\x20they\x20approve.\x20If\x20the\x20user\x20declined,\x20do\x20NOT\x20retry\x20the\x20same\x20patch.');if(!b['patch']||typeof b['patch']!=='object'||Array['isArray'](b['patch']))throw new Error('\x27patch\x27\x20param\x20is\x20required\x20for\x20template_params_patch\x20(e.g.\x20{\x22defaults\x22:\x20{\x22review_window_days\x22:\x207},\x20\x22templates\x22:\x20{\x22travel/global-ota\x22:\x20{\x22escrow_release_days\x22:\x203}}})');g={'action':'template_params_patch',...patchTemplateParamFile(b['patch'])};break;}case'template_params_clear':{if(b['confirm']!==!![])throw new Error('template_params_clear\x20removes\x20PERSISTENT\x20template\x20business-parameter\x20config\x20and\x20requires\x20explicit\x20'+'human\x20confirmation:\x20state\x20exactly\x20what\x20is\x20removed\x20(whole\x20file\x20/\x20defaults\x20/\x20one\x20template\x20section),\x20'+'then\x20set\x20confirm=true\x20only\x20after\x20the\x20user\x20approves.');const x=clearTemplateParamFile(b['template']);g={'action':'template_params_clear','cleared':x['cleared'],'path':x['path'],'scope':x['scope'],...x['template_id']!==undefined?{'template_id':x['template_id']}:{},'backup_path':x['backup_path']};break;}case'store_dual_payout_get':{if(!b['account'])throw new Error('\x27account\x27\x20param\x20is\x20required\x20for\x20store_dual_payout_get\x20(the\x20store\x27s\x20signing\x20account)');const y=await resolvePolicyAccount(b['account']),z=getStoreDualPayoutPolicy(y);g={'action':'store_dual_payout_get','account':b['account'],'preauthorized':z?.['preauthorized']===!![],...z?.['authorized_at']?{'authorized_at':z['authorized_at']}:{},...z?.['note']?{'note':z['note']}:{},...z?.['network']?{'network':z['network']}:{}};break;}case'store_dual_payout_set':{if(!b['account'])throw new Error('\x27account\x27\x20param\x20is\x20required\x20for\x20store_dual_payout_set\x20(the\x20store\x27s\x20signing\x20account)');const A=await resolvePolicyAccount(b['account']),B=setStoreDualPayoutPreauthorization(A,{'confirm':b['confirm']===!![],...b['note']?{'note':b['note']}:{}});g={'action':'store_dual_payout_set','account':b['account'],'preauthorized':!![],'authorized_at':B['authorized_at'],...B['note']?{'note':B['note']}:{},'reminder':'Recorded\x20as\x20a\x20HUMAN\x20merchant\x20decision\x20(D-1).\x20The\x20allocation\x20gate\x20now\x20honors\x20acknowledge_dual_payout\x20'+'for\x20this\x20store.\x20Keep\x20the\x20note\x20meaningful\x20—\x20this\x20is\x20the\x20audit\x20trail\x20for\x20a\x20standing\x20commercial\x20netting\x20policy.'};break;}case'store_dual_payout_clear':{if(!b['account'])throw new Error('\x27account\x27\x20param\x20is\x20required\x20for\x20store_dual_payout_clear\x20(the\x20store\x27s\x20signing\x20account)');const C=await resolvePolicyAccount(b['account']),D=clearStoreDualPayoutPreauthorization(C);g={'action':'store_dual_payout_clear','account':b['account'],'cleared':D};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{LocalMark}from'@wowok/wowok';import{batchQueryObjectsByIds}from'../../graph/onchain/sdk-batch.js';import{classifyNode}from'../../knowledge/workflow-guidance.js';import{classifyDualPayoutTrack}from'../../knowledge/recipient-constraint.js';export function classifyFundRail(a){if(typeof a!=='string'||a['length']===0x0)return undefined;const b=classifyNode(a);if(b==='refund')return'refund';if(b==='complete')return'settlement';return undefined;}async function toAddr(a){if(typeof a!=='string'||a['length']===0x0)return undefined;if(a['startsWith']('0x'))return a;try{return await LocalMark['Instance']()['get_address'](a)??undefined;}catch{return undefined;}}async function readObj(a,b){const c=await batchQueryObjectsByIds([a],b,!![]),d=c?.[0x0];return d?.['data']??d;}function asBigInt(a){try{if(typeof a==='bigint')return a;if(typeof a==='number'&&Number['isFinite'](a))return BigInt(Math['trunc'](a));if(typeof a==='string'&&a['trim']()!=='')return BigInt(a);}catch{}return undefined;}function formatAmount(a){const b=Number(a)/0x3b9aca00;if(b===0x0)return'0\x20WOW\x20('+a['toString']()+'\x20MIST)';const c=b['toFixed'](0x9)['replace'](/\.?0+$/,'');return c+'\x20WOW\x20('+a['toString']()+'\x20MIST)';}async function matchRailGuards(a,b){const c=b==='refund'?'order-directed':'entity-directed',d=[];for(const e of Array['isArray'](a)?a:[]){const f=await toAddr(e?.['guard']);if(!f)continue;try{if(classifyDualPayoutTrack(a,f)['track']===c)d['push'](f);}catch{}}return d;}function renderRecipe(a,b){const c=a==='refund',d=c?'The\x20forward\x20that\x20landed\x20on\x20refund/cancel\x20node\x20\x22'+b['node']+'\x22\x20does\x20NOT\x20auto-allocate\x20the\x20escrow\x20'+'(allocation\x20has\x20no\x20forward\x20hook\x20—\x20alloc_by_guard\x20and\x20the\x20payment\x20receive\x20are\x20TWO\x20explicit\x20calls;\x20'+'the\x20refund\x20is\x20NOT\x20done\x20yet).':'The\x20forward\x20that\x20landed\x20on\x20completion\x20node\x20\x22'+b['node']+'\x22\x20does\x20NOT\x20auto-settle\x20the\x20escrow\x20'+'(order\x20completion\x20is\x20a\x20workflow\x20fact\x20—\x20allocation\x20has\x20no\x20forward\x20hook;\x20'+'the\x20provider\x20payout\x20is\x20NOT\x20released\x20yet).',e=c?'order-directed\x20—\x20the\x20payout\x20lands\x20on\x20the\x20Order\x20object\x20for\x20the\x20buyer\x20(order\x20owner)\x20to\x20claim':'entity-directed\x20—\x20the\x20payout\x20goes\x20to\x20the\x20fixed\x20provider-side\x20recipients',f=c?'FUND\x20RAIL\x20RECIPE\x20(refund\x20rail)\x20—\x20ORDER\x20CANCELLATION\x20≠\x20FUNDS\x20DISTRIBUTED.':'FUND\x20RAIL\x20RECIPE\x20(settlement\x20rail)\x20—\x20ORDER\x20COMPLETION\x20≠\x20FUNDS\x20DISTRIBUTED.';return[f,d,'','\x20\x20•\x20allocation_state:\x20'+formatAmount(b['balance'])+'\x20still\x20UNDISTRIBUTED\x20in\x20Allocation\x20'+b['allocAddr']+'\x20(the\x20escrow\x20of\x20Order\x20'+b['orderAddr']+').','\x20\x20•\x20'+a+'-rail\x20guard(s):\x20'+b['guards']['join'](',\x20')+'\x20('+e+').','\x20\x20•\x20TWO-STEP\x20RECIPE\x20(run\x20BOTH,\x20in\x20order):','\x20\x20\x20\x201)\x20allocation\x20operate\x20—\x20onchain_operations\x20{\x20operation_type:\x27allocation\x27,\x20data:{\x20object:\x27'+b['allocAddr']+'\x27,\x20alloc_by_guard:\x27'+b['guards'][0x0]+'\x27\x20}\x20}\x20—\x20'+'attach\x20a\x20TOP-LEVEL\x20submission\x20envelope\x20for\x20that\x20guard\x27s\x20b_submission\x20slots\x20(a\x20missing\x20slot\x20aborts\x20on-chain\x20with\x20'+'\x22Submission\x20ID\x20not\x20found\x22;\x20the\x20protocol\x20slot\x20254\x20takes\x20the\x20Order\x20address\x20this\x20Allocation\x20is\x20anchored\x20to\x20—\x20payment_info.for_object).','\x20\x20\x20\x202)\x20payment\x20receive\x20—\x20the\x20alloc\x20only\x20CREATES\x20the\x20CoinWrappers;\x20recipients\x20claim\x20them\x20afterwards\x20'+'(payment\x20receive,\x20e.g.\x20receive:\x27recently\x27;\x20an\x20order-anchored\x20payout\x20is\x20claimed\x20by\x20the\x20order\x20owner\x20via\x20the\x20order\x20receive).','\x20\x20•\x20Skipping\x20this\x20recipe\x20=\x20the\x20funds\x20stay\x20stranded\x20in\x20escrow.\x20Verify\x20by\x20re-reading\x20the\x20Allocation:\x20balance\x200\x20=\x20fully\x20distributed.']['join']('\x0a');}export async function refundRailRecipeNotice(a){try{const b=classifyFundRail(a['targetNode']);if(!b)return undefined;let c=await toAddr(a['orderRef']);if(!c&&a['progressRef']){const i=await readObj(await toAddr(a['progressRef'])??'',a['network']);c=await toAddr(i?.['task']);}if(!c)return undefined;let d=await toAddr(a['allocationRef']);if(!d){const j=await readObj(c,a['network']);d=await toAddr(j?.['allocation']);}if(!d)return undefined;const e=await readObj(d,a['network']),f=asBigInt(e?.['balance']);if(f===undefined||f<=0x0n)return undefined;const g=Array['isArray'](e?.['allocators']?.['allocators'])?e['allocators']['allocators']:Array['isArray'](e?.['allocators'])?e['allocators']:[],h=await matchRailGuards(g,b);if(h['length']===0x0)return undefined;return renderRecipe(b,{'node':a['targetNode'],'balance':f,'allocAddr':d,'orderAddr':c,'guards':h});}catch{return undefined;}}
1
+ import{LocalMark}from'@wowok/wowok';import{batchQueryObjectsByIds}from'../../graph/onchain/sdk-batch.js';import{classifyNode}from'../../knowledge/workflow-guidance.js';import{classifyDualPayoutTrack}from'../../knowledge/recipient-constraint.js';export function classifyFundRail(a){if(typeof a!=='string'||a['length']===0x0)return undefined;const b=classifyNode(a);if(b==='refund')return'refund';if(b==='complete')return'settlement';return undefined;}async function toAddr(a){if(typeof a!=='string'||a['length']===0x0)return undefined;if(a['startsWith']('0x'))return a;try{return await LocalMark['Instance']()['get_address'](a)??undefined;}catch{return undefined;}}async function readObj(a,b){const c=await batchQueryObjectsByIds([a],b,!![]),d=c?.[0x0];return d?.['data']??d;}function asBigInt(a){try{if(typeof a==='bigint')return a;if(typeof a==='number'&&Number['isFinite'](a))return BigInt(Math['trunc'](a));if(typeof a==='string'&&a['trim']()!=='')return BigInt(a);}catch{}return undefined;}function formatAmount(a){const b=Number(a)/0x3b9aca00;if(b===0x0)return'0\x20WOW\x20('+a['toString']()+'\x20MIST)';const c=b['toFixed'](0x9)['replace'](/\.?0+$/,'');return c+'\x20WOW\x20('+a['toString']()+'\x20MIST)';}async function matchRailGuards(a,b){const c=b==='refund'?'order-directed':'entity-directed',d=[];for(const e of Array['isArray'](a)?a:[]){const f=await toAddr(e?.['guard']);if(!f)continue;try{if(classifyDualPayoutTrack(a,f)['track']===c)d['push'](f);}catch{}}return d;}function renderRecipe(a,b){const c=a==='refund',d=c?'The\x20forward\x20that\x20landed\x20on\x20refund/cancel\x20node\x20\x22'+b['node']+'\x22\x20does\x20NOT\x20auto-allocate\x20the\x20escrow\x20'+'(allocation\x20has\x20no\x20forward\x20hook\x20—\x20alloc_by_guard\x20and\x20the\x20payment\x20receive\x20are\x20TWO\x20explicit\x20calls;\x20'+'the\x20refund\x20is\x20NOT\x20done\x20yet).':'The\x20forward\x20that\x20landed\x20on\x20completion\x20node\x20\x22'+b['node']+'\x22\x20does\x20NOT\x20auto-settle\x20the\x20escrow\x20'+'(order\x20completion\x20is\x20a\x20workflow\x20fact\x20—\x20allocation\x20has\x20no\x20forward\x20hook;\x20'+'the\x20provider\x20payout\x20is\x20NOT\x20released\x20yet).',e=c?'order-directed\x20—\x20the\x20payout\x20lands\x20on\x20the\x20Order\x20object\x20for\x20the\x20buyer\x20(order\x20owner)\x20to\x20claim':'entity-directed\x20—\x20the\x20payout\x20goes\x20to\x20the\x20fixed\x20provider-side\x20recipients',f=c?'FUND\x20RAIL\x20RECIPE\x20(refund\x20rail)\x20—\x20ORDER\x20CANCELLATION\x20≠\x20FUNDS\x20DISTRIBUTED.':'FUND\x20RAIL\x20RECIPE\x20(settlement\x20rail)\x20—\x20ORDER\x20COMPLETION\x20≠\x20FUNDS\x20DISTRIBUTED.';return[f,d,'','\x20\x20•\x20allocation_state:\x20'+formatAmount(b['balance'])+'\x20still\x20UNDISTRIBUTED\x20in\x20Allocation\x20'+b['allocAddr']+'\x20(the\x20escrow\x20of\x20Order\x20'+b['orderAddr']+').','\x20\x20•\x20'+a+'-rail\x20guard(s):\x20'+b['guards']['join'](',\x20')+'\x20('+e+').',...b['guards']['length']>0x1?['\x20\x20•\x20NODE\x20MATCH\x20(of-mn-261109\x20F-19):\x20multiple\x20'+a+'\x20guards\x20exist\x20—\x20only\x20the\x20one\x20whose\x20node\x20constraint\x20covers\x20the\x20CURRENT\x20node\x20\x22'+b['node']+'\x22\x20will\x20pass\x20(the\x20others\x20abort,\x20e.g.\x20a\x20guard\x20requiring\x20current==completed\x20aborts\x20at\x20\x22'+b['node']+'\x22).\x20Pick\x20the\x20guard\x20bound\x20to\x20\x22'+b['node']+'\x22\x20(check\x20each\x20guard\x27s\x20progress-node\x20leg\x20in\x20service_panorama\x20/\x20guard\x20detail\x20before\x20firing);\x20the\x20recipe\x20below\x20uses\x20the\x20FIRST\x20candidate\x20—\x20override\x20alloc_by_guard\x20if\x20it\x20does\x20not\x20match.']:[],'\x20\x20•\x20TWO-STEP\x20RECIPE\x20(run\x20BOTH,\x20in\x20order):','\x20\x20\x20\x201)\x20allocation\x20operate\x20—\x20onchain_operations\x20{\x20operation_type:\x27allocation\x27,\x20data:{\x20object:\x27'+b['allocAddr']+'\x27,\x20alloc_by_guard:\x27'+b['guards'][0x0]+'\x27\x20}\x20}\x20—\x20'+'attach\x20a\x20TOP-LEVEL\x20submission\x20envelope\x20for\x20that\x20guard\x27s\x20b_submission\x20slots\x20(a\x20missing\x20slot\x20aborts\x20on-chain\x20with\x20'+'\x22Submission\x20ID\x20not\x20found\x22;\x20the\x20protocol\x20slot\x20254\x20takes\x20the\x20Order\x20address\x20this\x20Allocation\x20is\x20anchored\x20to\x20—\x20payment_info.for_object).','\x20\x20\x20\x202)\x20payment\x20receive\x20—\x20the\x20alloc\x20only\x20CREATES\x20the\x20CoinWrappers;\x20recipients\x20claim\x20them\x20afterwards\x20'+'(payment\x20receive,\x20e.g.\x20receive:\x27recently\x27;\x20an\x20order-anchored\x20payout\x20is\x20claimed\x20by\x20the\x20order\x20owner\x20via\x20the\x20order\x20receive).','\x20\x20•\x20Skipping\x20this\x20recipe\x20=\x20the\x20funds\x20stay\x20stranded\x20in\x20escrow.\x20Verify\x20by\x20re-reading\x20the\x20Allocation:\x20balance\x200\x20=\x20fully\x20distributed.']['join']('\x0a');}export async function refundRailRecipeNotice(a){try{const b=classifyFundRail(a['targetNode']);if(!b)return undefined;let c=await toAddr(a['orderRef']);if(!c&&a['progressRef']){const i=await readObj(await toAddr(a['progressRef'])??'',a['network']);c=await toAddr(i?.['task']);}if(!c)return undefined;let d=await toAddr(a['allocationRef']);if(!d){const j=await readObj(c,a['network']);d=await toAddr(j?.['allocation']);}if(!d)return undefined;const e=await readObj(d,a['network']),f=asBigInt(e?.['balance']);if(f===undefined||f<=0x0n)return undefined;const g=Array['isArray'](e?.['allocators']?.['allocators'])?e['allocators']['allocators']:Array['isArray'](e?.['allocators'])?e['allocators']:[],h=await matchRailGuards(g,b);if(h['length']===0x0)return undefined;return renderRecipe(b,{'node':a['targetNode'],'balance':f,'allocAddr':d,'orderAddr':c,'guards':h});}catch{return undefined;}}
@@ -0,0 +1 @@
1
+ import{CallGuard}from'@wowok/wowok';import{fetchMachineNodes}from'../../graph/onchain/sdk-batch.js';import{CallGuard_DataSchema,GuardRebindReplacementInputSchema,strictParse}from'../../schema/index.js';import{lintGuardBindingSemantics}from'../wrap.js';import{resolveNetwork}from'./network.js';import{handleOnchainOperations}from'./onchain.js';import{handleVerifyGuardDryRun}from'./verify-guard-dry-run.js';const SNAPSHOT_NOTE='The\x20dry-run\x20verdict\x20is\x20a\x20simulation\x20over\x20the\x20CURRENT\x20on-chain\x20snapshot;\x20the\x20real\x20submission\x20is\x20judged\x20by\x20actual\x20execution.';function createdGuardAddress(a){const b=Array['isArray'](a?.['objectChanges'])?a['objectChanges']:[],c=b['find'](d=>d?.['type']==='created'&&String(d?.['objectType']??'')['includes']('::guard::Guard'));return typeof c?.['objectId']==='string'?c['objectId']:undefined;}function fail(a,b){const c={...b['result']??{},'error_code':'guard_rebind_refused'};return{'content':[{'type':'text','text':a}],'structuredContent':{'result':c}};}let depsOverride;export function setGuardRebindDeps(a){depsOverride=a;}function rebindDeps(){if(depsOverride)return depsOverride;return{'createGuard':(a,b)=>new CallGuard(a)['call'](b),'dryRun':handleVerifyGuardDryRun,'lint':lintGuardBindingSemantics,'onchainOp':handleOnchainOperations,'machineNodes':fetchMachineNodes,'resolveNetwork':resolveNetwork};}export async function handleGuardRebindReplacement(a){const b=rebindDeps(),c=strictParse(GuardRebindReplacementInputSchema,a),f=c['guard'],g=c['rebind'],h=await b['resolveNetwork'](c['network']),i={'network':h,...c['account']!==undefined?{'account':c['account']}:{}},j=g['host']==='service_buy_guard'?String(g['service']):String(g['machine']),k=g['host']+':'+j,l=g['host']==='service_buy_guard'?{'action':'buy','host_object':'Service','binding_field':'buy_guard','rule_sentence':f['description']}:{'action':'forward','host_object':'Machine','binding_field':'Forward.guard','rule_sentence':f['description']};let m;if(g['host']==='machine_forward')try{const z=await b['machineNodes'](j,c['network'],!![]),A=z['find'](D=>D?.['name']===g['node_name']),B=A?.['pairs']?.['find'](D=>D?.['prev_node']===g['prior_node_name']),C=B?.['forwards']?.['find'](D=>D?.['name']===g['forward_name']);if(C===undefined)return fail('Forward\x20\x27'+g['forward_name']+'\x27\x20not\x20found\x20on\x20edge\x20'+g['prior_node_name']+'\x20->\x20'+g['node_name']+'\x20of\x20'+j+'.',{'result':{'guard_created':{'address':''},'network':c['network']??'','binding_gate':'blocked','binding_warnings':[],'dry_run':'not_run','dry_run_remedies':['Read\x20the\x20machine\x20graph\x20(query\x20object\x20'+j+')\x20and\x20pass\x20the\x20exact\x20prior_node_name\x20/\x20node_name\x20/\x20forward_name\x20of\x20the\x20forward\x20to\x20re-guard.'],'rebind':{'host':k,'status':'not_rebound','reason':'target\x20forward\x20not\x20found\x20on\x20the\x20current\x20graph'},'snapshot_note':SNAPSHOT_NOTE,'next_step':'Nothing\x20was\x20created\x20or\x20changed;\x20retry\x20with\x20the\x20exact\x20edge\x20descriptor.'}});m=C;}catch(D){return fail('Could\x20not\x20read\x20the\x20machine\x20graph\x20of\x20'+j+':\x20'+String(D?.['message']??D)['slice'](0x0,0x12c),{'result':{'guard_created':{'address':''},'network':c['network']??'','binding_gate':'blocked','binding_warnings':[],'dry_run':'not_run','dry_run_remedies':['Verify\x20the\x20machine\x20reference\x20(address\x20or\x20LocalMark\x20name)\x20and\x20network.'],'rebind':{'host':k,'status':'not_rebound','reason':'machine\x20graph\x20unreadable'},'snapshot_note':SNAPSHOT_NOTE,'next_step':'Nothing\x20was\x20created\x20or\x20changed.'}});}const n={'root':f['root'],'binding_hint':l,...f['name']!==undefined?{'namedNew':{'name':f['name']}}:{},...f['description']!==undefined?{'description':f['description']}:{},...f['table']!==undefined?{'table':f['table']}:{},...f['rely']!==undefined?{'rely':f['rely']}:{}};strictParse(CallGuard_DataSchema,n);let o;try{const E=await b['createGuard'](n,i);o=createdGuardAddress(E);}catch(F){return fail('Guard\x20creation\x20failed\x20before\x20any\x20rebind:\x20'+String(F?.['message']??F)['slice'](0x0,0x12c),{'result':{'guard_created':{'address':''},'network':c['network']??'','binding_gate':'blocked','binding_warnings':[],'dry_run':'not_run','dry_run_remedies':['Fix\x20the\x20guard\x20definition\x20(see\x20the\x20creation\x20error)\x20and\x20re-run.'],'rebind':{'host':k,'status':'not_rebound','reason':'guard\x20creation\x20failed;\x20nothing\x20was\x20bound\x20or\x20changed'},'snapshot_note':SNAPSHOT_NOTE,'next_step':'Nothing\x20was\x20changed\x20on\x20any\x20host.'}});}if(o===undefined)return fail('Guard\x20creation\x20returned\x20no\x20created\x20Guard\x20object\x20id\x20—\x20refusing\x20to\x20continue.',{'result':{'guard_created':{'address':''},'network':c['network']??'','binding_gate':'blocked','binding_warnings':[],'dry_run':'not_run','dry_run_remedies':[],'rebind':{'host':k,'status':'not_rebound','reason':'no\x20created\x20guard\x20id'},'snapshot_note':SNAPSHOT_NOTE,'next_step':'Nothing\x20was\x20changed\x20on\x20any\x20host.'}});const p=(G,H,I,J,K)=>({'content':[{'type':'text','text':'Rebind\x20REFUSED\x20('+G+');\x20the\x20OLD\x20binding\x20is\x20untouched.\x20New\x20guard\x20'+o+'\x20exists\x20on\x20chain\x20unbound\x20and\x20inert.\x20'+J}],'structuredContent':{'result':{'guard_created':{'address':o,...f['name']!==undefined?{'name':f['name']}:{}},'network':c['network']??'','binding_gate':G==='binding-semantics'?'blocked':'passed','binding_warnings':K,'dry_run':H,'dry_run_remedies':I,'rebind':{'host':k,'status':'not_rebound','reason':J},'snapshot_note':SNAPSHOT_NOTE,'next_step':'Fix\x20the\x20reported\x20leg(s)\x20and\x20re-run\x20guard_rebind_replacement\x20with\x20the\x20corrected\x20definition;\x20the\x20old\x20guard\x20is\x20still\x20bound\x20meanwhile.'}}}),q=g['host']==='service_buy_guard'?{'object':j,'buy_guard':o}:{'object':j,'node':{'op':'add\x20forward','data':[{'prior_node_name':g['prior_node_name'],'node_name':g['node_name'],'forward':[{'name':g['forward_name'],'guard':o}]}]}};let s=[],t=[];try{const G=await b['lint'](q,g['host']==='service_buy_guard'?'service':'machine',h);s=G['critical']??[],t=G['warnings']??[];}catch(H){t['push']('binding\x20lint\x20could\x20not\x20run:\x20'+String(H?.['message']??H)['slice'](0x0,0xc8));}if(s['length']>0x0)return p('binding-semantics','not_run',s,'the\x20NEW\x20guard\x20hits\x20critical\x20binding-semantics\x20findings\x20for\x20this\x20host',t);let u='inconclusive',v=[],w='';try{const I=await b['dryRun']({'guard':o,...c['submission']!==undefined?{'submission':c['submission']}:{},...c['task']!==undefined?{'task':c['task']}:{},...c['account']!==undefined?{'account':c['account']}:{},...c['network']!==undefined?{'network':c['network']}:{}}),J=I['structuredContent']?.['result']??{};u=String(J['verdict']??'inconclusive'),v=Array['isArray'](J['remedies'])?J['remedies']['map'](String):[],w=String(J['summary']??'');}catch(K){v['push']('dry-run\x20could\x20not\x20run:\x20'+String(K?.['message']??K)['slice'](0x0,0xc8));}if(u!=='would_pass')return p('dry-run',u,v,'the\x20production\x20pre-check\x20says\x20'+u+(w!==''?'\x20—\x20'+w['slice'](0x0,0x12c):''),t);if(g['host']==='service_buy_guard'){const L=await b['onchainOp']({'operation_type':'service','data':{'object':j,'buy_guard':o},'env':i});if(L['isError']){const M=String(L['structuredContent']?.['result']?.['summary']??'service\x20update\x20failed')['slice'](0x0,0x12c);return{'content':[{'type':'text','text':'Guard\x20created\x20('+o+')\x20and\x20gates\x20passed,\x20but\x20the\x20SERVICE\x20REBIND\x20failed;\x20the\x20old\x20buy_guard\x20is\x20untouched.\x20'+M}],'structuredContent':{'result':{'error_code':'service_rebind_failed','guard_created':{'address':o,...f['name']!==undefined?{'name':f['name']}:{}},'network':c['network']??'','binding_gate':'passed','binding_warnings':t,'dry_run':u,'dry_run_remedies':v,'rebind':{'host':k,'status':'not_rebound','reason':M},'snapshot_note':SNAPSHOT_NOTE,'next_step':'Bind\x20the\x20new\x20guard\x20with\x20a\x20plain\x20service\x20guard\x20update\x20(buy_guard\x20=\x20'+o+')\x20once\x20the\x20failure\x20cause\x20is\x20fixed.'}}};}return{'content':[{'type':'text','text':'Guard\x20replaced\x20in\x20one\x20shot:\x20new\x20guard\x20'+o+'\x20created,\x20passed\x20the\x20binding-semantics\x20gate\x20and\x20the\x20production\x20dry-run,\x20and\x20is\x20now\x20the\x20buy_guard\x20of\x20'+j+'.\x20The\x20old\x20guard\x20object\x20remains\x20on\x20chain\x20(immutable\x20evidence).'}],'structuredContent':{'result':{'guard_created':{'address':o,...f['name']!==undefined?{'name':f['name']}:{}},'network':c['network']??'','binding_gate':'passed','binding_warnings':t,'dry_run':u,'dry_run_remedies':[],'rebind':{'host':k,'status':'rebound'},'snapshot_note':SNAPSHOT_NOTE,'next_step':'Re-run\x20verify_guard_dry_run\x20on\x20the\x20SERVICE\x20(not\x20the\x20guard)\x20if\x20you\x20want\x20a\x20post-bind\x20confirmation\x20against\x20the\x20live\x20slot.'}}};}const x=await b['onchainOp']({'operation_type':'machine','data':{'object':j,'node':{'op':'remove\x20forward','data':[{'prior_node_name':g['prior_node_name'],'node_name':g['node_name'],'forward_name':[g['forward_name']]}]}},'env':i});if(x?.['isError']){const N=String(x?.['structuredContent']?.['result']?.['summary']??'remove\x20forward\x20failed')['slice'](0x0,0x12c);return{'content':[{'type':'text','text':'Guard\x20created\x20('+o+')\x20and\x20gates\x20passed,\x20but\x20the\x20REMOVE\x20of\x20the\x20old\x20forward\x20failed;\x20the\x20graph\x20is\x20unchanged.\x20'+N}],'structuredContent':{'result':{'error_code':'remove_forward_failed','guard_created':{'address':o,...f['name']!==undefined?{'name':f['name']}:{}},'network':c['network']??'','binding_gate':'passed','binding_warnings':t,'dry_run':u,'dry_run_remedies':v,'rebind':{'host':k,'status':'not_rebound','reason':N},'snapshot_note':SNAPSHOT_NOTE,'next_step':'Nothing\x20was\x20removed;\x20fix\x20the\x20machine\x20write\x20error\x20and\x20re-run.'}}};}const y={'name':g['forward_name'],'weight':m?.['weight']??0x0,...m?.['namedOperator']!=null?{'namedOperator':m['namedOperator']}:{},...m?.['permissionIndex']!=null?{'permissionIndex':m['permissionIndex']}:{},...g['forward']!==undefined?g['forward']:{},'guard':o};try{await b['onchainOp']({'operation_type':'machine','data':{'object':j,'node':{'op':'add\x20forward','data':[{'prior_node_name':g['prior_node_name'],'node_name':g['node_name'],'forward':[y]}]}},'env':i});}catch(O){const P={'name':g['forward_name'],'weight':m?.['weight']??0x0,...m?.['namedOperator']!=null?{'namedOperator':m['namedOperator']}:{},...m?.['permissionIndex']!=null?{'permissionIndex':m['permissionIndex']}:{},...m?.['guard']!==undefined?{'guard':m['guard']}:{}};let Q=![],R='';try{await b['onchainOp']({'operation_type':'machine','data':{'object':j,'node':{'op':'add\x20forward','data':[{'prior_node_name':g['prior_node_name'],'node_name':g['node_name'],'forward':[P]}]}},'env':i}),Q=!![];}catch(S){R=String(S?.['message']??S)['slice'](0x0,0x12c);}return{'content':[{'type':'text','text':Q?'machine_forward\x20rebind\x20ROLLED\x20BACK:\x20the\x20re-add\x20of\x20the\x20corrected\x20forward\x20failed\x20('+String(O?.['message']??O)['slice'](0x0,0xc8)+');\x20the\x20OLD\x20forward\x20was\x20restored\x20verbatim.\x20New\x20guard\x20'+o+'\x20is\x20unbound\x20and\x20inert.':'machine_forward\x20rebind\x20FAILED\x20and\x20the\x20rollback\x20FAILED\x20TOO:\x20the\x20edge\x20'+g['prior_node_name']+'\x20->\x20'+g['node_name']+'\x20is\x20currently\x20MISSING\x20its\x20forward\x20\x27'+g['forward_name']+'\x27\x20(unpublished\x20machine,\x20no\x20orders).\x20Re-add\x20error:\x20'+R}],'structuredContent':{'result':{'error_code':Q?'readd_failed_rolled_back':'readd_failed_no_edge','guard_created':{'address':o,...f['name']!==undefined?{'name':f['name']}:{}},'network':c['network']??'','binding_gate':'passed','binding_warnings':t,'dry_run':u,'dry_run_remedies':v,'rebind':{'host':k,'status':Q?'rolled_back':'not_rebound','reason':Q?'re-add\x20failed\x20('+String(O?.['message']??O)['slice'](0x0,0xc8)+');\x20old\x20forward\x20restored':'re-add\x20failed\x20AND\x20rollback\x20failed\x20—\x20edge\x20is\x20missing\x20its\x20forward;\x20re-add\x20error:\x20'+R},'snapshot_note':SNAPSHOT_NOTE,'next_step':Q?'The\x20graph\x20is\x20as\x20before;\x20inspect\x20the\x20re-add\x20error\x20(E_DUPLICATE_NODE_PREV\x20and\x20friends)\x20and\x20re-run.':'URGENT:\x20re-add\x20the\x20forward\x20by\x20hand\x20(machine\x20node\x20write,\x20add\x20forward)\x20to\x20restore\x20the\x20edge.'}}};}return{'content':[{'type':'text','text':'Guard\x20replaced\x20in\x20one\x20shot:\x20new\x20guard\x20'+o+'\x20created,\x20passed\x20the\x20binding-semantics\x20gate\x20and\x20the\x20production\x20dry-run,\x20and\x20is\x20now\x20the\x20guard\x20of\x20forward\x20\x27'+g['forward_name']+'\x27\x20on\x20'+j+'.\x20The\x20old\x20guard\x20object\x20remains\x20on\x20chain\x20(immutable\x20evidence).'}],'structuredContent':{'result':{'guard_created':{'address':o,...f['name']!==undefined?{'name':f['name']}:{}},'network':c['network']??'','binding_gate':'passed','binding_warnings':t,'dry_run':u,'dry_run_remedies':[],'rebind':{'host':k,'status':'rebound'},'snapshot_note':SNAPSHOT_NOTE,'next_step':'Re-run\x20the\x20machine\x20shape\x20verification\x20(compile/verify\x20surface)\x20if\x20you\x20want\x20a\x20post-bind\x20structural\x20confirmation.'}}};}
@@ -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{clearInFlightMarkers}from'../../composition/inflight.js';import{clearChainScope,resolveChainIdentity}from'@wowok/wowok/w/local/chain-scope';import{account_operation,local_mark_operation,local_info_operation,local_history_operation,GasTokenType,isFundApprovalExempt,MAX_ACCOUNTS,query_account_list}from'@wowok/wowok';import{parseAmount,generateFundConfirmation,generateSkillsHint,formatAmountText}from'../../knowledge/fund-layer.js';import{buildDataSemantic,normalizeErrorMessage}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=normalizeErrorMessage(f);if(/free a slot|MAX_ACCOUNTS|max(?:imum)? (?:number of )?accounts/i['test'](g))return accountError(g+'\x0aACCOUNT\x20POOL\x20RECOVERY\x20(F-17):\x20the\x20local\x20account\x20pool\x20is\x20a\x20static\x20quota.\x20Recover\x20in\x20order:\x20'+'(1)\x20`account_operation`\x20sub-op\x20`suspend`\x20one\x20idle\x20test\x20account\x20—\x20each\x20suspend\x20frees\x20EXACTLY\x20one\x20slot,\x20so\x20pair\x20every\x20suspend\x20with\x20the\x20next\x20`gen`;\x20'+'a\x20suspend\x20candidate\x20has\x20no\x20unreturned\x20funds\x20and\x20NO\x20in-flight\x20order\x20(an\x20[UNOBSERVED-PENDING]\x20marker\x20means\x20the\x20outcome\x20is\x20still\x20unknown\x20—\x20never\x20suspend\x20it);\x20'+'(2)\x20or\x20raise\x20the\x20cap\x20within\x20the\x20build\x20limit\x20via\x20the\x20WOWOK_MAX_ACCOUNTS\x20env\x20var\x20(must\x20be\x20set\x20before\x20the\x20session\x20starts);\x20'+'(3)\x20rename/swap_name\x20never\x20frees\x20a\x20slot.',b);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['gen']!==undefined)try{const i=await query_account_list(),j=i['filter'](k=>!k['suspended']);if(j['length']>=MAX_ACCOUNTS){const k=[...j]['sort']((l,m)=>(l['createdAt']??0x0)-(m['createdAt']??0x0))['slice'](0x0,0xc)['map'](l=>{const m=l['createdAt']?Math['floor']((Date['now']()-l['createdAt'])/0x5265c00):undefined;return'-\x20\x27'+(l['name']||'(default\x20—\x20suspend\x20via\x20MCP\x20not\x20allowed)')+'\x27\x20'+l['address']+(''+(m!==undefined?',\x20created\x20'+m+'d\x20ago':''))+(''+(l['messenger']?',\x20messenger-enabled':''));});return accountError('Account\x20pool\x20is\x20at\x20its\x20cap:\x20'+j['length']+'/'+MAX_ACCOUNTS+'\x20active\x20accounts\x20—\x20the\x20new\x20account\x20was\x20NOT\x20created.\x20'+'Oldest\x20active\x20accounts\x20(likeliest\x20stale\x20candidates):\x0a'+k['join']('\x0a')+'\x0aFree\x20slots:\x20account_operation\x20{suspend:\x20{name_or_address:\x20\x27<name\x20or\x20address>\x27}}\x20—\x20suspended\x20accounts\x20stop\x20counting\x20and\x20cannot\x20sign;\x20resume({address,\x20name?})\x20brings\x20one\x20back.\x20'+'Suspend\x20is\x20NOT\x20allowed\x20on\x20the\x20default\x20account\x20(client\x20Wallet\x20tab\x20only).\x20'+'The\x20ceiling\x20itself\x20is\x20the\x20SDK\x20build\x20cap\x20(runtime\x20env\x20WOWOK_MAX_ACCOUNTS\x20can\x20lower\x20it,\x20never\x20raise\x20it)\x20—\x20suspension\x20is\x20the\x20intended\x20path,\x20there\x20is\x20no\x20bulk\x20prune.',c);}}catch{}if(b['transfer']!==undefined){const l=b['transfer'],m=await coinFundGate(l['amount'],l['token_type']??GasTokenType,l['network'],l['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'+(l['name_or_address_to']??'(default\x20account)'),'Sender:\x20'+(l['name_or_address_from']??'(default\x20account)')],'accountRef':l['name_or_address_from']},c);if('blocked'in m)return m['blocked'];const n={...b,'transfer':{...l,'amount':m['parsed']['smallestUnit']['toString']()}};return delete n['transfer']['confirmed'],executeAccountOperation(n,c);}if(b['get']!==undefined){const o=b['get'],p=await coinFundGate(o['balance_required'],o['token_type']??GasTokenType,o['network'],o['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'+(o['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':o['name_or_address']},c);if('blocked'in p)return p['blocked'];const q={...b,'get':{...o,'balance_required':p['parsed']['smallestUnit']['toString']()}};return delete q['get']['confirmed'],executeAccountOperation(q,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}},\x20{refresh_chain_scope:{op:\x27refresh_chain_scope\x27}},\x20or\x20{clear_inflight:{op:\x27clear_inflight\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['clear_inflight']){const i=clearInFlightMarkers();return cacheSuccess({'op':'clear_inflight','cleared':i},c);}if(b['refresh_chain_scope']){const j=Cache['chainIdentityOf']()??null;clearChainScope();const k=await resolveChainIdentity(b['refresh_chain_scope']['network'])??null;return cacheSuccess({'op':'refresh_chain_scope','previous_chain_identity':j,'chain_identity':k,'changed':k!==null&&k!==j,'resolved':k!==null},c);}return accountError('No\x20cache\x20operation\x20specified',c);}catch(l){const m=l instanceof Error?l['message']:String(l);return{'content':[{'type':'text','text':'Error:\x20'+m}],'structuredContent':{'result':{'status':'error','error':m,'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,!![],m)}};}};
1
+ import{wrapLocalHandler}from'../shared.js';import{withFaucetRetry}from'../retry.js';import{strictParse}from'../../schema/index.js';import{isResolvableAddressLiteral}from'./name-resolution.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{clearInFlightMarkers}from'../../composition/inflight.js';import{clearChainScope,resolveChainIdentity}from'@wowok/wowok/w/local/chain-scope';import{account_operation,local_mark_operation,local_info_operation,local_history_operation,GasTokenType,isFundApprovalExempt,MAX_ACCOUNTS,query_account_list,LocalMark}from'@wowok/wowok';import{putMarkNamespaced}from'./mark-namespace.js';import{parseAmount,generateFundConfirmation,generateSkillsHint,formatAmountText}from'../../knowledge/fund-layer.js';import{buildDataSemantic,normalizeErrorMessage}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};}const fundOpQueues=new Map();function serializeFundOp(a,b){const c=fundOpQueues['get'](a)??Promise['resolve'](),d=c['then'](b,b);return fundOpQueues['set'](a,d['catch'](()=>undefined)),d;}async function executeAccountOperation(a,b){try{const c=a['transfer']?.['name_or_address_from']??a['get']?.['name_or_address']??undefined,d=()=>withFaucetRetry(account_operation)(a),e=c!==undefined?await serializeFundOp(c+'@'+(a['transfer']?.['network']??a['get']?.['network']??''),d):await d();try{if(e['transfer']){const f=e['transfer'];f['network']=await resolveNetwork(a['transfer']?.['network']),f['network_source']=a['transfer']?.['network']?'request':'session_default';}if(e['get']){const g=e['get'];g['network']=await resolveNetwork(a['get']?.['network']),g['network_source']=a['get']?.['network']?'request':'session_default';}}catch{}return{'content':[{'type':'text','text':JSON['stringify'](e)}],'structuredContent':{'result':{'status':'success','data':e},'semantic':buildDataSemantic(e,b)}};}catch(h){const i=normalizeErrorMessage(h);if(/free a slot|MAX_ACCOUNTS|max(?:imum)? (?:number of )?accounts/i['test'](i))return accountError(i+'\x0aACCOUNT\x20POOL\x20RECOVERY\x20(F-17):\x20the\x20local\x20account\x20pool\x20is\x20a\x20static\x20quota.\x20Recover\x20in\x20order:\x20'+'(1)\x20`account_operation`\x20sub-op\x20`suspend`\x20one\x20idle\x20test\x20account\x20—\x20each\x20suspend\x20frees\x20EXACTLY\x20one\x20slot,\x20so\x20pair\x20every\x20suspend\x20with\x20the\x20next\x20`gen`;\x20'+'a\x20suspend\x20candidate\x20has\x20no\x20unreturned\x20funds\x20and\x20NO\x20in-flight\x20order\x20(an\x20[UNOBSERVED-PENDING]\x20marker\x20means\x20the\x20outcome\x20is\x20still\x20unknown\x20—\x20never\x20suspend\x20it);\x20'+'(2)\x20or\x20raise\x20the\x20cap\x20within\x20the\x20build\x20limit\x20via\x20the\x20WOWOK_MAX_ACCOUNTS\x20env\x20var\x20(must\x20be\x20set\x20before\x20the\x20session\x20starts);\x20'+'(3)\x20rename/swap_name\x20never\x20frees\x20a\x20slot.',b);return accountError(i,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['gen']!==undefined)try{const i=await query_account_list(),j=i['filter'](k=>!k['suspended']);if(j['length']>=MAX_ACCOUNTS){const k=[...j]['sort']((l,m)=>(l['createdAt']??0x0)-(m['createdAt']??0x0))['slice'](0x0,0xc)['map'](l=>{const m=l['createdAt']?Math['floor']((Date['now']()-l['createdAt'])/0x5265c00):undefined;return'-\x20\x27'+(l['name']||'(default\x20—\x20suspend\x20via\x20MCP\x20not\x20allowed)')+'\x27\x20'+l['address']+(''+(m!==undefined?',\x20created\x20'+m+'d\x20ago':''))+(''+(l['messenger']?',\x20messenger-enabled':''));});return accountError('Account\x20pool\x20is\x20at\x20its\x20cap:\x20'+j['length']+'/'+MAX_ACCOUNTS+'\x20active\x20accounts\x20—\x20the\x20new\x20account\x20was\x20NOT\x20created.\x20'+'Oldest\x20active\x20accounts\x20(likeliest\x20stale\x20candidates):\x0a'+k['join']('\x0a')+'\x0aFree\x20slots:\x20account_operation\x20{suspend:\x20{name_or_address:\x20\x27<name\x20or\x20address>\x27}}\x20—\x20suspended\x20accounts\x20stop\x20counting\x20and\x20cannot\x20sign;\x20resume({address,\x20name?})\x20brings\x20one\x20back.\x20'+'Suspend\x20is\x20NOT\x20allowed\x20on\x20the\x20default\x20account\x20(client\x20Wallet\x20tab\x20only).\x20'+'The\x20ceiling\x20itself\x20is\x20the\x20SDK\x20build\x20cap\x20(runtime\x20env\x20WOWOK_MAX_ACCOUNTS\x20can\x20lower\x20it,\x20never\x20raise\x20it)\x20—\x20suspension\x20is\x20the\x20intended\x20path,\x20there\x20is\x20no\x20bulk\x20prune.',c);}}catch{}if(b['transfer']!==undefined){const l=b['transfer'],m=await coinFundGate(l['amount'],l['token_type']??GasTokenType,l['network'],l['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'+(l['name_or_address_to']??'(default\x20account)'),'Sender:\x20'+(l['name_or_address_from']??'(default\x20account)')],'accountRef':l['name_or_address_from']},c);if('blocked'in m)return m['blocked'];const n={...b,'transfer':{...l,'amount':m['parsed']['smallestUnit']['toString']()}};return delete n['transfer']['confirmed'],executeAccountOperation(n,c);}if(b['get']!==undefined){const o=b['get'],p=await coinFundGate(o['balance_required'],o['token_type']??GasTokenType,o['network'],o['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'+(o['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':o['name_or_address']},c);if('blocked'in p)return p['blocked'];const q={...b,'get':{...o,'balance_required':p['parsed']['smallestUnit']['toString']()}};return delete q['get']['confirmed'],executeAccountOperation(q,c);}return executeAccountOperation(b,c);};export const handleMarkOperation=wrapLocalHandler({'schema':LocalMarkOperationSchema,'operationFn':async a=>{if(a['add']&&Array['isArray'](a['add']['data'])){const b=a['network'],c={'getAddress':h=>LocalMark['Instance']()['get_address'](h??'',b),'put':h=>LocalMark['Instance']()['put'](h,b),'list':()=>LocalMark['Instance']()['list'](undefined,b),'release':h=>LocalMark['Instance']()['release'](h,b)},d=a['add']['data']['every'](h=>{const i=h['name'];return typeof i==='string'?i['trim']()!=='':typeof i?.['value']==='string'&&i['value']['trim']()!=='';});if(!d)return local_mark_operation(a);const e=[],f=[];let g;for(const h of a['add']['data']){const i=h['name'],j=typeof i==='string'?i:i['value'],k=await putMarkNamespaced(c,{'name':{'value':j},'address':h['address'],...Array['isArray'](h['tags'])?{'tags':h['tags']}:{}});e['push'](...k['written']),f['push'](...k['warnings']);if(k['bareSkipped']!==undefined)g=k['bareSkipped'];}return{'add':{'marked':e,'unnamed':0x0,...f['length']>0x0?{'warnings':f}:{},...g!==undefined?{'bare_skipped':g}:{}}};}return local_mark_operation(a);},'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':executeInfoOperation,'parseLabel':'local_info_operation\x20input','buildContext':a=>({'operation_type':deriveOpType('local_info',a),'data':a})});async function executeInfoOperation(a){const b=a['account'];if(typeof b==='string'&&b['length']>0x0&&!isResolvableAddressLiteral(b)){const c=await Account['Instance']()['get_address'](b)['catch'](()=>undefined);if(!c)throw new Error('local_info_operation:\x20account\x20partition\x20ref\x20\x27'+b+'\x27\x20does\x20not\x20resolve\x20to\x20a\x20registered\x20account\x20on\x20this\x20device\x20'+'(and\x20is\x20not\x20a\x200x\x20address).\x20LocalInfo\x20partitions\x20by\x20account\x20ADDRESS\x20—\x20writing\x20with\x20an\x20unresolvable\x20name\x20'+'would\x20silently\x20create\x20an\x20unreachable\x20partition\x20(yfd\x20F-18:\x20data\x20\x27saved\x20but\x20lost\x27).\x20'+'Either\x20pass\x20the\x20account\x27s\x200x\x20address,\x20or\x20register\x20the\x20name\x20with\x20account_operation\x20first;\x20'+'query_toolkit\x20query_type=\x27account_list\x27\x20shows\x20what\x20this\x20device\x20knows.');return local_info_operation({...a,'account':c});}return local_info_operation(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}},\x20{refresh_chain_scope:{op:\x27refresh_chain_scope\x27}},\x20or\x20{clear_inflight:{op:\x27clear_inflight\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['clear_inflight']){const i=clearInFlightMarkers();return cacheSuccess({'op':'clear_inflight','cleared':i},c);}if(b['refresh_chain_scope']){const j=Cache['chainIdentityOf']()??null;clearChainScope();const k=await resolveChainIdentity(b['refresh_chain_scope']['network'])??null;return cacheSuccess({'op':'refresh_chain_scope','previous_chain_identity':j,'chain_identity':k,'changed':k!==null&&k!==j,'resolved':k!==null},c);}return accountError('No\x20cache\x20operation\x20specified',c);}catch(l){const m=l instanceof Error?l['message']:String(l);return{'content':[{'type':'text','text':'Error:\x20'+m}],'structuredContent':{'result':{'status':'error','error':m,'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,!![],m)}};}};
@@ -1 +1 @@
1
- export function namespacedMarkName(a,b){return a+':'+b;}export function isNamespacedMarkName(a){const b=a['indexOf'](':');return b>0x0&&b<a['length']-0x1;}const BOOT_EPOCH=Date['now']();let namespaceOverride;export function sessionMarkNamespace(){return's'+BOOT_EPOCH;}export function activeMarkNamespace(){if(namespaceOverride!==undefined)return namespaceOverride===''?undefined:namespaceOverride;return sessionMarkNamespace();}export function setMarkNamespaceOverride(a){namespaceOverride=a;}export function resetMarkNamespaceForTests(){namespaceOverride=undefined;}export async function putMarkNamespaced(a,b,c=activeMarkNamespace()){const d={'written':[],'warnings':[]},f=b['name']['value'];if(!c||isNamespacedMarkName(f))return await a['put']([b]),d['written']['push']({'name':f,'address':b['address']}),d;const g=namespacedMarkName(c,f);let h=![];try{await a['put']([{'name':{'value':g,'replaceExistName':!![]},'address':b['address'],'tags':b['tags']}]),h=!![];}catch(j){d['warnings']['push']('MARK\x20NS:\x20composite\x20row\x20\x22'+g+'\x22\x20could\x20not\x20be\x20written\x20('+(j instanceof Error?j['message']:String(j))+')\x20—\x20'+'the\x20session-scoped\x20binding\x20is\x20missing;\x20bare-name\x20fallback\x20applies\x20for\x20reads');}h&&d['written']['push']({'name':g,'address':b['address']});let i;try{i=await a['getAddress'](f);}catch{i=undefined;}if(i!==undefined&&i['toLowerCase']()!==b['address']['toLowerCase']())return d['bareSkipped']={'reason':'conflict','existingAddress':i},d['warnings']['push']('MARK\x20COLLISION\x20(ISS-015):\x20bare\x20name\x20\x22'+f+'\x22\x20already\x20resolves\x20to\x20'+i+';\x20THIS\x20registration\x20'+('wanted\x20'+b['address']+'.\x20The\x20session\x20row\x20\x22'+g+'\x22\x20was\x20written\x20and\x20reads\x20in\x20THIS\x20session\x20resolve\x20')+'there;\x20the\x20bare\x20name\x20was\x20left\x20UNTOUCHED\x20(it\x20may\x20be\x20another\x20build\x27s\x20binding\x20—\x20force\x20with\x20a\x20NEW\x20name\x20or\x20'+'release\x20the\x20old\x20one\x20via\x20local_mark\x20release).'),d;try{await a['put']([{'name':{'value':f,'replaceExistName':![]},'address':b['address'],'tags':b['tags']}]),d['written']['push']({'name':f,'address':b['address']});}catch(k){d['warnings']['push']('MARK\x20NS:\x20bare\x20row\x20\x22'+f+'\x22\x20could\x20not\x20be\x20written\x20('+(k instanceof Error?k['message']:String(k))+')\x20—\x20'+'legacy\x20readers\x20will\x20not\x20resolve\x20this\x20name');}return d;}export function namespacedLocalMarkAccess(a,b=activeMarkNamespace()){return{'getAddress':async c=>(await resolveMarkNamespaced(a,c??'',b))['address'],'put':async c=>{const d=[];for(const e of c){d['push'](await putMarkNamespaced(a,e,b));}return d;}};}export async function resolveMarkNamespaced(a,b,c=activeMarkNamespace()){const d=(b??'')['trim'](),e={'name':d,'source':'none'};if(d==='')return e;if(c!==undefined&&!isNamespacedMarkName(d)){e['ns']=c;const [g,h]=await Promise['all']([a['getAddress'](namespacedMarkName(c,d))['catch'](()=>undefined),a['getAddress'](d)['catch'](()=>undefined)]);e['nsAddress']=g,e['bareAddress']=h;if(g!==undefined)e['address']=g,e['source']='ns',h!==undefined&&h['toLowerCase']()!==g['toLowerCase']()&&(e['collisionWarning']='NAME\x20COLLISION\x20(ISS-015):\x20\x22'+d+'\x22\x20resolves\x20to\x20'+g+'\x20in\x20THIS\x20session\x20('+c+')\x20but\x20the\x20'+('bare\x20global\x20row\x20points\x20at\x20'+h+'\x20(another\x20build/session\x27s\x20binding).\x20THIS\x20session\x20keeps\x20the\x20')+'session\x20row;\x20verify\x20the\x20bare\x20row\x20is\x20not\x20what\x20an\x20older\x20tool\x20call\x20froze\x20on-chain.');else h!==undefined&&(e['address']=h,e['source']='bare');return e;}const f=await a['getAddress'](d)['catch'](()=>undefined);return f!==undefined&&(e['address']=f,e['source']='bare'),e;}
1
+ export function namespacedMarkName(a,b){return a+':'+b;}export function isNamespacedMarkName(a){const b=a['indexOf'](':');return b>0x0&&b<a['length']-0x1;}const BOOT_EPOCH=Date['now']();let namespaceOverride;export function sessionMarkNamespace(){return's'+BOOT_EPOCH;}export function activeMarkNamespace(){if(namespaceOverride!==undefined)return namespaceOverride===''?undefined:namespaceOverride;return sessionMarkNamespace();}export function setMarkNamespaceOverride(a){namespaceOverride=a;}export function resetMarkNamespaceForTests(){namespaceOverride=undefined;}async function dedupSameNameRows(a,b,c,d){if(typeof a['list']!=='function'||typeof a['release']!=='function')return 0x0;let f;try{f=(await a['list']())['filter'](h=>typeof h?.['name']==='string'&&h['name']===b&&typeof h?.['address']==='string');}catch(h){return d['push']('MARK\x20NS:\x20dedup\x20list-read\x20for\x20\x22'+b+'\x22\x20failed\x20('+(h instanceof Error?h['message']:String(h))+')\x20—\x20duplicate\x20rows\x20(if\x20any)\x20were\x20NOT\x20collapsed'),0x0;}if(f['length']<0x2)return 0x0;const g=f['find'](i=>i['address']['toLowerCase']()!==c['toLowerCase']());if(g!==undefined)return 0x0;try{return await a['release']([b]),f['length'];}catch(i){return d['push']('MARK\x20NS:\x20dedup\x20release\x20for\x20\x22'+b+'\x22\x20failed\x20('+(i instanceof Error?i['message']:String(i))+')\x20—\x20duplicate\x20rows\x20(if\x20any)\x20were\x20NOT\x20collapsed'),0x0;}}export async function putMarkNamespaced(a,b,c=activeMarkNamespace()){const d={'written':[],'warnings':[]},f=b['name']['value'];if(!c||isNamespacedMarkName(f))return await a['put']([b]),d['written']['push']({'name':f,'address':b['address']}),d;const g=namespacedMarkName(c,f);await dedupSameNameRows(a,g,b['address'],d['warnings']);let h=![];try{await a['put']([{'name':{'value':g,'replaceExistName':!![]},'address':b['address'],'tags':b['tags']}]),h=!![];}catch(k){d['warnings']['push']('MARK\x20NS:\x20composite\x20row\x20\x22'+g+'\x22\x20could\x20not\x20be\x20written\x20('+(k instanceof Error?k['message']:String(k))+')\x20—\x20'+'the\x20session-scoped\x20binding\x20is\x20missing;\x20bare-name\x20fallback\x20applies\x20for\x20reads');}h&&d['written']['push']({'name':g,'address':b['address']});let i;if(typeof a['list']==='function')try{const l=(await a['list']())['filter'](m=>typeof m?.['name']==='string'&&m['name']===f&&typeof m?.['address']==='string');i=l['find'](m=>m['address']['toLowerCase']()!==b['address']['toLowerCase']())?.['address']??l[0x0]?.['address'];}catch{i=undefined;}else try{i=await a['getAddress'](f);}catch{i=undefined;}if(i!==undefined&&i['toLowerCase']()!==b['address']['toLowerCase']())return d['bareSkipped']={'reason':'conflict','existingAddress':i},d['warnings']['push']('MARK\x20COLLISION\x20(ISS-015):\x20bare\x20name\x20\x22'+f+'\x22\x20already\x20resolves\x20to\x20'+i+';\x20THIS\x20registration\x20'+('wanted\x20'+b['address']+'.\x20The\x20session\x20row\x20\x22'+g+'\x22\x20was\x20written\x20and\x20reads\x20in\x20THIS\x20session\x20resolve\x20')+'there;\x20the\x20bare\x20name\x20was\x20left\x20UNTOUCHED\x20(it\x20may\x20be\x20another\x20build\x27s\x20binding\x20—\x20force\x20with\x20a\x20NEW\x20name\x20or\x20'+'release\x20the\x20old\x20one\x20via\x20local_mark\x20release).'),d;const j=await dedupSameNameRows(a,f,b['address'],d['warnings']);j>0x0&&d['warnings']['push']('MARK\x20NS:\x20collapsed\x20'+j+'\x20duplicate\x20row(s)\x20for\x20\x22'+f+'\x22\x20(all\x20resolved\x20to\x20'+b['address']+')\x20into\x20one\x20named\x20row.');try{await a['put']([{'name':{'value':f,'replaceExistName':![]},'address':b['address'],'tags':b['tags']}]),d['written']['push']({'name':f,'address':b['address']});}catch(m){d['warnings']['push']('MARK\x20NS:\x20bare\x20row\x20\x22'+f+'\x22\x20could\x20not\x20be\x20written\x20('+(m instanceof Error?m['message']:String(m))+')\x20—\x20'+'legacy\x20readers\x20will\x20not\x20resolve\x20this\x20name');}return d;}export function namespacedLocalMarkAccess(a,b=activeMarkNamespace()){return{'getAddress':async c=>(await resolveMarkNamespaced(a,c??'',b))['address'],'put':async c=>{const d=[];for(const e of c){d['push'](await putMarkNamespaced(a,e,b));}return d;}};}export async function resolveMarkNamespaced(a,b,c=activeMarkNamespace()){const d=(b??'')['trim'](),e={'name':d,'source':'none'};if(d==='')return e;if(c!==undefined&&!isNamespacedMarkName(d)){e['ns']=c;const [g,h]=await Promise['all']([a['getAddress'](namespacedMarkName(c,d))['catch'](()=>undefined),a['getAddress'](d)['catch'](()=>undefined)]);e['nsAddress']=g,e['bareAddress']=h;if(g!==undefined)e['address']=g,e['source']='ns',h!==undefined&&h['toLowerCase']()!==g['toLowerCase']()&&(e['collisionWarning']='NAME\x20COLLISION\x20(ISS-015):\x20\x22'+d+'\x22\x20resolves\x20to\x20'+g+'\x20in\x20THIS\x20session\x20('+c+')\x20but\x20the\x20'+('bare\x20global\x20row\x20points\x20at\x20'+h+'\x20(another\x20build/session\x27s\x20binding).\x20THIS\x20session\x20keeps\x20the\x20')+'session\x20row;\x20verify\x20the\x20bare\x20row\x20is\x20not\x20what\x20an\x20older\x20tool\x20call\x20froze\x20on-chain.');else h!==undefined&&(e['address']=h,e['source']='bare');return e;}const f=await a['getAddress'](d)['catch'](()=>undefined);return f!==undefined&&(e['address']=f,e['source']='bare'),e;}