@wowok/agent-mcp 3.2.9 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +2 -2
  2. package/dist/chain-semantics/field-capability.js +1 -1
  3. package/dist/chain-semantics/freeze-map.js +1 -1
  4. package/dist/chain-semantics/fund-flow.js +1 -1
  5. package/dist/chain-semantics/object-graph.js +1 -1
  6. package/dist/composition/audit.js +1 -1
  7. package/dist/composition/compile.d.ts +10 -1
  8. package/dist/composition/compile.js +1 -1
  9. package/dist/composition/inflight.js +1 -1
  10. package/dist/extensions/capability-manifest.js +1 -1
  11. package/dist/extensions/industry-audit.spec.js +1 -1
  12. package/dist/extensions/industry-pack.js +1 -1
  13. package/dist/graph/onchain/facts.spec.js +1 -1
  14. package/dist/graph/onchain/field-manifest.js +1 -1
  15. package/dist/harness/recover.js +1 -1
  16. package/dist/intent/types.d.ts +1 -1
  17. package/dist/intent/types.js +1 -1
  18. package/dist/keeper/KeeperScan.d.ts +2 -1
  19. package/dist/keeper/KeeperScan.js +1 -1
  20. package/dist/keeper/keeper.spec.js +1 -1
  21. package/dist/keeper/types.d.ts +3 -0
  22. package/dist/keeper/types.js +1 -1
  23. package/dist/knowledge/allocator-rail-verifier.d.ts +34 -0
  24. package/dist/knowledge/allocator-rail-verifier.js +1 -0
  25. package/dist/knowledge/arbitration-ledger.js +1 -1
  26. package/dist/knowledge/arbitration-templates.js +1 -1
  27. package/dist/knowledge/arbitration-venue-order.js +1 -1
  28. package/dist/knowledge/audit-rules.d.ts +19 -1
  29. package/dist/knowledge/audit-rules.js +1 -1
  30. package/dist/knowledge/baselines/rules/alloc_audit.json +1 -1
  31. package/dist/knowledge/baselines/rules/arb.json +1 -1
  32. package/dist/knowledge/baselines/rules/guard.json +15 -5
  33. package/dist/knowledge/baselines/rules/machine.json +9 -6
  34. package/dist/knowledge/baselines/rules/plan.json +12 -12
  35. package/dist/knowledge/baselines/semantic-facts.js +1 -1
  36. package/dist/knowledge/builtin-templates.d.ts +1 -1
  37. package/dist/knowledge/builtin-templates.js +1 -1
  38. package/dist/knowledge/contract-invariants.js +1 -1
  39. package/dist/knowledge/event-semantics.js +1 -1
  40. package/dist/knowledge/fund-layer.js +1 -1
  41. package/dist/knowledge/getting-started.js +1 -1
  42. package/dist/knowledge/guard-anchor-reach.d.ts +1 -1
  43. package/dist/knowledge/guard-anchor-reach.js +1 -1
  44. package/dist/knowledge/guard-bindings.js +1 -1
  45. package/dist/knowledge/guard-design-patterns.d.ts +1 -1
  46. package/dist/knowledge/guard-design-patterns.js +1 -1
  47. package/dist/knowledge/guard-field-cognition.js +1 -1
  48. package/dist/knowledge/guard-render.js +1 -1
  49. package/dist/knowledge/guard-risk.js +1 -1
  50. package/dist/knowledge/guard-templates.d.ts +1 -1
  51. package/dist/knowledge/guard-templates.js +1 -1
  52. package/dist/knowledge/index.js +1 -1
  53. package/dist/knowledge/industry-registry.js +1 -1
  54. package/dist/knowledge/industry-strategy.js +1 -1
  55. package/dist/knowledge/jsonrpc-enum.js +1 -1
  56. package/dist/knowledge/machine-ledger.js +1 -1
  57. package/dist/knowledge/machine-puzzle.d.ts +1 -1
  58. package/dist/knowledge/machine-puzzle.js +1 -1
  59. package/dist/knowledge/machine-risk.js +1 -1
  60. package/dist/knowledge/machine-templates.js +1 -1
  61. package/dist/knowledge/machine-topology.d.ts +8 -0
  62. package/dist/knowledge/machine-topology.js +1 -1
  63. package/dist/knowledge/machine-translation.js +1 -1
  64. package/dist/knowledge/permission-ledger.js +1 -1
  65. package/dist/knowledge/protocol-facts.d.ts +16 -0
  66. package/dist/knowledge/protocol-facts.js +1 -0
  67. package/dist/knowledge/recipient-constraint.js +1 -1
  68. package/dist/knowledge/reward-ledger.d.ts +2 -1
  69. package/dist/knowledge/reward-ledger.js +1 -1
  70. package/dist/knowledge/reward-templates.js +1 -1
  71. package/dist/knowledge/safety-rules.d.ts +0 -2
  72. package/dist/knowledge/safety-rules.js +1 -1
  73. package/dist/knowledge/scenario-modes.d.ts +7 -0
  74. package/dist/knowledge/scenario-modes.js +1 -1
  75. package/dist/knowledge/strategy-manuals.js +1 -1
  76. package/dist/knowledge/template-loader.d.ts +13 -1
  77. package/dist/knowledge/template-loader.js +1 -1
  78. package/dist/knowledge/template-registry.js +1 -1
  79. package/dist/knowledge/template-scanner.js +1 -1
  80. package/dist/knowledge/tool-constraints.js +1 -1
  81. package/dist/knowledge/tools-reference.js +1 -1
  82. package/dist/monitor/MonitorLoop.js +1 -1
  83. package/dist/monitor/normalize.d.ts +1 -1
  84. package/dist/monitor/normalize.js +1 -1
  85. package/dist/monitor/types.d.ts +1 -1
  86. package/dist/monitor/types.js +1 -1
  87. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  88. package/dist/playbooks/service-build/game-theory.d.ts +1 -0
  89. package/dist/playbooks/service-build/game-theory.js +1 -1
  90. package/dist/playbooks/service-build/intent-analyzer.js +1 -1
  91. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  92. package/dist/playbooks/service-build/merchant-guide.js +1 -1
  93. package/dist/playbooks/service-build/object-panorama.js +1 -1
  94. package/dist/playbooks/service-build/participation-radar.js +1 -1
  95. package/dist/playbooks/service-build/relationship-profile.js +1 -1
  96. package/dist/playbooks/service-build/service-panorama.js +1 -1
  97. package/dist/playbooks/service-build/service-quote.js +1 -1
  98. package/dist/playbooks/service-build/service-quote.spec.js +1 -1
  99. package/dist/relationship/registry.js +1 -1
  100. package/dist/review/index.js +1 -1
  101. package/dist/role/profiles.js +1 -1
  102. package/dist/rules.js +1 -1
  103. package/dist/safety/confirm-gate.js +1 -1
  104. package/dist/schema/benchmark-migration/index.d.ts +5 -1
  105. package/dist/schema/benchmark-migration/index.js +1 -1
  106. package/dist/schema/call/arbitration.d.ts +4 -4
  107. package/dist/schema/call/arbitration.js +1 -1
  108. package/dist/schema/call/base.d.ts +39 -0
  109. package/dist/schema/call/base.js +1 -1
  110. package/dist/schema/call/bridge.d.ts +1 -0
  111. package/dist/schema/call/contact.d.ts +4 -4
  112. package/dist/schema/call/demand.d.ts +4 -4
  113. package/dist/schema/call/error-codes.d.ts +1 -1
  114. package/dist/schema/call/error-codes.js +1 -1
  115. package/dist/schema/call/handler.js +1 -1
  116. package/dist/schema/call/machine.d.ts +12 -4
  117. package/dist/schema/call/order.d.ts +4 -4
  118. package/dist/schema/call/permission.d.ts +4 -4
  119. package/dist/schema/call/progress.d.ts +4 -4
  120. package/dist/schema/call/receipt.d.ts +8 -0
  121. package/dist/schema/call/receipt.js +1 -1
  122. package/dist/schema/call/repository.d.ts +4 -4
  123. package/dist/schema/call/reward.d.ts +24 -4
  124. package/dist/schema/call/reward.js +1 -1
  125. package/dist/schema/call/semantic.js +1 -1
  126. package/dist/schema/call/service.d.ts +6 -4
  127. package/dist/schema/call/service.js +1 -1
  128. package/dist/schema/call/treasury.d.ts +4 -4
  129. package/dist/schema/common/index.d.ts +2 -2
  130. package/dist/schema/common/index.js +1 -1
  131. package/dist/schema/goal/index.d.ts +5 -1
  132. package/dist/schema/goal/planning.d.ts +10 -2
  133. package/dist/schema/goal/planning.js +1 -1
  134. package/dist/schema/industry-pack/index.d.ts +3 -0
  135. package/dist/schema/industry-pack/index.js +1 -1
  136. package/dist/schema/intent-radar/index.d.ts +9 -0
  137. package/dist/schema/intent-radar/index.js +1 -1
  138. package/dist/schema/local/index.d.ts +10 -0
  139. package/dist/schema/local/index.js +1 -1
  140. package/dist/schema/operations.d.ts +35 -22
  141. package/dist/schema/operations.js +1 -1
  142. package/dist/schema/query/bi.d.ts +16 -0
  143. package/dist/schema/query/bi.js +1 -1
  144. package/dist/schema/query/index.d.ts +52 -48
  145. package/dist/schema/query/index.js +1 -1
  146. package/dist/schema/schema-query/index.d.ts +1 -0
  147. package/dist/schema/schema-query/index.js +1 -1
  148. package/dist/schema/schema-version.js +1 -1
  149. package/dist/schema/workspace/index.d.ts +9 -0
  150. package/dist/schema/workspace/index.js +1 -1
  151. package/dist/schema-query-impl/index.d.ts +1 -1
  152. package/dist/schema-query-impl/index.js +1 -1
  153. package/dist/schemas/account_operation.output.json +1 -0
  154. package/dist/schemas/account_operation.schema.json +1 -1
  155. package/dist/schemas/benchmark_migration_operation.schema.json +27 -3
  156. package/dist/schemas/bridge_operation.output.json +1 -0
  157. package/dist/schemas/goal_operation.schema.json +26 -2
  158. package/dist/schemas/index.json +1 -1
  159. package/dist/schemas/industry_pack_operation.output.json +8 -0
  160. package/dist/schemas/industry_pack_operation.schema.json +9 -0
  161. package/dist/schemas/intent_radar.output.json +8 -2
  162. package/dist/schemas/intent_radar.schema.json +4 -1
  163. package/dist/schemas/local_cache_operation.output.json +1 -0
  164. package/dist/schemas/local_history_operation.output.json +1 -0
  165. package/dist/schemas/local_info_operation.output.json +1 -0
  166. package/dist/schemas/local_mark_operation.output.json +1 -0
  167. package/dist/schemas/monitor_events.schema.json +3 -1
  168. package/dist/schemas/onchain_events.output.json +275 -11
  169. package/dist/schemas/onchain_events.schema.json +25 -1
  170. package/dist/schemas/onchain_operations.output.json +40 -0
  171. package/dist/schemas/onchain_operations.schema.json +573 -104
  172. package/dist/schemas/onchain_operations_allocation.schema.json +2 -2
  173. package/dist/schemas/onchain_operations_arbitration.schema.json +11 -7
  174. package/dist/schemas/onchain_operations_contact.schema.json +9 -5
  175. package/dist/schemas/onchain_operations_demand.schema.json +9 -5
  176. package/dist/schemas/onchain_operations_guard.schema.json +342 -4
  177. package/dist/schemas/onchain_operations_machine.schema.json +17 -5
  178. package/dist/schemas/onchain_operations_order.schema.json +9 -5
  179. package/dist/schemas/onchain_operations_permission.schema.json +9 -5
  180. package/dist/schemas/onchain_operations_progress.schema.json +9 -5
  181. package/dist/schemas/onchain_operations_repository.schema.json +9 -5
  182. package/dist/schemas/onchain_operations_reward.schema.json +89 -9
  183. package/dist/schemas/onchain_operations_service.schema.json +18 -11
  184. package/dist/schemas/onchain_operations_treasury.schema.json +9 -5
  185. package/dist/schemas/query_toolkit.output.json +237 -14
  186. package/dist/schemas/schema_query.schema.json +3 -2
  187. package/dist/schemas/workspace_operation.output.json +23 -3
  188. package/dist/schemas/workspace_operation.schema.json +3 -3
  189. package/dist/tools/handlers/benchmark-migration.d.ts +45 -1
  190. package/dist/tools/handlers/benchmark-migration.js +1 -1
  191. package/dist/tools/handlers/config.js +1 -1
  192. package/dist/tools/handlers/industry-pack.js +1 -1
  193. package/dist/tools/handlers/intent-radar.js +1 -1
  194. package/dist/tools/handlers/keeper.d.ts +1 -1
  195. package/dist/tools/handlers/onchain.d.ts +12 -0
  196. package/dist/tools/handlers/onchain.js +1 -1
  197. package/dist/tools/handlers/schema-query.js +1 -1
  198. package/dist/tools/handlers/workflow.js +1 -1
  199. package/dist/tools/handlers/workspace.js +1 -1
  200. package/dist/tools/index.js +1 -1
  201. package/dist/tools/registry/agent.js +1 -1
  202. package/dist/tools/registry/business.js +1 -1
  203. package/dist/tools/registry/local.js +1 -1
  204. package/dist/tools/registry/query.js +1 -1
  205. package/dist/tools/rules-hook.js +1 -1
  206. package/dist/tools/wrap.js +1 -1
  207. package/package.json +2 -2
