@wowok/agent-mcp 3.4.1 → 3.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +5 -0
- package/dist/chain-semantics/composition-truth.js +1 -1
- package/dist/chain-semantics/eval-order.js +1 -1
- package/dist/chain-semantics/field-capability.js +1 -1
- package/dist/chain-semantics/freeze-map.js +1 -1
- package/dist/chain-semantics/fund-flow.js +1 -1
- package/dist/chain-semantics/guard-verbs.js +1 -1
- package/dist/chain-semantics/object-graph.js +1 -1
- package/dist/composition/audit.js +1 -1
- package/dist/composition/compile.d.ts +10 -3
- package/dist/composition/compile.js +1 -1
- package/dist/composition/emit-phases.d.ts +30 -2
- package/dist/composition/emit-phases.js +1 -1
- package/dist/composition/guard-fill.d.ts +8 -0
- package/dist/composition/guard-fill.js +1 -1
- package/dist/composition/inflight.js +1 -1
- package/dist/composition/input-normalize.js +1 -1
- package/dist/composition/materialize.d.ts +2 -0
- package/dist/composition/materialize.js +1 -1
- package/dist/composition/mode-gates.js +1 -1
- package/dist/composition/param-disclosure.js +1 -1
- package/dist/composition/plan-retry-ledger.d.ts +16 -0
- package/dist/composition/plan-retry-ledger.js +1 -1
- package/dist/composition/plan.d.ts +15 -1
- package/dist/composition/plan.js +1 -1
- package/dist/config/config-audit.spec.js +1 -1
- package/dist/config/judgment.d.ts +5 -0
- package/dist/config/judgment.js +1 -1
- package/dist/evaluation/builtins/arbitration-score.d.ts +1 -0
- package/dist/evaluation/builtins/arbitration-score.js +1 -1
- package/dist/evaluation/builtins/demand-match.js +1 -1
- package/dist/evaluation/builtins/graph-service.d.ts +8 -0
- package/dist/evaluation/builtins/graph-service.js +1 -1
- package/dist/evaluation/capability.d.ts +9 -0
- package/dist/evaluation/engine.js +1 -1
- package/dist/evaluation/extract.d.ts +9 -1
- package/dist/evaluation/extract.js +1 -1
- package/dist/evaluation/match-operation.js +1 -1
- package/dist/evaluation/match-policy.d.ts +5 -3
- package/dist/evaluation/match-policy.js +1 -1
- package/dist/evaluation/standards.d.ts +1 -0
- package/dist/evaluation/standards.js +1 -1
- package/dist/evaluation/structured-lines.js +1 -1
- package/dist/evaluation/types.d.ts +1 -0
- package/dist/extensions/capability.js +1 -1
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/harness/recover.js +1 -1
- package/dist/index.js +1 -1
- package/dist/intent/types.d.ts +1 -1
- package/dist/intent/types.js +1 -1
- package/dist/knowledge/allocation-ledger.js +1 -1
- package/dist/knowledge/allocator-rail-verifier.d.ts +17 -1
- package/dist/knowledge/allocator-rail-verifier.js +1 -1
- package/dist/knowledge/arb-fund-facts.d.ts +7 -0
- package/dist/knowledge/arb-fund-facts.js +1 -1
- package/dist/knowledge/arbitration-rail-verifier.d.ts +35 -0
- package/dist/knowledge/arbitration-rail-verifier.js +1 -0
- package/dist/knowledge/arbitration-templates.js +1 -1
- package/dist/knowledge/audit-rules.d.ts +13 -1
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/baselines/judgment-baselines.json +1 -0
- package/dist/knowledge/baselines/rules/guard.json +7 -6
- package/dist/knowledge/baselines/rules/progress.json +4 -4
- package/dist/knowledge/baselines/rules/reward.json +118 -3
- package/dist/knowledge/builtin-templates.d.ts +19 -2
- package/dist/knowledge/builtin-templates.js +1 -1
- package/dist/knowledge/chain-query-registry.d.ts +14 -0
- package/dist/knowledge/chain-query-registry.js +1 -0
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/fee-param-bindings.d.ts +2 -0
- package/dist/knowledge/fee-param-bindings.js +1 -1
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-binding-table.js +1 -1
- package/dist/knowledge/guard-binding-verifier.d.ts +7 -0
- package/dist/knowledge/guard-binding-verifier.js +1 -1
- package/dist/knowledge/guard-bindings.js +1 -1
- package/dist/knowledge/guard-design-patterns.d.ts +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-field-cognition.js +1 -1
- package/dist/knowledge/guard-host-context.js +1 -1
- package/dist/knowledge/guard-lint.js +1 -1
- package/dist/knowledge/guard-node-gates.d.ts +3 -1
- package/dist/knowledge/guard-node-gates.js +1 -1
- package/dist/knowledge/guard-puzzle.js +1 -1
- package/dist/knowledge/guard-render.js +1 -1
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-templates.d.ts +2 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.d.ts +2 -0
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/knob-docs.js +1 -1
- package/dist/knowledge/param-schema.d.ts +1 -1
- package/dist/knowledge/param-schema.js +1 -1
- package/dist/knowledge/param-tiers.d.ts +2 -0
- package/dist/knowledge/param-tiers.js +1 -1
- package/dist/knowledge/path-oracle/products/food-delivery.js +1 -1
- package/dist/knowledge/pattern-resolutions.d.ts +2 -0
- package/dist/knowledge/pattern-resolutions.js +1 -1
- package/dist/knowledge/product-detail-source.d.ts +37 -0
- package/dist/knowledge/product-detail-source.js +1 -0
- package/dist/knowledge/product-doc-b5.d.ts +16 -0
- package/dist/knowledge/product-doc-b5.js +1 -0
- package/dist/knowledge/progress-ledger.js +1 -1
- package/dist/knowledge/projection.spec.js +1 -1
- package/dist/knowledge/publish-gate.d.ts +20 -0
- package/dist/knowledge/publish-gate.js +1 -0
- package/dist/knowledge/publish-readiness.d.ts +25 -0
- package/dist/knowledge/publish-readiness.js +1 -0
- package/dist/knowledge/publish-surface-contract.d.ts +16 -0
- package/dist/knowledge/publish-surface-contract.js +1 -0
- package/dist/knowledge/rail-exit-satisfiability.d.ts +25 -0
- package/dist/knowledge/rail-exit-satisfiability.js +1 -0
- package/dist/knowledge/reward-ledger.d.ts +1 -1
- package/dist/knowledge/reward-ledger.js +1 -1
- package/dist/knowledge/reward-risk.d.ts +1 -1
- package/dist/knowledge/reward-risk.js +1 -1
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/service-ledger.d.ts +3 -1
- package/dist/knowledge/service-ledger.js +1 -1
- package/dist/knowledge/template-loader.d.ts +41 -2
- package/dist/knowledge/template-loader.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +17 -0
- package/dist/knowledge/template-scanner.js +1 -1
- package/dist/knowledge/template-test-profiles.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +4 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/monitor/normalize.d.ts +1 -1
- package/dist/monitor/normalize.js +1 -1
- package/dist/monitor/types.js +1 -1
- package/dist/participation/customer-interest.d.ts +4 -0
- package/dist/participation/customer-interest.js +1 -1
- package/dist/participation/game-context.js +1 -1
- package/dist/participation/node-action-advisor.d.ts +4 -0
- package/dist/participation/node-action-advisor.js +1 -1
- package/dist/participation/radar-core.js +1 -1
- package/dist/participation/time-window.d.ts +11 -0
- package/dist/participation/time-window.js +1 -1
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +28 -3
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/object-panorama.d.ts +4 -0
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/relationship-profile.js +1 -1
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/service-quote.js +1 -1
- package/dist/review/index.js +1 -1
- package/dist/review/order.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +24 -0
- package/dist/schema/benchmark-migration/index.js +1 -1
- package/dist/schema/call/allocation.d.ts +11 -7
- package/dist/schema/call/allocation.js +1 -1
- package/dist/schema/call/arbitration.d.ts +4 -0
- package/dist/schema/call/arbitration.js +1 -1
- package/dist/schema/call/base.d.ts +28 -0
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +21 -0
- package/dist/schema/call/contact.d.ts +4 -0
- package/dist/schema/call/demand.d.ts +4 -0
- package/dist/schema/call/guard.d.ts +12 -0
- package/dist/schema/call/handler.d.ts +1 -0
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/machine.d.ts +16 -8
- package/dist/schema/call/normalize-error.d.ts +1 -0
- package/dist/schema/call/normalize-error.js +1 -0
- package/dist/schema/call/order.d.ts +7 -3
- package/dist/schema/call/order.js +1 -1
- package/dist/schema/call/payment.d.ts +7 -3
- package/dist/schema/call/permission.d.ts +4 -0
- package/dist/schema/call/personal.d.ts +4 -0
- package/dist/schema/call/progress.d.ts +4 -0
- package/dist/schema/call/progress.js +1 -1
- package/dist/schema/call/proof.d.ts +8 -0
- package/dist/schema/call/proof.js +1 -1
- package/dist/schema/call/receipt.js +1 -1
- package/dist/schema/call/repository.d.ts +4 -0
- package/dist/schema/call/reward.d.ts +6 -2
- package/dist/schema/call/reward.js +1 -1
- package/dist/schema/call/semantic.d.ts +2 -2
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +21 -7
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/call/treasury.d.ts +10 -6
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/envelope-unify.d.ts +1 -0
- package/dist/schema/envelope-unify.js +1 -1
- package/dist/schema/evaluation/index.d.ts +43 -0
- package/dist/schema/evaluation/index.js +1 -1
- package/dist/schema/goal/index.d.ts +14 -2
- package/dist/schema/goal/planning.d.ts +18 -0
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/intent-radar/index.d.ts +12 -0
- package/dist/schema/intent-radar/index.js +1 -1
- package/dist/schema/keeper/index.d.ts +1 -0
- package/dist/schema/local/index.d.ts +10 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/local/wip.js +1 -1
- package/dist/schema/messenger/index.d.ts +1 -0
- package/dist/schema/messenger/index.js +1 -1
- package/dist/schema/operations.d.ts +98 -13
- package/dist/schema/operations.js +1 -1
- package/dist/schema/persona/index.d.ts +22 -0
- package/dist/schema/query/bi.d.ts +28 -2
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +67 -61
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/workflow/index.js +1 -1
- package/dist/schema-query-impl/index.d.ts +1 -0
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +2 -1
- package/dist/schemas/benchmark_migration_operation.output.json +74 -0
- package/dist/schemas/benchmark_migration_operation.schema.json +33 -1
- package/dist/schemas/bridge_operation.output.json +2 -1
- package/dist/schemas/bridge_operation.schema.json +40 -0
- package/dist/schemas/evaluation_operation.output.json +96 -0
- package/dist/schemas/evaluation_operation.schema.json +39 -0
- package/dist/schemas/goal_operation.schema.json +32 -0
- package/dist/schemas/guard2file.schema.json +8 -0
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/intent_radar.output.json +10 -2
- package/dist/schemas/intent_radar.schema.json +5 -1
- package/dist/schemas/keeper_operation.output.json +2 -1
- package/dist/schemas/local_cache_operation.output.json +2 -1
- package/dist/schemas/local_history_operation.output.json +2 -1
- package/dist/schemas/local_info_operation.output.json +2 -1
- package/dist/schemas/local_mark_operation.output.json +2 -1
- package/dist/schemas/local_mark_operation.schema.json +10 -1
- package/dist/schemas/machineNode2file.schema.json +8 -0
- package/dist/schemas/messenger_operation.output.json +2 -1
- package/dist/schemas/messenger_operation.schema.json +2 -1
- package/dist/schemas/monitor_events.output.json +2 -1
- package/dist/schemas/monitor_subscription.output.json +2 -1
- package/dist/schemas/onchain_events.output.json +206 -13
- package/dist/schemas/onchain_events.schema.json +16 -0
- package/dist/schemas/onchain_operations.output.json +22 -3
- package/dist/schemas/onchain_operations.schema.json +982 -327
- package/dist/schemas/onchain_operations_allocation.schema.json +20 -13
- package/dist/schemas/onchain_operations_arbitration.schema.json +9 -1
- package/dist/schemas/onchain_operations_contact.schema.json +8 -0
- package/dist/schemas/onchain_operations_demand.schema.json +8 -0
- package/dist/schemas/onchain_operations_gen_passport.schema.json +8 -0
- package/dist/schemas/onchain_operations_gen_proof.schema.json +8 -0
- package/dist/schemas/onchain_operations_guard.schema.json +655 -115
- package/dist/schemas/onchain_operations_machine.schema.json +11 -3
- package/dist/schemas/onchain_operations_order.schema.json +14 -11
- package/dist/schemas/onchain_operations_payment.schema.json +12 -9
- package/dist/schemas/onchain_operations_permission.schema.json +8 -0
- package/dist/schemas/onchain_operations_personal.schema.json +8 -0
- package/dist/schemas/onchain_operations_progress.schema.json +9 -1
- package/dist/schemas/onchain_operations_proof.schema.json +9 -1
- package/dist/schemas/onchain_operations_repository.schema.json +8 -0
- package/dist/schemas/onchain_operations_reward.schema.json +14 -11
- package/dist/schemas/onchain_operations_service.schema.json +25 -12
- package/dist/schemas/onchain_operations_treasury.schema.json +17 -19
- package/dist/schemas/onchain_table_data.output.json +52 -10
- package/dist/schemas/persona_operation.output.json +57 -0
- package/dist/schemas/persona_operation.schema.json +9 -0
- package/dist/schemas/query_toolkit.output.json +326 -23
- package/dist/schemas/query_toolkit.schema.json +18 -5
- package/dist/schemas/wip_file.output.json +2 -2
- package/dist/schemas/wip_file.schema.json +2 -2
- package/dist/schemas/workflow_operation.schema.json +1 -1
- package/dist/tools/error-catalog.d.ts +17 -0
- package/dist/tools/error-catalog.js +1 -0
- package/dist/tools/handlers/benchmark-migration.d.ts +29 -8
- package/dist/tools/handlers/benchmark-migration.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/entry-edge-recipe.d.ts +101 -0
- package/dist/tools/handlers/entry-edge-recipe.js +1 -0
- package/dist/tools/handlers/escrow-deficit.d.ts +10 -0
- package/dist/tools/handlers/escrow-deficit.js +1 -0
- package/dist/tools/handlers/evaluation.js +1 -1
- package/dist/tools/handlers/fund-rail-recipe.d.ts +10 -0
- package/dist/tools/handlers/fund-rail-recipe.js +1 -0
- package/dist/tools/handlers/intent-radar.js +1 -1
- package/dist/tools/handlers/local.js +1 -1
- package/dist/tools/handlers/mark-namespace.d.ts +30 -0
- package/dist/tools/handlers/mark-namespace.js +1 -0
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain-name-registration.d.ts +1 -0
- package/dist/tools/handlers/onchain-name-registration.js +1 -1
- package/dist/tools/handlers/onchain-name-registration.spec.js +1 -1
- package/dist/tools/handlers/onchain.d.ts +40 -1
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/publish-binding-echo.d.ts +22 -0
- package/dist/tools/handlers/publish-binding-echo.js +1 -0
- package/dist/tools/handlers/query.d.ts +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/review-chain.d.ts +1 -0
- package/dist/tools/handlers/review-chain.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/handlers/stale-build-check.d.ts +9 -0
- package/dist/tools/handlers/stale-build-check.js +1 -0
- package/dist/tools/handlers/submission-assembly.d.ts +55 -0
- package/dist/tools/handlers/submission-assembly.js +1 -0
- package/dist/tools/handlers/wip.js +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +1 -1
- package/dist/tools/move-fn-index.gen.js +1 -1
- package/dist/tools/publish-gate-state.d.ts +5 -0
- package/dist/tools/publish-gate-state.js +1 -0
- package/dist/tools/registry/business.js +1 -1
- package/dist/tools/registry/onchain.js +1 -1
- package/dist/tools/registry/query.js +1 -1
- package/dist/tools/retry.js +1 -1
- package/dist/tools/runtime-health.js +1 -1
- package/dist/tools/shared.js +1 -1
- package/dist/tools/upgrade-check.d.ts +1 -0
- package/dist/tools/upgrade-check.js +1 -1
- package/dist/tools/wip-verify-ledger.d.ts +2 -0
- package/dist/tools/wip-verify-ledger.js +1 -1
- package/dist/tools/wrap.d.ts +15 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +5 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
import{FEE_PARAM_BINDINGS}from'./fee-param-bindings.js';const hours=a=>a/0x3c,days=a=>a/0x5a0;export const TEMPLATE_TEST_PROFILES=[{'template':'delivery/restaurant-marketplace','note':'Lifecycle\x20windows\x20to\x20minutes:\x20auto_confirm\x201h→6m,\x20claim\x2024h→12m,\x20settle\x2024h→15m\x20'+'(settle\x20>=\x20claim\x20preserved),\x20T-02\x20return\x20window\x2024h→12m\x20(settle\x2015m\x20>=\x20return\x2012m\x20'+'preserves\x20R-WINDOW-MATH),\x20INV-FD-2\x20dispatch\x20window\x201h→2m\x20(no\x20window-math\x20coupling\x20—\x20'+'any\x20positive\x20value\x20unbars\x20the\x20force-cancel).\x20No\x20absolute\x20cutoff\x20on\x20this\x20shape\x20—\x20'+'nothing\x20else\x20to\x20supply.','inputs':{'auto_confirm_hours':hours(0x6),'claim_window_hours':hours(0xc),'settle_hours':hours(0xf),'return_window_hours':hours(0xc),'dispatch_window_hours':hours(0x2)}},{'template':'group_buy/platform-supplied-pickup','note':'Full\x20pickup\x20lifecycle\x20to\x20minutes:\x20pickup\x20window\x2048h→10m,\x20claim\x2024h→5m,\x20return\x2048h→10m,\x20'+'lost-return\x20transit\x207d→35m,\x20settle\x20216h→50m\x20(=\x20claim\x20+\x20return\x20+\x20transit\x20sequenced\x20—\x20the\x20'+'ktt3\x20F-05\x20R-WINDOW-MATH\x20shape\x20with\x20identical\x20ratios).\x20The\x20round\x27s\x20shared\x20ABSOLUTE\x20cutoff\x20'+'(cutoff_ms\x20input)\x20is\x20build-time:\x20supply\x20now\x20+\x20cutoff_lead_minutes.','inputs':{'pickup_window_hours':hours(0xa),'claim_window_hours':hours(0x5),'return_window_hours':hours(0xa),'return_transit_days':days(0x23),'settle_hours':hours(0x32)},'cutoff_lead_minutes':0xf},{'template':'group_buy/leader-sourced-community','note':'Threshold-campaign\x20lifecycle\x20to\x20minutes:\x20claim\x2024h→5m,\x20return\x2048h→10m,\x20transit\x207d→35m.\x20'+'KEPT\x20AT\x20SHIPPED\x20DEFAULT:\x20settle_hours\x20(216h)\x20—\x20no\x20SCALED\x20binding\x20carries\x20it,\x20a\x20fractional\x20'+'value\x20would\x20truncate\x20to\x20zero\x20in\x20the\x20u256\x20guard\x20literal;\x20the\x20uncompressed\x20settle\x20only\x20'+'WIDENS\x20the\x20sequenced-coverage\x20margin\x20(216h\x20>=\x20compressed\x20return+transit),\x20so\x20R-WINDOW-MATH\x20'+'holds.\x20The\x20shared\x20deadline\x20rides\x20campaign_deadline_ms\x20(build-time\x20absolute)\x20—\x20'+'campaign_duration_days\x20stays\x20at\x20its\x20shipped\x20default\x20because\x20the\x20absolute\x20gate\x20is\x20the\x20'+'authoritative\x20one.','inputs':{'claim_window_hours':hours(0x5),'return_window_hours':hours(0xa),'return_transit_days':days(0x23)},'cutoff_lead_minutes':0xf}];const BY_ID=new Map(TEMPLATE_TEST_PROFILES['map'](a=>[a['template'],a]));export function templateTestProfile(a){return BY_ID['get'](a);}export function templateTestProfileInputs(a){return BY_ID['get'](a)?.['inputs'];}export function templateTestProfileIssues(a){const b=[],c=a(),d=new Map(c['map'](e=>[e['id'],e]));for(const e of TEMPLATE_TEST_PROFILES){const f=d['get'](e['template']);if(f===undefined){b['push']({'template':e['template'],'problem':'template\x20does\x20not\x20exist\x20in\x20the\x20catalog'});continue;}for(const [g,h]of Object['entries'](e['inputs'])){if(f['fee_params'][g]===undefined){b['push']({'template':e['template'],'problem':'fee_param\x20\x27'+g+'\x27\x20is\x20not\x20declared\x20by\x20the\x20template'});continue;}if(!(h>0x0)||!Number['isFinite'](h)){b['push']({'template':e['template'],'problem':'override\x20\x27'+g+'\x27='+String(h)+'\x20is\x20not\x20a\x20positive\x20finite\x20number'});continue;}const i=g['endsWith']('_days')?'days':g['endsWith']('_hours')?'hours':undefined;if(i===undefined){b['push']({'template':e['template'],'problem':'override\x20\x27'+g+'\x27\x20is\x20not\x20a\x20window\x20param\x20(_hours/_days)'});continue;}const j=FEE_PARAM_BINDINGS['some'](k=>k['template']===e['template']&&k['param']===g&&k['scale']!==undefined);!j&&b['push']({'template':e['template'],'problem':'override\x20\x27'+g+'\x27\x20has\x20no\x20SCALED\x20fee-param\x20binding\x20—\x20a\x20fractional\x20value\x20would\x20land\x20as\x20a\x20truncated\x20guard\x20literal'});}}return b;}
|
|
1
|
+
import{FEE_PARAM_BINDINGS}from'./fee-param-bindings.js';const hours=a=>a/0x3c,days=a=>a/0x5a0;export const TEMPLATE_TEST_PROFILES=[{'template':'delivery/restaurant-marketplace','note':'Lifecycle\x20windows\x20to\x20minutes:\x20auto_confirm\x201h→6m,\x20claim\x2024h→12m,\x20settle\x2024h→15m\x20'+'(settle\x20>=\x20claim\x20preserved),\x20T-02\x20return\x20window\x2024h→12m\x20(settle\x2015m\x20>=\x20return\x2012m\x20'+'preserves\x20R-WINDOW-MATH),\x20INV-FD-2\x20dispatch\x20window\x201h→2m\x20(no\x20window-math\x20coupling\x20—\x20'+'any\x20positive\x20value\x20unbars\x20the\x20force-cancel).\x20No\x20absolute\x20cutoff\x20on\x20this\x20shape\x20—\x20'+'nothing\x20else\x20to\x20supply.','inputs':{'auto_confirm_hours':hours(0x6),'claim_window_hours':hours(0xc),'settle_hours':hours(0xf),'return_window_hours':hours(0xc),'dispatch_window_hours':hours(0x2)}},{'template':'group_buy/platform-supplied-pickup','note':'Full\x20pickup\x20lifecycle\x20to\x20minutes:\x20pickup\x20window\x2048h→10m,\x20claim\x2024h→5m,\x20return\x2048h→10m,\x20'+'lost-return\x20transit\x207d→35m,\x20return-receipt\x20silence\x207d→5m\x20(the\x20F-TBPM9-O5-02\x20'+'ReturnReceiptTimeoutByKeeper\x20clock\x20—\x20also\x20compressed,\x20it\x20is\x20a\x20buyer\x20window\x20under\x20'+'R-WINDOW-MATH),\x20settle\x20216h→50m\x20(=\x20claim\x20+\x20return\x20+\x20transit\x20sequenced\x20—\x20the\x20'+'ktt3\x20F-05\x20R-WINDOW-MATH\x20shape\x20with\x20identical\x20ratios).\x20The\x20round\x27s\x20shared\x20ABSOLUTE\x20cutoff\x20'+'(cutoff_ms\x20input)\x20is\x20build-time:\x20supply\x20now\x20+\x20cutoff_lead_minutes.','inputs':{'pickup_window_hours':hours(0xa),'claim_window_hours':hours(0x5),'return_window_hours':hours(0xa),'return_transit_days':days(0x23),'return_response_days':days(0x5),'settle_hours':hours(0x32)},'cutoff_lead_minutes':0xf},{'template':'group_buy/leader-sourced-community','note':'Threshold-campaign\x20lifecycle\x20to\x20minutes:\x20claim\x2024h→5m,\x20return\x2048h→10m,\x20transit\x207d→35m.\x20'+'KEPT\x20AT\x20SHIPPED\x20DEFAULT:\x20settle_hours\x20(216h)\x20—\x20no\x20SCALED\x20binding\x20carries\x20it,\x20a\x20fractional\x20'+'value\x20would\x20truncate\x20to\x20zero\x20in\x20the\x20u256\x20guard\x20literal;\x20the\x20uncompressed\x20settle\x20only\x20'+'WIDENS\x20the\x20sequenced-coverage\x20margin\x20(216h\x20>=\x20compressed\x20return+transit),\x20so\x20R-WINDOW-MATH\x20'+'holds.\x20The\x20shared\x20deadline\x20rides\x20campaign_deadline_ms\x20(build-time\x20absolute)\x20—\x20'+'campaign_duration_days\x20stays\x20at\x20its\x20shipped\x20default\x20because\x20the\x20absolute\x20gate\x20is\x20the\x20'+'authoritative\x20one.','inputs':{'claim_window_hours':hours(0x5),'return_window_hours':hours(0xa),'return_transit_days':days(0x23)},'cutoff_lead_minutes':0xf}];const BY_ID=new Map(TEMPLATE_TEST_PROFILES['map'](a=>[a['template'],a]));export function templateTestProfile(a){return BY_ID['get'](a);}export function templateTestProfileInputs(a){return BY_ID['get'](a)?.['inputs'];}export function templateTestProfileIssues(a){const b=[],c=a(),d=new Map(c['map'](e=>[e['id'],e]));for(const e of TEMPLATE_TEST_PROFILES){const f=d['get'](e['template']);if(f===undefined){b['push']({'template':e['template'],'problem':'template\x20does\x20not\x20exist\x20in\x20the\x20catalog'});continue;}for(const [g,h]of Object['entries'](e['inputs'])){if(f['fee_params'][g]===undefined){b['push']({'template':e['template'],'problem':'fee_param\x20\x27'+g+'\x27\x20is\x20not\x20declared\x20by\x20the\x20template'});continue;}if(!(h>0x0)||!Number['isFinite'](h)){b['push']({'template':e['template'],'problem':'override\x20\x27'+g+'\x27='+String(h)+'\x20is\x20not\x20a\x20positive\x20finite\x20number'});continue;}const i=g['endsWith']('_days')?'days':g['endsWith']('_hours')?'hours':undefined;if(i===undefined){b['push']({'template':e['template'],'problem':'override\x20\x27'+g+'\x27\x20is\x20not\x20a\x20window\x20param\x20(_hours/_days)'});continue;}const j=FEE_PARAM_BINDINGS['some'](k=>k['template']===e['template']&&k['param']===g&&k['scale']!==undefined);!j&&b['push']({'template':e['template'],'problem':'override\x20\x27'+g+'\x27\x20has\x20no\x20SCALED\x20fee-param\x20binding\x20—\x20a\x20fractional\x20value\x20would\x20land\x20as\x20a\x20truncated\x20guard\x20literal'});}}return b;}
|
|
@@ -3,6 +3,8 @@ import { type OrderContext, type ParsedForward, type ParsedMachineNode, type Per
|
|
|
3
3
|
import type { CommercialRole } from "../role/types.js";
|
|
4
4
|
export type NameResolver = (addr: string | undefined | null) => string | undefined;
|
|
5
5
|
export declare function resolvePermissionRole(index: number | undefined | null, permissionDescription?: string): string;
|
|
6
|
+
type NodeKind = "complete" | "refund" | "exception" | "advance";
|
|
7
|
+
export declare function classifyNode(name: string): NodeKind;
|
|
6
8
|
export interface GuidanceInput {
|
|
7
9
|
current: string;
|
|
8
10
|
nodes: ParsedMachineNode[];
|
|
@@ -47,6 +49,7 @@ export interface OptionInfo {
|
|
|
47
49
|
risks?: string[];
|
|
48
50
|
consistency: number;
|
|
49
51
|
recommended: boolean;
|
|
52
|
+
waiting_on?: string;
|
|
50
53
|
executable_by_caller?: boolean;
|
|
51
54
|
ambiguous?: {
|
|
52
55
|
destinations: string[];
|
|
@@ -188,3 +191,4 @@ export declare function enumerateActionableForwards(progress: {
|
|
|
188
191
|
name: string;
|
|
189
192
|
operators: string[];
|
|
190
193
|
}[], orderCtx: OrderContext | undefined, permCtx: PermissionContext | undefined): ActionableForwardOption[];
|
|
194
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{query_account_list,LocalMark,GetLocalNamesByAddresses}from'@wowok/wowok';import{NO_AUTO_SETTLEMENT_FACT}from'./settlement-semantics.js';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';import{formatShortAddress}from'../persona/address-format.js';import{recommendedCallForForwardBinding,recommendedCallForOrderHolder}from'../participation/radar-core.js';import{batchQueryObjectsByIds,fetchMachineNodes,fetchOrderContext,fetchPermissionContext}from'../graph/onchain/sdk-batch.js';import{deriveCommercialRole}from'../role/derivation.js';import{valuePerspectiveOf}from'../role/model.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i,PRE_DELIVERY_RE=/^(|entry|paid|kickoff|confirmed|requirements_pending|in_progress|active|processing|subscribed)$/i,ACTIVE_STAGE_RE=/(charg|billing|renew|deliver|fulfill|ship|sent|work|produ)/i,REFUND_FLAVOR_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?|expired)(_|$)/i;function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'completion\x20stage\x20\x22'+a+'\x22';case'refund':return'refund/cancel\x20stage\x20\x22'+a+'\x22';case'exception':return'exception/dispute\x20stage\x20\x22'+a+'\x22';default:return'advance\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;return formatShortAddress(a);}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d,e){const g=e&&a['namedOperator']===''&&!a['permissionIndex']?recommendedCallForOrderHolder({'hasGuard':!!a['guard'],'currentNode':e['currentNode'],'targetNode':e['targetNode']}):recommendedCallForForwardBinding({'permissionIndex':a['permissionIndex'],'namedOperator':a['namedOperator'],'hasGuard':!!a['guard']});if(a['namedOperator']===''){const h=b?.[0x0],i=a['permissionIndex']!==undefined&&a['permissionIndex']!==null;return{'kind':'order_holder','role_name':i?'order\x20holder\x20(customer)\x20OR\x20'+resolvePermissionRole(a['permissionIndex'],c):'order\x20holder\x20(customer)','permission_index':i?a['permissionIndex']:undefined,'account_name':d?d(h):shortAddr(h),'recommended_call':g};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22','recommended_call':g};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c),'recommended_call':g};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c,d){if(!c)return{'gains':[],'risks':[]};if(d)return perspectiveGainsRisks(a,valuePerspectiveOf(d));if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20unlocked\x20—\x20provider\x20funds\x20become\x20releasable\x20(an\x20explicit\x20allocation\x20step\x20is\x20still\x20required;\x20nothing\x20releases\x20automatically)'],'risks':['Provider\x20can\x20now\x20claim\x20the\x20escrow','Refund\x20leverage\x20lost\x20once\x20completion\x20is\x20recorded\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Refund\x20path\x20unlocked\x20—\x20escrow\x20becomes\x20releasable\x20back\x20to\x20you\x20via\x20an\x20explicit\x20allocation\x20step\x20(trigger\x20it\x20yourself;\x20funds\x20are\x20not\x20returned\x20automatically)'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20unlocked\x20—\x20funds\x20releasable\x20to\x20provider\x20via\x20an\x20explicit\x20allocation\x20step\x20(NOT\x20automatic\x20on\x20node\x20migration)'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function perspectiveGainsRisks(a,b){if(b==='consumer')switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20unlocked\x20—\x20provider\x20funds\x20become\x20releasable\x20(an\x20explicit\x20allocation\x20step\x20is\x20still\x20required;\x20nothing\x20releases\x20automatically)'],'risks':['Provider\x20can\x20now\x20claim\x20the\x20escrow','Refund\x20leverage\x20lost\x20once\x20completion\x20is\x20recorded\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Refund\x20path\x20unlocked\x20—\x20escrow\x20becomes\x20releasable\x20back\x20to\x20you\x20via\x20an\x20explicit\x20allocation\x20step\x20(trigger\x20it\x20yourself;\x20funds\x20are\x20not\x20returned\x20automatically)'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}if(b==='producer')switch(a){case'complete':return{'gains':['Settlement\x20unlocked\x20—\x20funds\x20releasable\x20to\x20provider\x20via\x20an\x20explicit\x20allocation\x20step\x20(NOT\x20automatic\x20on\x20node\x20migration)'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Flow\x20advances\x20—\x20the\x20workflow\x20moves\x20to\x20its\x20delivery/settlement\x20stage'],'risks':[]};case'refund':return{'gains':['Clean\x20closure\x20of\x20the\x20workflow'],'risks':['Cancels\x20the\x20delivery\x20track\x20—\x20confirm\x20this\x20matches\x20what\x20the\x20parties\x20agreed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e,f,g){let h;if(!e)h=a==='exception'?0x2d:0x32;else{if(g){const i=valuePerspectiveOf(g);h=i==='consumer'?a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:i==='producer'?a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32:a==='complete'?0x37:a==='refund'?0x32:a==='exception'?0x28:0x32;}else b?h=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:h=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;}if(e&&c)h+=0x14;if(d)h-=0xa;return e&&f&&(a==='refund'||a==='exception')&&(h=Math['min'](h,0x28)),Math['max'](0x0,Math['min'](0x64,h));}export function buildWorkflowGuidance(a){const b=[],c=PRE_DELIVERY_RE['test'](a['current'])||ACTIVE_STAGE_RE['test'](a['current'])||a['just_advanced']===!![];for(const n of a['nodes']){for(const p of n['pairs']){if(p['prev_node']!==a['current'])continue;for(const q of p['forwards']){if(!q['name'])continue;const r=resolveOperator(q,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'],{'currentNode':a['current'],'targetNode':n['name']}),s=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let t=![];a['callerAddress']&&(t=accountCanExecuteForward(q,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const u=classifyNode(n['name']),v=!!a['caller'],{gains:w,risks:x}=gainsRisksFor(u,s,v,a['callerRole']),y=consistencyFor(u,s,t,!!q['guard'],v,c,a['callerRole']);b['push']({'next_node':n['name'],'forward':q['name'],'weight':q['weight'],'operator':r,'guard':q['guard'],'business_meaning':businessMeaning(n['name'],u),'gains':w,'risks':x,'consistency':y,'recommended':![],'executable_by_caller':t});}}}if(b['length']===0x0){const z=a['escrow'],A=!z?'':z['fund_direction']==='buyer'?'the\x20rails\x20are\x20ORDER-ANCHORED\x20(GuardIdentifier\x20recipients)\x20—\x20the\x20payout\x20lands\x20on\x20the\x20Order\x20object\x20for\x20the\x20order\x20owner\x20(the\x20buyer)\x20to\x20claim,\x20regardless\x20of\x20the\x20node\x27s\x20name\x20(\x22'+a['current']+'\x22).\x20':z['fund_direction']==='provider'?'the\x20rails\x20pay\x20ENTITY\x20recipients\x20—\x20the\x20payout\x20goes\x20to\x20the\x20named\x20provider-side\x20parties,\x20regardless\x20of\x20the\x20node\x27s\x20name\x20(\x22'+a['current']+'\x22).\x20':z['fund_direction']==='mixed'?'the\x20rails\x20mix\x20order-anchored\x20and\x20Entity\x20recipients\x20—\x20which\x20party\x20is\x20paid\x20depends\x20on\x20WHICH\x20rail\x20fires;\x20inspect\x20each\x20allocator\x27s\x20guard\x20before\x20triggering.\x20':z['fund_direction']==='signer'?'a\x20rail\x20pays\x20whoever\x20TRIGGERS\x20it\x20(Signer\x20recipient)\x20—\x20the\x20operator\x27s\x20own\x20identity\x20decides\x20the\x20payee;\x20never\x20trigger\x20on\x20behalf\x20of\x20another\x20party.\x20':'rail\x20recipients\x20were\x20unreadable\x20from\x20the\x20machine\x20graph\x20—\x20READ\x20them\x20before\x20triggering,\x20the\x20tooling\x20can:\x20query_toolkit\x20query_type=\x27service_panorama\x27\x20returns\x20result.service.order_allocators.allocators[].sharing\x20(who/mode/value\x20per\x20rail),\x20and\x20object_panorama\x20on\x20the\x20pool\x27s\x20Allocation\x20(\x27'+z['allocation']+'\x27)\x20returns\x20the\x20balance,\x20payment_info\x20anchor\x20and\x20the\x20same\x20resolved\x20recipient\x20rows.\x20The\x20name\x20flavor\x20('+(z['refund_terminal']?'refund/cancel-flavored':'completion-flavored')+')\x20is\x20a\x20GUESS\x20about\x20direction,\x20never\x20a\x20fact\x20—\x20do\x20not\x20act\x20on\x20it\x20alone.\x20',B=z?'Node\x20\x22'+a['current']+'\x22\x20is\x20terminal\x20(no\x20outgoing\x20forwards)\x20—\x20but\x20the\x20order\x27s\x20Allocation\x20'+z['allocation']+'\x20still\x20holds\x20'+z['balance']+'\x20(smallest\x20unit)\x20with\x20no\x20payments\x20recorded.\x20'+NO_AUTO_SETTLEMENT_FACT+'\x20'+A+('Execute\x20via\x20onchain_operations\x20{operation_type:\x27allocation\x27,\x20data:{object:\x27'+z['allocation']+'\x27,\x20alloc_by_guard:\x27<guard>\x27}}')+(z['guards']['length']?'\x20—\x20candidate\x20guards\x20on\x20this\x20pool:\x20'+z['guards']['join'](',\x20')+'.':'\x20—\x20inspect\x20the\x20pool\x27s\x20allocators\x20first.')+'\x20Trigger\x20ONCE\x20and\x20verify\x20the\x20pool\x20drained\x20(a\x20fully-drained\x20pool\x20aborts\x20on\x20re-trigger;\x20a\x20max-capped\x20pool\x20re-splits\x20the\x20remainder).\x20Recipients\x20then\x20claim\x20their\x20CoinWrappers\x20(receive).':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.';return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':B};}const d=new Map();for(const C of b){const D=d['get'](C['forward']);if(D)D['add'](C['next_node']);else d['set'](C['forward'],new Set([C['next_node']]));}const e=[];for(const [E,F]of d){if(F['size']<0x2)continue;const G=[...F]['sort'](),H=G['some'](K=>classifyNode(K)==='refund'),I=G['some'](K=>classifyNode(K)!=='refund'),J=H&&I;e['push'](J?'CRITICAL\x20'+E:E);for(let K=0x0;K<b['length'];K++){if(b[K]['forward']!==E)continue;b[K]={...b[K],'ambiguous':{'destinations':G,'fund_conflict':J}};}}e['sort'](),b['sort']((L,M)=>M['consistency']-L['consistency']);const g=e['length']>0x0;let h;if(!g){const L=b['findIndex'](M=>!M['ambiguous']);L>=0x0&&(h={...b[L],'recommended':!![]},b[L]=h);}const j=[];for(const M of b){h&&M!==h&&M['consistency']>0x0&&M['forward']!==h['forward']&&j['push']('Choosing\x20\x22'+M['forward']+'\x20→\x20'+M['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+h['forward']+'\x20→\x20'+h['next_node']+'\x22');}c&&b['some'](N=>classifyNode(N['next_node'])==='refund')&&j['push']('Refund/cancel\x20options\x20are\x20listed\x20but\x20not\x20auto-recommended\x20here\x20(pre-delivery\x20stage,\x20active\x20billing/delivery\x20stage,\x20or\x20a\x20just-completed\x20advance\x20signals\x20intent\x20to\x20continue)\x20—\x20choose\x20one\x20explicitly\x20when\x20cancellation\x20is\x20intended');for(const N of b){if(!N['ambiguous'])continue;j['push']('\x22'+N['forward']+'\x22\x20is\x20AMBIGUOUS\x20from\x20\x22'+a['current']+'\x22\x20—\x20it\x20legally\x20reaches\x20'+N['ambiguous']['destinations']['join']('\x20/\x20')+'\x20'+(N['ambiguous']['fund_conflict']?'(fund\x20direction\x20DIFFERS\x20between\x20them);\x20the\x20destination\x20you\x20pass\x20in\x20next_node_name\x20decides,\x20so\x20state\x20the\x20intended\x20node\x20explicitly\x20instead\x20of\x20trusting\x20the\x20forward\x20name':';\x20state\x20the\x20intended\x20node\x20explicitly'));}const k=[];if(h){const O=h['operator'];if(O['kind']==='order_holder')O['account_name']&&O['account_name']!==a['caller']&&k['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+O['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.');else{if(h['executable_by_caller']===![]){const P=O['kind']==='named_operator'?'named\x20operator\x20\x22'+O['named_operator']+'\x22':O['role_name']??'permission\x20index\x20'+(O['permission_index']??'(unknown)');let Q;if(O['kind']==='permission_index'&&a['permissionContext']&&O['permission_index']!==undefined){const R=[...a['orderHolderAddresses']??[],...a['callerAddress']?[a['callerAddress']]:[]],S=R['find'](T=>{if(!T)return![];const U=T['toLowerCase']();return a['permissionContext']['admin']['has'](U)||(a['permissionContext']['table']['get'](U)?.['has'](O['permission_index'])??![]);});if(S)Q=a['nameResolver']?a['nameResolver'](S):shortAddr(S);}k['push']('The\x20recommended\x20action\x20requires\x20'+P+(Q?'\x20(held\x20by\x20'+Q+')':'')+('\x20—\x20the\x20current\x20signing\x20account\x20('+(a['caller']??'unresolved')+')\x20is\x20not\x20entitled;\x20switch\x20env.account\x20to\x20an\x20account\x20holding\x20it\x20before\x20operating.'));}}}e['length']>0x0&&k['push']('Machine\x20topology\x20defect\x20(P0-6):\x20forward\x20name(s)\x20'+[...new Set(e['map'](T=>T['replace'](/^CRITICAL /,'')))]['join'](',\x20')+'\x20'+'resolve\x20to\x20more\x20than\x20one\x20destination\x20from\x20this\x20node.\x20The\x20contract\x20accepts\x20any\x20of\x20them\x20(next_node\x20is\x20a\x20caller\x20argument;\x20'+'the\x20graph\x20only\x20forbids\x20duplicate\x20prev_node\x20WITHIN\x20one\x20node),\x20so\x20the\x20workflow\x20outcome\x20is\x20decided\x20by\x20the\x20CALLER,\x20not\x20by\x20the\x20published\x20Machine.\x20'+'Nothing\x20is\x20auto-recommended\x20for\x20these\x20forwards\x20—\x20fix\x20the\x20graph\x20by\x20giving\x20each\x20destination\x20its\x20own\x20forward\x20name.');const l=b['filter'](T=>T['guard']);l['length']>=0x2&&l['length']===b['length']&&k['push'](l['length']+'\x20guarded\x20variants\x20mount\x20on\x20node\x20\x22'+a['current']+'\x22\x20and\x20they\x20are\x20typically\x20MUTUALLY\x20EXCLUSIVE\x20'+'(variant\x20rails\x20usually\x20read\x20a\x20policy/mode\x20oracle\x20row\x20—\x20only\x20the\x20row\x27s\x20current\x20value\x20admits\x20one\x20of\x20them).\x20'+'Do\x20NOT\x20discover\x20which\x20one\x20by\x20signing:\x20probe\x20with\x20env.dry_run=true\x20first\x20(free,\x20never\x20committed\x20—\x20'+'EVERY\x20write\x20channel\x20honors\x20env.dry_run:\x20the\x20call\x20simulates\x20and\x20returns\x20a\x20\x22dry_run:*\x22\x20digest,\x20'+'nothing\x20is\x20signed\x20or\x20submitted,\x20so\x20a\x20guard\x20rejection\x20on\x20a\x20dry\x20run\x20does\x20not\x20consume\x20the\x20retry\x20budget\x20'+'and\x20mints\x20nothing)\x20—\x20the\x20rejection\x20diagnosis\x20names\x20the\x20failing\x20guard.');const m=/(enter|fund|renew|pay|deposit|top_?up|refund|claim|withdraw|settle|release)/i;return h&&m['test'](h['forward'])&&k['push']('\x22'+h['forward']+'\x22\x20is\x20a\x20MONEY-state\x20forward,\x20but\x20this\x20guidance\x20reads\x20only\x20topology\x20and\x20roles\x20—\x20NOT\x20the\x20order\x27s\x20live\x20Allocation\x20balance\x20or\x20claimed_by.\x20If\x20the\x20escrow\x20is\x20already\x20drained\x20(allocation.balance\x20==\x200)\x20or\x20arbitration-displaced\x20(order.claimed_by\x20some\x20==\x20true),\x20the\x20advance\x20burns\x20gas\x20and\x20aborts:\x20query\x20the\x20order\x27s\x20allocation\x20balance\x20+\x20claimed_by\x20FIRST,\x20and\x20probe\x20with\x20env.dry_run=true\x20when\x20unsure.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':h?{'best':h['forward']+'\x20→\x20'+h['next_node'],'rationale':'Highest\x20consistency\x20('+h['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(h['gains']?.['join'](';\x20')||'none')+'.\x20Risks:\x20'+(h['risks']?.['join'](';\x20')||'none')+'.\x20Operator:\x20'+(h['operator']['role_name']??h['operator']['kind'])+(h['operator']['account_name']?'\x20('+h['operator']['account_name']+')':'')+'.'+(h['guard']?'\x20Guard\x20to\x20satisfy:\x20'+h['guard']+'.':''),'caveat':j['length']?j['join']('.\x20'):undefined}:{'best':undefined,'rationale':e['length']?'No\x20action\x20recommended:\x20every\x20reachable\x20forward\x20from\x20\x22'+a['current']+'\x22\x20is\x20ambiguous\x20(resolves\x20to\x20multiple\x20destinations).\x20Choose\x20the\x20destination\x20node\x20deliberately\x20—\x20do\x20not\x20let\x20the\x20forward\x20name\x20decide\x20it.':undefined,'caveat':j['length']?j['join']('.\x20'):undefined},'note':k['length']?k['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b={'hold':'held','unhold':'released\x20(unhold)','adminUnhold':'force-released\x20(adminUnhold)'},c=a['op']?b[a['op']]:undefined,d=c!==undefined?![]:a['current']===a['targetNode'],e={'account':a['callerName'],'action':c!==undefined?a['callerName']+'\x20'+c+'\x20\x22'+a['forward']+'\x22\x20—\x20node\x20stays\x20at\x20\x22'+a['current']+'\x22':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':d,'current_node':a['current']};if(a['simulated'])e['simulated']=!![];if(a['txDigest'])e['digest']=a['txDigest'];if(a['signer'])e['signer']=a['signer'];if(c!==undefined)e['note']='Hold-family\x20op\x20does\x20not\x20migrate\x20the\x20node\x20—\x20it\x20only\x20pins/unpins\x20a\x20forward;\x20the\x20current\x20node\x20and\x20its\x20threshold\x20state\x20are\x20unchanged.';else{if(!d){const h=a['nodes']['filter'](l=>l['name']===a['targetNode'])['flatMap'](l=>l['pairs'])['find'](l=>l['prev_node']===a['current']),i=a['session']?.['slice'](-0x1)[0x0],j=i?.['threshold']??h?.['threshold']??0x0,k=i?.['weights']??0x0;if(j>0x0){e['threshold']=j,e['accumulated_weight']=k,e['remaining']=Math['max'](0x0,j-k);const l=new Set((i?.['forwards']??[])['filter'](n=>n?.['accomplished']!==![])['map'](n=>n?.['forward'])['filter'](n=>!!n)),m=[];for(const n of h?.['forwards']??[]){if(!n['name']||l['has'](n['name']))continue;m['push']({'forward':n['name'],'operator':resolveOperator(n,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'],{'currentNode':a['current'],'targetNode':a['targetNode']})});}if(m['length'])e['waiting_on']=m;e['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+j+',\x20accumulated\x20weight\x20'+k+',\x20remaining\x20'+Math['max'](0x0,j-k)+'.\x20'+(m['length']?'Waiting\x20for:\x20'+m['map'](o=>o['forward']+'\x20('+(o['operator']['role_name']??o['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else e['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}}const g=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'callerAddress':a['callerAddress'],'callerRole':a['callerRole'],'orderHolderAddresses':a['orderHolderAddresses'],'progressNamedOperator':a['progressNamedOperator'],'permissionContext':a['permissionContext'],'orderContext':a['orderContext'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver'],'escrow':a['escrow'],'just_advanced':d&&classifyNode(a['targetNode'])!=='refund'});if(g['options']['length']>0x0)e['next_guidance']=g;else{if(g['note'])e['note']=e['note']?e['note']+'\x20'+g['note']:g['note'];}return e;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);c['ambiguous']&&d['push']('AMBIGUOUS:\x20this\x20forward\x20name\x20also\x20reaches\x20'+c['ambiguous']['destinations']['filter'](e=>e!==c['next_node'])['join'](',\x20')+(c['ambiguous']['fund_conflict']?'\x20(fund\x20direction\x20differs\x20—\x20next_node_name\x20decides)':''));d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']?.['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']?.['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));a['digest']&&b['push']('\x20\x20•\x20tx\x20digest:\x20'+a['digest']+(a['signer']?'\x20|\x20signer:\x20'+a['signer']:'')+'\x20(verify\x20via\x20onchain_transaction\x20or\x20a\x20block\x20explorer)');a['simulated']&&b['push']('\x20\x20•\x20simulated\x20(dry-run):\x20this\x20migration\x20comes\x20from\x20the\x20call\x27s\x20own\x20events\x20—\x20state\x20NOT\x20committed\x20on-chain');if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export function extractObjectVersionFromTx(a,b){if(!a||typeof a!=='object')return undefined;const d=a,e=d['effects']?.['objectChanges']??d['objectChanges'];if(!Array['isArray'](e))return undefined;const f=b['toLowerCase']();for(const g of e){if(typeof g?.['object']!=='string'||String(g['object'])['toLowerCase']()!==f)continue;if(g['version']!==undefined&&g['version']!==null)return String(g['version']);}return undefined;}export function extractProgressEventNodeFromTx(a,b){if(!a||typeof a!=='object'||!b)return undefined;const c=a,d=c['events']??c['effects']?.['events'];if(!Array['isArray'](d))return undefined;const e=b['toLowerCase']();for(const f of d){const g=f?.['json']??f?.['parsedJson']??f,h=typeof g?.['node']==='string'?g['node']:undefined;if(!h)continue;const i=typeof g?.['object']==='string'?g['object']['trim']()['toLowerCase']():'';if(i===e||i['startsWith'](e+'\x20')||i['startsWith'](e+'('))return h;}return undefined;}export function extractTxDigestFromResult(a){const b=a?.['digest'];if(typeof b!=='string'||!b||b['startsWith']('dry_run:'))return undefined;return b;}async function fetchTerminalEscrow(b,c,d,e){if(!b)return undefined;try{const f=(await batchQueryObjectsByIds([b],c,d??!![]))[0x0],g=f?.['data']??f,h=typeof g?.['allocation']==='string'?g['allocation']:undefined;if(!h)return undefined;const i=(await batchQueryObjectsByIds([h],c,d??!![]))[0x0],j=i?.['data']??i,k=typeof j?.['balance']==='bigint'?j['balance']:BigInt(j?.['balance']??0x0);if(k<=0x0n)return undefined;const l=Array['isArray'](j?.['payment'])?j['payment']:[];if(l['length']>0x0)return undefined;const m=(Array['isArray'](j?.['allocators']?.['allocators'])?j['allocators']['allocators']:[])['map'](p=>String(p?.['guard']??''))['filter'](p=>p),n=new Set();for(const p of Array['isArray'](j?.['allocators']?.['allocators'])?j['allocators']['allocators']:[]){for(const q of Array['isArray'](p?.['sharing'])?p['sharing']:[]){const r=q?.['who'];if(r!==null&&typeof r==='object'){if('GuardIdentifier'in r)n['add']('buyer');else{if('Entity'in r)n['add']('provider');else{if('Signer'in r)n['add']('signer');}}}}}const o=n['size']===0x0?'unknown':n['size']>0x1?'mixed':[...n][0x0];return{'allocation':h,'balance':k['toString'](),'guards':m,'fund_direction':o,'refund_terminal':REFUND_FLAVOR_RE['test'](e)};}catch{return undefined;}}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=async()=>(await batchQueryObjectsByIds([b],a['network'],!![]))[0x0];let d=await c();const e=extractObjectVersionFromTx(a['txResult'],b);for(let A=0x0;e!==undefined&&d&&String(d['version']??'')!==e&&A<0x2;A++){await new Promise(C=>setTimeout(C,0x258));const B=await c();if(B)d=B;}const f=d?.['data']??d;if((d?.['type']??f?.['type'])!=='Progress')return undefined;let g=f['current']??'';const h=extractProgressEventNodeFromTx(a['txResult'],b),i=h!==undefined&&g!==h;if(i)g=h;const j=i&&a['dryRun']===!![],k=f['machine'],l=Array['isArray'](f['session'])?f['session']:[],m=(Array['isArray'](f['namedOperator'])?f['namedOperator']['find'](C=>C?.['name']==='')?.['operators']:undefined)??[];if(!k)return undefined;const n=await fetchMachineNodes(k,a['network'],![]);let o,p;try{const C=await batchQueryObjectsByIds([k],a['network'],a['noCache']),D=C[0x0],E=D?.['data']??D,F=E?.['permission'];if(F){const G=await batchQueryObjectsByIds([F],a['network'],a['noCache']),H=G[0x0];o=(H?.['data']??H)?.['description']??undefined,p=await fetchPermissionContext(F,a['network'],a['noCache']);}}catch{}const q=(Array['isArray'](f['namedOperator'])?f['namedOperator']:[])['map'](I=>({'name':String(I?.['name']??''),'operators':(I?.['operators']??[])['map'](J=>String(J))}));let r;f['task']&&(r=await fetchOrderContext(f['task'],a['network'],a['noCache']));const s=r?Array['from'](new Set([r['builder'],...r['agent']])['values']()):m;let t;try{t=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{t=undefined;}const u=await makeNameResolver([a['accountName'],...s]);let v;if(t){const I=[...p?.['table']['get'](t)??[]];p?.['admin']['has'](t)&&I['length']===0x0?v='collaborator':v=deriveCommercialRole({'account':t,'order_holder':s['includes'](t)?t:undefined,'held_permission_indexes':I,'named_operator_names':(q??[])['filter'](J=>(J['operators']??[])['some'](K=>K?.['toLowerCase']()===t['toLowerCase']()))['map'](J=>J['name']),'has_active_order':!![]})['role'];}const w={'current':g,'nodes':n,'caller':a['accountName'],'callerAddress':t,'callerRole':v,'orderHolderAddresses':s,'progressNamedOperator':q,'permissionContext':p,'orderContext':r,'permissionDescription':o,'nameResolver':u};let x=buildWorkflowGuidance(w);if(x['options']['length']===0x0){const J=await fetchTerminalEscrow(f['task'],a['network'],a['noCache'],g);J&&(w['escrow']=J,x=buildWorkflowGuidance(w));}let y;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(y=buildWorkflowReceipt({...w,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':l,'simulated':j,'txDigest':extractTxDigestFromResult(a['txResult']),'signer':t}));if(a['compact']){x['options']['length']&&!y?.['next_guidance']?.['options']['length']&&trimGuidanceProse(x);if(y?.['next_guidance'])trimGuidanceProse(y['next_guidance']);}const z=[y?renderReceiptText(y):undefined,x['options']['length']&&!y?.['next_guidance']?.['options']['length']?renderGuidanceText(x):undefined]['filter'](K=>!!K)['join']('\x0a\x0a');return{'guidance':x,'receipt':y,'text':z};}catch{return undefined;}}export async function resolveHoldableEdges(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=(await batchQueryObjectsByIds([b],a['network'],!![]))[0x0],d=c?.['data']??c;if((c?.['type']??d?.['type'])!=='Progress')return undefined;const e=typeof d['current']==='string'?d['current']:'',g=d['machine'];if(!g)return undefined;const h=await fetchMachineNodes(g,a['network'],![]);let i;try{const n=await batchQueryObjectsByIds([g],a['network'],a['noCache']),o=(n[0x0]?.['data']??n[0x0])?.['permission'];if(o)i=await fetchPermissionContext(o,a['network'],a['noCache']);}catch{}const j=(Array['isArray'](d['namedOperator'])?d['namedOperator']:[])['map'](p=>({'name':String(p?.['name']??''),'operators':(p?.['operators']??[])['map'](q=>String(q))}));let k;if(d['task'])k=await fetchOrderContext(d['task'],a['network'],a['noCache']);let l;try{l=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{l=undefined;}if(!l)return{'current':e,'edges':[]};const m=[];for(const p of h){for(const q of p['pairs']){if(q['prev_node']!==e)continue;for(const r of q['forwards']){if(!r['name'])continue;m['push']({'next_node':p['name'],'forward':r['name'],'weight':r['weight'],'threshold':q['threshold'],'guard':r['guard'],'kind':forwardOperatorKind(r),'holdable':accountCanExecuteForward(r,l,j,k,i)});}}}return{'current':e,'edges':m};}catch{return undefined;}}function trimGuidanceProse(a){for(const b of a['options']??[]){delete b['gains'],delete b['risks'];if(!b['recommended'])delete b['operator']?.['recommended_call']?.['reason'];}}export function mergeGuidanceIntoOutput(a,b,c){if(!b)return a;try{const d=a?.['structuredContent'];if(d&&typeof d==='object'){const e=d['semantic'];if(e&&typeof e==='object'){const f=!!b['receipt']?.['next_guidance']?.['options']?.['length'];b['guidance']&&!f&&(e['workflow_guidance']=b['guidance']);if(b['receipt'])e['workflow_receipt']=b['receipt'];c?.['responseLevel']!=='full'&&(e['workflow_guidance']&&trimGuidanceProse(e['workflow_guidance']),b['receipt']?.['next_guidance']&&trimGuidanceProse(b['receipt']['next_guidance']));}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}export async function resolveLocalNamesFor(a){const b=new Map();try{const c=[...new Set((a??[])['filter'](e=>typeof e==='string'&&e['startsWith']('0x')))];if(c['length']===0x0)return{'byAddress':b};const d=await GetLocalNamesByAddresses(c);for(const e of d??[]){const f=e?.['account']||e?.['local_mark'];if(f)b['set'](String(e['address'])['toLowerCase'](),f);}}catch{}return{'byAddress':b};}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=a['namedOperator'],i=c['find'](j=>String(j?.['name']??'')===h);if(i?.['operators']?.['some'](j=>String(j)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const j=e['table']['get'](g);if(j?.['has'](a['permissionIndex']))return!![];}return![];}export function forwardOperatorKind(a){if(a['namedOperator']==='')return'order_holder';if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return'named_operator';return'permission_index';}export function enumerateActionableForwards(a,b,c,d,e,g){const h=typeof a?.['current']==='string'?a['current']:'',i=new Map();for(const k of Array['isArray'](a?.['session'])?a['session']:[]){const l=String(k?.['next_node']??'');for(const m of Array['isArray'](k?.['forwards'])?k['forwards']:[]){i['set'](l+'|'+String(m?.['forward']??''),{'who':m?.['who']?String(m['who'])['toLowerCase']():null,'accomplished':!!m?.['accomplished']});}}const j=[];for(const n of b){for(const o of n['pairs']){if(o['prev_node']!==h)continue;for(const p of o['forwards']){if(!p['name'])continue;const q=i['get'](n['name']+'|'+p['name']);if(q?.['accomplished'])continue;let r=c['filter'](t=>accountCanExecuteForward(p,t,d,e,g));q?.['who']&&(r=r['filter'](t=>t['toLowerCase']()===q['who'])),j['push']({'next_node':n['name'],'forward':p['name'],'weight':p['weight'],'threshold':o['threshold'],'guard':p['guard'],'operator_kind':forwardOperatorKind(p),'permission_index':p['permissionIndex']??undefined,'named_operator':typeof p['namedOperator']==='string'&&p['namedOperator']['length']>0x0?p['namedOperator']:undefined,'executable_accounts':r['map'](t=>t['toLowerCase']())});}}}return j;}
|
|
1
|
+
import{query_account_list,LocalMark,GetLocalNamesByAddresses}from'@wowok/wowok';import{NO_AUTO_SETTLEMENT_FACT}from'./settlement-semantics.js';import{REPOSITORY_PERMISSIONS,REWARD_PERMISSIONS,MACHINE_PERMISSIONS,PROGRESS_PERMISSIONS,TREASURY_PERMISSIONS,SERVICE_PERMISSIONS,ARBITRATION_PERMISSIONS,DEMAND_PERMISSIONS,CONTACT_PERMISSIONS}from'./permission-ledger.js';import{formatShortAddress}from'../persona/address-format.js';import{recommendedCallForForwardBinding,recommendedCallForOrderHolder}from'../participation/radar-core.js';import{batchQueryObjectsByIds,fetchMachineNodes,fetchOrderContext,fetchPermissionContext}from'../graph/onchain/sdk-batch.js';import{deriveCommercialRole}from'../role/derivation.js';import{valuePerspectiveOf}from'../role/model.js';const BUILTIN_PERMISSION_MAP=new Map();for(const entry of[...REPOSITORY_PERMISSIONS,...REWARD_PERMISSIONS,...MACHINE_PERMISSIONS,...PROGRESS_PERMISSIONS,...TREASURY_PERMISSIONS,...SERVICE_PERMISSIONS,...ARBITRATION_PERMISSIONS,...DEMAND_PERMISSIONS,...CONTACT_PERMISSIONS]){BUILTIN_PERMISSION_MAP['set'](entry['index'],entry['name']);}export function resolvePermissionRole(a,b){if(a===undefined||a===null)return'unknown\x20role';if(b){const d=/([A-Za-z][A-Za-z0-9_]*)\s*=\s*(\d+)/g;let e;while((e=d['exec'](b))!==null){if(Number(e[0x2])===a)return e[0x1]+'\x20(permission\x20'+a+')';}}const c=BUILTIN_PERMISSION_MAP['get'](a);if(c)return c+'\x20(permission\x20'+a+')';return'permission\x20'+a;}const COMPLETE_RE=/(^|_)(completed?|done|finished|received|delivered|accepted|confirmed|finalized|success|approved)(_|$)/i,REFUND_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?)(_|$)/i,EXCEPTION_RE=/(^|_)(interrupt(ed)?|exception|dispute(d)?|fail(ed)?|abort(ed)?|reject(ed)?)(_|$)/i,PRE_DELIVERY_RE=/^(|entry|paid|kickoff|confirmed|requirements_pending|in_progress|active|processing|subscribed)$/i,ACTIVE_STAGE_RE=/(charg|billing|renew|deliver|fulfill|ship|sent|work|produ)/i,REFUND_FLAVOR_RE=/(^|_)(cancel(led)?|refund(ed)?|return(ed|_approved)?|expired)(_|$)/i;export function classifyNode(a){if(COMPLETE_RE['test'](a))return'complete';if(REFUND_RE['test'](a))return'refund';if(EXCEPTION_RE['test'](a))return'exception';return'advance';}function businessMeaning(a,b){switch(b){case'complete':return'completion\x20stage\x20\x22'+a+'\x22';case'refund':return'refund/cancel\x20stage\x20\x22'+a+'\x22';case'exception':return'exception/dispute\x20stage\x20\x22'+a+'\x22';default:return'advance\x20to\x20\x22'+a+'\x22';}}function shortAddr(a){if(!a)return undefined;return formatShortAddress(a);}function callerIsOrderHolder(a,b){if(!a||!b?.['length'])return![];const d=a['toLowerCase']();return b['some'](e=>e?.['toLowerCase']()===d);}function resolveOperator(a,b,c,d,e){const g=e&&a['namedOperator']===''&&!a['permissionIndex']?recommendedCallForOrderHolder({'hasGuard':!!a['guard'],'currentNode':e['currentNode'],'targetNode':e['targetNode']}):recommendedCallForForwardBinding({'permissionIndex':a['permissionIndex'],'namedOperator':a['namedOperator'],'hasGuard':!!a['guard']});if(a['namedOperator']===''){const h=b?.[0x0],i=a['permissionIndex']!==undefined&&a['permissionIndex']!==null;return{'kind':'order_holder','role_name':i?'order\x20holder\x20(customer)\x20OR\x20'+resolvePermissionRole(a['permissionIndex'],c):'order\x20holder\x20(customer)','permission_index':i?a['permissionIndex']:undefined,'account_name':d?d(h):shortAddr(h),'recommended_call':g};}if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return{'kind':'named_operator','named_operator':a['namedOperator'],'role_name':'named\x20operator\x20\x22'+a['namedOperator']+'\x22','recommended_call':g};if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null)return{'kind':'permission_index','permission_index':a['permissionIndex'],'role_name':resolvePermissionRole(a['permissionIndex'],c),'recommended_call':g};return{'kind':'order_holder','role_name':'unknown\x20operator'};}function gainsRisksFor(a,b,c,d){if(!c)return{'gains':[],'risks':[]};if(d)return perspectiveGainsRisks(a,valuePerspectiveOf(d));if(b)switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20unlocked\x20—\x20provider\x20funds\x20become\x20releasable\x20(an\x20explicit\x20allocation\x20step\x20is\x20still\x20required;\x20nothing\x20releases\x20automatically)'],'risks':['Provider\x20can\x20now\x20claim\x20the\x20escrow','Refund\x20leverage\x20lost\x20once\x20completion\x20is\x20recorded\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Refund\x20path\x20unlocked\x20—\x20escrow\x20becomes\x20releasable\x20back\x20to\x20you\x20via\x20an\x20explicit\x20allocation\x20step\x20(trigger\x20it\x20yourself;\x20funds\x20are\x20not\x20returned\x20automatically)'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Settlement\x20unlocked\x20—\x20funds\x20releasable\x20to\x20provider\x20via\x20an\x20explicit\x20allocation\x20step\x20(NOT\x20automatic\x20on\x20node\x20migration)'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function perspectiveGainsRisks(a,b){if(b==='consumer')switch(a){case'complete':return{'gains':['Flow\x20advances','Settlement\x20unlocked\x20—\x20provider\x20funds\x20become\x20releasable\x20(an\x20explicit\x20allocation\x20step\x20is\x20still\x20required;\x20nothing\x20releases\x20automatically)'],'risks':['Provider\x20can\x20now\x20claim\x20the\x20escrow','Refund\x20leverage\x20lost\x20once\x20completion\x20is\x20recorded\x20—\x20confirm\x20only\x20if\x20service\x20verified']};case'refund':return{'gains':['Refund\x20path\x20unlocked\x20—\x20escrow\x20becomes\x20releasable\x20back\x20to\x20you\x20via\x20an\x20explicit\x20allocation\x20step\x20(trigger\x20it\x20yourself;\x20funds\x20are\x20not\x20returned\x20automatically)'],'risks':['If\x20service\x20was\x20already\x20rendered,\x20cancellation\x20may\x20be\x20disputed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20reputation\x20impact']};default:return{'gains':['Flow\x20advances'],'risks':[]};}if(b==='producer')switch(a){case'complete':return{'gains':['Settlement\x20unlocked\x20—\x20funds\x20releasable\x20to\x20provider\x20via\x20an\x20explicit\x20allocation\x20step\x20(NOT\x20automatic\x20on\x20node\x20migration)'],'risks':[]};case'refund':return{'gains':['Clean\x20closure'],'risks':['Lost\x20revenue\x20for\x20this\x20order']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration\x20/\x20compensation\x20fund']};default:return{'gains':['Flow\x20advances'],'risks':[]};}switch(a){case'complete':return{'gains':['Flow\x20advances\x20—\x20the\x20workflow\x20moves\x20to\x20its\x20delivery/settlement\x20stage'],'risks':[]};case'refund':return{'gains':['Clean\x20closure\x20of\x20the\x20workflow'],'risks':['Cancels\x20the\x20delivery\x20track\x20—\x20confirm\x20this\x20matches\x20what\x20the\x20parties\x20agreed']};case'exception':return{'gains':['Avoids\x20stalemate'],'risks':['May\x20trigger\x20arbitration']};default:return{'gains':['Flow\x20advances'],'risks':[]};}}function consistencyFor(a,b,c,d,e,f,g){let h;if(!e)h=a==='exception'?0x2d:0x32;else{if(g){const i=valuePerspectiveOf(g);h=i==='consumer'?a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:i==='producer'?a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32:a==='complete'?0x37:a==='refund'?0x32:a==='exception'?0x28:0x32;}else b?h=a==='refund'?0x46:a==='complete'?0x37:a==='exception'?0x23:0x32:h=a==='complete'?0x4b:a==='refund'?0x1e:a==='exception'?0x23:0x32;}if(e&&c)h+=0x14;if(d)h-=0xa;return e&&f&&(a==='refund'||a==='exception')&&(h=Math['min'](h,0x28)),Math['max'](0x0,Math['min'](0x64,h));}const RECOMMEND_MIN_CONSISTENCY=0x3c;function whoCanAct(a,b){if(a['kind']==='named_operator')return'named\x20operator\x20\x22'+a['named_operator']+'\x22';if(a['kind']==='permission_index'&&a['permission_index']!==undefined){const c=a['role_name']??'permission\x20index\x20'+a['permission_index'];let d;if(b['permissionContext']){const e=[...b['orderHolderAddresses']??[],...b['callerAddress']?[b['callerAddress']]:[]],f=e['find'](g=>{if(!g)return![];const h=g['toLowerCase']();return b['permissionContext']['admin']['has'](h)||(b['permissionContext']['table']['get'](h)?.['has'](a['permission_index'])??![]);});if(f)d=b['nameResolver']?b['nameResolver'](f):shortAddr(f);}return d?c+'\x20(held\x20by\x20'+d+')':c;}return a['account_name']?'the\x20order\x20holder\x20('+a['account_name']+')':a['role_name']??'the\x20order\x20holder';}export function buildWorkflowGuidance(a){const b=[],c=PRE_DELIVERY_RE['test'](a['current'])||ACTIVE_STAGE_RE['test'](a['current'])||a['just_advanced']===!![];for(const p of a['nodes']){for(const q of p['pairs']){if(q['prev_node']!==a['current'])continue;for(const r of q['forwards']){if(!r['name'])continue;const s=resolveOperator(r,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'],{'currentNode':a['current'],'targetNode':p['name']}),t=callerIsOrderHolder(a['callerAddress']??a['caller'],a['orderHolderAddresses']);let u=![];a['callerAddress']&&(u=accountCanExecuteForward(r,a['callerAddress'],a['progressNamedOperator']??[],a['orderContext'],a['permissionContext']));const v=classifyNode(p['name']),w=!!a['caller'],{gains:x,risks:y}=gainsRisksFor(v,t,w,a['callerRole']),z=consistencyFor(v,t,u,!!r['guard'],w,c,a['callerRole']);b['push']({'next_node':p['name'],'forward':r['name'],'weight':r['weight'],'operator':s,'guard':r['guard'],'business_meaning':businessMeaning(p['name'],v),'gains':x,'risks':y,'consistency':z,'recommended':![],'executable_by_caller':u});}}}if(b['length']===0x0){const A=a['escrow'],B=!A?'':A['fund_direction']==='buyer'?'the\x20rails\x20are\x20ORDER-ANCHORED\x20(GuardIdentifier\x20recipients)\x20—\x20the\x20payout\x20lands\x20on\x20the\x20Order\x20object\x20for\x20the\x20order\x20owner\x20(the\x20buyer)\x20to\x20claim,\x20regardless\x20of\x20the\x20node\x27s\x20name\x20(\x22'+a['current']+'\x22).\x20':A['fund_direction']==='provider'?'the\x20rails\x20pay\x20ENTITY\x20recipients\x20—\x20the\x20payout\x20goes\x20to\x20the\x20named\x20provider-side\x20parties,\x20regardless\x20of\x20the\x20node\x27s\x20name\x20(\x22'+a['current']+'\x22).\x20':A['fund_direction']==='mixed'?'the\x20rails\x20mix\x20order-anchored\x20and\x20Entity\x20recipients\x20—\x20which\x20party\x20is\x20paid\x20depends\x20on\x20WHICH\x20rail\x20fires;\x20inspect\x20each\x20allocator\x27s\x20guard\x20before\x20triggering.\x20':A['fund_direction']==='signer'?'a\x20rail\x20pays\x20whoever\x20TRIGGERS\x20it\x20(Signer\x20recipient)\x20—\x20the\x20operator\x27s\x20own\x20identity\x20decides\x20the\x20payee;\x20never\x20trigger\x20on\x20behalf\x20of\x20another\x20party.\x20':'rail\x20recipients\x20were\x20unreadable\x20from\x20the\x20machine\x20graph\x20—\x20READ\x20them\x20before\x20triggering,\x20the\x20tooling\x20can:\x20query_toolkit\x20query_type=\x27service_panorama\x27\x20returns\x20result.service.order_allocators.allocators[].sharing\x20(who/mode/value\x20per\x20rail),\x20and\x20object_panorama\x20on\x20the\x20pool\x27s\x20Allocation\x20(\x27'+A['allocation']+'\x27)\x20returns\x20the\x20balance,\x20payment_info\x20anchor\x20and\x20the\x20same\x20resolved\x20recipient\x20rows.\x20The\x20name\x20flavor\x20('+(A['refund_terminal']?'refund/cancel-flavored':'completion-flavored')+')\x20is\x20a\x20GUESS\x20about\x20direction,\x20never\x20a\x20fact\x20—\x20do\x20not\x20act\x20on\x20it\x20alone.\x20',C=A?'Node\x20\x22'+a['current']+'\x22\x20is\x20terminal\x20(no\x20outgoing\x20forwards)\x20—\x20but\x20the\x20order\x27s\x20Allocation\x20'+A['allocation']+'\x20still\x20holds\x20'+A['balance']+'\x20(smallest\x20unit)\x20with\x20no\x20payments\x20recorded.\x20'+NO_AUTO_SETTLEMENT_FACT+'\x20'+B+('Execute\x20via\x20onchain_operations\x20{operation_type:\x27allocation\x27,\x20data:{object:\x27'+A['allocation']+'\x27,\x20alloc_by_guard:\x27<guard>\x27}}')+(A['guards']['length']?'\x20—\x20candidate\x20guards\x20on\x20this\x20pool:\x20'+A['guards']['join'](',\x20')+'.':'\x20—\x20inspect\x20the\x20pool\x27s\x20allocators\x20first.')+'\x20Trigger\x20ONCE\x20and\x20verify\x20the\x20pool\x20drained\x20(a\x20fully-drained\x20pool\x20aborts\x20on\x20re-trigger;\x20a\x20max-capped\x20pool\x20re-splits\x20the\x20remainder).\x20Recipients\x20then\x20claim\x20their\x20CoinWrappers\x20(receive).':'Node\x20\x22'+a['current']+'\x22\x20has\x20no\x20outgoing\x20forwards\x20—\x20it\x20is\x20a\x20terminal\x20node\x20(or\x20the\x20workflow\x20is\x20stuck).\x20No\x20further\x20progress\x20operation\x20is\x20available\x20here.';return{'current_node':a['current'],'caller':a['caller'],'options':[],'note':C};}const d=new Map();for(const D of b){const E=d['get'](D['forward']);if(E)E['add'](D['next_node']);else d['set'](D['forward'],new Set([D['next_node']]));}const e=[];for(const [F,G]of d){if(G['size']<0x2)continue;const H=[...G]['sort'](),I=H['some'](L=>classifyNode(L)==='refund'),J=H['some'](L=>classifyNode(L)!=='refund'),K=I&&J;e['push'](K?'CRITICAL\x20'+F:F);for(let L=0x0;L<b['length'];L++){if(b[L]['forward']!==F)continue;b[L]={...b[L],'ambiguous':{'destinations':H,'fund_conflict':K}};}}e['sort'](),b['sort']((M,N)=>N['consistency']-M['consistency']);const g=e['length']>0x0;let h,j;if(!g){const M=b['findIndex'](N=>!N['ambiguous']);if(M>=0x0){const N=b[M];N['executable_by_caller']===!![]&&N['consistency']>=RECOMMEND_MIN_CONSISTENCY?(h={...N,'recommended':!![]},b[M]=h):(j={...N,'waiting_on':N['executable_by_caller']===![]?'WAITING:\x20'+whoCanAct(N['operator'],a)+'\x20can\x20act\x20—\x20the\x20current\x20signing\x20account\x20cannot':'WAITING:\x20interest\x20alignment\x20'+N['consistency']+'/100\x20is\x20below\x20the\x20'+RECOMMEND_MIN_CONSISTENCY+'\x20recommendation\x20floor'},b[M]=j);}}const k=[];for(const O of b){h&&O!==h&&O['consistency']>0x0&&O['forward']!==h['forward']&&k['push']('Choosing\x20\x22'+O['forward']+'\x20→\x20'+O['next_node']+'\x22\x20forfeits\x20the\x20faster/more\x20aligned\x20path\x20\x22'+h['forward']+'\x20→\x20'+h['next_node']+'\x22');}c&&b['some'](P=>classifyNode(P['next_node'])==='refund')&&k['push']('Refund/cancel\x20options\x20are\x20listed\x20but\x20not\x20auto-recommended\x20here\x20(pre-delivery\x20stage,\x20active\x20billing/delivery\x20stage,\x20or\x20a\x20just-completed\x20advance\x20signals\x20intent\x20to\x20continue)\x20—\x20choose\x20one\x20explicitly\x20when\x20cancellation\x20is\x20intended');for(const P of b){if(!P['ambiguous'])continue;k['push']('\x22'+P['forward']+'\x22\x20is\x20AMBIGUOUS\x20from\x20\x22'+a['current']+'\x22\x20—\x20it\x20legally\x20reaches\x20'+P['ambiguous']['destinations']['join']('\x20/\x20')+'\x20'+(P['ambiguous']['fund_conflict']?'(fund\x20direction\x20DIFFERS\x20between\x20them);\x20the\x20destination\x20you\x20pass\x20in\x20next_node_name\x20decides,\x20so\x20state\x20the\x20intended\x20node\x20explicitly\x20instead\x20of\x20trusting\x20the\x20forward\x20name':';\x20state\x20the\x20intended\x20node\x20explicitly'));}const l=[];if(h){const Q=h['operator'];if(Q['kind']==='order_holder')Q['account_name']&&Q['account_name']!==a['caller']&&l['push']('The\x20recommended\x20action\x20is\x20executed\x20by\x20another\x20account\x20('+Q['account_name']+');\x20switch\x20the\x20signing\x20account\x20(env.account)\x20before\x20operating.');else{if(h['executable_by_caller']===![]){const R=Q['kind']==='named_operator'?'named\x20operator\x20\x22'+Q['named_operator']+'\x22':Q['role_name']??'permission\x20index\x20'+(Q['permission_index']??'(unknown)');let S;if(Q['kind']==='permission_index'&&a['permissionContext']&&Q['permission_index']!==undefined){const T=[...a['orderHolderAddresses']??[],...a['callerAddress']?[a['callerAddress']]:[]],U=T['find'](V=>{if(!V)return![];const W=V['toLowerCase']();return a['permissionContext']['admin']['has'](W)||(a['permissionContext']['table']['get'](W)?.['has'](Q['permission_index'])??![]);});if(U)S=a['nameResolver']?a['nameResolver'](U):shortAddr(U);}l['push']('The\x20recommended\x20action\x20requires\x20'+R+(S?'\x20(held\x20by\x20'+S+')':'')+('\x20—\x20the\x20current\x20signing\x20account\x20('+(a['caller']??'unresolved')+')\x20is\x20not\x20entitled;\x20switch\x20env.account\x20to\x20an\x20account\x20holding\x20it\x20before\x20operating.'));}}}else j&&j['executable_by_caller']===![]&&l['push']('The\x20top-ranked\x20edge\x20\x22'+j['forward']+'\x20→\x20'+j['next_node']+'\x22\x20is\x20not\x20auto-recommended\x20('+j['waiting_on']+');\x20'+'switch\x20env.account\x20to\x20an\x20entitled\x20account\x20before\x20operating.');e['length']>0x0&&l['push']('Machine\x20topology\x20defect\x20(P0-6):\x20forward\x20name(s)\x20'+[...new Set(e['map'](V=>V['replace'](/^CRITICAL /,'')))]['join'](',\x20')+'\x20'+'resolve\x20to\x20more\x20than\x20one\x20destination\x20from\x20this\x20node.\x20The\x20contract\x20accepts\x20any\x20of\x20them\x20(next_node\x20is\x20a\x20caller\x20argument;\x20'+'the\x20graph\x20only\x20forbids\x20duplicate\x20prev_node\x20WITHIN\x20one\x20node),\x20so\x20the\x20workflow\x20outcome\x20is\x20decided\x20by\x20the\x20CALLER,\x20not\x20by\x20the\x20published\x20Machine.\x20'+'Nothing\x20is\x20auto-recommended\x20for\x20these\x20forwards\x20—\x20fix\x20the\x20graph\x20by\x20giving\x20each\x20destination\x20its\x20own\x20forward\x20name.');const m=b['filter'](V=>V['guard']);m['length']>=0x2&&m['length']===b['length']&&l['push'](m['length']+'\x20guarded\x20variants\x20mount\x20on\x20node\x20\x22'+a['current']+'\x22\x20and\x20they\x20are\x20typically\x20MUTUALLY\x20EXCLUSIVE\x20'+'(variant\x20rails\x20usually\x20read\x20a\x20policy/mode\x20oracle\x20row\x20—\x20only\x20the\x20row\x27s\x20current\x20value\x20admits\x20one\x20of\x20them).\x20'+'Do\x20NOT\x20discover\x20which\x20one\x20by\x20signing:\x20probe\x20with\x20env.dry_run=true\x20first\x20(free,\x20never\x20committed\x20—\x20'+'EVERY\x20write\x20channel\x20honors\x20env.dry_run:\x20the\x20call\x20simulates\x20and\x20returns\x20a\x20\x22dry_run:*\x22\x20digest,\x20'+'nothing\x20is\x20signed\x20or\x20submitted,\x20so\x20a\x20guard\x20rejection\x20on\x20a\x20dry\x20run\x20does\x20not\x20consume\x20the\x20retry\x20budget\x20'+'and\x20mints\x20nothing)\x20—\x20the\x20rejection\x20diagnosis\x20names\x20the\x20failing\x20guard.');const n=/(enter|fund|renew|pay|deposit|top_?up|refund|claim|withdraw|settle|release)/i;return h&&n['test'](h['forward'])&&l['push']('\x22'+h['forward']+'\x22\x20is\x20a\x20MONEY-state\x20forward,\x20but\x20this\x20guidance\x20reads\x20only\x20topology\x20and\x20roles\x20—\x20NOT\x20the\x20order\x27s\x20live\x20Allocation\x20balance\x20or\x20claimed_by.\x20If\x20the\x20escrow\x20is\x20already\x20drained\x20(allocation.balance\x20==\x200)\x20or\x20arbitration-displaced\x20(order.claimed_by\x20some\x20==\x20true),\x20the\x20advance\x20burns\x20gas\x20and\x20aborts:\x20query\x20the\x20order\x27s\x20allocation\x20balance\x20+\x20claimed_by\x20FIRST,\x20and\x20probe\x20with\x20env.dry_run=true\x20when\x20unsure.'),{'current_node':a['current'],'caller':a['caller'],'options':b,'recommendation':h?{'best':h['forward']+'\x20→\x20'+h['next_node'],'rationale':'Highest\x20consistency\x20('+h['consistency']+'/100)\x20with\x20the\x20caller\x27s\x20interests.\x20Gains:\x20'+(h['gains']?.['join'](';\x20')||'none')+'.\x20Risks:\x20'+(h['risks']?.['join'](';\x20')||'none')+'.\x20Operator:\x20'+(h['operator']['role_name']??h['operator']['kind'])+(h['operator']['account_name']?'\x20('+h['operator']['account_name']+')':'')+'.'+(h['guard']?'\x20Guard\x20to\x20satisfy:\x20'+h['guard']+'.':''),'caveat':k['length']?k['join']('.\x20'):undefined}:{'best':undefined,'rationale':e['length']?'No\x20action\x20recommended:\x20every\x20reachable\x20forward\x20from\x20\x22'+a['current']+'\x22\x20is\x20ambiguous\x20(resolves\x20to\x20multiple\x20destinations).\x20Choose\x20the\x20destination\x20node\x20deliberately\x20—\x20do\x20not\x20let\x20the\x20forward\x20name\x20decide\x20it.':j?'No\x20action\x20recommended:\x20the\x20top-ranked\x20edge\x20\x22'+j['forward']+'\x20→\x20'+j['next_node']+'\x22\x20is\x20'+j['waiting_on']+'.\x20The\x20full\x20ranked\x20list\x20stays\x20visible\x20—\x20pick\x20deliberately,\x20or\x20switch\x20env.account\x20to\x20an\x20entitled\x20account.':undefined,'caveat':k['length']?k['join']('.\x20'):undefined},'note':l['length']?l['join']('\x20'):undefined};}export function buildWorkflowReceipt(a){const b={'hold':'held','unhold':'released\x20(unhold)','adminUnhold':'force-released\x20(adminUnhold)'},c=a['op']?b[a['op']]:undefined,d=c!==undefined?![]:a['current']===a['targetNode'],e={'account':a['callerName'],'action':c!==undefined?a['callerName']+'\x20'+c+'\x20\x22'+a['forward']+'\x22\x20—\x20node\x20stays\x20at\x20\x22'+a['current']+'\x22':a['callerName']+'\x20executed\x20'+a['forward']+'\x20(→\x20'+a['targetNode']+')','forward':a['forward'],'target_node':a['targetNode'],'op':a['op'],'migrated':d,'current_node':a['current']};if(a['simulated'])e['simulated']=!![];if(a['txDigest'])e['digest']=a['txDigest'];if(a['signer'])e['signer']=a['signer'];if(c!==undefined)e['note']='Hold-family\x20op\x20does\x20not\x20migrate\x20the\x20node\x20—\x20it\x20only\x20pins/unpins\x20a\x20forward;\x20the\x20current\x20node\x20and\x20its\x20threshold\x20state\x20are\x20unchanged.';else{if(!d){const h=a['nodes']['filter'](l=>l['name']===a['targetNode'])['flatMap'](l=>l['pairs'])['find'](l=>l['prev_node']===a['current']),i=a['session']?.['slice'](-0x1)[0x0],j=i?.['threshold']??h?.['threshold']??0x0,k=i?.['weights']??0x0;if(j>0x0){e['threshold']=j,e['accumulated_weight']=k,e['remaining']=Math['max'](0x0,j-k);const l=new Set((i?.['forwards']??[])['filter'](n=>n?.['accomplished']!==![])['map'](n=>n?.['forward'])['filter'](n=>!!n)),m=[];for(const n of h?.['forwards']??[]){if(!n['name']||l['has'](n['name']))continue;m['push']({'forward':n['name'],'operator':resolveOperator(n,a['orderHolderAddresses'],a['permissionDescription'],a['nameResolver'],{'currentNode':a['current'],'targetNode':a['targetNode']})});}if(m['length'])e['waiting_on']=m;e['note']='Node\x20did\x20not\x20migrate:\x20threshold\x20'+j+',\x20accumulated\x20weight\x20'+k+',\x20remaining\x20'+Math['max'](0x0,j-k)+'.\x20'+(m['length']?'Waiting\x20for:\x20'+m['map'](o=>o['forward']+'\x20('+(o['operator']['role_name']??o['operator']['kind'])+')')['join'](';\x20'):'All\x20forwards\x20on\x20this\x20pair\x20are\x20accomplished\x20—\x20the\x20node\x20should\x20migrate\x20on\x20the\x20next\x20operation.');}else e['note']='Node\x20did\x20not\x20migrate\x20(threshold\x200)\x20—\x20no\x20further\x20weight\x20cooperation\x20required;\x20verify\x20the\x20operation\x20outcome.';}}const g=buildWorkflowGuidance({'current':a['current'],'nodes':a['nodes'],'caller':a['caller'],'callerAddress':a['callerAddress'],'callerRole':a['callerRole'],'orderHolderAddresses':a['orderHolderAddresses'],'progressNamedOperator':a['progressNamedOperator'],'permissionContext':a['permissionContext'],'orderContext':a['orderContext'],'permissionDescription':a['permissionDescription'],'nameResolver':a['nameResolver'],'escrow':a['escrow'],'just_advanced':d&&classifyNode(a['targetNode'])!=='refund'});if(g['options']['length']>0x0)e['next_guidance']=g;else{if(g['note'])e['note']=e['note']?e['note']+'\x20'+g['note']:g['note'];}return e;}function operatorText(a){const b=[a['role_name']??a['kind']];if(a['account_name'])b['push'](a['account_name']);return b['join']('\x20/\x20');}export function renderGuidanceText(a){const b=['[WORKFLOW\x20GUIDANCE]\x20current\x20node:\x20\x22'+a['current_node']+'\x22'+(a['caller']?'\x20(caller:\x20'+a['caller']+')':'')];if(a['options']['length']===0x0)return b['push']('\x20\x20•\x20'+(a['note']??'No\x20reachable\x20next\x20nodes.')),b['join']('\x0a');for(const c of a['options']){const d=['\x22'+c['forward']+'\x22\x20→\x20\x22'+c['next_node']+'\x22','operator:\x20'+operatorText(c['operator']),'weight:\x20'+c['weight'],'consistency:\x20'+c['consistency']+'/100'+(c['recommended']?'\x20[RECOMMENDED]':'')+(c['waiting_on']?'\x20['+c['waiting_on']+']':'')];if(c['guard'])d['push']('guard:\x20'+c['guard']);c['ambiguous']&&d['push']('AMBIGUOUS:\x20this\x20forward\x20name\x20also\x20reaches\x20'+c['ambiguous']['destinations']['filter'](e=>e!==c['next_node'])['join'](',\x20')+(c['ambiguous']['fund_conflict']?'\x20(fund\x20direction\x20differs\x20—\x20next_node_name\x20decides)':''));d['push']('meaning:\x20'+c['business_meaning']);if(c['gains']?.['length'])d['push']('gains:\x20'+c['gains']['join'](';\x20'));if(c['risks']?.['length'])d['push']('risks:\x20'+c['risks']['join'](';\x20'));b['push']('\x20\x20•\x20'+d['join']('\x20|\x20'));}if(a['recommendation']?.['best']){b['push']('\x20\x20RECOMMENDED:\x20'+a['recommendation']['best']+'.\x20'+(a['recommendation']['rationale']??''));if(a['recommendation']['caveat'])b['push']('\x20\x20CAVEAT\x20(opportunity\x20cost):\x20'+a['recommendation']['caveat']);}if(a['note'])b['push']('\x20\x20NOTE:\x20'+a['note']);return b['push']('\x20\x20(AI\x20recommendation\x20only\x20—\x20the\x20account\x20decides;\x20switch\x20env.account\x20if\x20another\x20operator\x20must\x20act.)'),b['join']('\x0a');}export function renderReceiptText(a){const b=['[WORKFLOW\x20RECEIPT]\x20'+a['action']];b['push']('\x20\x20•\x20node\x20migrated:\x20'+(a['migrated']?'yes\x20→\x20current:\x20\x22'+a['current_node']+'\x22':'no\x20→\x20current:\x20\x22'+a['current_node']+'\x22'));a['digest']&&b['push']('\x20\x20•\x20tx\x20digest:\x20'+a['digest']+(a['signer']?'\x20|\x20signer:\x20'+a['signer']:'')+'\x20(verify\x20via\x20onchain_transaction\x20or\x20a\x20block\x20explorer)');a['simulated']&&b['push']('\x20\x20•\x20simulated\x20(dry-run):\x20this\x20migration\x20comes\x20from\x20the\x20call\x27s\x20own\x20events\x20—\x20state\x20NOT\x20committed\x20on-chain');if(!a['migrated']){a['threshold']!==undefined&&a['threshold']>0x0&&(b['push']('\x20\x20•\x20threshold:\x20'+a['threshold']+'\x20|\x20accumulated\x20weight:\x20'+(a['accumulated_weight']??0x0)+'\x20|\x20remaining:\x20'+(a['remaining']??0x0)),a['waiting_on']?.['length']&&b['push']('\x20\x20•\x20waiting\x20on:\x20'+a['waiting_on']['map'](c=>'\x22'+c['forward']+'\x22\x20('+operatorText(c['operator'])+')')['join'](';\x20')));if(a['note'])b['push']('\x20\x20•\x20note:\x20'+a['note']);}return a['next_guidance']&&a['next_guidance']['options']['length']>0x0&&b['push'](renderGuidanceText(a['next_guidance'])),b['join']('\x0a');}async function makeNameResolver(a){const b=[...new Set(a['filter'](d=>!!d))],c=new Map();if(b['length'])try{const d=await GetLocalNamesByAddresses(b);for(const e of d){const f=e?.['account']??e?.['local_mark'];if(f)c['set'](e['address']['toLowerCase'](),f);}}catch{}return g=>{if(!g)return undefined;const h=c['get'](g['toLowerCase']());return h??shortAddr(g);};}export function extractObjectVersionFromTx(a,b){if(!a||typeof a!=='object')return undefined;const d=a,e=d['effects']?.['objectChanges']??d['objectChanges'];if(!Array['isArray'](e))return undefined;const f=b['toLowerCase']();for(const g of e){if(typeof g?.['object']!=='string'||String(g['object'])['toLowerCase']()!==f)continue;if(g['version']!==undefined&&g['version']!==null)return String(g['version']);}return undefined;}export function extractProgressEventNodeFromTx(a,b){if(!a||typeof a!=='object'||!b)return undefined;const c=a,d=c['events']??c['effects']?.['events'];if(!Array['isArray'](d))return undefined;const e=b['toLowerCase']();for(const f of d){const g=f?.['json']??f?.['parsedJson']??f,h=typeof g?.['node']==='string'?g['node']:undefined;if(!h)continue;const i=typeof g?.['object']==='string'?g['object']['trim']()['toLowerCase']():'';if(i===e||i['startsWith'](e+'\x20')||i['startsWith'](e+'('))return h;}return undefined;}export function extractTxDigestFromResult(a){const b=a?.['digest'];if(typeof b!=='string'||!b||b['startsWith']('dry_run:'))return undefined;return b;}async function fetchTerminalEscrow(b,c,d,e){if(!b)return undefined;try{const f=(await batchQueryObjectsByIds([b],c,d??!![]))[0x0],g=f?.['data']??f,h=typeof g?.['allocation']==='string'?g['allocation']:undefined;if(!h)return undefined;const i=(await batchQueryObjectsByIds([h],c,d??!![]))[0x0],j=i?.['data']??i,k=typeof j?.['balance']==='bigint'?j['balance']:BigInt(j?.['balance']??0x0);if(k<=0x0n)return undefined;const l=Array['isArray'](j?.['payment'])?j['payment']:[];if(l['length']>0x0)return undefined;const m=(Array['isArray'](j?.['allocators']?.['allocators'])?j['allocators']['allocators']:[])['map'](p=>String(p?.['guard']??''))['filter'](p=>p),n=new Set();for(const p of Array['isArray'](j?.['allocators']?.['allocators'])?j['allocators']['allocators']:[]){for(const q of Array['isArray'](p?.['sharing'])?p['sharing']:[]){const r=q?.['who'];if(r!==null&&typeof r==='object'){if('GuardIdentifier'in r)n['add']('buyer');else{if('Entity'in r)n['add']('provider');else{if('Signer'in r)n['add']('signer');}}}}}const o=n['size']===0x0?'unknown':n['size']>0x1?'mixed':[...n][0x0];return{'allocation':h,'balance':k['toString'](),'guards':m,'fund_direction':o,'refund_terminal':REFUND_FLAVOR_RE['test'](e)};}catch{return undefined;}}export async function enrichWorkflowGuidance(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=async()=>(await batchQueryObjectsByIds([b],a['network'],!![]))[0x0];let d=await c();const e=extractObjectVersionFromTx(a['txResult'],b);for(let A=0x0;e!==undefined&&d&&String(d['version']??'')!==e&&A<0x2;A++){await new Promise(C=>setTimeout(C,0x258));const B=await c();if(B)d=B;}const f=d?.['data']??d;if((d?.['type']??f?.['type'])!=='Progress')return undefined;let g=f['current']??'';const h=extractProgressEventNodeFromTx(a['txResult'],b),i=h!==undefined&&g!==h;if(i)g=h;const j=i&&a['dryRun']===!![],k=f['machine'],l=Array['isArray'](f['session'])?f['session']:[],m=(Array['isArray'](f['namedOperator'])?f['namedOperator']['find'](C=>C?.['name']==='')?.['operators']:undefined)??[];if(!k)return undefined;const n=await fetchMachineNodes(k,a['network'],![]);let o,p;try{const C=await batchQueryObjectsByIds([k],a['network'],a['noCache']),D=C[0x0],E=D?.['data']??D,F=E?.['permission'];if(F){const G=await batchQueryObjectsByIds([F],a['network'],a['noCache']),H=G[0x0];o=(H?.['data']??H)?.['description']??undefined,p=await fetchPermissionContext(F,a['network'],a['noCache']);}}catch{}const q=(Array['isArray'](f['namedOperator'])?f['namedOperator']:[])['map'](I=>({'name':String(I?.['name']??''),'operators':(I?.['operators']??[])['map'](J=>String(J))}));let r;f['task']&&(r=await fetchOrderContext(f['task'],a['network'],a['noCache']));const s=r?Array['from'](new Set([r['builder'],...r['agent']])['values']()):m;let t;try{t=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{t=undefined;}const u=await makeNameResolver([a['accountName'],...s]);let v;if(t){const I=[...p?.['table']['get'](t)??[]];p?.['admin']['has'](t)&&I['length']===0x0?v='collaborator':v=deriveCommercialRole({'account':t,'order_holder':s['includes'](t)?t:undefined,'held_permission_indexes':I,'named_operator_names':(q??[])['filter'](J=>(J['operators']??[])['some'](K=>K?.['toLowerCase']()===t['toLowerCase']()))['map'](J=>J['name']),'has_active_order':!![]})['role'];}const w={'current':g,'nodes':n,'caller':a['accountName'],'callerAddress':t,'callerRole':v,'orderHolderAddresses':s,'progressNamedOperator':q,'permissionContext':p,'orderContext':r,'permissionDescription':o,'nameResolver':u};let x=buildWorkflowGuidance(w);if(x['options']['length']===0x0){const J=await fetchTerminalEscrow(f['task'],a['network'],a['noCache'],g);J&&(w['escrow']=J,x=buildWorkflowGuidance(w));}let y;a['operate']?.['forward']&&a['operate']?.['next_node_name']&&(y=buildWorkflowReceipt({...w,'callerName':a['accountName']??b,'forward':a['operate']['forward'],'targetNode':a['operate']['next_node_name'],'op':a['operate']['op'],'session':l,'simulated':j,'txDigest':extractTxDigestFromResult(a['txResult']),'signer':t}));if(a['compact']){x['options']['length']&&!y?.['next_guidance']?.['options']['length']&&trimGuidanceProse(x);if(y?.['next_guidance'])trimGuidanceProse(y['next_guidance']);}const z=[y?renderReceiptText(y):undefined,x['options']['length']&&!y?.['next_guidance']?.['options']['length']?renderGuidanceText(x):undefined]['filter'](K=>!!K)['join']('\x0a\x0a');return{'guidance':x,'receipt':y,'text':z};}catch{return undefined;}}export async function resolveHoldableEdges(a){try{let b;if(a['progressRef']['startsWith']('0x'))b=a['progressRef'];else b=await LocalMark['Instance']()['get_address'](a['progressRef'])??undefined;if(!b)return undefined;const c=(await batchQueryObjectsByIds([b],a['network'],!![]))[0x0],d=c?.['data']??c;if((c?.['type']??d?.['type'])!=='Progress')return undefined;const e=typeof d['current']==='string'?d['current']:'',g=d['machine'];if(!g)return undefined;const h=await fetchMachineNodes(g,a['network'],![]);let i;try{const n=await batchQueryObjectsByIds([g],a['network'],a['noCache']),o=(n[0x0]?.['data']??n[0x0])?.['permission'];if(o)i=await fetchPermissionContext(o,a['network'],a['noCache']);}catch{}const j=(Array['isArray'](d['namedOperator'])?d['namedOperator']:[])['map'](p=>({'name':String(p?.['name']??''),'operators':(p?.['operators']??[])['map'](q=>String(q))}));let k;if(d['task'])k=await fetchOrderContext(d['task'],a['network'],a['noCache']);let l;try{l=await LocalMark['Instance']()['get_address'](a['accountName'])??undefined;}catch{l=undefined;}if(!l)return{'current':e,'edges':[]};const m=[];for(const p of h){for(const q of p['pairs']){if(q['prev_node']!==e)continue;for(const r of q['forwards']){if(!r['name'])continue;m['push']({'next_node':p['name'],'forward':r['name'],'weight':r['weight'],'threshold':q['threshold'],'guard':r['guard'],'kind':forwardOperatorKind(r),'holdable':accountCanExecuteForward(r,l,j,k,i)});}}}return{'current':e,'edges':m};}catch{return undefined;}}function trimGuidanceProse(a){for(const b of a['options']??[]){delete b['gains'],delete b['risks'];if(!b['recommended'])delete b['operator']?.['recommended_call']?.['reason'];}}export function mergeGuidanceIntoOutput(a,b,c){if(!b)return a;try{const d=a?.['structuredContent'];if(d&&typeof d==='object'){const e=d['semantic'];if(e&&typeof e==='object'){const f=!!b['receipt']?.['next_guidance']?.['options']?.['length'];b['guidance']&&!f&&(e['workflow_guidance']=b['guidance']);if(b['receipt'])e['workflow_receipt']=b['receipt'];c?.['responseLevel']!=='full'&&(e['workflow_guidance']&&trimGuidanceProse(e['workflow_guidance']),b['receipt']?.['next_guidance']&&trimGuidanceProse(b['receipt']['next_guidance']));}}b['text']&&Array['isArray'](a?.['content'])&&a['content'][0x0]?.['text']!==undefined&&(a['content'][0x0]['text']=b['text']+'\x0a\x0a'+a['content'][0x0]['text']);}catch{}return a;}export async function resolveLocalNamesFor(a){const b=new Map();try{const c=[...new Set((a??[])['filter'](e=>typeof e==='string'&&e['startsWith']('0x')))];if(c['length']===0x0)return{'byAddress':b};const d=await GetLocalNamesByAddresses(c);for(const e of d??[]){const f=e?.['account']||e?.['local_mark'];if(f)b['set'](String(e['address'])['toLowerCase'](),f);}}catch{}return{'byAddress':b};}export async function listLocalAccounts(){try{const a=await query_account_list({'suspended':![]});return(a??[])['filter'](b=>b?.['address'])['map'](b=>({'address':String(b['address']),'name':b['name']??undefined}));}catch{return[];}}export function accountCanExecuteForward(a,b,c,d,e){const g=b['toLowerCase']();if(a['namedOperator']!==undefined&&a['namedOperator']!==null){if(a['namedOperator']===''){if(d&&(g===d['builder']['toLowerCase']()||d['agent']['has'](g)))return!![];}else{if(a['namedOperator']['length']>0x0){const h=a['namedOperator'],i=c['find'](j=>String(j?.['name']??'')===h);if(i?.['operators']?.['some'](j=>String(j)['toLowerCase']()===g))return!![];}}}if(a['permissionIndex']!==undefined&&a['permissionIndex']!==null&&e){if(e['admin']['has'](g))return!![];const j=e['table']['get'](g);if(j?.['has'](a['permissionIndex']))return!![];}return![];}export function forwardOperatorKind(a){if(a['namedOperator']==='')return'order_holder';if(typeof a['namedOperator']==='string'&&a['namedOperator']['length']>0x0)return'named_operator';return'permission_index';}export function enumerateActionableForwards(a,b,c,d,e,g){const h=typeof a?.['current']==='string'?a['current']:'',i=new Map();for(const k of Array['isArray'](a?.['session'])?a['session']:[]){const l=String(k?.['next_node']??'');for(const m of Array['isArray'](k?.['forwards'])?k['forwards']:[]){i['set'](l+'|'+String(m?.['forward']??''),{'who':m?.['who']?String(m['who'])['toLowerCase']():null,'accomplished':!!m?.['accomplished']});}}const j=[];for(const n of b){for(const o of n['pairs']){if(o['prev_node']!==h)continue;for(const p of o['forwards']){if(!p['name'])continue;const q=i['get'](n['name']+'|'+p['name']);if(q?.['accomplished'])continue;let r=c['filter'](t=>accountCanExecuteForward(p,t,d,e,g));q?.['who']&&(r=r['filter'](t=>t['toLowerCase']()===q['who'])),j['push']({'next_node':n['name'],'forward':p['name'],'weight':p['weight'],'threshold':o['threshold'],'guard':p['guard'],'operator_kind':forwardOperatorKind(p),'permission_index':p['permissionIndex']??undefined,'named_operator':typeof p['namedOperator']==='string'&&p['namedOperator']['length']>0x0?p['namedOperator']:undefined,'executable_accounts':r['map'](t=>t['toLowerCase']())});}}}return j;}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{bridgeMonitorSuggestions}from'./SuggestionBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{runKeeperScan as a369a,realKeeperScanDeps}from'../keeper/KeeperScan.js';import{addProblem,addSuggestion,listProblems,listSuggestions}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'openSuggestions':a=>bridgeMonitorSuggestions(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addSuggestion':addSuggestion,'listSuggestions':listSuggestions,'logger':b=>console['error']('[monitor]\x20'+b)}),'runKeeperScan':(a,b)=>a369a(a,b,realKeeperScanDeps()),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}if(m['length']>0x0&&this['deps']['openSuggestions'])try{await this['deps']['openSuggestions']({'network':a,'events':j,'annotations':m,'scope':k});}catch(s){this['deps']['logger']('monitor\x20loop:\x20suggestion\x20bridge\x20error\x20on\x20'+a+':\x20'+String(s?.['message']??s));}if(this['deps']['runKeeperScan'])try{await this['deps']['runKeeperScan'](a,k);}catch(t){this['deps']['logger']('monitor\x20loop:\x20keeper\x20scan\x20error\x20on\x20'+a+':\x20'+String(t?.['message']??t));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:u,changed:v}=await this['deps']['resolveScope'](a,f);c['scope']=u;if(v){const w=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),x=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],u,w,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+u['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+x['rescanned']+',\x20updated\x20'+x['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(y){const z=String(y?.['message']??y);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+z),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
|
|
1
|
+
import{randomUUID}from'node:crypto';import{Config,SQLiteStorage}from'@wowok/wowok/w/local';import{query_events}from'@wowok/wowok';import{monitorEventStore}from'./EventStore.js';import{subscriptionStore}from'./SubscriptionStore.js';import{loadScopeSnapshot,resolveScope}from'./ScopeResolver.js';import{annotateBatch,backfillAnnotations}from'./EventRouter.js';import{bridgeMonitorProblems}from'./ProblemBridge.js';import{bridgeMonitorSuggestions}from'./SuggestionBridge.js';import{EVENT_MODULE_OF,MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE,normalizeMonitorEvent}from'./normalize.js';import{LOOP_DEFAULTS}from'./types.js';import{goalStore}from'../goal/GoalStore.js';import{runKeeperScan as a377a,realKeeperScanDeps}from'../keeper/KeeperScan.js';import{addProblem,addSuggestion,listProblems,listSuggestions}from'../task/ProcessStore.js';const LEASE_PREFIX='mon_lease:v4:',SEED_PAGE=0x64,SEED_MAX=0x7d0,POLL_BATCH=0x32,MAX_BACKOFF_MS=0x493e0;function netKey(a){return(a||'default')['replace'](/[^a-zA-Z0-9_-]/g,'_');}function leaseKey(a){return''+LEASE_PREFIX+netKey(a);}function realDeps(){return{'store':monitorEventStore,'configStore':subscriptionStore,'storage':new SQLiteStorage(),'resolveScope':(a,b)=>resolveScope(a,b),'loadScope':a=>loadScopeSnapshot(a),'router':{'annotateBatch':annotateBatch,'backfillAnnotations':backfillAnnotations},'queryEvents':a=>query_events({'type':a['type'],'cursor':a['cursor'],'limit':a['limit'],'order':a['order'],'network':a['network']}),'defaultNetwork':()=>Config['Instance']()['network_get'](),'now':()=>Date['now'](),'pid':process['pid'],'bootId':randomUUID(),'logger':a=>console['error']('[monitor]\x20'+a),'openProblems':a=>bridgeMonitorProblems(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addProblem':addProblem,'listProblems':listProblems,'logger':b=>console['error']('[monitor]\x20'+b)}),'openSuggestions':a=>bridgeMonitorSuggestions(a,{'getGoal':(b,c)=>goalStore['get'](b,c),'addSuggestion':addSuggestion,'listSuggestions':listSuggestions,'logger':b=>console['error']('[monitor]\x20'+b)}),'runKeeperScan':(a,b)=>a377a(a,b,realKeeperScanDeps()),'setTimer':(a,b)=>setTimeout(a,b),'clearTimer':a=>clearTimeout(a)};}function newRuntime(a){return{'network':a,'started':![],'holdsLease':![],'leaseHolder':null,'timer':undefined,'ticking':![],'scope':undefined,'lastScopeRefreshAt':0x0,'pollIntervalMs':LOOP_DEFAULTS['poll_interval_ms'],'lastTickAt':0x0,'lastNewCount':0x0,'lastSummary':undefined,'consecutiveErrors':0x0,'backoffMs':0x0};}export class MonitorLoop{['deps'];['runtimes']=new Map();constructor(a){this['deps']={...realDeps(),...a??{}};}async['start'](a){let b=a&&a['length']>0x0?a:undefined;if(!b)b=[await this['deps']['defaultNetwork']()];for(const c of b){const d=netKey(c);if(this['runtimes']['has'](d)){const f=this['runtimes']['get'](d);if(f['started'])continue;f['started']=!![],this['schedule'](f,0x0);continue;}const e=newRuntime(c);e['started']=!![],this['runtimes']['set'](d,e);try{const g=await this['deps']['loadScope'](c);g&&(e['scope']=g,e['lastScopeRefreshAt']=Number(g['resolved_at'])||0x0);}catch{}this['schedule'](e,0x0);}return b;}async['stop'](a){const b=a?[netKey(a)]:[...this['runtimes']['keys']()];for(const c of b){const d=this['runtimes']['get'](c);if(!d)continue;d['started']=![];d['timer']!==undefined&&(this['deps']['clearTimer'](d['timer']),d['timer']=undefined);if(d['holdsLease']){d['holdsLease']=![];try{await this['deps']['storage']['del'](leaseKey(d['network']));}catch{}}this['runtimes']['delete'](c);}}['status'](a){const b=a?this['runtimes']['get'](netKey(a)):[...this['runtimes']['values']()][0x0];if(!b)return{'running':![],'lease_holder':null,'last_tick_at':0x0,'last_new_count':0x0,'scope_version':0x0,'backoff_ms':0x0};return{'running':b['started']&&b['holdsLease'],'lease_holder':b['leaseHolder']?b['leaseHolder']['pid']+':'+b['leaseHolder']['boot_id']:null,'last_tick_at':b['lastTickAt'],'last_new_count':b['lastNewCount'],'scope_version':b['scope']?.['version']??0x0,'backoff_ms':b['backoffMs'],...b['lastSummary']?{'last_tick':b['lastSummary']}:{}};}['kick'](a){const b=this['runtimes']['get'](netKey(a));if(!b||!b['started']||!b['holdsLease']||b['ticking'])return;if(this['deps']['now']()-b['lastTickAt']<b['pollIntervalMs'])return;void this['tick'](b['network']);}['invalidateScope'](a){const b=this['runtimes']['get'](netKey(a));if(!b)return;b['scope']=undefined,b['lastScopeRefreshAt']=0x0;}async['tick'](a){const b=netKey(a);let c=this['runtimes']['get'](b);!c&&(c=newRuntime(a),this['runtimes']['set'](b,c));if(c['ticking'])return undefined;c['ticking']=!![];const d=this['deps']['now']();try{const f=await this['deps']['configStore']['getConfig'](a),g=Number(f['loop']?.['poll_interval_ms'])||LOOP_DEFAULTS['poll_interval_ms'];c['pollIntervalMs']=g;const h=await this['acquireLease'](c,g);if(!h)return undefined;const {newCount:i,events:j}=await this['capture'](c,f),k=await this['getScope'](c,f);let l=0x0,m=[];if(i>0x0&&j['length']>0x0){const p=this['deps']['router']['annotateBatch'](j,k,f)['filter'](q=>q['rules']['length']>0x0||q['focus_hit']||q['matched_filters']['length']>0x0);p['length']>0x0&&(await this['deps']['store']['saveAnnotations'](a,p),l=p['length'],m=p);}if(m['length']>0x0&&this['deps']['openProblems'])try{await this['deps']['openProblems']({'network':a,'events':j,'annotations':m,'scope':k});}catch(q){this['deps']['logger']('monitor\x20loop:\x20problem\x20bridge\x20error\x20on\x20'+a+':\x20'+String(q?.['message']??q));}if(m['length']>0x0&&this['deps']['openSuggestions'])try{await this['deps']['openSuggestions']({'network':a,'events':j,'annotations':m,'scope':k});}catch(s){this['deps']['logger']('monitor\x20loop:\x20suggestion\x20bridge\x20error\x20on\x20'+a+':\x20'+String(s?.['message']??s));}if(this['deps']['runKeeperScan'])try{await this['deps']['runKeeperScan'](a,k);}catch(t){this['deps']['logger']('monitor\x20loop:\x20keeper\x20scan\x20error\x20on\x20'+a+':\x20'+String(t?.['message']??t));}const n=Number(f['loop']?.['scope_refresh_ms'])||LOOP_DEFAULTS['scope_refresh_ms'];if(this['deps']['now']()-c['lastScopeRefreshAt']>=n){c['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:u,changed:v}=await this['deps']['resolveScope'](a,f);c['scope']=u;if(v){const w=Number(f['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']),x=await this['deps']['router']['backfillAnnotations'](a,this['deps']['store'],u,w,f);this['deps']['logger']('monitor\x20loop:\x20scope\x20v'+u['version']+'\x20on\x20'+a+'\x20changed\x20—\x20backfill\x20rescanned\x20'+x['rescanned']+',\x20updated\x20'+x['updated']);}}c['lastTickAt']=this['deps']['now'](),c['lastNewCount']=i,c['consecutiveErrors']=0x0,c['backoffMs']=0x0;const o={'captured':j['length'],'annotated':l,'duration_ms':this['deps']['now']()-d};return c['lastSummary']=o,o;}catch(y){const z=String(y?.['message']??y);return this['deps']['logger']('monitor\x20loop:\x20tick\x20error\x20on\x20'+a+':\x20'+z),c['consecutiveErrors']+=0x1,c['backoffMs']=Math['min'](c['pollIntervalMs']*0x2**c['consecutiveErrors'],MAX_BACKOFF_MS),undefined;}finally{c['ticking']=![],c['started']&&this['schedule'](c,c['backoffMs']>0x0?c['backoffMs']:c['pollIntervalMs']);}}['schedule'](a,b){if(a['timer']!==undefined)this['deps']['clearTimer'](a['timer']);const c=this['deps']['setTimer'](()=>{a['timer']=undefined,void this['tick'](a['network']);},Math['max'](0x0,b));c?.['unref']?.(),a['timer']=c;}async['acquireLease'](a,b){const c=leaseKey(a['network']),d=this['deps']['now']();let e;try{const i=await this['deps']['storage']['get'](c);e=i?JSON['parse'](i):undefined;}catch{e=undefined;}const f={'pid':this['deps']['pid'],'boot_id':this['deps']['bootId']},g=!!e&&e['boot_id']===f['boot_id']&&e['pid']===f['pid'],h=!e||d-Number(e['heartbeat_at']??0x0)>0x2*b;if(g||h)return await this['deps']['storage']['put'](c,JSON['stringify']({...f,'heartbeat_at':d})),a['holdsLease']=!![],a['leaseHolder']=f,!![];return a['holdsLease']=![],a['leaseHolder']={'pid':e['pid'],'boot_id':e['boot_id']},![];}async['getScope'](a,b){if(!a['scope'])try{const c=await this['deps']['loadScope'](a['network']);c&&(a['scope']=c,a['lastScopeRefreshAt']=Number(c['resolved_at'])||0x0);}catch{}if(!a['scope']){a['lastScopeRefreshAt']=this['deps']['now']();const {snapshot:d,changed:e}=await this['deps']['resolveScope'](a['network'],b);a['scope']=d;if(e){const f=Number(b['loop']?.['backfill_days']??LOOP_DEFAULTS['backfill_days']);await this['deps']['router']['backfillAnnotations'](a['network'],this['deps']['store'],d,f,b);}}return a['scope'];}async['capture'](a,b){const c=a['network'],d=await this['deps']['store']['getCursors'](c);let f=0x0;const g=[],h=[...MONITOR_CAPTURE_TYPES];if(b['events']?.[PAYMENT_EVENT_TYPE]===!![])h['push'](PAYMENT_EVENT_TYPE);for(const i of h){const j=EVENT_MODULE_OF[i];if(!j)continue;try{const k=d['cursors'][i];let l=null;if(!k){let m=null,n=0x0;while(n<SEED_MAX){const o=await this['deps']['queryEvents']({'type':i,'cursor':m,'limit':Math['min'](SEED_PAGE,SEED_MAX-n),'order':'descending','network':c}),p=(o?.['data']??[])['map'](q=>normalizeMonitorEvent(q));if(p['length']===0x0)break;if(l===null)l=p[0x0];n+=p['length'],f+=await this['deps']['store']['insert'](c,j,p),g['push'](...p);if(!o?.['hasNextPage']||!o?.['nextCursor'])break;m=o['nextCursor'];}}else{const q=await this['deps']['queryEvents']({'type':i,'cursor':k,'limit':POLL_BATCH,'order':'ascending','network':c}),r=(q?.['data']??[])['map'](s=>normalizeMonitorEvent(s));f+=await this['deps']['store']['insert'](c,j,r),g['push'](...r);if(r['length']>0x0)l=r[r['length']-0x1];}if(l?.['id']){const s=d['cursors'][i];(!s||BigInt(l['id']['eventSeq'])>BigInt(s['eventSeq']||'0'))&&(d['cursors'][i]={'eventSeq':String(l['id']['eventSeq']),'txDigest':String(l['id']['txDigest'])});}}catch(t){const u=String(t?.['message']??t);this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20poll\x20error:\x20'+u),/referenced transaction/i['test'](u)&&(delete d['cursors'][i],this['deps']['logger']('monitor\x20loop:\x20type\x20'+i+'\x20cursor\x20invalid\x20—\x20dropped,\x20will\x20re-seed\x20next\x20cycle'));}}return await this['deps']['store']['saveCursors'](c,d['cursors'],this['deps']['now']()),{'newCount':f,'events':g};}}export const monitorLoop=new MonitorLoop();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { MonitorEventModule } from "./types.js";
|
|
2
|
-
export declare const MONITOR_CAPTURE_TYPES: readonly ["NewOrderEvent", "ArbEvent", "VoteEvent", "FeedbackEvent", "DemandPresentEvent", "DemandFeedbackEvent", "DemandChangedEvent", "ProgressEvent", "ThresholdPendingEvent", "AllocationEvent", "TreasuryEvent", "RewardClaimEvent", "RewardFundEvent", "ServiceEvent", "NewEntityEvent", "PermissionChangedEvent", "RewardWithdrawEvent", "RepositoryDataOverwriteEvent"];
|
|
2
|
+
export declare const MONITOR_CAPTURE_TYPES: readonly ["NewOrderEvent", "ArbEvent", "VoteEvent", "FeedbackEvent", "DemandPresentEvent", "DemandFeedbackEvent", "DemandChangedEvent", "ProgressEvent", "ThresholdPendingEvent", "AllocationEvent", "TreasuryEvent", "RewardClaimEvent", "RewardFundEvent", "ServiceEvent", "NewEntityEvent", "PermissionChangedEvent", "RewardWithdrawEvent", "RepositoryDataOverwriteEvent", "RowRemovedEvent", "OrderTagOverwriteEvent", "OrderTagRemovedEvent", "PrincipalRefundedEvent"];
|
|
3
3
|
export declare const PAYMENT_EVENT_TYPE = "NewPaymentEvent";
|
|
4
4
|
export declare const MONITOR_KNOWN_TYPES: readonly string[];
|
|
5
5
|
export declare const EVENT_MODULE_OF: Record<string, MonitorEventModule>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const MONITOR_CAPTURE_TYPES=['NewOrderEvent','ArbEvent','VoteEvent','FeedbackEvent','DemandPresentEvent','DemandFeedbackEvent','DemandChangedEvent','ProgressEvent','ThresholdPendingEvent','AllocationEvent','TreasuryEvent','RewardClaimEvent','RewardFundEvent','ServiceEvent','NewEntityEvent','PermissionChangedEvent','RewardWithdrawEvent','RepositoryDataOverwriteEvent'];export const PAYMENT_EVENT_TYPE='NewPaymentEvent';export const MONITOR_KNOWN_TYPES=[...MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE];export const EVENT_MODULE_OF={'NewOrderEvent':'order','ArbEvent':'arb','VoteEvent':'arb','FeedbackEvent':'arb','DemandPresentEvent':'demand','DemandFeedbackEvent':'demand','DemandChangedEvent':'demand','ProgressEvent':'progress','ThresholdPendingEvent':'progress','AllocationEvent':'treasury','TreasuryEvent':'treasury','RewardClaimEvent':'reward','RewardFundEvent':'reward','ServiceEvent':'service','NewEntityEvent':'entity','NewPaymentEvent':'payment','PermissionChangedEvent':'permission','RewardWithdrawEvent':'reward','RepositoryDataOverwriteEvent':'repository'};export function monitorEventShortType(a){if(!a||typeof a!=='string')return null;if(a['includes']('::order::NewOrderEvent'))return'NewOrderEvent';if(a['includes']('::demand::PresentEvent'))return'DemandPresentEvent';if(a['includes']('::demand::DemandChangedEvent'))return'DemandChangedEvent';if(a['includes']('::demand::DemandEvent'))return'DemandFeedbackEvent';if(a['includes']('::progress::ProgressEvent'))return'ProgressEvent';if(a['includes']('::progress::ThresholdPendingEvent'))return'ThresholdPendingEvent';if(a['includes']('::arb::VoteEvent'))return'VoteEvent';if(a['includes']('::arb::FeedbackEvent'))return'FeedbackEvent';if(a['includes']('::arb::ArbEvent'))return'ArbEvent';if(a['includes']('::registrar::NewEntityEvent'))return'NewEntityEvent';if(a['includes']('::service::ServiceEvent'))return'ServiceEvent';if(a['includes']('::arbitration::ArbitrationEvent'))return'ArbitrationEvent';if(a['includes']('::allocation::AllocationEvent'))return'AllocationEvent';if(a['includes']('::treasury::TreasuryEvent'))return'TreasuryEvent';if(a['includes']('::reward::RewardClaimEvent'))return'RewardClaimEvent';if(a['includes']('::reward::RewardFundEvent'))return'RewardFundEvent';if(a['includes']('::reward::RewardWithdrawEvent'))return'RewardWithdrawEvent';if(a['includes']('::payment::NewPaymentEvent'))return'NewPaymentEvent';if(a['includes']('::permission::PermissionChangedEvent'))return'PermissionChangedEvent';if(a['includes']('::repository::RepositoryDataOverwriteEvent'))return'RepositoryDataOverwriteEvent';return null;}export function normalizeMonitorEvent(a){if(!a||typeof a!=='object')return a;if(MONITOR_KNOWN_TYPES['includes'](a['type'])&&!a['parsedJson_raw'])return a;const b=MONITOR_KNOWN_TYPES['includes'](a['type'])?a['type']:monitorEventShortType(a['type_raw']??a['type']);if(!b)return a;const c=a['parsedJson_raw']??{},d=f=>f&&typeof f==='object'&&!Array['isArray'](f)&&'some'in f?f['some']:f,e={...a,'type':b};switch(b){case'NewOrderEvent':return{...e,'order':d(c['object']),'service':d(c['service'])??null,'progress':d(c['progress'])??null,'discount':d(c['discount'])??null,'allocation':d(c['allocation'])??null,'amount':d(c['amount'])??null};case'DemandPresentEvent':return{...e,'demand':d(c['object']),'service':d(c['service'])??null,'recommend':d(c['recommend'])??null};case'DemandFeedbackEvent':return{...e,'demand':d(c['object']),'service':d(c['service'])??null,'feedback':d(c['feedback'])??null,'acceptance_score':d(c['acceptance_score'])??null};case'ProgressEvent':return{...e,'progress':d(c['object']),'machine':d(c['machine'])??null,'task':d(c['task'])??null,'node':d(c['node'])??null,'forward':d(c['forward'])??null,'hold':d(c['hold'])??null};case'ThresholdPendingEvent':return{...e,'progress':d(c['object']),'machine':d(c['machine'])??null,'task':d(c['task'])??null,'node':d(c['node'])??null,'next_node':d(c['next_node'])??null,'forward':d(c['forward'])??null,'weights':d(c['weights'])??null,'threshold':d(c['threshold'])??null};case'ArbEvent':return{...e,'arb':d(c['object']),'arbitration':d(c['arbitration'])??null,'order':d(c['order'])??null,'status':d(c['status'])??null};case'NewEntityEvent':return{...e,'resource':d(c['resource'])??null,'address':a['sender'],'referrer':d(c['referrer'])??null};case'PermissionChangedEvent':return{...e,'object':d(c['object']),'old':d(c['old'])??null,'new':d(c['new'])??null,'caller':d(c['caller'])??null};case'RewardWithdrawEvent':return{...e,'object':d(c['object']),'to':d(c['to'])??null,'payment':d(c['payment'])??null,'amount':d(c['amount'])??null,'balance_left':d(c['balance_left'])??null};case'RepositoryDataOverwriteEvent':return{...e,'object':d(c['object']),'id':d(c['id'])??null,'key':d(c['key'])??null};case'ServiceEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null};case'ArbitrationEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null,'fee':d(c['fee'])??null,'voting_guard_count':d(c['voting_guard_count'])??null};case'DemandChangedEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null,'rewards':d(c['rewards'])??[]};case'VoteEvent':return{...e,'object':d(c['object']),'voter':d(c['voter'])??null,'agrees':d(c['agrees'])??[],'weight':d(c['weight'])??null};case'FeedbackEvent':return{...e,'object':d(c['object']),'feedback':d(c['feedback'])??null};case'AllocationEvent':return{...e,'object':d(c['object']),'payment':d(c['payment'])??null,'guard':d(c['guard'])??null,'amount':d(c['amount'])??null};case'TreasuryEvent':return{...e,'object':d(c['object']),'op':d(c['op'])??null,'payment':d(c['payment'])??null,'amount':d(c['amount'])??null,'external_guard':d(c['external_guard'])??null,'store_from_id':d(c['store_from_id'])??null};case'RewardClaimEvent':return{...e,'object':d(c['object']),'guard':d(c['guard'])??null,'recipient':d(c['recipient'])??null,'amount':d(c['amount'])??null,'total':d(c['total'])??null,'balance_left':d(c['balance_left'])??null,'store_from_id':d(c['store_from_id'])??null};case'RewardFundEvent':return{...e,'object':d(c['object']),'amount':d(c['amount'])??null,'balance':d(c['balance'])??null,'from_payment':d(c['from_payment'])??null};case'NewPaymentEvent':return{...e,'object':d(c['object']),'info':c['info']?{...c['info'],'for_object':d(c['info']?.['for_object'])??null,'for_guard':d(c['info']?.['for_guard'])??null}:null,'record':Array['isArray'](c['record'])?c['record']:[],'amount':d(c['amount'])??null,'from_object':d(c['from_object'])??null};default:return e;}}export const EVENT_ADDRESS_FIELDS=['object','order','service','demand','progress','arb','arbitration','allocation','discount','machine','task','address','resource','payment','from_payment','from_object','to','caller','registrar','voted','who'];
|
|
1
|
+
export const MONITOR_CAPTURE_TYPES=['NewOrderEvent','ArbEvent','VoteEvent','FeedbackEvent','DemandPresentEvent','DemandFeedbackEvent','DemandChangedEvent','ProgressEvent','ThresholdPendingEvent','AllocationEvent','TreasuryEvent','RewardClaimEvent','RewardFundEvent','ServiceEvent','NewEntityEvent','PermissionChangedEvent','RewardWithdrawEvent','RepositoryDataOverwriteEvent','RowRemovedEvent','OrderTagOverwriteEvent','OrderTagRemovedEvent','PrincipalRefundedEvent'];export const PAYMENT_EVENT_TYPE='NewPaymentEvent';export const MONITOR_KNOWN_TYPES=[...MONITOR_CAPTURE_TYPES,PAYMENT_EVENT_TYPE];export const EVENT_MODULE_OF={'NewOrderEvent':'order','ArbEvent':'arb','VoteEvent':'arb','FeedbackEvent':'arb','DemandPresentEvent':'demand','DemandFeedbackEvent':'demand','DemandChangedEvent':'demand','ProgressEvent':'progress','ThresholdPendingEvent':'progress','AllocationEvent':'treasury','TreasuryEvent':'treasury','RewardClaimEvent':'reward','RewardFundEvent':'reward','ServiceEvent':'service','NewEntityEvent':'entity','NewPaymentEvent':'payment','PermissionChangedEvent':'permission','RewardWithdrawEvent':'reward','RepositoryDataOverwriteEvent':'repository','RowRemovedEvent':'repository','OrderTagOverwriteEvent':'repository','OrderTagRemovedEvent':'repository','PrincipalRefundedEvent':'order'};export function monitorEventShortType(a){if(!a||typeof a!=='string')return null;if(a['includes']('::order::NewOrderEvent'))return'NewOrderEvent';if(a['includes']('::demand::PresentEvent'))return'DemandPresentEvent';if(a['includes']('::demand::DemandChangedEvent'))return'DemandChangedEvent';if(a['includes']('::demand::DemandEvent'))return'DemandFeedbackEvent';if(a['includes']('::progress::ProgressEvent'))return'ProgressEvent';if(a['includes']('::progress::ThresholdPendingEvent'))return'ThresholdPendingEvent';if(a['includes']('::arb::VoteEvent'))return'VoteEvent';if(a['includes']('::arb::FeedbackEvent'))return'FeedbackEvent';if(a['includes']('::arb::ArbEvent'))return'ArbEvent';if(a['includes']('::registrar::NewEntityEvent'))return'NewEntityEvent';if(a['includes']('::service::ServiceEvent'))return'ServiceEvent';if(a['includes']('::arbitration::ArbitrationEvent'))return'ArbitrationEvent';if(a['includes']('::allocation::AllocationEvent'))return'AllocationEvent';if(a['includes']('::treasury::TreasuryEvent'))return'TreasuryEvent';if(a['includes']('::reward::RewardClaimEvent'))return'RewardClaimEvent';if(a['includes']('::reward::RewardFundEvent'))return'RewardFundEvent';if(a['includes']('::reward::RewardWithdrawEvent'))return'RewardWithdrawEvent';if(a['includes']('::payment::NewPaymentEvent'))return'NewPaymentEvent';if(a['includes']('::permission::PermissionChangedEvent'))return'PermissionChangedEvent';if(a['includes']('::repository::RepositoryDataOverwriteEvent'))return'RepositoryDataOverwriteEvent';if(a['includes']('::repository::RowRemovedEvent'))return'RowRemovedEvent';if(a['includes']('::repository::OrderTagOverwriteEvent'))return'OrderTagOverwriteEvent';if(a['includes']('::repository::OrderTagRemovedEvent'))return'OrderTagRemovedEvent';if(a['includes']('::order::PrincipalRefundedEvent'))return'PrincipalRefundedEvent';return null;}export function normalizeMonitorEvent(a){if(!a||typeof a!=='object')return a;if(MONITOR_KNOWN_TYPES['includes'](a['type'])&&!a['parsedJson_raw'])return a;const b=MONITOR_KNOWN_TYPES['includes'](a['type'])?a['type']:monitorEventShortType(a['type_raw']??a['type']);if(!b)return a;const c=a['parsedJson_raw']??{},d=f=>f&&typeof f==='object'&&!Array['isArray'](f)&&'some'in f?f['some']:f,e={...a,'type':b};switch(b){case'NewOrderEvent':return{...e,'order':d(c['object']),'service':d(c['service'])??null,'progress':d(c['progress'])??null,'discount':d(c['discount'])??null,'allocation':d(c['allocation'])??null,'amount':d(c['amount'])??null};case'DemandPresentEvent':return{...e,'demand':d(c['object']),'service':d(c['service'])??null,'recommend':d(c['recommend'])??null};case'DemandFeedbackEvent':return{...e,'demand':d(c['object']),'service':d(c['service'])??null,'feedback':d(c['feedback'])??null,'acceptance_score':d(c['acceptance_score'])??null};case'ProgressEvent':return{...e,'progress':d(c['object']),'machine':d(c['machine'])??null,'task':d(c['task'])??null,'node':d(c['node'])??null,'forward':d(c['forward'])??null,'hold':d(c['hold'])??null};case'ThresholdPendingEvent':return{...e,'progress':d(c['object']),'machine':d(c['machine'])??null,'task':d(c['task'])??null,'node':d(c['node'])??null,'next_node':d(c['next_node'])??null,'forward':d(c['forward'])??null,'weights':d(c['weights'])??null,'threshold':d(c['threshold'])??null};case'ArbEvent':return{...e,'arb':d(c['object']),'arbitration':d(c['arbitration'])??null,'order':d(c['order'])??null,'status':d(c['status'])??null};case'NewEntityEvent':return{...e,'resource':d(c['resource'])??null,'address':a['sender'],'referrer':d(c['referrer'])??null};case'PermissionChangedEvent':return{...e,'object':d(c['object']),'old':d(c['old'])??null,'new':d(c['new'])??null,'caller':d(c['caller'])??null};case'RewardWithdrawEvent':return{...e,'object':d(c['object']),'to':d(c['to'])??null,'payment':d(c['payment'])??null,'amount':d(c['amount'])??null,'balance_left':d(c['balance_left'])??null};case'RepositoryDataOverwriteEvent':return{...e,'object':d(c['object']),'id':d(c['id'])??null,'key':d(c['key'])??null};case'RowRemovedEvent':return{...e,'object':d(c['object']),'id':d(c['id'])??null,'key':d(c['key'])??null};case'OrderTagOverwriteEvent':case'OrderTagRemovedEvent':return{...e,'repository':d(c['repository'])??null,'order':d(c['order'])??null,'tag':d(c['tag'])??null};case'PrincipalRefundedEvent':return{...e,'object':d(c['object']),'amount':d(c['amount'])??null};case'ServiceEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null};case'ArbitrationEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null,'fee':d(c['fee'])??null,'voting_guard_count':d(c['voting_guard_count'])??null};case'DemandChangedEvent':return{...e,'object':d(c['object']),'location':d(c['location'])??null,'description':d(c['description'])??null,'rewards':d(c['rewards'])??[]};case'VoteEvent':return{...e,'object':d(c['object']),'voter':d(c['voter'])??null,'agrees':d(c['agrees'])??[],'weight':d(c['weight'])??null};case'FeedbackEvent':return{...e,'object':d(c['object']),'feedback':d(c['feedback'])??null};case'AllocationEvent':return{...e,'object':d(c['object']),'payment':d(c['payment'])??null,'guard':d(c['guard'])??null,'amount':d(c['amount'])??null};case'TreasuryEvent':return{...e,'object':d(c['object']),'op':d(c['op'])??null,'payment':d(c['payment'])??null,'amount':d(c['amount'])??null,'external_guard':d(c['external_guard'])??null,'store_from_id':d(c['store_from_id'])??null};case'RewardClaimEvent':return{...e,'object':d(c['object']),'guard':d(c['guard'])??null,'recipient':d(c['recipient'])??null,'amount':d(c['amount'])??null,'total':d(c['total'])??null,'balance_left':d(c['balance_left'])??null,'store_from_id':d(c['store_from_id'])??null};case'RewardFundEvent':return{...e,'object':d(c['object']),'amount':d(c['amount'])??null,'balance':d(c['balance'])??null,'from_payment':d(c['from_payment'])??null};case'NewPaymentEvent':return{...e,'object':d(c['object']),'info':c['info']?{...c['info'],'for_object':d(c['info']?.['for_object'])??null,'for_guard':d(c['info']?.['for_guard'])??null}:null,'record':Array['isArray'](c['record'])?c['record']:[],'amount':d(c['amount'])??null,'from_object':d(c['from_object'])??null};default:return e;}}export const EVENT_ADDRESS_FIELDS=['object','order','service','demand','progress','arb','arbitration','allocation','discount','machine','task','address','resource','payment','from_payment','from_object','to','caller','registrar','voted','who'];
|
package/dist/monitor/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const MONITOR_EVENT_MODULES=['order','arb','demand','progress','treasury','reward','service','entity','payment','permission','repository'];export const LOOP_DEFAULTS={'poll_interval_ms':0x3a98,'scope_refresh_ms':0x493e0,'backfill_days':0x7};export const LOOP_MIN={'poll_interval_ms':0x1388,'scope_refresh_ms':0xea60,'backfill_days':0x0};export const DEFAULT_EVENT_SWITCHES={'NewOrderEvent':!![],'ProgressEvent':!![],'ThresholdPendingEvent':!![],'ArbEvent':!![],'VoteEvent':!![],'TreasuryEvent':!![],'RewardFundEvent':!![],'RewardClaimEvent':!![],'AllocationEvent':!![],'RewardWithdrawEvent':!![],'PermissionChangedEvent':!![],'RepositoryDataOverwriteEvent':!![],'FeedbackEvent':![],'NewPaymentEvent':![],'DemandChangedEvent':![],'DemandPresentEvent':![],'DemandFeedbackEvent':![],'ServiceEvent':![],'NewEntityEvent':![]};export function defaultSubscriptionConfig(){return{'version':0x2,'enabled':!![],'scope':{'accounts':'local-all','rules':{'managed_objects':!![],'merchant_orders':!![],'my_orders':!![],'order_children':!![],'favor_objects':!![]},'focus_objects':[]},'events':{...DEFAULT_EVENT_SWITCHES},'filters':[],'loop':{...LOOP_DEFAULTS}};}export function normalizeAddr(a){if(!a)return'';const b=a['startsWith']('0x')?a['slice'](0x2):a;return b['toLowerCase']();}
|
|
1
|
+
export const MONITOR_EVENT_MODULES=['order','arb','demand','progress','treasury','reward','service','entity','payment','permission','repository'];export const LOOP_DEFAULTS={'poll_interval_ms':0x3a98,'scope_refresh_ms':0x493e0,'backfill_days':0x7};export const LOOP_MIN={'poll_interval_ms':0x1388,'scope_refresh_ms':0xea60,'backfill_days':0x0};export const DEFAULT_EVENT_SWITCHES={'NewOrderEvent':!![],'ProgressEvent':!![],'ThresholdPendingEvent':!![],'ArbEvent':!![],'VoteEvent':!![],'TreasuryEvent':!![],'RewardFundEvent':!![],'RewardClaimEvent':!![],'AllocationEvent':!![],'RewardWithdrawEvent':!![],'PermissionChangedEvent':!![],'RepositoryDataOverwriteEvent':!![],'RowRemovedEvent':!![],'OrderTagOverwriteEvent':!![],'OrderTagRemovedEvent':!![],'PrincipalRefundedEvent':!![],'FeedbackEvent':![],'NewPaymentEvent':![],'DemandChangedEvent':![],'DemandPresentEvent':![],'DemandFeedbackEvent':![],'ServiceEvent':![],'NewEntityEvent':![]};export function defaultSubscriptionConfig(){return{'version':0x2,'enabled':!![],'scope':{'accounts':'local-all','rules':{'managed_objects':!![],'merchant_orders':!![],'my_orders':!![],'order_children':!![],'favor_objects':!![]},'focus_objects':[]},'events':{...DEFAULT_EVENT_SWITCHES},'filters':[],'loop':{...LOOP_DEFAULTS}};}export function normalizeAddr(a){if(!a)return'';const b=a['startsWith']('0x')?a['slice'](0x2):a;return b['toLowerCase']();}
|
|
@@ -15,6 +15,10 @@ export interface CustomerInterestInput {
|
|
|
15
15
|
terminal?: "completed" | "refunded" | null;
|
|
16
16
|
stalled_hours?: number;
|
|
17
17
|
unread_messages?: number;
|
|
18
|
+
auto_accept?: {
|
|
19
|
+
hours_left: number;
|
|
20
|
+
accept_node: string;
|
|
21
|
+
};
|
|
18
22
|
allocation_payoff?: AllocatorPayoff[];
|
|
19
23
|
}
|
|
20
24
|
export interface CustomerInterestAnalysis {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function analyzeCustomerInterest(a){const b=[],c=[],d=[],e=[],f=a['token_type']?'\x20('+a['token_type']+')':'';if(a['terminal']==='completed')b['push']('Order\x20reached\x20a\x20completion\x20terminal:\x20escrowed\x20funds\x20were\x20released\x20to\x20the\x20merchant.\x20'+'Verify\x20the\x20deliverable\x20matched\x20the\x20agreement\x20BEFORE\x20confirming\x20—\x20after\x20release,\x20refunds\x20are\x20harder.');else{if(a['terminal']==='refunded')b['push']('Order\x20reached\x20a\x20refund\x20terminal:\x20escrowed\x20funds\x20return\x20to\x20you\x20per\x20the\x20Allocation\x20configuration.');else a['order_amount']!=null&&b['push'](a['order_amount']+'\x20raw\x20units'+f+'\x20of\x20YOUR\x20money\x20sit\x20escrowed\x20in\x20the\x20Order\x20—\x20'+'released\x20to\x20the\x20merchant\x20ONLY\x20when\x20the\x20workflow\x20advances\x20to\x20completion;\x20returned\x20to\x20you\x20ONLY\x20via\x20a\x20refund\x20path.');}if(a['compensation_fund']!=null&&a['compensation_fund']!=='0'){b['push']('Merchant\x20compensation_fund\x20holds\x20'+a['compensation_fund']+'\x20raw\x20units'+f+'\x20—\x20your\x20recourse\x20if\x20arbitration\x20awards\x20indemnity\x20(paid\x20FROM\x20it).\x20'+'An\x20award\x20is\x20capped\x20at\x203x\x20the\x20order\x20amount\x20(MAX_INDEMNITY_MULTIPLE),\x20so\x20treat\x20the\x20fund\x20above\x203x\x20as\x20the\x20'+'merchant\x27s\x20real\x20exposure\x20and\x20below\x203x\x20as\x20an\x20under-funded\x20promise\x20you\x20should\x20not\x20rely\x20on.');if(a['order_amount']!=null){const
|
|
1
|
+
export function analyzeCustomerInterest(a){const b=[],c=[],d=[],e=[],f=a['token_type']?'\x20('+a['token_type']+')':'';if(a['terminal']==='completed')b['push']('Order\x20reached\x20a\x20completion\x20terminal:\x20escrowed\x20funds\x20were\x20released\x20to\x20the\x20merchant.\x20'+'Verify\x20the\x20deliverable\x20matched\x20the\x20agreement\x20BEFORE\x20confirming\x20—\x20after\x20release,\x20refunds\x20are\x20harder.');else{if(a['terminal']==='refunded')b['push']('Order\x20reached\x20a\x20refund\x20terminal:\x20escrowed\x20funds\x20return\x20to\x20you\x20per\x20the\x20Allocation\x20configuration.');else a['order_amount']!=null&&b['push'](a['order_amount']+'\x20raw\x20units'+f+'\x20of\x20YOUR\x20money\x20sit\x20escrowed\x20in\x20the\x20Order\x20—\x20'+'released\x20to\x20the\x20merchant\x20ONLY\x20when\x20the\x20workflow\x20advances\x20to\x20completion;\x20returned\x20to\x20you\x20ONLY\x20via\x20a\x20refund\x20path.');}if(a['compensation_fund']!=null&&a['compensation_fund']!=='0'){b['push']('Merchant\x20compensation_fund\x20holds\x20'+a['compensation_fund']+'\x20raw\x20units'+f+'\x20—\x20your\x20recourse\x20if\x20arbitration\x20awards\x20indemnity\x20(paid\x20FROM\x20it).\x20'+'An\x20award\x20is\x20capped\x20at\x203x\x20the\x20order\x20amount\x20(MAX_INDEMNITY_MULTIPLE),\x20so\x20treat\x20the\x20fund\x20above\x203x\x20as\x20the\x20'+'merchant\x27s\x20real\x20exposure\x20and\x20below\x203x\x20as\x20an\x20under-funded\x20promise\x20you\x20should\x20not\x20rely\x20on.');if(a['order_amount']!=null){const k=BigInt(a['order_amount']),l=BigInt(a['compensation_fund']),m=k*0x3n;l<m&&b['push']('⚠️\x20Fund\x20under-coverage:\x20compensation_fund\x20'+a['compensation_fund']+'\x20<\x203x\x20this\x20order\x20('+m['toString']()+').\x20'+'If\x20you\x20win\x20arbitration\x20at\x20the\x20full\x203x\x20ceiling,\x20the\x20claim\x20aborts\x20unpayable\x20until\x20the\x20merchant\x20tops\x20up.\x20'+'Consider\x20a\x20smaller\x20order\x20or\x20confirm\x20the\x20merchant\x20has\x20topped\x20up\x20before\x20relying\x20on\x20arbitration.');}}else b['push']('Merchant\x20compensation_fund\x20is\x20EMPTY\x20—\x20arbitration\x20indemnity\x20is\x20unenforceable;\x20your\x20protection\x20is\x20the\x20refund\x20path\x20+\x20on-chain\x20reputation\x20only.');a['operable']['length']>0x0&&c['push']('YOU\x20can\x20execute\x20'+a['operable']['map'](n=>'\x27'+n['name']+'\x27')['join'](',\x20')+'\x20right\x20now\x20—\x20'+'your\x20confirmation\x20is\x20the\x20fund-release\x20trigger:\x20only\x20confirm\x20when\x20the\x20deliverable\x20matches\x20the\x20agreement.');a['terminal']==null&&a['operable']['length']===0x0&&a['waiting_on']['length']>0x0&&c['push']('No\x20forward\x20is\x20yours\x20at\x20this\x20node\x20—\x20you\x20carry\x20no\x20execution\x20responsibility\x20here;\x20'+'delivery\x20depends\x20on\x20the\x20merchant-side\x20roles\x20in\x20waiting_on.');a['operable']['length']>0x0&&a['terminal']==null&&d['push']('Your\x20confirmation\x20is\x20your\x20LEVERAGE:\x20escrowed\x20money\x20stays\x20locked\x20until\x20YOU\x20act\x20—\x20'+'do\x20not\x20confirm\x20before\x20verifying\x20the\x20deliverable\x20(WIP\x20hash\x20/\x20receipt).');const g=a['waiting_on']['some'](n=>n['role']!=='OrderHolder\x20(customer)');g&&a['terminal']==null&&d['push']('The\x20workflow\x20waits\x20on\x20merchant-side\x20roles:\x20a\x20Messenger\x20nudge\x20accelerates\x20delivery\x20'+'and\x20the\x20conversation\x20is\x20recorded\x20as\x20WTS\x20evidence\x20protecting\x20you\x20in\x20a\x20dispute.');a['arbitration_bound']&&a['terminal']==null&&(d['push']('A\x20dispute\x20path\x20exists:\x20if\x20the\x20merchant\x20stalls\x20or\x20under-delivers,\x20open\x20arbitration\x20—\x20'+'your\x20evidence\x20(WTS\x20+\x20WIP\x20hash)\x20decides\x20the\x20outcome.'),d['push']('Pick\x20your\x20dispute\x20track\x20BEFORE\x20you\x20collect\x20anything.\x20The\x20refund\x20rail\x20(escrow\x20→\x20you)\x20and\x20the\x20'+'compensation\x20rail\x20(merchant\x27s\x20fund\x20→\x20you)\x20are\x20independent\x20chains,\x20but\x20the\x20indemnity\x20is\x20NET\x20of\x20what\x20'+'you\x20have\x20already\x20recovered\x20—\x20so\x20if\x20you\x20take\x20a\x20full\x20refund\x20first,\x20a\x20well-advised\x20arbitrator\x20will\x20'+'typically\x20award\x20~0\x20on\x20top\x20of\x20it.\x20Decide\x20refund-only\x20vs\x20arbitration\x20first;\x20chasing\x20both\x20usually\x20nets\x20'+'you\x20the\x20same\x20money\x20with\x20a\x20weaker,\x20more\x20challengeable\x20case.'),d['push']('File\x20through\x20an\x20arbitrator\x20the\x20MERCHANT\x20already\x20accepts\x20(the\x20Service\x27s\x20arbitration\x20list).\x20A\x20buyer\x20'+'cannot\x20add\x20its\x20own\x20venue:\x20an\x20award\x20from\x20an\x20unlisted\x20arbitrator\x20is\x20uncollectable\x20(claim\x20aborts\x2039),\x20so\x20'+'the\x20fee\x20you\x20pay\x20buys\x20a\x20ruling\x20nobody\x20has\x20to\x20honour.'));(a['unread_messages']??0x0)>0x0&&d['push'](a['unread_messages']+'\x20unread\x20Messenger\x20message(s)\x20—\x20timely\x20replies\x20protect\x20your\x20position\x20(WTS\x20record).');if(a['auto_accept']!=null&&a['terminal']==null){const n=Math['max'](0x0,a['auto_accept']['hours_left']),o=n>=0x30?Math['round'](n/0x18)+'\x20days':Math['round'](n)+'\x20hours';d['push']('⏰\x20Auto-acceptance:\x20the\x20merchant-side\x20keeper\x20clock\x20can\x20accept\x20this\x20order\x20for\x20you\x20in\x20~'+o+'\x20'+'(keeps\x20running\x20while\x20you\x20wait).\x20After\x20it\x20fires,\x20the\x20refund/revision\x20rails\x20anchored\x20on\x20the\x20'+'CURRENT\x20node\x20close\x20—\x20verify\x20the\x20deliverable\x20and\x20file\x20refund/revision\x20BEFORE\x20then.\x20Whether\x20'+'recourse\x20survives\x20acceptance\x20depends\x20on\x20the\x20template\x27s\x20post-acceptance\x20window;\x20arbitration\x20'+'is\x20always\x20the\x20residual\x20path.');}a['allocation_payoff']?.['some'](q=>q['positions']['caller']==='gains')&&e['push']('An\x20allocator\x20entry\x20has\x20an\x20unbound\x20Signer\x20recipient\x20(conservative\x20payoff:\x20caller\x20gains\x20—\x20RC-FIND-01):\x20'+'a\x20third\x20party\x20passing\x20that\x20guard\x20could\x20receive\x20settlement\x20funds.\x20Verify\x20whether\x20the\x20guard\x20binds\x20the\x20Signer.');a['allocation_payoff']?.['some'](q=>q['positions']['customer']==='conditional')&&b['push']('Object-address\x20slots\x20settle\x20to\x20the\x20submitted\x20order\x20itself:\x20you\x20receive\x20them\x20as\x20the\x20order\x20owner\x20'+'(object\x20receipt\x20=\x20owner\x20receipt).');a['order_amount']!=null&&a['terminal']==null&&e['push'](a['order_amount']+'\x20raw\x20units'+f+'\x20are\x20at\x20risk\x20while\x20escrowed\x20—\x20if\x20the\x20merchant\x20stalls\x20beyond\x20the\x20timeout,\x20'+'pursue\x20refund/arbitration\x20rather\x20than\x20letting\x20the\x20order\x20stall\x20indefinitely.');a['stalled_hours']!=null&&a['stalled_hours']>0x18&&a['terminal']==null&&e['push']('Order\x20stalled\x20'+Math['round'](a['stalled_hours'])+'h:\x20your\x20leverage\x20is\x20compensation_fund\x20(if\x20any)\x20+\x20arbitration\x20+\x20on-chain\x20reputation\x20(dislike)\x20—\x20in\x20that\x20order.');a['terminal']==='refunded'&&e['push']('Refund\x20executed:\x20funds\x20returned.\x20Remaining\x20stakes\x20are\x20reputational\x20—\x20a\x20dislike\x20vote\x20is\x20your\x20residual\x20recourse\x20if\x20the\x20merchant\x20behaved\x20unfairly.');const i=a['terminal']==='completed'?'order\x20completed\x20—\x20funds\x20released\x20(verify\x20deliverable\x20matched\x20before\x20confirming\x20next\x20time)':a['terminal']==='refunded'?'order\x20refunded\x20—\x20funds\x20returned':a['operable']['length']>0x0?'YOU\x20can\x20act\x20('+a['operable']['length']+'\x20forward(s))\x20—\x20your\x20confirmation\x20releases\x20funds,\x20verify\x20first':'waiting\x20on\x20'+(a['waiting_on']['map'](p=>p['role'])['join'](',\x20')||'others')+'\x20—\x20monitor\x20and\x20nudge',j='Customer\x20interest\x20at\x20node\x20\x27'+(a['current_node']||'(entry)')+'\x27:\x20'+i+'.\x20'+'All\x20options\x20above\x20are\x20informational\x20—\x20the\x20decision\x20is\x20yours.';return{'fund_flow':b,'responsibility':c,'leverage':d,'stakes':e,'summary':j};}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PHASE_KERNELS={'build':[],'in_flight':['node_game','allocation_advice'],'dispute':['arbitration_game','allocation_advice'],'post':['allocation_advice','review_face']};export function deriveGameContext(a){const b=a['completed']||a['refunded'],c=!a['has_order']?'build':b?'post':a['dispute_active']?'dispute':'in_flight',d=new Set(PHASE_KERNELS[c]);if(a['has_order']&&a['dispute_active'])d['add']('arbitration_game');return{'phase':c,'focus_object':a['focus_object']??null,'action_surface':[...d],'dispute_active':a['has_order']&&a['dispute_active'],'terminal':b,'time_anchors':{...a['last_progress_at']!==undefined?{'last_progress_at':a['last_progress_at']}:{},'now':a['now'],...a['last_progress_at']!=null?{'stalled_hours':(a['now']-a['last_progress_at'])/0x36ee80}:{}}};}
|
|
1
|
+
export const PHASE_KERNELS={'build':[],'in_flight':['node_game','allocation_advice'],'dispute':['arbitration_game','allocation_advice'],'post':['allocation_advice','review_face']};export function deriveGameContext(a){const b=a['completed']||a['refunded'],c=!a['has_order']?'build':b?'post':a['dispute_active']?'dispute':'in_flight',d=new Set(PHASE_KERNELS[c]);if(a['has_order']&&a['dispute_active'])d['add']('arbitration_game');return{'phase':c,'focus_object':a['focus_object']??null,'action_surface':[...d],'dispute_active':a['has_order']&&a['dispute_active'],'terminal':b,'time_anchors':{...a['last_progress_at']!==undefined?{'last_progress_at':a['last_progress_at']}:{},'now':a['now'],...a['last_progress_at']!=null?{'stalled_hours':Math['round']((a['now']-a['last_progress_at'])/0x36ee80*0x64)/0x64}:{}}};}
|
|
@@ -38,6 +38,10 @@ export interface NodeActionInput {
|
|
|
38
38
|
last_progress_at?: number;
|
|
39
39
|
now: number;
|
|
40
40
|
unread_messages?: number;
|
|
41
|
+
auto_accept?: {
|
|
42
|
+
hours_left: number;
|
|
43
|
+
accept_node: string;
|
|
44
|
+
};
|
|
41
45
|
persona_drive?: PersonaDrive;
|
|
42
46
|
intent_hints?: RoleIntentPromptHints;
|
|
43
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{buildAllocationAdvice,allocationAssessment}from'./allocation-advice.js';import{deriveGameContext}from'./game-context.js';import{counterpartyMoves}from'../knowledge/game-scenarios.js';import{evaluateNodeGame,actionAssessment}from'../evaluation/node-game.js';import{evaluateArbGame,moveAssessment}from'../evaluation/arbitration-game.js';import{resolveRoleIntent}from'../role/intent.js';import{analyzeMerchantInterest}from'./merchant-interest.js';import{analyzeCustomerInterest}from'./customer-interest.js';import{analyzeSupplierInterest}from'./supplier-interest.js';import{analyzeCollaboratorInterest}from'./collaborator-interest.js';function rawStr(a){if(a==null)return undefined;if(typeof a==='object'&&'balance'in a)return rawStr(a['balance']);return String(a);}export function buildNodeActionAdvice(b){const c=b['radar'],d=deriveGameContext({'has_order':c['order']!=null,'completed':b['completed'],'refunded':b['refunded'],'dispute_active':b['dispute_active'],'focus_object':c['progress'],'last_progress_at':b['last_progress_at'],'now':b['now']}),f={'role':c['perspective'],'context':d,'kernels_run':[],'advisory_gaps':[],'actions':[]},g=new Set(d['action_surface']),h=d['time_anchors']['stalled_hours'],i=b['completed']?'completed':b['refunded']?'refunded':null,j={'account':c['account'],'current_node':c['current_node'],'operable':c['operable'],'waiting_on':c['waiting_on'],'terminal':i,'stalled_hours':h,'unread_messages':b['unread_messages']};switch(c['perspective']){case'merchant':f['interest_analysis']=analyzeMerchantInterest({...j,'order_amount':rawStr(b['order_amount']),'token_type':b['token_type'],'allocation':b['allocation_summary'],'compensation_fund':rawStr(b['compensation_fund']),'arbitration_bound':b['arbitration_bound'],'rewards_count':b['rewards_count']??0x0});break;case'supplier':f['interest_analysis']=analyzeSupplierInterest({...j,'order_amount':rawStr(b['order_amount']),'token_type':b['token_type'],'arbitration_bound':b['arbitration_bound'],'compensation_fund':rawStr(b['compensation_fund']),'allocation_payoff':b['allocation_summary']?.['payoffs']});break;case'collaborator':f['interest_analysis']=analyzeCollaboratorInterest({...j,'collaborator_kind':c['collaborator_kind'],'arbitration_bound':b['arbitration_bound'],'allocation_payoff':b['allocation_summary']?.['payoffs']});break;case'customer':f['interest_analysis']=analyzeCustomerInterest({...j,'order_amount':rawStr(b['order_amount']),'token_type':b['token_type'],'compensation_fund':rawStr(b['compensation_fund']),'arbitration_bound':b['arbitration_bound'],'allocation_payoff':b['allocation_summary']?.['payoffs']});break;default:break;}const k=resolveRoleIntent(c['perspective'],b['persona_drive'],b['intent_hints']);for(const o of k['warnings'])f['advisory_gaps']['push'](o);if(g['has']('node_game')&&!c['workflow_unknown']){const p={'current_node':c['current_node'],'perspective':c['perspective'],'appetite':k['profile']['risk_appetite'],...k['profile']['red_lines']['length']?{'requirements':k['profile']['red_lines']}:{},'threshold':c['threshold'],'order_amount':rawStr(b['order_amount']),'compensation_fund':rawStr(b['compensation_fund']),'claimable_rewards':c['pending_claims']['filter'](q=>q['kind']==='reward')['map'](q=>({'description':q['label']})),'operable':c['operable']['map'](q=>({'name':q['name'],'to_node':q['to_node'],'execution_path':q['execution_path'],'guard':q['guard'],'consequence':q['consequence'],'weight':q['weight']})),'waiting_on':c['waiting_on']};f['node_game']=evaluateNodeGame(p);}if(d['dispute_active']&&b['arb_status']!=null){const q=c['perspective']==='customer'||c['perspective']==='merchant'||c['perspective']==='arbitrator'?c['perspective']:null;q&&(f['arb_game']=evaluateArbGame(b['arb_status'],q));}let l;if(c['order']!=null&&b['allocation_pool']){const r={'pool':b['allocation_pool'],'order_amount':b['order_amount'],'role':c['perspective'],'is_order_holder':b['is_order_holder'],'completed':b['completed'],'refunded':b['refunded'],'can_act_now':c['operable']['length']>0x0,'compensation_fund':b['compensation_fund'],'has_dispute':b['has_dispute']};try{l=buildAllocationAdvice(r);}catch(s){l=undefined,f['advisory_gaps']['push']('Fund\x20advice\x20failed\x20for\x20'+b['allocation_pool']['address']+':\x20'+s['message']+'.');}}if(l)f['fund_advice']=l;if(f['node_game'])f['kernels_run']['push']('node_game');if(f['arb_game'])f['kernels_run']['push']('arbitration_game');if(l)f['kernels_run']['push']('allocation_advice');const m=counterpartyMoves(c['perspective'],d['phase'])['map'](t=>t['attack_role']+':\x20'+t['move']),n=[c['progress'],...c['order']?[c['order']]:[]];if(f['node_game'])for(const t of f['node_game']['actions']){const u=c['operable']['find'](v=>v['name']===t['forward']);f['actions']['push']({'action':'advance\x20\x27'+t['forward']+'\x27\x20→\x20\x27'+t['to_node']+'\x27','via':u?.['recommended_call']?u['recommended_call']['tool']+'\x20('+u['recommended_call']['path']+')':'forward\x20execution\x20on\x20the\x20Progress\x20object','preconditions':[...t['guard']?['a\x20validated\x20passport\x20for\x20the\x20bound\x20guard']:[],...f['node_game']['cooperation']&&f['node_game']['cooperation']['needed_from_others']>0x0?[f['node_game']['cooperation']['needed_from_others']+'\x20more\x20forward-weight\x20from\x20cooperating\x20role(s)']:[]],'assessment':actionAssessment(t,f['node_game']),...d['time_anchors']['stalled_hours']!=null&&stalledCost(d['time_anchors']['stalled_hours'])!==undefined?{'cost_of_delay':stalledCost(d['time_anchors']['stalled_hours'])}:{},'counterparty_moves':m,'evidence_refs':[...n,t['forward']]});}if(f['arb_game'])for(const v of f['arb_game']['actions']){f['actions']['push']({'action':'case\x20move\x20\x27'+v['action']+'\x27\x20('+f['arb_game']['status']+')','via':'arbitration\x20case\x20operation\x20on\x20the\x20Arb\x20object','preconditions':[],'assessment':moveAssessment(v),'counterparty_moves':m,'evidence_refs':[...n,f['arb_game']['status']]});}return l&&l['decision_advice']['length']>0x0&&f['actions']['push']({'action':l['settled']?'review\x20the\x20settlement\x20state\x20of\x20the\x20allocation\x20pool':'move\x20on\x20the\x20allocation\x20pool\x20(settle\x20/\x20dispute\x20per\x20your\x20side\x27s\x20decision\x20rule)','via':'allocation\x20guard\x20mechanism\x20(alloc\x20by\x20guard)\x20/\x20dispute\x20filing','preconditions':[...l['funded']?['pool\x20still\x20holds\x20a\x20distributable\x20balance']:[],...l['settled']?[]:['no\x20Payment\x20produced\x20yet']],'assessment':allocationAssessment(l,{...h!=null&&h>0x18?{'costOfDelay':'order\x20stalled\x20'+Math['round'](h)+'h\x20—\x20the\x20pool\x20stays\x20frozen\x20while\x20you\x20wait'}:{},...rawStr(b['order_amount'])!==undefined?{'stake':rawStr(b['order_amount'])}:{}}),'counterparty_moves':m,'evidence_refs':[...n,...l['pool']?[l['pool']]:[]]}),f;}function stalledCost(a){if(a<=0x18)return undefined;return'order\x20has\x20not\x20advanced\x20for\x20'+Math['round'](a)+'h\x20—\x20leverage\x20and\x20evidence\x20decay\x20with\x20time';}
|
|
1
|
+
import{buildAllocationAdvice,allocationAssessment}from'./allocation-advice.js';import{deriveGameContext}from'./game-context.js';import{counterpartyMoves}from'../knowledge/game-scenarios.js';import{evaluateNodeGame,actionAssessment}from'../evaluation/node-game.js';import{evaluateArbGame,moveAssessment}from'../evaluation/arbitration-game.js';import{resolveRoleIntent}from'../role/intent.js';import{analyzeMerchantInterest}from'./merchant-interest.js';import{analyzeCustomerInterest}from'./customer-interest.js';import{analyzeSupplierInterest}from'./supplier-interest.js';import{analyzeCollaboratorInterest}from'./collaborator-interest.js';function rawStr(a){if(a==null)return undefined;if(typeof a==='object'&&'balance'in a)return rawStr(a['balance']);return String(a);}export function buildNodeActionAdvice(b){const c=b['radar'],d=deriveGameContext({'has_order':c['order']!=null,'completed':b['completed'],'refunded':b['refunded'],'dispute_active':b['dispute_active'],'focus_object':c['progress'],'last_progress_at':b['last_progress_at'],'now':b['now']}),f={'role':c['perspective'],'context':d,'kernels_run':[],'advisory_gaps':[],'actions':[]},g=new Set(d['action_surface']),h=d['time_anchors']['stalled_hours'],i=b['completed']?'completed':b['refunded']?'refunded':null,j={'account':c['account'],'current_node':c['current_node'],'operable':c['operable'],'waiting_on':c['waiting_on'],'terminal':i,'stalled_hours':h,'unread_messages':b['unread_messages']};switch(c['perspective']){case'merchant':f['interest_analysis']=analyzeMerchantInterest({...j,'order_amount':rawStr(b['order_amount']),'token_type':b['token_type'],'allocation':b['allocation_summary'],'compensation_fund':rawStr(b['compensation_fund']),'arbitration_bound':b['arbitration_bound'],'rewards_count':b['rewards_count']??0x0});break;case'supplier':f['interest_analysis']=analyzeSupplierInterest({...j,'order_amount':rawStr(b['order_amount']),'token_type':b['token_type'],'arbitration_bound':b['arbitration_bound'],'compensation_fund':rawStr(b['compensation_fund']),'allocation_payoff':b['allocation_summary']?.['payoffs']});break;case'collaborator':f['interest_analysis']=analyzeCollaboratorInterest({...j,'collaborator_kind':c['collaborator_kind'],'arbitration_bound':b['arbitration_bound'],'allocation_payoff':b['allocation_summary']?.['payoffs']});break;case'customer':f['interest_analysis']=analyzeCustomerInterest({...j,'order_amount':rawStr(b['order_amount']),'token_type':b['token_type'],'compensation_fund':rawStr(b['compensation_fund']),'arbitration_bound':b['arbitration_bound'],'auto_accept':b['auto_accept'],'allocation_payoff':b['allocation_summary']?.['payoffs']});break;default:break;}const k=resolveRoleIntent(c['perspective'],b['persona_drive'],b['intent_hints']);for(const o of k['warnings'])f['advisory_gaps']['push'](o);if(g['has']('node_game')&&!c['workflow_unknown']){const p={'current_node':c['current_node'],'perspective':c['perspective'],'appetite':k['profile']['risk_appetite'],...k['profile']['red_lines']['length']?{'requirements':k['profile']['red_lines']}:{},'threshold':c['threshold'],'order_amount':rawStr(b['order_amount']),'compensation_fund':rawStr(b['compensation_fund']),'claimable_rewards':c['pending_claims']['filter'](q=>q['kind']==='reward')['map'](q=>({'description':q['label']})),'operable':c['operable']['map'](q=>({'name':q['name'],'to_node':q['to_node'],'execution_path':q['execution_path'],'guard':q['guard'],'consequence':q['consequence'],'weight':q['weight']})),'waiting_on':c['waiting_on']};f['node_game']=evaluateNodeGame(p);}if(d['dispute_active']&&b['arb_status']!=null){const q=c['perspective']==='customer'||c['perspective']==='merchant'||c['perspective']==='arbitrator'?c['perspective']:null;q&&(f['arb_game']=evaluateArbGame(b['arb_status'],q));}let l;if(c['order']!=null&&b['allocation_pool']){const r={'pool':b['allocation_pool'],'order_amount':b['order_amount'],'role':c['perspective'],'is_order_holder':b['is_order_holder'],'completed':b['completed'],'refunded':b['refunded'],'can_act_now':c['operable']['length']>0x0,'compensation_fund':b['compensation_fund'],'has_dispute':b['has_dispute']};try{l=buildAllocationAdvice(r);}catch(s){l=undefined,f['advisory_gaps']['push']('Fund\x20advice\x20failed\x20for\x20'+b['allocation_pool']['address']+':\x20'+s['message']+'.');}}if(l)f['fund_advice']=l;if(f['node_game'])f['kernels_run']['push']('node_game');if(f['arb_game'])f['kernels_run']['push']('arbitration_game');if(l)f['kernels_run']['push']('allocation_advice');const m=counterpartyMoves(c['perspective'],d['phase'])['map'](t=>t['attack_role']+':\x20'+t['move']),n=[c['progress'],...c['order']?[c['order']]:[]];if(f['node_game'])for(const t of f['node_game']['actions']){const u=c['operable']['find'](v=>v['name']===t['forward']);f['actions']['push']({'action':'advance\x20\x27'+t['forward']+'\x27\x20→\x20\x27'+t['to_node']+'\x27','via':u?.['recommended_call']?u['recommended_call']['tool']+'\x20('+u['recommended_call']['path']+')':'forward\x20execution\x20on\x20the\x20Progress\x20object','preconditions':[...t['guard']?['a\x20validated\x20passport\x20for\x20the\x20bound\x20guard']:[],...f['node_game']['cooperation']&&f['node_game']['cooperation']['needed_from_others']>0x0?[f['node_game']['cooperation']['needed_from_others']+'\x20more\x20forward-weight\x20from\x20cooperating\x20role(s)']:[]],'assessment':actionAssessment(t,f['node_game']),...d['time_anchors']['stalled_hours']!=null&&stalledCost(d['time_anchors']['stalled_hours'])!==undefined?{'cost_of_delay':stalledCost(d['time_anchors']['stalled_hours'])}:{},'counterparty_moves':m,'evidence_refs':[...n,t['forward']]});}if(f['arb_game'])for(const v of f['arb_game']['actions']){f['actions']['push']({'action':'case\x20move\x20\x27'+v['action']+'\x27\x20('+f['arb_game']['status']+')','via':'arbitration\x20case\x20operation\x20on\x20the\x20Arb\x20object','preconditions':[],'assessment':moveAssessment(v),'counterparty_moves':m,'evidence_refs':[...n,f['arb_game']['status']]});}return l&&l['decision_advice']['length']>0x0&&f['actions']['push']({'action':l['settled']?'review\x20the\x20settlement\x20state\x20of\x20the\x20allocation\x20pool':'move\x20on\x20the\x20allocation\x20pool\x20(settle\x20/\x20dispute\x20per\x20your\x20side\x27s\x20decision\x20rule)','via':'allocation\x20guard\x20mechanism\x20(alloc\x20by\x20guard)\x20/\x20dispute\x20filing','preconditions':[...l['funded']?['pool\x20still\x20holds\x20a\x20distributable\x20balance']:[],...l['settled']?[]:['no\x20Payment\x20produced\x20yet']],'assessment':allocationAssessment(l,{...h!=null&&h>0x18?{'costOfDelay':'order\x20stalled\x20'+Math['round'](h)+'h\x20—\x20the\x20pool\x20stays\x20frozen\x20while\x20you\x20wait'}:{},...rawStr(b['order_amount'])!==undefined?{'stake':rawStr(b['order_amount'])}:{}}),'counterparty_moves':m,'evidence_refs':[...n,...l['pool']?[l['pool']]:[]]}),f;}function stalledCost(a){if(a<=0x18)return undefined;return'order\x20has\x20not\x20advanced\x20for\x20'+Math['round'](a)+'h\x20—\x20leverage\x20and\x20evidence\x20decay\x20with\x20time';}
|