@jinn-network/client 0.1.5 → 0.1.6-canary.0b4ff7f9
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 +98 -0
- package/dist/adapters/mech/adapter.js +7 -7
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/ipfs-pinfile.d.ts +22 -0
- package/dist/adapters/mech/ipfs-pinfile.js +54 -0
- package/dist/adapters/mech/ipfs-pinfile.js.map +1 -0
- package/dist/adapters/mech/ipfs.d.ts +1 -0
- package/dist/adapters/mech/ipfs.js +24 -1
- package/dist/adapters/mech/ipfs.js.map +1 -1
- package/dist/api/bootstrap-endpoint.js +2 -0
- package/dist/api/bootstrap-endpoint.js.map +1 -1
- package/dist/api/discovery-endpoint.d.ts +18 -0
- package/dist/api/discovery-endpoint.js +65 -0
- package/dist/api/discovery-endpoint.js.map +1 -0
- package/dist/api/fleet-build.d.ts +7 -0
- package/dist/api/fleet-build.js +6 -1
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/harness-readiness-endpoint.d.ts +13 -0
- package/dist/api/harness-readiness-endpoint.js +15 -0
- package/dist/api/harness-readiness-endpoint.js.map +1 -0
- package/dist/api/hermes-doctor-endpoint.d.ts +26 -0
- package/dist/api/hermes-doctor-endpoint.js +29 -0
- package/dist/api/hermes-doctor-endpoint.js.map +1 -0
- package/dist/api/server.d.ts +21 -0
- package/dist/api/server.js +22 -0
- package/dist/api/server.js.map +1 -1
- package/dist/build-info.json +4 -4
- package/dist/build-meta.json +1 -1
- package/dist/cli/commands/create.d.ts +5 -3
- package/dist/cli/commands/create.js +101 -36
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/solver-nets.d.ts +19 -0
- package/dist/cli/commands/solver-nets.js +140 -2
- package/dist/cli/commands/solver-nets.js.map +1 -1
- package/dist/cli/commands/solver-plugins-publish.d.ts +31 -0
- package/dist/cli/commands/solver-plugins-publish.js +169 -0
- package/dist/cli/commands/solver-plugins-publish.js.map +1 -0
- package/dist/cli/commands/solver-plugins-revoke.d.ts +15 -0
- package/dist/cli/commands/solver-plugins-revoke.js +91 -0
- package/dist/cli/commands/solver-plugins-revoke.js.map +1 -0
- package/dist/cli/commands/solver-plugins.d.ts +50 -6
- package/dist/cli/commands/solver-plugins.js +205 -68
- package/dist/cli/commands/solver-plugins.js.map +1 -1
- package/dist/config.d.ts +27 -0
- package/dist/config.js +24 -0
- package/dist/config.js.map +1 -1
- package/dist/conformance/checks/hash-signature.js +6 -2
- package/dist/conformance/checks/hash-signature.js.map +1 -1
- package/dist/conformance/checks/payload.js +4 -2
- package/dist/conformance/checks/payload.js.map +1 -1
- package/dist/conformance/checks/verdict.d.ts +10 -10
- package/dist/conformance/checks/verdict.js +16 -15
- package/dist/conformance/checks/verdict.js.map +1 -1
- package/dist/conformance/harness.d.ts +1 -1
- package/dist/conformance/harness.js +16 -9
- package/dist/conformance/harness.js.map +1 -1
- package/dist/conformance/types.d.ts +10 -3
- package/dist/conformance/types.js.map +1 -1
- package/dist/corpus/acquire.d.ts +1 -3
- package/dist/corpus/acquire.js.map +1 -1
- package/dist/corpus/envelope-projection.d.ts +1 -1
- package/dist/corpus/envelope-projection.js +14 -7
- package/dist/corpus/envelope-projection.js.map +1 -1
- package/dist/corpus/index.d.ts +2 -1
- package/dist/corpus/index.js.map +1 -1
- package/dist/corpus/prediction-brier-scoreboard-report.js +1 -1
- package/dist/corpus/prediction-brier-scoreboard-report.js.map +1 -1
- package/dist/corpus/prediction-brier-scoreboard.js +3 -1
- package/dist/corpus/prediction-brier-scoreboard.js.map +1 -1
- package/dist/corpus/types.d.ts +2 -2
- package/dist/daemon/daemon.d.ts +17 -1
- package/dist/daemon/daemon.js +15 -0
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/freeze-fence.js +6 -3
- package/dist/daemon/freeze-fence.js.map +1 -1
- package/dist/daemon/readiness-gate.d.ts +30 -0
- package/dist/daemon/readiness-gate.js +31 -0
- package/dist/daemon/readiness-gate.js.map +1 -0
- package/dist/dashboard/assets/{index-D_NMfDfV.css → index-B4sTrvQD.css} +1 -1
- package/dist/dashboard/assets/index-C5j0ZJWS.js +140 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/discovery/http.js +121 -0
- package/dist/discovery/http.js.map +1 -1
- package/dist/discovery/onchain.js +11 -0
- package/dist/discovery/onchain.js.map +1 -1
- package/dist/discovery/types.d.ts +112 -0
- package/dist/discovery/types.js.map +1 -1
- package/dist/discovery/with-fallback.js +9 -0
- package/dist/discovery/with-fallback.js.map +1 -1
- package/dist/earning/agent-wallet-binding.d.ts +20 -1
- package/dist/earning/agent-wallet-binding.js +54 -16
- package/dist/earning/agent-wallet-binding.js.map +1 -1
- package/dist/earning/bootstrap.d.ts +55 -0
- package/dist/earning/bootstrap.js +376 -20
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/store.js +48 -1
- package/dist/earning/store.js.map +1 -1
- package/dist/earning/types.d.ts +30 -0
- package/dist/earning/types.js +37 -0
- package/dist/earning/types.js.map +1 -1
- package/dist/erc8004/abis.d.ts +64 -0
- package/dist/erc8004/abis.js +48 -0
- package/dist/erc8004/abis.js.map +1 -1
- package/dist/erc8004/plugin-registry.d.ts +102 -0
- package/dist/erc8004/plugin-registry.js +165 -0
- package/dist/erc8004/plugin-registry.js.map +1 -0
- package/dist/harnesses/engine/engine.js +15 -3
- package/dist/harnesses/engine/engine.js.map +1 -1
- package/dist/harnesses/engine/envelope-assembly.d.ts +2 -2
- package/dist/harnesses/engine/envelope-assembly.js +4 -2
- package/dist/harnesses/engine/envelope-assembly.js.map +1 -1
- package/dist/harnesses/freeze.d.ts +4 -1
- package/dist/harnesses/freeze.js +12 -2
- package/dist/harnesses/freeze.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/index.d.ts +4 -1
- package/dist/harnesses/impls/claude-mcp-prediction/index.js +7 -2
- package/dist/harnesses/impls/claude-mcp-prediction/index.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.d.ts +4 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js +7 -2
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js.map +1 -1
- package/dist/harnesses/impls/evaluation-context.d.ts +15 -4
- package/dist/harnesses/impls/evaluation-context.js +24 -8
- package/dist/harnesses/impls/evaluation-context.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/adapter.d.ts +34 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js +184 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +18 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js +231 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/config-builder.d.ts +49 -0
- package/dist/harnesses/impls/hermes-agent/config-builder.js +104 -0
- package/dist/harnesses/impls/hermes-agent/config-builder.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/harness.d.ts +30 -0
- package/dist/harnesses/impls/hermes-agent/harness.js +52 -0
- package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/index.d.ts +5 -0
- package/dist/harnesses/impls/hermes-agent/index.js +7 -0
- package/dist/harnesses/impls/hermes-agent/index.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/prompt.d.ts +15 -0
- package/dist/harnesses/impls/hermes-agent/prompt.js +37 -0
- package/dist/harnesses/impls/hermes-agent/prompt.js.map +1 -0
- package/dist/harnesses/impls/index.d.ts +6 -0
- package/dist/harnesses/impls/index.js +17 -4
- package/dist/harnesses/impls/index.js.map +1 -1
- package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-code.js +13 -34
- package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -0
- package/dist/harnesses/impls/learner/adapters/codex-workspace.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/harness.d.ts +9 -3
- package/dist/harnesses/impls/{claude-code-learner → learner}/harness.js +24 -1
- package/dist/harnesses/impls/learner/harness.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/harvest.js +15 -3
- package/dist/harnesses/impls/learner/harvest.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/index.d.ts +5 -5
- package/dist/harnesses/impls/{claude-code-learner → learner}/index.js +4 -4
- package/dist/harnesses/impls/learner/index.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/plugin-path.d.ts +4 -4
- package/dist/harnesses/impls/{claude-code-learner → learner}/plugin-path.js +7 -7
- package/dist/harnesses/impls/learner/plugin-path.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/restoration-patch.js +3 -1
- package/dist/harnesses/impls/learner/restoration-patch.js.map +1 -0
- package/dist/harnesses/impls/learner/test-utils/fake-plugin-outputs.js.map +1 -0
- package/dist/harnesses/impls/learner/test-utils/noop-adapter.js.map +1 -0
- package/dist/harnesses/impls/{claude-code-learner → learner}/types.d.ts +12 -2
- package/dist/harnesses/impls/learner/types.js.map +1 -0
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js +13 -12
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js +7 -7
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.d.ts +3 -3
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.js +7 -6
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/parse-submission.js.map +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/checks/integrity.js +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/index.js +11 -10
- package/dist/harnesses/impls/prediction-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-v1-evaluator/index.js +11 -10
- package/dist/harnesses/impls/prediction-v1-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.d.ts +1 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +10 -2
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.d.ts +24 -5
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +104 -4
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.d.ts +9 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +25 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
- package/dist/harnesses/names.d.ts +1 -0
- package/dist/harnesses/names.js +3 -0
- package/dist/harnesses/names.js.map +1 -1
- package/dist/harnesses/readiness-registry.d.ts +48 -0
- package/dist/harnesses/readiness-registry.js +136 -0
- package/dist/harnesses/readiness-registry.js.map +1 -0
- package/dist/harnesses/types.d.ts +7 -0
- package/dist/main.d.ts +14 -0
- package/dist/main.js +70 -35
- package/dist/main.js.map +1 -1
- package/dist/mcp/server.js +14 -13
- package/dist/mcp/server.js.map +1 -1
- package/dist/preflight/claude-auth.d.ts +18 -0
- package/dist/preflight/claude-auth.js +38 -0
- package/dist/preflight/claude-auth.js.map +1 -1
- package/dist/scripts/donation-consumption-acceptance.js +1 -1
- package/dist/scripts/donation-consumption-acceptance.js.map +1 -1
- package/dist/scripts/swe-rebench-v2-known-bad.json +12 -0
- package/dist/scripts/swe-rebench-v2-seed-pool.json +26 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.d.ts +52 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.js +76 -0
- package/dist/solver-types/_swe-rebench-v2-substrate.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +38 -12
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js +136 -27
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
- package/dist/solver-types/swe-rebench-v2-auto.d.ts +6 -0
- package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
- package/dist/solver-types/swe-rebench-v2.d.ts +1 -0
- package/dist/solver-types/swe-rebench-v2.js +19 -6
- package/dist/solver-types/swe-rebench-v2.js.map +1 -1
- package/dist/store/store.js +12 -4
- package/dist/store/store.js.map +1 -1
- package/dist/templates/plugins/runtime-plugin/.mcp.json.tmpl +8 -0
- package/dist/templates/plugins/runtime-plugin/README.md.tmpl +30 -0
- package/dist/templates/plugins/runtime-plugin/gitignore.tmpl +3 -0
- package/dist/templates/plugins/runtime-plugin/jinn.plugin.json.tmpl +21 -0
- package/dist/templates/plugins/runtime-plugin/mcp/server.mjs.tmpl +33 -0
- package/dist/templates/plugins/runtime-plugin/package.json.tmpl +15 -0
- package/dist/templates/plugins/runtime-plugin/test/plugin.test.ts.tmpl +35 -0
- package/dist/templates/plugins/runtime-plugin/tsconfig.json.tmpl +11 -0
- package/dist/templates/plugins/solver-type-plugin/README.md.tmpl +35 -0
- package/dist/templates/plugins/solver-type-plugin/gitignore.tmpl +3 -0
- package/dist/templates/plugins/solver-type-plugin/jinn.plugin.json.tmpl +11 -0
- package/dist/templates/plugins/solver-type-plugin/package.json.tmpl +15 -0
- package/dist/templates/plugins/solver-type-plugin/skills/example/SKILL.md.tmpl +10 -0
- package/dist/templates/plugins/solver-type-plugin/test/plugin.test.ts.tmpl +25 -0
- package/dist/templates/plugins/solver-type-plugin/tsconfig.json.tmpl +11 -0
- package/dist/types/envelope.d.ts +28 -21
- package/dist/types/envelope.js +8 -3
- package/dist/types/envelope.js.map +1 -1
- package/dist/types/payloads/index.d.ts +2 -2
- package/dist/types/payloads/index.js +13 -12
- package/dist/types/payloads/index.js.map +1 -1
- package/dist/types/payloads/portfolio-v0.d.ts +60 -10
- package/dist/types/payloads/portfolio-v0.js +16 -6
- package/dist/types/payloads/portfolio-v0.js.map +1 -1
- package/dist/types/payloads/prediction-apy-v0.d.ts +52 -10
- package/dist/types/payloads/prediction-apy-v0.js +16 -6
- package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
- package/dist/types/payloads/prediction-v0.d.ts +49 -10
- package/dist/types/payloads/prediction-v0.js +16 -6
- package/dist/types/payloads/prediction-v0.js.map +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +45 -6
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +16 -6
- package/dist/x402/handler.js +51 -20
- package/dist/x402/handler.js.map +1 -1
- package/package.json +8 -3
- package/plugins/swe-rebench-v2-diffmin/.claude-plugin/plugin.json +5 -0
- package/plugins/swe-rebench-v2-diffmin/.mcp.json +8 -0
- package/plugins/swe-rebench-v2-diffmin/README.md +69 -0
- package/plugins/swe-rebench-v2-diffmin/jinn.plugin.json +12 -0
- package/plugins/swe-rebench-v2-diffmin/mcp/diff-stats-server.mjs +72 -0
- package/plugins/swe-rebench-v2-diffmin/mcp/diff-stats.mjs +48 -0
- package/plugins/swe-rebench-v2-diffmin/package.json +19 -0
- package/plugins/swe-rebench-v2-diffmin/skills/diffmin/SKILL.md +116 -0
- package/plugins/swe-rebench-v2-diffmin/skills/test-map/SKILL.md +126 -0
- package/plugins/swe-rebench-v2-diffmin/test/diff-stats.test.ts +62 -0
- package/plugins/swe-rebench-v2-diffmin/test/manifest.test.ts +53 -0
- package/plugins/swe-rebench-v2-diffmin/tsconfig.json +12 -0
- package/plugins/swe-rebench-v2-runtime/README.md +13 -0
- package/plugins/swe-rebench-v2-runtime/skills/orient/SKILL.md +7 -3
- package/plugins/swe-rebench-v2-runtime/skills/plan/SKILL.md +6 -17
- package/templates/plugins/runtime-plugin/.mcp.json.tmpl +8 -0
- package/templates/plugins/runtime-plugin/README.md.tmpl +30 -0
- package/templates/plugins/runtime-plugin/gitignore.tmpl +3 -0
- package/templates/plugins/runtime-plugin/jinn.plugin.json.tmpl +21 -0
- package/templates/plugins/runtime-plugin/mcp/server.mjs.tmpl +33 -0
- package/templates/plugins/runtime-plugin/package.json.tmpl +15 -0
- package/templates/plugins/runtime-plugin/test/plugin.test.ts.tmpl +35 -0
- package/templates/plugins/runtime-plugin/tsconfig.json.tmpl +11 -0
- package/templates/plugins/solver-type-plugin/README.md.tmpl +35 -0
- package/templates/plugins/solver-type-plugin/gitignore.tmpl +3 -0
- package/templates/plugins/solver-type-plugin/jinn.plugin.json.tmpl +11 -0
- package/templates/plugins/solver-type-plugin/package.json.tmpl +15 -0
- package/templates/plugins/solver-type-plugin/skills/example/SKILL.md.tmpl +10 -0
- package/templates/plugins/solver-type-plugin/test/plugin.test.ts.tmpl +25 -0
- package/templates/plugins/solver-type-plugin/tsconfig.json.tmpl +11 -0
- package/dist/dashboard/assets/index-BjtltOGc.js +0 -76
- package/dist/harnesses/impls/claude-code-learner/adapters/claude-code.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/adapters/codex-code.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/adapters/codex-workspace.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/harness.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/harvest.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/index.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/plugin-path.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/restoration-patch.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/test-utils/fake-plugin-outputs.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/test-utils/noop-adapter.js.map +0 -1
- package/dist/harnesses/impls/claude-code-learner/types.js.map +0 -1
- package/dist/preflight/claude-required.d.ts +0 -8
- package/dist/preflight/claude-required.js +0 -17
- package/dist/preflight/claude-required.js.map +0 -1
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/claude-code.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/claude-code.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-code.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-workspace.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/adapters/codex-workspace.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/harvest.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/restoration-patch.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/fake-plugin-outputs.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/fake-plugin-outputs.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/noop-adapter.d.ts +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/test-utils/noop-adapter.js +0 -0
- /package/dist/harnesses/impls/{claude-code-learner → learner}/types.js +0 -0
- /package/plugins/{claude-code-learner → learner}/.claude-plugin/plugin.json +0 -0
- /package/plugins/{claude-code-learner → learner}/.codex-plugin/plugin.json +0 -0
- /package/plugins/{claude-code-learner → learner}/AGENTS.md +0 -0
- /package/plugins/{claude-code-learner → learner}/CLAUDE.md +0 -0
- /package/plugins/{claude-code-learner → learner}/README.md +0 -0
- /package/plugins/{claude-code-learner → learner}/hooks/hooks.json +0 -0
- /package/plugins/{claude-code-learner → learner}/hooks/session-start +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/SKILL.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/analyst-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/consolidator-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/explorer-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/planner-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/promoter-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/step-worker-prompt.md +0 -0
- /package/plugins/{claude-code-learner → learner}/skills/learn/strategist-prompt.md +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import type { TaskSessionInputs } from '../learner/types.js';
|
|
3
|
+
import type { ConfigBuilderEnv } from './config-builder.js';
|
|
4
|
+
export interface HermesHarnessAdapterConfig {
|
|
5
|
+
hermesPath?: string;
|
|
6
|
+
hermesModel?: string;
|
|
7
|
+
hermesProvider?: string;
|
|
8
|
+
daemonApiUrl: string;
|
|
9
|
+
daemonApiToken: string;
|
|
10
|
+
corpusEnv: ConfigBuilderEnv['corpusEnv'];
|
|
11
|
+
storePath?: string;
|
|
12
|
+
/**
|
|
13
|
+
* The operator's real Hermes home — auth credentials are seeded from here
|
|
14
|
+
* into each per-Task `$HERMES_HOME`. Defaults to `process.env.HERMES_HOME`
|
|
15
|
+
* (if the operator customised it) or `~/.hermes`. Tests pass an empty dir to
|
|
16
|
+
* make the seed a no-op.
|
|
17
|
+
*/
|
|
18
|
+
operatorHermesHome?: string;
|
|
19
|
+
_spawnFn?: typeof spawn;
|
|
20
|
+
}
|
|
21
|
+
export declare class HermesHarnessAdapter {
|
|
22
|
+
readonly name = "hermes-agent";
|
|
23
|
+
private readonly hermesPath;
|
|
24
|
+
private readonly hermesModel;
|
|
25
|
+
private readonly hermesProvider;
|
|
26
|
+
private readonly daemonApiUrl;
|
|
27
|
+
private readonly daemonApiToken;
|
|
28
|
+
private readonly corpusEnv;
|
|
29
|
+
private readonly storePath;
|
|
30
|
+
private readonly operatorHermesHome;
|
|
31
|
+
private readonly spawnFn;
|
|
32
|
+
constructor(config: HermesHarnessAdapterConfig);
|
|
33
|
+
runTask(inputs: TaskSessionInputs): Promise<void>;
|
|
34
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
// client/src/harnesses/impls/hermes-agent/adapter.ts
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { createWriteStream, mkdirSync } from 'node:fs';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { finished } from 'node:stream/promises';
|
|
7
|
+
import { HERMES_AGENT_HARNESS } from '../../names.js';
|
|
8
|
+
import { writePerTaskHermesConfig } from './bootstrap.js';
|
|
9
|
+
import { buildInitialPrompt } from './prompt.js';
|
|
10
|
+
const ENV_ALLOWLIST = [
|
|
11
|
+
'PATH', 'HOME', 'USER', 'SHELL', 'LANG', 'TERM', 'TMPDIR',
|
|
12
|
+
'XDG_CONFIG_HOME', 'XDG_DATA_HOME', 'XDG_CACHE_HOME',
|
|
13
|
+
'NODE_PATH', 'NODE_OPTIONS', 'NPM_CONFIG_PREFIX',
|
|
14
|
+
];
|
|
15
|
+
function buildAgentEnv(extra) {
|
|
16
|
+
const env = {};
|
|
17
|
+
for (const key of ENV_ALLOWLIST) {
|
|
18
|
+
if (process.env[key])
|
|
19
|
+
env[key] = process.env[key];
|
|
20
|
+
}
|
|
21
|
+
return { ...env, ...extra };
|
|
22
|
+
}
|
|
23
|
+
export class HermesHarnessAdapter {
|
|
24
|
+
name = HERMES_AGENT_HARNESS;
|
|
25
|
+
hermesPath;
|
|
26
|
+
hermesModel;
|
|
27
|
+
hermesProvider;
|
|
28
|
+
daemonApiUrl;
|
|
29
|
+
daemonApiToken;
|
|
30
|
+
corpusEnv;
|
|
31
|
+
storePath;
|
|
32
|
+
operatorHermesHome;
|
|
33
|
+
spawnFn;
|
|
34
|
+
constructor(config) {
|
|
35
|
+
this.hermesPath = config.hermesPath ?? 'hermes';
|
|
36
|
+
this.hermesModel = config.hermesModel;
|
|
37
|
+
this.hermesProvider = config.hermesProvider;
|
|
38
|
+
this.daemonApiUrl = config.daemonApiUrl;
|
|
39
|
+
this.daemonApiToken = config.daemonApiToken;
|
|
40
|
+
this.corpusEnv = config.corpusEnv;
|
|
41
|
+
this.storePath = config.storePath;
|
|
42
|
+
this.operatorHermesHome =
|
|
43
|
+
config.operatorHermesHome ?? (process.env['HERMES_HOME']?.trim() || join(homedir(), '.hermes'));
|
|
44
|
+
this.spawnFn = config._spawnFn ?? spawn;
|
|
45
|
+
}
|
|
46
|
+
async runTask(inputs) {
|
|
47
|
+
const hermesHome = inputs.implStateDir;
|
|
48
|
+
const model = inputs.model ?? inputs.claudeModel ?? this.hermesModel;
|
|
49
|
+
// Step 1: bootstrap — seed auth from the operator's home, write config.yaml + .env.
|
|
50
|
+
//
|
|
51
|
+
// The MCP server (`client/src/mcp/server.ts`) reads task identity from a
|
|
52
|
+
// family of `DESIRED_STATE_*` env vars; without them, `submit_typed_payload`
|
|
53
|
+
// fails with `missing_solver_type` and `get_task` returns an empty record.
|
|
54
|
+
// Mirror what claude-code-learner / codex-code-learner adapters do.
|
|
55
|
+
const taskContextJson = (() => {
|
|
56
|
+
const ctx = inputs.taskBody?.['context'];
|
|
57
|
+
if (!ctx || typeof ctx !== 'object')
|
|
58
|
+
return '';
|
|
59
|
+
try {
|
|
60
|
+
return JSON.stringify(ctx);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
})();
|
|
66
|
+
writePerTaskHermesConfig({
|
|
67
|
+
hermesHome,
|
|
68
|
+
workingDir: inputs.workingDir,
|
|
69
|
+
model,
|
|
70
|
+
provider: this.hermesProvider,
|
|
71
|
+
solverPluginRoots: inputs.pluginRoots ?? [],
|
|
72
|
+
env: {
|
|
73
|
+
storePath: this.storePath,
|
|
74
|
+
daemonApiUrl: this.daemonApiUrl,
|
|
75
|
+
daemonApiToken: this.daemonApiToken,
|
|
76
|
+
corpusEnv: this.corpusEnv,
|
|
77
|
+
task: {
|
|
78
|
+
id: inputs.taskId,
|
|
79
|
+
description: typeof inputs.taskBody?.description === 'string' ? inputs.taskBody.description : '',
|
|
80
|
+
contextJson: taskContextJson,
|
|
81
|
+
role: typeof inputs.taskBody?.role === 'string' ? inputs.taskBody.role : '',
|
|
82
|
+
solverType: inputs.taskBody?.solverType ?? inputs.solverType ?? '',
|
|
83
|
+
restorationRequestId: typeof inputs.taskBody?.restorationRequestId === 'string'
|
|
84
|
+
? inputs.taskBody.restorationRequestId : '',
|
|
85
|
+
requestId: inputs.requestId ?? inputs.taskId,
|
|
86
|
+
workingDir: inputs.workingDir,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
seedFrom: this.operatorHermesHome,
|
|
90
|
+
});
|
|
91
|
+
// Step 2: build prompt + args.
|
|
92
|
+
//
|
|
93
|
+
// `hermes chat -q <prompt> -Q --yolo --accept-hooks` —
|
|
94
|
+
// -q PROMPT single-query non-interactive mode
|
|
95
|
+
// -Q quiet/programmatic (suppress banner, spinner, tool previews)
|
|
96
|
+
// --yolo bypass dangerous-command approval prompts (hardline floor
|
|
97
|
+
// — rm -rf /, mkfs, sudo password injection, etc. — still
|
|
98
|
+
// blocks even with --yolo). Required for daemon-driven
|
|
99
|
+
// execution: there is no human at a TTY to approve, so
|
|
100
|
+
// without this flag any tirith "warn" or pattern-based
|
|
101
|
+
// "dangerous command" verdict (e.g. git reset --hard,
|
|
102
|
+
// chmod -R 777) drops to the default-deny prompt path and
|
|
103
|
+
// the agent dead-ends. The per-Task workingDir is a fresh
|
|
104
|
+
// sandboxed tmpdir, so blast radius is bounded.
|
|
105
|
+
// --accept-hooks auto-approve any unseen shell hooks (config.yaml
|
|
106
|
+
// `hooks:` declarations) without a TTY prompt.
|
|
107
|
+
// Model/provider passed when the daemon or SolverNet config specifies
|
|
108
|
+
// them; otherwise Hermes resolves from $HERMES_HOME/config.yaml. No `-w`
|
|
109
|
+
// flag — `hermes chat` has `--worktree` (a boolean that makes Hermes
|
|
110
|
+
// create a git worktree, which we do NOT want); the working directory is
|
|
111
|
+
// set via the spawn cwd + `terminal.cwd` in the per-Task config.yaml.
|
|
112
|
+
const prompt = buildInitialPrompt(inputs);
|
|
113
|
+
const args = ['chat', '-q', prompt, '-Q', '--yolo', '--accept-hooks'];
|
|
114
|
+
if (model) {
|
|
115
|
+
args.push('--model', model);
|
|
116
|
+
}
|
|
117
|
+
if (this.hermesProvider) {
|
|
118
|
+
args.push('--provider', this.hermesProvider);
|
|
119
|
+
}
|
|
120
|
+
const env = buildAgentEnv({
|
|
121
|
+
HERMES_HOME: hermesHome,
|
|
122
|
+
});
|
|
123
|
+
const spawnOpts = {
|
|
124
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
125
|
+
env,
|
|
126
|
+
cwd: inputs.workingDir,
|
|
127
|
+
};
|
|
128
|
+
// Step 3: spawn + lifecycle
|
|
129
|
+
return new Promise((resolvePromise, reject) => {
|
|
130
|
+
const logDir = join(inputs.workingDir, '.hermes-agent');
|
|
131
|
+
mkdirSync(logDir, { recursive: true });
|
|
132
|
+
const stdoutLog = createWriteStream(join(logDir, 'stdout.log'), { flags: 'a' });
|
|
133
|
+
const stderrLog = createWriteStream(join(logDir, 'stderr.log'), { flags: 'a' });
|
|
134
|
+
const closeLogs = async () => {
|
|
135
|
+
if (!stdoutLog.writableEnded)
|
|
136
|
+
stdoutLog.end();
|
|
137
|
+
if (!stderrLog.writableEnded)
|
|
138
|
+
stderrLog.end();
|
|
139
|
+
await Promise.all([finished(stdoutLog), finished(stderrLog)]);
|
|
140
|
+
};
|
|
141
|
+
const child = this.spawnFn(this.hermesPath, args, spawnOpts);
|
|
142
|
+
if (inputs.abort.aborted) {
|
|
143
|
+
if (!child.killed)
|
|
144
|
+
child.kill('SIGTERM');
|
|
145
|
+
}
|
|
146
|
+
const onAbort = () => {
|
|
147
|
+
if (!child.killed)
|
|
148
|
+
child.kill('SIGTERM');
|
|
149
|
+
};
|
|
150
|
+
inputs.abort.addEventListener('abort', onAbort);
|
|
151
|
+
let stderr = '';
|
|
152
|
+
child.stdout?.on('data', (d) => stdoutLog.write(d));
|
|
153
|
+
child.stderr?.on('data', (d) => {
|
|
154
|
+
stderrLog.write(d);
|
|
155
|
+
stderr += d.toString();
|
|
156
|
+
});
|
|
157
|
+
let settled = false;
|
|
158
|
+
const settle = (cb, onLogErr = reject) => {
|
|
159
|
+
if (settled)
|
|
160
|
+
return;
|
|
161
|
+
settled = true;
|
|
162
|
+
inputs.abort.removeEventListener('abort', onAbort);
|
|
163
|
+
closeLogs().then(cb, onLogErr);
|
|
164
|
+
};
|
|
165
|
+
child.on('exit', (code, signal) => {
|
|
166
|
+
settle(() => {
|
|
167
|
+
if (code === 0) {
|
|
168
|
+
resolvePromise();
|
|
169
|
+
}
|
|
170
|
+
else if (inputs.abort.aborted) {
|
|
171
|
+
resolvePromise(); // graceful-abort exits are success
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
reject(new Error(`hermes-agent: child exited code=${code} signal=${signal}: ${stderr.slice(0, 500)}`));
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
child.on('error', (err) => {
|
|
179
|
+
settle(() => reject(err), () => reject(err));
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/hermes-agent/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ConfigBuilderEnv } from './config-builder.js';
|
|
2
|
+
export interface WritePerTaskConfigInputs {
|
|
3
|
+
hermesHome: string;
|
|
4
|
+
workingDir: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
provider?: string;
|
|
7
|
+
solverPluginRoots: readonly string[];
|
|
8
|
+
env: ConfigBuilderEnv;
|
|
9
|
+
/**
|
|
10
|
+
* The operator's real Hermes home (typically `process.env.HERMES_HOME` or
|
|
11
|
+
* `~/.hermes`). The operator's `config.yaml`, `.env`, and `auth/` are
|
|
12
|
+
* inherited from here — see the merge contract in `mergePerTaskConfig`.
|
|
13
|
+
* Omit (or pass a path equal to `hermesHome`) to skip inheritance — useful
|
|
14
|
+
* in tests.
|
|
15
|
+
*/
|
|
16
|
+
seedFrom?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function writePerTaskHermesConfig(inputs: WritePerTaskConfigInputs): void;
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
// client/src/harnesses/impls/hermes-agent/bootstrap.ts
|
|
2
|
+
import { cpSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { parse as yamlParse, stringify as yamlStringify } from 'yaml';
|
|
5
|
+
import { hermesConfigFromSolverPlugins, } from './config-builder.js';
|
|
6
|
+
/**
|
|
7
|
+
* Toolset allowlist for Jinn-run Hermes sessions.
|
|
8
|
+
*
|
|
9
|
+
* Hermes's default-ON toolset surface is broader than Claude Code's built-ins
|
|
10
|
+
* and includes footguns under unattended automation (`messaging` can send
|
|
11
|
+
* messages; `cronjob` can schedule things; `computer_use`, `browser`,
|
|
12
|
+
* `tts`/`vision`/`image_gen` are out of scope for text code-issue tasks). We
|
|
13
|
+
* pin an explicit allowlist for `hermes-cli` (the platform Jinn spawns Hermes
|
|
14
|
+
* as); operators who want to expand it for a Jinn task can request a daemon
|
|
15
|
+
* config option later — they can NOT widen the allowlist by editing their
|
|
16
|
+
* `~/.hermes/config.yaml`'s `platform_toolsets.hermes-cli` because Jinn
|
|
17
|
+
* deliberately replaces that key (other `platform_toolsets.*` entries — e.g.
|
|
18
|
+
* for `hermes-telegram` — pass through unchanged).
|
|
19
|
+
*/
|
|
20
|
+
const TOOLSET_ALLOWLIST = [
|
|
21
|
+
'terminal',
|
|
22
|
+
'file',
|
|
23
|
+
'web',
|
|
24
|
+
'skills',
|
|
25
|
+
'memory',
|
|
26
|
+
'session_search',
|
|
27
|
+
'todo',
|
|
28
|
+
'code_execution',
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Files copied verbatim from the operator's real Hermes home into the per-Task
|
|
32
|
+
* `$HERMES_HOME`. Hermes resolves OAuth creds from `$HERMES_HOME/auth/...` and
|
|
33
|
+
* pooled creds from `$HERMES_HOME/auth.json` with NO real-home fallback, so a
|
|
34
|
+
* fresh per-Task home (which the freeze contract requires) would otherwise
|
|
35
|
+
* have no credentials and Hermes would fail with "No … credentials found."
|
|
36
|
+
*
|
|
37
|
+
* `bin/` carries Hermes-managed binaries — most importantly `bin/tirith`, the
|
|
38
|
+
* shell-command security scanner Hermes runs before every `terminal_tool`
|
|
39
|
+
* invocation. Hermes resolves it from `$HERMES_HOME/bin/tirith` and falls back
|
|
40
|
+
* to an auto-download from `github.com/sheeki03/tirith/releases/latest` on
|
|
41
|
+
* first use. Without seeding, every per-Task run pays the multi-MB download
|
|
42
|
+
* cost on its first shell command — long enough to blow the harness budget.
|
|
43
|
+
*
|
|
44
|
+
* Hermes may refresh OAuth access tokens mid-task. The HermesHarness excludes
|
|
45
|
+
* these runtime-only files from the daemon state digest while still fencing the
|
|
46
|
+
* learning surface (memories/, skills/, sessions/, and ordinary files). The
|
|
47
|
+
* binary exception is intentionally limited to Hermes's managed `bin/tirith`
|
|
48
|
+
* security scanner instead of the whole `bin/` tree.
|
|
49
|
+
*/
|
|
50
|
+
const OPERATOR_STATE_TO_SEED = ['auth', 'auth.json', 'bin'];
|
|
51
|
+
function seedOperatorState(hermesHome, seedFrom) {
|
|
52
|
+
if (seedFrom === hermesHome || !existsSync(seedFrom))
|
|
53
|
+
return;
|
|
54
|
+
for (const name of OPERATOR_STATE_TO_SEED) {
|
|
55
|
+
const src = join(seedFrom, name);
|
|
56
|
+
const dst = join(hermesHome, name);
|
|
57
|
+
if (existsSync(src) && !existsSync(dst)) {
|
|
58
|
+
cpSync(src, dst, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
63
|
+
// Operator config.yaml inheritance — the merge contract.
|
|
64
|
+
// ────────────────────────────────────────────────────────────────────────────
|
|
65
|
+
//
|
|
66
|
+
// Goal: anything the operator set in `~/.hermes/config.yaml` flows into the
|
|
67
|
+
// per-Task config, EXCEPT for the small set of keys Jinn must own per Task.
|
|
68
|
+
// This is the comprehensive form of operator-config inheritance — it replaces
|
|
69
|
+
// the prior "fresh per-Task config with hand-written Jinn fields only" path,
|
|
70
|
+
// which was a whack-a-mole source (auth/, then .env, then max_tokens; each
|
|
71
|
+
// real-binary run surfaced another orphaned setting). With the merge, ANY
|
|
72
|
+
// operator setting (model.max_tokens, model.context_length, model.base_url,
|
|
73
|
+
// provider_routing, openrouter.response_cache, agent.iteration_budget,
|
|
74
|
+
// compression.threshold, auxiliary.*, display.*, voice.*, security.*,
|
|
75
|
+
// approvals.*, delegation.*, web.*, custom providers: overrides, etc.) just
|
|
76
|
+
// flows through.
|
|
77
|
+
//
|
|
78
|
+
// Jinn-managed keys (per-Task authoritative; Jinn writes these every Task):
|
|
79
|
+
// - model.default — if a daemon/SolverNet override was provided
|
|
80
|
+
// - model.provider — if a daemon/SolverNet override was provided
|
|
81
|
+
// - terminal.backend — forced to `local` (the per-Task workingDir is a
|
|
82
|
+
// host filesystem path; remote backends would need
|
|
83
|
+
// additional setup Jinn doesn't yet do)
|
|
84
|
+
// - terminal.cwd — the per-Task workingDir
|
|
85
|
+
// - platform_toolsets['hermes-cli'] — the Jinn allowlist (replaces any
|
|
86
|
+
// operator value; other platforms pass through)
|
|
87
|
+
// - mcp_servers.<name> — operator's MCP servers preserved; Jinn adds its
|
|
88
|
+
// SolverPlugin MCP servers; Jinn wins on collision
|
|
89
|
+
// - skills.external_dirs — operator's dirs preserved; Jinn appends the
|
|
90
|
+
// SolverPlugin skill dirs
|
|
91
|
+
//
|
|
92
|
+
// Everything else from the operator's config.yaml passes through unchanged.
|
|
93
|
+
//
|
|
94
|
+
// Operator-set keys that DO inherit and matter for budget-capped providers:
|
|
95
|
+
// - model.max_tokens — OpenRouter pre-bills on max_tokens; operators
|
|
96
|
+
// with low monthly caps must lower this to fit.
|
|
97
|
+
// - model.context_length — total context window cap.
|
|
98
|
+
// - provider_routing — OpenRouter routing knobs (sort by price, etc.).
|
|
99
|
+
// - providers.<name> — per-provider timeout / model-specific overrides.
|
|
100
|
+
function isObj(v) {
|
|
101
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
102
|
+
}
|
|
103
|
+
function readOperatorConfigYaml(seedFrom) {
|
|
104
|
+
const path = join(seedFrom, 'config.yaml');
|
|
105
|
+
if (!existsSync(path))
|
|
106
|
+
return {};
|
|
107
|
+
try {
|
|
108
|
+
const text = readFileSync(path, 'utf8');
|
|
109
|
+
const parsed = yamlParse(text);
|
|
110
|
+
return isObj(parsed) ? parsed : {};
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Operator config is unparseable — proceed with Jinn-only. Hermes would
|
|
114
|
+
// also fail to read it, so this isn't hiding any real signal.
|
|
115
|
+
return {};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function mergePerTaskConfig(operator, jinn, opts) {
|
|
119
|
+
const out = { ...operator };
|
|
120
|
+
// model: deep-merge — operator's max_tokens/context_length/base_url/
|
|
121
|
+
// provider_routing/etc. preserved; Jinn overrides default+provider only if
|
|
122
|
+
// specified by daemon/SolverNet config.
|
|
123
|
+
if (opts.model || opts.provider || isObj(out.model)) {
|
|
124
|
+
const opModel = isObj(out.model) ? out.model : {};
|
|
125
|
+
const jinnModel = {};
|
|
126
|
+
if (opts.model)
|
|
127
|
+
jinnModel.default = opts.model;
|
|
128
|
+
if (opts.provider)
|
|
129
|
+
jinnModel.provider = opts.provider;
|
|
130
|
+
out.model = { ...opModel, ...jinnModel };
|
|
131
|
+
}
|
|
132
|
+
// terminal: Jinn forces backend + cwd; operator's timeout / lifetime /
|
|
133
|
+
// sudo_password / docker_* fields preserved (the docker_* fields are inert
|
|
134
|
+
// under `backend: local`, which is fine).
|
|
135
|
+
const opTerminal = isObj(out.terminal) ? out.terminal : {};
|
|
136
|
+
out.terminal = {
|
|
137
|
+
...opTerminal,
|
|
138
|
+
backend: 'local',
|
|
139
|
+
cwd: opts.workingDir,
|
|
140
|
+
};
|
|
141
|
+
// platform_toolsets: Jinn enforces its allowlist for the `hermes-cli`
|
|
142
|
+
// platform (the platform Jinn spawns Hermes as); other platforms
|
|
143
|
+
// (hermes-telegram, etc.) pass through unchanged.
|
|
144
|
+
const opPlatformToolsets = isObj(out.platform_toolsets) ? out.platform_toolsets : {};
|
|
145
|
+
out.platform_toolsets = {
|
|
146
|
+
...opPlatformToolsets,
|
|
147
|
+
'hermes-cli': [...TOOLSET_ALLOWLIST],
|
|
148
|
+
};
|
|
149
|
+
// mcp_servers: operator's MCP servers preserved; Jinn adds its SolverPlugin
|
|
150
|
+
// MCP servers via key-merge (Jinn wins on name collision — the SolverPlugin
|
|
151
|
+
// MCP definition is the authority on what `jinn-client` etc. mean).
|
|
152
|
+
if (jinn.mcp_servers && Object.keys(jinn.mcp_servers).length > 0) {
|
|
153
|
+
const opMcp = isObj(out.mcp_servers) ? out.mcp_servers : {};
|
|
154
|
+
out.mcp_servers = { ...opMcp, ...jinn.mcp_servers };
|
|
155
|
+
}
|
|
156
|
+
// skills.external_dirs: operator's dirs preserved; Jinn appends SolverPlugin
|
|
157
|
+
// skill dirs. Duplicates de-duped (preserves order — operator first).
|
|
158
|
+
if (jinn.skills?.external_dirs && jinn.skills.external_dirs.length > 0) {
|
|
159
|
+
const opSkills = isObj(out.skills) ? out.skills : {};
|
|
160
|
+
const opDirs = Array.isArray(opSkills.external_dirs)
|
|
161
|
+
? opSkills.external_dirs.filter((d) => typeof d === 'string')
|
|
162
|
+
: [];
|
|
163
|
+
const merged = [...opDirs];
|
|
164
|
+
for (const d of jinn.skills.external_dirs) {
|
|
165
|
+
if (!merged.includes(d))
|
|
166
|
+
merged.push(d);
|
|
167
|
+
}
|
|
168
|
+
out.skills = { ...opSkills, external_dirs: merged };
|
|
169
|
+
}
|
|
170
|
+
return out;
|
|
171
|
+
}
|
|
172
|
+
function snippetToEnvFile(env) {
|
|
173
|
+
const lines = [];
|
|
174
|
+
lines.push(`DAEMON_API_URL=${env.daemonApiUrl}`);
|
|
175
|
+
lines.push(`DAEMON_API_TOKEN=${env.daemonApiToken}`);
|
|
176
|
+
if (env.storePath)
|
|
177
|
+
lines.push(`STORE_PATH=${env.storePath}`);
|
|
178
|
+
if (env.corpusEnv.subgraphUrl)
|
|
179
|
+
lines.push(`JINN_CORPUS_SUBGRAPH_URL=${env.corpusEnv.subgraphUrl}`);
|
|
180
|
+
if (env.corpusEnv.ipfsGatewayUrl)
|
|
181
|
+
lines.push(`JINN_CORPUS_IPFS_GATEWAY_URL=${env.corpusEnv.ipfsGatewayUrl}`);
|
|
182
|
+
if (env.corpusEnv.rpcUrl)
|
|
183
|
+
lines.push(`JINN_CORPUS_RPC_URL=${env.corpusEnv.rpcUrl}`);
|
|
184
|
+
if (env.corpusEnv.chainId != null)
|
|
185
|
+
lines.push(`JINN_CORPUS_CHAIN_ID=${env.corpusEnv.chainId}`);
|
|
186
|
+
if (env.corpusEnv.identityRegistryAddress)
|
|
187
|
+
lines.push(`JINN_CORPUS_IDENTITY_REGISTRY_ADDRESS=${env.corpusEnv.identityRegistryAddress}`);
|
|
188
|
+
if (env.corpusEnv.fromBlock != null)
|
|
189
|
+
lines.push(`JINN_CORPUS_FROM_BLOCK=${env.corpusEnv.fromBlock}`);
|
|
190
|
+
return lines.join('\n') + '\n';
|
|
191
|
+
}
|
|
192
|
+
export function writePerTaskHermesConfig(inputs) {
|
|
193
|
+
mkdirSync(inputs.hermesHome, { recursive: true });
|
|
194
|
+
if (inputs.seedFrom) {
|
|
195
|
+
seedOperatorState(inputs.hermesHome, inputs.seedFrom);
|
|
196
|
+
}
|
|
197
|
+
const operator = inputs.seedFrom ? readOperatorConfigYaml(inputs.seedFrom) : {};
|
|
198
|
+
const snippet = hermesConfigFromSolverPlugins(inputs.solverPluginRoots, inputs.env);
|
|
199
|
+
const merged = mergePerTaskConfig(operator, snippet, {
|
|
200
|
+
model: inputs.model,
|
|
201
|
+
provider: inputs.provider,
|
|
202
|
+
workingDir: inputs.workingDir,
|
|
203
|
+
});
|
|
204
|
+
writeFileSync(join(inputs.hermesHome, 'config.yaml'), yamlStringify(merged, { lineWidth: 0 }), 'utf8');
|
|
205
|
+
// Per-Task .env = operator's .env (provider API keys, debug toggles, etc.)
|
|
206
|
+
// + Jinn-runtime keys. Jinn keys go LAST so they win on duplicate names
|
|
207
|
+
// (most dotenv loaders use last-wins; Hermes uses python-dotenv). Without
|
|
208
|
+
// the operator's keys, Jinn-run Hermes can't authenticate to any provider
|
|
209
|
+
// except google-gemini-cli (whose OAuth creds are seeded via auth/), so
|
|
210
|
+
// Hermes-as-default with OpenRouter / Anthropic / etc. requires this merge.
|
|
211
|
+
const operatorEnv = inputs.seedFrom ? readOperatorEnvFile(inputs.seedFrom) : '';
|
|
212
|
+
const trailingNewline = operatorEnv.endsWith('\n') ? '' : '\n';
|
|
213
|
+
const header = operatorEnv
|
|
214
|
+
? `${operatorEnv}${trailingNewline}# --- Jinn-runtime keys (per-Task, override any operator entries above) ---\n`
|
|
215
|
+
: '';
|
|
216
|
+
const envFile = header + snippetToEnvFile(inputs.env);
|
|
217
|
+
writeFileSync(join(inputs.hermesHome, '.env'), envFile, 'utf8');
|
|
218
|
+
}
|
|
219
|
+
function readOperatorEnvFile(seedFrom) {
|
|
220
|
+
const path = join(seedFrom, '.env');
|
|
221
|
+
if (!existsSync(path))
|
|
222
|
+
return '';
|
|
223
|
+
try {
|
|
224
|
+
return readFileSync(path, 'utf8');
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
// Permissions / race — better to proceed with just Jinn keys than crash.
|
|
228
|
+
return '';
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../../src/harnesses/impls/hermes-agent/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface McpStdioServer {
|
|
2
|
+
command: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
cwd?: string;
|
|
5
|
+
env?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface McpHttpServer {
|
|
8
|
+
url: string;
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
export type McpServer = McpStdioServer | McpHttpServer;
|
|
12
|
+
export interface HermesConfigSnippet {
|
|
13
|
+
mcp_servers?: Record<string, McpServer>;
|
|
14
|
+
skills?: {
|
|
15
|
+
external_dirs?: string[];
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface ConfigBuilderEnv {
|
|
19
|
+
storePath?: string;
|
|
20
|
+
daemonApiUrl: string;
|
|
21
|
+
daemonApiToken: string;
|
|
22
|
+
corpusEnv: {
|
|
23
|
+
subgraphUrl?: string;
|
|
24
|
+
ipfsGatewayUrl?: string;
|
|
25
|
+
rpcUrl?: string;
|
|
26
|
+
chainId?: number;
|
|
27
|
+
identityRegistryAddress?: string;
|
|
28
|
+
fromBlock?: number;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Active-task identifiers injected into MCP server env so jinn-client tools
|
|
32
|
+
* (get_task, submit_typed_payload, …) know which Task they are operating on.
|
|
33
|
+
* Mirrors what claude-code and codex-code adapters thread through in
|
|
34
|
+
* `buildSubprocessEnv`. When unset (e.g. unit tests), the MCP server returns
|
|
35
|
+
* a default empty task — fine for tests, broken for live runs.
|
|
36
|
+
*/
|
|
37
|
+
task?: {
|
|
38
|
+
id?: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
/** Already-stringified JSON of `taskBody.context`; empty string when absent. */
|
|
41
|
+
contextJson?: string;
|
|
42
|
+
role?: string;
|
|
43
|
+
solverType?: string;
|
|
44
|
+
restorationRequestId?: string;
|
|
45
|
+
requestId?: string;
|
|
46
|
+
workingDir?: string;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export declare function hermesConfigFromSolverPlugins(roots: readonly string[], env: ConfigBuilderEnv): HermesConfigSnippet;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// client/src/harnesses/impls/hermes-agent/config-builder.ts
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
4
|
+
function buildJinnRuntimeEnv(env) {
|
|
5
|
+
const out = {
|
|
6
|
+
DAEMON_API_URL: env.daemonApiUrl,
|
|
7
|
+
DAEMON_API_TOKEN: env.daemonApiToken,
|
|
8
|
+
};
|
|
9
|
+
if (env.storePath)
|
|
10
|
+
out.STORE_PATH = env.storePath;
|
|
11
|
+
if (env.corpusEnv.subgraphUrl)
|
|
12
|
+
out.JINN_CORPUS_SUBGRAPH_URL = env.corpusEnv.subgraphUrl;
|
|
13
|
+
if (env.corpusEnv.ipfsGatewayUrl)
|
|
14
|
+
out.JINN_CORPUS_IPFS_GATEWAY_URL = env.corpusEnv.ipfsGatewayUrl;
|
|
15
|
+
if (env.corpusEnv.rpcUrl)
|
|
16
|
+
out.JINN_CORPUS_RPC_URL = env.corpusEnv.rpcUrl;
|
|
17
|
+
if (env.corpusEnv.chainId != null)
|
|
18
|
+
out.JINN_CORPUS_CHAIN_ID = String(env.corpusEnv.chainId);
|
|
19
|
+
if (env.corpusEnv.identityRegistryAddress) {
|
|
20
|
+
out.JINN_CORPUS_IDENTITY_REGISTRY_ADDRESS = env.corpusEnv.identityRegistryAddress;
|
|
21
|
+
}
|
|
22
|
+
if (env.corpusEnv.fromBlock != null)
|
|
23
|
+
out.JINN_CORPUS_FROM_BLOCK = String(env.corpusEnv.fromBlock);
|
|
24
|
+
// Active-task env — read by the jinn-client MCP server in
|
|
25
|
+
// `client/src/mcp/server.ts` to populate the `task` runtime context. Without
|
|
26
|
+
// these, submit_typed_payload errors with `missing_solver_type` and get_task
|
|
27
|
+
// returns an empty record.
|
|
28
|
+
if (env.task) {
|
|
29
|
+
if (env.task.id)
|
|
30
|
+
out.DESIRED_STATE_ID = env.task.id;
|
|
31
|
+
if (env.task.description)
|
|
32
|
+
out.DESIRED_STATE_DESCRIPTION = env.task.description;
|
|
33
|
+
if (env.task.contextJson)
|
|
34
|
+
out.DESIRED_STATE_CONTEXT = env.task.contextJson;
|
|
35
|
+
if (env.task.role)
|
|
36
|
+
out.DESIRED_STATE_ROLE = env.task.role;
|
|
37
|
+
if (env.task.solverType)
|
|
38
|
+
out.DESIRED_STATE_SOLVER_TYPE = env.task.solverType;
|
|
39
|
+
if (env.task.restorationRequestId)
|
|
40
|
+
out.RESTORATION_REQUEST_ID = env.task.restorationRequestId;
|
|
41
|
+
if (env.task.requestId)
|
|
42
|
+
out.REQUEST_ID = env.task.requestId;
|
|
43
|
+
if (env.task.workingDir)
|
|
44
|
+
out.JINN_WORKING_DIR = env.task.workingDir;
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
function resolvePathTemplate(value, pluginRoot) {
|
|
49
|
+
// Resolve ${CLAUDE_PLUGIN_ROOT} / ${CODEX_PLUGIN_ROOT} → pluginRoot,
|
|
50
|
+
// then resolve relative paths against pluginRoot.
|
|
51
|
+
const substituted = value
|
|
52
|
+
.replaceAll('${CLAUDE_PLUGIN_ROOT}', pluginRoot)
|
|
53
|
+
.replaceAll('${CODEX_PLUGIN_ROOT}', pluginRoot);
|
|
54
|
+
if (isAbsolute(substituted))
|
|
55
|
+
return substituted;
|
|
56
|
+
return resolve(pluginRoot, substituted);
|
|
57
|
+
}
|
|
58
|
+
function translateMcpFromFile(pluginRoot, jinnEnv) {
|
|
59
|
+
const mcpFile = join(pluginRoot, '.mcp.json');
|
|
60
|
+
if (!existsSync(mcpFile))
|
|
61
|
+
return {};
|
|
62
|
+
const raw = JSON.parse(readFileSync(mcpFile, 'utf8'));
|
|
63
|
+
const servers = raw.mcpServers ?? {};
|
|
64
|
+
const out = {};
|
|
65
|
+
for (const [name, server] of Object.entries(servers)) {
|
|
66
|
+
if ('url' in server) {
|
|
67
|
+
// HTTP MCP — pass through unchanged (no path resolution needed)
|
|
68
|
+
out[name] = { url: server.url, ...(server.headers ? { headers: server.headers } : {}) };
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Stdio MCP — resolve paths and merge env
|
|
72
|
+
const resolvedArgs = server.args.map((a) => resolvePathTemplate(a, pluginRoot));
|
|
73
|
+
const resolvedCwd = server.cwd ? resolvePathTemplate(server.cwd, pluginRoot) : pluginRoot;
|
|
74
|
+
out[name] = {
|
|
75
|
+
command: server.command,
|
|
76
|
+
args: resolvedArgs,
|
|
77
|
+
cwd: resolvedCwd,
|
|
78
|
+
env: { ...jinnEnv, ...(server.env ?? {}) },
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
function translateSkillsDir(pluginRoot) {
|
|
84
|
+
const skillsDir = join(pluginRoot, 'skills');
|
|
85
|
+
return existsSync(skillsDir) ? skillsDir : null;
|
|
86
|
+
}
|
|
87
|
+
export function hermesConfigFromSolverPlugins(roots, env) {
|
|
88
|
+
const jinnEnv = buildJinnRuntimeEnv(env);
|
|
89
|
+
const mcpServers = {};
|
|
90
|
+
const externalDirs = [];
|
|
91
|
+
for (const root of roots) {
|
|
92
|
+
Object.assign(mcpServers, translateMcpFromFile(root, jinnEnv));
|
|
93
|
+
const skills = translateSkillsDir(root);
|
|
94
|
+
if (skills)
|
|
95
|
+
externalDirs.push(skills);
|
|
96
|
+
}
|
|
97
|
+
const snippet = {};
|
|
98
|
+
if (Object.keys(mcpServers).length > 0)
|
|
99
|
+
snippet.mcp_servers = mcpServers;
|
|
100
|
+
if (externalDirs.length > 0)
|
|
101
|
+
snippet.skills = { external_dirs: externalDirs };
|
|
102
|
+
return snippet;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=config-builder.js.map
|