@@ -1 +1 @@
1
- import{PackageAddress}from'@wowok/wowok';const SYS=a=>({'field':'id','disposition':{'kind':'nonAddress','note':'Object\x20identity\x20(UID);\x20system-managed,\x20never\x20a\x20business\x20reference'},'evidence':a}),SERVICE={'object':'Service','moveStruct':'service.move\x20L174-193\x20Service<T>','fields':[SYS('service.move\x20L174-193'),{'field':'description','disposition':{'kind':'attribute','note':'Shop\x20self-description;\x20node\x20property'},'evidence':'service.move\x20L174-193'},{'field':'location','disposition':{'kind':'attribute','note':'Service\x20area\x20/\x20market-opportunity\x20routing\x20key'},'evidence':'service.move\x20L174-193'},{'field':'sales','disposition':{'kind':'attribute','note':'Catalog\x20items\x20for\x20sale\x20(what\x20the\x20shop\x20sells)'},'evidence':'service.move\x20L174-193'},{'field':'repositories','disposition':{'kind':'edge','schema':'service.repository'},'evidence':'service.move\x20L174-193\x20(<=100)'},{'field':'buy_guard','disposition':{'kind':'edge','schema':'service.buy_guard'},'evidence':'service.move\x20L174-193'},{'field':'machine','disposition':{'kind':'edge','schema':'service.machine'},'evidence':'service.move\x20L174-193'},{'field':'bPublished','disposition':{'kind':'attribute','note':'Publish\x20flag;\x20freezes\x20machine/guard\x20settings;\x20analyzer\x20input'},'evidence':'service.move\x20L174-193'},{'field':'bPaused','disposition':{'kind':'attribute','note':'Pause\x20flag;\x20purchasability;\x20analyzer\x20input'},'evidence':'service.move\x20L174-193'},{'field':'customer_required','disposition':{'kind':'attribute','note':'Custom\x20info\x20fields\x20the\x20shop\x20requires\x20from\x20buyers'},'evidence':'service.move\x20L174-193'},{'field':'arbitrations','disposition':{'kind':'edge','schema':'service.arbitration'},'evidence':'service.move\x20L174-193\x20(<=20)'},{'field':'compensation_fund','disposition':{'kind':'attribute','note':'Escrowed\x20compensation\x20balance\x20(arbitration\x20solvency\x20signal)'},'evidence':'service.move\x20L174-193'},{'field':'paused_time','disposition':{'kind':'attribute','note':'When\x20the\x20shop\x20was\x20paused\x20(timestamp-ms)'},'evidence':'service.move\x20L174-193'},{'field':'setting_lock_duration','disposition':{'kind':'attribute','note':'Lock\x20duration\x20gating\x20post-pause\x20setting\x20changes'},'evidence':'service.move\x20L174-193'},{'field':'order_allocators','disposition':{'kind':'edge','schema':'service.order_allocator_guard','note':'Allocators\x20container;\x20guard\x20members\x20are\x20the\x20edge,\x20sharing\x20amounts\x20ride\x20the\x20payload'},'evidence':'service.move\x20L174-193;\x20allocation.move\x20L194-200'},{'field':'rewards','disposition':{'kind':'edge','schema':'service.reward'},'evidence':'service.move\x20L174-193\x20(<=20)'},{'field':'um','disposition':{'kind':'edge','schema':'service.um'},'evidence':'service.move\x20L174-193'},{'field':'permission','disposition':{'kind':'edge','schema':'service.permission'},'evidence':'service.move\x20L174-193'}]},ORDER={'object':'Order','moveStruct':'order.move\x20L59-74\x20Order','fields':[SYS('order.move\x20L59-74'),{'field':'items','disposition':{'kind':'attribute','note':'Purchased\x20line\x20items\x20(what\x20was\x20bought)'},'evidence':'order.move\x20L59-74'},{'field':'discount','disposition':{'kind':'edge','schema':'order.discount'},'evidence':'order.move\x20L59-74'},{'field':'progress','disposition':{'kind':'edge','schema':'order.progress'},'evidence':'order.move\x20L59-74,L130'},{'field':'machine','disposition':{'kind':'edge','schema':'order.machine'},'evidence':'order.move\x20L59-74,L130'},{'field':'amount','disposition':{'kind':'attribute','note':'Total\x20paid\x20(order\x20value\x20signal)'},'evidence':'order.move\x20L59-74'},{'field':'owner','disposition':{'kind':'edge','schema':'order.builder','note':'SDK\x20normalizes\x20owner\x20to\x20builder'},'evidence':'order.move\x20L59-74\x20(owner)'},{'field':'service','disposition':{'kind':'edge','schema':'order.service'},'evidence':'order.move\x20L59-74'},{'field':'dispute','disposition':{'kind':'edge','schema':'order.dispute'},'evidence':'order.move\x20L59-74'},{'field':'agent','disposition':{'kind':'edge','schema':'order.agent'},'evidence':'order.move\x20L59-74,L179\x20(<=10)'},{'field':'allocation','disposition':{'kind':'edge','schema':'order.allocation'},'evidence':'order.move\x20L59-74,L130'},{'field':'claimed_by','disposition':{'kind':'edge','schema':'order.claimed_by'},'evidence':'order.move\x20L59-74,L86-96'},{'field':'required_info','disposition':{'kind':'edge','schema':'order.required_info'},'evidence':'order.move\x20L73,L77-80','oq':'merchant\x20IM\x20address\x20(Service\x27s\x20Contact)\x20or\x20WTS\x20proof\x20(b11/b12)'},{'field':'time','disposition':{'kind':'attribute','note':'Creation\x20time\x20(timestamp-ms)'},'evidence':'order.move\x20L59-74'}]},DISCOUNT={'object':'Discount','moveStruct':'service.move\x20L109-119\x20Discount','fields':[SYS('service.move\x20L109-119'),{'field':'name','disposition':{'kind':'attribute','note':'Discount\x20campaign\x20name'},'evidence':'service.move\x20L109-119'},{'field':'discount_type','disposition':{'kind':'attribute','note':'RATIO\x20(off%)\x20or\x20MINUS\x20(-N)\x20pricing\x20mode'},'evidence':'service.move\x20L109-119'},{'field':'benchmark','disposition':{'kind':'attribute','note':'Minimum-spend\x20condition\x20for\x20the\x20discount'},'evidence':'service.move\x20L109-119'},{'field':'off','disposition':{'kind':'attribute','note':'Discount\x20magnitude\x20(rate\x20or\x20fixed\x20amount)'},'evidence':'service.move\x20L109-119'},{'field':'time_start','disposition':{'kind':'attribute','note':'Validity\x20window\x20start\x20(timestamp-ms)'},'evidence':'service.move\x20L109-119'},{'field':'time_end','disposition':{'kind':'attribute','note':'Validity\x20window\x20end\x20/\x20expiry'},'evidence':'service.move\x20L109-119'},{'field':'service','disposition':{'kind':'edge','schema':'discount.service'},'evidence':'service.move\x20L117','oq':'OQ-3\x20(Discount\x20joins\x20COVERED\x20types)'},{'field':'transferable','disposition':{'kind':'attribute','note':'Whether\x20the\x20discount\x20may\x20be\x20handed\x20to\x20a\x20receiver'},'evidence':'service.move\x20L109-119'}]},PROGRESS={'object':'Progress','moveStruct':'progress.move\x20L75-85\x20Progress','fields':[SYS('progress.move\x20L75-85'),{'field':'machine','disposition':{'kind':'edge','schema':'progress.machine'},'evidence':'progress.move\x20L75-85'},{'field':'context_repositories','disposition':{'kind':'edge','schema':'progress.context_repository'},'evidence':'progress.move\x20L78,L199-208'},{'field':'current','disposition':{'kind':'attribute','note':'Current\x20node\x20name\x20(completion\x20determination\x20input)'},'evidence':'progress.move\x20L75-85'},{'field':'task','disposition':{'kind':'edge','schema':'progress.task'},'evidence':'progress.move\x20L80'},{'field':'namedOperator','disposition':{'kind':'edge','schema':'progress.named_operator','note':'Container\x20struct;\x20operators[]\x20members\x20are\x20the\x20edge'},'evidence':'progress.move\x20L81\x20(<=80)'},{'field':'session','disposition':{'kind':'attribute','note':'Per-node\x20session\x20records\x20(runtime\x20state)'},'evidence':'progress.move\x20L82'},{'field':'history','disposition':{'kind':'attribute','note':'Node-history\x20ParentTableVec\x20(runtime\x20audit\x20trail,\x20not\x20enumerated\x20as\x20edges)'},'evidence':'progress.move\x20L83'},{'field':'current_time','disposition':{'kind':'attribute','note':'Last\x20activity\x20clock\x20(staleness\x20signal)'},'evidence':'progress.move\x20L84'}]},MACHINE={'object':'Machine','moveStruct':'machine.move\x20L298-307\x20Machine','fields':[SYS('machine.move\x20L298-307'),{'field':'description','disposition':{'kind':'attribute','note':'Workflow\x20description'},'evidence':'machine.move\x20L298-307'},{'field':'nodes','disposition':{'kind':'edge','schema':'machine.node','coSchemas':['wf.transition','wf.forward_guard'],'note':'ParentLinkedTable\x20walk\x20yields\x20node\x20rows;\x20transitions\x20and\x20forward\x20guards\x20derive\x20from\x20the\x20same\x20rows'},'evidence':'machine.move\x20L301'},{'field':'consensus_repositories','disposition':{'kind':'edge','schema':'machine.consensus_repository'},'evidence':'machine.move\x20L302'},{'field':'bPaused','disposition':{'kind':'attribute','note':'Workflow\x20pause\x20flag'},'evidence':'machine.move\x20L298-307'},{'field':'bPublished','disposition':{'kind':'attribute','note':'Publish\x20flag;\x20freezes\x20the\x20node\x20table'},'evidence':'machine.move\x20L298-307'},{'field':'um','disposition':{'kind':'edge','schema':'machine.um'},'evidence':'machine.move\x20L305'},{'field':'permission','disposition':{'kind':'edge','schema':'machine.permission'},'evidence':'machine.move\x20L306'}]},ALLOCATION={'object':'Allocation','moveStruct':'allocation.move\x20L196-202\x20Allocation<T>','fields':[SYS('allocation.move\x20L196-202'),{'field':'balance','disposition':{'kind':'attribute','note':'Remaining\x20pool\x20balance\x20(solvency\x20signal)'},'evidence':'allocation.move\x20L196-202'},{'field':'allocators','disposition':{'kind':'edge','schema':'allocation.guard','note':'Allocator\x20segments;\x20guard\x20members\x20are\x20the\x20edge,\x20sharing\x20amounts\x20ride\x20the\x20payload'},'evidence':'allocation.move\x20L199,L194-200'},{'field':'payment_info','disposition':{'kind':'edge','schema':'allocation.for_object','coSchemas':['allocation.for_guard'],'note':'PaymentInfo\x20captured\x20at\x20pool\x20create;\x20remark/index\x20are\x20attributes'},'evidence':'allocation.move\x20L200;\x20payment.move\x20L66-71'},{'field':'payment','disposition':{'kind':'edge','schema':'allocation.payment'},'evidence':'allocation.move\x20L201,L307-316'}]},ARBITRATION={'object':'Arbitration','moveStruct':'arbitration.move\x20L47-58\x20Arbitration<T>','fields':[SYS('arbitration.move\x20L47-58'),{'field':'description','disposition':{'kind':'attribute','note':'Arbitration\x20service\x20self-description'},'evidence':'arbitration.move\x20L47-58'},{'field':'location','disposition':{'kind':'attribute','note':'Jurisdiction\x20/\x20service\x20area'},'evidence':'arbitration.move\x20L47-58'},{'field':'voting_guard','disposition':{'kind':'edge','schema':'arbitration.voting_guard','note':'Empty\x20vector\x20=\x20open\x20voting;\x20members\x20carry\x20vote\x20weight'},'evidence':'arbitration.move\x20L51'},{'field':'usage_guard','disposition':{'kind':'edge','schema':'arbitration.usage_guard'},'evidence':'arbitration.move\x20L52'},{'field':'fee','disposition':{'kind':'attribute','note':'Case\x20filing\x20fee'},'evidence':'arbitration.move\x20L53'},{'field':'balance','disposition':{'kind':'attribute','note':'Service\x20balance\x20(solvency\x20signal)'},'evidence':'arbitration.move\x20L54'},{'field':'bPaused','disposition':{'kind':'attribute','note':'Service\x20pause\x20flag'},'evidence':'arbitration.move\x20L55'},{'field':'um','disposition':{'kind':'edge','schema':'arbitration.um'},'evidence':'arbitration.move\x20L56'},{'field':'permission','disposition':{'kind':'edge','schema':'arbitration.permission'},'evidence':'arbitration.move\x20L57'}]},ARB={'object':'Arb','moveStruct':'arb.move\x20L95-110\x20Arb<T>','fields':[SYS('arb.move\x20L95-110'),{'field':'description','disposition':{'kind':'attribute','note':'Case\x20description'},'evidence':'arb.move\x20L95-110'},{'field':'order','disposition':{'kind':'edge','schema':'arb.order'},'evidence':'arb.move\x20L98'},{'field':'arbitration','disposition':{'kind':'edge','schema':'arb.arbitration_service'},'evidence':'arb.move\x20L99'},{'field':'voted','disposition':{'kind':'edge','schema':'arb.voter','note':'Voter\x20members\x20are\x20the\x20edge;\x20weights/agrees\x20ride\x20the\x20payload'},'evidence':'arb.move\x20L100\x20(<=520)'},{'field':'proposition','disposition':{'kind':'attribute','note':'Propositions\x20and\x20votes\x20(state-machine\x20input)'},'evidence':'arb.move\x20L101'},{'field':'fee','disposition':{'kind':'attribute','note':'Escrowed\x20case\x20fee'},'evidence':'arb.move\x20L102'},{'field':'feedback','disposition':{'kind':'attribute','note':'Ruling\x20feedback\x20text'},'evidence':'arb.move\x20L103'},{'field':'indemnity','disposition':{'kind':'attribute','note':'Ruled\x20indemnity\x20(compensation\x20outcome)'},'evidence':'arb.move\x20L104'},{'field':'voting_deadline','disposition':{'kind':'attribute','note':'Voting\x20deadline\x20(timestamp-ms)'},'evidence':'arb.move\x20L105'},{'field':'objection','disposition':{'kind':'attribute','note':'Objection\x20record'},'evidence':'arb.move\x20L106'},{'field':'status','disposition':{'kind':'attribute','note':'Case\x20state-machine\x20stage\x20(analyzer\x20input)'},'evidence':'arb.move\x20L107'},{'field':'compensation_time','disposition':{'kind':'attribute','note':'When\x20compensation\x20executed\x20(timestamp-ms)'},'evidence':'arb.move\x20L108'},{'field':'time','disposition':{'kind':'attribute','note':'Case\x20creation\x20time\x20(timestamp-ms)'},'evidence':'arb.move\x20L109'}]},DEMAND={'object':'Demand','moveStruct':'demand.move\x20L67-76\x20Demand','fields':[SYS('demand.move\x20L67-76'),{'field':'description','disposition':{'kind':'attribute','note':'What\x20the\x20demanding\x20side\x20asks\x20for'},'evidence':'demand.move\x20L67-76'},{'field':'location','disposition':{'kind':'attribute','note':'Demand\x20area'},'evidence':'demand.move\x20L67-76'},{'field':'rewards','disposition':{'kind':'edge','schema':'demand.reward'},'evidence':'demand.move\x20L71'},{'field':'guards','disposition':{'kind':'edge','schema':'demand.guard','note':'Empty\x20=\x20bare\x20present\x20(no\x20acceptance\x20gate)'},'evidence':'demand.move\x20L72'},{'field':'presenters','disposition':{'kind':'edge','schema':'demand.presenter','coSchemas':['demand.presenter_service'],'note':'One\x20ParentTable\x20read\x20backs\x20both\x20the\x20presenter\x20edge\x20and\x20the\x20same-row\x20sub-service\x20co-edge'},'evidence':'demand.move\x20L73,L46-54'},{'field':'um','disposition':{'kind':'edge','schema':'demand.um'},'evidence':'demand.move\x20L74'},{'field':'permission','disposition':{'kind':'edge','schema':'demand.permission'},'evidence':'demand.move\x20L75'}]},REWARD={'object':'Reward','moveStruct':'reward.move\x20L129-138\x20Reward<T>','fields':[SYS('reward.move\x20L129-138'),{'field':'description','disposition':{'kind':'attribute','note':'Pool\x20purpose\x20description'},'evidence':'reward.move\x20L129-138'},{'field':'guards','disposition':{'kind':'edge','schema':'reward.guard','note':'Members\x20carry\x20recipient/amount/expiration\x20semantics\x20in\x20the\x20payload'},'evidence':'reward.move\x20L132'},{'field':'balance','disposition':{'kind':'attribute','note':'Remaining\x20pool\x20balance\x20(solvency\x20signal)'},'evidence':'reward.move\x20L133'},{'field':'guard_not_added_expiration_time','disposition':{'kind':'attribute','note':'Claim-window\x20expiry\x20when\x20guards\x20were\x20never\x20added'},'evidence':'reward.move\x20L134'},{'field':'record','disposition':{'kind':'edge','schema':'reward.claim'},'evidence':'reward.move\x20L135,L117-138'},{'field':'um','disposition':{'kind':'edge','schema':'reward.um'},'evidence':'reward.move\x20L136'},{'field':'permission','disposition':{'kind':'edge','schema':'reward.permission'},'evidence':'reward.move\x20L137'}]},REPOSITORY={'object':'Repository','moveStruct':'repository.move\x20L461-469\x20Repository','fields':[SYS('repository.move\x20L461-469'),{'field':'description','disposition':{'kind':'attribute','note':'Repository\x20description'},'evidence':'repository.move\x20L461-469'},{'field':'policies','disposition':{'kind':'edge','schema':'repository.policy_guard','coSchemas':['repository.quote_guard'],'note':'PolicyRule\x20vector;\x20write_guard[].guard\x20members\x20and\x20quote_guard\x20are\x20two\x20deep\x20edges;\x20policy\x20name\x20is\x20an\x20attribute'},'evidence':'repository.move\x20L464,L106-113'},{'field':'data','disposition':{'kind':'edge','schema':'repository.data_about','note':'DataKey.id\x20carries\x20the\x20about-object;\x20row\x20key\x20name\x20rides\x20the\x20payload'},'evidence':'repository.move\x20L465,L456-459'},{'field':'rewards','disposition':{'kind':'edge','schema':'repository.reward'},'evidence':'repository.move\x20L466'},{'field':'um','disposition':{'kind':'edge','schema':'repository.um'},'evidence':'repository.move\x20L467'},{'field':'permission','disposition':{'kind':'edge','schema':'repository.permission'},'evidence':'repository.move\x20L468'}]},CONTACT={'object':'Contact','moveStruct':'contact.move\x20L25-31\x20Contact','fields':[SYS('contact.move\x20L25-31'),{'field':'description','disposition':{'kind':'attribute','note':'Roster\x20description'},'evidence':'contact.move\x20L25-31'},{'field':'location','disposition':{'kind':'attribute','note':'Roster\x20area'},'evidence':'contact.move\x20L25-31'},{'field':'ims','disposition':{'kind':'edge','schema':'contact.im','note':'Im.at\x20members\x20are\x20the\x20edge;\x20status/join_time/description\x20ride\x20the\x20payload'},'evidence':'contact.move\x20L29,L18-23,L85-105','oq':'OQ-1\x20(at\x20verified\x20EOA)'},{'field':'permission','disposition':{'kind':'edge','schema':'contact.permission'},'evidence':'contact.move\x20L30'}]},PERMISSION={'object':'Permission','moveStruct':'permission.move\x20L33-41\x20Permission','fields':[SYS('permission.move\x20L33-41'),{'field':'owner','disposition':{'kind':'edge','schema':'permission.owner'},'evidence':'permission.move\x20L35,L537-543'},{'field':'admin','disposition':{'kind':'edge','schema':'permission.admin'},'evidence':'permission.move\x20L36'},{'field':'description','disposition':{'kind':'attribute','note':'Group\x20description'},'evidence':'permission.move\x20L37'},{'field':'remark','disposition':{'kind':'attribute','note':'Permission\x20remark\x20records'},'evidence':'permission.move\x20L38'},{'field':'table','disposition':{'kind':'edge','schema':'permission.entity','note':'ParentLinkedTable\x20of\x20EOA/Guard\x20members\x20with\x20perm-index\x20bits'},'evidence':'permission.move\x20L39'},{'field':'um','disposition':{'kind':'edge','schema':'permission.um'},'evidence':'permission.move\x20L40'}]},GUARD={'object':'Guard','moveStruct':'guard.move\x20L84-94\x20Guard','fields':[SYS('guard.move\x20L84-94'),{'field':'description','disposition':{'kind':'attribute','note':'Gate\x20description'},'evidence':'guard.move\x20L84-94'},{'field':'table','disposition':{'kind':'attribute','note':'Submission\x20slot\x20definitions\x20(identifier\x20->\x20type\x20mapping;\x20Gate\x20analysis\x20property)'},'evidence':'guard.move\x20L87'},{'field':'validated','disposition':{'kind':'attribute','note':'Validated\x20slot\x20types\x20(Gate\x20analysis\x20property)'},'evidence':'guard.move\x20L88'},{'field':'input','disposition':{'kind':'attribute','note':'Static\x20input\x20bytes\x20for\x20the\x20gate\x20predicate'},'evidence':'guard.move\x20L89'},{'field':'relies','disposition':{'kind':'edge','schema':'guard.relies'},'evidence':'guard.move\x20L90\x20(<=4,\x20one\x20level)'},{'field':'relies_logic_and','disposition':{'kind':'attribute','note':'AND/OR\x20combination\x20of\x20relied\x20gates'},'evidence':'guard.move\x20L91'},{'field':'immutable','disposition':{'kind':'attribute','note':'Whether\x20the\x20gate\x20definition\x20is\x20frozen'},'evidence':'guard.move\x20L92'},{'field':'rep','disposition':{'kind':'attribute','note':'Last\x20query-validation\x20outcome\x20flag'},'evidence':'guard.move\x20L93'}]},PASSPORT={'object':'Passport','moveStruct':'passport.move\x20L41-50\x20Passport','fields':[SYS('passport.move\x20L41-50'),{'field':'guard','disposition':{'kind':'edge','schema':'passport.guard','coSchemas':['passport.ticket_relies'],'note':'GuardInfo\x20tickets;\x20ticket.guard\x20is\x20the\x20primary\x20edge,\x20ticket.relies\x20the\x20same-ticket\x20co-edge;\x20result/impack\x20flags\x20are\x20attributes'},'evidence':'passport.move\x20L43,L32-39'},{'field':'result','disposition':{'kind':'attribute','note':'Overall\x20verification\x20outcome'},'evidence':'passport.move\x20L44'},{'field':'tx_hash','disposition':{'kind':'attribute','note':'Verification\x20transaction\x20digest'},'evidence':'passport.move\x20L45'},{'field':'impack','disposition':{'kind':'edge','schema':'passport.impack'},'evidence':'passport.move\x20L46,L227-242'},{'field':'time','disposition':{'kind':'attribute','note':'Verification\x20time\x20(timestamp-ms)'},'evidence':'passport.move\x20L47'},{'field':'signer','disposition':{'kind':'edge','schema':'passport.signer'},'evidence':'passport.move\x20L48,L94-98'},{'field':'has_verified','disposition':{'kind':'attribute','note':'Whether\x20the\x20credential\x20was\x20consumed'},'evidence':'passport.move\x20L49'}]},PROOF={'object':'Proof','moveStruct':'proof.move\x20L13-24\x20Proof','fields':[SYS('proof.move\x20L13-24'),{'field':'description','disposition':{'kind':'attribute','note':'Evidence\x20description'},'evidence':'proof.move\x20L13-24'},{'field':'proof','disposition':{'kind':'attribute','note':'Evidence\x20payload\x20string'},'evidence':'proof.move\x20L13-24'},{'field':'item_count','disposition':{'kind':'attribute','note':'Item\x20count\x20covered\x20by\x20the\x20evidence'},'evidence':'proof.move\x20L13-24'},{'field':'server_pubkey','disposition':{'kind':'attribute','note':'Witness\x20server\x20public\x20key'},'evidence':'proof.move\x20L13-24'},{'field':'server_signature','disposition':{'kind':'attribute','note':'Witness\x20server\x20signature'},'evidence':'proof.move\x20L13-24'},{'field':'about','disposition':{'kind':'edge','schema':'proof.about'},'evidence':'proof.move\x20L20'},{'field':'signer','disposition':{'kind':'edge','schema':'proof.signer'},'evidence':'proof.move\x20L21'},{'field':'proof_type','disposition':{'kind':'attribute','note':'Evidence\x20kind\x20discriminator'},'evidence':'proof.move\x20L22'},{'field':'time','disposition':{'kind':'attribute','note':'Signing\x20time\x20(timestamp-ms)'},'evidence':'proof.move\x20L23'}]},TREASURY={'object':'Treasury','moveStruct':'treasury.move\x20L72-83\x20Treasury<T>','fields':[SYS('treasury.move\x20L72-83'),{'field':'description','disposition':{'kind':'attribute','note':'Treasury\x20description'},'evidence':'treasury.move\x20L72-83'},{'field':'balance','disposition':{'kind':'attribute','note':'Current\x20balance\x20(solvency\x20signal)'},'evidence':'treasury.move\x20L75'},{'field':'history','disposition':{'kind':'edge','schema':'treasury.record'},'evidence':'treasury.move\x20L76,L39-46'},{'field':'external_deposit_guard','disposition':{'kind':'edge','schema':'treasury.deposit_guard'},'evidence':'treasury.move\x20L77,L61-65,L138-194'},{'field':'external_withdraw_guard','disposition':{'kind':'edge','schema':'treasury.withdraw_guard'},'evidence':'treasury.move\x20L78,L67-71,L197-250'},{'field':'inflow','disposition':{'kind':'attribute','note':'Lifetime\x20inflow\x20(throughput\x20signal)'},'evidence':'treasury.move\x20L79'},{'field':'outflow','disposition':{'kind':'attribute','note':'Lifetime\x20outflow\x20(throughput\x20signal)'},'evidence':'treasury.move\x20L80'},{'field':'um','disposition':{'kind':'edge','schema':'treasury.um'},'evidence':'treasury.move\x20L81'},{'field':'permission','disposition':{'kind':'edge','schema':'treasury.permission'},'evidence':'treasury.move\x20L82'}]},PAYMENT={'object':'Payment','moveStruct':'payment.move\x20L93-101\x20Payment<T>','fields':[SYS('payment.move\x20L93-101'),{'field':'amount','disposition':{'kind':'attribute','note':'Total\x20payment\x20amount'},'evidence':'payment.move\x20L93-101'},{'field':'time','disposition':{'kind':'attribute','note':'Payment\x20time\x20(timestamp-ms)'},'evidence':'payment.move\x20L93-101'},{'field':'info','disposition':{'kind':'edge','schema':'payment.for_object','coSchemas':['payment.for_guard'],'note':'PaymentInfo\x20struct;\x20for_object/for_guard\x20are\x20the\x20two\x20routing\x20edges;\x20remark/index\x20are\x20attributes'},'evidence':'payment.move\x20L97,L66-71'},{'field':'from_object','disposition':{'kind':'edge','schema':'payment.from_object'},'evidence':'payment.move\x20L98,L149-161'},{'field':'signer','disposition':{'kind':'edge','schema':'payment.signer'},'evidence':'payment.move\x20L99,L111'},{'field':'record','disposition':{'kind':'edge','schema':'payment.recipient','note':'Revenue\x20entries;\x20recipient\x20members\x20are\x20the\x20edge,\x20amounts\x20ride\x20the\x20payload'},'evidence':'payment.move\x20L100,L93-101\x20(<=200)'}]},COIN_WRAPPER={'object':'CoinWrapper','moveStruct':'payment.move\x20L40-44\x20CoinWrapper<T>','fields':[SYS('payment.move\x20L40-44'),{'field':'balance','disposition':{'kind':'transient','note':'Escrowed\x20coin\x20inside\x20the\x20in-flight\x20wrapper;\x20consumed\x20by\x20unwrap'},'evidence':'payment.move\x20L42'},{'field':'payment','disposition':{'kind':'transient','note':'Back-reference\x20to\x20the\x20Payment\x20under\x20construction;\x20process\x20object,\x20deliberately\x20not\x20a\x20graph\x20edge'},'evidence':'payment.move\x20L43,L46-53'}]},RESOURCE={'object':'Resource','moveStruct':'resource.move\x20L18-21\x20Resource','fields':[SYS('resource.move\x20L18-21'),{'field':'table','disposition':{'kind':'nonAddress','note':'AddressTag\x20rows\x20(user\x20tags/nick);\x20projected\x20as\x20node\x20attributes\x20for\x20display,\x20deliberately\x20no\x20structural\x20edge'},'evidence':'resource.move\x20L20'}]},ENTITY_ORDERS={'object':'EntityOrders','moveStruct':'entity_order.move\x20L31-34\x20EntityOrders','fields':[SYS('entity_order.move\x20L31-34'),{'field':'table','disposition':{'kind':'edge','schema':'eoa.order','note':'Per-entity\x20FIFO\x205200\x20order-membership\x20rows\x20(role\x20bits\x20in\x20payload)'},'evidence':'entity_order.move\x20L33,L12'}]},ENTITY_PERMISSION={'object':'EntityPermission','moveStruct':'entity_permission.move\x20L32-35\x20EntityPermission','fields':[SYS('entity_permission.move\x20L32-35'),{'field':'table','disposition':{'kind':'edge','schema':'eoa.permission'},'evidence':'entity_permission.move\x20L34,L32\x20(role\x20bits)'}]},ENTITY_CONTACT={'object':'EntityContact','moveStruct':'entity_contact.move\x20L24-27\x20EntityContact','fields':[SYS('entity_contact.move\x20L24-27'),{'field':'table','disposition':{'kind':'edge','schema':'eoa.contact'},'evidence':'entity_contact.move\x20L26'}]},ENTITY={'object':'Entity','moveStruct':'registrar.move\x20L176-179\x20Entity\x20(0xaab)','fields':[SYS('registrar.move\x20L176-179'),{'field':'table','disposition':{'kind':'edge','schema':'entity.profile','coSchemas':['entity.referrer','entity.resource'],'note':'One\x20AddressInfo\x20row\x20per\x20account\x20backs\x20three\x20co-edges;\x20description/records\x20are\x20attributes'},'evidence':'registrar.move\x20L178,L146-152,L236-242'}]},REGISTRAR={'object':'Registrar','moveStruct':'registrar.move\x20L171-174\x20Registrar\x20(0xaaa)','fields':[SYS('registrar.move\x20L171-174'),{'field':'table','disposition':{'kind':'edge','schema':'target.vote','note':'Per-target\x20ring\x205200\x20of\x20like/dislike/favor\x20votes'},'evidence':'registrar.move\x20L173,L154-171'}]},OBJECT_LINKER_CORE={'object':'ObjectLinkerCore','moveStruct':'object_linker.move\x20L37-40\x20ObjectLinkerCore','fields':[SYS('object_linker.move\x20L37-40'),{'field':'table','disposition':{'kind':'edge','schema':'permission.core_binding','note':'Exact\x20(non-evicting)\x20linker\x20registry'},'evidence':'object_linker.move\x20L39,L88'}]},OBJECT_LINKER_TX={'object':'ObjectLinkerTx','moveStruct':'object_linker.move\x20L43-46\x20ObjectLinkerTx','fields':[SYS('object_linker.move\x20L43-46'),{'field':'table','disposition':{'kind':'edge','schema':'permission.tx_binding','coSchemas':['service.order'],'note':'FIFO\x205200\x20runtime\x20buffer;\x20service.order\x20is\x20the\x20Order-filtered\x20view\x20of\x20the\x20same\x20rows'},'evidence':'object_linker.move\x20L45,L136-140'}]},EVENT_STREAMS={'object':'EventStreams','moveStruct':'append-only\x20event\x20streams\x20(channel\x20D;\x20no\x20struct\x20fields)','fields':[{'field':PackageAddress+'::order::NewOrderEvent','disposition':{'kind':'edge','schema':'service.order_history','coSchemas':['eoa.order_history']},'evidence':'order.move\x20L51-58,L142','oq':'OQ-2/OQ-4'},{'field':PackageAddress+'::arb::ArbEvent','disposition':{'kind':'edge','schema':'arb.history'},'evidence':'arb.move\x20L33-43,L122,L227','oq':'OQ-4'}]};export const FIELD_MANIFEST=[SERVICE,ORDER,DISCOUNT,PROGRESS,MACHINE,ALLOCATION,ARBITRATION,ARB,DEMAND,REWARD,REPOSITORY,CONTACT,PERMISSION,GUARD,PASSPORT,PROOF,TREASURY,PAYMENT,COIN_WRAPPER,RESOURCE,ENTITY_ORDERS,ENTITY_PERMISSION,ENTITY_CONTACT,ENTITY,REGISTRAR,OBJECT_LINKER_CORE,OBJECT_LINKER_TX,EVENT_STREAMS];export const MANIFEST_BY_OBJECT=new Map(FIELD_MANIFEST['map'](a=>[a['object'],a]));export const BUSINESS_OBJECTS=['Service','Order','Discount','Progress','Machine','Allocation','Arbitration','Arb','Demand','Reward','Repository','Contact','Permission','Guard','Passport','Proof','Treasury','Payment'];
1
+ import{PackageAddress}from'@wowok/wowok';const SYS=a=>({'field':'id','disposition':{'kind':'nonAddress','note':'Object\x20identity\x20(UID);\x20system-managed,\x20never\x20a\x20business\x20reference'},'evidence':a}),SERVICE={'object':'Service','moveStruct':'service.move\x20L174-193\x20Service<T>','fields':[SYS('service.move\x20L174-193'),{'field':'description','disposition':{'kind':'attribute','note':'Shop\x20self-description;\x20node\x20property'},'evidence':'service.move\x20L174-193'},{'field':'location','disposition':{'kind':'attribute','note':'Service\x20area\x20/\x20market-opportunity\x20routing\x20key'},'evidence':'service.move\x20L174-193'},{'field':'sales','disposition':{'kind':'attribute','note':'Catalog\x20items\x20for\x20sale\x20(what\x20the\x20shop\x20sells)'},'evidence':'service.move\x20L174-193'},{'field':'repositories','disposition':{'kind':'edge','schema':'service.repository'},'evidence':'service.move\x20L174-193\x20(<=100)'},{'field':'buy_guard','disposition':{'kind':'edge','schema':'service.buy_guard'},'evidence':'service.move\x20L174-193'},{'field':'machine','disposition':{'kind':'edge','schema':'service.machine'},'evidence':'service.move\x20L174-193'},{'field':'bPublished','disposition':{'kind':'attribute','note':'Publish\x20flag;\x20freezes\x20machine/guard\x20settings;\x20analyzer\x20input'},'evidence':'service.move\x20L174-193'},{'field':'bPaused','disposition':{'kind':'attribute','note':'Pause\x20flag;\x20purchasability;\x20analyzer\x20input'},'evidence':'service.move\x20L174-193'},{'field':'customer_required','disposition':{'kind':'attribute','note':'Custom\x20info\x20fields\x20the\x20shop\x20requires\x20from\x20buyers'},'evidence':'service.move\x20L174-193'},{'field':'arbitrations','disposition':{'kind':'edge','schema':'service.arbitration'},'evidence':'service.move\x20L174-193\x20(<=20)'},{'field':'compensation_fund','disposition':{'kind':'attribute','note':'Escrowed\x20compensation\x20balance\x20(arbitration\x20solvency\x20signal)'},'evidence':'service.move\x20L174-193'},{'field':'paused_time','disposition':{'kind':'attribute','note':'When\x20the\x20shop\x20was\x20paused\x20(timestamp-ms)'},'evidence':'service.move\x20L174-193'},{'field':'setting_lock_duration','disposition':{'kind':'attribute','note':'Lock\x20duration\x20gating\x20post-pause\x20setting\x20changes'},'evidence':'service.move\x20L174-193'},{'field':'order_allocators','disposition':{'kind':'edge','schema':'service.order_allocator_guard','note':'Allocators\x20container;\x20guard\x20members\x20are\x20the\x20edge,\x20sharing\x20amounts\x20ride\x20the\x20payload'},'evidence':'service.move\x20L174-193;\x20allocation.move\x20L194-200'},{'field':'rewards','disposition':{'kind':'edge','schema':'service.reward'},'evidence':'service.move\x20L174-193\x20(<=20)'},{'field':'um','disposition':{'kind':'edge','schema':'service.um'},'evidence':'service.move\x20L174-193'},{'field':'permission','disposition':{'kind':'edge','schema':'service.permission'},'evidence':'service.move\x20L174-193'}]},ORDER={'object':'Order','moveStruct':'order.move\x20L59-74\x20Order','fields':[SYS('order.move\x20L59-74'),{'field':'items','disposition':{'kind':'attribute','note':'Purchased\x20line\x20items\x20(what\x20was\x20bought)'},'evidence':'order.move\x20L59-74'},{'field':'discount','disposition':{'kind':'edge','schema':'order.discount'},'evidence':'order.move\x20L59-74'},{'field':'progress','disposition':{'kind':'edge','schema':'order.progress'},'evidence':'order.move\x20L59-74,L130'},{'field':'machine','disposition':{'kind':'edge','schema':'order.machine'},'evidence':'order.move\x20L59-74,L130'},{'field':'amount','disposition':{'kind':'attribute','note':'Total\x20paid\x20(order\x20value\x20signal)'},'evidence':'order.move\x20L59-74'},{'field':'owner','disposition':{'kind':'edge','schema':'order.builder','note':'SDK\x20normalizes\x20owner\x20to\x20builder'},'evidence':'order.move\x20L59-74\x20(owner)'},{'field':'service','disposition':{'kind':'edge','schema':'order.service'},'evidence':'order.move\x20L59-74'},{'field':'dispute','disposition':{'kind':'edge','schema':'order.dispute'},'evidence':'order.move\x20L59-74'},{'field':'agent','disposition':{'kind':'edge','schema':'order.agent'},'evidence':'order.move\x20L59-74,L179\x20(<=10)'},{'field':'allocation','disposition':{'kind':'edge','schema':'order.allocation'},'evidence':'order.move\x20L59-74,L130'},{'field':'claimed_by','disposition':{'kind':'edge','schema':'order.claimed_by'},'evidence':'order.move\x20L59-74,L86-96'},{'field':'required_info','disposition':{'kind':'edge','schema':'order.required_info'},'evidence':'order.move\x20L73,L77-80','oq':'merchant\x20IM\x20address\x20(Service\x27s\x20Contact)\x20or\x20WTS\x20proof\x20(b11/b12)'},{'field':'time','disposition':{'kind':'attribute','note':'Creation\x20time\x20(timestamp-ms)'},'evidence':'order.move\x20L59-74'}]},DISCOUNT={'object':'Discount','moveStruct':'service.move\x20L109-119\x20Discount','fields':[SYS('service.move\x20L109-119'),{'field':'name','disposition':{'kind':'attribute','note':'Discount\x20campaign\x20name'},'evidence':'service.move\x20L109-119'},{'field':'discount_type','disposition':{'kind':'attribute','note':'RATIO\x20(off%)\x20or\x20MINUS\x20(-N)\x20pricing\x20mode'},'evidence':'service.move\x20L109-119'},{'field':'benchmark','disposition':{'kind':'attribute','note':'Minimum-spend\x20condition\x20for\x20the\x20discount'},'evidence':'service.move\x20L109-119'},{'field':'off','disposition':{'kind':'attribute','note':'Discount\x20magnitude\x20(rate\x20or\x20fixed\x20amount)'},'evidence':'service.move\x20L109-119'},{'field':'time_start','disposition':{'kind':'attribute','note':'Validity\x20window\x20start\x20(timestamp-ms)'},'evidence':'service.move\x20L109-119'},{'field':'time_end','disposition':{'kind':'attribute','note':'Validity\x20window\x20end\x20/\x20expiry'},'evidence':'service.move\x20L109-119'},{'field':'service','disposition':{'kind':'edge','schema':'discount.service'},'evidence':'service.move\x20L117','oq':'OQ-3\x20(Discount\x20joins\x20COVERED\x20types)'},{'field':'transferable','disposition':{'kind':'attribute','note':'Whether\x20the\x20discount\x20may\x20be\x20handed\x20to\x20a\x20receiver'},'evidence':'service.move\x20L109-119'}]},PROGRESS={'object':'Progress','moveStruct':'progress.move\x20L75-85\x20Progress','fields':[SYS('progress.move\x20L75-85'),{'field':'machine','disposition':{'kind':'edge','schema':'progress.machine'},'evidence':'progress.move\x20L75-85'},{'field':'context_repositories','disposition':{'kind':'edge','schema':'progress.context_repository'},'evidence':'progress.move\x20L78,L199-208'},{'field':'current','disposition':{'kind':'attribute','note':'Current\x20node\x20name\x20(completion\x20determination\x20input)'},'evidence':'progress.move\x20L75-85'},{'field':'task','disposition':{'kind':'edge','schema':'progress.task'},'evidence':'progress.move\x20L80'},{'field':'namedOperator','disposition':{'kind':'edge','schema':'progress.named_operator','note':'Container\x20struct;\x20operators[]\x20members\x20are\x20the\x20edge'},'evidence':'progress.move\x20L81\x20(<=80)'},{'field':'session','disposition':{'kind':'attribute','note':'Per-node\x20session\x20records\x20(runtime\x20state)'},'evidence':'progress.move\x20L82'},{'field':'history','disposition':{'kind':'attribute','note':'Node-history\x20ParentTableVec\x20(runtime\x20audit\x20trail,\x20not\x20enumerated\x20as\x20edges)'},'evidence':'progress.move\x20L83'},{'field':'current_time','disposition':{'kind':'attribute','note':'Last\x20activity\x20clock\x20(staleness\x20signal)'},'evidence':'progress.move\x20L84'}]},MACHINE={'object':'Machine','moveStruct':'machine.move\x20L298-307\x20Machine','fields':[SYS('machine.move\x20L298-307'),{'field':'description','disposition':{'kind':'attribute','note':'Workflow\x20description'},'evidence':'machine.move\x20L298-307'},{'field':'nodes','disposition':{'kind':'edge','schema':'machine.node','coSchemas':['wf.transition','wf.forward_guard'],'note':'ParentLinkedTable\x20walk\x20yields\x20node\x20rows;\x20transitions\x20and\x20forward\x20guards\x20derive\x20from\x20the\x20same\x20rows'},'evidence':'machine.move\x20L301'},{'field':'consensus_repositories','disposition':{'kind':'edge','schema':'machine.consensus_repository'},'evidence':'machine.move\x20L302'},{'field':'bPaused','disposition':{'kind':'attribute','note':'Workflow\x20pause\x20flag'},'evidence':'machine.move\x20L298-307'},{'field':'bPublished','disposition':{'kind':'attribute','note':'Publish\x20flag;\x20freezes\x20the\x20node\x20table'},'evidence':'machine.move\x20L298-307'},{'field':'um','disposition':{'kind':'edge','schema':'machine.um'},'evidence':'machine.move\x20L305'},{'field':'permission','disposition':{'kind':'edge','schema':'machine.permission'},'evidence':'machine.move\x20L306'}]},ALLOCATION={'object':'Allocation','moveStruct':'allocation.move\x20L196-202\x20Allocation<T>','fields':[SYS('allocation.move\x20L196-202'),{'field':'balance','disposition':{'kind':'attribute','note':'Remaining\x20pool\x20balance\x20(solvency\x20signal)'},'evidence':'allocation.move\x20L196-202'},{'field':'allocators','disposition':{'kind':'edge','schema':'allocation.guard','note':'Allocator\x20segments;\x20guard\x20members\x20are\x20the\x20edge,\x20sharing\x20amounts\x20ride\x20the\x20payload'},'evidence':'allocation.move\x20L199,L194-200'},{'field':'payment_info','disposition':{'kind':'edge','schema':'allocation.for_object','coSchemas':['allocation.for_guard'],'note':'PaymentInfo\x20captured\x20at\x20pool\x20create;\x20remark/index\x20are\x20attributes'},'evidence':'allocation.move\x20L200;\x20payment.move\x20L66-71'},{'field':'payment','disposition':{'kind':'edge','schema':'allocation.payment'},'evidence':'allocation.move\x20L201,L307-316'}]},ARBITRATION={'object':'Arbitration','moveStruct':'arbitration.move\x20L47-58\x20Arbitration<T>','fields':[SYS('arbitration.move\x20L47-58'),{'field':'description','disposition':{'kind':'attribute','note':'Arbitration\x20service\x20self-description'},'evidence':'arbitration.move\x20L47-58'},{'field':'location','disposition':{'kind':'attribute','note':'Jurisdiction\x20/\x20service\x20area'},'evidence':'arbitration.move\x20L47-58'},{'field':'voting_guard','disposition':{'kind':'edge','schema':'arbitration.voting_guard','note':'Empty\x20vector\x20=\x20open\x20voting;\x20members\x20carry\x20vote\x20weight'},'evidence':'arbitration.move\x20L51'},{'field':'usage_guard','disposition':{'kind':'edge','schema':'arbitration.usage_guard'},'evidence':'arbitration.move\x20L52'},{'field':'fee','disposition':{'kind':'attribute','note':'Case\x20filing\x20fee'},'evidence':'arbitration.move\x20L53'},{'field':'balance','disposition':{'kind':'attribute','note':'Service\x20balance\x20(solvency\x20signal)'},'evidence':'arbitration.move\x20L54'},{'field':'bPaused','disposition':{'kind':'attribute','note':'Service\x20pause\x20flag'},'evidence':'arbitration.move\x20L55'},{'field':'um','disposition':{'kind':'edge','schema':'arbitration.um'},'evidence':'arbitration.move\x20L56'},{'field':'permission','disposition':{'kind':'edge','schema':'arbitration.permission'},'evidence':'arbitration.move\x20L57'}]},ARB={'object':'Arb','moveStruct':'arb.move\x20L95-110\x20Arb<T>','fields':[SYS('arb.move\x20L95-110'),{'field':'description','disposition':{'kind':'attribute','note':'Case\x20description'},'evidence':'arb.move\x20L95-110'},{'field':'order','disposition':{'kind':'edge','schema':'arb.order'},'evidence':'arb.move\x20L98'},{'field':'arbitration','disposition':{'kind':'edge','schema':'arb.arbitration_service'},'evidence':'arb.move\x20L99'},{'field':'voted','disposition':{'kind':'edge','schema':'arb.voter','note':'Voter\x20members\x20are\x20the\x20edge;\x20weights/agrees\x20ride\x20the\x20payload'},'evidence':'arb.move\x20L100\x20(<=520)'},{'field':'proposition','disposition':{'kind':'attribute','note':'Propositions\x20and\x20votes\x20(state-machine\x20input)'},'evidence':'arb.move\x20L101'},{'field':'fee','disposition':{'kind':'attribute','note':'Escrowed\x20case\x20fee'},'evidence':'arb.move\x20L102'},{'field':'feedback','disposition':{'kind':'attribute','note':'Ruling\x20feedback\x20text'},'evidence':'arb.move\x20L103'},{'field':'indemnity','disposition':{'kind':'attribute','note':'Ruled\x20indemnity\x20(compensation\x20outcome)'},'evidence':'arb.move\x20L104'},{'field':'voting_deadline','disposition':{'kind':'attribute','note':'Voting\x20deadline\x20(timestamp-ms)'},'evidence':'arb.move\x20L105'},{'field':'objection','disposition':{'kind':'attribute','note':'Objection\x20record'},'evidence':'arb.move\x20L106'},{'field':'status','disposition':{'kind':'attribute','note':'Case\x20state-machine\x20stage\x20(analyzer\x20input)'},'evidence':'arb.move\x20L107'},{'field':'compensation_time','disposition':{'kind':'attribute','note':'When\x20compensation\x20executed\x20(timestamp-ms)'},'evidence':'arb.move\x20L108'},{'field':'time','disposition':{'kind':'attribute','note':'Case\x20creation\x20time\x20(timestamp-ms)'},'evidence':'arb.move\x20L109'}]},DEMAND={'object':'Demand','moveStruct':'demand.move\x20L67-76\x20Demand','fields':[SYS('demand.move\x20L67-76'),{'field':'description','disposition':{'kind':'attribute','note':'What\x20the\x20demanding\x20side\x20asks\x20for'},'evidence':'demand.move\x20L67-76'},{'field':'location','disposition':{'kind':'attribute','note':'Demand\x20area'},'evidence':'demand.move\x20L67-76'},{'field':'rewards','disposition':{'kind':'edge','schema':'demand.reward'},'evidence':'demand.move\x20L71'},{'field':'guards','disposition':{'kind':'edge','schema':'demand.guard','note':'Empty\x20=\x20bare\x20present\x20(no\x20acceptance\x20gate)'},'evidence':'demand.move\x20L72'},{'field':'presenters','disposition':{'kind':'edge','schema':'demand.presenter','coSchemas':['demand.presenter_service'],'note':'One\x20ParentTable\x20read\x20backs\x20both\x20the\x20presenter\x20edge\x20and\x20the\x20same-row\x20sub-service\x20co-edge'},'evidence':'demand.move\x20L73,L46-54'},{'field':'um','disposition':{'kind':'edge','schema':'demand.um'},'evidence':'demand.move\x20L74'},{'field':'permission','disposition':{'kind':'edge','schema':'demand.permission'},'evidence':'demand.move\x20L75'}]},REWARD={'object':'Reward','moveStruct':'reward.move\x20L129-138\x20Reward<T>','fields':[SYS('reward.move\x20L129-138'),{'field':'description','disposition':{'kind':'attribute','note':'Pool\x20purpose\x20description'},'evidence':'reward.move\x20L129-138'},{'field':'guards','disposition':{'kind':'edge','schema':'reward.guard','note':'Members\x20carry\x20recipient/amount/expiration\x20semantics\x20in\x20the\x20payload'},'evidence':'reward.move\x20L132'},{'field':'balance','disposition':{'kind':'attribute','note':'Remaining\x20pool\x20balance\x20(solvency\x20signal)'},'evidence':'reward.move\x20L133'},{'field':'guard_not_added_expiration_time','disposition':{'kind':'attribute','note':'No-guard\x20window:\x20blocks\x20guard_add\x20AND\x20balance\x20withdraw\x20until\x20elapsed'},'evidence':'reward.move\x20L134'},{'field':'record','disposition':{'kind':'edge','schema':'reward.claim'},'evidence':'reward.move\x20L135,L117-138'},{'field':'um','disposition':{'kind':'edge','schema':'reward.um'},'evidence':'reward.move\x20L136'},{'field':'permission','disposition':{'kind':'edge','schema':'reward.permission'},'evidence':'reward.move\x20L137'}]},REPOSITORY={'object':'Repository','moveStruct':'repository.move\x20L461-469\x20Repository','fields':[SYS('repository.move\x20L461-469'),{'field':'description','disposition':{'kind':'attribute','note':'Repository\x20description'},'evidence':'repository.move\x20L461-469'},{'field':'policies','disposition':{'kind':'edge','schema':'repository.policy_guard','coSchemas':['repository.quote_guard'],'note':'PolicyRule\x20vector;\x20write_guard[].guard\x20members\x20and\x20quote_guard\x20are\x20two\x20deep\x20edges;\x20policy\x20name\x20is\x20an\x20attribute'},'evidence':'repository.move\x20L464,L106-113'},{'field':'data','disposition':{'kind':'edge','schema':'repository.data_about','note':'DataKey.id\x20carries\x20the\x20about-object;\x20row\x20key\x20name\x20rides\x20the\x20payload'},'evidence':'repository.move\x20L465,L456-459'},{'field':'rewards','disposition':{'kind':'edge','schema':'repository.reward'},'evidence':'repository.move\x20L466'},{'field':'um','disposition':{'kind':'edge','schema':'repository.um'},'evidence':'repository.move\x20L467'},{'field':'permission','disposition':{'kind':'edge','schema':'repository.permission'},'evidence':'repository.move\x20L468'}]},CONTACT={'object':'Contact','moveStruct':'contact.move\x20L25-31\x20Contact','fields':[SYS('contact.move\x20L25-31'),{'field':'description','disposition':{'kind':'attribute','note':'Roster\x20description'},'evidence':'contact.move\x20L25-31'},{'field':'location','disposition':{'kind':'attribute','note':'Roster\x20area'},'evidence':'contact.move\x20L25-31'},{'field':'ims','disposition':{'kind':'edge','schema':'contact.im','note':'Im.at\x20members\x20are\x20the\x20edge;\x20status/join_time/description\x20ride\x20the\x20payload'},'evidence':'contact.move\x20L29,L18-23,L85-105','oq':'OQ-1\x20(at\x20verified\x20EOA)'},{'field':'permission','disposition':{'kind':'edge','schema':'contact.permission'},'evidence':'contact.move\x20L30'}]},PERMISSION={'object':'Permission','moveStruct':'permission.move\x20L33-41\x20Permission','fields':[SYS('permission.move\x20L33-41'),{'field':'owner','disposition':{'kind':'edge','schema':'permission.owner'},'evidence':'permission.move\x20L35,L537-543'},{'field':'admin','disposition':{'kind':'edge','schema':'permission.admin'},'evidence':'permission.move\x20L36'},{'field':'description','disposition':{'kind':'attribute','note':'Group\x20description'},'evidence':'permission.move\x20L37'},{'field':'remark','disposition':{'kind':'attribute','note':'Permission\x20remark\x20records'},'evidence':'permission.move\x20L38'},{'field':'table','disposition':{'kind':'edge','schema':'permission.entity','note':'ParentLinkedTable\x20of\x20EOA/Guard\x20members\x20with\x20perm-index\x20bits'},'evidence':'permission.move\x20L39'},{'field':'um','disposition':{'kind':'edge','schema':'permission.um'},'evidence':'permission.move\x20L40'}]},GUARD={'object':'Guard','moveStruct':'guard.move\x20L84-94\x20Guard','fields':[SYS('guard.move\x20L84-94'),{'field':'description','disposition':{'kind':'attribute','note':'Gate\x20description'},'evidence':'guard.move\x20L84-94'},{'field':'table','disposition':{'kind':'attribute','note':'Submission\x20slot\x20definitions\x20(identifier\x20->\x20type\x20mapping;\x20Gate\x20analysis\x20property)'},'evidence':'guard.move\x20L87'},{'field':'validated','disposition':{'kind':'attribute','note':'Validated\x20slot\x20types\x20(Gate\x20analysis\x20property)'},'evidence':'guard.move\x20L88'},{'field':'input','disposition':{'kind':'attribute','note':'Static\x20input\x20bytes\x20for\x20the\x20gate\x20predicate'},'evidence':'guard.move\x20L89'},{'field':'relies','disposition':{'kind':'edge','schema':'guard.relies'},'evidence':'guard.move\x20L90\x20(<=4,\x20one\x20level)'},{'field':'relies_logic_and','disposition':{'kind':'attribute','note':'AND/OR\x20combination\x20of\x20relied\x20gates'},'evidence':'guard.move\x20L91'},{'field':'immutable','disposition':{'kind':'attribute','note':'Whether\x20the\x20gate\x20definition\x20is\x20frozen'},'evidence':'guard.move\x20L92'},{'field':'rep','disposition':{'kind':'attribute','note':'Last\x20query-validation\x20outcome\x20flag'},'evidence':'guard.move\x20L93'}]},PASSPORT={'object':'Passport','moveStruct':'passport.move\x20L41-50\x20Passport','fields':[SYS('passport.move\x20L41-50'),{'field':'guard','disposition':{'kind':'edge','schema':'passport.guard','coSchemas':['passport.ticket_relies'],'note':'GuardInfo\x20tickets;\x20ticket.guard\x20is\x20the\x20primary\x20edge,\x20ticket.relies\x20the\x20same-ticket\x20co-edge;\x20result/impack\x20flags\x20are\x20attributes'},'evidence':'passport.move\x20L43,L32-39'},{'field':'result','disposition':{'kind':'attribute','note':'Overall\x20verification\x20outcome'},'evidence':'passport.move\x20L44'},{'field':'tx_hash','disposition':{'kind':'attribute','note':'Verification\x20transaction\x20digest'},'evidence':'passport.move\x20L45'},{'field':'impack','disposition':{'kind':'edge','schema':'passport.impack'},'evidence':'passport.move\x20L46,L227-242'},{'field':'time','disposition':{'kind':'attribute','note':'Verification\x20time\x20(timestamp-ms)'},'evidence':'passport.move\x20L47'},{'field':'signer','disposition':{'kind':'edge','schema':'passport.signer'},'evidence':'passport.move\x20L48,L94-98'},{'field':'has_verified','disposition':{'kind':'attribute','note':'Whether\x20the\x20credential\x20was\x20consumed'},'evidence':'passport.move\x20L49'}]},PROOF={'object':'Proof','moveStruct':'proof.move\x20L13-24\x20Proof','fields':[SYS('proof.move\x20L13-24'),{'field':'description','disposition':{'kind':'attribute','note':'Evidence\x20description'},'evidence':'proof.move\x20L13-24'},{'field':'proof','disposition':{'kind':'attribute','note':'Evidence\x20payload\x20string'},'evidence':'proof.move\x20L13-24'},{'field':'item_count','disposition':{'kind':'attribute','note':'Item\x20count\x20covered\x20by\x20the\x20evidence'},'evidence':'proof.move\x20L13-24'},{'field':'server_pubkey','disposition':{'kind':'attribute','note':'Witness\x20server\x20public\x20key'},'evidence':'proof.move\x20L13-24'},{'field':'server_signature','disposition':{'kind':'attribute','note':'Witness\x20server\x20signature'},'evidence':'proof.move\x20L13-24'},{'field':'about','disposition':{'kind':'edge','schema':'proof.about'},'evidence':'proof.move\x20L20'},{'field':'signer','disposition':{'kind':'edge','schema':'proof.signer'},'evidence':'proof.move\x20L21'},{'field':'proof_type','disposition':{'kind':'attribute','note':'Evidence\x20kind\x20discriminator'},'evidence':'proof.move\x20L22'},{'field':'time','disposition':{'kind':'attribute','note':'Signing\x20time\x20(timestamp-ms)'},'evidence':'proof.move\x20L23'}]},TREASURY={'object':'Treasury','moveStruct':'treasury.move\x20L72-83\x20Treasury<T>','fields':[SYS('treasury.move\x20L72-83'),{'field':'description','disposition':{'kind':'attribute','note':'Treasury\x20description'},'evidence':'treasury.move\x20L72-83'},{'field':'balance','disposition':{'kind':'attribute','note':'Current\x20balance\x20(solvency\x20signal)'},'evidence':'treasury.move\x20L75'},{'field':'history','disposition':{'kind':'edge','schema':'treasury.record'},'evidence':'treasury.move\x20L76,L39-46'},{'field':'external_deposit_guard','disposition':{'kind':'edge','schema':'treasury.deposit_guard'},'evidence':'treasury.move\x20L77,L61-65,L138-194'},{'field':'external_withdraw_guard','disposition':{'kind':'edge','schema':'treasury.withdraw_guard'},'evidence':'treasury.move\x20L78,L67-71,L197-250'},{'field':'inflow','disposition':{'kind':'attribute','note':'Lifetime\x20inflow\x20(throughput\x20signal)'},'evidence':'treasury.move\x20L79'},{'field':'outflow','disposition':{'kind':'attribute','note':'Lifetime\x20outflow\x20(throughput\x20signal)'},'evidence':'treasury.move\x20L80'},{'field':'um','disposition':{'kind':'edge','schema':'treasury.um'},'evidence':'treasury.move\x20L81'},{'field':'permission','disposition':{'kind':'edge','schema':'treasury.permission'},'evidence':'treasury.move\x20L82'}]},PAYMENT={'object':'Payment','moveStruct':'payment.move\x20L93-101\x20Payment<T>','fields':[SYS('payment.move\x20L93-101'),{'field':'amount','disposition':{'kind':'attribute','note':'Total\x20payment\x20amount'},'evidence':'payment.move\x20L93-101'},{'field':'time','disposition':{'kind':'attribute','note':'Payment\x20time\x20(timestamp-ms)'},'evidence':'payment.move\x20L93-101'},{'field':'info','disposition':{'kind':'edge','schema':'payment.for_object','coSchemas':['payment.for_guard'],'note':'PaymentInfo\x20struct;\x20for_object/for_guard\x20are\x20the\x20two\x20routing\x20edges;\x20remark/index\x20are\x20attributes'},'evidence':'payment.move\x20L97,L66-71'},{'field':'from_object','disposition':{'kind':'edge','schema':'payment.from_object'},'evidence':'payment.move\x20L98,L149-161'},{'field':'signer','disposition':{'kind':'edge','schema':'payment.signer'},'evidence':'payment.move\x20L99,L111'},{'field':'record','disposition':{'kind':'edge','schema':'payment.recipient','note':'Revenue\x20entries;\x20recipient\x20members\x20are\x20the\x20edge,\x20amounts\x20ride\x20the\x20payload'},'evidence':'payment.move\x20L100,L93-101\x20(<=200)'}]},COIN_WRAPPER={'object':'CoinWrapper','moveStruct':'payment.move\x20L40-44\x20CoinWrapper<T>','fields':[SYS('payment.move\x20L40-44'),{'field':'balance','disposition':{'kind':'transient','note':'Escrowed\x20coin\x20inside\x20the\x20in-flight\x20wrapper;\x20consumed\x20by\x20unwrap'},'evidence':'payment.move\x20L42'},{'field':'payment','disposition':{'kind':'transient','note':'Back-reference\x20to\x20the\x20Payment\x20under\x20construction;\x20process\x20object,\x20deliberately\x20not\x20a\x20graph\x20edge'},'evidence':'payment.move\x20L43,L46-53'}]},RESOURCE={'object':'Resource','moveStruct':'resource.move\x20L18-21\x20Resource','fields':[SYS('resource.move\x20L18-21'),{'field':'table','disposition':{'kind':'nonAddress','note':'AddressTag\x20rows\x20(user\x20tags/nick);\x20projected\x20as\x20node\x20attributes\x20for\x20display,\x20deliberately\x20no\x20structural\x20edge'},'evidence':'resource.move\x20L20'}]},ENTITY_ORDERS={'object':'EntityOrders','moveStruct':'entity_order.move\x20L31-34\x20EntityOrders','fields':[SYS('entity_order.move\x20L31-34'),{'field':'table','disposition':{'kind':'edge','schema':'eoa.order','note':'Per-entity\x20FIFO\x205200\x20order-membership\x20rows\x20(role\x20bits\x20in\x20payload)'},'evidence':'entity_order.move\x20L33,L12'}]},ENTITY_PERMISSION={'object':'EntityPermission','moveStruct':'entity_permission.move\x20L32-35\x20EntityPermission','fields':[SYS('entity_permission.move\x20L32-35'),{'field':'table','disposition':{'kind':'edge','schema':'eoa.permission'},'evidence':'entity_permission.move\x20L34,L32\x20(role\x20bits)'}]},ENTITY_CONTACT={'object':'EntityContact','moveStruct':'entity_contact.move\x20L24-27\x20EntityContact','fields':[SYS('entity_contact.move\x20L24-27'),{'field':'table','disposition':{'kind':'edge','schema':'eoa.contact'},'evidence':'entity_contact.move\x20L26'}]},ENTITY={'object':'Entity','moveStruct':'registrar.move\x20L176-179\x20Entity\x20(0xaab)','fields':[SYS('registrar.move\x20L176-179'),{'field':'table','disposition':{'kind':'edge','schema':'entity.profile','coSchemas':['entity.referrer','entity.resource'],'note':'One\x20AddressInfo\x20row\x20per\x20account\x20backs\x20three\x20co-edges;\x20description/records\x20are\x20attributes'},'evidence':'registrar.move\x20L178,L146-152,L236-242'}]},REGISTRAR={'object':'Registrar','moveStruct':'registrar.move\x20L171-174\x20Registrar\x20(0xaaa)','fields':[SYS('registrar.move\x20L171-174'),{'field':'table','disposition':{'kind':'edge','schema':'target.vote','note':'Per-target\x20ring\x205200\x20of\x20like/dislike/favor\x20votes'},'evidence':'registrar.move\x20L173,L154-171'}]},OBJECT_LINKER_CORE={'object':'ObjectLinkerCore','moveStruct':'object_linker.move\x20L37-40\x20ObjectLinkerCore','fields':[SYS('object_linker.move\x20L37-40'),{'field':'table','disposition':{'kind':'edge','schema':'permission.core_binding','note':'Exact\x20(non-evicting)\x20linker\x20registry'},'evidence':'object_linker.move\x20L39,L88'}]},OBJECT_LINKER_TX={'object':'ObjectLinkerTx','moveStruct':'object_linker.move\x20L43-46\x20ObjectLinkerTx','fields':[SYS('object_linker.move\x20L43-46'),{'field':'table','disposition':{'kind':'edge','schema':'permission.tx_binding','coSchemas':['service.order'],'note':'FIFO\x205200\x20runtime\x20buffer;\x20service.order\x20is\x20the\x20Order-filtered\x20view\x20of\x20the\x20same\x20rows'},'evidence':'object_linker.move\x20L45,L136-140'}]},EVENT_STREAMS={'object':'EventStreams','moveStruct':'append-only\x20event\x20streams\x20(channel\x20D;\x20no\x20struct\x20fields)','fields':[{'field':PackageAddress+'::order::NewOrderEvent','disposition':{'kind':'edge','schema':'service.order_history','coSchemas':['eoa.order_history']},'evidence':'order.move\x20L51-58,L142','oq':'OQ-2/OQ-4'},{'field':PackageAddress+'::arb::ArbEvent','disposition':{'kind':'edge','schema':'arb.history'},'evidence':'arb.move\x20L33-43,L122,L227','oq':'OQ-4'}]};export const FIELD_MANIFEST=[SERVICE,ORDER,DISCOUNT,PROGRESS,MACHINE,ALLOCATION,ARBITRATION,ARB,DEMAND,REWARD,REPOSITORY,CONTACT,PERMISSION,GUARD,PASSPORT,PROOF,TREASURY,PAYMENT,COIN_WRAPPER,RESOURCE,ENTITY_ORDERS,ENTITY_PERMISSION,ENTITY_CONTACT,ENTITY,REGISTRAR,OBJECT_LINKER_CORE,OBJECT_LINKER_TX,EVENT_STREAMS];export const MANIFEST_BY_OBJECT=new Map(FIELD_MANIFEST['map'](a=>[a['object'],a]));export const BUSINESS_OBJECTS=['Service','Order','Discount','Progress','Machine','Allocation','Arbitration','Arb','Demand','Reward','Repository','Contact','Permission','Guard','Passport','Proof','Treasury','Payment'];
@@ -1 +1 @@
1
- export const RECOVERY_RULES={'insufficient_balance':{'error_code':'insufficient_balance','strategy':'claim_faucet','max_attempts':0x3,'automation':'semi','detail':'1.\x20Testnet:\x20claim\x20WOW\x20from\x20the\x20faucet\x202.\x20Mainnet:\x20transfer\x20ETH/USDT/USDC/WBTC\x20via\x20the\x20ETH\x20mainnet\x20cross-chain\x20bridge\x20(query\x20active\x20EVM\x20account\x20→\x20top\x20up\x20from\x20external\x20wallet\x20→\x20confirm\x20→\x20cross-chain)\x203.\x20Point\x20the\x20user\x20to\x20the\x20live\x20airdrop\x20page\x20(https://wowok.net/airdrop.html)\x20for\x20the\x20current\x20round\x204.\x20Retry\x20original\x20operation','user_prompt':'Insufficient\x20balance\x20for\x20gas\x20or\x20operation.\x20How\x20to\x20obtain\x20WOW\x20tokens:\x20(1)\x20Testnet\x20—\x20claim\x20WOW\x20from\x20the\x20faucet\x20(https://faucet.testnet.wowok.net);\x20all\x20merchant\x20and\x20order\x20testing\x20can\x20use\x20WOW\x20as\x20the\x20payment\x20token.\x20(2)\x20Mainnet\x20—\x20transfer\x20ETH\x20/\x20USDT\x20/\x20USDC\x20/\x20WBTC\x20via\x20the\x20ETH\x20mainnet\x20cross-chain\x20bridge:\x20first\x20query\x20the\x20active\x20EVM\x20account\x20(bridge_operation\x20query_active_evm_account,\x20auto-generated\x20on\x20first\x20use),\x20then\x20transfer\x20from\x20an\x20external\x20wallet\x20(e.g.\x20MetaMask)\x20to\x20that\x20address,\x20confirm\x20the\x20balance\x20arrived,\x20and\x20cross-chain\x20to\x20WOW\x20mainnet\x20(bridge_operation\x20cross_chain_evm_to_wow).\x20(3)\x20WOW\x20airdrop:\x20current\x20round\x20status,\x20pool\x20and\x20eligibility\x20are\x20published\x20live\x20at\x20https://wowok.net/airdrop.html\x20(referral:\x20https://wowok.net/refer.html)\x20—\x20open\x20that\x20page\x20rather\x20than\x20assuming\x20a\x20round\x20is\x20live\x20or\x20closed.\x20Query\x20wowok_buildin_info\x20with\x20info=\x27funding\x20guidance\x27\x20for\x20the\x20canonical\x20funding\x20guidance.'},'stock_exhausted':{'error_code':'stock_exhausted','strategy':'adjust_params','max_attempts':0x1,'automation':'semi','detail':'Merchant-side\x20inventory\x20shortfall\x20(Move\x20service:16\x20E_STOCK_NOT_ENOUGH)\x20—\x20NOT\x20a\x20buyer\x20balance\x20problem,\x20so\x20a\x20faucet\x20claim\x20will\x20NOT\x20help.\x201.\x20Reduce\x20the\x20purchase\x20quantity\x20to\x20the\x20item\x27s\x20remaining\x20stock\x202.\x20Pick\x20another\x20sale\x20item\x203.\x20Ask\x20the\x20merchant\x20to\x20restock,\x20then\x20retry','user_prompt':'The\x20sale\x20item\x27s\x20stock\x20is\x20exhausted\x20for\x20the\x20requested\x20quantity.\x20Reduce\x20the\x20quantity,\x20choose\x20another\x20item,\x20or\x20ask\x20the\x20merchant\x20to\x20restock.'},'sale_suspended':{'error_code':'sale_suspended','strategy':'adjust_params','max_attempts':0x1,'automation':'semi','detail':'The\x20merchant\x20suspended\x20this\x20sale\x20item\x20(Move\x20service:34\x20E_SALE_SUSPENDED).\x201.\x20Pick\x20another\x20(non-suspended)\x20item\x202.\x20Contact\x20the\x20merchant\x20to\x20resume\x20the\x20sale,\x20then\x20retry','user_prompt':'The\x20sale\x20item\x20is\x20suspended\x20by\x20the\x20merchant.\x20Please\x20choose\x20another\x20item\x20or\x20contact\x20the\x20merchant.'},'discount_invalid':{'error_code':'discount_invalid','strategy':'adjust_params','max_attempts':0x1,'automation':'semi','detail':'The\x20discount\x20is\x20outside\x20its\x20[time_start,\x20time_end]\x20validity\x20window\x20(Move\x20service:35\x20E_DISCOUNT_TIME_INVALID).\x201.\x20Retry\x20without\x20the\x20discount\x202.\x20Ask\x20the\x20merchant\x20for\x20a\x20fresh\x20discount,\x20then\x20retry','user_prompt':'The\x20discount\x20is\x20not\x20valid\x20at\x20the\x20current\x20time\x20(outside\x20its\x20validity\x20window).\x20Buy\x20without\x20the\x20discount\x20or\x20ask\x20the\x20merchant\x20for\x20a\x20new\x20one.'},'rate_limit':{'error_code':'rate_limit','strategy':'retry','max_attempts':0x5,'automation':'full','detail':'Rate\x20limit\x20hit\x20(HTTP\x20429).\x20Exponential\x20backoff\x20retry:\x202s\x20/\x204s\x20/\x208s\x20/\x2016s\x20/\x2032s.\x20Avoid\x20parallel\x20calls\x20while\x20the\x20limit\x20window\x20is\x20active.'},'gas_exceeded':{'error_code':'gas_exceeded','strategy':'adjust_params','max_attempts':0x3,'automation':'semi','detail':'Gas\x20budget\x20exceeded.\x201.\x20Increase\x20the\x20gas_budget\x20parameter\x202.\x20Reduce\x20the\x20operation\x20size\x20(fewer\x20objects\x20per\x20transaction)\x203.\x20Retry\x20the\x20original\x20operation','user_prompt':'Gas\x20budget\x20exceeded.\x20Increase\x20the\x20gas\x20budget\x20or\x20reduce\x20the\x20operation\x20size,\x20then\x20retry.'},'insufficient_gas':{'error_code':'insufficient_gas','strategy':'adjust_params','max_attempts':0x1,'automation':'semi','detail':'Gas\x20exhausted\x20—\x20the\x20transaction\x20failed\x20deterministically\x20and\x20did\x20NOT\x20commit\x20on-chain\x20(no\x20state\x20changed;\x20commit-state\x20verification\x20is\x20NOT\x20needed).\x201.\x20Raise\x20the\x20gas_budget\x20parameter\x20above\x20the\x20failed\x20transaction\x27s\x20gas_used\x202.\x20If\x20the\x20account\x20balance\x20cannot\x20cover\x20any\x20budget,\x20fund\x20the\x20signing\x20account\x20with\x20gas\x20tokens\x20first\x203.\x20Resubmit\x20as\x20a\x20FRESH\x20call\x20—\x20do\x20NOT\x20replay\x20the\x20same\x20transaction','user_prompt':'The\x20transaction\x20ran\x20out\x20of\x20gas\x20and\x20did\x20not\x20commit\x20on-chain.\x20Increase\x20the\x20gas\x20budget\x20(or\x20fund\x20the\x20account\x20with\x20gas)\x20and\x20submit\x20a\x20fresh\x20transaction\x20—\x20retrying\x20unchanged\x20will\x20fail\x20the\x20same\x20way.'},'bcs_error':{'error_code':'bcs_error','strategy':'adjust_params','max_attempts':0x2,'automation':'semi','detail':'BCS\x20serialization/deserialization\x20error\x20—\x20a\x20parameter\x20does\x20not\x20match\x20the\x20expected\x20type/structure.\x201.\x20Query\x20the\x20operation\x20schema\x20(schema_query)\x202.\x20Fix\x20the\x20offending\x20parameter\x20type\x20(e.g.\x20BigInt\x20vs\x20number,\x20vector\x20element\x20type)\x203.\x20Retry','user_prompt':'A\x20parameter\x20failed\x20serialization.\x20Check\x20the\x20parameter\x20types\x20against\x20the\x20schema\x20and\x20retry.'},'signature_error':{'error_code':'signature_error','strategy':'switch_account','max_attempts':0x2,'automation':'semi','detail':'Signature\x20verification\x20failed.\x201.\x20Verify\x20the\x20account\x20is\x20not\x20suspended\x202.\x20Check\x20the\x20network\x20matches\x20the\x20account\x27s\x203.\x20Switch\x20to\x20a\x20healthy\x20account\x20and\x20retry','user_prompt':'Signature\x20verification\x20failed.\x20The\x20account\x20may\x20be\x20suspended\x20or\x20misconfigured.\x20Switch\x20accounts\x20or\x20check\x20the\x20configuration\x20and\x20retry.'},'config_error':{'error_code':'config_error','strategy':'escalate_human','max_attempts':0x1,'automation':'manual','detail':'Local\x20configuration\x20error\x20(network\x20not\x20specified,\x20persistent\x20storage\x20not\x20set).\x201.\x20Show\x20the\x20user\x20which\x20configuration\x20is\x20missing\x202.\x20Guide\x20the\x20user\x20through\x20the\x20account_operation/config\x20setup\x203.\x20Retry\x20after\x20the\x20user\x20fixes\x20it','user_prompt':'Local\x20configuration\x20is\x20incomplete.\x20Please\x20finish\x20the\x20account/network\x20setup\x20and\x20retry.'},'wip_verification_failed':{'error_code':'wip_verification_failed','strategy':'adjust_params','max_attempts':0x2,'automation':'semi','detail':'WIP\x20file\x20not\x20publicly\x20reachable\x20/\x20hash\x20mismatch.\x201.\x20Upload\x20via\x20the\x20wip\x20storage\x20service\x20(wip_file\x20type=\x27upload\x27\x20—\x20official\x20free\x20store\x20or\x20storage=\x27custom\x27)\x202.\x20Or\x20deploy\x20to\x20a\x20public\x20URL\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20own\x20site)\x203.\x20Update\x20the\x20sale\x27s\x20wip\x20URL\x204.\x20Re-run\x20the\x20operation','user_prompt':'The\x20WIP\x20file\x20could\x20not\x20be\x20verified\x20from\x20a\x20public\x20URL.\x20Upload\x20it\x20with\x20wip_file\x20type=\x27upload\x27\x20(official\x20free\x20store\x20or\x20your\x20own\x20service)\x20or\x20deploy\x20it\x20(GitHub\x20Pages\x20/\x20IPFS),\x20update\x20the\x20sale\x27s\x20WIP\x20URL,\x20and\x20retry.'},'wip_storage_unavailable':{'error_code':'wip_storage_unavailable','strategy':'retry','max_attempts':0x3,'automation':'full','detail':'Transient\x20wip\x20storage\x20transport\x20failure.\x201.\x20Retry\x20the\x20same\x20request\x20with\x20bounded\x20backoff\x202.\x20Large\x20WIP\x20files\x20are\x20network-sensitive:\x20compress\x20images\x20before\x20generate\x20(each\x20image\x20<=\x202MB,\x20total\x20<=\x2010MB)\x203.\x20Check\x20connectivity\x20to\x20the\x20storage\x20base\x20URL\x20if\x20retries\x20keep\x20failing','user_prompt':'The\x20wip\x20storage\x20request\x20failed\x20due\x20to\x20a\x20network\x20problem.\x20Retry\x20the\x20upload;\x20if\x20it\x20keeps\x20failing,\x20reduce\x20the\x20file\x20size\x20or\x20check\x20connectivity.'},'network_error':{'error_code':'network_error','strategy':'retry','max_attempts':0x5,'automation':'full','detail':'Exponential\x20backoff\x20retry:\x201s\x20/\x202s\x20/\x204s\x20/\x208s\x20/\x2016s.\x20Switch\x20RPC\x20node\x20if\x20available.'},'submission_unknown':{'error_code':'submission_unknown','strategy':'query_and_retry','max_attempts':0x2,'automation':'semi','detail':'Transport-level\x20failure\x20after\x20the\x20request\x20left\x20the\x20client\x20—\x20the\x20submission\x20state\x20is\x20UNKNOWN\x20and\x20the\x20transaction\x20may\x20already\x20be\x20committed.\x20NEVER\x20auto-retry\x20a\x20write\x20here.\x201.\x20Verify\x20commit\x20state\x20on-chain:\x20query_toolkit\x20for\x20the\x20object\x20this\x20call\x20would\x20create/modify\x20(resolve\x20the\x20reference\x20from\x20the\x20call\x27s\x20own\x20arguments),\x20or\x20onchain_events\x20for\x20the\x20sender\x27s\x20recent\x20transactions.\x202.\x20If\x20the\x20expected\x20object\x20EXISTS,\x20adopt\x20it\x20and\x20continue\x20the\x20workflow\x20(the\x20operation\x20succeeded\x20despite\x20the\x20transport\x20error).\x203.\x20If\x20confirmed\x20ABSENT,\x20resubmit\x20the\x20SAME\x20call\x20once\x20—\x20for\x20a\x20FIRST-EVER\x20transaction\x20on\x20a\x20fresh\x20account\x20make\x20that\x20resubmission\x20with\x20env.no_auto_register=true\x20and\x20SAY\x20SO\x20(the\x20SDK\x20silently\x20appends\x20an\x20entity\x20registration\x20to\x20a\x20first\x20business\x20call;\x20if\x20that\x20appended\x20leg\x20was\x20the\x20failing\x20leg\x20the\x20skip\x20lets\x20the\x20call\x20through\x20—\x20ziroom-mn-261013\x20live\x20case;\x20if\x20the\x20resubmission\x20aborts,\x20the\x20envelope\x20now\x20names\x20the\x20abort\x20—\x20re-enable\x20auto\x20registration\x20and\x20retry).\x204.\x20If\x20the\x20reported\x20digest\x20does\x20not\x20resolve\x20or\x20the\x20failure\x20repeats,\x20STOP\x20looping\x20on\x20digest\x20checks\x20and\x20re-run\x20the\x20SAME\x20call\x20with\x20env.dry_run=true\x20—\x20the\x20simulation\x20surfaces\x20the\x20real\x20failure\x20(exact\x20Move\x20abort)\x20without\x20gas\x20or\x20duplicate\x20risk.\x205.\x20Reads\x20are\x20idempotent\x20—\x20retry\x20immediately.\x206.\x20M-K2\x20replay\x20discipline:\x20a\x20FAILED\x20receipt\x20is\x20final\x20—\x20its\x20digest\x20is\x20consumed\x20and\x20replaying\x20the\x20same\x20bytes\x20returns\x20the\x20same\x20failure\x20forever;\x20fix\x20the\x20cause\x20(usually\x20funding)\x20and\x20build\x20a\x20FRESH\x20transaction.\x20Live\x20mainnet\x20incident\x20behind\x20this\x20rule:\x20an\x20order_new\x20-32603\x20\x27did\x20not\x20complete\x27\x20had\x20committed;\x20the\x20blind\x20retry\x20created\x20a\x20second\x20order\x20with\x20a\x20second\x20full\x20escrow\x20and\x20a\x20second\x20stock\x20decrement','user_prompt':'The\x20request\x20failed\x20at\x20transport\x20level\x20but\x20may\x20have\x20already\x20been\x20committed\x20on-chain.\x20Verify\x20whether\x20the\x20expected\x20object\x20exists\x20(query\x20it)\x20before\x20any\x20retry\x20—\x20a\x20blind\x20retry\x20can\x20duplicate\x20the\x20operation\x20(double\x20escrow).\x20For\x20read\x20operations,\x20a\x20plain\x20retry\x20is\x20safe.'},'transaction_expired':{'error_code':'transaction_expired','strategy':'retry','max_attempts':0x3,'automation':'full','detail':'The\x20transaction\x20expired\x20before\x20execution\x20(epoch\x20boundary\x20or\x20validator/gateway\x20outage)\x20—\x20it\x20did\x20NOT\x20land\x20and\x20nothing\x20was\x20committed.\x20Bounded\x20backoff\x20retry:\x2010s\x20/\x2030s\x20/\x2060s,\x20resubmit\x20the\x20SAME\x20call\x20unchanged.\x20If\x20a\x20dry_run\x20passes\x20while\x20the\x20real\x20call\x20keeps\x20failing,\x20the\x20fault\x20is\x20chain-side\x20—\x20wait\x20it\x20out.\x20Verify\x20with\x20onchain_events\x20if\x20unsure.'},'guard_rejected':{'error_code':'guard_rejected','strategy':'fill_submission','max_attempts':0x2,'automation':'semi','detail':'1.\x20Parse\x20Guard\x20table\x20structure\x202.\x20If\x20the\x20Guard\x20defines\x20submission\x20items,\x20fill\x20them\x20and\x20resubmit\x20with\x20call_with_submission\x203.\x20If\x20it\x20defines\x20none,\x20the\x20rule\x20evaluated\x20false\x20—\x20typical\x20causes:\x20a\x20TIME\x20WINDOW\x20(Clock\x20deadline/opening\x20comparison\x20—\x20this\x20call\x20may\x20sit\x20outside\x20the\x20window,\x20and\x20a\x20mis-oriented\x20comparison\x20inverts\x20it:\x20everything\x20inside\x20rejected,\x20everything\x20after\x20admitted)\x20or\x20an\x20IDENTITY\x20condition\x20(signer/state\x20checks\x20—\x20the\x20caller\x20may\x20not\x20be\x20the\x20address\x20the\x20rule\x20expects);\x20adjust\x20the\x20call\x27s\x20parameters\x20or\x20change\x20the\x20Guard\x20(docs#40)\x204.\x20When\x20the\x20failure\x20is\x20passport\x20E_VERIFY_FAILED\x20and\x20a\x20submission\x20was\x20supplied,\x20the\x20response\x20appends\x20a\x20\x27Guard\x20diagnosis\x20(dry-run)\x27\x20line\x20naming\x20the\x20first\x20failing\x20impact\x20guard\x20—\x20fix\x20that\x20guard\x20first\x205.\x20A\x20TIME-window\x20rejection\x20may\x20simply\x20be\x20EARLY:\x20re-run\x20the\x20SAME\x20call\x20with\x20env.dry_run=true\x20to\x20probe\x20the\x20window\x20for\x20free\x20(guard\x20rejections\x20do\x20NOT\x20consume\x20the\x20total\x20retry\x20budget;\x20only\x20the\x20per-code\x20cap\x20of\x202\x20applies)','user_prompt':'Guard\x20verification\x20rejected.\x20If\x20the\x20Guard\x20defines\x20submission\x20items,\x20fill\x20in\x20the\x20required\x20submission\x20data\x20and\x20resubmit;\x20if\x20it\x20defines\x20none,\x20the\x20Guard\x20rule\x20evaluated\x20false\x20—\x20the\x20usual\x20causes\x20are\x20a\x20time\x20window\x20(this\x20call\x20may\x20be\x20outside\x20the\x20Clock\x20deadline/opening\x20window)\x20or\x20an\x20identity\x20condition\x20(the\x20caller\x20is\x20not\x20the\x20address\x20the\x20rule\x20expects);\x20adjust\x20this\x20call\x27s\x20parameters\x20or\x20change\x20the\x20Guard\x20rule.\x20When\x20the\x20response\x20includes\x20a\x20\x27Guard\x20diagnosis\x20(dry-run)\x27\x20line,\x20it\x20names\x20the\x20first\x20failing\x20impact\x20guard\x20—\x20address\x20that\x20guard\x20first.\x20A\x20time-window\x20rejection\x20may\x20simply\x20be\x20early:\x20probe\x20the\x20window\x20with\x20env.dry_run=true\x20(free\x20—\x20guard\x20rejections\x20do\x20not\x20consume\x20the\x20total\x20retry\x20budget).'},'time_lock_not_elapsed':{'error_code':'time_lock_not_elapsed','strategy':'wait_and_retry','max_attempts':0x1,'automation':'semi','detail':'1.\x20Verify\x20Service\x20is\x20paused\x20(bPaused=true).\x20If\x20not,\x20submit\x20pause=true\x20first.\x202.\x20Wait\x20until\x20paused_time\x20+\x20setting_lock_duration\x20<=\x20current\x20clock.\x203.\x20Retry\x20the\x20original\x20operation.\x20Do\x20NOT\x20recreate\x20the\x20object.','user_prompt':'Service\x20setting_lock_duration\x20has\x20not\x20elapsed\x20since\x20the\x20Service\x20was\x20paused.\x20Please\x20pause\x20the\x20Service\x20if\x20it\x20is\x20not\x20already\x20paused,\x20wait\x20for\x20the\x20lock\x20duration\x20to\x20elapse,\x20then\x20retry.'},'immutable_violation':{'error_code':'immutable_violation','strategy':'recreate','max_attempts':0x1,'automation':'semi','detail':'1.\x20Stop\x20modification\x20attempt\x202.\x20Evaluate\x20creating\x20a\x20new\x20object\x20as\x20replacement\x203.\x20Re-plan\x20affected\x20phases','user_prompt':'Cannot\x20modify\x20an\x20immutable\x20object.\x20A\x20new\x20object\x20must\x20be\x20created\x20as\x20a\x20replacement.\x20Confirm\x20to\x20proceed\x20with\x20recreation.'},'permission_denied':{'error_code':'permission_denied','strategy':'switch_account','max_attempts':0x2,'automation':'semi','detail':'1.\x20Query\x20object\x27s\x20permission_guard\x202.\x20List\x20accounts\x20with\x20permission\x203.\x20Switch\x20account\x20or\x20prompt\x20user\x20to\x20add\x20permission','user_prompt':'Current\x20account\x20lacks\x20permission\x20for\x20this\x20operation.\x20Switch\x20to\x20an\x20authorized\x20account\x20or\x20update\x20the\x20Permission\x20object.'},'object_not_found':{'error_code':'object_not_found','strategy':'query_and_retry','max_attempts':0x3,'automation':'semi','detail':'1.\x20Verify\x20the\x20referenced\x20name/ID\x20spelling\x20(local_mark_list)\x20and\x20that\x20the\x20object\x20exists\x20on\x20the\x20current\x20network\x202.\x20If\x20recently\x20created,\x20re-query\x20the\x20object\x20(may\x20be\x20sync\x20delay)\x203.\x20If\x20truly\x20absent,\x20search\x20for\x20similar\x20objects\x204.\x20Prompt\x20user\x20to\x20reselect','user_prompt':'Referenced\x20object\x20not\x20found.\x20First\x20verify\x20the\x20name/ID\x20spelling\x20and\x20that\x20the\x20object\x20exists\x20on\x20the\x20current\x20network;\x20if\x20it\x20was\x20created\x20recently,\x20this\x20may\x20be\x20a\x20synchronization\x20delay\x20—\x20retry.\x20If\x20the\x20issue\x20persists,\x20please\x20select\x20a\x20valid\x20object.'},'state_conflict':{'error_code':'state_conflict','strategy':'adjust_params','max_attempts':0x2,'automation':'full','detail':'1.\x20Query\x20object\x27s\x20current\x20true\x20state\x202.\x20Update\x20ODG\x20status\x20annotations\x203.\x20Adjust\x20subsequent\x20operations\x20(e.g.,\x20skip\x20completed\x20steps)'},'invalid_parameter':{'error_code':'invalid_parameter','strategy':'adjust_params','max_attempts':0x2,'automation':'semi','detail':'1.\x20Query\x20the\x20relevant\x20schema\x202.\x20Auto-fix\x20obvious\x20errors\x20(e.g.,\x20BigInt\x20vs\x20string)\x203.\x20If\x20unfixable,\x20prompt\x20user','user_prompt':'Parameter\x20validation\x20failed.\x20Please\x20check\x20the\x20parameter\x20types\x20and\x20values\x20against\x20the\x20schema\x20and\x20retry.'},'move_abort_unmapped':{'error_code':'move_abort_unmapped','strategy':'stop','max_attempts':0x1,'automation':'manual','detail':'The\x20chain\x27s\x20business\x20logic\x20aborted\x20and\x20the\x20(module,\x20abort\x20code)\x20pair\x20has\x20no\x20local\x20mapping.\x20Read\x20the\x20module\x20and\x20abort\x20code\x20from\x20move_abort_info\x20/\x20the\x20message\x20(rendered\x20as\x20\x27abort\x20(N)\x27),\x20resolve\x20their\x20meaning\x20from\x20the\x20module\x27s\x20documentation\x20or\x20the\x20wowok-tools\x20Skill,\x20fix\x20the\x20business\x20cause,\x20and\x20issue\x20a\x20NEW\x20call.\x20Do\x20NOT\x20restart\x20the\x20server\x20and\x20do\x20NOT\x20retry\x20the\x20identical\x20call\x20—\x20it\x20aborts\x20deterministically.','user_prompt':'The\x20operation\x20was\x20rejected\x20by\x20the\x20chain\x27s\x20business\x20logic\x20and\x20its\x20abort\x20code\x20is\x20not\x20mapped\x20locally.\x20The\x20module\x20name\x20and\x20abort\x20code\x20in\x20the\x20error\x20are\x20authoritative\x20—\x20review\x20them\x20(and\x20the\x20object\x20state\x20via\x20query_toolkit)\x20before\x20adjusting\x20anything.'},'missing_data':{'error_code':'missing_data','strategy':'adjust_params','max_attempts':0x2,'automation':'semi','detail':'A\x20guard\x20rule\x20read\x20a\x20keyed\x20table\x20row\x20that\x20does\x20NOT\x20exist\x20(repository.data\x20/\x20oracle\x20entry)\x20and\x20the\x20verifier\x20surfaced\x20it\x20as\x20a\x20location-only\x20fault\x20inside\x20the\x20passport\x20module\x20—\x20no\x20abort\x20code,\x20because\x20the\x20framework\x20cannot\x20express\x20\x27row\x20absent\x27\x20as\x20an\x20abort.\x20This\x20is\x20a\x20DATA\x20problem:\x201.\x20Identify\x20the\x20repository\x20and\x20key\x20the\x20guard\x20rule\x20reads\x20(guard2file\x20/\x20analyze_guard_semantics\x20on\x20the\x20guard\x20source)\x202.\x20Have\x20the\x20row\x27s\x20producer\x20write\x20it\x20(e.g.\x20an\x20oracle\x20timestamp\x20like\x20checkin_ts),\x20or\x20add\x20it\x20with\x20repository\x20data_add\x20(data_add.name\x20must\x20match\x20a\x20policy\x20rule\x20name)\x203.\x20Retry\x20the\x20SAME\x20call\x20unchanged\x20—\x20a\x20dry_run\x20that\x20turns\x20clean\x20after\x20the\x20row\x20exists\x20confirms\x20the\x20diagnosis','user_prompt':'A\x20guard\x20rule\x20references\x20a\x20data\x20row\x20that\x20has\x20not\x20been\x20written\x20yet\x20(location-only\x20fault\x20inside\x20the\x20passport\x20module\x20—\x20NOT\x20a\x20network\x20problem).\x20Identify\x20the\x20repository\x20row\x20the\x20guard\x20expects\x20(guard2file\x20/\x20analyze_guard_semantics),\x20write\x20it\x20with\x20repository\x20data_add\x20(or\x20let\x20its\x20producer\x20write\x20it),\x20then\x20retry.'},'unknown':{'error_code':'unknown','strategy':'escalate_human','max_attempts':0x1,'automation':'manual','detail':'1.\x20Report\x20full\x20error\x20context\x20to\x20the\x20user\x202.\x20Escalate\x20to\x20human\x20intervention\x203.\x20Flag\x20for\x20error-classification\x20rule\x20addition','user_prompt':'An\x20unclassified\x20error\x20occurred.\x20Please\x20review\x20the\x20error\x20details\x20and\x20contact\x20support\x20if\x20needed.'}};const operationAttempts=new Map();function getAttemptCount(a,b){const c=operationAttempts['get'](a);if(!c)return 0x0;return c['get'](b)??0x0;}function incrementAttempt(a,b){!operationAttempts['has'](a)&&operationAttempts['set'](a,new Map());const c=operationAttempts['get'](a),d=(c['get'](b)??0x0)+0x1;return c['set'](b,d),d;}const BUDGET_EXEMPT_CODES=new Set(['guard_rejected']);function getBudgetAttempts(a){const b=operationAttempts['get'](a);if(!b)return 0x0;let c=0x0;for(const [d,e]of b){if(!BUDGET_EXEMPT_CODES['has'](d))c+=e;}return c;}export function resetAttempts(a){operationAttempts['delete'](a);}export function recover(a,b,c){const d=RECOVERY_RULES[a]??RECOVERY_RULES['unknown'],e=0x5,f=getBudgetAttempts(b),g=getAttemptCount(b,a);if(d['max_attempts']<=0x1||d['strategy']==='stop')return{'strategy':d['strategy'],'should_retry':![],'max_attempts':d['max_attempts'],'current_attempt':g,'adjusted_params':d['adjusted_params'],'user_prompt':d['user_prompt'],'detail':d['detail']};if(f>=e)return{'strategy':'stop','should_retry':![],'max_attempts':e,'current_attempt':f,'detail':'Total\x20retry\x20limit\x20('+e+')\x20reached\x20for\x20operation\x20'+b+'.\x20Escalating\x20to\x20human\x20intervention.\x20Attempts\x20recorded\x20for\x20this\x20operation\x20id:\x20'+([...(operationAttempts['get'](b)??new Map())['entries']()]['map'](([i,j])=>i+':'+j)['join'](',\x20')||'none')+'.','user_prompt':'Maximum\x20retry\x20attempts\x20reached.\x20Manual\x20intervention\x20required.'};if(g>=d['max_attempts'])return{'strategy':'escalate_human','should_retry':![],'max_attempts':d['max_attempts'],'current_attempt':g,'detail':'Per-error-code\x20retry\x20limit\x20('+d['max_attempts']+')\x20reached\x20for\x20'+a+'.\x20Escalating\x20to\x20human.','user_prompt':'Recovery\x20attempts\x20for\x20'+a+'\x20exhausted.\x20Manual\x20intervention\x20required.'};const h=incrementAttempt(b,a);return{'strategy':d['strategy'],'should_retry':d['automation']==='full'||h<d['max_attempts'],'max_attempts':d['max_attempts'],'current_attempt':h,'adjusted_params':d['adjusted_params'],'user_prompt':d['user_prompt'],'detail':d['detail']};}export function getBackoffDelay(a){return Math['pow'](0x2,a-0x1)*0x3e8;}
1
+ export const RECOVERY_RULES={'insufficient_balance':{'error_code':'insufficient_balance','strategy':'claim_faucet','max_attempts':0x3,'automation':'semi','detail':'1.\x20Testnet:\x20claim\x20WOW\x20from\x20the\x20faucet\x202.\x20Mainnet:\x20transfer\x20ETH/USDT/USDC/WBTC\x20via\x20the\x20ETH\x20mainnet\x20cross-chain\x20bridge\x20(query\x20active\x20EVM\x20account\x20→\x20top\x20up\x20from\x20external\x20wallet\x20→\x20confirm\x20→\x20cross-chain)\x203.\x20Point\x20the\x20user\x20to\x20the\x20live\x20airdrop\x20page\x20(https://wowok.net/airdrop.html)\x20for\x20the\x20current\x20round\x204.\x20Retry\x20original\x20operation','user_prompt':'Insufficient\x20balance\x20for\x20gas\x20or\x20operation.\x20How\x20to\x20obtain\x20WOW\x20tokens:\x20(1)\x20Testnet\x20—\x20claim\x20WOW\x20from\x20the\x20faucet\x20(https://faucet.testnet.wowok.net);\x20all\x20merchant\x20and\x20order\x20testing\x20can\x20use\x20WOW\x20as\x20the\x20payment\x20token.\x20(2)\x20Mainnet\x20—\x20transfer\x20ETH\x20/\x20USDT\x20/\x20USDC\x20/\x20WBTC\x20via\x20the\x20ETH\x20mainnet\x20cross-chain\x20bridge:\x20first\x20query\x20the\x20active\x20EVM\x20account\x20(bridge_operation\x20query_active_evm_account,\x20auto-generated\x20on\x20first\x20use),\x20then\x20transfer\x20from\x20an\x20external\x20wallet\x20(e.g.\x20MetaMask)\x20to\x20that\x20address,\x20confirm\x20the\x20balance\x20arrived,\x20and\x20cross-chain\x20to\x20WOW\x20mainnet\x20(bridge_operation\x20cross_chain_evm_to_wow).\x20(3)\x20WOW\x20airdrop:\x20current\x20round\x20status,\x20pool\x20and\x20eligibility\x20are\x20published\x20live\x20at\x20https://wowok.net/airdrop.html\x20(referral:\x20https://wowok.net/refer.html)\x20—\x20open\x20that\x20page\x20rather\x20than\x20assuming\x20a\x20round\x20is\x20live\x20or\x20closed.\x20Query\x20wowok_buildin_info\x20with\x20info=\x27funding\x20guidance\x27\x20for\x20the\x20canonical\x20funding\x20guidance.'},'stock_exhausted':{'error_code':'stock_exhausted','strategy':'adjust_params','max_attempts':0x1,'automation':'semi','detail':'Merchant-side\x20inventory\x20shortfall\x20(Move\x20service:16\x20E_STOCK_NOT_ENOUGH)\x20—\x20NOT\x20a\x20buyer\x20balance\x20problem,\x20so\x20a\x20faucet\x20claim\x20will\x20NOT\x20help.\x201.\x20Reduce\x20the\x20purchase\x20quantity\x20to\x20the\x20item\x27s\x20remaining\x20stock\x202.\x20Pick\x20another\x20sale\x20item\x203.\x20Ask\x20the\x20merchant\x20to\x20restock,\x20then\x20retry','user_prompt':'The\x20sale\x20item\x27s\x20stock\x20is\x20exhausted\x20for\x20the\x20requested\x20quantity.\x20Reduce\x20the\x20quantity,\x20choose\x20another\x20item,\x20or\x20ask\x20the\x20merchant\x20to\x20restock.'},'sale_suspended':{'error_code':'sale_suspended','strategy':'adjust_params','max_attempts':0x1,'automation':'semi','detail':'The\x20merchant\x20suspended\x20this\x20sale\x20item\x20(Move\x20service:34\x20E_SALE_SUSPENDED).\x201.\x20Pick\x20another\x20(non-suspended)\x20item\x202.\x20Contact\x20the\x20merchant\x20to\x20resume\x20the\x20sale,\x20then\x20retry','user_prompt':'The\x20sale\x20item\x20is\x20suspended\x20by\x20the\x20merchant.\x20Please\x20choose\x20another\x20item\x20or\x20contact\x20the\x20merchant.'},'discount_invalid':{'error_code':'discount_invalid','strategy':'adjust_params','max_attempts':0x1,'automation':'semi','detail':'The\x20discount\x20is\x20outside\x20its\x20[time_start,\x20time_end]\x20validity\x20window\x20(Move\x20service:35\x20E_DISCOUNT_TIME_INVALID).\x201.\x20Retry\x20without\x20the\x20discount\x202.\x20Ask\x20the\x20merchant\x20for\x20a\x20fresh\x20discount,\x20then\x20retry','user_prompt':'The\x20discount\x20is\x20not\x20valid\x20at\x20the\x20current\x20time\x20(outside\x20its\x20validity\x20window).\x20Buy\x20without\x20the\x20discount\x20or\x20ask\x20the\x20merchant\x20for\x20a\x20new\x20one.'},'rate_limit':{'error_code':'rate_limit','strategy':'retry','max_attempts':0x5,'automation':'full','detail':'Rate\x20limit\x20hit\x20(HTTP\x20429).\x20Exponential\x20backoff\x20retry:\x202s\x20/\x204s\x20/\x208s\x20/\x2016s\x20/\x2032s.\x20Avoid\x20parallel\x20calls\x20while\x20the\x20limit\x20window\x20is\x20active.'},'gas_exceeded':{'error_code':'gas_exceeded','strategy':'adjust_params','max_attempts':0x3,'automation':'semi','detail':'Gas\x20budget\x20exceeded.\x201.\x20Increase\x20the\x20gas_budget\x20parameter\x202.\x20Reduce\x20the\x20operation\x20size\x20(fewer\x20objects\x20per\x20transaction)\x203.\x20Retry\x20the\x20original\x20operation','user_prompt':'Gas\x20budget\x20exceeded.\x20Increase\x20the\x20gas\x20budget\x20or\x20reduce\x20the\x20operation\x20size,\x20then\x20retry.'},'insufficient_gas':{'error_code':'insufficient_gas','strategy':'adjust_params','max_attempts':0x1,'automation':'semi','detail':'Gas\x20exhausted\x20—\x20the\x20transaction\x20failed\x20deterministically\x20and\x20did\x20NOT\x20commit\x20on-chain\x20(no\x20state\x20changed;\x20commit-state\x20verification\x20is\x20NOT\x20needed).\x201.\x20Raise\x20the\x20gas_budget\x20parameter\x20above\x20the\x20failed\x20transaction\x27s\x20gas_used\x202.\x20If\x20the\x20account\x20balance\x20cannot\x20cover\x20any\x20budget,\x20fund\x20the\x20signing\x20account\x20with\x20gas\x20tokens\x20first\x203.\x20Resubmit\x20as\x20a\x20FRESH\x20call\x20—\x20do\x20NOT\x20replay\x20the\x20same\x20transaction','user_prompt':'The\x20transaction\x20ran\x20out\x20of\x20gas\x20and\x20did\x20not\x20commit\x20on-chain.\x20Increase\x20the\x20gas\x20budget\x20(or\x20fund\x20the\x20account\x20with\x20gas)\x20and\x20submit\x20a\x20fresh\x20transaction\x20—\x20retrying\x20unchanged\x20will\x20fail\x20the\x20same\x20way.'},'bcs_error':{'error_code':'bcs_error','strategy':'adjust_params','max_attempts':0x2,'automation':'semi','detail':'BCS\x20serialization/deserialization\x20error\x20—\x20a\x20parameter\x20does\x20not\x20match\x20the\x20expected\x20type/structure.\x201.\x20Query\x20the\x20operation\x20schema\x20(schema_query)\x202.\x20Fix\x20the\x20offending\x20parameter\x20type\x20(e.g.\x20BigInt\x20vs\x20number,\x20vector\x20element\x20type)\x203.\x20Retry','user_prompt':'A\x20parameter\x20failed\x20serialization.\x20Check\x20the\x20parameter\x20types\x20against\x20the\x20schema\x20and\x20retry.'},'signature_error':{'error_code':'signature_error','strategy':'switch_account','max_attempts':0x2,'automation':'semi','detail':'Signature\x20verification\x20failed.\x201.\x20Verify\x20the\x20account\x20is\x20not\x20suspended\x202.\x20Check\x20the\x20network\x20matches\x20the\x20account\x27s\x203.\x20Switch\x20to\x20a\x20healthy\x20account\x20and\x20retry','user_prompt':'Signature\x20verification\x20failed.\x20The\x20account\x20may\x20be\x20suspended\x20or\x20misconfigured.\x20Switch\x20accounts\x20or\x20check\x20the\x20configuration\x20and\x20retry.'},'config_error':{'error_code':'config_error','strategy':'escalate_human','max_attempts':0x1,'automation':'manual','detail':'Local\x20configuration\x20error\x20(network\x20not\x20specified,\x20persistent\x20storage\x20not\x20set).\x201.\x20Show\x20the\x20user\x20which\x20configuration\x20is\x20missing\x202.\x20Guide\x20the\x20user\x20through\x20the\x20account_operation/config\x20setup\x203.\x20Retry\x20after\x20the\x20user\x20fixes\x20it','user_prompt':'Local\x20configuration\x20is\x20incomplete.\x20Please\x20finish\x20the\x20account/network\x20setup\x20and\x20retry.'},'wip_verification_failed':{'error_code':'wip_verification_failed','strategy':'adjust_params','max_attempts':0x2,'automation':'semi','detail':'WIP\x20file\x20not\x20publicly\x20reachable\x20/\x20hash\x20mismatch.\x201.\x20Upload\x20via\x20the\x20wip\x20storage\x20service\x20(wip_file\x20type=\x27upload\x27\x20—\x20official\x20free\x20store\x20or\x20storage=\x27custom\x27)\x202.\x20Or\x20deploy\x20to\x20a\x20public\x20URL\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20own\x20site)\x203.\x20Update\x20the\x20sale\x27s\x20wip\x20URL\x204.\x20Re-run\x20the\x20operation','user_prompt':'The\x20WIP\x20file\x20could\x20not\x20be\x20verified\x20from\x20a\x20public\x20URL.\x20Upload\x20it\x20with\x20wip_file\x20type=\x27upload\x27\x20(official\x20free\x20store\x20or\x20your\x20own\x20service)\x20or\x20deploy\x20it\x20(GitHub\x20Pages\x20/\x20IPFS),\x20update\x20the\x20sale\x27s\x20WIP\x20URL,\x20and\x20retry.'},'wip_storage_unavailable':{'error_code':'wip_storage_unavailable','strategy':'retry','max_attempts':0x3,'automation':'full','detail':'Transient\x20wip\x20storage\x20transport\x20failure.\x201.\x20Retry\x20the\x20same\x20request\x20with\x20bounded\x20backoff\x202.\x20Large\x20WIP\x20files\x20are\x20network-sensitive:\x20compress\x20images\x20before\x20generate\x20(each\x20image\x20<=\x202MB,\x20total\x20<=\x2010MB)\x203.\x20Check\x20connectivity\x20to\x20the\x20storage\x20base\x20URL\x20if\x20retries\x20keep\x20failing','user_prompt':'The\x20wip\x20storage\x20request\x20failed\x20due\x20to\x20a\x20network\x20problem.\x20Retry\x20the\x20upload;\x20if\x20it\x20keeps\x20failing,\x20reduce\x20the\x20file\x20size\x20or\x20check\x20connectivity.'},'wip_storage_rejected':{'error_code':'wip_storage_rejected','strategy':'adjust_params','max_attempts':0x1,'automation':'semi','detail':'WIP\x20storage\x20service\x20rejected\x20the\x20request\x20(HTTP\x204xx\x20—\x20deterministic\x20client-side\x20fault,\x20retrying\x20unchanged\x20fails\x20identically).\x20400:\x20malformed\x20body\x20or\x20failed\x20WIP\x20validation\x20—\x20re-generate\x20via\x20wip_file\x20type=\x27generate\x27\x20401:\x20re-sign\x20with\x20a\x20fresh\x20nonce\x20inside\x20the\x20timestamp\x20window\x20403:\x20check\x20storage\x20service\x20configuration\x20404:\x20file\x20does\x20not\x20exist\x20—\x20re-upload\x20409:\x20quota\x20—\x20delete\x20old\x20files\x20via\x20wip_file\x20type=\x27list\x27\x20then\x20delete\x20413:\x20compress\x20images\x20(each\x20<=\x202MB,\x20total\x20<=\x2010MB)\x20and\x20regenerate','user_prompt':'The\x20WIP\x20storage\x20service\x20rejected\x20the\x20request\x20(HTTP\x204xx).\x20Fix\x20the\x20specific\x20fault\x20(re-generate/re-sign/re-upload\x20per\x20the\x20status\x20code)\x20and\x20retry\x20—\x20do\x20not\x20retry\x20unchanged.'},'network_error':{'error_code':'network_error','strategy':'retry','max_attempts':0x5,'automation':'full','detail':'Exponential\x20backoff\x20retry:\x201s\x20/\x202s\x20/\x204s\x20/\x208s\x20/\x2016s.\x20Switch\x20RPC\x20node\x20if\x20available.'},'submission_unknown':{'error_code':'submission_unknown','strategy':'query_and_retry','max_attempts':0x2,'automation':'semi','detail':'Transport-level\x20failure\x20after\x20the\x20request\x20left\x20the\x20client\x20—\x20the\x20submission\x20state\x20is\x20UNKNOWN\x20and\x20the\x20transaction\x20may\x20already\x20be\x20committed.\x20NEVER\x20auto-retry\x20a\x20write\x20here.\x201.\x20Verify\x20commit\x20state\x20on-chain:\x20query_toolkit\x20for\x20the\x20object\x20this\x20call\x20would\x20create/modify\x20(resolve\x20the\x20reference\x20from\x20the\x20call\x27s\x20own\x20arguments),\x20or\x20onchain_events\x20for\x20the\x20sender\x27s\x20recent\x20transactions.\x202.\x20If\x20the\x20expected\x20object\x20EXISTS,\x20adopt\x20it\x20and\x20continue\x20the\x20workflow\x20(the\x20operation\x20succeeded\x20despite\x20the\x20transport\x20error).\x203.\x20If\x20confirmed\x20ABSENT,\x20resubmit\x20the\x20SAME\x20call\x20once\x20—\x20for\x20a\x20FIRST-EVER\x20transaction\x20on\x20a\x20fresh\x20account\x20make\x20that\x20resubmission\x20with\x20env.no_auto_register=true\x20and\x20SAY\x20SO\x20(the\x20SDK\x20silently\x20appends\x20an\x20entity\x20registration\x20to\x20a\x20first\x20business\x20call;\x20if\x20that\x20appended\x20leg\x20was\x20the\x20failing\x20leg\x20the\x20skip\x20lets\x20the\x20call\x20through\x20—\x20ziroom-mn-261013\x20live\x20case;\x20if\x20the\x20resubmission\x20aborts,\x20the\x20envelope\x20now\x20names\x20the\x20abort\x20—\x20re-enable\x20auto\x20registration\x20and\x20retry).\x204.\x20If\x20the\x20reported\x20digest\x20does\x20not\x20resolve\x20or\x20the\x20failure\x20repeats,\x20STOP\x20looping\x20on\x20digest\x20checks\x20and\x20re-run\x20the\x20SAME\x20call\x20with\x20env.dry_run=true\x20—\x20the\x20simulation\x20surfaces\x20the\x20real\x20failure\x20(exact\x20Move\x20abort)\x20without\x20gas\x20or\x20duplicate\x20risk.\x205.\x20Reads\x20are\x20idempotent\x20—\x20retry\x20immediately.\x206.\x20M-K2\x20replay\x20discipline:\x20a\x20FAILED\x20receipt\x20is\x20final\x20—\x20its\x20digest\x20is\x20consumed\x20and\x20replaying\x20the\x20same\x20bytes\x20returns\x20the\x20same\x20failure\x20forever;\x20fix\x20the\x20cause\x20(usually\x20funding)\x20and\x20build\x20a\x20FRESH\x20transaction.\x20Live\x20mainnet\x20incident\x20behind\x20this\x20rule:\x20an\x20order_new\x20-32603\x20\x27did\x20not\x20complete\x27\x20had\x20committed;\x20the\x20blind\x20retry\x20created\x20a\x20second\x20order\x20with\x20a\x20second\x20full\x20escrow\x20and\x20a\x20second\x20stock\x20decrement','user_prompt':'The\x20request\x20failed\x20at\x20transport\x20level\x20but\x20may\x20have\x20already\x20been\x20committed\x20on-chain.\x20Verify\x20whether\x20the\x20expected\x20object\x20exists\x20(query\x20it)\x20before\x20any\x20retry\x20—\x20a\x20blind\x20retry\x20can\x20duplicate\x20the\x20operation\x20(double\x20escrow).\x20For\x20read\x20operations,\x20a\x20plain\x20retry\x20is\x20safe.'},'transaction_expired':{'error_code':'transaction_expired','strategy':'retry','max_attempts':0x3,'automation':'full','detail':'The\x20transaction\x20expired\x20before\x20execution\x20(epoch\x20boundary\x20or\x20validator/gateway\x20outage)\x20—\x20it\x20did\x20NOT\x20land\x20and\x20nothing\x20was\x20committed.\x20Bounded\x20backoff\x20retry:\x2010s\x20/\x2030s\x20/\x2060s,\x20resubmit\x20the\x20SAME\x20call\x20unchanged.\x20If\x20a\x20dry_run\x20passes\x20while\x20the\x20real\x20call\x20keeps\x20failing,\x20the\x20fault\x20is\x20chain-side\x20—\x20wait\x20it\x20out.\x20Verify\x20with\x20onchain_events\x20if\x20unsure.'},'guard_rejected':{'error_code':'guard_rejected','strategy':'fill_submission','max_attempts':0x2,'automation':'semi','detail':'1.\x20Parse\x20Guard\x20table\x20structure\x202.\x20If\x20the\x20Guard\x20defines\x20submission\x20items,\x20fill\x20them\x20and\x20resubmit\x20with\x20call_with_submission\x203.\x20If\x20it\x20defines\x20none,\x20the\x20rule\x20evaluated\x20false\x20—\x20typical\x20causes:\x20a\x20TIME\x20WINDOW\x20(Clock\x20deadline/opening\x20comparison\x20—\x20this\x20call\x20may\x20sit\x20outside\x20the\x20window,\x20and\x20a\x20mis-oriented\x20comparison\x20inverts\x20it:\x20everything\x20inside\x20rejected,\x20everything\x20after\x20admitted)\x20or\x20an\x20IDENTITY\x20condition\x20(signer/state\x20checks\x20—\x20the\x20caller\x20may\x20not\x20be\x20the\x20address\x20the\x20rule\x20expects);\x20adjust\x20the\x20call\x27s\x20parameters\x20or\x20change\x20the\x20Guard\x20(docs#40)\x204.\x20When\x20the\x20failure\x20is\x20passport\x20E_VERIFY_FAILED\x20and\x20a\x20submission\x20was\x20supplied,\x20the\x20response\x20appends\x20a\x20\x27Guard\x20diagnosis\x20(dry-run)\x27\x20line\x20naming\x20the\x20first\x20failing\x20impact\x20guard\x20—\x20fix\x20that\x20guard\x20first\x205.\x20A\x20TIME-window\x20rejection\x20may\x20simply\x20be\x20EARLY:\x20re-run\x20the\x20SAME\x20call\x20with\x20env.dry_run=true\x20to\x20probe\x20the\x20window\x20for\x20free\x20(guard\x20rejections\x20do\x20NOT\x20consume\x20the\x20total\x20retry\x20budget;\x20only\x20the\x20per-code\x20cap\x20of\x202\x20applies)','user_prompt':'Guard\x20verification\x20rejected.\x20If\x20the\x20Guard\x20defines\x20submission\x20items,\x20fill\x20in\x20the\x20required\x20submission\x20data\x20and\x20resubmit;\x20if\x20it\x20defines\x20none,\x20the\x20Guard\x20rule\x20evaluated\x20false\x20—\x20the\x20usual\x20causes\x20are\x20a\x20time\x20window\x20(this\x20call\x20may\x20be\x20outside\x20the\x20Clock\x20deadline/opening\x20window)\x20or\x20an\x20identity\x20condition\x20(the\x20caller\x20is\x20not\x20the\x20address\x20the\x20rule\x20expects);\x20adjust\x20this\x20call\x27s\x20parameters\x20or\x20change\x20the\x20Guard\x20rule.\x20When\x20the\x20response\x20includes\x20a\x20\x27Guard\x20diagnosis\x20(dry-run)\x27\x20line,\x20it\x20names\x20the\x20first\x20failing\x20impact\x20guard\x20—\x20address\x20that\x20guard\x20first.\x20A\x20time-window\x20rejection\x20may\x20simply\x20be\x20early:\x20probe\x20the\x20window\x20with\x20env.dry_run=true\x20(free\x20—\x20guard\x20rejections\x20do\x20not\x20consume\x20the\x20total\x20retry\x20budget).'},'time_lock_not_elapsed':{'error_code':'time_lock_not_elapsed','strategy':'wait_and_retry','max_attempts':0x1,'automation':'semi','detail':'1.\x20Verify\x20Service\x20is\x20paused\x20(bPaused=true).\x20If\x20not,\x20submit\x20pause=true\x20first.\x202.\x20Wait\x20until\x20paused_time\x20+\x20setting_lock_duration\x20<=\x20current\x20clock.\x203.\x20Retry\x20the\x20original\x20operation.\x20Do\x20NOT\x20recreate\x20the\x20object.','user_prompt':'Service\x20setting_lock_duration\x20has\x20not\x20elapsed\x20since\x20the\x20Service\x20was\x20paused.\x20Please\x20pause\x20the\x20Service\x20if\x20it\x20is\x20not\x20already\x20paused,\x20wait\x20for\x20the\x20lock\x20duration\x20to\x20elapse,\x20then\x20retry.'},'immutable_violation':{'error_code':'immutable_violation','strategy':'recreate','max_attempts':0x1,'automation':'semi','detail':'1.\x20Stop\x20modification\x20attempt\x202.\x20Evaluate\x20creating\x20a\x20new\x20object\x20as\x20replacement\x203.\x20Re-plan\x20affected\x20phases','user_prompt':'Cannot\x20modify\x20an\x20immutable\x20object.\x20A\x20new\x20object\x20must\x20be\x20created\x20as\x20a\x20replacement.\x20Confirm\x20to\x20proceed\x20with\x20recreation.'},'permission_denied':{'error_code':'permission_denied','strategy':'switch_account','max_attempts':0x2,'automation':'semi','detail':'1.\x20Query\x20object\x27s\x20permission_guard\x202.\x20List\x20accounts\x20with\x20permission\x203.\x20Switch\x20account\x20or\x20prompt\x20user\x20to\x20add\x20permission','user_prompt':'Current\x20account\x20lacks\x20permission\x20for\x20this\x20operation.\x20Switch\x20to\x20an\x20authorized\x20account\x20or\x20update\x20the\x20Permission\x20object.'},'object_not_found':{'error_code':'object_not_found','strategy':'query_and_retry','max_attempts':0x3,'automation':'semi','detail':'1.\x20Verify\x20the\x20referenced\x20name/ID\x20spelling\x20(local_mark_list)\x20and\x20that\x20the\x20object\x20exists\x20on\x20the\x20current\x20network\x202.\x20If\x20recently\x20created,\x20re-query\x20the\x20object\x20(may\x20be\x20sync\x20delay)\x203.\x20If\x20truly\x20absent,\x20search\x20for\x20similar\x20objects\x204.\x20Prompt\x20user\x20to\x20reselect','user_prompt':'Referenced\x20object\x20not\x20found.\x20First\x20verify\x20the\x20name/ID\x20spelling\x20and\x20that\x20the\x20object\x20exists\x20on\x20the\x20current\x20network;\x20if\x20it\x20was\x20created\x20recently,\x20this\x20may\x20be\x20a\x20synchronization\x20delay\x20—\x20retry.\x20If\x20the\x20issue\x20persists,\x20please\x20select\x20a\x20valid\x20object.'},'state_conflict':{'error_code':'state_conflict','strategy':'adjust_params','max_attempts':0x2,'automation':'full','detail':'1.\x20Query\x20object\x27s\x20current\x20true\x20state\x202.\x20Update\x20ODG\x20status\x20annotations\x203.\x20Adjust\x20subsequent\x20operations\x20(e.g.,\x20skip\x20completed\x20steps)'},'invalid_parameter':{'error_code':'invalid_parameter','strategy':'adjust_params','max_attempts':0x2,'automation':'semi','detail':'1.\x20Query\x20the\x20relevant\x20schema\x202.\x20Auto-fix\x20obvious\x20errors\x20(e.g.,\x20BigInt\x20vs\x20string)\x203.\x20If\x20unfixable,\x20prompt\x20user','user_prompt':'Parameter\x20validation\x20failed.\x20Please\x20check\x20the\x20parameter\x20types\x20and\x20values\x20against\x20the\x20schema\x20and\x20retry.'},'move_abort_unmapped':{'error_code':'move_abort_unmapped','strategy':'stop','max_attempts':0x1,'automation':'manual','detail':'The\x20chain\x27s\x20business\x20logic\x20aborted\x20and\x20the\x20(module,\x20abort\x20code)\x20pair\x20has\x20no\x20local\x20mapping.\x20Read\x20the\x20module\x20and\x20abort\x20code\x20from\x20move_abort_info\x20/\x20the\x20message\x20(rendered\x20as\x20\x27abort\x20(N)\x27),\x20resolve\x20their\x20meaning\x20from\x20the\x20module\x27s\x20documentation\x20or\x20the\x20wowok-tools\x20Skill,\x20fix\x20the\x20business\x20cause,\x20and\x20issue\x20a\x20NEW\x20call.\x20Do\x20NOT\x20restart\x20the\x20server\x20and\x20do\x20NOT\x20retry\x20the\x20identical\x20call\x20—\x20it\x20aborts\x20deterministically.','user_prompt':'The\x20operation\x20was\x20rejected\x20by\x20the\x20chain\x27s\x20business\x20logic\x20and\x20its\x20abort\x20code\x20is\x20not\x20mapped\x20locally.\x20The\x20module\x20name\x20and\x20abort\x20code\x20in\x20the\x20error\x20are\x20authoritative\x20—\x20review\x20them\x20(and\x20the\x20object\x20state\x20via\x20query_toolkit)\x20before\x20adjusting\x20anything.'},'missing_data':{'error_code':'missing_data','strategy':'adjust_params','max_attempts':0x2,'automation':'semi','detail':'A\x20guard\x20rule\x20read\x20a\x20keyed\x20table\x20row\x20that\x20does\x20NOT\x20exist\x20(repository.data\x20/\x20oracle\x20entry)\x20and\x20the\x20verifier\x20surfaced\x20it\x20as\x20a\x20location-only\x20fault\x20inside\x20the\x20passport\x20module\x20—\x20no\x20abort\x20code,\x20because\x20the\x20framework\x20cannot\x20express\x20\x27row\x20absent\x27\x20as\x20an\x20abort.\x20This\x20is\x20a\x20DATA\x20problem:\x201.\x20Identify\x20the\x20repository\x20and\x20key\x20the\x20guard\x20rule\x20reads\x20(guard2file\x20/\x20analyze_guard_semantics\x20on\x20the\x20guard\x20source)\x202.\x20Have\x20the\x20row\x27s\x20producer\x20write\x20it\x20(e.g.\x20an\x20oracle\x20timestamp\x20like\x20checkin_ts),\x20or\x20add\x20it\x20with\x20repository\x20data_add\x20(data_add.name\x20must\x20match\x20a\x20policy\x20rule\x20name)\x203.\x20Retry\x20the\x20SAME\x20call\x20unchanged\x20—\x20a\x20dry_run\x20that\x20turns\x20clean\x20after\x20the\x20row\x20exists\x20confirms\x20the\x20diagnosis','user_prompt':'A\x20guard\x20rule\x20references\x20a\x20data\x20row\x20that\x20has\x20not\x20been\x20written\x20yet\x20(location-only\x20fault\x20inside\x20the\x20passport\x20module\x20—\x20NOT\x20a\x20network\x20problem).\x20Identify\x20the\x20repository\x20row\x20the\x20guard\x20expects\x20(guard2file\x20/\x20analyze_guard_semantics),\x20write\x20it\x20with\x20repository\x20data_add\x20(or\x20let\x20its\x20producer\x20write\x20it),\x20then\x20retry.'},'unknown':{'error_code':'unknown','strategy':'escalate_human','max_attempts':0x1,'automation':'manual','detail':'1.\x20Report\x20full\x20error\x20context\x20to\x20the\x20user\x202.\x20Escalate\x20to\x20human\x20intervention\x203.\x20Flag\x20for\x20error-classification\x20rule\x20addition','user_prompt':'An\x20unclassified\x20error\x20occurred.\x20Please\x20review\x20the\x20error\x20details\x20and\x20contact\x20support\x20if\x20needed.'}};const operationAttempts=new Map();function getAttemptCount(a,b){const c=operationAttempts['get'](a);if(!c)return 0x0;return c['get'](b)??0x0;}function incrementAttempt(a,b){!operationAttempts['has'](a)&&operationAttempts['set'](a,new Map());const c=operationAttempts['get'](a),d=(c['get'](b)??0x0)+0x1;return c['set'](b,d),d;}const BUDGET_EXEMPT_CODES=new Set(['guard_rejected']);function getBudgetAttempts(a){const b=operationAttempts['get'](a);if(!b)return 0x0;let c=0x0;for(const [d,e]of b){if(!BUDGET_EXEMPT_CODES['has'](d))c+=e;}return c;}export function resetAttempts(a){operationAttempts['delete'](a);}export function recover(a,b,c){const d=RECOVERY_RULES[a]??RECOVERY_RULES['unknown'],e=0x5,f=getBudgetAttempts(b),g=getAttemptCount(b,a);if(d['max_attempts']<=0x1||d['strategy']==='stop')return{'strategy':d['strategy'],'should_retry':![],'max_attempts':d['max_attempts'],'current_attempt':g,'adjusted_params':d['adjusted_params'],'user_prompt':d['user_prompt'],'detail':d['detail']};if(f>=e)return{'strategy':'stop','should_retry':![],'max_attempts':e,'current_attempt':f,'detail':'Total\x20retry\x20limit\x20('+e+')\x20reached\x20for\x20operation\x20'+b+'.\x20Escalating\x20to\x20human\x20intervention.\x20Attempts\x20recorded\x20for\x20this\x20operation\x20id:\x20'+([...(operationAttempts['get'](b)??new Map())['entries']()]['map'](([i,j])=>i+':'+j)['join'](',\x20')||'none')+'.','user_prompt':'Maximum\x20retry\x20attempts\x20reached.\x20Manual\x20intervention\x20required.'};if(g>=d['max_attempts'])return{'strategy':'escalate_human','should_retry':![],'max_attempts':d['max_attempts'],'current_attempt':g,'detail':'Per-error-code\x20retry\x20limit\x20('+d['max_attempts']+')\x20reached\x20for\x20'+a+'.\x20Escalating\x20to\x20human.','user_prompt':'Recovery\x20attempts\x20for\x20'+a+'\x20exhausted.\x20Manual\x20intervention\x20required.'};const h=incrementAttempt(b,a);return{'strategy':d['strategy'],'should_retry':d['automation']==='full'||h<d['max_attempts'],'max_attempts':d['max_attempts'],'current_attempt':h,'adjusted_params':d['adjusted_params'],'user_prompt':d['user_prompt'],'detail':d['detail']};}export function getBackoffDelay(a){return Math['pow'](0x2,a-0x1)*0x3e8;}
@@ -1,6 +1,6 @@
1
1
  import type { IndustryScenario } from "../evaluation/capability.js";
