@jinn-network/client 0.1.8 → 0.1.9-canary.02befda9
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/README.md +6 -0
- package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +3 -3
- package/deployments/deployment-stolas-l2-baseSepolia-fast.json +23 -3
- package/deployments/deployment-task-coordinator-router-v3-baseSepolia-fast.json +34 -6
- package/dist/adapters/mech/adapter.d.ts +21 -1
- package/dist/adapters/mech/adapter.js +107 -52
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +174 -13
- package/dist/adapters/mech/contracts.js +99 -49
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/safe-revert.d.ts +4 -0
- package/dist/adapters/mech/safe-revert.js +5 -1
- package/dist/adapters/mech/safe-revert.js.map +1 -1
- package/dist/adapters/mech/safe.js +77 -1
- package/dist/adapters/mech/safe.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +4 -42
- package/dist/adapters/mech/types.js +8 -20
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/adapters/mech/verdict-code.js +1 -1
- package/dist/adapters/mech/verdict-code.js.map +1 -1
- package/dist/api/bootstrap-endpoint.d.ts +1 -0
- package/dist/api/bootstrap-endpoint.js +1 -0
- package/dist/api/bootstrap-endpoint.js.map +1 -1
- package/dist/api/discovery-endpoint.d.ts +1 -0
- package/dist/api/discovery-endpoint.js +24 -0
- package/dist/api/discovery-endpoint.js.map +1 -1
- package/dist/api/fleet-build.d.ts +1 -7
- package/dist/api/fleet-build.js +0 -7
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/gather-status.d.ts +26 -17
- package/dist/api/gather-status.js +57 -516
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/harness-auth-status-endpoint.d.ts +21 -0
- package/dist/api/harness-auth-status-endpoint.js +17 -0
- package/dist/api/harness-auth-status-endpoint.js.map +1 -0
- package/dist/api/loop-completion-build.d.ts +79 -0
- package/dist/api/loop-completion-build.js +155 -0
- package/dist/api/loop-completion-build.js.map +1 -0
- package/dist/api/operator-artifacts-endpoint.js +1 -1
- package/dist/api/operator-artifacts-endpoint.js.map +1 -1
- package/dist/api/peers.js +2 -0
- package/dist/api/peers.js.map +1 -1
- package/dist/api/rewards-build.d.ts +8 -1
- package/dist/api/rewards-build.js +32 -4
- package/dist/api/rewards-build.js.map +1 -1
- package/dist/api/rewards-endpoint.d.ts +12 -0
- package/dist/api/rewards-endpoint.js +46 -0
- package/dist/api/rewards-endpoint.js.map +1 -0
- package/dist/api/server.d.ts +6 -16
- package/dist/api/server.js +29 -26
- package/dist/api/server.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +41 -0
- package/dist/api/setup-endpoints.js +258 -45
- package/dist/api/setup-endpoints.js.map +1 -1
- package/dist/api/solvernets-endpoints.js +4 -1
- package/dist/api/solvernets-endpoints.js.map +1 -1
- package/dist/api/status-build.d.ts +71 -94
- package/dist/api/status-build.js +11 -77
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/status-rollup-build.d.ts +0 -4
- package/dist/api/status-rollup-build.js +0 -4
- package/dist/api/status-rollup-build.js.map +1 -1
- package/dist/api/stop-hook.d.ts +1 -1
- package/dist/api/stop-hook.js +1 -1
- package/dist/api/stop-hook.js.map +1 -1
- package/dist/build-info.json +4 -4
- package/dist/build-meta.json +1 -1
- package/dist/captures/live-publisher.d.ts +9 -0
- package/dist/captures/live-publisher.js +1 -0
- package/dist/captures/live-publisher.js.map +1 -1
- package/dist/captures/publish.d.ts +11 -0
- package/dist/captures/publish.js +15 -5
- package/dist/captures/publish.js.map +1 -1
- package/dist/cli/commands/codedigest-revert-check.js +6 -2
- package/dist/cli/commands/codedigest-revert-check.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +36 -4
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/eval.d.ts +87 -0
- package/dist/cli/commands/eval.js +481 -0
- package/dist/cli/commands/eval.js.map +1 -0
- package/dist/cli/commands/rewards.d.ts +2 -0
- package/dist/cli/commands/rewards.js +39 -10
- package/dist/cli/commands/rewards.js.map +1 -1
- package/dist/cli/commands/solver-nets.js +68 -0
- package/dist/cli/commands/solver-nets.js.map +1 -1
- package/dist/cli/commands/status.js +0 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/update.js +8 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/version.js +4 -0
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/introspection-context.js +0 -3
- package/dist/cli/introspection-context.js.map +1 -1
- package/dist/config.d.ts +158 -541
- package/dist/config.js +189 -196
- package/dist/config.js.map +1 -1
- package/dist/corpus/acquire.d.ts +7 -6
- package/dist/corpus/acquire.js +10 -10
- package/dist/corpus/acquire.js.map +1 -1
- package/dist/corpus/fetch-artifact.d.ts +21 -0
- package/dist/corpus/fetch-artifact.js +33 -0
- package/dist/corpus/fetch-artifact.js.map +1 -0
- package/dist/corpus/index.d.ts +2 -2
- package/dist/corpus/route-resolver.d.ts +3 -3
- package/dist/corpus/route-resolver.js +3 -3
- package/dist/daemon/ai-units-gate.d.ts +6 -6
- package/dist/daemon/ai-units-gate.js +11 -10
- package/dist/daemon/ai-units-gate.js.map +1 -1
- package/dist/daemon/balance-topup-loop.js +3 -0
- package/dist/daemon/balance-topup-loop.js.map +1 -1
- package/dist/daemon/checkpoint-loop.js +2 -2
- package/dist/daemon/creator.d.ts +1 -0
- package/dist/daemon/creator.js +26 -14
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +15 -10
- package/dist/daemon/daemon.js +71 -39
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/delivery-watcher.d.ts +9 -0
- package/dist/daemon/delivery-watcher.js +24 -1
- package/dist/daemon/delivery-watcher.js.map +1 -1
- package/dist/daemon/eviction-loop.d.ts +7 -0
- package/dist/daemon/eviction-loop.js +19 -3
- package/dist/daemon/eviction-loop.js.map +1 -1
- package/dist/daemon/join-applier.d.ts +35 -0
- package/dist/daemon/join-applier.js +49 -0
- package/dist/daemon/join-applier.js.map +1 -0
- package/dist/daemon/loop-heartbeat.d.ts +34 -0
- package/dist/daemon/loop-heartbeat.js +38 -0
- package/dist/daemon/loop-heartbeat.js.map +1 -0
- package/dist/daemon/reward-claim-loop.js +4 -1
- package/dist/daemon/reward-claim-loop.js.map +1 -1
- package/dist/daemon/skip-log-dedup.d.ts +1 -1
- package/dist/daemon/skip-log-dedup.js +3 -0
- package/dist/daemon/skip-log-dedup.js.map +1 -1
- package/dist/daemon/watchdog-loop.d.ts +84 -0
- package/dist/daemon/watchdog-loop.js +91 -0
- package/dist/daemon/watchdog-loop.js.map +1 -0
- package/dist/dashboard/assets/index-BsrAAmvC.js +171 -0
- package/dist/dashboard/assets/index-DQOWJ2SF.css +1 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/discovery/http.d.ts +17 -0
- package/dist/discovery/http.js +295 -25
- package/dist/discovery/http.js.map +1 -1
- package/dist/discovery/onchain.js +158 -2
- package/dist/discovery/onchain.js.map +1 -1
- package/dist/discovery/types.d.ts +106 -0
- package/dist/discovery/types.js +40 -0
- package/dist/discovery/types.js.map +1 -1
- package/dist/discovery/with-fallback.js +14 -0
- package/dist/discovery/with-fallback.js.map +1 -1
- package/dist/earning/bootstrap.d.ts +25 -0
- package/dist/earning/bootstrap.js +79 -28
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +0 -229
- package/dist/earning/contracts.js +4 -184
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/faucet-topup-store.d.ts +41 -0
- package/dist/earning/faucet-topup-store.js +89 -0
- package/dist/earning/faucet-topup-store.js.map +1 -0
- package/dist/earning/faucet.d.ts +1 -1
- package/dist/earning/faucet.js +2 -2
- package/dist/earning/faucet.js.map +1 -1
- package/dist/earning/safe-adapter.js +11 -0
- package/dist/earning/safe-adapter.js.map +1 -1
- package/dist/earning/stolas-claim.js +8 -8
- package/dist/earning/stolas-claim.js.map +1 -1
- package/dist/earning/{jinn-rewards.d.ts → stolas-staking.d.ts} +4 -8
- package/dist/earning/{jinn-rewards.js → stolas-staking.js} +6 -10
- package/dist/earning/stolas-staking.js.map +1 -0
- package/dist/earning/testnet-setup-migration.d.ts +1 -0
- package/dist/earning/testnet-setup-migration.js +7 -2
- package/dist/earning/testnet-setup-migration.js.map +1 -1
- package/dist/earning/types.d.ts +1 -1
- package/dist/earning/types.js +1 -1
- package/dist/earning/types.js.map +1 -1
- package/dist/earning/viem-clients.d.ts +3 -19
- package/dist/earning/viem-clients.js +4 -31
- package/dist/earning/viem-clients.js.map +1 -1
- package/dist/eval/eval-harness-run.d.ts +63 -0
- package/dist/eval/eval-harness-run.js +123 -0
- package/dist/eval/eval-harness-run.js.map +1 -0
- package/dist/eval/orchestrator.d.ts +224 -0
- package/dist/eval/orchestrator.js +250 -0
- package/dist/eval/orchestrator.js.map +1 -0
- package/dist/eval/paired.d.ts +68 -0
- package/dist/eval/paired.js +93 -0
- package/dist/eval/paired.js.map +1 -0
- package/dist/eval/resolve-slate-tasks.d.ts +35 -0
- package/dist/eval/resolve-slate-tasks.js +56 -0
- package/dist/eval/resolve-slate-tasks.js.map +1 -0
- package/dist/eval/screen-discovery.d.ts +22 -0
- package/dist/eval/screen-discovery.js +71 -0
- package/dist/eval/screen-discovery.js.map +1 -0
- package/dist/eval/screen-progress.d.ts +41 -0
- package/dist/eval/screen-progress.js +60 -0
- package/dist/eval/screen-progress.js.map +1 -0
- package/dist/eval/screen-runner.d.ts +30 -0
- package/dist/eval/screen-runner.js +289 -0
- package/dist/eval/screen-runner.js.map +1 -0
- package/dist/eval/screen.d.ts +107 -0
- package/dist/eval/screen.js +159 -0
- package/dist/eval/screen.js.map +1 -0
- package/dist/eval/slope.d.ts +29 -0
- package/dist/eval/slope.js +46 -0
- package/dist/eval/slope.js.map +1 -0
- package/dist/eval/train-sequence.d.ts +35 -0
- package/dist/eval/train-sequence.js +59 -0
- package/dist/eval/train-sequence.js.map +1 -0
- package/dist/eval/wilson.d.ts +45 -0
- package/dist/eval/wilson.js +48 -0
- package/dist/eval/wilson.js.map +1 -0
- package/dist/events/types.d.ts +1 -1
- package/dist/events/types.js +1 -1
- package/dist/events/types.js.map +1 -1
- package/dist/harnesses/auth-source.d.ts +51 -0
- package/dist/harnesses/auth-source.js +155 -0
- package/dist/harnesses/auth-source.js.map +1 -0
- package/dist/harnesses/engine/canonical-json.js +5 -3
- package/dist/harnesses/engine/canonical-json.js.map +1 -1
- package/dist/harnesses/engine/engine.d.ts +32 -0
- package/dist/harnesses/engine/engine.js +76 -9
- package/dist/harnesses/engine/engine.js.map +1 -1
- package/dist/harnesses/engine/packaging.js +5 -5
- package/dist/harnesses/engine/packaging.js.map +1 -1
- package/dist/harnesses/engine/persistence.d.ts +17 -0
- package/dist/harnesses/engine/persistence.js +28 -0
- package/dist/harnesses/engine/persistence.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +1 -1
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js +1 -1
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/adapter.d.ts +2 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js +8 -5
- package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +1 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js +6 -1
- package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/harness.d.ts +25 -3
- package/dist/harnesses/impls/hermes-agent/harness.js +89 -5
- package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
- package/dist/harnesses/impls/index.d.ts +2 -0
- package/dist/harnesses/impls/index.js +10 -1
- package/dist/harnesses/impls/index.js.map +1 -1
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.d.ts +34 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js +111 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.d.ts +24 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js +19 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.d.ts +64 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.js +125 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.d.ts +32 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.js +73 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.js.map +1 -0
- package/dist/harnesses/impls/learner/adapters/claude-code.js +5 -0
- package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
- package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +8 -0
- package/dist/harnesses/impls/learner/adapters/codex-code.js +91 -11
- package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
- package/dist/harnesses/impls/learner/harness.d.ts +29 -1
- package/dist/harnesses/impls/learner/harness.js +85 -1
- package/dist/harnesses/impls/learner/harness.js.map +1 -1
- package/dist/harnesses/impls/learner/harvest.d.ts +2 -0
- package/dist/harnesses/impls/learner/harvest.js +51 -1
- package/dist/harnesses/impls/learner/harvest.js.map +1 -1
- package/dist/harnesses/impls/learner/plugin-path.js +1 -0
- package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
- package/dist/harnesses/impls/stub.d.ts +2 -2
- package/dist/harnesses/impls/stub.js +2 -2
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +3 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +2 -2
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +3 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
- package/dist/harnesses/readiness-registry.d.ts +16 -0
- package/dist/harnesses/readiness-registry.js +28 -6
- package/dist/harnesses/readiness-registry.js.map +1 -1
- package/dist/harnesses/types.d.ts +26 -0
- package/dist/learner/revert-decision.d.ts +16 -1
- package/dist/learner/revert-decision.js +38 -18
- package/dist/learner/revert-decision.js.map +1 -1
- package/dist/learner/revert-stats.d.ts +14 -0
- package/dist/learner/revert-stats.js +42 -0
- package/dist/learner/revert-stats.js.map +1 -1
- package/dist/local-provider-url.d.ts +3 -0
- package/dist/local-provider-url.js +28 -0
- package/dist/local-provider-url.js.map +1 -0
- package/dist/main.js +125 -120
- package/dist/main.js.map +1 -1
- package/dist/mcp/acquire-artifact.d.ts +3 -3
- package/dist/mcp/acquire-artifact.js +3 -3
- package/dist/mcp/operator-server.js +1 -1
- package/dist/mcp/operator-server.js.map +1 -1
- package/dist/mcp/server.js +5 -6
- package/dist/mcp/server.js.map +1 -1
- package/dist/observability/emit-event.d.ts +1 -1
- package/dist/observability/emit-event.js +0 -4
- package/dist/observability/emit-event.js.map +1 -1
- package/dist/plugins/learner/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/learner/.codex-plugin/plugin.json +1 -1
- package/dist/plugins/learner/hooks/session-start +30 -1
- package/dist/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
- package/dist/preflight/deployment-readiness.d.ts +127 -0
- package/dist/preflight/deployment-readiness.js +308 -0
- package/dist/preflight/deployment-readiness.js.map +1 -0
- package/dist/preflight/pidfile-liveness.d.ts +7 -1
- package/dist/preflight/pidfile-liveness.js +14 -0
- package/dist/preflight/pidfile-liveness.js.map +1 -1
- package/dist/rpc/transport.d.ts +43 -5
- package/dist/rpc/transport.js +131 -30
- package/dist/rpc/transport.js.map +1 -1
- package/dist/scripts/swe-rebench-v2-seed-pool.json +2 -1
- package/dist/solver-nets/registry.d.ts +19 -0
- package/dist/solver-nets/registry.js +95 -66
- package/dist/solver-nets/registry.js.map +1 -1
- package/dist/solver-types/_jinn-repo-pool.d.ts +27 -0
- package/dist/solver-types/_jinn-repo-pool.js +27 -0
- package/dist/solver-types/_jinn-repo-pool.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.d.ts +76 -0
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.js +156 -0
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.d.ts +81 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.js +116 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-state.d.ts +9 -0
- package/dist/solver-types/_swe-rebench-v2-state.js +14 -0
- package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +30 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js +40 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
- package/dist/solver-types/index.js +2 -0
- package/dist/solver-types/index.js.map +1 -1
- package/dist/solver-types/jinn-repo-admit.d.ts +17 -0
- package/dist/solver-types/jinn-repo-admit.js +16 -0
- package/dist/solver-types/jinn-repo-admit.js.map +1 -0
- package/dist/solver-types/jinn-repo-auto.d.ts +60 -0
- package/dist/solver-types/jinn-repo-auto.js +163 -0
- package/dist/solver-types/jinn-repo-auto.js.map +1 -0
- package/dist/solver-types/jinn-repo-definition.d.ts +15 -0
- package/dist/solver-types/jinn-repo-definition.js +34 -0
- package/dist/solver-types/jinn-repo-definition.js.map +1 -0
- package/dist/solver-types/jinn-repo-extract.d.ts +16 -0
- package/dist/solver-types/jinn-repo-extract.js +32 -0
- package/dist/solver-types/jinn-repo-extract.js.map +1 -0
- package/dist/solver-types/jinn-repo.d.ts +21 -0
- package/dist/solver-types/jinn-repo.js +23 -0
- package/dist/solver-types/jinn-repo.js.map +1 -0
- package/dist/solver-types/learner-loop-test.js +1 -1
- package/dist/solver-types/learner-loop-test.js.map +1 -1
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v1.json +20 -0
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.json +19 -0
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.screening-report.json +628 -0
- package/dist/solver-types/solver-type.d.ts +8 -0
- package/dist/solver-types/swe-rebench-v2.d.ts +2 -0
- package/dist/solver-types/swe-rebench-v2.js +115 -10
- package/dist/solver-types/swe-rebench-v2.js.map +1 -1
- package/dist/solvernets/launched-record-dispatcher.d.ts +5 -0
- package/dist/solvernets/launched-record-dispatcher.js +8 -1
- package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
- package/dist/solvernets/registry-client-erc8004.js +29 -37
- package/dist/solvernets/registry-client-erc8004.js.map +1 -1
- package/dist/solvernets/registry-client.d.ts +6 -0
- package/dist/solvernets/store.d.ts +1 -1
- package/dist/solvernets/store.js +8 -3
- package/dist/solvernets/store.js.map +1 -1
- package/dist/spend/ai-units-config.d.ts +10 -0
- package/dist/spend/ai-units-config.js +7 -1
- package/dist/spend/ai-units-config.js.map +1 -1
- package/dist/spend/ai-units.d.ts +51 -0
- package/dist/spend/ai-units.js +73 -0
- package/dist/spend/ai-units.js.map +1 -1
- package/dist/spend/record.js +12 -5
- package/dist/spend/record.js.map +1 -1
- package/dist/spend/usage.js +39 -3
- package/dist/spend/usage.js.map +1 -1
- package/dist/store/store.d.ts +92 -5
- package/dist/store/store.js +184 -7
- package/dist/store/store.js.map +1 -1
- package/dist/trajectory/emit.d.ts +6 -0
- package/dist/trajectory/emit.js +9 -1
- package/dist/trajectory/emit.js.map +1 -1
- package/dist/trajectory/harness-bundle-schema.d.ts +1 -1
- package/dist/trajectory/harness-bundle-schema.js +1 -1
- package/dist/trajectory/harness-bundle-schema.js.map +1 -1
- package/dist/trajectory/schema.d.ts +1 -1
- package/dist/trajectory/schema.js +1 -1
- package/dist/trajectory/schema.js.map +1 -1
- package/dist/trajectory/scrub/build.d.ts +27 -0
- package/dist/trajectory/scrub/build.js +43 -0
- package/dist/trajectory/scrub/build.js.map +1 -0
- package/dist/trajectory/scrub/emit-scrub.d.ts +41 -0
- package/dist/trajectory/scrub/emit-scrub.js +88 -0
- package/dist/trajectory/scrub/emit-scrub.js.map +1 -0
- package/dist/trajectory/scrub/key-policy.d.ts +20 -0
- package/dist/trajectory/scrub/key-policy.js +43 -0
- package/dist/trajectory/scrub/key-policy.js.map +1 -0
- package/dist/trajectory/scrub/ml-pii-stage.d.ts +24 -0
- package/dist/trajectory/scrub/ml-pii-stage.js +43 -0
- package/dist/trajectory/scrub/ml-pii-stage.js.map +1 -0
- package/dist/trajectory/scrub/openredaction-stage.d.ts +14 -0
- package/dist/trajectory/scrub/openredaction-stage.js +36 -0
- package/dist/trajectory/scrub/openredaction-stage.js.map +1 -0
- package/dist/trajectory/scrub/pii-build.d.ts +31 -0
- package/dist/trajectory/scrub/pii-build.js +64 -0
- package/dist/trajectory/scrub/pii-build.js.map +1 -0
- package/dist/trajectory/scrub/pipeline.d.ts +16 -0
- package/dist/trajectory/scrub/pipeline.js +26 -0
- package/dist/trajectory/scrub/pipeline.js.map +1 -0
- package/dist/trajectory/scrub/secretlint-stage.d.ts +13 -0
- package/dist/trajectory/scrub/secretlint-stage.js +121 -0
- package/dist/trajectory/scrub/secretlint-stage.js.map +1 -0
- package/dist/trajectory/scrub/transformers-detector.d.ts +35 -0
- package/dist/trajectory/scrub/transformers-detector.js +68 -0
- package/dist/trajectory/scrub/transformers-detector.js.map +1 -0
- package/dist/trajectory/scrub/types.d.ts +25 -0
- package/dist/trajectory/scrub/types.js +2 -0
- package/dist/trajectory/scrub/types.js.map +1 -0
- package/dist/trajectory/transcript-parsers/types.d.ts +1 -1
- package/dist/trajectory/transcript-parsers/types.js +1 -1
- package/dist/trajectory/transcript-parsers/types.js.map +1 -1
- package/dist/tx-retry.d.ts +12 -0
- package/dist/tx-retry.js +41 -12
- package/dist/tx-retry.js.map +1 -1
- package/dist/types/envelope.d.ts +1 -1
- package/dist/types/envelope.js +1 -1
- package/dist/types/envelope.js.map +1 -1
- package/dist/types/payloads/index.d.ts +1 -1
- package/dist/types/payloads/index.js +7 -1
- package/dist/types/payloads/index.js.map +1 -1
- package/dist/types/payloads/portfolio-v0.d.ts +1 -1
- package/dist/types/payloads/portfolio-v0.js +1 -1
- package/dist/types/payloads/portfolio-v0.js.map +1 -1
- package/dist/types/payloads/prediction-apy-v0.d.ts +1 -1
- package/dist/types/payloads/prediction-apy-v0.js +1 -1
- package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
- package/dist/types/payloads/prediction-v0.d.ts +1 -1
- package/dist/types/payloads/prediction-v0.js +1 -1
- package/dist/types/payloads/prediction-v0.js.map +1 -1
- package/dist/types/portfolio.d.ts +1 -1
- package/dist/types/portfolio.js +1 -1
- package/dist/types/portfolio.js.map +1 -1
- package/dist/types/prediction-apy.d.ts +1 -1
- package/dist/types/prediction-apy.js +1 -1
- package/dist/types/prediction-apy.js.map +1 -1
- package/dist/types/prediction.d.ts +1 -1
- package/dist/types/prediction.js +1 -1
- package/dist/types/prediction.js.map +1 -1
- package/dist/types/session-provenance.d.ts +1 -1
- package/dist/types/session-provenance.js +1 -1
- package/dist/types/session-provenance.js.map +1 -1
- package/dist/types/task-document.d.ts +315 -1
- package/dist/types/task-document.js +9 -1
- package/dist/types/task-document.js.map +1 -1
- package/dist/types/task.d.ts +29 -1
- package/dist/types/task.js +1 -1
- package/dist/types/task.js.map +1 -1
- package/dist/types/window.d.ts +1 -1
- package/dist/types/window.js +1 -1
- package/dist/types/window.js.map +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/checkpoint.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/checkpoint.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/contracts.d.ts +3 -2
- package/dist/vendor/@jinn-network/sdk/dist/contracts.js +49 -0
- package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.d.ts +44 -0
- package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.js +25 -0
- package/dist/vendor/@jinn-network/sdk/dist/json-schema.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/json-schema.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.d.ts +38 -0
- package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.js +22 -0
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +109 -2
- package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +26 -2
- package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.d.ts +4 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.js +2 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.d.ts +65 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.js +123 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.d.ts +2 -2
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.js +1 -1
- package/dist/vendor/@jinn-network/sdk/package.json +9 -1
- package/docker-compose.yml +3 -2
- package/package.json +36 -26
- package/plugins/jinn-repo-runtime/.claude-plugin/plugin.json +5 -0
- package/plugins/jinn-repo-runtime/.codex-plugin/plugin.json +39 -0
- package/plugins/jinn-repo-runtime/README.md +27 -0
- package/plugins/jinn-repo-runtime/hooks/hooks.json +16 -0
- package/plugins/jinn-repo-runtime/hooks/session-start +73 -0
- package/plugins/jinn-repo-runtime/jinn.plugin.json +11 -0
- package/plugins/jinn-repo-runtime/skills/task/SKILL.md +92 -0
- package/plugins/learner/.claude-plugin/plugin.json +1 -1
- package/plugins/learner/.codex-plugin/plugin.json +1 -1
- package/plugins/learner/hooks/session-start +30 -1
- package/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
- package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
- package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
- package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +0 -55
- package/deployments/deployment-jinn-mvi-l1-sepolia.json +0 -55
- package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +0 -13
- package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +0 -15
- package/dist/daemon/jinn-claim-loop-canonical.d.ts +0 -207
- package/dist/daemon/jinn-claim-loop-canonical.js +0 -296
- package/dist/daemon/jinn-claim-loop-canonical.js.map +0 -1
- package/dist/daemon/jinn-claim-loop-mock.d.ts +0 -61
- package/dist/daemon/jinn-claim-loop-mock.js +0 -122
- package/dist/daemon/jinn-claim-loop-mock.js.map +0 -1
- package/dist/daemon/jinn-claim-loop-wiring.d.ts +0 -33
- package/dist/daemon/jinn-claim-loop-wiring.js +0 -40
- package/dist/daemon/jinn-claim-loop-wiring.js.map +0 -1
- package/dist/daemon/jinn-claim-loop.d.ts +0 -130
- package/dist/daemon/jinn-claim-loop.js +0 -328
- package/dist/daemon/jinn-claim-loop.js.map +0 -1
- package/dist/dashboard/assets/index-CzKxvMcU.css +0 -32
- package/dist/dashboard/assets/index-yVemxHot.js +0 -351
- package/dist/earning/jinn-rewards.js.map +0 -1
- package/dist/scripts/donation-consumption-acceptance.d.ts +0 -85
- package/dist/scripts/donation-consumption-acceptance.js +0 -1382
- package/dist/scripts/donation-consumption-acceptance.js.map +0 -1
- package/dist/x402/acquire.d.ts +0 -17
- package/dist/x402/acquire.js +0 -49
- package/dist/x402/acquire.js.map +0 -1
- package/dist/x402/facilitator.d.ts +0 -11
- package/dist/x402/facilitator.js +0 -52
- package/dist/x402/facilitator.js.map +0 -1
- package/dist/x402/handler.d.ts +0 -27
- package/dist/x402/handler.js +0 -236
- package/dist/x402/handler.js.map +0 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hot-apply a SolverNet join to the RUNNING daemon (#1037).
|
|
3
|
+
*
|
|
4
|
+
* Four subsystems consume `joinedSolverNets`. Two re-read their config object
|
|
5
|
+
* live (the MechAdapter task-discovery cid array and the engine's
|
|
6
|
+
* JoinedSolverNetsView); two are frozen at construction (the
|
|
7
|
+
* HarnessReadinessRegistry cid→harness map and the SolverNetRegistry). This
|
|
8
|
+
* applier mutates all four on the live instances so a join applied to a
|
|
9
|
+
* running daemon takes effect within one claim poll — no restart.
|
|
10
|
+
*
|
|
11
|
+
* Wired in main.ts via `joinApplierHolder` (eager-register/late-populate,
|
|
12
|
+
* mirroring harnessReadinessRegistryHolder). The join endpoint
|
|
13
|
+
* (POST /v1/operator/join/:cid) calls it after writing config to disk.
|
|
14
|
+
*/
|
|
15
|
+
import { registerJoinedNet, } from '../solver-nets/registry.js';
|
|
16
|
+
export function createJoinApplier(deps) {
|
|
17
|
+
return async (entry) => {
|
|
18
|
+
const cid = entry.manifestCid;
|
|
19
|
+
// (a) task-discovery cid set — solver role only (mirrors main.ts), deduped
|
|
20
|
+
// so a re-apply does not double-push.
|
|
21
|
+
if (entry.roles.includes('solver') && !deps.taskDiscovery.solverNetManifestCids.includes(cid)) {
|
|
22
|
+
deps.taskDiscovery.solverNetManifestCids.push(cid);
|
|
23
|
+
}
|
|
24
|
+
// (b) engine eligibility view.
|
|
25
|
+
deps.view.set(cid, { roles: entry.roles });
|
|
26
|
+
// (c) readiness gate map — mirror boot's buildHarnessReadinessRegistry
|
|
27
|
+
// (main.ts), which adds an entry whenever `entry.harness` is truthy,
|
|
28
|
+
// role-agnostic. The endpoint persists `harness` for evaluator-only joins
|
|
29
|
+
// too, so gating this on the solver role made the live map diverge from the
|
|
30
|
+
// post-restart map and silently blocked evaluator-only claims.
|
|
31
|
+
if (entry.harness) {
|
|
32
|
+
await deps.readiness.setJoined(cid, { harnessName: entry.harness, roles: entry.roles });
|
|
33
|
+
}
|
|
34
|
+
// (d) SolverNet registry — shared boot/live registration (Task 1).
|
|
35
|
+
// Clear any prior registration under this net's name first so a re-join
|
|
36
|
+
// updates in place rather than inserting a phantom `name#2` duplicate
|
|
37
|
+
// (registerJoinedNet → register is non-idempotent by name). Boot rebuilds
|
|
38
|
+
// from scratch and never re-applies, so this only affects the live path.
|
|
39
|
+
deps.registry.unregister(entry.name ?? cid);
|
|
40
|
+
await registerJoinedNet(deps.registry, cid, entry);
|
|
41
|
+
// Keep the in-memory config consistent so launcher read-callbacks and any
|
|
42
|
+
// in-process re-read see the new entry. The on-disk write is owned by the
|
|
43
|
+
// join endpoint.
|
|
44
|
+
if (!deps.config.joinedSolverNets)
|
|
45
|
+
deps.config.joinedSolverNets = {};
|
|
46
|
+
deps.config.joinedSolverNets[cid] = entry;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=join-applier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-applier.js","sourceRoot":"","sources":["../../src/daemon/join-applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAEL,iBAAiB,GAElB,MAAM,4BAA4B,CAAC;AAiBpC,MAAM,UAAU,iBAAiB,CAAC,IAAqB;IACrD,OAAO,KAAK,EAAE,KAA4B,EAAiB,EAAE;QAC3D,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC;QAE9B,2EAA2E;QAC3E,sCAAsC;QACtC,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9F,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAE3C,uEAAuE;QACvE,qEAAqE;QACrE,0EAA0E;QAC1E,4EAA4E;QAC5E,+DAA+D;QAC/D,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1F,CAAC;QAED,mEAAmE;QACnE,wEAAwE;QACxE,sEAAsE;QACtE,0EAA0E;QAC1E,yEAAyE;QACzE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;QAC5C,MAAM,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAEnD,0EAA0E;QAC1E,0EAA0E;QAC1E,iBAAiB;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,EAAE,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loop heartbeat helper (#1043, follow-up to the #1038 wedge).
|
|
3
|
+
*
|
|
4
|
+
* Each long-running daemon loop records a standardized "last tick" heartbeat at
|
|
5
|
+
* the end of every iteration. The watchdog (watchdog-loop.ts) reads these rows
|
|
6
|
+
* to detect a loop whose last tick has gone stale (frozen mid-iteration / RPC
|
|
7
|
+
* wedge). The heartbeat is a NEW namespaced config row written ALONGSIDE the
|
|
8
|
+
* pre-existing `last_*_tick_at` rows (which other surfaces — e.g.
|
|
9
|
+
* gather-status.ts — already read); nothing here renames or replaces those.
|
|
10
|
+
*
|
|
11
|
+
* The stored value is `Date.now()` (wall-clock ms) as a string, so the watchdog
|
|
12
|
+
* can compute staleness with a single subtraction and no Date parsing.
|
|
13
|
+
*/
|
|
14
|
+
import type { Store } from '../store/store.js';
|
|
15
|
+
/** Config-key namespace for per-loop heartbeats. */
|
|
16
|
+
export declare const LOOP_HEARTBEAT_PREFIX = "loop_heartbeat:";
|
|
17
|
+
/**
|
|
18
|
+
* The eight canonical long-running loops the watchdog supervises. The two
|
|
19
|
+
* for-await adapter loops (engine-watcher, delivery-watcher) heartbeat at the
|
|
20
|
+
* poll-cycle tail so an idle-but-polling loop never looks stale. The
|
|
21
|
+
* eviction/checkpoint loops use FleetStateStore (not this observability Store)
|
|
22
|
+
* and are deliberately NOT in this set.
|
|
23
|
+
*/
|
|
24
|
+
export declare const LOOP_NAMES: readonly ["creator", "engine-tick", "engine-watcher", "delivery-watcher", "reward-claim", "balance-topup", "peer-sync"];
|
|
25
|
+
export type LoopName = (typeof LOOP_NAMES)[number];
|
|
26
|
+
/** The config-row key for a given loop's heartbeat. */
|
|
27
|
+
export declare function loopHeartbeatKey(name: LoopName): string;
|
|
28
|
+
/** Stamp the loop's heartbeat with the current wall-clock ms. */
|
|
29
|
+
export declare function recordLoopTick(store: Store, name: LoopName): void;
|
|
30
|
+
/**
|
|
31
|
+
* Read a loop's last heartbeat as wall-clock ms, or `null` if it has never
|
|
32
|
+
* ticked or the stored value is not a finite number.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getLoopTick(store: Store, name: LoopName): number | null;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Config-key namespace for per-loop heartbeats. */
|
|
2
|
+
export const LOOP_HEARTBEAT_PREFIX = 'loop_heartbeat:';
|
|
3
|
+
/**
|
|
4
|
+
* The eight canonical long-running loops the watchdog supervises. The two
|
|
5
|
+
* for-await adapter loops (engine-watcher, delivery-watcher) heartbeat at the
|
|
6
|
+
* poll-cycle tail so an idle-but-polling loop never looks stale. The
|
|
7
|
+
* eviction/checkpoint loops use FleetStateStore (not this observability Store)
|
|
8
|
+
* and are deliberately NOT in this set.
|
|
9
|
+
*/
|
|
10
|
+
export const LOOP_NAMES = [
|
|
11
|
+
'creator',
|
|
12
|
+
'engine-tick',
|
|
13
|
+
'engine-watcher',
|
|
14
|
+
'delivery-watcher',
|
|
15
|
+
'reward-claim',
|
|
16
|
+
'balance-topup',
|
|
17
|
+
'peer-sync',
|
|
18
|
+
];
|
|
19
|
+
/** The config-row key for a given loop's heartbeat. */
|
|
20
|
+
export function loopHeartbeatKey(name) {
|
|
21
|
+
return `${LOOP_HEARTBEAT_PREFIX}${name}`;
|
|
22
|
+
}
|
|
23
|
+
/** Stamp the loop's heartbeat with the current wall-clock ms. */
|
|
24
|
+
export function recordLoopTick(store, name) {
|
|
25
|
+
store.setConfigValue(loopHeartbeatKey(name), Date.now().toString());
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Read a loop's last heartbeat as wall-clock ms, or `null` if it has never
|
|
29
|
+
* ticked or the stored value is not a finite number.
|
|
30
|
+
*/
|
|
31
|
+
export function getLoopTick(store, name) {
|
|
32
|
+
const raw = store.getConfigValue(loopHeartbeatKey(name));
|
|
33
|
+
if (raw === null)
|
|
34
|
+
return null;
|
|
35
|
+
const ms = Number(raw);
|
|
36
|
+
return Number.isFinite(ms) ? ms : null;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=loop-heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-heartbeat.js","sourceRoot":"","sources":["../../src/daemon/loop-heartbeat.ts"],"names":[],"mappings":"AAeA,oDAAoD;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,SAAS;IACT,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;IACd,eAAe;IACf,WAAW;CACH,CAAC;AAIX,uDAAuD;AACvD,MAAM,UAAU,gBAAgB,CAAC,IAAc;IAC7C,OAAO,GAAG,qBAAqB,GAAG,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,IAAc;IACzD,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,IAAc;IACtD,MAAM,GAAG,GAAG,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC"}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { listStolasClaimTargets, tickStolasDistributorClaims, } from '../earning/stolas-claim.js';
|
|
10
10
|
import { emitEvent } from '../observability/emit-event.js';
|
|
11
11
|
import { displayFleetServiceIndex } from '../earning/fleet-display-index.js';
|
|
12
|
+
import { recordLoopTick } from './loop-heartbeat.js';
|
|
12
13
|
export async function runRewardClaimOnce(cfg) {
|
|
13
14
|
const state = await cfg.store.load(cfg.chain);
|
|
14
15
|
const targets = listStolasClaimTargets(state.services);
|
|
@@ -75,7 +76,7 @@ export class RewardClaimLoop {
|
|
|
75
76
|
await this.runOnce();
|
|
76
77
|
}
|
|
77
78
|
catch (err) {
|
|
78
|
-
console.
|
|
79
|
+
console.debug('[reward-claim] Tick failed (non-fatal):', err instanceof Error ? err.message : err);
|
|
79
80
|
this.config.jinnStore && emitEvent(this.config.jinnStore, {
|
|
80
81
|
kind: 'tick_error',
|
|
81
82
|
outcome: 'failed',
|
|
@@ -83,6 +84,8 @@ export class RewardClaimLoop {
|
|
|
83
84
|
}, 'reward-claim');
|
|
84
85
|
}
|
|
85
86
|
this.config.jinnStore?.setConfigValue('last_reward_claim_tick_at', new Date().toISOString());
|
|
87
|
+
if (this.config.jinnStore)
|
|
88
|
+
recordLoopTick(this.config.jinnStore, 'reward-claim'); // #1043 loop watchdog
|
|
86
89
|
await new Promise(r => setTimeout(r, this.config.intervalMs));
|
|
87
90
|
}
|
|
88
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reward-claim-loop.js","sourceRoot":"","sources":["../../src/daemon/reward-claim-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EACL,sBAAsB,EACtB,2BAA2B,GAE5B,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"reward-claim-loop.js","sourceRoot":"","sources":["../../src/daemon/reward-claim-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,7 +49,7 @@ export declare class SkipLogDeduper {
|
|
|
49
49
|
*
|
|
50
50
|
* `now` is injectable for deterministic tests; defaults to `Date.now()`.
|
|
51
51
|
*/
|
|
52
|
-
recordSkip(taskId: string, reason: string, now?: number):
|
|
52
|
+
recordSkip(taskId: string, reason: string, now?: number): boolean;
|
|
53
53
|
/**
|
|
54
54
|
* Returns true when this `(taskId, reason)` pair has not been logged yet
|
|
55
55
|
* (or the previous reason for this `taskId` was different). Returns false
|
|
@@ -58,6 +58,8 @@ export class SkipLogDeduper {
|
|
|
58
58
|
* `now` is injectable for deterministic tests; defaults to `Date.now()`.
|
|
59
59
|
*/
|
|
60
60
|
recordSkip(taskId, reason, now = Date.now()) {
|
|
61
|
+
const previous = this.entriesByTaskId.get(taskId);
|
|
62
|
+
const shouldLog = previous?.reason !== reason;
|
|
61
63
|
// Delete-then-set so the entry moves to the end of insertion order, keeping
|
|
62
64
|
// actively-skipped tasks away from the FIFO eviction front.
|
|
63
65
|
this.entriesByTaskId.delete(taskId);
|
|
@@ -69,6 +71,7 @@ export class SkipLogDeduper {
|
|
|
69
71
|
this.entriesByTaskId.delete(oldestKey);
|
|
70
72
|
}
|
|
71
73
|
}
|
|
74
|
+
return shouldLog;
|
|
72
75
|
}
|
|
73
76
|
/**
|
|
74
77
|
* Returns true when this `(taskId, reason)` pair has not been logged yet
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skip-log-dedup.js","sourceRoot":"","sources":["../../src/daemon/skip-log-dedup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAS1C,MAAM,OAAO,cAAc;IACjB,eAAe,GAAG,IAAI,GAAG,EAAqB,CAAC;IACtC,UAAU,CAAS;IACnB,YAAY,CAAS;IAEtC,YAAY,UAAU,GAAG,IAAI,EAAE,YAAY,GAAG,mBAAmB;QAC/D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;OAOG;IACH,aAAa,CAAC,MAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,MAAc,EAAE,MAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACjE,4EAA4E;QAC5E,4DAA4D;QAC5D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChD,4DAA4D;YAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC3D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;
|
|
1
|
+
{"version":3,"file":"skip-log-dedup.js","sourceRoot":"","sources":["../../src/daemon/skip-log-dedup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAS1C,MAAM,OAAO,cAAc;IACjB,eAAe,GAAG,IAAI,GAAG,EAAqB,CAAC;IACtC,UAAU,CAAS;IACnB,YAAY,CAAS;IAEtC,YAAY,UAAU,GAAG,IAAI,EAAE,YAAY,GAAG,mBAAmB;QAC/D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;OAOG;IACH,aAAa,CAAC,MAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,MAAc,EAAE,MAAc,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;QAC9C,4EAA4E;QAC5E,4DAA4D;QAC5D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChD,4DAA4D;YAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC3D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,CAAC,MAAc,EAAE,MAAc;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YAChC,uEAAuE;YACvE,0EAA0E;YAC1E,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,mEAAmE;QACnE,0EAA0E;QAC1E,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loop watchdog supervisor (#1043, follow-up to the #1038 4.5h RPC wedge).
|
|
3
|
+
*
|
|
4
|
+
* A synchronous, network-free loop. On each tick it reads every registered
|
|
5
|
+
* loop's heartbeat (loop-heartbeat.ts → getLoopTick) and compares its age
|
|
6
|
+
* against a per-loop threshold. When a loop is stale it ALWAYS loud-logs and
|
|
7
|
+
* emits a structured `loop_watchdog_stale` event; the process-exit recovery is
|
|
8
|
+
* separately gated behind `autoRestart` (default OFF — the locked Option A
|
|
9
|
+
* decision). v1 therefore always *detects + surfaces*; the non-zero exit is
|
|
10
|
+
* opt-in.
|
|
11
|
+
*
|
|
12
|
+
* IDEMPOTENCY (AC#3, the anchor for "designed, not assumed"): the only
|
|
13
|
+
* recovery action is a non-zero `process.exit`. There is NO new mid-flight
|
|
14
|
+
* re-execution path inside any loop. Recovery flows entirely through the
|
|
15
|
+
* EXISTING idempotent boot path:
|
|
16
|
+
*
|
|
17
|
+
* process.exit(WATCHDOG_EXIT_CODE)
|
|
18
|
+
* → Railway restartPolicyType="ON_FAILURE", maxRetries=10
|
|
19
|
+
* (deploy/railway-*-operator/railway.toml)
|
|
20
|
+
* → fresh process boots, recoverInFlight() re-drives in-flight tasks
|
|
21
|
+
* (TaskEngine.recoverInFlight) and the stale-pidfile path clears a dead
|
|
22
|
+
* lock (src/preflight/pidfile-liveness.ts) — both already idempotent.
|
|
23
|
+
*
|
|
24
|
+
* So restarting a wedged daemon cannot double-claim, double-deliver, or
|
|
25
|
+
* double-pay: it re-enters the same boot reconciliation a crash would.
|
|
26
|
+
*/
|
|
27
|
+
import type { Store } from '../store/store.js';
|
|
28
|
+
import { type LoopName } from './loop-heartbeat.js';
|
|
29
|
+
/**
|
|
30
|
+
* Non-zero exit code the watchdog uses for its auto-restart. Distinct from
|
|
31
|
+
* main.ts's graceful `process.exit(0)` so Railway's ON_FAILURE policy treats a
|
|
32
|
+
* watchdog restart as a failure (and a clean operator-requested stop as not).
|
|
33
|
+
*/
|
|
34
|
+
export declare const WATCHDOG_EXIT_CODE = 13;
|
|
35
|
+
export interface WatchdogLoopRegistration {
|
|
36
|
+
/** Loop heartbeat name. */
|
|
37
|
+
name: LoopName;
|
|
38
|
+
/** The loop's nominal iteration interval (ms). */
|
|
39
|
+
intervalMs: number;
|
|
40
|
+
/**
|
|
41
|
+
* Optional floor (ms) for the staleness threshold. The for-await adapter
|
|
42
|
+
* loops set this generously (~5 min) because a single RPC wedge can stall a
|
|
43
|
+
* poll far longer than `stalenessFactor * pollIntervalMs`.
|
|
44
|
+
*/
|
|
45
|
+
floorMs?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface WatchdogLoopConfig {
|
|
48
|
+
store: Store;
|
|
49
|
+
loops: WatchdogLoopRegistration[];
|
|
50
|
+
/** Stale when age > stalenessFactor * intervalMs (floored by floorMs). */
|
|
51
|
+
stalenessFactor?: number;
|
|
52
|
+
/** How often the watchdog itself ticks (ms). */
|
|
53
|
+
checkIntervalMs?: number;
|
|
54
|
+
/** When true, a stale loop triggers onStale (the process-exit recovery). */
|
|
55
|
+
autoRestart?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Recovery action invoked once per stale episode when autoRestart is on.
|
|
58
|
+
* Optional — defaults to the production process-exit handler. Tests inject a
|
|
59
|
+
* spy. Kept off DaemonConfig so the config surface stays free of functions.
|
|
60
|
+
*/
|
|
61
|
+
onStale?: (name: string) => void;
|
|
62
|
+
/** Gate: the watchdog only checks while this returns true (running, not draining). */
|
|
63
|
+
isActive: () => boolean;
|
|
64
|
+
/** Clock seam for tests. Defaults to Date.now. */
|
|
65
|
+
now?: () => number;
|
|
66
|
+
}
|
|
67
|
+
export declare class WatchdogLoop {
|
|
68
|
+
private readonly config;
|
|
69
|
+
private stopped;
|
|
70
|
+
private stopResolve?;
|
|
71
|
+
private readonly stopPromise;
|
|
72
|
+
private readonly stalenessFactor;
|
|
73
|
+
private readonly checkIntervalMs;
|
|
74
|
+
private readonly autoRestart;
|
|
75
|
+
private readonly onStale;
|
|
76
|
+
private readonly now;
|
|
77
|
+
/** Loops currently in a reported-stale episode (fire-once gate). */
|
|
78
|
+
private readonly reportedStale;
|
|
79
|
+
constructor(config: WatchdogLoopConfig);
|
|
80
|
+
run(): Promise<void>;
|
|
81
|
+
stop(): void;
|
|
82
|
+
/** One supervision pass. Synchronous + network-free. */
|
|
83
|
+
check(): void;
|
|
84
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { getLoopTick } from './loop-heartbeat.js';
|
|
2
|
+
import { emitStructured } from '../events/emitter.js';
|
|
3
|
+
/**
|
|
4
|
+
* Non-zero exit code the watchdog uses for its auto-restart. Distinct from
|
|
5
|
+
* main.ts's graceful `process.exit(0)` so Railway's ON_FAILURE policy treats a
|
|
6
|
+
* watchdog restart as a failure (and a clean operator-requested stop as not).
|
|
7
|
+
*/
|
|
8
|
+
export const WATCHDOG_EXIT_CODE = 13;
|
|
9
|
+
/** Default recovery: loud-log then non-zero exit (Railway restarts us). */
|
|
10
|
+
function defaultOnStale(name) {
|
|
11
|
+
console.error(`[watchdog] auto-restarting via non-zero exit (loop=${name}, code=${WATCHDOG_EXIT_CODE})`);
|
|
12
|
+
process.exit(WATCHDOG_EXIT_CODE);
|
|
13
|
+
}
|
|
14
|
+
export class WatchdogLoop {
|
|
15
|
+
config;
|
|
16
|
+
stopped = false;
|
|
17
|
+
stopResolve;
|
|
18
|
+
stopPromise;
|
|
19
|
+
stalenessFactor;
|
|
20
|
+
checkIntervalMs;
|
|
21
|
+
autoRestart;
|
|
22
|
+
onStale;
|
|
23
|
+
now;
|
|
24
|
+
/** Loops currently in a reported-stale episode (fire-once gate). */
|
|
25
|
+
reportedStale = new Set();
|
|
26
|
+
constructor(config) {
|
|
27
|
+
this.config = config;
|
|
28
|
+
this.stalenessFactor = config.stalenessFactor ?? 6;
|
|
29
|
+
this.checkIntervalMs = config.checkIntervalMs ?? 30_000;
|
|
30
|
+
this.autoRestart = config.autoRestart ?? false;
|
|
31
|
+
this.onStale = config.onStale ?? defaultOnStale;
|
|
32
|
+
this.now = config.now ?? (() => Date.now());
|
|
33
|
+
this.stopPromise = new Promise((resolve) => {
|
|
34
|
+
this.stopResolve = resolve;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async run() {
|
|
38
|
+
while (!this.stopped) {
|
|
39
|
+
if (this.config.isActive()) {
|
|
40
|
+
this.check();
|
|
41
|
+
}
|
|
42
|
+
await Promise.race([
|
|
43
|
+
new Promise((r) => setTimeout(r, this.checkIntervalMs)),
|
|
44
|
+
this.stopPromise,
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
stop() {
|
|
49
|
+
this.stopped = true;
|
|
50
|
+
this.stopResolve?.();
|
|
51
|
+
}
|
|
52
|
+
/** One supervision pass. Synchronous + network-free. */
|
|
53
|
+
check() {
|
|
54
|
+
const now = this.now();
|
|
55
|
+
for (const reg of this.config.loops) {
|
|
56
|
+
const last = getLoopTick(this.config.store, reg.name);
|
|
57
|
+
if (last === null)
|
|
58
|
+
continue; // never ticked — nothing to judge yet
|
|
59
|
+
const threshold = Math.max(this.stalenessFactor * reg.intervalMs, reg.floorMs ?? 0);
|
|
60
|
+
const ageMs = now - last;
|
|
61
|
+
if (ageMs > threshold) {
|
|
62
|
+
// Fire-once per episode: skip if already reported and not yet recovered.
|
|
63
|
+
if (this.reportedStale.has(reg.name))
|
|
64
|
+
continue;
|
|
65
|
+
this.reportedStale.add(reg.name);
|
|
66
|
+
const message = `[watchdog] loop '${reg.name}' is stale: last tick ${ageMs}ms ago ` +
|
|
67
|
+
`(threshold ${threshold}ms)`;
|
|
68
|
+
console.error(message);
|
|
69
|
+
emitStructured({
|
|
70
|
+
kind: 'error',
|
|
71
|
+
message,
|
|
72
|
+
errorCode: 'loop_watchdog_stale',
|
|
73
|
+
details: {
|
|
74
|
+
loopName: reg.name,
|
|
75
|
+
lastTickAt: last,
|
|
76
|
+
ageMs,
|
|
77
|
+
thresholdMs: threshold,
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
if (this.autoRestart) {
|
|
81
|
+
this.onStale(reg.name);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Heartbeat advanced back under threshold → re-arm for next episode.
|
|
86
|
+
this.reportedStale.delete(reg.name);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=watchdog-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watchdog-loop.js","sourceRoot":"","sources":["../../src/daemon/watchdog-loop.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,2EAA2E;AAC3E,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,CAAC,KAAK,CACX,sDAAsD,IAAI,UAAU,kBAAkB,GAAG,CAC1F,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AACnC,CAAC;AAoCD,MAAM,OAAO,YAAY;IAYM;IAXrB,OAAO,GAAG,KAAK,CAAC;IAChB,WAAW,CAAc;IAChB,WAAW,CAAgB;IAC3B,eAAe,CAAS;IACxB,eAAe,CAAS;IACxB,WAAW,CAAU;IACrB,OAAO,CAAyB;IAChC,GAAG,CAAe;IACnC,oEAAoE;IACnD,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnD,YAA6B,MAA0B;QAA1B,WAAM,GAAN,MAAM,CAAoB;QACrD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,cAAc,CAAC;QAChD,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC/C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG;QACP,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;YACD,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBACvD,IAAI,CAAC,WAAW;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,wDAAwD;IACxD,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACtD,IAAI,IAAI,KAAK,IAAI;gBAAE,SAAS,CAAC,sCAAsC;YACnE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YACpF,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;YAEzB,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBACtB,yEAAyE;gBACzE,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC/C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEjC,MAAM,OAAO,GACX,oBAAoB,GAAG,CAAC,IAAI,yBAAyB,KAAK,SAAS;oBACnE,cAAc,SAAS,KAAK,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACvB,cAAc,CAAC;oBACb,IAAI,EAAE,OAAO;oBACb,OAAO;oBACP,SAAS,EAAE,qBAAqB;oBAChC,OAAO,EAAE;wBACP,QAAQ,EAAE,GAAG,CAAC,IAAI;wBAClB,UAAU,EAAE,IAAI;wBAChB,KAAK;wBACL,WAAW,EAAE,SAAS;qBACvB;iBACF,CAAC,CAAC;gBAEH,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,qEAAqE;gBACrE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|