@jinn-network/client 0.1.2 → 0.1.3-canary.262e5cda
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/CHANGELOG.md +20 -0
- package/CONTRIBUTING.md +8 -2
- package/README.md +38 -14
- package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +36 -0
- package/deployments/deployment-jinn-mvi-l1-sepolia.json +36 -0
- package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +12 -0
- package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +3 -3
- package/deployments/deployment-stolas-l2-baseSepolia-fast.json +1 -1
- package/dist/adapters/adapter.d.ts +2 -2
- package/dist/adapters/claim-registry/client.d.ts +9 -0
- package/dist/adapters/claim-registry/client.js +22 -2
- package/dist/adapters/claim-registry/client.js.map +1 -1
- package/dist/adapters/local/adapter.d.ts +2 -2
- package/dist/adapters/local/adapter.js +8 -8
- package/dist/adapters/local/adapter.js.map +1 -1
- package/dist/adapters/mech/adapter.d.ts +3 -4
- package/dist/adapters/mech/adapter.js +86 -50
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +6 -4
- package/dist/adapters/mech/contracts.js +118 -14
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/ipfs.d.ts +61 -6
- package/dist/adapters/mech/ipfs.js +159 -26
- package/dist/adapters/mech/ipfs.js.map +1 -1
- package/dist/adapters/mech/safe-revert.d.ts +39 -0
- package/dist/adapters/mech/safe-revert.js +130 -0
- package/dist/adapters/mech/safe-revert.js.map +1 -0
- package/dist/adapters/mech/safe.js +47 -21
- package/dist/adapters/mech/safe.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +8 -0
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/agent/agent-ws.d.ts +55 -0
- package/dist/agent/agent-ws.js +288 -0
- package/dist/agent/agent-ws.js.map +1 -0
- package/dist/agent/auto-mode-detect.d.ts +6 -0
- package/dist/agent/auto-mode-detect.js +44 -0
- package/dist/agent/auto-mode-detect.js.map +1 -0
- package/dist/agent/operator-claude.d.ts +22 -0
- package/dist/agent/operator-claude.js +130 -0
- package/dist/agent/operator-claude.js.map +1 -0
- package/dist/api/admin-endpoint.d.ts +12 -0
- package/dist/api/admin-endpoint.js +71 -0
- package/dist/api/admin-endpoint.js.map +1 -0
- package/dist/api/bootstrap-endpoint.d.ts +16 -0
- package/dist/api/bootstrap-endpoint.js +78 -0
- package/dist/api/bootstrap-endpoint.js.map +1 -0
- package/dist/api/events-endpoint.d.ts +9 -0
- package/dist/api/events-endpoint.js +46 -0
- package/dist/api/events-endpoint.js.map +1 -0
- package/dist/api/fleet-build.d.ts +1 -1
- package/dist/api/fleet-build.js +17 -8
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/gather-status.js +5 -1
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/handshake.d.ts +17 -0
- package/dist/api/handshake.js +28 -0
- package/dist/api/handshake.js.map +1 -0
- package/dist/api/peers.js +20 -5
- package/dist/api/peers.js.map +1 -1
- package/dist/api/portfolio-v0-build.d.ts +6 -0
- package/dist/api/portfolio-v0-build.js +6 -1
- package/dist/api/portfolio-v0-build.js.map +1 -1
- package/dist/api/rewards-build.js +3 -8
- package/dist/api/rewards-build.js.map +1 -1
- package/dist/api/server.d.ts +54 -0
- package/dist/api/server.js +239 -13
- package/dist/api/server.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +34 -0
- package/dist/api/setup-endpoints.js +188 -0
- package/dist/api/setup-endpoints.js.map +1 -0
- package/dist/api/status-build.d.ts +9 -1
- package/dist/api/status-build.js +44 -9
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/status-rollup-build.d.ts +46 -1
- package/dist/api/status-rollup-build.js +168 -5
- package/dist/api/status-rollup-build.js.map +1 -1
- package/dist/api/ui-token.d.ts +5 -0
- package/dist/api/ui-token.js +36 -0
- package/dist/api/ui-token.js.map +1 -0
- package/dist/build-info.d.ts +32 -0
- package/dist/build-info.js +69 -0
- package/dist/build-info.js.map +1 -0
- package/dist/build-info.json +6 -0
- package/dist/build-meta.json +1 -1
- package/dist/cli/command.d.ts +9 -0
- package/dist/cli/commands/balance.d.ts +7 -0
- package/dist/cli/commands/balance.js +38 -32
- package/dist/cli/commands/balance.js.map +1 -1
- package/dist/cli/commands/bootstrap.d.ts +13 -1
- package/dist/cli/commands/bootstrap.js +150 -132
- package/dist/cli/commands/bootstrap.js.map +1 -1
- package/dist/cli/commands/claim-rewards.js +14 -2
- package/dist/cli/commands/claim-rewards.js.map +1 -1
- package/dist/cli/commands/conformance.d.ts +12 -0
- package/dist/cli/commands/conformance.js +140 -0
- package/dist/cli/commands/conformance.js.map +1 -0
- package/dist/cli/commands/create.d.ts +36 -0
- package/dist/cli/commands/create.js +374 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +34 -1
- package/dist/cli/commands/doctor.js +136 -121
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/fleet-scale.d.ts +19 -1
- package/dist/cli/commands/fleet-scale.js +379 -361
- package/dist/cli/commands/fleet-scale.js.map +1 -1
- package/dist/cli/commands/fleet.d.ts +7 -0
- package/dist/cli/commands/fleet.js +39 -33
- package/dist/cli/commands/fleet.js.map +1 -1
- package/dist/cli/commands/fund-requirements.d.ts +14 -1
- package/dist/cli/commands/fund-requirements.js +183 -174
- package/dist/cli/commands/fund-requirements.js.map +1 -1
- package/dist/cli/commands/history.d.ts +10 -1
- package/dist/cli/commands/history.js +66 -57
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/impls.d.ts +18 -0
- package/dist/cli/commands/impls.js +208 -0
- package/dist/cli/commands/impls.js.map +1 -0
- package/dist/cli/commands/init.js +4 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/intents.js +13 -9
- package/dist/cli/commands/intents.js.map +1 -1
- package/dist/cli/commands/logs.d.ts +6 -1
- package/dist/cli/commands/logs.js +77 -70
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/migrate-agent-id.d.ts +26 -0
- package/dist/cli/commands/migrate-agent-id.js +165 -0
- package/dist/cli/commands/migrate-agent-id.js.map +1 -0
- package/dist/cli/commands/plug-ins.d.ts +34 -0
- package/dist/cli/commands/plug-ins.js +282 -0
- package/dist/cli/commands/plug-ins.js.map +1 -0
- package/dist/cli/commands/plugin-install.d.ts +10 -0
- package/dist/cli/commands/plugin-install.js +226 -14
- package/dist/cli/commands/plugin-install.js.map +1 -1
- package/dist/cli/commands/rewards.d.ts +7 -0
- package/dist/cli/commands/rewards.js +46 -40
- package/dist/cli/commands/rewards.js.map +1 -1
- package/dist/cli/commands/run.d.ts +14 -1
- package/dist/cli/commands/run.js +232 -90
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/status.d.ts +10 -0
- package/dist/cli/commands/status.js +97 -34
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/submit-intent.js +33 -6
- package/dist/cli/commands/submit-intent.js.map +1 -1
- package/dist/cli/commands/ui.js +45 -0
- package/dist/cli/commands/ui.js.map +1 -0
- package/dist/cli/commands/update.d.ts +5 -0
- package/dist/cli/commands/update.js +102 -97
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/version.js +3 -1
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/commands/withdraw.d.ts +21 -1
- package/dist/cli/commands/withdraw.js +175 -159
- package/dist/cli/commands/withdraw.js.map +1 -1
- package/dist/cli/execution-context.d.ts +1 -1
- package/dist/cli/execution-context.js +2 -1
- package/dist/cli/execution-context.js.map +1 -1
- package/dist/cli/help.js +7 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.js +18 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/intent-registry-access.d.ts +33 -1
- package/dist/cli/intent-registry-access.js +40 -2
- package/dist/cli/intent-registry-access.js.map +1 -1
- package/dist/cli/open-browser.d.ts +1 -0
- package/dist/cli/open-browser.js +18 -0
- package/dist/cli/open-browser.js.map +1 -0
- package/dist/cli/password.d.ts +3 -3
- package/dist/cli/password.js +5 -5
- package/dist/cli/password.js.map +1 -1
- package/dist/config.d.ts +883 -11
- package/dist/config.js +435 -4
- package/dist/config.js.map +1 -1
- package/dist/conformance/checks/artifacts.d.ts +37 -0
- package/dist/conformance/checks/artifacts.js +110 -0
- package/dist/conformance/checks/artifacts.js.map +1 -0
- package/dist/conformance/checks/envelope-schema.d.ts +17 -0
- package/dist/conformance/checks/envelope-schema.js +36 -0
- package/dist/conformance/checks/envelope-schema.js.map +1 -0
- package/dist/conformance/checks/hash-signature.d.ts +26 -0
- package/dist/conformance/checks/hash-signature.js +70 -0
- package/dist/conformance/checks/hash-signature.js.map +1 -0
- package/dist/conformance/checks/payload.d.ts +19 -0
- package/dist/conformance/checks/payload.js +52 -0
- package/dist/conformance/checks/payload.js.map +1 -0
- package/dist/conformance/checks/secret-scrub.d.ts +33 -0
- package/dist/conformance/checks/secret-scrub.js +118 -0
- package/dist/conformance/checks/secret-scrub.js.map +1 -0
- package/dist/conformance/checks/source-runtime.d.ts +43 -0
- package/dist/conformance/checks/source-runtime.js +68 -0
- package/dist/conformance/checks/source-runtime.js.map +1 -0
- package/dist/conformance/checks/source-static.d.ts +61 -0
- package/dist/conformance/checks/source-static.js +311 -0
- package/dist/conformance/checks/source-static.js.map +1 -0
- package/dist/conformance/checks/trajectory-chain.d.ts +18 -0
- package/dist/conformance/checks/trajectory-chain.js +51 -0
- package/dist/conformance/checks/trajectory-chain.js.map +1 -0
- package/dist/conformance/checks/trajectory-profile.d.ts +17 -0
- package/dist/conformance/checks/trajectory-profile.js +51 -0
- package/dist/conformance/checks/trajectory-profile.js.map +1 -0
- package/dist/conformance/checks/trajectory-schema.d.ts +20 -0
- package/dist/conformance/checks/trajectory-schema.js +40 -0
- package/dist/conformance/checks/trajectory-schema.js.map +1 -0
- package/dist/conformance/checks/verdict.d.ts +44 -0
- package/dist/conformance/checks/verdict.js +122 -0
- package/dist/conformance/checks/verdict.js.map +1 -0
- package/dist/conformance/harness.d.ts +32 -0
- package/dist/conformance/harness.js +228 -0
- package/dist/conformance/harness.js.map +1 -0
- package/dist/conformance/types.d.ts +88 -0
- package/dist/conformance/types.js +31 -0
- package/dist/conformance/types.js.map +1 -0
- package/dist/corpus/acquire.d.ts +37 -0
- package/dist/corpus/acquire.js +155 -0
- package/dist/corpus/acquire.js.map +1 -0
- package/dist/corpus/cache.d.ts +14 -0
- package/dist/corpus/cache.js +18 -0
- package/dist/corpus/cache.js.map +1 -0
- package/dist/corpus/fetch.d.ts +9 -0
- package/dist/corpus/fetch.js +24 -0
- package/dist/corpus/fetch.js.map +1 -0
- package/dist/corpus/index.d.ts +16 -0
- package/dist/corpus/index.js +78 -0
- package/dist/corpus/index.js.map +1 -0
- package/dist/corpus/query.d.ts +17 -0
- package/dist/corpus/query.js +108 -0
- package/dist/corpus/query.js.map +1 -0
- package/dist/corpus/route-resolver.d.ts +16 -0
- package/dist/corpus/route-resolver.js +20 -0
- package/dist/corpus/route-resolver.js.map +1 -0
- package/dist/corpus/types.d.ts +107 -0
- package/dist/corpus/types.js +50 -0
- package/dist/corpus/types.js.map +1 -0
- package/dist/daemon/balance-topup-loop.js +2 -1
- package/dist/daemon/balance-topup-loop.js.map +1 -1
- package/dist/daemon/creator.d.ts +2 -2
- package/dist/daemon/creator.js +2 -2
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +70 -15
- package/dist/daemon/daemon.js +159 -41
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/delivery-watcher.js +31 -1
- package/dist/daemon/delivery-watcher.js.map +1 -1
- package/dist/daemon/jinn-claim-loop-canonical.d.ts +207 -0
- package/dist/daemon/jinn-claim-loop-canonical.js +296 -0
- package/dist/daemon/jinn-claim-loop-canonical.js.map +1 -0
- package/dist/daemon/jinn-claim-loop-mock.d.ts +61 -0
- package/dist/daemon/jinn-claim-loop-mock.js +122 -0
- package/dist/daemon/jinn-claim-loop-mock.js.map +1 -0
- package/dist/daemon/jinn-claim-loop.d.ts +123 -0
- package/dist/daemon/jinn-claim-loop.js +256 -0
- package/dist/daemon/jinn-claim-loop.js.map +1 -0
- package/dist/daemon/reward-claim-loop.d.ts +2 -0
- package/dist/daemon/reward-claim-loop.js +32 -27
- package/dist/daemon/reward-claim-loop.js.map +1 -1
- package/dist/dashboard/assets/index-Bxlk5qpa.js +68 -0
- package/dist/dashboard/assets/index-DQ3u_vP5.css +32 -0
- package/dist/dashboard/index.html +18 -74
- package/dist/earning/agent-wallet-binding.d.ts +133 -0
- package/dist/earning/agent-wallet-binding.js +202 -0
- package/dist/earning/agent-wallet-binding.js.map +1 -0
- package/dist/earning/bootstrap.d.ts +64 -0
- package/dist/earning/bootstrap.js +325 -32
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +323 -0
- package/dist/earning/contracts.js +276 -0
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/funding-plan.d.ts +90 -0
- package/dist/earning/funding-plan.js +203 -0
- package/dist/earning/funding-plan.js.map +1 -0
- package/dist/earning/migrate-agent-id.d.ts +130 -0
- package/dist/earning/migrate-agent-id.js +257 -0
- package/dist/earning/migrate-agent-id.js.map +1 -0
- package/dist/earning/orphan-sweep.d.ts +14 -0
- package/dist/earning/orphan-sweep.js +63 -2
- package/dist/earning/orphan-sweep.js.map +1 -1
- package/dist/earning/reconcile.d.ts +2 -0
- package/dist/earning/reconcile.js +30 -0
- package/dist/earning/reconcile.js.map +1 -1
- package/dist/earning/stolas-claim.d.ts +86 -6
- package/dist/earning/stolas-claim.js +123 -9
- package/dist/earning/stolas-claim.js.map +1 -1
- package/dist/earning/store.d.ts +39 -0
- package/dist/earning/store.js +72 -1
- package/dist/earning/store.js.map +1 -1
- package/dist/earning/testnet-setup-migration.d.ts +32 -0
- package/dist/earning/testnet-setup-migration.js +214 -0
- package/dist/earning/testnet-setup-migration.js.map +1 -0
- package/dist/earning/types.d.ts +53 -9
- package/dist/earning/types.js +51 -2
- package/dist/earning/types.js.map +1 -1
- package/dist/earning/viem-clients.d.ts +20 -0
- package/dist/earning/viem-clients.js +32 -1
- package/dist/earning/viem-clients.js.map +1 -1
- package/dist/erc8004/abis.d.ts +381 -0
- package/dist/erc8004/abis.js +238 -0
- package/dist/erc8004/abis.js.map +1 -0
- package/dist/erc8004/addresses.d.ts +40 -0
- package/dist/erc8004/addresses.js +64 -0
- package/dist/erc8004/addresses.js.map +1 -0
- package/dist/erc8004/identity.d.ts +202 -0
- package/dist/erc8004/identity.js +305 -0
- package/dist/erc8004/identity.js.map +1 -0
- package/dist/erc8004/index.d.ts +13 -0
- package/dist/erc8004/index.js +20 -0
- package/dist/erc8004/index.js.map +1 -0
- package/dist/erc8004/reputation.d.ts +349 -0
- package/dist/erc8004/reputation.js +464 -0
- package/dist/erc8004/reputation.js.map +1 -0
- package/dist/erc8004/subgraph.d.ts +46 -0
- package/dist/erc8004/subgraph.js +37 -0
- package/dist/erc8004/subgraph.js.map +1 -0
- package/dist/erc8004/validation.d.ts +145 -0
- package/dist/erc8004/validation.js +219 -0
- package/dist/erc8004/validation.js.map +1 -0
- package/dist/errors/persisted-bootstrap-error.d.ts +4 -0
- package/dist/errors/persisted-bootstrap-error.js +50 -0
- package/dist/errors/persisted-bootstrap-error.js.map +1 -0
- package/dist/events/emitter.d.ts +12 -0
- package/dist/events/emitter.js +23 -0
- package/dist/events/emitter.js.map +1 -0
- package/dist/events/ring-buffer.d.ts +25 -0
- package/dist/events/ring-buffer.js +46 -0
- package/dist/events/ring-buffer.js.map +1 -0
- package/dist/events/types.d.ts +42 -0
- package/dist/events/types.js +28 -0
- package/dist/events/types.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/intents/kinds/index.d.ts +10 -0
- package/dist/intents/kinds/index.js +7 -0
- package/dist/intents/kinds/index.js.map +1 -1
- package/dist/intents/kinds/learner-loop-test.d.ts +2 -0
- package/dist/intents/kinds/learner-loop-test.js +39 -0
- package/dist/intents/kinds/learner-loop-test.js.map +1 -0
- package/dist/intents/kinds/prediction-apy-v0.js +5 -1
- package/dist/intents/kinds/prediction-apy-v0.js.map +1 -1
- package/dist/intents/kinds/prediction-v0.js +5 -0
- package/dist/intents/kinds/prediction-v0.js.map +1 -1
- package/dist/intents/kinds/spec-kind.d.ts +18 -1
- package/dist/intents/posting-service.d.ts +3 -5
- package/dist/intents/posting-service.js +16 -50
- package/dist/intents/posting-service.js.map +1 -1
- package/dist/intents/prediction-apy-v0-auto.d.ts +12 -2
- package/dist/intents/prediction-apy-v0-auto.js +27 -2
- package/dist/intents/prediction-apy-v0-auto.js.map +1 -1
- package/dist/intents/prediction-v0-auto.d.ts +14 -4
- package/dist/intents/prediction-v0-auto.js +29 -5
- package/dist/intents/prediction-v0-auto.js.map +1 -1
- package/dist/intents/signing.d.ts +13 -0
- package/dist/intents/signing.js +27 -0
- package/dist/intents/signing.js.map +1 -0
- package/dist/intents/sources.d.ts +12 -5
- package/dist/intents/sources.js +11 -11
- package/dist/intents/sources.js.map +1 -1
- package/dist/main.d.ts +5 -2
- package/dist/main.js +792 -66
- package/dist/main.js.map +1 -1
- package/dist/mcp/acquire-artifact.d.ts +39 -0
- package/dist/mcp/acquire-artifact.js +163 -0
- package/dist/mcp/acquire-artifact.js.map +1 -0
- package/dist/mcp/operator-server.d.ts +20 -3
- package/dist/mcp/operator-server.js +500 -25
- package/dist/mcp/operator-server.js.map +1 -1
- package/dist/mcp/search-artifacts.d.ts +31 -0
- package/dist/mcp/search-artifacts.js +40 -0
- package/dist/mcp/search-artifacts.js.map +1 -0
- package/dist/mcp/server.js +103 -58
- package/dist/mcp/server.js.map +1 -1
- package/dist/observability/emit-event.d.ts +1 -1
- package/dist/observability/emit-event.js.map +1 -1
- package/dist/operator-errors.js +4 -5
- package/dist/operator-errors.js.map +1 -1
- package/dist/preflight/claude-auth.d.ts +11 -11
- package/dist/preflight/claude-auth.js +18 -32
- package/dist/preflight/claude-auth.js.map +1 -1
- package/dist/restorer/capability/index.d.ts +82 -0
- package/dist/restorer/capability/index.js +12 -0
- package/dist/restorer/capability/index.js.map +1 -0
- package/dist/restorer/capability/scoped-rpc.d.ts +12 -0
- package/dist/restorer/capability/scoped-rpc.js +34 -0
- package/dist/restorer/capability/scoped-rpc.js.map +1 -0
- package/dist/restorer/capability/scoped-secrets.d.ts +8 -0
- package/dist/restorer/capability/scoped-secrets.js +10 -0
- package/dist/restorer/capability/scoped-secrets.js.map +1 -0
- package/dist/restorer/capability/scoped-signer.d.ts +46 -0
- package/dist/restorer/capability/scoped-signer.js +73 -0
- package/dist/restorer/capability/scoped-signer.js.map +1 -0
- package/dist/restorer/engine/canonical-json.d.ts +0 -17
- package/dist/restorer/engine/canonical-json.js +56 -49
- package/dist/restorer/engine/canonical-json.js.map +1 -1
- package/dist/restorer/engine/claim.js +8 -1
- package/dist/restorer/engine/claim.js.map +1 -1
- package/dist/restorer/engine/delivery.d.ts +2 -0
- package/dist/restorer/engine/delivery.js +2 -2
- package/dist/restorer/engine/delivery.js.map +1 -1
- package/dist/restorer/engine/engine.d.ts +143 -26
- package/dist/restorer/engine/engine.js +485 -104
- package/dist/restorer/engine/engine.js.map +1 -1
- package/dist/restorer/engine/envelope-assembly.d.ts +65 -0
- package/dist/restorer/engine/envelope-assembly.js +60 -0
- package/dist/restorer/engine/envelope-assembly.js.map +1 -0
- package/dist/restorer/engine/packaging.d.ts +30 -30
- package/dist/restorer/engine/packaging.js +73 -47
- package/dist/restorer/engine/packaging.js.map +1 -1
- package/dist/restorer/engine/persistence.d.ts +7 -7
- package/dist/restorer/engine/persistence.js +4 -4
- package/dist/restorer/engine/persistence.js.map +1 -1
- package/dist/restorer/engine/registry.d.ts +24 -13
- package/dist/restorer/engine/registry.js +16 -13
- package/dist/restorer/engine/registry.js.map +1 -1
- package/dist/restorer/engine/validate-manifest.d.ts +23 -0
- package/dist/restorer/engine/validate-manifest.js +49 -0
- package/dist/restorer/engine/validate-manifest.js.map +1 -0
- package/dist/restorer/engine/verification-stub.d.ts +18 -0
- package/dist/restorer/engine/verification-stub.js +18 -0
- package/dist/restorer/engine/verification-stub.js.map +1 -0
- package/dist/restorer/external-impls/index.d.ts +3 -0
- package/dist/restorer/external-impls/index.js +2 -0
- package/dist/restorer/external-impls/index.js.map +1 -0
- package/dist/restorer/external-impls/loader.d.ts +49 -0
- package/dist/restorer/external-impls/loader.js +138 -0
- package/dist/restorer/external-impls/loader.js.map +1 -0
- package/dist/restorer/external-impls/package-hash.d.ts +26 -0
- package/dist/restorer/external-impls/package-hash.js +102 -0
- package/dist/restorer/external-impls/package-hash.js.map +1 -0
- package/dist/restorer/external-impls/types.d.ts +42 -0
- package/dist/restorer/external-impls/types.js +10 -0
- package/dist/restorer/external-impls/types.js.map +1 -0
- package/dist/restorer/impls/claude-code-learner/adapters/claude-code.d.ts +38 -0
- package/dist/restorer/impls/claude-code-learner/adapters/claude-code.js +200 -0
- package/dist/restorer/impls/claude-code-learner/adapters/claude-code.js.map +1 -0
- package/dist/restorer/impls/claude-code-learner/harvest.d.ts +19 -0
- package/dist/restorer/impls/claude-code-learner/harvest.js +146 -0
- package/dist/restorer/impls/claude-code-learner/harvest.js.map +1 -0
- package/dist/restorer/impls/claude-code-learner/index.d.ts +15 -0
- package/dist/restorer/impls/claude-code-learner/index.js +14 -0
- package/dist/restorer/impls/claude-code-learner/index.js.map +1 -0
- package/dist/restorer/impls/claude-code-learner/mcp-config.d.ts +48 -0
- package/dist/restorer/impls/claude-code-learner/mcp-config.js +52 -0
- package/dist/restorer/impls/claude-code-learner/mcp-config.js.map +1 -0
- package/dist/restorer/impls/claude-code-learner/plugin-path.d.ts +14 -0
- package/dist/restorer/impls/claude-code-learner/plugin-path.js +30 -0
- package/dist/restorer/impls/claude-code-learner/plugin-path.js.map +1 -0
- package/dist/restorer/impls/claude-code-learner/restorer.d.ts +38 -0
- package/dist/restorer/impls/claude-code-learner/restorer.js +73 -0
- package/dist/restorer/impls/claude-code-learner/restorer.js.map +1 -0
- package/dist/restorer/impls/claude-code-learner/test-utils/fake-plugin-outputs.d.ts +19 -0
- package/dist/restorer/impls/claude-code-learner/test-utils/fake-plugin-outputs.js +111 -0
- package/dist/restorer/impls/claude-code-learner/test-utils/fake-plugin-outputs.js.map +1 -0
- package/dist/restorer/impls/claude-code-learner/test-utils/noop-adapter.d.ts +22 -0
- package/dist/restorer/impls/claude-code-learner/test-utils/noop-adapter.js +35 -0
- package/dist/restorer/impls/claude-code-learner/test-utils/noop-adapter.js.map +1 -0
- package/dist/restorer/impls/claude-code-learner/test-utils/synthetic-session.d.ts +20 -0
- package/dist/restorer/impls/claude-code-learner/test-utils/synthetic-session.js +34 -0
- package/dist/restorer/impls/claude-code-learner/test-utils/synthetic-session.js.map +1 -0
- package/dist/restorer/impls/claude-code-learner/types.d.ts +99 -0
- package/dist/restorer/impls/claude-code-learner/types.js +2 -0
- package/dist/restorer/impls/claude-code-learner/types.js.map +1 -0
- package/dist/restorer/impls/claude-code-learner/wrapper.d.ts +49 -0
- package/dist/restorer/impls/claude-code-learner/wrapper.js +144 -0
- package/dist/restorer/impls/claude-code-learner/wrapper.js.map +1 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.d.ts +2 -2
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +2 -2
- package/dist/restorer/impls/claude-mcp-hyperliquid/index.js.map +1 -1
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.d.ts +7 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js +38 -0
- package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js.map +1 -1
- package/dist/restorer/impls/claude-mcp-prediction/index.d.ts +2 -2
- package/dist/restorer/impls/claude-mcp-prediction/index.js +12 -2
- package/dist/restorer/impls/claude-mcp-prediction/index.js.map +1 -1
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.d.ts +9 -2
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js +9 -125
- package/dist/restorer/impls/claude-mcp-prediction/session-orchestrator.js.map +1 -1
- package/dist/restorer/impls/claude-mcp-prediction-apy/index.d.ts +2 -2
- package/dist/restorer/impls/claude-mcp-prediction-apy/index.js +9 -2
- package/dist/restorer/impls/claude-mcp-prediction-apy/index.js.map +1 -1
- package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.d.ts +10 -0
- package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.js +10 -119
- package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.js.map +1 -1
- package/dist/restorer/impls/claude-mcp-shared/single-session-orchestrator.d.ts +84 -0
- package/dist/restorer/impls/claude-mcp-shared/single-session-orchestrator.js +206 -0
- package/dist/restorer/impls/claude-mcp-shared/single-session-orchestrator.js.map +1 -0
- package/dist/restorer/impls/evaluation-context.d.ts +11 -4
- package/dist/restorer/impls/evaluation-context.js +9 -2
- package/dist/restorer/impls/evaluation-context.js.map +1 -1
- package/dist/restorer/impls/index.d.ts +46 -1
- package/dist/restorer/impls/index.js +38 -0
- package/dist/restorer/impls/index.js.map +1 -1
- package/dist/restorer/impls/legacy-claude/index.d.ts +13 -1
- package/dist/restorer/impls/legacy-claude/index.js +2 -0
- package/dist/restorer/impls/legacy-claude/index.js.map +1 -1
- package/dist/restorer/impls/portfolio-v0-evaluator/index.d.ts +4 -4
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js +184 -55
- package/dist/restorer/impls/portfolio-v0-evaluator/index.js.map +1 -1
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.d.ts +1 -1
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.js +8 -1
- package/dist/restorer/impls/prediction-apy-v0-baseline/index.js.map +1 -1
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.d.ts +3 -3
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js +153 -15
- package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js.map +1 -1
- package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.d.ts +14 -5
- package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.js +16 -23
- package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.js.map +1 -1
- package/dist/restorer/impls/prediction-v0-baseline/index.d.ts +1 -1
- package/dist/restorer/impls/prediction-v0-baseline/index.js +16 -7
- package/dist/restorer/impls/prediction-v0-baseline/index.js.map +1 -1
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.d.ts +5 -3
- package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -1
- package/dist/restorer/impls/prediction-v0-evaluator/index.d.ts +2 -2
- package/dist/restorer/impls/prediction-v0-evaluator/index.js +175 -67
- package/dist/restorer/impls/prediction-v0-evaluator/index.js.map +1 -1
- package/dist/restorer/manifest/index.d.ts +3 -0
- package/dist/restorer/manifest/index.js +3 -0
- package/dist/restorer/manifest/index.js.map +1 -0
- package/dist/restorer/manifest/load.d.ts +7 -0
- package/dist/restorer/manifest/load.js +49 -0
- package/dist/restorer/manifest/load.js.map +1 -0
- package/dist/restorer/manifest/types.d.ts +75 -0
- package/dist/restorer/manifest/types.js +8 -0
- package/dist/restorer/manifest/types.js.map +1 -0
- package/dist/restorer/manifest/verify.d.ts +15 -0
- package/dist/restorer/manifest/verify.js +53 -0
- package/dist/restorer/manifest/verify.js.map +1 -0
- package/dist/restorer/plug-ins/index.d.ts +14 -0
- package/dist/restorer/plug-ins/index.js +11 -0
- package/dist/restorer/plug-ins/index.js.map +1 -0
- package/dist/restorer/plug-ins/loader.d.ts +27 -0
- package/dist/restorer/plug-ins/loader.js +101 -0
- package/dist/restorer/plug-ins/loader.js.map +1 -0
- package/dist/restorer/plug-ins/manifest.d.ts +7 -0
- package/dist/restorer/plug-ins/manifest.js +97 -0
- package/dist/restorer/plug-ins/manifest.js.map +1 -0
- package/dist/restorer/plug-ins/registry.d.ts +24 -0
- package/dist/restorer/plug-ins/registry.js +17 -0
- package/dist/restorer/plug-ins/registry.js.map +1 -0
- package/dist/restorer/plug-ins/serialise.d.ts +29 -0
- package/dist/restorer/plug-ins/serialise.js +29 -0
- package/dist/restorer/plug-ins/serialise.js.map +1 -0
- package/dist/restorer/plug-ins/types.d.ts +77 -0
- package/dist/restorer/plug-ins/types.js +10 -0
- package/dist/restorer/plug-ins/types.js.map +1 -0
- package/dist/restorer/types.d.ts +66 -11
- package/dist/restorer/types.js.map +1 -1
- package/dist/runner/claude.d.ts +3 -3
- package/dist/runner/claude.js +57 -21
- package/dist/runner/claude.js.map +1 -1
- package/dist/runner/runner.d.ts +29 -2
- package/dist/runner/simple.d.ts +2 -2
- package/dist/runner/simple.js +2 -2
- package/dist/runner/simple.js.map +1 -1
- package/dist/scripts/fix-node-pty.mjs +62 -0
- package/dist/setup-mode.d.ts +34 -0
- package/dist/setup-mode.js +49 -0
- package/dist/setup-mode.js.map +1 -0
- package/dist/store/store.d.ts +79 -3
- package/dist/store/store.js +189 -6
- package/dist/store/store.js.map +1 -1
- package/dist/templates/plug-in/hook/README.md.tmpl +24 -0
- package/dist/templates/plug-in/hook/gitignore.tmpl +3 -0
- package/dist/templates/plug-in/hook/hooks/event.sh.tmpl +15 -0
- package/dist/templates/plug-in/hook/jinn-plugin.json.tmpl +16 -0
- package/dist/templates/plug-in/hook/package.json.tmpl +14 -0
- package/dist/templates/plug-in/hook/test/manifest.test.ts.tmpl +21 -0
- package/dist/templates/plug-in/mcp-tool/README.md.tmpl +26 -0
- package/dist/templates/plug-in/mcp-tool/gitignore.tmpl +4 -0
- package/dist/templates/plug-in/mcp-tool/jinn-plugin.json.tmpl +16 -0
- package/dist/templates/plug-in/mcp-tool/package.json.tmpl +19 -0
- package/dist/templates/plug-in/mcp-tool/src/server.ts.tmpl +17 -0
- package/dist/templates/plug-in/mcp-tool/test/server.test.ts.tmpl +18 -0
- package/dist/templates/plug-in/memory-backend/README.md.tmpl +33 -0
- package/dist/templates/plug-in/memory-backend/gitignore.tmpl +4 -0
- package/dist/templates/plug-in/memory-backend/jinn-plugin.json.tmpl +16 -0
- package/dist/templates/plug-in/memory-backend/package.json.tmpl +19 -0
- package/dist/templates/plug-in/memory-backend/src/server.ts.tmpl +23 -0
- package/dist/templates/plug-in/memory-backend/test/server.test.ts.tmpl +17 -0
- package/dist/templates/plug-in/phase-agent-override/README.md.tmpl +30 -0
- package/dist/templates/plug-in/phase-agent-override/agents/agent.md.tmpl +26 -0
- package/dist/templates/plug-in/phase-agent-override/gitignore.tmpl +3 -0
- package/dist/templates/plug-in/phase-agent-override/jinn-plugin.json.tmpl +17 -0
- package/dist/templates/plug-in/phase-agent-override/package.json.tmpl +14 -0
- package/dist/templates/plug-in/phase-agent-override/test/manifest.test.ts.tmpl +24 -0
- package/dist/templates/plug-in/skill-bundle/.claude-plugin/plugin.json.tmpl +5 -0
- package/dist/templates/plug-in/skill-bundle/README.md.tmpl +28 -0
- package/dist/templates/plug-in/skill-bundle/gitignore.tmpl +3 -0
- package/dist/templates/plug-in/skill-bundle/jinn-plugin.json.tmpl +15 -0
- package/dist/templates/plug-in/skill-bundle/package.json.tmpl +14 -0
- package/dist/templates/plug-in/skill-bundle/skills/example/SKILL.md.tmpl +14 -0
- package/dist/templates/plug-in/skill-bundle/test/manifest.test.ts.tmpl +21 -0
- package/dist/templates/plug-in/topic-explorer/README.md.tmpl +24 -0
- package/dist/templates/plug-in/topic-explorer/agents/explorer.md.tmpl +26 -0
- package/dist/templates/plug-in/topic-explorer/gitignore.tmpl +3 -0
- package/dist/templates/plug-in/topic-explorer/jinn-plugin.json.tmpl +17 -0
- package/dist/templates/plug-in/topic-explorer/package.json.tmpl +14 -0
- package/dist/templates/plug-in/topic-explorer/test/manifest.test.ts.tmpl +22 -0
- package/dist/templates/restorer/alternative-harness/README.md.tmpl +44 -0
- package/dist/templates/restorer/alternative-harness/gitignore.tmpl +3 -0
- package/dist/templates/restorer/alternative-harness/jinn.manifest.json.tmpl +22 -0
- package/dist/templates/restorer/alternative-harness/package.json.tmpl +26 -0
- package/dist/templates/restorer/alternative-harness/src/coordinator.ts.tmpl +50 -0
- package/dist/templates/restorer/alternative-harness/src/harness.ts.tmpl +31 -0
- package/dist/templates/restorer/alternative-harness/src/index.ts.tmpl +44 -0
- package/dist/templates/restorer/alternative-harness/src/mock-harness.ts.tmpl +41 -0
- package/dist/templates/restorer/alternative-harness/src/phases/debrief.ts.tmpl +28 -0
- package/dist/templates/restorer/alternative-harness/src/phases/execute.ts.tmpl +33 -0
- package/dist/templates/restorer/alternative-harness/src/phases/improve.ts.tmpl +31 -0
- package/dist/templates/restorer/alternative-harness/src/phases/memory.ts.tmpl +31 -0
- package/dist/templates/restorer/alternative-harness/src/phases/orient.ts.tmpl +21 -0
- package/dist/templates/restorer/alternative-harness/src/phases/plan.ts.tmpl +25 -0
- package/dist/templates/restorer/alternative-harness/src/phases/strategize.ts.tmpl +29 -0
- package/dist/templates/restorer/alternative-harness/test/coordinator.test.ts.tmpl +52 -0
- package/dist/templates/restorer/alternative-harness/test/unit.test.ts.tmpl +54 -0
- package/dist/templates/restorer/alternative-harness/tsconfig.json.tmpl +16 -0
- package/dist/templates/restorer/evaluator/README.md.tmpl +36 -0
- package/dist/templates/restorer/evaluator/gitignore.tmpl +3 -0
- package/dist/templates/restorer/evaluator/jinn.manifest.json.tmpl +22 -0
- package/dist/templates/restorer/evaluator/package.json.tmpl +26 -0
- package/dist/templates/restorer/evaluator/src/index.ts.tmpl +35 -0
- package/dist/templates/restorer/evaluator/test/unit.test.ts.tmpl +48 -0
- package/dist/templates/restorer/evaluator/tsconfig.json.tmpl +16 -0
- package/dist/templates/restorer/forecaster/README.md.tmpl +25 -0
- package/dist/templates/restorer/forecaster/gitignore.tmpl +5 -0
- package/dist/templates/restorer/forecaster/jinn.manifest.json.tmpl +22 -0
- package/dist/templates/restorer/forecaster/package.json.tmpl +26 -0
- package/dist/templates/restorer/forecaster/src/index.ts.tmpl +33 -0
- package/dist/templates/restorer/forecaster/test/unit.test.ts.tmpl +41 -0
- package/dist/templates/restorer/forecaster/tsconfig.json.tmpl +16 -0
- package/dist/trajectory/collector.d.ts +49 -0
- package/dist/trajectory/collector.js +86 -0
- package/dist/trajectory/collector.js.map +1 -0
- package/dist/trajectory/emit.d.ts +27 -0
- package/dist/trajectory/emit.js +40 -0
- package/dist/trajectory/emit.js.map +1 -0
- package/dist/trajectory/hash-chain.d.ts +18 -0
- package/dist/trajectory/hash-chain.js +23 -0
- package/dist/trajectory/hash-chain.js.map +1 -0
- package/dist/trajectory/index.d.ts +22 -0
- package/dist/trajectory/index.js +23 -0
- package/dist/trajectory/index.js.map +1 -0
- package/dist/trajectory/schema.d.ts +14 -14
- package/dist/trajectory/secret-scrub.d.ts +32 -0
- package/dist/trajectory/secret-scrub.js +51 -0
- package/dist/trajectory/secret-scrub.js.map +1 -0
- package/dist/trajectory/span-profile.d.ts +27 -0
- package/dist/trajectory/span-profile.js +51 -0
- package/dist/trajectory/span-profile.js.map +1 -0
- package/dist/trajectory/wrappers/http.d.ts +37 -0
- package/dist/trajectory/wrappers/http.js +85 -0
- package/dist/trajectory/wrappers/http.js.map +1 -0
- package/dist/trajectory/wrappers/mcp.d.ts +17 -0
- package/dist/trajectory/wrappers/mcp.js +58 -0
- package/dist/trajectory/wrappers/mcp.js.map +1 -0
- package/dist/trajectory/wrappers/subprocess.d.ts +32 -0
- package/dist/trajectory/wrappers/subprocess.js +70 -0
- package/dist/trajectory/wrappers/subprocess.js.map +1 -0
- package/dist/tx-retry.js +23 -9
- package/dist/tx-retry.js.map +1 -1
- package/dist/types/desired-state.d.ts +211 -21
- package/dist/types/desired-state.js +26 -15
- package/dist/types/desired-state.js.map +1 -1
- package/dist/types/envelope.d.ts +1473 -0
- package/dist/types/envelope.js +114 -0
- package/dist/types/envelope.js.map +1 -0
- package/dist/types/index.d.ts +4 -4
- package/dist/types/index.js +4 -4
- package/dist/types/index.js.map +1 -1
- package/dist/types/intent.d.ts +276 -0
- package/dist/types/intent.js +74 -0
- package/dist/types/intent.js.map +1 -0
- package/dist/types/payloads/index.d.ts +11 -0
- package/dist/types/payloads/index.js +46 -0
- package/dist/types/payloads/index.js.map +1 -0
- package/dist/types/payloads/portfolio-v0.d.ts +481 -0
- package/dist/types/payloads/portfolio-v0.js +94 -0
- package/dist/types/payloads/portfolio-v0.js.map +1 -0
- package/dist/types/payloads/prediction-apy-v0.d.ts +231 -0
- package/dist/types/payloads/prediction-apy-v0.js +63 -0
- package/dist/types/payloads/prediction-apy-v0.js.map +1 -0
- package/dist/types/payloads/prediction-v0.d.ts +262 -0
- package/dist/types/payloads/prediction-v0.js +73 -0
- package/dist/types/payloads/prediction-v0.js.map +1 -0
- package/dist/types/portfolio.d.ts +23 -685
- package/dist/types/portfolio.js +16 -106
- package/dist/types/portfolio.js.map +1 -1
- package/dist/types/prediction-apy.d.ts +9 -344
- package/dist/types/prediction-apy.js +9 -65
- package/dist/types/prediction-apy.js.map +1 -1
- package/dist/types/prediction.d.ts +25 -396
- package/dist/types/prediction.js +5 -79
- package/dist/types/prediction.js.map +1 -1
- package/dist/types/window.d.ts +12 -0
- package/dist/types/window.js +6 -0
- package/dist/types/window.js.map +1 -0
- package/dist/util/path-safety.d.ts +22 -0
- package/dist/util/path-safety.js +29 -0
- package/dist/util/path-safety.js.map +1 -0
- package/dist/util/redact-rpc-urls.d.ts +5 -0
- package/dist/util/redact-rpc-urls.js +9 -0
- package/dist/util/redact-rpc-urls.js.map +1 -0
- package/dist/x402/acquire.d.ts +14 -3
- package/dist/x402/acquire.js +28 -11
- package/dist/x402/acquire.js.map +1 -1
- package/dist/x402/handler.d.ts +15 -3
- package/dist/x402/handler.js +67 -24
- package/dist/x402/handler.js.map +1 -1
- package/package.json +36 -11
- package/plugins/claude-code-learner/.claude-plugin/plugin.json +9 -0
- package/plugins/claude-code-learner/AGENTS.md +30 -0
- package/plugins/claude-code-learner/CLAUDE.md +31 -0
- package/plugins/claude-code-learner/README.md +58 -0
- package/plugins/claude-code-learner/agents/analyst.md +69 -0
- package/plugins/claude-code-learner/agents/consolidator.md +95 -0
- package/plugins/claude-code-learner/agents/explorer.md +54 -0
- package/plugins/claude-code-learner/agents/planner.md +88 -0
- package/plugins/claude-code-learner/agents/promoter.md +114 -0
- package/plugins/claude-code-learner/agents/step-worker.md +48 -0
- package/plugins/claude-code-learner/agents/strategist.md +86 -0
- package/plugins/claude-code-learner/hooks/hooks.json +16 -0
- package/plugins/claude-code-learner/hooks/session-start +49 -0
- package/plugins/claude-code-learner/skills/coordinator/SKILL.md +131 -0
- package/plugins/claude-code-learner/skills/debrief/SKILL.md +71 -0
- package/plugins/claude-code-learner/skills/execute/SKILL.md +91 -0
- package/plugins/claude-code-learner/skills/improve/SKILL.md +57 -0
- package/plugins/claude-code-learner/skills/memory-consolidation/SKILL.md +57 -0
- package/plugins/claude-code-learner/skills/orient/SKILL.md +82 -0
- package/plugins/claude-code-learner/skills/plan/SKILL.md +54 -0
- package/plugins/claude-code-learner/skills/strategize/SKILL.md +63 -0
- package/skills/jinn-operator/SKILL.md +84 -35
- package/templates/plug-in/hook/README.md.tmpl +24 -0
- package/templates/plug-in/hook/gitignore.tmpl +3 -0
- package/templates/plug-in/hook/hooks/event.sh.tmpl +15 -0
- package/templates/plug-in/hook/jinn-plugin.json.tmpl +16 -0
- package/templates/plug-in/hook/package.json.tmpl +14 -0
- package/templates/plug-in/hook/test/manifest.test.ts.tmpl +21 -0
- package/templates/plug-in/mcp-tool/README.md.tmpl +26 -0
- package/templates/plug-in/mcp-tool/gitignore.tmpl +4 -0
- package/templates/plug-in/mcp-tool/jinn-plugin.json.tmpl +16 -0
- package/templates/plug-in/mcp-tool/package.json.tmpl +19 -0
- package/templates/plug-in/mcp-tool/src/server.ts.tmpl +17 -0
- package/templates/plug-in/mcp-tool/test/server.test.ts.tmpl +18 -0
- package/templates/plug-in/memory-backend/README.md.tmpl +33 -0
- package/templates/plug-in/memory-backend/gitignore.tmpl +4 -0
- package/templates/plug-in/memory-backend/jinn-plugin.json.tmpl +16 -0
- package/templates/plug-in/memory-backend/package.json.tmpl +19 -0
- package/templates/plug-in/memory-backend/src/server.ts.tmpl +23 -0
- package/templates/plug-in/memory-backend/test/server.test.ts.tmpl +17 -0
- package/templates/plug-in/phase-agent-override/README.md.tmpl +30 -0
- package/templates/plug-in/phase-agent-override/agents/agent.md.tmpl +26 -0
- package/templates/plug-in/phase-agent-override/gitignore.tmpl +3 -0
- package/templates/plug-in/phase-agent-override/jinn-plugin.json.tmpl +17 -0
- package/templates/plug-in/phase-agent-override/package.json.tmpl +14 -0
- package/templates/plug-in/phase-agent-override/test/manifest.test.ts.tmpl +24 -0
- package/templates/plug-in/skill-bundle/.claude-plugin/plugin.json.tmpl +5 -0
- package/templates/plug-in/skill-bundle/README.md.tmpl +28 -0
- package/templates/plug-in/skill-bundle/gitignore.tmpl +3 -0
- package/templates/plug-in/skill-bundle/jinn-plugin.json.tmpl +15 -0
- package/templates/plug-in/skill-bundle/package.json.tmpl +14 -0
- package/templates/plug-in/skill-bundle/skills/example/SKILL.md.tmpl +14 -0
- package/templates/plug-in/skill-bundle/test/manifest.test.ts.tmpl +21 -0
- package/templates/plug-in/topic-explorer/README.md.tmpl +24 -0
- package/templates/plug-in/topic-explorer/agents/explorer.md.tmpl +26 -0
- package/templates/plug-in/topic-explorer/gitignore.tmpl +3 -0
- package/templates/plug-in/topic-explorer/jinn-plugin.json.tmpl +17 -0
- package/templates/plug-in/topic-explorer/package.json.tmpl +14 -0
- package/templates/plug-in/topic-explorer/test/manifest.test.ts.tmpl +22 -0
- package/templates/restorer/alternative-harness/README.md.tmpl +44 -0
- package/templates/restorer/alternative-harness/gitignore.tmpl +3 -0
- package/templates/restorer/alternative-harness/jinn.manifest.json.tmpl +22 -0
- package/templates/restorer/alternative-harness/package.json.tmpl +26 -0
- package/templates/restorer/alternative-harness/src/coordinator.ts.tmpl +50 -0
- package/templates/restorer/alternative-harness/src/harness.ts.tmpl +31 -0
- package/templates/restorer/alternative-harness/src/index.ts.tmpl +44 -0
- package/templates/restorer/alternative-harness/src/mock-harness.ts.tmpl +41 -0
- package/templates/restorer/alternative-harness/src/phases/debrief.ts.tmpl +28 -0
- package/templates/restorer/alternative-harness/src/phases/execute.ts.tmpl +33 -0
- package/templates/restorer/alternative-harness/src/phases/improve.ts.tmpl +31 -0
- package/templates/restorer/alternative-harness/src/phases/memory.ts.tmpl +31 -0
- package/templates/restorer/alternative-harness/src/phases/orient.ts.tmpl +21 -0
- package/templates/restorer/alternative-harness/src/phases/plan.ts.tmpl +25 -0
- package/templates/restorer/alternative-harness/src/phases/strategize.ts.tmpl +29 -0
- package/templates/restorer/alternative-harness/test/coordinator.test.ts.tmpl +52 -0
- package/templates/restorer/alternative-harness/test/unit.test.ts.tmpl +54 -0
- package/templates/restorer/alternative-harness/tsconfig.json.tmpl +16 -0
- package/templates/restorer/evaluator/README.md.tmpl +36 -0
- package/templates/restorer/evaluator/gitignore.tmpl +3 -0
- package/templates/restorer/evaluator/jinn.manifest.json.tmpl +22 -0
- package/templates/restorer/evaluator/package.json.tmpl +26 -0
- package/templates/restorer/evaluator/src/index.ts.tmpl +35 -0
- package/templates/restorer/evaluator/test/unit.test.ts.tmpl +48 -0
- package/templates/restorer/evaluator/tsconfig.json.tmpl +16 -0
- package/templates/restorer/forecaster/README.md.tmpl +25 -0
- package/templates/restorer/forecaster/gitignore.tmpl +5 -0
- package/templates/restorer/forecaster/jinn.manifest.json.tmpl +22 -0
- package/templates/restorer/forecaster/package.json.tmpl +26 -0
- package/templates/restorer/forecaster/src/index.ts.tmpl +33 -0
- package/templates/restorer/forecaster/test/unit.test.ts.tmpl +41 -0
- package/templates/restorer/forecaster/tsconfig.json.tmpl +16 -0
- package/dist/bin/jinn-mcp.d.ts +0 -2
- package/dist/bin/jinn-mcp.js +0 -10
- package/dist/bin/jinn-mcp.js.map +0 -1
- package/dist/cli/commands/quickstart.js +0 -330
- package/dist/cli/commands/quickstart.js.map +0 -1
- package/dist/discovery/registry.d.ts +0 -97
- package/dist/discovery/registry.js +0 -177
- package/dist/discovery/registry.js.map +0 -1
- package/dist/discovery/subgraph.d.ts +0 -37
- package/dist/discovery/subgraph.js +0 -87
- package/dist/discovery/subgraph.js.map +0 -1
- package/dist/restorer/engine/manifest-assembly.d.ts +0 -67
- package/dist/restorer/engine/manifest-assembly.js +0 -79
- package/dist/restorer/engine/manifest-assembly.js.map +0 -1
- /package/dist/cli/commands/{quickstart.d.ts → ui.d.ts} +0 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-only funding plan for the fleet bootstrap state machine.
|
|
3
|
+
*
|
|
4
|
+
* `jinn fund-requirements` (and other inspection callers) need to learn
|
|
5
|
+
* "what funding gates are blocking us right now?" without mutating any
|
|
6
|
+
* state. Specifically: never write to the fleet store, never request
|
|
7
|
+
* faucet funds, never send any chain transactions, never advance the
|
|
8
|
+
* bootstrap state machine.
|
|
9
|
+
*
|
|
10
|
+
* The mutating counterpart lives in `FleetBootstrapper.bootstrap()` and
|
|
11
|
+
* is invoked by `jinn bootstrap`/`jinn run`.
|
|
12
|
+
*
|
|
13
|
+
* See: docs/reviews/2026-04-28-operator-experience-audit.md (W1).
|
|
14
|
+
*/
|
|
15
|
+
import { getAddress } from 'viem';
|
|
16
|
+
import { applyChainGasOverrides, getChainConfig, } from './contracts.js';
|
|
17
|
+
import { FleetStateStore } from './store.js';
|
|
18
|
+
import { decryptMnemonic, deriveMasterAddress } from './wallet.js';
|
|
19
|
+
import { isOperationalServiceStep } from './types.js';
|
|
20
|
+
import { createJinnPublicClient } from './viem-clients.js';
|
|
21
|
+
const SELF_BOND_ETH_PER_SERVICE = 30000000000000000n; // 0.03 ETH
|
|
22
|
+
const STANDARD_MASTER_BOOTSTRAP_MULTIPLIER = 2n;
|
|
23
|
+
const addr = (value) => getAddress(value);
|
|
24
|
+
async function safeGetBalance(client, address) {
|
|
25
|
+
try {
|
|
26
|
+
return await client.getBalance({ address });
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Compute the read-only funding plan. Pure function over disk + chain reads.
|
|
34
|
+
*
|
|
35
|
+
* Guarantees (these are part of the contract relied on by `jinn fund-requirements`):
|
|
36
|
+
* - Never writes to the fleet state file or keystore.
|
|
37
|
+
* - Never requests faucet funds.
|
|
38
|
+
* - Never sends any chain transactions.
|
|
39
|
+
*
|
|
40
|
+
* If a password is provided and a mnemonic keystore exists, the master
|
|
41
|
+
* address is derived from the keystore for funding evaluation. If the
|
|
42
|
+
* password is missing, wrong, or no keystore exists, the plan still
|
|
43
|
+
* returns whatever it can learn from disk + chain reads, with a partial
|
|
44
|
+
* flag and machine-readable reasons.
|
|
45
|
+
*/
|
|
46
|
+
export async function planFleetFunding(options = {}) {
|
|
47
|
+
const chain = options.chain ?? 'base';
|
|
48
|
+
const stakingMode = options.stakingMode ?? 'standard';
|
|
49
|
+
const targetServices = options.targetServices ?? 1;
|
|
50
|
+
const reasons = [];
|
|
51
|
+
const storeFactory = options.storeFactory ?? ((dir) => new FleetStateStore(dir));
|
|
52
|
+
const store = storeFactory(options.earningDir);
|
|
53
|
+
const chainConfigResolver = options.chainConfigResolver ?? getChainConfig;
|
|
54
|
+
const config = applyChainGasOverrides(chainConfigResolver(chain, {
|
|
55
|
+
testnetL2DeploymentPath: options.testnetL2DeploymentPath,
|
|
56
|
+
testnetL2TokenDeploymentPath: options.testnetL2TokenDeploymentPath,
|
|
57
|
+
testnetMechDeploymentPath: options.testnetMechDeploymentPath,
|
|
58
|
+
testnetStolasDeploymentPath: options.testnetStolasDeploymentPath,
|
|
59
|
+
testnetClaimRegistryDeploymentPath: options.testnetClaimRegistryDeploymentPath,
|
|
60
|
+
}), {
|
|
61
|
+
minEoaGasWei: options.minEoaGasWei,
|
|
62
|
+
minSafeEthWei: options.minSafeEthWei,
|
|
63
|
+
});
|
|
64
|
+
if (options.rpcUrl) {
|
|
65
|
+
config.rpcUrl = options.rpcUrl;
|
|
66
|
+
}
|
|
67
|
+
const publicClientFactory = options.publicClientFactory ?? ((url, net) => createJinnPublicClient(url, net));
|
|
68
|
+
const publicClient = publicClientFactory(config.rpcUrl, chain);
|
|
69
|
+
// Read-only fleet state probe. We deliberately call `tryLoadExisting`
|
|
70
|
+
// (never `load`) — `load` writes a default file when the state is
|
|
71
|
+
// missing, which would be a mutation.
|
|
72
|
+
const fleetState = await store.tryLoadExisting();
|
|
73
|
+
if (!fleetState) {
|
|
74
|
+
reasons.push('fleet_state_missing');
|
|
75
|
+
}
|
|
76
|
+
// Resolve master address: prefer persisted state, then derive from
|
|
77
|
+
// keystore + password if available, otherwise mark partial.
|
|
78
|
+
let masterAddress = null;
|
|
79
|
+
if (fleetState?.master_address) {
|
|
80
|
+
masterAddress = addr(fleetState.master_address);
|
|
81
|
+
}
|
|
82
|
+
else if (store.hasMnemonicKeystore()) {
|
|
83
|
+
if (options.password) {
|
|
84
|
+
try {
|
|
85
|
+
const ks = await store.loadMnemonicKeystore();
|
|
86
|
+
const mnemonic = await decryptMnemonic(ks, options.password);
|
|
87
|
+
masterAddress = addr(deriveMasterAddress(mnemonic));
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
reasons.push('password_invalid');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
reasons.push('password_missing');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
reasons.push('no_keystore');
|
|
99
|
+
}
|
|
100
|
+
// No master => no useful master-level evaluation possible.
|
|
101
|
+
if (!masterAddress) {
|
|
102
|
+
return {
|
|
103
|
+
satisfied: false,
|
|
104
|
+
partial: true,
|
|
105
|
+
reasons,
|
|
106
|
+
safes: [],
|
|
107
|
+
fleetState: fleetState ?? undefined,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// Master ETH probe.
|
|
111
|
+
const masterBalance = await safeGetBalance(publicClient, masterAddress);
|
|
112
|
+
if (masterBalance === null) {
|
|
113
|
+
reasons.push('rpc_unreachable');
|
|
114
|
+
return {
|
|
115
|
+
satisfied: false,
|
|
116
|
+
partial: true,
|
|
117
|
+
reasons,
|
|
118
|
+
safes: [],
|
|
119
|
+
fleetState: fleetState ?? undefined,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
let systemEth = masterBalance;
|
|
123
|
+
if (stakingMode === 'self-bond' && fleetState) {
|
|
124
|
+
for (const svc of fleetState.services) {
|
|
125
|
+
if (svc.agent_address) {
|
|
126
|
+
const bal = await safeGetBalance(publicClient, addr(svc.agent_address));
|
|
127
|
+
if (bal === null) {
|
|
128
|
+
reasons.push('rpc_unreachable');
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
systemEth += bal;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (svc.safe_address) {
|
|
135
|
+
const bal = await safeGetBalance(publicClient, addr(svc.safe_address));
|
|
136
|
+
if (bal === null) {
|
|
137
|
+
reasons.push('rpc_unreachable');
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
systemEth += bal;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const completedCount = fleetState?.services.filter((svc) => isOperationalServiceStep(svc.step)).length ?? 0;
|
|
146
|
+
const standardFleetAlreadyComplete = stakingMode === 'standard' && completedCount >= targetServices;
|
|
147
|
+
const standardFleetHasInProgressServices = stakingMode === 'standard' && (fleetState?.services.length ?? 0) > 0;
|
|
148
|
+
const requiredMasterEth = stakingMode === 'standard'
|
|
149
|
+
? (standardFleetAlreadyComplete
|
|
150
|
+
? 0n
|
|
151
|
+
: config.minEoaGasEth * (standardFleetHasInProgressServices ? 1n : STANDARD_MASTER_BOOTSTRAP_MULTIPLIER))
|
|
152
|
+
: SELF_BOND_ETH_PER_SERVICE * BigInt(targetServices);
|
|
153
|
+
let master;
|
|
154
|
+
if (systemEth < requiredMasterEth) {
|
|
155
|
+
const shortfall = requiredMasterEth - systemEth;
|
|
156
|
+
master = {
|
|
157
|
+
master_address: masterAddress,
|
|
158
|
+
eth_required: shortfall.toString(),
|
|
159
|
+
eth_balance: masterBalance.toString(),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// Per-Safe probes for completed services (parity with the existing
|
|
163
|
+
// mech-fee runtime probe in fund-requirements). Only emitted when
|
|
164
|
+
// master-level funding is satisfied — same as the prior behaviour.
|
|
165
|
+
const safes = [];
|
|
166
|
+
if (!master && fleetState) {
|
|
167
|
+
for (const svc of fleetState.services) {
|
|
168
|
+
if (!isOperationalServiceStep(svc.step) || !svc.safe_address)
|
|
169
|
+
continue;
|
|
170
|
+
const safeAddr = addr(svc.safe_address);
|
|
171
|
+
const bal = await safeGetBalance(publicClient, safeAddr);
|
|
172
|
+
if (bal === null) {
|
|
173
|
+
reasons.push('rpc_unreachable');
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (bal >= config.minSafeEth)
|
|
177
|
+
continue;
|
|
178
|
+
safes.push({
|
|
179
|
+
serviceIndex: svc.index,
|
|
180
|
+
safeAddress: safeAddr,
|
|
181
|
+
haveWei: bal.toString(),
|
|
182
|
+
needWei: (config.minSafeEth - bal).toString(),
|
|
183
|
+
asset: 'native',
|
|
184
|
+
reason: `Service ${svc.index} Safe needs native ETH to pay mech fees (each evaluation job sends 99 wei). ` +
|
|
185
|
+
`The daemon's balance-topup-loop auto-refills from master at runtime; funding it manually is ` +
|
|
186
|
+
`required only when running CLI verbs (submit-intent, acceptance gate) outside the daemon.`,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// Deduplicate reasons (rpc_unreachable can be appended multiple times).
|
|
191
|
+
const uniqueReasons = Array.from(new Set(reasons));
|
|
192
|
+
const partial = uniqueReasons.length > 0;
|
|
193
|
+
const satisfied = !master && safes.length === 0 && !partial;
|
|
194
|
+
return {
|
|
195
|
+
satisfied,
|
|
196
|
+
partial,
|
|
197
|
+
reasons: uniqueReasons,
|
|
198
|
+
master,
|
|
199
|
+
safes,
|
|
200
|
+
fleetState: fleetState ?? undefined,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=funding-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"funding-plan.js","sourceRoot":"","sources":["../../src/earning/funding-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Legacy backfill: ERC-8004 IdentityRegistry mint for `complete` services
|
|
3
|
+
* that pre-date jinn-mono-j07.
|
|
4
|
+
*
|
|
5
|
+
* j07 added an `agent_registered` step to the bootstrap state machine,
|
|
6
|
+
* slotted between `mech_deployed` and `complete`. Operators that completed
|
|
7
|
+
* bootstrap BEFORE j07 landed have `state == 'complete' && agent_id == null`
|
|
8
|
+
* and are stuck — they cannot publish per-execution metadata via
|
|
9
|
+
* `setMetadata` (jinn-mono-3zk wires that, but it is gated on a non-null
|
|
10
|
+
* `agent_id`).
|
|
11
|
+
*
|
|
12
|
+
* This module detects such services and runs the agent-registration mint
|
|
13
|
+
* idempotently for each. It is safe to re-run: services that already have
|
|
14
|
+
* an `agent_id` are skipped, and a chain-side lookup recovers the existing
|
|
15
|
+
* agentId for any operator whose state file was lost but whose Safe still
|
|
16
|
+
* owns the NFT (per the entity-model decision record §4.1, the operator
|
|
17
|
+
* agent NFT is stable across executions / re-stakes — we MUST never
|
|
18
|
+
* mint a duplicate).
|
|
19
|
+
*
|
|
20
|
+
* Wired in two places:
|
|
21
|
+
* - daemon startup (`main.ts` after `bootstrap`), gated by
|
|
22
|
+
* `runLegacyMigrations` config flag (default true)
|
|
23
|
+
* - explicit CLI subcommand `jinn migrate-agent-id`
|
|
24
|
+
*
|
|
25
|
+
* Tracked as jinn-mono-jgp.
|
|
26
|
+
*/
|
|
27
|
+
import { type Address, type PublicClient, type WalletClient } from 'viem';
|
|
28
|
+
import { type ChainConfig } from './contracts.js';
|
|
29
|
+
import { FleetStateStore } from './store.js';
|
|
30
|
+
import { type JinnOnchainNetwork } from './viem-clients.js';
|
|
31
|
+
import { deriveAgentSigner } from './wallet.js';
|
|
32
|
+
import type { ServiceState } from './types.js';
|
|
33
|
+
export interface MigrateAgentIdsDeps {
|
|
34
|
+
/** Persistence layer for fleet state. */
|
|
35
|
+
stateStore: FleetStateStore;
|
|
36
|
+
/** Resolved chain config (identity registry, RPC URL, chain ID). */
|
|
37
|
+
config: ChainConfig;
|
|
38
|
+
/** Network the chain config is for. */
|
|
39
|
+
network: JinnOnchainNetwork;
|
|
40
|
+
/** Decrypted HD mnemonic for the master wallet (used to derive agent signers). */
|
|
41
|
+
mnemonic: string;
|
|
42
|
+
/**
|
|
43
|
+
* Optional override for the public client (tests). Defaults to a fresh
|
|
44
|
+
* client built from `config.rpcUrl` + `network`.
|
|
45
|
+
*/
|
|
46
|
+
publicClient?: PublicClient;
|
|
47
|
+
/**
|
|
48
|
+
* Optional factory for wallet clients (tests). Defaults to the production
|
|
49
|
+
* `createJinnWalletClient`. Receives the agent EOA private-key account.
|
|
50
|
+
*/
|
|
51
|
+
walletClientFactory?: (account: ReturnType<typeof deriveAgentSigner>) => WalletClient;
|
|
52
|
+
/**
|
|
53
|
+
* Lower bound for the `Registered` event scan. Mainnet/testnet defaults are
|
|
54
|
+
* adequate; tests override to keep mocks compact. The scan walks forward
|
|
55
|
+
* from this block to `latest` in chunks.
|
|
56
|
+
*/
|
|
57
|
+
scanFromBlock?: bigint;
|
|
58
|
+
/**
|
|
59
|
+
* Block-range chunk size for the `getLogs` scan. Defaults to 9_999n
|
|
60
|
+
* (under typical RPC limits like Alchemy's 10k cap).
|
|
61
|
+
*/
|
|
62
|
+
scanChunkSize?: bigint;
|
|
63
|
+
}
|
|
64
|
+
export interface MigrateAgentIdsFailure {
|
|
65
|
+
service: ServiceState;
|
|
66
|
+
error: string;
|
|
67
|
+
}
|
|
68
|
+
export interface MigrateAgentIdsResult {
|
|
69
|
+
/** Services that were successfully migrated this run (state file updated). */
|
|
70
|
+
migrated: ServiceState[];
|
|
71
|
+
/** Services with `state == 'complete'` and `agent_id` already populated. */
|
|
72
|
+
skipped: ServiceState[];
|
|
73
|
+
/** Services that failed migration; the rest of the run continues. */
|
|
74
|
+
failed: MigrateAgentIdsFailure[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Scan past `Registered(uint256 indexed agentId, string agentURI, address indexed owner)`
|
|
78
|
+
* events on the IdentityRegistry, filtered by indexed `owner`, and return
|
|
79
|
+
* the most recent agentId minted for that owner (or null if none).
|
|
80
|
+
*
|
|
81
|
+
* This is the duplicate-mint guard: per DR §4.1, the operator agent NFT
|
|
82
|
+
* is stable across executions and survives Safe rotation. If an
|
|
83
|
+
* operator's state file lost the `agent_id` (e.g. corrupted backup),
|
|
84
|
+
* we MUST recover the existing token rather than minting a new one.
|
|
85
|
+
*
|
|
86
|
+
* The scan uses the indexed `owner` topic so the RPC can return only
|
|
87
|
+
* matching logs cheaply. We chunk by `scanChunkSize` to stay under
|
|
88
|
+
* provider log-limit caps. The mint is one-shot per owner in our flow,
|
|
89
|
+
* so we expect 0 or 1 hits.
|
|
90
|
+
*/
|
|
91
|
+
export declare function findAgentIdForOwner(publicClient: PublicClient, identityRegistry: Address, owner: Address, options?: {
|
|
92
|
+
fromBlock?: bigint;
|
|
93
|
+
chunkSize?: bigint;
|
|
94
|
+
}): Promise<{
|
|
95
|
+
agentId: string;
|
|
96
|
+
agentURI: string;
|
|
97
|
+
txHash: string;
|
|
98
|
+
} | null>;
|
|
99
|
+
/**
|
|
100
|
+
* Backfill `agent_id` on every service whose state is `complete` but
|
|
101
|
+
* which has no persisted agentId.
|
|
102
|
+
*
|
|
103
|
+
* Behaviour:
|
|
104
|
+
* - `state == 'complete' && agent_id == null` → migrated (recover existing
|
|
105
|
+
* NFT from chain if the agent EOA already owns one, else mint a new one).
|
|
106
|
+
* - `state == 'complete' && agent_id != null` → skipped.
|
|
107
|
+
* - any other step → ignored (the normal `stepRegisterAgent` path handles
|
|
108
|
+
* them when bootstrap resumes).
|
|
109
|
+
*
|
|
110
|
+
* Failures are isolated per service; one mint reverting does not abort
|
|
111
|
+
* the rest of the migration.
|
|
112
|
+
*/
|
|
113
|
+
export declare function migrateAgentIds(deps: MigrateAgentIdsDeps): Promise<MigrateAgentIdsResult>;
|
|
114
|
+
/**
|
|
115
|
+
* Convenience wrapper: build deps from a config-shaped object + password
|
|
116
|
+
* and run the migration. Used by main.ts (daemon startup) and the CLI
|
|
117
|
+
* subcommand. Tests call `migrateAgentIds` directly with mocked deps.
|
|
118
|
+
*/
|
|
119
|
+
export interface RunLegacyAgentIdMigrationOptions {
|
|
120
|
+
earningDir: string;
|
|
121
|
+
network: JinnOnchainNetwork;
|
|
122
|
+
rpcUrl: string;
|
|
123
|
+
password: string;
|
|
124
|
+
testnetL2DeploymentPath?: string;
|
|
125
|
+
testnetL2TokenDeploymentPath?: string;
|
|
126
|
+
testnetMechDeploymentPath?: string;
|
|
127
|
+
testnetStolasDeploymentPath?: string;
|
|
128
|
+
testnetClaimRegistryDeploymentPath?: string;
|
|
129
|
+
}
|
|
130
|
+
export declare function runLegacyAgentIdMigration(options: RunLegacyAgentIdMigrationOptions): Promise<MigrateAgentIdsResult>;
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Legacy backfill: ERC-8004 IdentityRegistry mint for `complete` services
|
|
3
|
+
* that pre-date jinn-mono-j07.
|
|
4
|
+
*
|
|
5
|
+
* j07 added an `agent_registered` step to the bootstrap state machine,
|
|
6
|
+
* slotted between `mech_deployed` and `complete`. Operators that completed
|
|
7
|
+
* bootstrap BEFORE j07 landed have `state == 'complete' && agent_id == null`
|
|
8
|
+
* and are stuck — they cannot publish per-execution metadata via
|
|
9
|
+
* `setMetadata` (jinn-mono-3zk wires that, but it is gated on a non-null
|
|
10
|
+
* `agent_id`).
|
|
11
|
+
*
|
|
12
|
+
* This module detects such services and runs the agent-registration mint
|
|
13
|
+
* idempotently for each. It is safe to re-run: services that already have
|
|
14
|
+
* an `agent_id` are skipped, and a chain-side lookup recovers the existing
|
|
15
|
+
* agentId for any operator whose state file was lost but whose Safe still
|
|
16
|
+
* owns the NFT (per the entity-model decision record §4.1, the operator
|
|
17
|
+
* agent NFT is stable across executions / re-stakes — we MUST never
|
|
18
|
+
* mint a duplicate).
|
|
19
|
+
*
|
|
20
|
+
* Wired in two places:
|
|
21
|
+
* - daemon startup (`main.ts` after `bootstrap`), gated by
|
|
22
|
+
* `runLegacyMigrations` config flag (default true)
|
|
23
|
+
* - explicit CLI subcommand `jinn migrate-agent-id`
|
|
24
|
+
*
|
|
25
|
+
* Tracked as jinn-mono-jgp.
|
|
26
|
+
*/
|
|
27
|
+
import { decodeEventLog, encodeFunctionData, getAddress, parseAbiItem, } from 'viem';
|
|
28
|
+
import { EVENT_TOPICS, IDENTITY_REGISTRY_ABI, IDENTITY_REGISTRY_ADDRESSES, getChainConfig, } from './contracts.js';
|
|
29
|
+
import { FleetStateStore } from './store.js';
|
|
30
|
+
import { createJinnPublicClient, createJinnWalletClient, } from './viem-clients.js';
|
|
31
|
+
import { decryptMnemonic, deriveAgentSigner, } from './wallet.js';
|
|
32
|
+
import { viemSendTransactionWithRetry, waitForTransactionReceiptWithRetry, } from '../tx-retry.js';
|
|
33
|
+
const REGISTERED_TOPIC = EVENT_TOPICS.Registered;
|
|
34
|
+
/**
|
|
35
|
+
* Typed `Registered` event item for `publicClient.getLogs({ event, args })`.
|
|
36
|
+
* The runtime topic hash is identical to `EVENT_TOPICS.Registered` (both are
|
|
37
|
+
* `keccak256(stringToBytes('Registered(uint256,string,address)'))`).
|
|
38
|
+
*/
|
|
39
|
+
const REGISTERED_EVENT = parseAbiItem('event Registered(uint256 indexed agentId, string agentURI, address indexed owner)');
|
|
40
|
+
/**
|
|
41
|
+
* Scan past `Registered(uint256 indexed agentId, string agentURI, address indexed owner)`
|
|
42
|
+
* events on the IdentityRegistry, filtered by indexed `owner`, and return
|
|
43
|
+
* the most recent agentId minted for that owner (or null if none).
|
|
44
|
+
*
|
|
45
|
+
* This is the duplicate-mint guard: per DR §4.1, the operator agent NFT
|
|
46
|
+
* is stable across executions and survives Safe rotation. If an
|
|
47
|
+
* operator's state file lost the `agent_id` (e.g. corrupted backup),
|
|
48
|
+
* we MUST recover the existing token rather than minting a new one.
|
|
49
|
+
*
|
|
50
|
+
* The scan uses the indexed `owner` topic so the RPC can return only
|
|
51
|
+
* matching logs cheaply. We chunk by `scanChunkSize` to stay under
|
|
52
|
+
* provider log-limit caps. The mint is one-shot per owner in our flow,
|
|
53
|
+
* so we expect 0 or 1 hits.
|
|
54
|
+
*/
|
|
55
|
+
export async function findAgentIdForOwner(publicClient, identityRegistry, owner, options = {}) {
|
|
56
|
+
const fromBlock = options.fromBlock ?? 0n;
|
|
57
|
+
const chunkSize = options.chunkSize ?? 9999n;
|
|
58
|
+
const latest = await publicClient.getBlockNumber();
|
|
59
|
+
for (let start = fromBlock; start <= latest; start += chunkSize + 1n) {
|
|
60
|
+
const end = start + chunkSize > latest ? latest : start + chunkSize;
|
|
61
|
+
const logs = await publicClient.getLogs({
|
|
62
|
+
address: identityRegistry,
|
|
63
|
+
event: REGISTERED_EVENT,
|
|
64
|
+
args: { owner },
|
|
65
|
+
fromBlock: start,
|
|
66
|
+
toBlock: end,
|
|
67
|
+
});
|
|
68
|
+
for (const log of logs) {
|
|
69
|
+
const args = log.args;
|
|
70
|
+
if (args.agentId === undefined)
|
|
71
|
+
continue;
|
|
72
|
+
return {
|
|
73
|
+
agentId: args.agentId.toString(),
|
|
74
|
+
agentURI: args.agentURI ?? '',
|
|
75
|
+
txHash: log.transactionHash ?? '',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Parse `agentId` from a fresh `IdentityRegistry.register()` receipt.
|
|
83
|
+
* Mirrors `FleetBootstrapper.parseAgentIdFromReceipt` (private) so we
|
|
84
|
+
* don't have to re-export the bootstrap class for tests.
|
|
85
|
+
*/
|
|
86
|
+
function parseAgentIdFromReceipt(receipt, identityRegistry) {
|
|
87
|
+
const target = identityRegistry.toLowerCase();
|
|
88
|
+
for (const log of receipt.logs) {
|
|
89
|
+
if (log.address.toLowerCase() !== target)
|
|
90
|
+
continue;
|
|
91
|
+
if (log.topics[0] !== REGISTERED_TOPIC)
|
|
92
|
+
continue;
|
|
93
|
+
try {
|
|
94
|
+
const decoded = decodeEventLog({
|
|
95
|
+
abi: IDENTITY_REGISTRY_ABI,
|
|
96
|
+
data: log.data,
|
|
97
|
+
topics: log.topics,
|
|
98
|
+
strict: false,
|
|
99
|
+
});
|
|
100
|
+
if (decoded.eventName !== 'Registered')
|
|
101
|
+
continue;
|
|
102
|
+
if (!('agentId' in decoded.args))
|
|
103
|
+
continue;
|
|
104
|
+
return {
|
|
105
|
+
agentId: decoded.args.agentId.toString(),
|
|
106
|
+
agentURI: 'agentURI' in decoded.args ? String(decoded.args.agentURI ?? '') : '',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Not a matching event
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Mint a fresh ERC-8004 agent NFT for the agent EOA derived at the
|
|
117
|
+
* given fleet service index. Used only when the chain-side lookup
|
|
118
|
+
* confirms no existing token. Returns the parsed agentId + tx hash.
|
|
119
|
+
*
|
|
120
|
+
* Mirrors `FleetBootstrapper.stepRegisterAgent` (private), but does
|
|
121
|
+
* NOT mutate the persisted `step` — the migration writes only to the
|
|
122
|
+
* agent_id / agent_uri / identity_registry_address / agent_registered_tx
|
|
123
|
+
* fields and leaves `step` at `complete` so the daemon picks up
|
|
124
|
+
* normally.
|
|
125
|
+
*/
|
|
126
|
+
async function mintAgentNftForOwner(publicClient, walletClient, account, identityRegistry) {
|
|
127
|
+
const agentURI = '';
|
|
128
|
+
const data = encodeFunctionData({
|
|
129
|
+
abi: IDENTITY_REGISTRY_ABI,
|
|
130
|
+
functionName: 'register',
|
|
131
|
+
args: [agentURI],
|
|
132
|
+
});
|
|
133
|
+
const txHash = await viemSendTransactionWithRetry(walletClient, publicClient, {
|
|
134
|
+
account: account,
|
|
135
|
+
to: identityRegistry,
|
|
136
|
+
data,
|
|
137
|
+
});
|
|
138
|
+
const receipt = await waitForTransactionReceiptWithRetry(publicClient, txHash);
|
|
139
|
+
if (receipt.status !== 'success') {
|
|
140
|
+
throw new Error(`IdentityRegistry.register() tx reverted (tx: ${txHash})`);
|
|
141
|
+
}
|
|
142
|
+
const parsed = parseAgentIdFromReceipt(receipt, identityRegistry);
|
|
143
|
+
if (parsed === null) {
|
|
144
|
+
throw new Error(`IdentityRegistry.register() succeeded but Registered event was not found (tx: ${txHash})`);
|
|
145
|
+
}
|
|
146
|
+
return { agentId: parsed.agentId, agentURI: parsed.agentURI, txHash };
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Backfill `agent_id` on every service whose state is `complete` but
|
|
150
|
+
* which has no persisted agentId.
|
|
151
|
+
*
|
|
152
|
+
* Behaviour:
|
|
153
|
+
* - `state == 'complete' && agent_id == null` → migrated (recover existing
|
|
154
|
+
* NFT from chain if the agent EOA already owns one, else mint a new one).
|
|
155
|
+
* - `state == 'complete' && agent_id != null` → skipped.
|
|
156
|
+
* - any other step → ignored (the normal `stepRegisterAgent` path handles
|
|
157
|
+
* them when bootstrap resumes).
|
|
158
|
+
*
|
|
159
|
+
* Failures are isolated per service; one mint reverting does not abort
|
|
160
|
+
* the rest of the migration.
|
|
161
|
+
*/
|
|
162
|
+
export async function migrateAgentIds(deps) {
|
|
163
|
+
const { stateStore, config, network, mnemonic } = deps;
|
|
164
|
+
const identityRegistry = config.identityRegistry
|
|
165
|
+
?? IDENTITY_REGISTRY_ADDRESSES[config.chainId];
|
|
166
|
+
if (!identityRegistry) {
|
|
167
|
+
throw new Error(`IdentityRegistry address not configured for chainId=${config.chainId}; ` +
|
|
168
|
+
`update IDENTITY_REGISTRY_ADDRESSES in earning/contracts.ts.`);
|
|
169
|
+
}
|
|
170
|
+
const registryAddr = getAddress(identityRegistry);
|
|
171
|
+
const publicClient = deps.publicClient ?? createJinnPublicClient(config.rpcUrl, network);
|
|
172
|
+
const state = await stateStore.load(network);
|
|
173
|
+
const migrated = [];
|
|
174
|
+
const skipped = [];
|
|
175
|
+
const failed = [];
|
|
176
|
+
for (const svc of state.services) {
|
|
177
|
+
if (svc.step !== 'complete')
|
|
178
|
+
continue;
|
|
179
|
+
if (svc.agent_id) {
|
|
180
|
+
skipped.push(svc);
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
const agentSigner = deriveAgentSigner(mnemonic, svc.index);
|
|
185
|
+
const agentEoa = getAddress(agentSigner.address);
|
|
186
|
+
// 1. Duplicate-mint guard: scan chain for an existing Registered
|
|
187
|
+
// event whose `owner` is this agent EOA. If found, recover
|
|
188
|
+
// instead of minting (DR §4.1).
|
|
189
|
+
const existing = await findAgentIdForOwner(publicClient, registryAddr, agentEoa, {
|
|
190
|
+
fromBlock: deps.scanFromBlock,
|
|
191
|
+
chunkSize: deps.scanChunkSize,
|
|
192
|
+
});
|
|
193
|
+
let agentId;
|
|
194
|
+
let agentURI;
|
|
195
|
+
let txHash;
|
|
196
|
+
if (existing) {
|
|
197
|
+
console.error(`[migrate-agent-id] Service ${svc.index}: recovered existing agentId=${existing.agentId} ` +
|
|
198
|
+
`for agent EOA ${agentEoa} (tx=${existing.txHash || 'unknown'}); no mint needed.`);
|
|
199
|
+
agentId = existing.agentId;
|
|
200
|
+
agentURI = existing.agentURI;
|
|
201
|
+
txHash = existing.txHash;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
console.error(`[migrate-agent-id] Service ${svc.index}: minting ERC-8004 agent NFT ` +
|
|
205
|
+
`(IdentityRegistry=${registryAddr}, agentEOA=${agentEoa})`);
|
|
206
|
+
const walletClient = deps.walletClientFactory?.(agentSigner)
|
|
207
|
+
?? createJinnWalletClient(config.rpcUrl, network, agentSigner);
|
|
208
|
+
const minted = await mintAgentNftForOwner(publicClient, walletClient, agentSigner, registryAddr);
|
|
209
|
+
agentId = minted.agentId;
|
|
210
|
+
agentURI = minted.agentURI;
|
|
211
|
+
txHash = minted.txHash;
|
|
212
|
+
console.error(`[migrate-agent-id] Service ${svc.index}: minted agentId=${agentId} (tx=${txHash})`);
|
|
213
|
+
}
|
|
214
|
+
// Persist immediately. We deliberately leave `step: 'complete'` —
|
|
215
|
+
// the migration's job is purely to backfill the agent fields, not
|
|
216
|
+
// to rewind the state machine. The daemon (main.ts) reads agent_id
|
|
217
|
+
// from the loaded state and wires the IdentityPublisher accordingly.
|
|
218
|
+
await stateStore.updateService(svc.index, {
|
|
219
|
+
agent_id: agentId,
|
|
220
|
+
agent_uri: agentURI,
|
|
221
|
+
identity_registry_address: registryAddr,
|
|
222
|
+
agent_registered_tx: txHash || null,
|
|
223
|
+
// Keep safe_bound_to_agent at its persisted value (default false);
|
|
224
|
+
// setAgentWallet is tracked by jinn-mono-aev.
|
|
225
|
+
});
|
|
226
|
+
const refreshed = (await stateStore.load(network)).services.find(s => s.index === svc.index);
|
|
227
|
+
if (refreshed) {
|
|
228
|
+
migrated.push(refreshed);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
233
|
+
console.error(`[migrate-agent-id] Service ${svc.index}: migration failed — ${message}`);
|
|
234
|
+
failed.push({ service: svc, error: message });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return { migrated, skipped, failed };
|
|
238
|
+
}
|
|
239
|
+
export async function runLegacyAgentIdMigration(options) {
|
|
240
|
+
const stateStore = new FleetStateStore(options.earningDir);
|
|
241
|
+
const config = getChainConfig(options.network, {
|
|
242
|
+
testnetL2DeploymentPath: options.testnetL2DeploymentPath,
|
|
243
|
+
testnetL2TokenDeploymentPath: options.testnetL2TokenDeploymentPath,
|
|
244
|
+
testnetMechDeploymentPath: options.testnetMechDeploymentPath,
|
|
245
|
+
testnetStolasDeploymentPath: options.testnetStolasDeploymentPath,
|
|
246
|
+
testnetClaimRegistryDeploymentPath: options.testnetClaimRegistryDeploymentPath,
|
|
247
|
+
});
|
|
248
|
+
config.rpcUrl = options.rpcUrl;
|
|
249
|
+
const mnemonic = await decryptMnemonic(await stateStore.loadMnemonicKeystore(), options.password);
|
|
250
|
+
return migrateAgentIds({
|
|
251
|
+
stateStore,
|
|
252
|
+
config,
|
|
253
|
+
network: options.network,
|
|
254
|
+
mnemonic,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=migrate-agent-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-agent-id.js","sourceRoot":"","sources":["../../src/earning/migrate-agent-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,13 @@ import type { PublicClient } from 'viem';
|
|
|
14
14
|
* address that will no longer be tracked so we can sweep it first.
|
|
15
15
|
*/
|
|
16
16
|
export declare function previousSafeBeingAbandoned(svc: ServiceState, patch: Partial<ServiceState>): string | null;
|
|
17
|
+
/** An ERC-20 token to sweep from the abandoned Safe. */
|
|
18
|
+
export interface Erc20SweepToken {
|
|
19
|
+
/** Checksummed token contract address. */
|
|
20
|
+
address: string;
|
|
21
|
+
/** Human-readable symbol for log messages. */
|
|
22
|
+
symbol: string;
|
|
23
|
+
}
|
|
17
24
|
export interface SweepOrphanedServiceFundsParams {
|
|
18
25
|
rpcUrl: string;
|
|
19
26
|
network: JinnOnchainNetwork;
|
|
@@ -25,6 +32,13 @@ export interface SweepOrphanedServiceFundsParams {
|
|
|
25
32
|
agentAddress: string;
|
|
26
33
|
abandonedSafeAddress: string;
|
|
27
34
|
minAgentReserveWei: bigint;
|
|
35
|
+
/**
|
|
36
|
+
* ERC-20 tokens to sweep from the abandoned Safe (e.g. OLAS bond).
|
|
37
|
+
* Each token with a non-zero balance on the Safe will be transferred
|
|
38
|
+
* to `masterAddress` via Safe.execTransaction. If omitted, no ERC-20
|
|
39
|
+
* sweep is attempted.
|
|
40
|
+
*/
|
|
41
|
+
erc20Tokens?: Erc20SweepToken[];
|
|
28
42
|
}
|
|
29
43
|
/**
|
|
30
44
|
* Sweep ETH from an abandoned deployed Safe (via Safe.execTransaction) and excess
|