2
2
  import type { PersonaRole } from "../persona/types.js";
3
- export type IntentTargetType = "NewOrderEvent" | "ProgressEvent" | "DemandPresentEvent" | "DemandFeedbackEvent" | "DemandChangedEvent" | "ServiceEvent" | "ArbitrationEvent" | "NewEntityEvent" | "ArbEvent" | "VoteEvent" | "FeedbackEvent" | "AllocationEvent" | "TreasuryEvent" | "RewardClaimEvent" | "RewardFundEvent" | "NewPaymentEvent";
3
+ export type IntentTargetType = "NewOrderEvent" | "ProgressEvent" | "DemandPresentEvent" | "DemandFeedbackEvent" | "DemandChangedEvent" | "ServiceEvent" | "ArbitrationEvent" | "NewEntityEvent" | "ArbEvent" | "VoteEvent" | "FeedbackEvent" | "AllocationEvent" | "TreasuryEvent" | "RewardClaimEvent" | "RewardFundEvent" | "RewardWithdrawEvent" | "NewPaymentEvent" | "PermissionChangedEvent" | "RepositoryDataOverwriteEvent";
4
4
  export interface IntentRecord {
5
5
  id: string;
6
6
  intent: string;
@@ -1 +1 @@
1
- export const INTENT_VERSION=0x1;export const INTENT_MAX_PER_SCOPE=0x32;export const ALL_INTENT_TARGET_TYPES=['NewOrderEvent','ProgressEvent','DemandPresentEvent','DemandFeedbackEvent','DemandChangedEvent','ServiceEvent','ArbitrationEvent','NewEntityEvent','ArbEvent','VoteEvent','FeedbackEvent','AllocationEvent','TreasuryEvent','RewardClaimEvent','RewardFundEvent','NewPaymentEvent'];
1
+ export const INTENT_VERSION=0x1;export const INTENT_MAX_PER_SCOPE=0x32;export const ALL_INTENT_TARGET_TYPES=['NewOrderEvent','ProgressEvent','DemandPresentEvent','DemandFeedbackEvent','DemandChangedEvent','ServiceEvent','ArbitrationEvent','NewEntityEvent','ArbEvent','VoteEvent','FeedbackEvent','AllocationEvent','TreasuryEvent','RewardClaimEvent','RewardFundEvent','RewardWithdrawEvent','NewPaymentEvent','PermissionChangedEvent','RepositoryDataOverwriteEvent'];
@@ -1,5 +1,5 @@
1
1
  import type { ScopeSnapshot } from "../monitor/types.js";
2
- import { type PaymentDetectorDeps, type ProgressDetectorDeps, type SettlementDetectorDeps } from "./detectors.js";
2
+ import { type PaymentDetectorDeps, type ProgressDetectorDeps, type SettlementDetectorDeps, type TimeoutDetectorDeps } from "./detectors.js";
3
3
  import { type KeeperStore } from "./KeeperStore.js";
4
4
  import { type KeeperTask } from "./types.js";
5
5
  export interface KeeperExecutionOutcome {
@@ -12,6 +12,7 @@ export interface KeeperScanDeps {
12
12
  payment: PaymentDetectorDeps;
13
13
  progress: ProgressDetectorDeps;
14
14
  settlement: SettlementDetectorDeps;
15
+ timeout: TimeoutDetectorDeps;
15
16
  execute(input: {
16
17
  operation_type: string;
17
18
  data: Record<string, unknown>;
@@ -1 +1 @@
1
- import{handleOnchainOperations}from'../tools/handlers/onchain.js';import{detectPaymentUnclaimed,detectProgressActionable,detectSettlementPending,realPaymentDetectorDeps,realProgressDetectorDeps,realSettlementDetectorDeps}from'./detectors.js';import{keeperStore}from'./KeeperStore.js';import{AUTO_EXECUTABLE_DETECTORS}from'./types.js';async function defaultExecute(a){try{const b=await handleOnchainOperations({'operation_type':a['operation_type'],'data':a['data'],'env':{'account':a['account'],'network':a['network'],'confirmed':!![],'user_intent_phrases':['keeper\x20auto-execute\x20via\x20'+a['via']]}}),c=b?.['structuredContent']?.['result'];if(c?.['type']==='transaction'&&typeof c?.['digest']==='string')return{'ok':!![],'digest':c['digest']};const d=c?.['type']==='error'&&typeof c?.['error']==='string'?c['error']:typeof b?.['structuredContent']?.['message']==='string'?b['structuredContent']['message']:'execution\x20did\x20not\x20produce\x20a\x20transaction';return{'ok':![],'error':String(d)['slice'](0x0,0x1f4)};}catch(f){return{'ok':![],'error':String(f?.['message']??f)['slice'](0x0,0x1f4)};}}export function realKeeperScanDeps(){return{'store':keeperStore,'payment':realPaymentDetectorDeps(),'progress':realProgressDetectorDeps(),'settlement':realSettlementDetectorDeps(),'execute':defaultExecute,'now':()=>Date['now'](),'logger':a=>console['error']('[keeper]\x20'+a)};}export async function runKeeperScan(a,b,c,d){const f=c['now'](),g={'scanned':![],'opened':0x0,'refreshed':0x0,'revived':0x0,'superseded':0x0,'auto_executed':0x0,'auto_failed':0x0,'duration_ms':0x0};try{const h=await c['store']['getConfig'](a);if(!h['enabled'])return g['reason']='disabled',g;const i=await c['store']['getLastScanAt'](a);if(!d?.['force']&&c['now']()-i<h['scan_interval_ms'])return g['reason']='interval',g;await c['store']['setLastScanAt'](a,c['now']()),g['scanned']=!![];if(h['detectors']['payment_unclaimed'])try{const l=await detectPaymentUnclaimed((b['accounts']??[])['slice'](0x0,h['max_scan_objects']),a,c['payment']),m=await c['store']['upsertDesired'](a,'payment_unclaimed',l,c['now']());g['opened']+=m['opened'],g['refreshed']+=m['refreshed'],g['revived']+=m['revived'],g['superseded']+=m['superseded'];}catch(n){c['logger']('scan\x20'+a+':\x20payment_unclaimed\x20detector\x20failed:\x20'+String(n?.['message']??n));}if(h['detectors']['progress_actionable'])try{const o=await detectProgressActionable(b,a,c['progress'],h['max_scan_objects']),p=await c['store']['upsertDesired'](a,'progress_actionable',o,c['now']());g['opened']+=p['opened'],g['refreshed']+=p['refreshed'],g['revived']+=p['revived'],g['superseded']+=p['superseded'];}catch(q){c['logger']('scan\x20'+a+':\x20progress_actionable\x20detector\x20failed:\x20'+String(q?.['message']??q));}if(h['detectors']['settlement_pending'])try{const s=await detectSettlementPending(b,a,c['settlement'],h['max_scan_objects']),t=await c['store']['upsertDesired'](a,'settlement_pending',s,c['now']());g['opened']+=t['opened'],g['refreshed']+=t['refreshed'],g['revived']+=t['revived'],g['superseded']+=t['superseded'];}catch(u){c['logger']('scan\x20'+a+':\x20settlement_pending\x20detector\x20failed:\x20'+String(u?.['message']??u));}const j=await c['store']['listTasks'](a,{'status':'pending'});let k=h['max_auto_execute_per_scan'];for(const v of j){if(k<=0x0)break;if(!v['operation'])continue;if(!AUTO_EXECUTABLE_DETECTORS['includes'](v['detector']))continue;if(v['last_auto_attempt_at']&&c['now']()-v['last_auto_attempt_at']<h['auto_retry_cooldown_ms'])continue;const w=await c['store']['matchingAutoRules'](a,v['detector'],v['beneficiary']),x=w[0x0];if(!x)continue;k--,await c['store']['markAutoAttempt'](a,v['id'],c['now']());const y=await c['execute']({'operation_type':v['operation']['operation_type'],'data':v['operation']['data'],'account':v['beneficiary'],'network':a,'via':'rule\x20'+x['id']});y['ok']?(await c['store']['resolveTask'](a,v['id'],'auto_executed',c['now'](),y['digest']?'tx\x20'+y['digest']:'executed',x['id']),g['auto_executed']++,c['logger']('auto-executed\x20'+v['dedupe_key']+'\x20via\x20rule\x20'+x['id']+'\x20('+(y['digest']??'no\x20digest')+')')):(await c['store']['resolveTask'](a,v['id'],'execute_failed',c['now'](),y['error']??'unknown\x20execution\x20error',x['id']),g['auto_failed']++,c['logger']('auto-execute\x20failed\x20for\x20'+v['dedupe_key']+':\x20'+(y['error']??'unknown')));}return g;}catch(z){return c['logger']('scan\x20'+a+'\x20failed:\x20'+String(z?.['message']??z)),g['reason']='error',g;}finally{g['duration_ms']=c['now']()-f;}}export async function executeKeeperTask(a,b,c){if(!b['operation'])return{'ok':![],'error':'This\x20task\x20is\x20reminder-only\x20(no\x20keeper-executable\x20operation).\x20'+'Follow\x20its\x20detail\x20text\x20—\x20progress\x20forwards\x20are\x20advanced\x20via\x20workflow_operation.'};const d=await c['execute']({'operation_type':b['operation']['operation_type'],'data':b['operation']['data'],'account':b['beneficiary'],'network':a,'via':'manual'});return d['ok']?await c['store']['resolveTask'](a,b['id'],'manual_executed',c['now'](),d['digest']?'tx\x20'+d['digest']:'executed'):await c['store']['resolveTask'](a,b['id'],'execute_failed',c['now'](),d['error']),d;}
1
+ import{handleOnchainOperations}from'../tools/handlers/onchain.js';import{detectPaymentUnclaimed,detectProgressActionable,detectSettlementPending,detectTimeoutIntermediate,realPaymentDetectorDeps,realProgressDetectorDeps,realSettlementDetectorDeps,realTimeoutDetectorDeps}from'./detectors.js';import{keeperStore}from'./KeeperStore.js';import{AUTO_EXECUTABLE_DETECTORS}from'./types.js';async function defaultExecute(a){try{const b=await handleOnchainOperations({'operation_type':a['operation_type'],'data':a['data'],'env':{'account':a['account'],'network':a['network'],'confirmed':!![],'user_intent_phrases':['keeper\x20auto-execute\x20via\x20'+a['via']]}}),c=b?.['structuredContent']?.['result'];if(c?.['type']==='transaction'&&typeof c?.['digest']==='string')return{'ok':!![],'digest':c['digest']};const d=c?.['type']==='error'&&typeof c?.['error']==='string'?c['error']:typeof b?.['structuredContent']?.['message']==='string'?b['structuredContent']['message']:'execution\x20did\x20not\x20produce\x20a\x20transaction';return{'ok':![],'error':String(d)['slice'](0x0,0x1f4)};}catch(f){return{'ok':![],'error':String(f?.['message']??f)['slice'](0x0,0x1f4)};}}export function realKeeperScanDeps(){return{'store':keeperStore,'payment':realPaymentDetectorDeps(),'progress':realProgressDetectorDeps(),'settlement':realSettlementDetectorDeps(),'timeout':realTimeoutDetectorDeps(),'execute':defaultExecute,'now':()=>Date['now'](),'logger':a=>console['error']('[keeper]\x20'+a)};}export async function runKeeperScan(a,b,c,d){const f=c['now'](),g={'scanned':![],'opened':0x0,'refreshed':0x0,'revived':0x0,'superseded':0x0,'auto_executed':0x0,'auto_failed':0x0,'duration_ms':0x0};try{const h=await c['store']['getConfig'](a);if(!h['enabled'])return g['reason']='disabled',g;const i=await c['store']['getLastScanAt'](a);if(!d?.['force']&&c['now']()-i<h['scan_interval_ms'])return g['reason']='interval',g;await c['store']['setLastScanAt'](a,c['now']()),g['scanned']=!![];if(h['detectors']['payment_unclaimed'])try{const l=await detectPaymentUnclaimed((b['accounts']??[])['slice'](0x0,h['max_scan_objects']),a,c['payment']),m=await c['store']['upsertDesired'](a,'payment_unclaimed',l,c['now']());g['opened']+=m['opened'],g['refreshed']+=m['refreshed'],g['revived']+=m['revived'],g['superseded']+=m['superseded'];}catch(n){c['logger']('scan\x20'+a+':\x20payment_unclaimed\x20detector\x20failed:\x20'+String(n?.['message']??n));}if(h['detectors']['progress_actionable'])try{const o=await detectProgressActionable(b,a,c['progress'],h['max_scan_objects']),p=await c['store']['upsertDesired'](a,'progress_actionable',o,c['now']());g['opened']+=p['opened'],g['refreshed']+=p['refreshed'],g['revived']+=p['revived'],g['superseded']+=p['superseded'];}catch(q){c['logger']('scan\x20'+a+':\x20progress_actionable\x20detector\x20failed:\x20'+String(q?.['message']??q));}if(h['detectors']['settlement_pending'])try{const s=await detectSettlementPending(b,a,c['settlement'],h['max_scan_objects']),t=await c['store']['upsertDesired'](a,'settlement_pending',s,c['now']());g['opened']+=t['opened'],g['refreshed']+=t['refreshed'],g['revived']+=t['revived'],g['superseded']+=t['superseded'];}catch(u){c['logger']('scan\x20'+a+':\x20settlement_pending\x20detector\x20failed:\x20'+String(u?.['message']??u));}if(h['detectors']['timeout_intermediate'])try{const v=await detectTimeoutIntermediate(b,a,c['timeout'],h['max_scan_objects'],h['timeout_intermediate_ms']),w=await c['store']['upsertDesired'](a,'timeout_intermediate',v,c['now']());g['opened']+=w['opened'],g['refreshed']+=w['refreshed'],g['revived']+=w['revived'],g['superseded']+=w['superseded'];}catch(x){c['logger']('scan\x20'+a+':\x20timeout_intermediate\x20detector\x20failed:\x20'+String(x?.['message']??x));}const j=await c['store']['listTasks'](a,{'status':'pending'});let k=h['max_auto_execute_per_scan'];for(const y of j){if(k<=0x0)break;if(!y['operation'])continue;if(!AUTO_EXECUTABLE_DETECTORS['includes'](y['detector']))continue;if(y['last_auto_attempt_at']&&c['now']()-y['last_auto_attempt_at']<h['auto_retry_cooldown_ms'])continue;const z=await c['store']['matchingAutoRules'](a,y['detector'],y['beneficiary']),A=z[0x0];if(!A)continue;k--,await c['store']['markAutoAttempt'](a,y['id'],c['now']());const B=await c['execute']({'operation_type':y['operation']['operation_type'],'data':y['operation']['data'],'account':y['beneficiary'],'network':a,'via':'rule\x20'+A['id']});B['ok']?(await c['store']['resolveTask'](a,y['id'],'auto_executed',c['now'](),B['digest']?'tx\x20'+B['digest']:'executed',A['id']),g['auto_executed']++,c['logger']('auto-executed\x20'+y['dedupe_key']+'\x20via\x20rule\x20'+A['id']+'\x20('+(B['digest']??'no\x20digest')+')')):(await c['store']['resolveTask'](a,y['id'],'execute_failed',c['now'](),B['error']??'unknown\x20execution\x20error',A['id']),g['auto_failed']++,c['logger']('auto-execute\x20failed\x20for\x20'+y['dedupe_key']+':\x20'+(B['error']??'unknown')));}return g;}catch(C){return c['logger']('scan\x20'+a+'\x20failed:\x20'+String(C?.['message']??C)),g['reason']='error',g;}finally{g['duration_ms']=c['now']()-f;}}export async function executeKeeperTask(a,b,c){if(!b['operation'])return{'ok':![],'error':'This\x20task\x20is\x20reminder-only\x20(no\x20keeper-executable\x20operation).\x20'+'Follow\x20its\x20detail\x20text\x20—\x20progress\x20forwards\x20are\x20advanced\x20via\x20workflow_operation.'};const d=await c['execute']({'operation_type':b['operation']['operation_type'],'data':b['operation']['data'],'account':b['beneficiary'],'network':a,'via':'manual'});return d['ok']?await c['store']['resolveTask'](a,b['id'],'manual_executed',c['now'](),d['digest']?'tx\x20'+d['digest']:'executed'):await c['store']['resolveTask'](a,b['id'],'execute_failed',c['now'](),d['error']),d;}
@@ -1 +1 @@
1
- import{describe,expect,it}from'vitest';import{KeeperStore}from'./KeeperStore.js';import{detectPaymentUnclaimed,detectProgressActionable,detectSettlementPending}from'./detectors.js';import{executeKeeperTask,runKeeperScan}from'./KeeperScan.js';import{clampKeeperConfig,defaultKeeperConfig,KEEPER_MIN}from'./types.js';const NET='testnet',ACCT='0xaaa111',OTHER='0xbbb222';function memStorage(){const a=new Map();return{'get':async b=>a['get'](b),'put':async(b,c)=>void a['set'](b,c)};}function makeStore(){return new KeeperStore(memStorage());}function paymentItem(a,b,c=0x1){return{'dedupe_key':'payment_unclaimed:'+a,'detector':'payment_unclaimed','beneficiary':a,'operation':{'operation_type':'payment','data':{'receive':!![]}},'title':'Unclaimed\x20funds\x20—\x20'+b+'\x20waiting','state_fingerprint':c+':'+b['toString']()};}function makeScope(a){return{'version':0x1,'resolved_at':0x0,'accounts':[ACCT],'permissions':[],'managed_objects':[],'services':[],'orders':[],'order_children':[],'focus':[],'index':{},...a};}describe('keeper\x20config',()=>{it('returns\x20safe\x20defaults:\x20reminders\x20ON,\x20auto\x20rules\x20none',async()=>{const a=makeStore(),b=await a['getConfig'](NET);expect(b['enabled'])['toBe'](!![]),expect(b['detectors']['payment_unclaimed'])['toBe'](!![]),expect(b['detectors']['progress_actionable'])['toBe'](!![]),expect(await a['listRules'](NET))['toEqual']([]);}),it('config_set\x20patch\x20merges\x20detectors\x20individually',async()=>{const a=makeStore(),b=await a['saveConfig'](NET,{'detectors':{'payment_unclaimed':![]}});expect(b['detectors']['payment_unclaimed'])['toBe'](![]),expect(b['detectors']['progress_actionable'])['toBe'](!![]);const c=await a['getConfig'](NET);expect(c['detectors']['payment_unclaimed'])['toBe'](![]),expect(c['detectors']['progress_actionable'])['toBe'](!![]);}),it('clamps\x20numeric\x20bounds\x20(cost/gas\x20guards)',()=>{const a=clampKeeperConfig({...defaultKeeperConfig(),'scan_interval_ms':0x1,'max_scan_objects':0x0,'max_auto_execute_per_scan':0x0,'auto_retry_cooldown_ms':0x0});expect(a['scan_interval_ms'])['toBe'](KEEPER_MIN['scan_interval_ms']),expect(a['max_scan_objects'])['toBe'](KEEPER_MIN['max_scan_objects']),expect(a['max_auto_execute_per_scan'])['toBe'](KEEPER_MIN['max_auto_execute_per_scan']),expect(a['auto_retry_cooldown_ms'])['toBe'](KEEPER_MIN['auto_retry_cooldown_ms']);});}),describe('keeper\x20rules',()=>{const a=b=>({'id':'krule_1','enabled':!![],'detector':'payment_unclaimed','accounts':[],'auto_execute':!![],'created_at':0x0,...b});it('matchingAutoRules\x20honors\x20enabled\x20/\x20auto_execute\x20/\x20account\x20coverage',async()=>{const b=makeStore();await b['upsertRule'](NET,a()),expect(await b['matchingAutoRules'](NET,'payment_unclaimed',ACCT))['toHaveLength'](0x1),expect(await b['matchingAutoRules'](NET,'progress_actionable',ACCT))['toHaveLength'](0x0),await b['upsertRule'](NET,a({'id':'krule_2','accounts':[OTHER['toUpperCase']()]})),expect(await b['matchingAutoRules'](NET,'payment_unclaimed',ACCT))['toHaveLength'](0x1),expect(await b['matchingAutoRules'](NET,'payment_unclaimed',OTHER))['toHaveLength'](0x2),await b['upsertRule'](NET,a({'id':'krule_3','enabled':![]})),await b['upsertRule'](NET,a({'id':'krule_4','auto_execute':![]}));const c=await b['matchingAutoRules'](NET,'payment_unclaimed',OTHER);expect(c['map'](d=>d['id'])['sort']())['toEqual'](['krule_1','krule_2']);});}),describe('KeeperStore.upsertDesired',()=>{it('opens\x20new\x20tasks,\x20refreshes\x20on\x20fingerprint\x20change,\x20no\x20churn\x20when\x20identical',async()=>{const a=makeStore();let b=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8);expect(b)['toEqual']({'opened':0x1,'refreshed':0x0,'revived':0x0,'superseded':0x0}),b=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x7d0),expect(b)['toEqual']({'opened':0x0,'refreshed':0x0,'revived':0x0,'superseded':0x0}),b=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0xfan)],0xbb8),expect(b)['toEqual']({'opened':0x0,'refreshed':0x1,'revived':0x0,'superseded':0x0});const c=(await a['listTasks'](NET))[0x0];expect(c['title'])['toContain']('250'),expect(c['updated_at'])['toBe'](0xbb8);}),it('dismissed\x20stays\x20dismissed\x20for\x20identical\x20state,\x20revives\x20on\x20material\x20change',async()=>{const a=makeStore();await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8);const b=(await a['listTasks'](NET))[0x0];await a['resolveTask'](NET,b['id'],'dismissed',0x5dc,'not\x20now');let c=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x7d0);expect(c['revived'])['toBe'](0x0),expect((await a['getTask'](NET,b['id']))['status'])['toBe']('dismissed'),c=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x190n,0x2)],0xbb8),expect(c['revived'])['toBe'](0x1);const d=await a['getTask'](NET,b['id']);expect(d['status'])['toBe']('pending'),expect(d['resolution'])['toBeUndefined'](),expect(d['resolved_at'])['toBeUndefined']();}),it('executed\x20tasks\x20are\x20terminal\x20—\x20same\x20dedupe_key\x20never\x20re-opens\x20them',async()=>{const a=makeStore();await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8);const b=(await a['listTasks'](NET))[0x0];await a['resolveTask'](NET,b['id'],'auto_executed',0x5dc,'tx\x20ABC','krule_1');const c=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x1f4n)],0x7d0);expect(c)['toEqual']({'opened':0x0,'refreshed':0x0,'revived':0x0,'superseded':0x0});const d=await a['getTask'](NET,b['id']);expect(d['status'])['toBe']('executed'),expect(d['rule_id'])['toBe']('krule_1');}),it('supersedes\x20pending\x20tasks\x20of\x20THIS\x20detector\x20only',async()=>{const a=makeStore();await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8),await a['upsertDesired'](NET,'progress_actionable',[{'dedupe_key':'progress_actionable:0xp1:0xaaa111:shipped|deliver','detector':'progress_actionable','beneficiary':ACCT,'title':'Workflow\x20action\x20available','state_fingerprint':'1:1::named_operator'}],0x3e8);const b=await a['upsertDesired'](NET,'payment_unclaimed',[],0x7d0);expect(b['superseded'])['toBe'](0x1);const c=await a['listTasks'](NET),d=c['find'](f=>f['detector']==='payment_unclaimed'),e=c['find'](f=>f['detector']==='progress_actionable');expect(d['status'])['toBe']('superseded'),expect(d['resolution'])['toBe']('superseded'),expect(e['status'])['toBe']('pending');}),it('execute_failed\x20keeps\x20the\x20task\x20pending\x20with\x20failure\x20bookkeeping',async()=>{const a=makeStore();await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8);const b=(await a['listTasks'](NET))[0x0];await a['resolveTask'](NET,b['id'],'execute_failed',0x1388,'insufficient\x20gas','krule_1');const c=await a['getTask'](NET,b['id']);expect(c['status'])['toBe']('pending'),expect(c['last_auto_attempt_at'])['toBe'](0x1388),expect(c['auto_attempts'])['toBe'](0x1),expect(c['resolution_note'])['toBe']('insufficient\x20gas');});}),describe('detectPaymentUnclaimed',()=>{it('emits\x20a\x20claim-to-self\x20task\x20for\x20accounts\x20with\x20unclaimed\x20wrappers',async()=>{const a=await detectPaymentUnclaimed([ACCT['toUpperCase'](),OTHER,'0xccc333'],NET,{'queryUnclaimed':async c=>{if(c===ACCT)return{'balance':0x64n,'count':0x2,'token_type':'0x2::wow::WOW'};if(c===OTHER)return{'balance':0x0n,'count':0x0};throw new Error('rpc\x20down');},'formatAmount':async()=>'0.0000001\x20WOW'});expect(a)['toHaveLength'](0x1);const b=a[0x0];expect(b['dedupe_key'])['toBe']('payment_unclaimed:'+ACCT),expect(b['beneficiary'])['toBe'](ACCT),expect(b['operation'])['toEqual']({'operation_type':'payment','data':{'receive':!![]}}),expect(b['state_fingerprint'])['toBe']('2:100'),expect(b['title'])['toContain']('0.0000001\x20WOW');}),it('falls\x20back\x20to\x20raw\x20units\x20when\x20formatting\x20fails',async()=>{const a=await detectPaymentUnclaimed([ACCT],NET,{'queryUnclaimed':async()=>({'balance':0x2an,'count':0x1}),'formatAmount':async()=>{throw new Error('no\x20metadata');}});expect(a[0x0]['title'])['toContain']('42\x20(smallest\x20unit)');});}),describe('detectProgressActionable',()=>{const a='0xprog1',b='0xmachine1',c=[{'name':'shipped','pairs':[{'prev_node':'start','threshold':0x1,'forwards':[{'name':'deliver','weight':0x1,'namedOperator':'courier'}]}]}],d=(g=[])=>({'machine':b,'current':'start','session':g,'namedOperator':[{'name':'courier','operators':[ACCT]}]}),e=g=>({'fetchProgressFields':async()=>new Map([[a,g]]),'fetchMachineNodes':async()=>c,'fetchMachinePermissionAddr':async()=>undefined,'fetchPermissionContext':async()=>undefined,'fetchOrderContext':async()=>undefined}),f=makeScope({'order_children':[{'type':'progress','object':a}]});it('routes\x20an\x20actionable\x20forward\x20to\x20its\x20named\x20operator',async()=>{const g=await detectProgressActionable(f,NET,e(d()),0x14);expect(g)['toHaveLength'](0x1),expect(g[0x0]['dedupe_key'])['toBe']('progress_actionable:'+a+':'+ACCT+':shipped|deliver'),expect(g[0x0]['beneficiary'])['toBe'](ACCT),expect(g[0x0]['operation'])['toBeUndefined'](),expect(g[0x0]['detail'])['toContain']('workflow_operation');}),it('omits\x20accomplished\x20forwards\x20(single-operator\x20lock)',async()=>{const g=[{'next_node':'shipped','forwards':[{'forward':'deliver','who':ACCT,'accomplished':!![]}]}],h=await detectProgressActionable(f,NET,e(d(g)),0x14);expect(h)['toHaveLength'](0x0);}),it('restricts\x20a\x20held\x20forward\x20to\x20its\x20holder',async()=>{const g=[{'next_node':'shipped','forwards':[{'forward':'deliver','who':OTHER,'accomplished':![]}]}],h=await detectProgressActionable(f,NET,e(d(g)),0x14);expect(h)['toHaveLength'](0x0);}),it('returns\x20nothing\x20when\x20the\x20batch\x20read\x20fails\x20(fail-safe)',async()=>{const g=await detectProgressActionable(f,NET,{...e(d()),'fetchProgressFields':async()=>{throw new Error('rpc\x20down');}},0x14);expect(g)['toEqual']([]);});}),describe('detectSettlementPending',()=>{const a='0xorder1',b='0xpool1',c='0xprog1',d='0xmachine1',e='0xsvc1',f=i=>[{'name':'paid','pairs':[{'prev_node':'','threshold':0x1,'forwards':[{'name':'settle','weight':0x1}]}]},{'name':i,'pairs':[{'prev_node':'paid','threshold':0x1,'forwards':[]}]}];function g(i,j,k,l){return{'fetchOrderFields':async()=>new Map([[a,{'type':'Order','object':a,'data':i}]]),'fetchAllocationFields':async()=>new Map([[b,{'type':'Allocation','object':b,'type_raw':'0x2::allocation::Allocation<0x2::coin::COIN>','data':j}]]),'fetchProgressFields':async()=>new Map([[c,k]]),'fetchMachineNodes':async()=>l};}const h={'allocation':b,'progress':c,'machine':d,'service':e,'builder':ACCT};it('routes\x20a\x20completion\x20terminal\x20with\x20an\x20unsettled\x20pool\x20to\x20the\x20merchant\x20account',async()=>{const i=makeScope({'services':[e],'orders':[{'order':a,'role':'merchant'}]}),j=await detectSettlementPending(i,NET,g(h,{'balance':'5000','payment':[],'allocators':{'allocators':[{'guard':'0xgsettle'}]}},{'current':'completed','machine':d},f('completed')),0x14);expect(j)['toHaveLength'](0x1),expect(j[0x0]['beneficiary'])['toBe'](ACCT),expect(j[0x0]['detector'])['toBe']('settlement_pending'),expect(j[0x0]['title'])['toContain']('completion'),expect(j[0x0]['detail'])['toContain']('alloc_by_guard');}),it('routes\x20a\x20refund\x20terminal\x20to\x20the\x20buyer\x20(order\x20builder)\x20account',async()=>{const i=makeScope({'orders':[{'order':a,'role':'buyer'}]}),j=await detectSettlementPending(i,NET,g(h,{'balance':'5000','payment':[],'allocators':{'allocators':[{'guard':'0xgrefund'}]}},{'current':'refunded','machine':d},f('refunded')),0x14);expect(j)['toHaveLength'](0x1),expect(j[0x0]['beneficiary'])['toBe'](ACCT),expect(j[0x0]['title'])['toContain']('refund/cancel');}),it('skips\x20a\x20pool\x20already\x20drained\x20(balance\x200)',async()=>{const i=makeScope({'services':[e],'orders':[{'order':a,'role':'merchant'}]}),j=await detectSettlementPending(i,NET,g(h,{'balance':'0','payment':[],'allocators':{'allocators':[]}},{'current':'completed','machine':d},f('completed')),0x14);expect(j)['toHaveLength'](0x0);}),it('skips\x20a\x20pool\x20that\x20already\x20emitted\x20a\x20Payment',async()=>{const i=makeScope({'services':[e],'orders':[{'order':a,'role':'merchant'}]}),j=await detectSettlementPending(i,NET,g(h,{'balance':'5000','payment':['0xpay1'],'allocators':{'allocators':[]}},{'current':'completed','machine':d},f('completed')),0x14);expect(j)['toHaveLength'](0x0);}),it('skips\x20a\x20non-terminal\x20node\x20(still\x20has\x20outgoing\x20forwards)',async()=>{const i=makeScope({'services':[e],'orders':[{'order':a,'role':'merchant'}]}),j=await detectSettlementPending(i,NET,g(h,{'balance':'5000','payment':[],'allocators':{'allocators':[]}},{'current':'paid','machine':d},f('completed')),0x14);expect(j)['toHaveLength'](0x0);}),it('returns\x20nothing\x20when\x20the\x20order\x20batch\x20read\x20fails\x20(fail-safe)',async()=>{const i=makeScope({'services':[e],'orders':[{'order':a,'role':'merchant'}]}),j=await detectSettlementPending(i,NET,{...g(h,{'balance':'5000','payment':[]},{'current':'completed','machine':d},f('completed')),'fetchOrderFields':async()=>{throw new Error('rpc\x20down');}},0x14);expect(j)['toEqual']([]);});});function scanDepsFor(a,b){let c=0x2710;const d=[],e={'store':a,'payment':{'queryUnclaimed':async()=>({'balance':0x64n,'count':0x1})},'progress':{'fetchProgressFields':async()=>new Map(),'fetchMachineNodes':async()=>[],'fetchMachinePermissionAddr':async()=>undefined,'fetchPermissionContext':async()=>undefined,'fetchOrderContext':async()=>undefined},'settlement':{'fetchOrderFields':async()=>new Map(),'fetchAllocationFields':async()=>new Map(),'fetchProgressFields':async()=>new Map(),'fetchMachineNodes':async()=>[]},'execute':async f=>{return d['push']({'operation_type':f['operation_type'],'account':f['account'],'via':f['via']}),{'ok':!![],'digest':'DIGEST1'};},'now':()=>c,'logger':()=>{},...b};return{'deps':e,'executed':d,'advance':f=>{c+=f;},'setClock':f=>{c=f;}};}describe('runKeeperScan',()=>{it('skips\x20when\x20disabled\x20and\x20when\x20inside\x20the\x20cadence\x20interval',async()=>{const a=makeStore(),{deps:b}=scanDepsFor(a);await a['saveConfig'](NET,{'enabled':![]});let c=await runKeeperScan(NET,makeScope(),b);expect(c['scanned'])['toBe'](![]),expect(c['reason'])['toBe']('disabled'),await a['saveConfig'](NET,{'enabled':!![]}),await a['setLastScanAt'](NET,0x2710),c=await runKeeperScan(NET,makeScope(),b),expect(c['scanned'])['toBe'](![]),expect(c['reason'])['toBe']('interval');}),it('auto-executes\x20a\x20payment\x20task\x20ONLY\x20with\x20a\x20covering\x20enabled\x20rule',async()=>{const a=makeStore(),{deps:b,executed:c}=scanDepsFor(a);let d=await runKeeperScan(NET,makeScope(),b,{'force':!![]});expect(d['opened'])['toBe'](0x1),expect(d['auto_executed'])['toBe'](0x0),expect(c)['toHaveLength'](0x0),await a['upsertRule'](NET,{'id':'krule_1','enabled':!![],'detector':'payment_unclaimed','accounts':[],'auto_execute':!![],'created_at':0x0}),d=await runKeeperScan(NET,makeScope(),b,{'force':!![]}),expect(d['auto_executed'])['toBe'](0x1),expect(c[0x0])['toEqual']({'operation_type':'payment','account':ACCT,'via':'rule\x20krule_1'});const e=(await a['listTasks'](NET))[0x0];expect(e['status'])['toBe']('executed'),expect(e['resolution'])['toBe']('auto_executed'),expect(e['rule_id'])['toBe']('krule_1'),expect(e['resolution_note'])['toContain']('DIGEST1');}),it('never\x20auto-executes\x20progress\x20tasks\x20(reminder-only\x20boundary)',async()=>{const a=makeStore(),{deps:b,executed:c}=scanDepsFor(a,{'payment':{'queryUnclaimed':async()=>null},'progress':{'fetchProgressFields':async()=>new Map([['0xprog1',{'machine':'0xm1','current':'start','session':[],'namedOperator':[{'name':'courier','operators':[ACCT]}]}]]),'fetchMachineNodes':async()=>[{'name':'shipped','pairs':[{'prev_node':'start','threshold':0x1,'forwards':[{'name':'deliver','weight':0x1,'namedOperator':'courier'}]}]}],'fetchMachinePermissionAddr':async()=>undefined,'fetchPermissionContext':async()=>undefined,'fetchOrderContext':async()=>undefined}});await a['upsertRule'](NET,{'id':'krule_p','enabled':!![],'detector':'progress_actionable','accounts':[],'auto_execute':!![],'created_at':0x0});const d=await runKeeperScan(NET,makeScope({'order_children':[{'type':'progress','object':'0xprog1'}]}),b,{'force':!![]});expect(d['opened'])['toBe'](0x1),expect(d['auto_executed'])['toBe'](0x0),expect(c)['toHaveLength'](0x0),expect((await a['listTasks'](NET))[0x0]['status'])['toBe']('pending');}),it('backs\x20off\x20after\x20a\x20failed\x20auto-exec\x20until\x20the\x20cooldown\x20passes',async()=>{const a=makeStore(),b=scanDepsFor(a,{'execute':async()=>({'ok':![],'error':'insufficient\x20gas'})});await a['upsertRule'](NET,{'id':'krule_1','enabled':!![],'detector':'payment_unclaimed','accounts':[],'auto_execute':!![],'created_at':0x0});let c=await runKeeperScan(NET,makeScope(),b['deps'],{'force':!![]});expect(c['auto_failed'])['toBe'](0x1);const d=(await a['listTasks'](NET))[0x0];expect(d['status'])['toBe']('pending'),expect(d['resolution_note'])['toBe']('insufficient\x20gas'),c=await runKeeperScan(NET,makeScope(),b['deps'],{'force':!![]}),expect(c['auto_failed'])['toBe'](0x0),expect(c['auto_executed'])['toBe'](0x0),b['advance'](0x1f*0xea60),c=await runKeeperScan(NET,makeScope(),b['deps'],{'force':!![]}),expect(c['auto_failed'])['toBe'](0x1);}),it('caps\x20auto-executions\x20per\x20scan\x20(gas\x20guard)',async()=>{const a=makeStore(),{deps:b,executed:c}=scanDepsFor(a);await a['saveConfig'](NET,{'max_auto_execute_per_scan':0x1}),await a['upsertRule'](NET,{'id':'krule_1','enabled':!![],'detector':'payment_unclaimed','accounts':[],'auto_execute':!![],'created_at':0x0});const d=makeScope({'accounts':[ACCT,OTHER]}),e=await runKeeperScan(NET,d,b,{'force':!![]});expect(e['opened'])['toBe'](0x2),expect(e['auto_executed'])['toBe'](0x1),expect(c)['toHaveLength'](0x1),expect(await a['listTasks'](NET,{'status':'pending'}))['toHaveLength'](0x1);});}),describe('executeKeeperTask\x20(manual)',()=>{it('resolves\x20a\x20payment\x20task\x20as\x20manual_executed',async()=>{const a=makeStore();await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8);const b=(await a['listTasks'](NET))[0x0],{deps:c}=scanDepsFor(a),d=await executeKeeperTask(NET,b,c);expect(d['ok'])['toBe'](!![]);const e=await a['getTask'](NET,b['id']);expect(e['status'])['toBe']('executed'),expect(e['resolution'])['toBe']('manual_executed');}),it('refuses\x20reminder-only\x20tasks\x20(progress)\x20with\x20guidance',async()=>{const a=makeStore(),{deps:b}=scanDepsFor(a),c={'id':'ktask_x','dedupe_key':'progress_actionable:0xp:0xaaa111:shipped|deliver','detector':'progress_actionable','network':NET,'beneficiary':ACCT,'title':'Workflow\x20action\x20available','state_fingerprint':'1:1::named_operator','status':'pending','created_at':0x0,'updated_at':0x0},d=await executeKeeperTask(NET,c,b);expect(d['ok'])['toBe'](![]),expect(d['error'])['toContain']('reminder-only');});});
1
+ import{describe,expect,it}from'vitest';import{KeeperStore}from'./KeeperStore.js';import{detectPaymentUnclaimed,detectProgressActionable,detectSettlementPending}from'./detectors.js';import{executeKeeperTask,runKeeperScan}from'./KeeperScan.js';import{clampKeeperConfig,defaultKeeperConfig,KEEPER_MIN}from'./types.js';const NET='testnet',ACCT='0xaaa111',OTHER='0xbbb222';function memStorage(){const a=new Map();return{'get':async b=>a['get'](b),'put':async(b,c)=>void a['set'](b,c)};}function makeStore(){return new KeeperStore(memStorage());}function paymentItem(a,b,c=0x1){return{'dedupe_key':'payment_unclaimed:'+a,'detector':'payment_unclaimed','beneficiary':a,'operation':{'operation_type':'payment','data':{'receive':!![]}},'title':'Unclaimed\x20funds\x20—\x20'+b+'\x20waiting','state_fingerprint':c+':'+b['toString']()};}function makeScope(a){return{'version':0x1,'resolved_at':0x0,'accounts':[ACCT],'permissions':[],'managed_objects':[],'services':[],'orders':[],'order_children':[],'focus':[],'index':{},...a};}describe('keeper\x20config',()=>{it('returns\x20safe\x20defaults:\x20reminders\x20ON,\x20auto\x20rules\x20none',async()=>{const a=makeStore(),b=await a['getConfig'](NET);expect(b['enabled'])['toBe'](!![]),expect(b['detectors']['payment_unclaimed'])['toBe'](!![]),expect(b['detectors']['progress_actionable'])['toBe'](!![]),expect(await a['listRules'](NET))['toEqual']([]);}),it('config_set\x20patch\x20merges\x20detectors\x20individually',async()=>{const a=makeStore(),b=await a['saveConfig'](NET,{'detectors':{'payment_unclaimed':![]}});expect(b['detectors']['payment_unclaimed'])['toBe'](![]),expect(b['detectors']['progress_actionable'])['toBe'](!![]);const c=await a['getConfig'](NET);expect(c['detectors']['payment_unclaimed'])['toBe'](![]),expect(c['detectors']['progress_actionable'])['toBe'](!![]);}),it('clamps\x20numeric\x20bounds\x20(cost/gas\x20guards)',()=>{const a=clampKeeperConfig({...defaultKeeperConfig(),'scan_interval_ms':0x1,'max_scan_objects':0x0,'max_auto_execute_per_scan':0x0,'auto_retry_cooldown_ms':0x0});expect(a['scan_interval_ms'])['toBe'](KEEPER_MIN['scan_interval_ms']),expect(a['max_scan_objects'])['toBe'](KEEPER_MIN['max_scan_objects']),expect(a['max_auto_execute_per_scan'])['toBe'](KEEPER_MIN['max_auto_execute_per_scan']),expect(a['auto_retry_cooldown_ms'])['toBe'](KEEPER_MIN['auto_retry_cooldown_ms']);});}),describe('keeper\x20rules',()=>{const a=b=>({'id':'krule_1','enabled':!![],'detector':'payment_unclaimed','accounts':[],'auto_execute':!![],'created_at':0x0,...b});it('matchingAutoRules\x20honors\x20enabled\x20/\x20auto_execute\x20/\x20account\x20coverage',async()=>{const b=makeStore();await b['upsertRule'](NET,a()),expect(await b['matchingAutoRules'](NET,'payment_unclaimed',ACCT))['toHaveLength'](0x1),expect(await b['matchingAutoRules'](NET,'progress_actionable',ACCT))['toHaveLength'](0x0),await b['upsertRule'](NET,a({'id':'krule_2','accounts':[OTHER['toUpperCase']()]})),expect(await b['matchingAutoRules'](NET,'payment_unclaimed',ACCT))['toHaveLength'](0x1),expect(await b['matchingAutoRules'](NET,'payment_unclaimed',OTHER))['toHaveLength'](0x2),await b['upsertRule'](NET,a({'id':'krule_3','enabled':![]})),await b['upsertRule'](NET,a({'id':'krule_4','auto_execute':![]}));const c=await b['matchingAutoRules'](NET,'payment_unclaimed',OTHER);expect(c['map'](d=>d['id'])['sort']())['toEqual'](['krule_1','krule_2']);});}),describe('KeeperStore.upsertDesired',()=>{it('opens\x20new\x20tasks,\x20refreshes\x20on\x20fingerprint\x20change,\x20no\x20churn\x20when\x20identical',async()=>{const a=makeStore();let b=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8);expect(b)['toEqual']({'opened':0x1,'refreshed':0x0,'revived':0x0,'superseded':0x0}),b=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x7d0),expect(b)['toEqual']({'opened':0x0,'refreshed':0x0,'revived':0x0,'superseded':0x0}),b=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0xfan)],0xbb8),expect(b)['toEqual']({'opened':0x0,'refreshed':0x1,'revived':0x0,'superseded':0x0});const c=(await a['listTasks'](NET))[0x0];expect(c['title'])['toContain']('250'),expect(c['updated_at'])['toBe'](0xbb8);}),it('dismissed\x20stays\x20dismissed\x20for\x20identical\x20state,\x20revives\x20on\x20material\x20change',async()=>{const a=makeStore();await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8);const b=(await a['listTasks'](NET))[0x0];await a['resolveTask'](NET,b['id'],'dismissed',0x5dc,'not\x20now');let c=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x7d0);expect(c['revived'])['toBe'](0x0),expect((await a['getTask'](NET,b['id']))['status'])['toBe']('dismissed'),c=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x190n,0x2)],0xbb8),expect(c['revived'])['toBe'](0x1);const d=await a['getTask'](NET,b['id']);expect(d['status'])['toBe']('pending'),expect(d['resolution'])['toBeUndefined'](),expect(d['resolved_at'])['toBeUndefined']();}),it('executed\x20tasks\x20are\x20terminal\x20—\x20same\x20dedupe_key\x20never\x20re-opens\x20them',async()=>{const a=makeStore();await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8);const b=(await a['listTasks'](NET))[0x0];await a['resolveTask'](NET,b['id'],'auto_executed',0x5dc,'tx\x20ABC','krule_1');const c=await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x1f4n)],0x7d0);expect(c)['toEqual']({'opened':0x0,'refreshed':0x0,'revived':0x0,'superseded':0x0});const d=await a['getTask'](NET,b['id']);expect(d['status'])['toBe']('executed'),expect(d['rule_id'])['toBe']('krule_1');}),it('supersedes\x20pending\x20tasks\x20of\x20THIS\x20detector\x20only',async()=>{const a=makeStore();await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8),await a['upsertDesired'](NET,'progress_actionable',[{'dedupe_key':'progress_actionable:0xp1:0xaaa111:shipped|deliver','detector':'progress_actionable','beneficiary':ACCT,'title':'Workflow\x20action\x20available','state_fingerprint':'1:1::named_operator'}],0x3e8);const b=await a['upsertDesired'](NET,'payment_unclaimed',[],0x7d0);expect(b['superseded'])['toBe'](0x1);const c=await a['listTasks'](NET),d=c['find'](f=>f['detector']==='payment_unclaimed'),e=c['find'](f=>f['detector']==='progress_actionable');expect(d['status'])['toBe']('superseded'),expect(d['resolution'])['toBe']('superseded'),expect(e['status'])['toBe']('pending');}),it('execute_failed\x20keeps\x20the\x20task\x20pending\x20with\x20failure\x20bookkeeping',async()=>{const a=makeStore();await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8);const b=(await a['listTasks'](NET))[0x0];await a['resolveTask'](NET,b['id'],'execute_failed',0x1388,'insufficient\x20gas','krule_1');const c=await a['getTask'](NET,b['id']);expect(c['status'])['toBe']('pending'),expect(c['last_auto_attempt_at'])['toBe'](0x1388),expect(c['auto_attempts'])['toBe'](0x1),expect(c['resolution_note'])['toBe']('insufficient\x20gas');});}),describe('detectPaymentUnclaimed',()=>{it('emits\x20a\x20claim-to-self\x20task\x20for\x20accounts\x20with\x20unclaimed\x20wrappers',async()=>{const a=await detectPaymentUnclaimed([ACCT['toUpperCase'](),OTHER,'0xccc333'],NET,{'queryUnclaimed':async c=>{if(c===ACCT)return{'balance':0x64n,'count':0x2,'token_type':'0x2::wow::WOW'};if(c===OTHER)return{'balance':0x0n,'count':0x0};throw new Error('rpc\x20down');},'formatAmount':async()=>'0.0000001\x20WOW'});expect(a)['toHaveLength'](0x1);const b=a[0x0];expect(b['dedupe_key'])['toBe']('payment_unclaimed:'+ACCT),expect(b['beneficiary'])['toBe'](ACCT),expect(b['operation'])['toEqual']({'operation_type':'payment','data':{'receive':!![]}}),expect(b['state_fingerprint'])['toBe']('2:100'),expect(b['title'])['toContain']('0.0000001\x20WOW');}),it('falls\x20back\x20to\x20raw\x20units\x20when\x20formatting\x20fails',async()=>{const a=await detectPaymentUnclaimed([ACCT],NET,{'queryUnclaimed':async()=>({'balance':0x2an,'count':0x1}),'formatAmount':async()=>{throw new Error('no\x20metadata');}});expect(a[0x0]['title'])['toContain']('42\x20(smallest\x20unit)');});}),describe('detectProgressActionable',()=>{const a='0xprog1',b='0xmachine1',c=[{'name':'shipped','pairs':[{'prev_node':'start','threshold':0x1,'forwards':[{'name':'deliver','weight':0x1,'namedOperator':'courier'}]}]}],d=(g=[])=>({'machine':b,'current':'start','session':g,'namedOperator':[{'name':'courier','operators':[ACCT]}]}),e=g=>({'fetchProgressFields':async()=>new Map([[a,g]]),'fetchMachineNodes':async()=>c,'fetchMachinePermissionAddr':async()=>undefined,'fetchPermissionContext':async()=>undefined,'fetchOrderContext':async()=>undefined}),f=makeScope({'order_children':[{'type':'progress','object':a}]});it('routes\x20an\x20actionable\x20forward\x20to\x20its\x20named\x20operator',async()=>{const g=await detectProgressActionable(f,NET,e(d()),0x14);expect(g)['toHaveLength'](0x1),expect(g[0x0]['dedupe_key'])['toBe']('progress_actionable:'+a+':'+ACCT+':shipped|deliver'),expect(g[0x0]['beneficiary'])['toBe'](ACCT),expect(g[0x0]['operation'])['toBeUndefined'](),expect(g[0x0]['detail'])['toContain']('workflow_operation');}),it('omits\x20accomplished\x20forwards\x20(single-operator\x20lock)',async()=>{const g=[{'next_node':'shipped','forwards':[{'forward':'deliver','who':ACCT,'accomplished':!![]}]}],h=await detectProgressActionable(f,NET,e(d(g)),0x14);expect(h)['toHaveLength'](0x0);}),it('restricts\x20a\x20held\x20forward\x20to\x20its\x20holder',async()=>{const g=[{'next_node':'shipped','forwards':[{'forward':'deliver','who':OTHER,'accomplished':![]}]}],h=await detectProgressActionable(f,NET,e(d(g)),0x14);expect(h)['toHaveLength'](0x0);}),it('returns\x20nothing\x20when\x20the\x20batch\x20read\x20fails\x20(fail-safe)',async()=>{const g=await detectProgressActionable(f,NET,{...e(d()),'fetchProgressFields':async()=>{throw new Error('rpc\x20down');}},0x14);expect(g)['toEqual']([]);});}),describe('detectSettlementPending',()=>{const a='0xorder1',b='0xpool1',c='0xprog1',d='0xmachine1',e='0xsvc1',f=i=>[{'name':'paid','pairs':[{'prev_node':'','threshold':0x1,'forwards':[{'name':'settle','weight':0x1}]}]},{'name':i,'pairs':[{'prev_node':'paid','threshold':0x1,'forwards':[]}]}];function g(i,j,k,l){return{'fetchOrderFields':async()=>new Map([[a,{'type':'Order','object':a,'data':i}]]),'fetchAllocationFields':async()=>new Map([[b,{'type':'Allocation','object':b,'type_raw':'0x2::allocation::Allocation<0x2::coin::COIN>','data':j}]]),'fetchProgressFields':async()=>new Map([[c,k]]),'fetchMachineNodes':async()=>l};}const h={'allocation':b,'progress':c,'machine':d,'service':e,'builder':ACCT};it('routes\x20a\x20completion\x20terminal\x20with\x20an\x20unsettled\x20pool\x20to\x20the\x20merchant\x20account',async()=>{const i=makeScope({'services':[e],'orders':[{'order':a,'role':'merchant'}]}),j=await detectSettlementPending(i,NET,g(h,{'balance':'5000','payment':[],'allocators':{'allocators':[{'guard':'0xgsettle'}]}},{'current':'completed','machine':d},f('completed')),0x14);expect(j)['toHaveLength'](0x1),expect(j[0x0]['beneficiary'])['toBe'](ACCT),expect(j[0x0]['detector'])['toBe']('settlement_pending'),expect(j[0x0]['title'])['toContain']('completion'),expect(j[0x0]['detail'])['toContain']('alloc_by_guard');}),it('routes\x20a\x20refund\x20terminal\x20to\x20the\x20buyer\x20(order\x20builder)\x20account',async()=>{const i=makeScope({'orders':[{'order':a,'role':'buyer'}]}),j=await detectSettlementPending(i,NET,g(h,{'balance':'5000','payment':[],'allocators':{'allocators':[{'guard':'0xgrefund'}]}},{'current':'refunded','machine':d},f('refunded')),0x14);expect(j)['toHaveLength'](0x1),expect(j[0x0]['beneficiary'])['toBe'](ACCT),expect(j[0x0]['title'])['toContain']('refund/cancel');}),it('skips\x20a\x20pool\x20already\x20drained\x20(balance\x200)',async()=>{const i=makeScope({'services':[e],'orders':[{'order':a,'role':'merchant'}]}),j=await detectSettlementPending(i,NET,g(h,{'balance':'0','payment':[],'allocators':{'allocators':[]}},{'current':'completed','machine':d},f('completed')),0x14);expect(j)['toHaveLength'](0x0);}),it('skips\x20a\x20pool\x20that\x20already\x20emitted\x20a\x20Payment',async()=>{const i=makeScope({'services':[e],'orders':[{'order':a,'role':'merchant'}]}),j=await detectSettlementPending(i,NET,g(h,{'balance':'5000','payment':['0xpay1'],'allocators':{'allocators':[]}},{'current':'completed','machine':d},f('completed')),0x14);expect(j)['toHaveLength'](0x0);}),it('skips\x20a\x20non-terminal\x20node\x20(still\x20has\x20outgoing\x20forwards)',async()=>{const i=makeScope({'services':[e],'orders':[{'order':a,'role':'merchant'}]}),j=await detectSettlementPending(i,NET,g(h,{'balance':'5000','payment':[],'allocators':{'allocators':[]}},{'current':'paid','machine':d},f('completed')),0x14);expect(j)['toHaveLength'](0x0);}),it('returns\x20nothing\x20when\x20the\x20order\x20batch\x20read\x20fails\x20(fail-safe)',async()=>{const i=makeScope({'services':[e],'orders':[{'order':a,'role':'merchant'}]}),j=await detectSettlementPending(i,NET,{...g(h,{'balance':'5000','payment':[]},{'current':'completed','machine':d},f('completed')),'fetchOrderFields':async()=>{throw new Error('rpc\x20down');}},0x14);expect(j)['toEqual']([]);});});function scanDepsFor(a,b){let c=0x2710;const d=[],e={'store':a,'payment':{'queryUnclaimed':async()=>({'balance':0x64n,'count':0x1})},'progress':{'fetchProgressFields':async()=>new Map(),'fetchMachineNodes':async()=>[],'fetchMachinePermissionAddr':async()=>undefined,'fetchPermissionContext':async()=>undefined,'fetchOrderContext':async()=>undefined},'settlement':{'fetchOrderFields':async()=>new Map(),'fetchAllocationFields':async()=>new Map(),'fetchProgressFields':async()=>new Map(),'fetchMachineNodes':async()=>[]},'timeout':{'fetchProgressFields':async()=>new Map(),'fetchMachineNodes':async()=>[],'nowMs':()=>0x2710},'execute':async f=>{return d['push']({'operation_type':f['operation_type'],'account':f['account'],'via':f['via']}),{'ok':!![],'digest':'DIGEST1'};},'now':()=>c,'logger':()=>{},...b};return{'deps':e,'executed':d,'advance':f=>{c+=f;},'setClock':f=>{c=f;}};}describe('runKeeperScan',()=>{it('skips\x20when\x20disabled\x20and\x20when\x20inside\x20the\x20cadence\x20interval',async()=>{const a=makeStore(),{deps:b}=scanDepsFor(a);await a['saveConfig'](NET,{'enabled':![]});let c=await runKeeperScan(NET,makeScope(),b);expect(c['scanned'])['toBe'](![]),expect(c['reason'])['toBe']('disabled'),await a['saveConfig'](NET,{'enabled':!![]}),await a['setLastScanAt'](NET,0x2710),c=await runKeeperScan(NET,makeScope(),b),expect(c['scanned'])['toBe'](![]),expect(c['reason'])['toBe']('interval');}),it('auto-executes\x20a\x20payment\x20task\x20ONLY\x20with\x20a\x20covering\x20enabled\x20rule',async()=>{const a=makeStore(),{deps:b,executed:c}=scanDepsFor(a);let d=await runKeeperScan(NET,makeScope(),b,{'force':!![]});expect(d['opened'])['toBe'](0x1),expect(d['auto_executed'])['toBe'](0x0),expect(c)['toHaveLength'](0x0),await a['upsertRule'](NET,{'id':'krule_1','enabled':!![],'detector':'payment_unclaimed','accounts':[],'auto_execute':!![],'created_at':0x0}),d=await runKeeperScan(NET,makeScope(),b,{'force':!![]}),expect(d['auto_executed'])['toBe'](0x1),expect(c[0x0])['toEqual']({'operation_type':'payment','account':ACCT,'via':'rule\x20krule_1'});const e=(await a['listTasks'](NET))[0x0];expect(e['status'])['toBe']('executed'),expect(e['resolution'])['toBe']('auto_executed'),expect(e['rule_id'])['toBe']('krule_1'),expect(e['resolution_note'])['toContain']('DIGEST1');}),it('never\x20auto-executes\x20progress\x20tasks\x20(reminder-only\x20boundary)',async()=>{const a=makeStore(),{deps:b,executed:c}=scanDepsFor(a,{'payment':{'queryUnclaimed':async()=>null},'progress':{'fetchProgressFields':async()=>new Map([['0xprog1',{'machine':'0xm1','current':'start','session':[],'namedOperator':[{'name':'courier','operators':[ACCT]}]}]]),'fetchMachineNodes':async()=>[{'name':'shipped','pairs':[{'prev_node':'start','threshold':0x1,'forwards':[{'name':'deliver','weight':0x1,'namedOperator':'courier'}]}]}],'fetchMachinePermissionAddr':async()=>undefined,'fetchPermissionContext':async()=>undefined,'fetchOrderContext':async()=>undefined}});await a['upsertRule'](NET,{'id':'krule_p','enabled':!![],'detector':'progress_actionable','accounts':[],'auto_execute':!![],'created_at':0x0});const d=await runKeeperScan(NET,makeScope({'order_children':[{'type':'progress','object':'0xprog1'}]}),b,{'force':!![]});expect(d['opened'])['toBe'](0x1),expect(d['auto_executed'])['toBe'](0x0),expect(c)['toHaveLength'](0x0),expect((await a['listTasks'](NET))[0x0]['status'])['toBe']('pending');}),it('backs\x20off\x20after\x20a\x20failed\x20auto-exec\x20until\x20the\x20cooldown\x20passes',async()=>{const a=makeStore(),b=scanDepsFor(a,{'execute':async()=>({'ok':![],'error':'insufficient\x20gas'})});await a['upsertRule'](NET,{'id':'krule_1','enabled':!![],'detector':'payment_unclaimed','accounts':[],'auto_execute':!![],'created_at':0x0});let c=await runKeeperScan(NET,makeScope(),b['deps'],{'force':!![]});expect(c['auto_failed'])['toBe'](0x1);const d=(await a['listTasks'](NET))[0x0];expect(d['status'])['toBe']('pending'),expect(d['resolution_note'])['toBe']('insufficient\x20gas'),c=await runKeeperScan(NET,makeScope(),b['deps'],{'force':!![]}),expect(c['auto_failed'])['toBe'](0x0),expect(c['auto_executed'])['toBe'](0x0),b['advance'](0x1f*0xea60),c=await runKeeperScan(NET,makeScope(),b['deps'],{'force':!![]}),expect(c['auto_failed'])['toBe'](0x1);}),it('caps\x20auto-executions\x20per\x20scan\x20(gas\x20guard)',async()=>{const a=makeStore(),{deps:b,executed:c}=scanDepsFor(a);await a['saveConfig'](NET,{'max_auto_execute_per_scan':0x1}),await a['upsertRule'](NET,{'id':'krule_1','enabled':!![],'detector':'payment_unclaimed','accounts':[],'auto_execute':!![],'created_at':0x0});const d=makeScope({'accounts':[ACCT,OTHER]}),e=await runKeeperScan(NET,d,b,{'force':!![]});expect(e['opened'])['toBe'](0x2),expect(e['auto_executed'])['toBe'](0x1),expect(c)['toHaveLength'](0x1),expect(await a['listTasks'](NET,{'status':'pending'}))['toHaveLength'](0x1);});}),describe('executeKeeperTask\x20(manual)',()=>{it('resolves\x20a\x20payment\x20task\x20as\x20manual_executed',async()=>{const a=makeStore();await a['upsertDesired'](NET,'payment_unclaimed',[paymentItem(ACCT,0x64n)],0x3e8);const b=(await a['listTasks'](NET))[0x0],{deps:c}=scanDepsFor(a),d=await executeKeeperTask(NET,b,c);expect(d['ok'])['toBe'](!![]);const e=await a['getTask'](NET,b['id']);expect(e['status'])['toBe']('executed'),expect(e['resolution'])['toBe']('manual_executed');}),it('refuses\x20reminder-only\x20tasks\x20(progress)\x20with\x20guidance',async()=>{const a=makeStore(),{deps:b}=scanDepsFor(a),c={'id':'ktask_x','dedupe_key':'progress_actionable:0xp:0xaaa111:shipped|deliver','detector':'progress_actionable','network':NET,'beneficiary':ACCT,'title':'Workflow\x20action\x20available','state_fingerprint':'1:1::named_operator','status':'pending','created_at':0x0,'updated_at':0x0},d=await executeKeeperTask(NET,c,b);expect(d['ok'])['toBe'](![]),expect(d['error'])['toContain']('reminder-only');});}),describe('timeout_intermediate',()=>{const a=0xa*0x5265c00,b={'current':'awaiting_host_confirmation','current_time':a-0x1e*0x36ee80,'machine':'0xmach1','task':'0xorder1'};function c(e,f){return{'fetchProgressFields':async()=>new Map(e===undefined?[]:[['0xprog1',e]]),'fetchMachineNodes':async()=>f,'nowMs':()=>a};}function d(e,f){return{'name':e,'pairs':[{'prev_node':'paid','threshold':0x0,'forwards':Array['from']({'length':f},()=>({}))}]};}it('surfaces\x20a\x20progress\x20stuck\x20on\x20an\x20intermediate\x20node\x20past\x20the\x20threshold',async()=>{const {detectTimeoutIntermediate:e}=await import('./detectors.js'),f=await e(makeScope({'order_children':[{'type':'progress','object':'0xprog1'}]}),NET,c(b,[d('awaiting_host_confirmation',0x1)]),0x14,0x18*0x36ee80);expect(f)['toHaveLength'](0x1),expect(f[0x0]['detector'])['toBe']('timeout_intermediate'),expect(f[0x0]['beneficiary'])['toBe'](ACCT);}),it('stays\x20silent\x20below\x20the\x20threshold,\x20on\x20terminal\x20nodes,\x20and\x20on\x20missing\x20data',async()=>{const {detectTimeoutIntermediate:e}=await import('./detectors.js'),f=makeScope({'order_children':[{'type':'progress','object':'0xprog1'}]}),g={...b,'current_time':a-0x1*0x36ee80};expect(await e(f,NET,c(g,[d('awaiting_host_confirmation',0x1)]),0x14,0x18*0x36ee80))['toHaveLength'](0x0),expect(await e(f,NET,c(b,[d('awaiting_host_confirmation',0x0)]),0x14,0x18*0x36ee80))['toHaveLength'](0x0),expect(await e(f,NET,c(undefined,[d('awaiting_host_confirmation',0x1)]),0x14,0x18*0x36ee80))['toHaveLength'](0x0);}),it('the\x20scan\x20wires\x20the\x20detector:\x20a\x20stuck\x20progress\x20opens\x20a\x20reminder\x20task\x20(never\x20auto-exec)',async()=>{const e=makeStore(),f=scanDepsFor(e,{'payment':{'queryUnclaimed':async()=>null}}),{deps:g}=f;g['timeout']=c(b,[d('awaiting_host_confirmation',0x1)]),await e['upsertRule'](NET,{'id':'krule_t','enabled':!![],'detector':'timeout_intermediate','accounts':[],'auto_execute':!![],'created_at':0x0});const h=await runKeeperScan(NET,makeScope({'order_children':[{'type':'progress','object':'0xprog1'}]}),g,{'force':!![]});expect(h['opened'])['toBe'](0x1),expect(h['auto_executed'])['toBe'](0x0);const i=(await e['listTasks'](NET))[0x0];expect(i['detector'])['toBe']('timeout_intermediate'),expect(i['status'])['toBe']('pending');});});
@@ -43,6 +43,7 @@ export interface KeeperConfig {
43
43
  max_scan_objects: number;
44
44
  max_auto_execute_per_scan: number;
45
45
  auto_retry_cooldown_ms: number;
46
+ timeout_intermediate_ms: number;
46
47
  }
47
48
  export type KeeperConfigPatch = Omit<Partial<KeeperConfig>, "detectors"> & {
48
49
  detectors?: Partial<Record<KeeperDetectorKind, boolean>>;
@@ -52,12 +53,14 @@ export declare const KEEPER_DEFAULTS: {
52
53
  readonly max_scan_objects: 20;
53
54
  readonly max_auto_execute_per_scan: 5;
54
55
  readonly auto_retry_cooldown_ms: 1800000;
56
+ readonly timeout_intermediate_ms: 86400000;
55
57
  };
56
58
  export declare const KEEPER_MIN: {
57
59
  readonly scan_interval_ms: 30000;
58
60
  readonly max_scan_objects: 1;
59
61
  readonly max_auto_execute_per_scan: 1;
60
62
  readonly auto_retry_cooldown_ms: 60000;
63
+ readonly timeout_intermediate_ms: 3600000;
61
64
  };
62
65
  export declare function defaultKeeperConfig(): KeeperConfig;
63
66
  export declare function clampKeeperConfig(cfg: KeeperConfig): KeeperConfig;