@jinn-network/client 0.1.8 → 0.1.9-canary.023faefb
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/CONTRIBUTING.md +2 -2
- package/README.md +6 -0
- package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +3 -3
- package/deployments/deployment-stolas-l2-baseSepolia-fast.json +23 -3
- package/deployments/deployment-task-coordinator-router-v3-baseSepolia-fast.json +34 -6
- package/dist/adapters/mech/adapter.d.ts +31 -1
- package/dist/adapters/mech/adapter.js +126 -53
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +174 -13
- package/dist/adapters/mech/contracts.js +99 -49
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/safe-revert.d.ts +4 -0
- package/dist/adapters/mech/safe-revert.js +5 -1
- package/dist/adapters/mech/safe-revert.js.map +1 -1
- package/dist/adapters/mech/safe.js +77 -1
- package/dist/adapters/mech/safe.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +5 -130
- package/dist/adapters/mech/types.js +9 -65
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/adapters/mech/verdict-code.js +1 -1
- package/dist/adapters/mech/verdict-code.js.map +1 -1
- package/dist/api/bootstrap-endpoint.d.ts +19 -3
- package/dist/api/bootstrap-endpoint.js +4 -0
- package/dist/api/bootstrap-endpoint.js.map +1 -1
- package/dist/api/discovery-endpoint.d.ts +1 -0
- package/dist/api/discovery-endpoint.js +24 -0
- package/dist/api/discovery-endpoint.js.map +1 -1
- package/dist/api/fleet-build.d.ts +1 -7
- package/dist/api/fleet-build.js +0 -7
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/gather-status.d.ts +26 -17
- package/dist/api/gather-status.js +62 -520
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/harness-auth-status-endpoint.d.ts +21 -0
- package/dist/api/harness-auth-status-endpoint.js +17 -0
- package/dist/api/harness-auth-status-endpoint.js.map +1 -0
- package/dist/api/launcher-endpoints.js +6 -1
- package/dist/api/launcher-endpoints.js.map +1 -1
- package/dist/api/launcher-status.d.ts +2 -0
- package/dist/api/launcher-status.js.map +1 -1
- package/dist/api/launcher-tasks.d.ts +47 -0
- package/dist/api/launcher-tasks.js +88 -3
- package/dist/api/launcher-tasks.js.map +1 -1
- package/dist/api/loop-completion-build.d.ts +79 -0
- package/dist/api/loop-completion-build.js +154 -0
- package/dist/api/loop-completion-build.js.map +1 -0
- package/dist/api/operator-artifacts-endpoint.js +1 -1
- package/dist/api/operator-artifacts-endpoint.js.map +1 -1
- package/dist/api/portfolio-v0-build.d.ts +2 -1
- package/dist/api/portfolio-v0-build.js +5 -7
- package/dist/api/portfolio-v0-build.js.map +1 -1
- package/dist/api/prediction-v1-build.d.ts +2 -2
- package/dist/api/prediction-v1-build.js +5 -7
- package/dist/api/prediction-v1-build.js.map +1 -1
- package/dist/api/rewards-build.d.ts +8 -1
- package/dist/api/rewards-build.js +32 -4
- package/dist/api/rewards-build.js.map +1 -1
- package/dist/api/rewards-endpoint.d.ts +12 -0
- package/dist/api/rewards-endpoint.js +46 -0
- package/dist/api/rewards-endpoint.js.map +1 -0
- package/dist/api/server.d.ts +6 -16
- package/dist/api/server.js +29 -26
- package/dist/api/server.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +45 -0
- package/dist/api/setup-endpoints.js +271 -52
- package/dist/api/setup-endpoints.js.map +1 -1
- package/dist/api/solvernets-endpoints.js +4 -1
- package/dist/api/solvernets-endpoints.js.map +1 -1
- package/dist/api/status-build.d.ts +71 -94
- package/dist/api/status-build.js +11 -77
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/status-rollup-build.d.ts +0 -4
- package/dist/api/status-rollup-build.js +0 -4
- package/dist/api/status-rollup-build.js.map +1 -1
- package/dist/api/stop-hook.d.ts +1 -1
- package/dist/api/stop-hook.js +1 -1
- package/dist/api/stop-hook.js.map +1 -1
- package/dist/api/task-run-routing.d.ts +1 -1
- package/dist/api/task-runs-build.d.ts +2 -2
- package/dist/api/task-runs-build.js +5 -7
- package/dist/api/task-runs-build.js.map +1 -1
- package/dist/bin/jinn-distil-mcp.js +813 -0
- package/dist/bin/jinn-layer.js +12568 -0
- package/dist/build-info.json +4 -4
- package/dist/build-meta.json +1 -1
- package/dist/captures/distil-export.d.ts +54 -0
- package/dist/captures/distil-export.js +135 -0
- package/dist/captures/distil-export.js.map +1 -0
- package/dist/captures/ingest.d.ts +21 -0
- package/dist/captures/ingest.js +144 -0
- package/dist/captures/ingest.js.map +1 -0
- package/dist/captures/live-publisher.d.ts +9 -0
- package/dist/captures/live-publisher.js +5 -3
- package/dist/captures/live-publisher.js.map +1 -1
- package/dist/captures/publish.d.ts +15 -0
- package/dist/captures/publish.js +17 -7
- package/dist/captures/publish.js.map +1 -1
- package/dist/cli/commands/codedigest-revert-check.js +6 -2
- package/dist/cli/commands/codedigest-revert-check.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +36 -4
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/eval.d.ts +87 -0
- package/dist/cli/commands/eval.js +481 -0
- package/dist/cli/commands/eval.js.map +1 -0
- package/dist/cli/commands/rewards.d.ts +2 -0
- package/dist/cli/commands/rewards.js +39 -10
- package/dist/cli/commands/rewards.js.map +1 -1
- package/dist/cli/commands/solver-nets.js +68 -0
- package/dist/cli/commands/solver-nets.js.map +1 -1
- package/dist/cli/commands/status.js +0 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/update.js +8 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/version.js +4 -0
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/execution-context.js +2 -1
- package/dist/cli/execution-context.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/introspection-context.js +0 -3
- package/dist/cli/introspection-context.js.map +1 -1
- package/dist/config.d.ts +158 -541
- package/dist/config.js +190 -197
- package/dist/config.js.map +1 -1
- package/dist/contracts/abis.d.ts +100 -0
- package/dist/contracts/abis.js +58 -0
- package/dist/contracts/abis.js.map +1 -0
- package/dist/contracts/addresses.d.ts +36 -0
- package/dist/contracts/addresses.js +60 -0
- package/dist/contracts/addresses.js.map +1 -0
- package/dist/corpus/acquire.d.ts +7 -6
- package/dist/corpus/acquire.js +10 -10
- package/dist/corpus/acquire.js.map +1 -1
- package/dist/corpus/fetch-artifact.d.ts +21 -0
- package/dist/corpus/fetch-artifact.js +33 -0
- package/dist/corpus/fetch-artifact.js.map +1 -0
- package/dist/corpus/index.d.ts +2 -2
- package/dist/corpus/onchain-query.d.ts +0 -1
- package/dist/corpus/onchain-query.js +2 -5
- package/dist/corpus/onchain-query.js.map +1 -1
- package/dist/corpus/route-resolver.d.ts +3 -3
- package/dist/corpus/route-resolver.js +3 -3
- package/dist/daemon/ai-units-gate.d.ts +6 -6
- package/dist/daemon/ai-units-gate.js +11 -10
- package/dist/daemon/ai-units-gate.js.map +1 -1
- package/dist/daemon/balance-topup-loop.js +27 -9
- package/dist/daemon/balance-topup-loop.js.map +1 -1
- package/dist/daemon/checkpoint-loop.js +2 -2
- package/dist/daemon/creator.d.ts +1 -0
- package/dist/daemon/creator.js +39 -25
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +15 -10
- package/dist/daemon/daemon.js +95 -41
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/delivery-watcher.d.ts +9 -0
- package/dist/daemon/delivery-watcher.js +24 -1
- package/dist/daemon/delivery-watcher.js.map +1 -1
- package/dist/daemon/eviction-loop.d.ts +7 -0
- package/dist/daemon/eviction-loop.js +19 -3
- package/dist/daemon/eviction-loop.js.map +1 -1
- package/dist/daemon/join-applier.d.ts +35 -0
- package/dist/daemon/join-applier.js +49 -0
- package/dist/daemon/join-applier.js.map +1 -0
- package/dist/daemon/loop-heartbeat.d.ts +89 -0
- package/dist/daemon/loop-heartbeat.js +75 -0
- package/dist/daemon/loop-heartbeat.js.map +1 -0
- package/dist/{api/peers.js → daemon/peer-sync.js} +3 -1
- package/dist/daemon/peer-sync.js.map +1 -0
- package/dist/daemon/reward-claim-loop.js +28 -10
- package/dist/daemon/reward-claim-loop.js.map +1 -1
- package/dist/daemon/skip-log-dedup.d.ts +1 -1
- package/dist/daemon/skip-log-dedup.js +3 -0
- package/dist/daemon/skip-log-dedup.js.map +1 -1
- package/dist/daemon/spend-cap-gate.d.ts +0 -6
- package/dist/daemon/spend-cap-gate.js +1 -8
- package/dist/daemon/spend-cap-gate.js.map +1 -1
- package/dist/daemon/watchdog-loop.d.ts +84 -0
- package/dist/daemon/watchdog-loop.js +91 -0
- package/dist/daemon/watchdog-loop.js.map +1 -0
- package/dist/dashboard/assets/index-B_5Cb-ZH.js +161 -0
- package/dist/dashboard/assets/index-D7rvJRNa.css +1 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/discovery/http.d.ts +17 -0
- package/dist/discovery/http.js +378 -26
- package/dist/discovery/http.js.map +1 -1
- package/dist/discovery/onchain.js +174 -10
- package/dist/discovery/onchain.js.map +1 -1
- package/dist/discovery/types.d.ts +149 -0
- package/dist/discovery/types.js +40 -0
- package/dist/discovery/types.js.map +1 -1
- package/dist/discovery/with-fallback.js +24 -0
- package/dist/discovery/with-fallback.js.map +1 -1
- package/dist/earning/bootstrap-run.d.ts +25 -0
- package/dist/earning/bootstrap-run.js +315 -0
- package/dist/earning/bootstrap-run.js.map +1 -0
- package/dist/earning/bootstrap.d.ts +31 -11
- package/dist/earning/bootstrap.js +123 -212
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +2 -232
- package/dist/earning/contracts.js +16 -205
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/faucet-topup-store.d.ts +41 -0
- package/dist/earning/faucet-topup-store.js +89 -0
- package/dist/earning/faucet-topup-store.js.map +1 -0
- package/dist/earning/faucet.d.ts +1 -1
- package/dist/earning/faucet.js +2 -2
- package/dist/earning/faucet.js.map +1 -1
- package/dist/earning/safe-adapter.js +12 -45
- package/dist/earning/safe-adapter.js.map +1 -1
- package/dist/earning/steps/context.d.ts +42 -0
- package/dist/earning/steps/context.js +4 -0
- package/dist/earning/steps/context.js.map +1 -0
- package/dist/earning/steps/fleet-identity-register.d.ts +4 -0
- package/dist/earning/steps/fleet-identity-register.js +65 -0
- package/dist/earning/steps/fleet-identity-register.js.map +1 -0
- package/dist/earning/steps/fleet-safe-deploy.d.ts +4 -0
- package/dist/earning/steps/fleet-safe-deploy.js +62 -0
- package/dist/earning/steps/fleet-safe-deploy.js.map +1 -0
- package/dist/earning/steps/fleet-safe-predict.d.ts +4 -0
- package/dist/earning/steps/fleet-safe-predict.js +18 -0
- package/dist/earning/steps/fleet-safe-predict.js.map +1 -0
- package/dist/earning/steps/receipt-parsing.d.ts +12 -0
- package/dist/earning/steps/receipt-parsing.js +71 -0
- package/dist/earning/steps/receipt-parsing.js.map +1 -0
- package/dist/earning/stolas-claim.js +8 -8
- package/dist/earning/stolas-claim.js.map +1 -1
- package/dist/earning/{jinn-rewards.d.ts → stolas-staking.d.ts} +4 -8
- package/dist/earning/{jinn-rewards.js → stolas-staking.js} +6 -10
- package/dist/earning/stolas-staking.js.map +1 -0
- package/dist/earning/testnet-setup-migration.d.ts +1 -0
- package/dist/earning/testnet-setup-migration.js +7 -2
- package/dist/earning/testnet-setup-migration.js.map +1 -1
- package/dist/earning/types.d.ts +1 -1
- package/dist/earning/types.js +1 -1
- package/dist/earning/types.js.map +1 -1
- package/dist/earning/viem-clients.d.ts +3 -19
- package/dist/earning/viem-clients.js +4 -31
- package/dist/earning/viem-clients.js.map +1 -1
- package/dist/erc8004/addresses.d.ts +6 -5
- package/dist/erc8004/addresses.js +7 -5
- package/dist/erc8004/addresses.js.map +1 -1
- package/dist/erc8004/identity.d.ts +12 -1
- package/dist/erc8004/identity.js +31 -0
- package/dist/erc8004/identity.js.map +1 -1
- package/dist/erc8004/index.d.ts +1 -1
- package/dist/erc8004/index.js +1 -1
- package/dist/erc8004/index.js.map +1 -1
- package/dist/eval/capability-slate.d.ts +54 -0
- package/dist/eval/capability-slate.js +116 -0
- package/dist/eval/capability-slate.js.map +1 -0
- package/dist/eval/capability-stats.d.ts +39 -0
- package/dist/eval/capability-stats.js +123 -0
- package/dist/eval/capability-stats.js.map +1 -0
- package/dist/eval/contested-band.d.ts +18 -0
- package/dist/eval/contested-band.js +19 -0
- package/dist/eval/contested-band.js.map +1 -0
- package/dist/eval/corpus-index.d.ts +21 -0
- package/dist/eval/corpus-index.js +55 -0
- package/dist/eval/corpus-index.js.map +1 -0
- package/dist/eval/disjointness.d.ts +26 -0
- package/dist/eval/disjointness.js +67 -0
- package/dist/eval/disjointness.js.map +1 -0
- package/dist/eval/eval-harness-run.d.ts +63 -0
- package/dist/eval/eval-harness-run.js +123 -0
- package/dist/eval/eval-harness-run.js.map +1 -0
- package/dist/eval/mcnemar-power.d.ts +14 -0
- package/dist/eval/mcnemar-power.js +40 -0
- package/dist/eval/mcnemar-power.js.map +1 -0
- package/dist/eval/orchestrator.d.ts +224 -0
- package/dist/eval/orchestrator.js +250 -0
- package/dist/eval/orchestrator.js.map +1 -0
- package/dist/eval/paired.d.ts +68 -0
- package/dist/eval/paired.js +93 -0
- package/dist/eval/paired.js.map +1 -0
- package/dist/eval/resolve-slate-tasks.d.ts +35 -0
- package/dist/eval/resolve-slate-tasks.js +56 -0
- package/dist/eval/resolve-slate-tasks.js.map +1 -0
- package/dist/eval/screen-discovery.d.ts +22 -0
- package/dist/eval/screen-discovery.js +71 -0
- package/dist/eval/screen-discovery.js.map +1 -0
- package/dist/eval/screen-progress.d.ts +41 -0
- package/dist/eval/screen-progress.js +60 -0
- package/dist/eval/screen-progress.js.map +1 -0
- package/dist/eval/screen-runner.d.ts +30 -0
- package/dist/eval/screen-runner.js +289 -0
- package/dist/eval/screen-runner.js.map +1 -0
- package/dist/eval/screen.d.ts +107 -0
- package/dist/eval/screen.js +159 -0
- package/dist/eval/screen.js.map +1 -0
- package/dist/eval/slope.d.ts +29 -0
- package/dist/eval/slope.js +46 -0
- package/dist/eval/slope.js.map +1 -0
- package/dist/eval/train-sequence.d.ts +35 -0
- package/dist/eval/train-sequence.js +59 -0
- package/dist/eval/train-sequence.js.map +1 -0
- package/dist/eval/wilson.d.ts +45 -0
- package/dist/eval/wilson.js +48 -0
- package/dist/eval/wilson.js.map +1 -0
- package/dist/events/types.d.ts +1 -1
- package/dist/events/types.js +1 -1
- package/dist/events/types.js.map +1 -1
- package/dist/harnesses/auth-source.d.ts +51 -0
- package/dist/harnesses/auth-source.js +155 -0
- package/dist/harnesses/auth-source.js.map +1 -0
- package/dist/harnesses/engine/canonical-json.js +5 -3
- package/dist/harnesses/engine/canonical-json.js.map +1 -1
- package/dist/harnesses/engine/engine.d.ts +34 -1
- package/dist/harnesses/engine/engine.js +91 -11
- package/dist/harnesses/engine/engine.js.map +1 -1
- package/dist/harnesses/engine/packaging.js +5 -5
- package/dist/harnesses/engine/packaging.js.map +1 -1
- package/dist/harnesses/engine/persistence.d.ts +19 -61
- package/dist/harnesses/engine/persistence.js +28 -0
- package/dist/harnesses/engine/persistence.js.map +1 -1
- package/dist/harnesses/impls/_evaluator-base.d.ts +48 -0
- package/dist/harnesses/impls/_evaluator-base.js +35 -0
- package/dist/harnesses/impls/_evaluator-base.js.map +1 -0
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +1 -1
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js +1 -1
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/index.d.ts +2 -3
- package/dist/harnesses/impls/claude-mcp-prediction/index.js +29 -99
- package/dist/harnesses/impls/claude-mcp-prediction/index.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/mcp-tools.js +4 -21
- package/dist/harnesses/impls/claude-mcp-prediction/mcp-tools.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/session-orchestrator.d.ts +2 -0
- package/dist/harnesses/impls/claude-mcp-prediction/session-orchestrator.js +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction/session-orchestrator.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js +30 -79
- package/dist/harnesses/impls/claude-mcp-prediction-apy/index.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/mcp-tools.js +4 -19
- package/dist/harnesses/impls/claude-mcp-prediction-apy/mcp-tools.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/session-orchestrator.d.ts +2 -0
- package/dist/harnesses/impls/claude-mcp-prediction-apy/session-orchestrator.js +1 -1
- package/dist/harnesses/impls/claude-mcp-prediction-apy/session-orchestrator.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server-script.d.ts +39 -0
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server-script.js +62 -0
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server-script.js.map +1 -0
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server.d.ts +40 -0
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server.js +44 -0
- package/dist/harnesses/impls/claude-mcp-shared/mcp-server.js.map +1 -0
- package/dist/harnesses/impls/claude-mcp-shared/single-session-harness.d.ts +56 -0
- package/dist/harnesses/impls/claude-mcp-shared/single-session-harness.js +79 -0
- package/dist/harnesses/impls/claude-mcp-shared/single-session-harness.js.map +1 -0
- package/dist/harnesses/impls/hermes-agent/adapter.d.ts +2 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js +8 -5
- package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +1 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js +6 -1
- package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/harness.d.ts +25 -3
- package/dist/harnesses/impls/hermes-agent/harness.js +89 -5
- package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
- package/dist/harnesses/impls/index.d.ts +2 -0
- package/dist/harnesses/impls/index.js +10 -1
- package/dist/harnesses/impls/index.js.map +1 -1
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.d.ts +34 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js +111 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.d.ts +24 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js +19 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.d.ts +64 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.js +125 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.d.ts +32 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.js +73 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.js.map +1 -0
- package/dist/harnesses/impls/learner/adapters/claude-code.js +5 -0
- package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
- package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +11 -1
- package/dist/harnesses/impls/learner/adapters/codex-code.js +130 -15
- package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
- package/dist/harnesses/impls/learner/harness.d.ts +29 -1
- package/dist/harnesses/impls/learner/harness.js +85 -1
- package/dist/harnesses/impls/learner/harness.js.map +1 -1
- package/dist/harnesses/impls/learner/harvest.d.ts +2 -0
- package/dist/harnesses/impls/learner/harvest.js +51 -1
- package/dist/harnesses/impls/learner/harvest.js.map +1 -1
- package/dist/harnesses/impls/learner/plugin-path.js +1 -0
- package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.d.ts +5 -15
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js +10 -29
- package/dist/harnesses/impls/portfolio-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.d.ts +5 -15
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js +10 -23
- package/dist/harnesses/impls/prediction-apy-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/prediction-v0-evaluator/index.d.ts +5 -15
- package/dist/harnesses/impls/prediction-v0-evaluator/index.js +10 -25
- package/dist/harnesses/impls/prediction-v0-evaluator/index.js.map +1 -1
- package/dist/harnesses/impls/stub.d.ts +2 -2
- package/dist/harnesses/impls/stub.js +2 -2
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +8 -0
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +3 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +2 -2
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +3 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
- package/dist/harnesses/readiness-registry.d.ts +16 -0
- package/dist/harnesses/readiness-registry.js +28 -6
- package/dist/harnesses/readiness-registry.js.map +1 -1
- package/dist/harnesses/types.d.ts +26 -0
- package/dist/learner/revert-decision.d.ts +16 -1
- package/dist/learner/revert-decision.js +38 -18
- package/dist/learner/revert-decision.js.map +1 -1
- package/dist/learner/revert-stats.d.ts +14 -0
- package/dist/learner/revert-stats.js +42 -0
- package/dist/learner/revert-stats.js.map +1 -1
- package/dist/learner/verification-gate.d.ts +53 -0
- package/dist/learner/verification-gate.js +80 -0
- package/dist/learner/verification-gate.js.map +1 -0
- package/dist/local-provider-url.d.ts +3 -0
- package/dist/local-provider-url.js +28 -0
- package/dist/local-provider-url.js.map +1 -0
- package/dist/main.js +188 -566
- package/dist/main.js.map +1 -1
- package/dist/mcp/acquire-artifact.d.ts +3 -3
- package/dist/mcp/acquire-artifact.js +3 -3
- package/dist/mcp/operator-server.js +1 -1
- package/dist/mcp/operator-server.js.map +1 -1
- package/dist/mcp/server.js +5 -6
- package/dist/mcp/server.js.map +1 -1
- package/dist/monitoring/net-liveness.d.ts +143 -0
- package/dist/monitoring/net-liveness.js +301 -0
- package/dist/monitoring/net-liveness.js.map +1 -0
- package/dist/observability/emit-event.d.ts +1 -1
- package/dist/observability/emit-event.js +0 -4
- package/dist/observability/emit-event.js.map +1 -1
- package/dist/observability/progress.d.ts +11 -0
- package/dist/observability/progress.js +16 -0
- package/dist/observability/progress.js.map +1 -0
- package/dist/pilot/cost.d.ts +19 -0
- package/dist/pilot/cost.js +31 -0
- package/dist/pilot/cost.js.map +1 -0
- package/dist/pilot/instance.d.ts +20 -0
- package/dist/pilot/instance.js +19 -0
- package/dist/pilot/instance.js.map +1 -0
- package/dist/pilot/repo.d.ts +31 -0
- package/dist/pilot/repo.js +42 -0
- package/dist/pilot/repo.js.map +1 -0
- package/dist/pilot/solve.d.ts +22 -0
- package/dist/pilot/solve.js +37 -0
- package/dist/pilot/solve.js.map +1 -0
- package/dist/pilot/tally.d.ts +35 -0
- package/dist/pilot/tally.js +61 -0
- package/dist/pilot/tally.js.map +1 -0
- package/dist/plugins/learner/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/learner/.codex-plugin/plugin.json +1 -1
- package/dist/plugins/learner/hooks/session-start +30 -1
- package/dist/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
- package/dist/plugins/local-trace-distiller/.claude-plugin/plugin.json +9 -0
- package/dist/plugins/local-trace-distiller/.codex-plugin/plugin.json +41 -0
- package/dist/plugins/local-trace-distiller/.mcp.json +8 -0
- package/dist/plugins/local-trace-distiller/README.md +27 -0
- package/dist/plugins/local-trace-distiller/jinn.plugin.json +36 -0
- package/dist/plugins/local-trace-distiller/skills/distill/SKILL.md +51 -0
- package/dist/preflight/deployment-readiness.d.ts +127 -0
- package/dist/preflight/deployment-readiness.js +308 -0
- package/dist/preflight/deployment-readiness.js.map +1 -0
- package/dist/preflight/pidfile-liveness.d.ts +7 -1
- package/dist/preflight/pidfile-liveness.js +14 -0
- package/dist/preflight/pidfile-liveness.js.map +1 -1
- package/dist/preflight/rpc-network.d.ts +10 -3
- package/dist/preflight/rpc-network.js +46 -13
- package/dist/preflight/rpc-network.js.map +1 -1
- package/dist/preflight/stable-cwd.d.ts +29 -0
- package/dist/preflight/stable-cwd.js +98 -0
- package/dist/preflight/stable-cwd.js.map +1 -0
- package/dist/rpc/transport.d.ts +43 -5
- package/dist/rpc/transport.js +131 -30
- package/dist/rpc/transport.js.map +1 -1
- package/dist/scripts/swe-rebench-v2-seed-pool.json +2 -1
- package/dist/solver-nets/registry.d.ts +19 -0
- package/dist/solver-nets/registry.js +95 -66
- package/dist/solver-nets/registry.js.map +1 -1
- package/dist/solver-types/_jinn-repo-pool.d.ts +27 -0
- package/dist/solver-types/_jinn-repo-pool.js +27 -0
- package/dist/solver-types/_jinn-repo-pool.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.d.ts +76 -0
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.js +156 -0
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.d.ts +81 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.js +116 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-state.d.ts +9 -0
- package/dist/solver-types/_swe-rebench-v2-state.js +14 -0
- package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +30 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js +40 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
- package/dist/solver-types/index.js +2 -0
- package/dist/solver-types/index.js.map +1 -1
- package/dist/solver-types/jinn-repo-admit.d.ts +17 -0
- package/dist/solver-types/jinn-repo-admit.js +16 -0
- package/dist/solver-types/jinn-repo-admit.js.map +1 -0
- package/dist/solver-types/jinn-repo-auto.d.ts +60 -0
- package/dist/solver-types/jinn-repo-auto.js +163 -0
- package/dist/solver-types/jinn-repo-auto.js.map +1 -0
- package/dist/solver-types/jinn-repo-definition.d.ts +15 -0
- package/dist/solver-types/jinn-repo-definition.js +34 -0
- package/dist/solver-types/jinn-repo-definition.js.map +1 -0
- package/dist/solver-types/jinn-repo-extract.d.ts +16 -0
- package/dist/solver-types/jinn-repo-extract.js +32 -0
- package/dist/solver-types/jinn-repo-extract.js.map +1 -0
- package/dist/solver-types/jinn-repo.d.ts +21 -0
- package/dist/solver-types/jinn-repo.js +23 -0
- package/dist/solver-types/jinn-repo.js.map +1 -0
- package/dist/solver-types/learner-loop-test.js +1 -1
- package/dist/solver-types/learner-loop-test.js.map +1 -1
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v1.json +20 -0
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.json +19 -0
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.screening-report.json +628 -0
- package/dist/solver-types/solver-type.d.ts +8 -0
- package/dist/solver-types/swe-rebench-v2.d.ts +2 -0
- package/dist/solver-types/swe-rebench-v2.js +115 -10
- package/dist/solver-types/swe-rebench-v2.js.map +1 -1
- package/dist/solvernets/launched-record-dispatcher.d.ts +5 -0
- package/dist/solvernets/launched-record-dispatcher.js +14 -1
- package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
- package/dist/solvernets/registry-client-erc8004.js +29 -37
- package/dist/solvernets/registry-client-erc8004.js.map +1 -1
- package/dist/solvernets/registry-client.d.ts +6 -0
- package/dist/solvernets/store.d.ts +1 -1
- package/dist/solvernets/store.js +8 -3
- package/dist/solvernets/store.js.map +1 -1
- package/dist/spend/ai-units-config.d.ts +10 -0
- package/dist/spend/ai-units-config.js +7 -1
- package/dist/spend/ai-units-config.js.map +1 -1
- package/dist/spend/ai-units.d.ts +51 -0
- package/dist/spend/ai-units.js +73 -0
- package/dist/spend/ai-units.js.map +1 -1
- package/dist/spend/credential.d.ts +2 -2
- package/dist/spend/credential.js +9 -3
- package/dist/spend/credential.js.map +1 -1
- package/dist/spend/record.js +12 -5
- package/dist/spend/record.js.map +1 -1
- package/dist/spend/spend-cap.d.ts +10 -0
- package/dist/spend/spend-cap.js +13 -0
- package/dist/spend/spend-cap.js.map +1 -0
- package/dist/spend/usage.js +39 -3
- package/dist/spend/usage.js.map +1 -1
- package/dist/store/store.d.ts +106 -5
- package/dist/store/store.js +194 -8
- package/dist/store/store.js.map +1 -1
- package/dist/trajectory/emit.d.ts +6 -0
- package/dist/trajectory/emit.js +9 -1
- package/dist/trajectory/emit.js.map +1 -1
- package/dist/trajectory/harness-bundle-schema.d.ts +1 -1
- package/dist/trajectory/harness-bundle-schema.js +1 -1
- package/dist/trajectory/harness-bundle-schema.js.map +1 -1
- package/dist/trajectory/processors/identity-scrub.js +22 -3
- package/dist/trajectory/processors/identity-scrub.js.map +1 -1
- package/dist/trajectory/schema.d.ts +1 -1
- package/dist/trajectory/schema.js +1 -1
- package/dist/trajectory/schema.js.map +1 -1
- package/dist/trajectory/scrub/build.d.ts +46 -0
- package/dist/trajectory/scrub/build.js +76 -0
- package/dist/trajectory/scrub/build.js.map +1 -0
- package/dist/trajectory/scrub/emit-scrub.d.ts +41 -0
- package/dist/trajectory/scrub/emit-scrub.js +88 -0
- package/dist/trajectory/scrub/emit-scrub.js.map +1 -0
- package/dist/trajectory/scrub/key-policy.d.ts +20 -0
- package/dist/trajectory/scrub/key-policy.js +43 -0
- package/dist/trajectory/scrub/key-policy.js.map +1 -0
- package/dist/trajectory/scrub/layer2.d.ts +23 -0
- package/dist/trajectory/scrub/layer2.js +33 -0
- package/dist/trajectory/scrub/layer2.js.map +1 -0
- package/dist/trajectory/scrub/ml-pii-stage.d.ts +24 -0
- package/dist/trajectory/scrub/ml-pii-stage.js +43 -0
- package/dist/trajectory/scrub/ml-pii-stage.js.map +1 -0
- package/dist/trajectory/scrub/openredaction-stage.d.ts +178 -0
- package/dist/trajectory/scrub/openredaction-stage.js +269 -0
- package/dist/trajectory/scrub/openredaction-stage.js.map +1 -0
- package/dist/trajectory/scrub/pii-build.d.ts +31 -0
- package/dist/trajectory/scrub/pii-build.js +64 -0
- package/dist/trajectory/scrub/pii-build.js.map +1 -0
- package/dist/trajectory/scrub/pipeline.d.ts +37 -0
- package/dist/trajectory/scrub/pipeline.js +83 -0
- package/dist/trajectory/scrub/pipeline.js.map +1 -0
- package/dist/trajectory/scrub/plain-patterns-stage.d.ts +31 -0
- package/dist/trajectory/scrub/plain-patterns-stage.js +85 -0
- package/dist/trajectory/scrub/plain-patterns-stage.js.map +1 -0
- package/dist/trajectory/scrub/secretlint-stage.d.ts +35 -0
- package/dist/trajectory/scrub/secretlint-stage.js +250 -0
- package/dist/trajectory/scrub/secretlint-stage.js.map +1 -0
- package/dist/trajectory/scrub/transformers-detector.d.ts +35 -0
- package/dist/trajectory/scrub/transformers-detector.js +68 -0
- package/dist/trajectory/scrub/transformers-detector.js.map +1 -0
- package/dist/trajectory/scrub/types.d.ts +25 -0
- package/dist/trajectory/scrub/types.js +2 -0
- package/dist/trajectory/scrub/types.js.map +1 -0
- package/dist/trajectory/transcript-parsers/types.d.ts +1 -1
- package/dist/trajectory/transcript-parsers/types.js +1 -1
- package/dist/trajectory/transcript-parsers/types.js.map +1 -1
- package/dist/trajectory/transcript-watcher.d.ts +26 -0
- package/dist/trajectory/transcript-watcher.js +33 -0
- package/dist/trajectory/transcript-watcher.js.map +1 -1
- package/dist/tx-retry.d.ts +12 -0
- package/dist/tx-retry.js +41 -12
- package/dist/tx-retry.js.map +1 -1
- package/dist/types/envelope.d.ts +1 -1
- package/dist/types/envelope.js +1 -1
- package/dist/types/envelope.js.map +1 -1
- package/dist/types/payloads/index.d.ts +1 -1
- package/dist/types/payloads/index.js +7 -1
- package/dist/types/payloads/index.js.map +1 -1
- package/dist/types/payloads/portfolio-v0.d.ts +1 -1
- package/dist/types/payloads/portfolio-v0.js +1 -1
- package/dist/types/payloads/portfolio-v0.js.map +1 -1
- package/dist/types/payloads/prediction-apy-v0.d.ts +1 -1
- package/dist/types/payloads/prediction-apy-v0.js +1 -1
- package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
- package/dist/types/payloads/prediction-v0.d.ts +1 -1
- package/dist/types/payloads/prediction-v0.js +1 -1
- package/dist/types/payloads/prediction-v0.js.map +1 -1
- package/dist/types/portfolio.d.ts +1 -1
- package/dist/types/portfolio.js +1 -1
- package/dist/types/portfolio.js.map +1 -1
- package/dist/types/prediction-apy.d.ts +1 -1
- package/dist/types/prediction-apy.js +1 -1
- package/dist/types/prediction-apy.js.map +1 -1
- package/dist/types/prediction.d.ts +1 -1
- package/dist/types/prediction.js +1 -1
- package/dist/types/prediction.js.map +1 -1
- package/dist/types/session-provenance.d.ts +1 -1
- package/dist/types/session-provenance.js +1 -1
- package/dist/types/session-provenance.js.map +1 -1
- package/dist/types/skill-artifact.d.ts +442 -0
- package/dist/types/skill-artifact.js +137 -0
- package/dist/types/skill-artifact.js.map +1 -0
- package/dist/types/task-document.d.ts +315 -1
- package/dist/types/task-document.js +9 -1
- package/dist/types/task-document.js.map +1 -1
- package/dist/types/task-run-read-model.d.ts +21 -0
- package/dist/types/task-run-read-model.js +2 -0
- package/dist/types/task-run-read-model.js.map +1 -0
- package/dist/types/task-run.d.ts +75 -0
- package/dist/types/task-run.js +2 -0
- package/dist/types/task-run.js.map +1 -0
- package/dist/types/task.d.ts +29 -1
- package/dist/types/task.js +1 -1
- package/dist/types/task.js.map +1 -1
- package/dist/types/window.d.ts +1 -1
- package/dist/types/window.js +1 -1
- package/dist/types/window.js.map +1 -1
- package/dist/util/redact-rpc-urls.d.ts +1 -1
- package/dist/util/redact-rpc-urls.js +57 -2
- package/dist/util/redact-rpc-urls.js.map +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/checkpoint.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/checkpoint.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/contracts.d.ts +3 -2
- package/dist/vendor/@jinn-network/sdk/dist/contracts.js +49 -0
- package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.d.ts +44 -0
- package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.js +25 -0
- package/dist/vendor/@jinn-network/sdk/dist/json-schema.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/json-schema.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.d.ts +38 -0
- package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.js +22 -0
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +109 -2
- package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +26 -2
- package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.d.ts +4 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.js +2 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.d.ts +65 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.js +123 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.d.ts +2 -2
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.js +1 -1
- package/dist/vendor/@jinn-network/sdk/package.json +9 -1
- package/docker-compose.yml +3 -2
- package/package.json +43 -28
- package/plugins/jinn-repo-runtime/.claude-plugin/plugin.json +5 -0
- package/plugins/jinn-repo-runtime/.codex-plugin/plugin.json +39 -0
- package/plugins/jinn-repo-runtime/README.md +27 -0
- package/plugins/jinn-repo-runtime/hooks/hooks.json +16 -0
- package/plugins/jinn-repo-runtime/hooks/session-start +73 -0
- package/plugins/jinn-repo-runtime/jinn.plugin.json +11 -0
- package/plugins/jinn-repo-runtime/skills/task/SKILL.md +92 -0
- package/plugins/learner/.claude-plugin/plugin.json +1 -1
- package/plugins/learner/.codex-plugin/plugin.json +1 -1
- package/plugins/learner/hooks/session-start +30 -1
- package/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
- package/plugins/local-trace-distiller/.claude-plugin/plugin.json +9 -0
- package/plugins/local-trace-distiller/.codex-plugin/plugin.json +41 -0
- package/plugins/local-trace-distiller/.mcp.json +8 -0
- package/plugins/local-trace-distiller/README.md +27 -0
- package/plugins/local-trace-distiller/jinn.plugin.json +36 -0
- package/plugins/local-trace-distiller/skills/distill/SKILL.md +51 -0
- package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
- package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
- package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +0 -55
- package/deployments/deployment-jinn-mvi-l1-sepolia.json +0 -55
- package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +0 -13
- package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +0 -15
- package/dist/api/peers.js.map +0 -1
- package/dist/daemon/jinn-claim-loop-canonical.d.ts +0 -207
- package/dist/daemon/jinn-claim-loop-canonical.js +0 -296
- package/dist/daemon/jinn-claim-loop-canonical.js.map +0 -1
- package/dist/daemon/jinn-claim-loop-mock.d.ts +0 -61
- package/dist/daemon/jinn-claim-loop-mock.js +0 -122
- package/dist/daemon/jinn-claim-loop-mock.js.map +0 -1
- package/dist/daemon/jinn-claim-loop-wiring.d.ts +0 -33
- package/dist/daemon/jinn-claim-loop-wiring.js +0 -40
- package/dist/daemon/jinn-claim-loop-wiring.js.map +0 -1
- package/dist/daemon/jinn-claim-loop.d.ts +0 -130
- package/dist/daemon/jinn-claim-loop.js +0 -328
- package/dist/daemon/jinn-claim-loop.js.map +0 -1
- package/dist/dashboard/assets/index-CzKxvMcU.css +0 -32
- package/dist/dashboard/assets/index-yVemxHot.js +0 -351
- package/dist/earning/jinn-rewards.js.map +0 -1
- package/dist/scripts/donation-consumption-acceptance.d.ts +0 -85
- package/dist/scripts/donation-consumption-acceptance.js +0 -1382
- package/dist/scripts/donation-consumption-acceptance.js.map +0 -1
- package/dist/x402/acquire.d.ts +0 -17
- package/dist/x402/acquire.js +0 -49
- package/dist/x402/acquire.js.map +0 -1
- package/dist/x402/facilitator.d.ts +0 -11
- package/dist/x402/facilitator.js +0 -52
- package/dist/x402/facilitator.js.map +0 -1
- package/dist/x402/handler.d.ts +0 -27
- package/dist/x402/handler.js +0 -236
- package/dist/x402/handler.js.map +0 -1
- /package/dist/{api/peers.d.ts → daemon/peer-sync.d.ts} +0 -0
|
@@ -0,0 +1,813 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// packages/harness-layer/src/bin/jinn-distil-mcp.ts
|
|
4
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
+
|
|
6
|
+
// packages/harness-layer/src/distil-mcp-server.ts
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
import { existsSync as existsSync2, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
9
|
+
import { tmpdir } from "node:os";
|
|
10
|
+
import { basename, join as join3 } from "node:path";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
13
|
+
import { z as z5 } from "zod/v3";
|
|
14
|
+
|
|
15
|
+
// packages/harness-layer/src/distil-captures.ts
|
|
16
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
17
|
+
import { homedir } from "node:os";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
|
|
20
|
+
// packages/harness-layer/src/capture.ts
|
|
21
|
+
import { z as z2 } from "zod";
|
|
22
|
+
|
|
23
|
+
// src/trajectory/scrub/openredaction-stage.ts
|
|
24
|
+
import { OpenRedaction } from "openredaction";
|
|
25
|
+
|
|
26
|
+
// src/trajectory/scrub/secretlint-stage.ts
|
|
27
|
+
import { lintSource } from "@secretlint/core";
|
|
28
|
+
import { creator } from "@secretlint/secretlint-rule-preset-recommend";
|
|
29
|
+
|
|
30
|
+
// src/trajectory/hash-chain.ts
|
|
31
|
+
import { keccak256, toBytes } from "viem";
|
|
32
|
+
|
|
33
|
+
// src/harnesses/engine/canonical-json.ts
|
|
34
|
+
import canonicalize from "canonicalize";
|
|
35
|
+
|
|
36
|
+
// packages/harness-layer/src/envelope.ts
|
|
37
|
+
import { z } from "zod";
|
|
38
|
+
var TRACE_ENVELOPE_SCHEMA_VERSION = "jinn.trace-envelope.v0";
|
|
39
|
+
var MAX_STEPS = 512;
|
|
40
|
+
var MAX_STEP_ATTRIBUTES_BYTES = 16 * 1024;
|
|
41
|
+
var MAX_DISTRIBUTION_TAGS = 16;
|
|
42
|
+
var VERIFIABILITY_TIERS = [
|
|
43
|
+
"user-accepted",
|
|
44
|
+
"tests-passed",
|
|
45
|
+
"evaluator-verified"
|
|
46
|
+
];
|
|
47
|
+
var VerifiabilityTierSchema = z.enum(VERIFIABILITY_TIERS);
|
|
48
|
+
var OutcomeStatusSchema = z.enum(["completed", "failed", "abandoned"]);
|
|
49
|
+
var UnixNanoSchema = z.string().regex(/^\d+$/, "unix-nanosecond digit string");
|
|
50
|
+
var TrimmedString = (max) => z.string().min(1).max(max).regex(/^\S(.*\S)?$/s, "no surrounding whitespace");
|
|
51
|
+
var TraceStepSchema = z.strictObject({
|
|
52
|
+
spanId: z.string().min(1),
|
|
53
|
+
parentSpanId: z.string().min(1).nullable(),
|
|
54
|
+
name: z.string().min(1),
|
|
55
|
+
startTimeUnixNano: UnixNanoSchema,
|
|
56
|
+
endTimeUnixNano: UnixNanoSchema,
|
|
57
|
+
attributes: z.record(z.string(), z.unknown()).superRefine((attrs, ctx) => {
|
|
58
|
+
let serialised;
|
|
59
|
+
try {
|
|
60
|
+
serialised = JSON.stringify(attrs);
|
|
61
|
+
} catch {
|
|
62
|
+
ctx.addIssue({ code: "custom", message: "attributes must be JSON-serialisable" });
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const bytes = Buffer.byteLength(serialised, "utf8");
|
|
66
|
+
if (bytes > MAX_STEP_ATTRIBUTES_BYTES) {
|
|
67
|
+
ctx.addIssue({
|
|
68
|
+
code: "custom",
|
|
69
|
+
message: `attributes serialise to ${bytes} bytes (max ${MAX_STEP_ATTRIBUTES_BYTES})`
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}),
|
|
73
|
+
redactedKeys: z.array(z.string().min(1)),
|
|
74
|
+
/**
|
|
75
|
+
* Which attribute keys the capture→envelope pipeline truncated to fit
|
|
76
|
+
* `MAX_STEP_ATTRIBUTES_BYTES` — the visible truncation receipt, sibling
|
|
77
|
+
* to `redactedKeys` (2026-07-02 schema review, Q4).
|
|
78
|
+
*/
|
|
79
|
+
truncatedKeys: z.array(z.string().min(1)).optional()
|
|
80
|
+
});
|
|
81
|
+
var TraceEnvelopeV0Schema = z.strictObject({
|
|
82
|
+
/** Migration gate — v1 readers reject/route on this. */
|
|
83
|
+
schemaVersion: z.literal(TRACE_ENVELOPE_SCHEMA_VERSION),
|
|
84
|
+
/** Capture-session identity: ledger correlation + dedup. */
|
|
85
|
+
session: z.strictObject({
|
|
86
|
+
sessionId: z.string().min(1).max(128),
|
|
87
|
+
capturedAt: z.iso.datetime()
|
|
88
|
+
}),
|
|
89
|
+
/** What the user was doing — the demand signal (spec §5). */
|
|
90
|
+
task: z.strictObject({
|
|
91
|
+
/** Scrubbed one-line descriptor of the task. */
|
|
92
|
+
summary: TrimmedString(500),
|
|
93
|
+
/**
|
|
94
|
+
* Freeform — no fixed taxonomy; clustering is inferred server-side.
|
|
95
|
+
* At least one tag: an untagged envelope is invisible to the signal.
|
|
96
|
+
*/
|
|
97
|
+
distributionTags: z.array(TrimmedString(64)).min(1).max(MAX_DISTRIBUTION_TAGS)
|
|
98
|
+
}),
|
|
99
|
+
/** Config-diversity fingerprint (spec §5): harness, model, tools. */
|
|
100
|
+
environment: z.strictObject({
|
|
101
|
+
harness: z.strictObject({
|
|
102
|
+
name: z.string().min(1),
|
|
103
|
+
version: z.string().min(1)
|
|
104
|
+
}),
|
|
105
|
+
model: z.string().min(1),
|
|
106
|
+
/** Tool names only — never tool configs or arguments. */
|
|
107
|
+
tools: z.array(z.string().min(1).max(128)).max(64)
|
|
108
|
+
}),
|
|
109
|
+
/** The compressed trace body — the evidence itself. */
|
|
110
|
+
steps: z.array(TraceStepSchema).min(1).max(MAX_STEPS),
|
|
111
|
+
/** What happened, and how the status was established. */
|
|
112
|
+
outcome: z.strictObject({
|
|
113
|
+
status: OutcomeStatusSchema,
|
|
114
|
+
/**
|
|
115
|
+
* How the recorded status was established — the anti-farming line the
|
|
116
|
+
* activity checker counts against. Qualifies the status, so failed
|
|
117
|
+
* tasks carry a tier too.
|
|
118
|
+
*/
|
|
119
|
+
verifiabilityTier: VerifiabilityTierSchema,
|
|
120
|
+
summary: TrimmedString(500).optional()
|
|
121
|
+
}),
|
|
122
|
+
/** What the task cost to run — the §8 capability-gate metric. */
|
|
123
|
+
cost: z.strictObject({
|
|
124
|
+
durationMs: z.number().int().nonnegative(),
|
|
125
|
+
tokens: z.strictObject({
|
|
126
|
+
input: z.number().int().nonnegative(),
|
|
127
|
+
output: z.number().int().nonnegative()
|
|
128
|
+
}).optional(),
|
|
129
|
+
/** Decimal string — money is never IEEE-754. An estimate, named as such. */
|
|
130
|
+
usdEstimate: z.string().regex(/^\d+(\.\d+)?$/).optional()
|
|
131
|
+
}),
|
|
132
|
+
/**
|
|
133
|
+
* The publish gate (spec §5), fail-closed at the type level: both flags
|
|
134
|
+
* are literal `true`, so an envelope representing an unconsented or
|
|
135
|
+
* unscrubbed trace is not constructible.
|
|
136
|
+
*/
|
|
137
|
+
consent: z.strictObject({
|
|
138
|
+
/** First-run consent given AND no per-task veto on this trace. */
|
|
139
|
+
contributionConsent: z.literal(true),
|
|
140
|
+
/** The mandatory scrub pipeline completed on this trace. */
|
|
141
|
+
scrubCompleted: z.literal(true)
|
|
142
|
+
}),
|
|
143
|
+
/**
|
|
144
|
+
* `contributed` = real user trace; `imported` = seed (spec §7).
|
|
145
|
+
* The distribution signal excludes `imported`.
|
|
146
|
+
*/
|
|
147
|
+
provenance: z.enum(["contributed", "imported"])
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// packages/harness-layer/src/capture.ts
|
|
151
|
+
var UnixNanoSchema2 = z2.string().regex(/^\d+$/, "unix-nanosecond digit string");
|
|
152
|
+
var CapturedTaskSchema = z2.strictObject({
|
|
153
|
+
session: z2.strictObject({
|
|
154
|
+
sessionId: z2.string().min(1).max(128),
|
|
155
|
+
capturedAt: z2.iso.datetime()
|
|
156
|
+
}),
|
|
157
|
+
task: z2.strictObject({
|
|
158
|
+
summary: z2.string().min(1),
|
|
159
|
+
distributionTags: z2.array(z2.string().min(1)).min(1)
|
|
160
|
+
}),
|
|
161
|
+
environment: z2.strictObject({
|
|
162
|
+
harness: z2.strictObject({
|
|
163
|
+
name: z2.string().min(1),
|
|
164
|
+
version: z2.string().min(1)
|
|
165
|
+
}),
|
|
166
|
+
model: z2.string().min(1),
|
|
167
|
+
tools: z2.array(z2.string().min(1))
|
|
168
|
+
}),
|
|
169
|
+
steps: z2.array(z2.strictObject({
|
|
170
|
+
spanId: z2.string().min(1),
|
|
171
|
+
parentSpanId: z2.string().min(1).nullable(),
|
|
172
|
+
name: z2.string().min(1),
|
|
173
|
+
startTimeUnixNano: UnixNanoSchema2,
|
|
174
|
+
endTimeUnixNano: UnixNanoSchema2,
|
|
175
|
+
attributes: z2.record(z2.string(), z2.unknown()),
|
|
176
|
+
/** Keys already redacted at ingest, if the capture recorded any. */
|
|
177
|
+
redactedKeys: z2.array(z2.string().min(1)).default([])
|
|
178
|
+
})).min(1),
|
|
179
|
+
outcome: z2.strictObject({
|
|
180
|
+
status: OutcomeStatusSchema,
|
|
181
|
+
verifiabilityTier: VerifiabilityTierSchema,
|
|
182
|
+
summary: z2.string().min(1).optional()
|
|
183
|
+
}),
|
|
184
|
+
cost: z2.strictObject({
|
|
185
|
+
durationMs: z2.number().int().nonnegative(),
|
|
186
|
+
tokens: z2.strictObject({
|
|
187
|
+
input: z2.number().int().nonnegative(),
|
|
188
|
+
output: z2.number().int().nonnegative()
|
|
189
|
+
}).optional(),
|
|
190
|
+
usdEstimate: z2.string().regex(/^\d+(\.\d+)?$/).optional()
|
|
191
|
+
}),
|
|
192
|
+
provenance: z2.enum(["contributed", "imported"]).default("contributed")
|
|
193
|
+
});
|
|
194
|
+
function parseCapturedTask(input) {
|
|
195
|
+
return CapturedTaskSchema.parse(input);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// packages/harness-layer/src/skill-package.ts
|
|
199
|
+
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
200
|
+
import { z as z4 } from "zod";
|
|
201
|
+
|
|
202
|
+
// src/types/skill-artifact.ts
|
|
203
|
+
import { z as z3 } from "zod/v3";
|
|
204
|
+
var SKILL_ARTIFACT_TYPE = "jinn.skill.v1";
|
|
205
|
+
var MAX_SKILL_FILES = 64;
|
|
206
|
+
var MAX_SKILL_TOTAL_DECODED_BYTES = 1024 * 1024;
|
|
207
|
+
var HexAddressSchema = z3.string().regex(/^0x[0-9a-fA-F]*$/);
|
|
208
|
+
var CompanionPathSchema = z3.string().min(1).refine(
|
|
209
|
+
(p) => !p.includes("\\") && !p.startsWith("/") && !/^[A-Za-z]:/.test(p) && !p.split("/").includes("..") && !p.split("/").includes(""),
|
|
210
|
+
{ message: "companion file path must be a relative, traversal-free POSIX path" }
|
|
211
|
+
);
|
|
212
|
+
var SkillCompanionFileSchema = z3.object({
|
|
213
|
+
path: CompanionPathSchema,
|
|
214
|
+
contentBase64: z3.string(),
|
|
215
|
+
sha256: z3.string().regex(/^[0-9a-f]{64}$/)
|
|
216
|
+
});
|
|
217
|
+
var SkillProvenanceSchema = z3.object({
|
|
218
|
+
kind: z3.enum(["imported", "distilled"]),
|
|
219
|
+
/**
|
|
220
|
+
* Envelope CIDs the skill was distilled from ([] for seed imports).
|
|
221
|
+
* The "distilled from N traces" count is this array's length — never
|
|
222
|
+
* stored separately (anti-drift).
|
|
223
|
+
*/
|
|
224
|
+
sourceEnvelopeCids: z3.array(z3.string().min(1)),
|
|
225
|
+
operator: z3.object({ safeAddress: HexAddressSchema }),
|
|
226
|
+
solverType: z3.string().min(1).optional(),
|
|
227
|
+
/** Seed attribution, mirroring the seeded trace's `seed.attribution`. */
|
|
228
|
+
seed: z3.object({
|
|
229
|
+
skill: z3.string().min(1),
|
|
230
|
+
source: z3.string().min(1),
|
|
231
|
+
licence: z3.string().nullable()
|
|
232
|
+
}).optional(),
|
|
233
|
+
// --- distilled-skill fields (DR-2026-07-06, additive; producer is
|
|
234
|
+
// publishSkill() in client/packages/harness-layer/src/publish-skill.ts) ---
|
|
235
|
+
/**
|
|
236
|
+
* Success→strategic-pattern, failure→lesson, both-polarity→contrastive
|
|
237
|
+
* (spec §7, D10 + v0.5), or cross-instance corroboration→cross-instance
|
|
238
|
+
* (stage-2 meta-distill). `contrastive` and `cross-instance` are additive
|
|
239
|
+
* enum values: strict consumers (`extractSkill`) reject them until upgraded
|
|
240
|
+
* — acceptable at testnet volume, named in the spec.
|
|
241
|
+
*/
|
|
242
|
+
skillKind: z3.enum(["strategic-pattern", "failure-lesson", "contrastive", "cross-instance"]).optional(),
|
|
243
|
+
/** SHA-256 of the exact distill prompt that produced the skill (auditability, D4). */
|
|
244
|
+
distillPromptSha256: z3.string().regex(/^[0-9a-f]{64}$/).optional(),
|
|
245
|
+
/** Task-distribution the skill targets (e.g. 'coding'). */
|
|
246
|
+
distribution: z3.string().min(1).optional(),
|
|
247
|
+
/** Verifiability tier of the source evidence (e.g. 'evaluator-verified'). */
|
|
248
|
+
verifiabilityTier: z3.string().min(1).optional(),
|
|
249
|
+
/**
|
|
250
|
+
* The model that ran distillation (spec §5, v0.5). Distillation quality is
|
|
251
|
+
* model-sensitive; recording it makes a skill's quality auditable.
|
|
252
|
+
*/
|
|
253
|
+
distillModel: z3.string().min(1).optional(),
|
|
254
|
+
/**
|
|
255
|
+
* Deterministic `ceil(utf8 chars / 4)` token estimates of the distiller
|
|
256
|
+
* input and the emitted body (spec §5, v0.5). The pair records the
|
|
257
|
+
* compression ratio (SkillRL operates at 10–20×); an auditable estimate
|
|
258
|
+
* serves that purpose better than an unreproducible exact count (the LLM
|
|
259
|
+
* port reports no usage).
|
|
260
|
+
*/
|
|
261
|
+
evidenceTokens: z3.number().int().nonnegative().optional(),
|
|
262
|
+
skillTokens: z3.number().int().nonnegative().optional(),
|
|
263
|
+
// --- supersede lineage (issue #1462, additive) ---
|
|
264
|
+
/**
|
|
265
|
+
* Envelope/manifest CID of a prior skill record this one replaces — the same
|
|
266
|
+
* identity space as `sourceEnvelopeCids` and a search-hit `ref`. Honored at
|
|
267
|
+
* read time ONLY when this record's operator matches the superseded record's
|
|
268
|
+
* operator (cross-operator supersedes are ignored); see the read-path head
|
|
269
|
+
* resolver in client/packages/harness-layer/src/consume.ts.
|
|
270
|
+
*/
|
|
271
|
+
supersedes: z3.string().min(1).optional(),
|
|
272
|
+
/**
|
|
273
|
+
* Pure retirement marker: retires this record's `supersedes` target with no
|
|
274
|
+
* replacement and hides this record itself from discovery. A deprecation
|
|
275
|
+
* record carries no successor skill content.
|
|
276
|
+
*/
|
|
277
|
+
deprecates: z3.boolean().optional()
|
|
278
|
+
});
|
|
279
|
+
function base64DecodedBytes(b64) {
|
|
280
|
+
const padding = b64.endsWith("==") ? 2 : b64.endsWith("=") ? 1 : 0;
|
|
281
|
+
return Math.max(0, Math.floor(b64.length * 3 / 4) - padding);
|
|
282
|
+
}
|
|
283
|
+
var SkillArtifactV1Schema = z3.object({
|
|
284
|
+
schemaVersion: z3.literal(SKILL_ARTIFACT_TYPE),
|
|
285
|
+
skill: z3.object({
|
|
286
|
+
name: z3.string().min(1),
|
|
287
|
+
description: z3.string().optional(),
|
|
288
|
+
skillMd: z3.string().min(1)
|
|
289
|
+
}),
|
|
290
|
+
files: z3.array(SkillCompanionFileSchema).max(MAX_SKILL_FILES),
|
|
291
|
+
provenance: SkillProvenanceSchema
|
|
292
|
+
}).refine(
|
|
293
|
+
(a) => new TextEncoder().encode(a.skill.skillMd).length + a.files.reduce((n, f) => n + base64DecodedBytes(f.contentBase64), 0) <= MAX_SKILL_TOTAL_DECODED_BYTES,
|
|
294
|
+
{ message: "skill artifact exceeds the 1 MiB total decoded-content cap" }
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
// packages/harness-layer/src/skill-package.ts
|
|
298
|
+
var SkillPackageMetaSchema = z4.strictObject({
|
|
299
|
+
schema: z4.literal(SKILL_ARTIFACT_TYPE),
|
|
300
|
+
distribution: z4.string().min(1),
|
|
301
|
+
verifiabilityTier: z4.string().min(1),
|
|
302
|
+
distilledFrom: z4.number().int().nonnegative(),
|
|
303
|
+
provenance: z4.array(z4.string().min(1)),
|
|
304
|
+
distillPromptSha256: z4.string().regex(/^[0-9a-f]{64}$/).optional(),
|
|
305
|
+
distilledAt: z4.string().optional(),
|
|
306
|
+
seedSource: z4.string().optional(),
|
|
307
|
+
skillKind: z4.enum(["strategic-pattern", "failure-lesson", "contrastive", "cross-instance"]).optional(),
|
|
308
|
+
status: z4.enum(["experimental", "stable", "deprecated"]).optional(),
|
|
309
|
+
evidenceTier: z4.enum(["single-example", "recurring-pattern", "contrastive", "user-confirmed", "stable", "deprecated"]).optional(),
|
|
310
|
+
sourceTools: z4.array(z4.string().min(1)).optional(),
|
|
311
|
+
targetTools: z4.array(z4.string().min(1)).optional(),
|
|
312
|
+
uses: z4.number().int().nonnegative().optional(),
|
|
313
|
+
positiveFeedback: z4.number().int().nonnegative().optional(),
|
|
314
|
+
negativeFeedback: z4.number().int().nonnegative().optional(),
|
|
315
|
+
// Auditability (spec §5, v0.5): the distilling model + a deterministic
|
|
316
|
+
// ceil(chars/4) token estimate of input vs body (the compression ratio).
|
|
317
|
+
distillModel: z4.string().min(1).optional(),
|
|
318
|
+
evidenceTokens: z4.number().int().nonnegative().optional(),
|
|
319
|
+
skillTokens: z4.number().int().nonnegative().optional()
|
|
320
|
+
}).refine((m) => m.distilledFrom <= m.provenance.length && (m.provenance.length === 0 || m.distilledFrom >= 1), {
|
|
321
|
+
message: "distilledFrom must be between 1 and provenance.length (distinct-instance corroboration \u2264 audited traces)"
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
// packages/harness-layer/src/distil-captures.ts
|
|
325
|
+
var DEFAULT_CAPTURES_DIR = join(homedir(), ".jinn-client", "harness-layer", "captures");
|
|
326
|
+
var DEFAULT_SKILLS_INSTALL_DIR = join(homedir(), ".jinn-client", "harness-layer", "skills");
|
|
327
|
+
var DEFAULT_DISTIL_CAPTURE_LIMIT = 50;
|
|
328
|
+
function loadRecentCaptures(dir, limit) {
|
|
329
|
+
if (!existsSync(dir)) return [];
|
|
330
|
+
const parsed = [];
|
|
331
|
+
for (const file of readdirSync(dir)) {
|
|
332
|
+
if (!file.endsWith(".json")) continue;
|
|
333
|
+
try {
|
|
334
|
+
parsed.push(parseCapturedTask(JSON.parse(readFileSync(join(dir, file), "utf-8"))));
|
|
335
|
+
} catch (err) {
|
|
336
|
+
console.warn(
|
|
337
|
+
`[distil] skipping malformed capture file ${file}: ${err instanceof Error ? err.message : String(err)}`
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
parsed.sort((a, b) => b.session.capturedAt.localeCompare(a.session.capturedAt));
|
|
342
|
+
return parsed.slice(0, limit);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// packages/harness-layer/src/distil-traces.ts
|
|
346
|
+
function uniq(values) {
|
|
347
|
+
return [...new Set([...values].filter((v) => typeof v === "string" && v.trim() !== "").map((v) => v.trim()))];
|
|
348
|
+
}
|
|
349
|
+
function oneLine(value, max = 240) {
|
|
350
|
+
if (typeof value !== "string") return void 0;
|
|
351
|
+
const text = value.replace(/\s+/g, " ").trim();
|
|
352
|
+
if (!text) return void 0;
|
|
353
|
+
return text.length > max ? `${text.slice(0, max - 1)}\u2026` : text;
|
|
354
|
+
}
|
|
355
|
+
function parseJsonObject(value) {
|
|
356
|
+
if (typeof value !== "string") return null;
|
|
357
|
+
try {
|
|
358
|
+
const parsed = JSON.parse(value);
|
|
359
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
|
|
360
|
+
} catch {
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
function commandFromStep(step) {
|
|
365
|
+
const args = parseJsonObject(step.attributes["tool.args"]);
|
|
366
|
+
return oneLine(args?.["command"] ?? args?.["cmd"] ?? step.attributes["command"]);
|
|
367
|
+
}
|
|
368
|
+
function fileFromStep(step) {
|
|
369
|
+
const args = parseJsonObject(step.attributes["tool.args"]);
|
|
370
|
+
return oneLine(step.attributes["file.path"] ?? args?.["path"] ?? args?.["file"]);
|
|
371
|
+
}
|
|
372
|
+
function eventKind(step) {
|
|
373
|
+
return typeof step.attributes["jinn.capture.event.kind"] === "string" ? step.attributes["jinn.capture.event.kind"] : step.name;
|
|
374
|
+
}
|
|
375
|
+
function eventText(step) {
|
|
376
|
+
return oneLine(
|
|
377
|
+
step.attributes["message.content"] ?? step.attributes["tool.result"] ?? step.attributes["file.diff"] ?? commandFromStep(step) ?? fileFromStep(step)
|
|
378
|
+
);
|
|
379
|
+
}
|
|
380
|
+
function toolName(step) {
|
|
381
|
+
return oneLine(step.attributes["tool.name"]);
|
|
382
|
+
}
|
|
383
|
+
function traceId(task) {
|
|
384
|
+
return `local-capture:${task.session.sessionId}`;
|
|
385
|
+
}
|
|
386
|
+
function traceCardFromCapture(task) {
|
|
387
|
+
const commands = uniq(task.steps.map(commandFromStep));
|
|
388
|
+
const filesTouched = uniq(task.steps.map(fileFromStep));
|
|
389
|
+
const errorSnippets = uniq(task.steps.map((step) => {
|
|
390
|
+
const isError = step.attributes["tool.is_error"] === true || step.attributes["tool.is_error"] === "true";
|
|
391
|
+
return isError ? oneLine(step.attributes["tool.result"]) : void 0;
|
|
392
|
+
}));
|
|
393
|
+
const toolNames = uniq([
|
|
394
|
+
...task.environment.tools,
|
|
395
|
+
...task.steps.map(toolName)
|
|
396
|
+
]);
|
|
397
|
+
const redactionFlags = task.steps.some((step) => step.redactedKeys.length > 0) ? ["redacted"] : [];
|
|
398
|
+
return {
|
|
399
|
+
traceId: traceId(task),
|
|
400
|
+
sessionId: task.session.sessionId,
|
|
401
|
+
sourceTool: task.environment.harness.name,
|
|
402
|
+
startedAt: task.session.capturedAt,
|
|
403
|
+
durationMs: task.cost.durationMs,
|
|
404
|
+
summary: task.task.summary,
|
|
405
|
+
tools: toolNames,
|
|
406
|
+
commands,
|
|
407
|
+
filesTouched,
|
|
408
|
+
errorSnippets,
|
|
409
|
+
outcome: task.outcome.status,
|
|
410
|
+
skillsUsed: [],
|
|
411
|
+
redactionFlags
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
function eventView(step, includeAttributes = false) {
|
|
415
|
+
const out = {
|
|
416
|
+
spanId: step.spanId,
|
|
417
|
+
kind: eventKind(step),
|
|
418
|
+
name: step.name
|
|
419
|
+
};
|
|
420
|
+
const text = eventText(step);
|
|
421
|
+
const tool = toolName(step);
|
|
422
|
+
if (text) out.text = text;
|
|
423
|
+
if (tool) out.toolName = tool;
|
|
424
|
+
if (includeAttributes) out.attributes = step.attributes;
|
|
425
|
+
return out;
|
|
426
|
+
}
|
|
427
|
+
function readTrace(task, opts) {
|
|
428
|
+
const base = { mode: opts.mode, traceId: traceId(task), summary: task.task.summary };
|
|
429
|
+
if (opts.mode === "summary") return base;
|
|
430
|
+
if (opts.mode === "full_transcript" && !opts.allowFullTranscript) {
|
|
431
|
+
throw new Error("full transcript reads require explicit allowFullTranscript=true");
|
|
432
|
+
}
|
|
433
|
+
const events = task.steps.map((step) => eventView(step, opts.mode === "full_transcript"));
|
|
434
|
+
if (opts.mode === "events" || opts.mode === "full_transcript") return { ...base, events };
|
|
435
|
+
if (opts.mode === "tool_calls") {
|
|
436
|
+
return {
|
|
437
|
+
...base,
|
|
438
|
+
toolCalls: events.filter((event) => event.kind === "tool-call" || event.toolName !== void 0)
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
const q = opts.query?.toLowerCase();
|
|
442
|
+
const filtered = q ? events.filter((event) => JSON.stringify(event).toLowerCase().includes(q)) : events;
|
|
443
|
+
return { ...base, events: filtered.slice(0, opts.limit ?? 20) };
|
|
444
|
+
}
|
|
445
|
+
function cardText(card) {
|
|
446
|
+
return [
|
|
447
|
+
card.summary,
|
|
448
|
+
...card.tools,
|
|
449
|
+
...card.commands,
|
|
450
|
+
...card.filesTouched,
|
|
451
|
+
...card.errorSnippets,
|
|
452
|
+
card.outcome
|
|
453
|
+
].join("\n").toLowerCase();
|
|
454
|
+
}
|
|
455
|
+
function searchTraceCards(cards, query) {
|
|
456
|
+
const matches = cards.filter((card) => {
|
|
457
|
+
if (query.query && !cardText(card).includes(query.query.toLowerCase())) return false;
|
|
458
|
+
if (query.command && !card.commands.some((c) => c.toLowerCase().includes(query.command.toLowerCase()))) return false;
|
|
459
|
+
if (query.file && !card.filesTouched.some((f) => f.toLowerCase().includes(query.file.toLowerCase()))) return false;
|
|
460
|
+
if (query.error && !card.errorSnippets.some((e) => e.toLowerCase().includes(query.error.toLowerCase()))) return false;
|
|
461
|
+
if (query.tool && !card.tools.some((t) => t.toLowerCase().includes(query.tool.toLowerCase()))) return false;
|
|
462
|
+
if (query.outcome && card.outcome !== query.outcome) return false;
|
|
463
|
+
return true;
|
|
464
|
+
});
|
|
465
|
+
return matches.sort((a, b) => b.startedAt.localeCompare(a.startedAt)).slice(0, query.limit ?? matches.length);
|
|
466
|
+
}
|
|
467
|
+
function estimateTokens(text) {
|
|
468
|
+
return Math.ceil(new TextEncoder().encode(text).length / 4);
|
|
469
|
+
}
|
|
470
|
+
function costFor(tokens) {
|
|
471
|
+
if (tokens < 2e4) return "low";
|
|
472
|
+
if (tokens < 8e4) return "medium";
|
|
473
|
+
return "high";
|
|
474
|
+
}
|
|
475
|
+
function grouped(cards, key) {
|
|
476
|
+
const out = /* @__PURE__ */ new Map();
|
|
477
|
+
for (const card of cards) {
|
|
478
|
+
for (const value of card[key]) {
|
|
479
|
+
const normalized = value.toLowerCase();
|
|
480
|
+
const group = out.get(normalized) ?? [];
|
|
481
|
+
group.push(card);
|
|
482
|
+
out.set(normalized, group);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
return out;
|
|
486
|
+
}
|
|
487
|
+
function clusterTraceCards(cards) {
|
|
488
|
+
const candidates = [];
|
|
489
|
+
const addGroups = (label, key, groups, priority) => {
|
|
490
|
+
for (const [signal, group] of groups) {
|
|
491
|
+
if (group.length < 2) continue;
|
|
492
|
+
const tokenEstimate = estimateTokens(JSON.stringify(group));
|
|
493
|
+
candidates.push({
|
|
494
|
+
title: `${label}: ${group[0]?.[key === "errors" ? "errorSnippets" : key === "commands" ? "commands" : "filesTouched"].find((v) => v.toLowerCase() === signal) ?? signal}`,
|
|
495
|
+
traceIds: group.map((card) => card.traceId),
|
|
496
|
+
repeatedSignals: { [key]: [signal] },
|
|
497
|
+
evidenceTierEstimate: "recurring-pattern",
|
|
498
|
+
estimatedSourceTokens: tokenEstimate,
|
|
499
|
+
estimatedDistillCost: costFor(tokenEstimate),
|
|
500
|
+
privacyFlags: uniq(group.flatMap((card) => card.redactionFlags)),
|
|
501
|
+
priority
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
};
|
|
505
|
+
addGroups("Repeated error", "errors", grouped(cards, "errorSnippets"), 0);
|
|
506
|
+
addGroups("Repeated command", "commands", grouped(cards, "commands"), 1);
|
|
507
|
+
addGroups("Repeated file", "files", grouped(cards, "filesTouched"), 2);
|
|
508
|
+
if (candidates.length === 0 && cards.length === 1) {
|
|
509
|
+
const tokenEstimate = estimateTokens(JSON.stringify(cards[0]));
|
|
510
|
+
candidates.push({
|
|
511
|
+
title: cards[0].summary,
|
|
512
|
+
traceIds: [cards[0].traceId],
|
|
513
|
+
repeatedSignals: {},
|
|
514
|
+
evidenceTierEstimate: "single-example",
|
|
515
|
+
estimatedSourceTokens: tokenEstimate,
|
|
516
|
+
estimatedDistillCost: costFor(tokenEstimate),
|
|
517
|
+
privacyFlags: cards[0].redactionFlags,
|
|
518
|
+
priority: 3
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
return candidates.sort((a, b) => b.traceIds.length - a.traceIds.length || a.priority - b.priority || a.title.localeCompare(b.title)).map(({ priority, ...candidate }, index) => ({
|
|
522
|
+
candidateId: `local-candidate-${String(index + 1).padStart(3, "0")}`,
|
|
523
|
+
...candidate
|
|
524
|
+
}));
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// packages/harness-layer/src/distil-feedback.ts
|
|
528
|
+
import { appendFileSync, mkdirSync, readFileSync as readFileSync2 } from "node:fs";
|
|
529
|
+
import { homedir as homedir2 } from "node:os";
|
|
530
|
+
import { dirname, join as join2 } from "node:path";
|
|
531
|
+
var DEFAULT_DISTIL_FEEDBACK_PATH = join2(homedir2(), ".jinn-client", "harness-layer", "distil-feedback.jsonl");
|
|
532
|
+
function distilFeedbackPathFromEnv(env = process.env) {
|
|
533
|
+
return env["JINN_LAYER_DISTIL_FEEDBACK_PATH"] ?? DEFAULT_DISTIL_FEEDBACK_PATH;
|
|
534
|
+
}
|
|
535
|
+
function recordDistilFeedback(input, opts = {}) {
|
|
536
|
+
const record = {
|
|
537
|
+
schema: "jinn.distil.feedback.v1",
|
|
538
|
+
skillName: input.skillName,
|
|
539
|
+
verdict: input.verdict,
|
|
540
|
+
recordedAt: input.recordedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
541
|
+
...input.sessionId ? { sessionId: input.sessionId } : {},
|
|
542
|
+
...input.notes ? { notes: input.notes } : {},
|
|
543
|
+
...input.acceptedChanges && input.acceptedChanges.length > 0 ? { acceptedChanges: input.acceptedChanges } : {}
|
|
544
|
+
};
|
|
545
|
+
const path = opts.path ?? distilFeedbackPathFromEnv(opts.env);
|
|
546
|
+
mkdirSync(dirname(path), { recursive: true, mode: 448 });
|
|
547
|
+
appendFileSync(path, `${JSON.stringify(record)}
|
|
548
|
+
`, { mode: 384 });
|
|
549
|
+
return record;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// packages/harness-layer/src/distil-mcp-server.ts
|
|
553
|
+
var traceReadModes = ["summary", "events", "tool_calls", "transcript_excerpt", "full_transcript"];
|
|
554
|
+
function createDistilMcpServer(deps = {}) {
|
|
555
|
+
const server2 = new McpServer({
|
|
556
|
+
name: "jinn-local-distil",
|
|
557
|
+
version: "0.1.0"
|
|
558
|
+
});
|
|
559
|
+
server2.tool(
|
|
560
|
+
"distill_trace_search",
|
|
561
|
+
"Search local trace cards from the shared local distil capture directory. Use this before reading full traces; returns compact cards only.",
|
|
562
|
+
{
|
|
563
|
+
capturesDir: z5.string().optional().describe("Directory containing CapturedTask JSON files. Defaults to JINN_LAYER_CAPTURES_DIR or ~/.jinn-client/harness-layer/captures."),
|
|
564
|
+
limit: z5.number().int().positive().max(500).optional().describe("Maximum captures to load and maximum cards to return."),
|
|
565
|
+
query: z5.string().optional().describe("Free-text query across summary, tools, commands, files, errors, and outcome."),
|
|
566
|
+
command: z5.string().optional().describe("Command substring filter."),
|
|
567
|
+
file: z5.string().optional().describe("Touched-file substring filter."),
|
|
568
|
+
error: z5.string().optional().describe("Error substring filter."),
|
|
569
|
+
tool: z5.string().optional().describe("Tool-name substring filter."),
|
|
570
|
+
outcome: z5.enum(["completed", "failed", "abandoned"]).optional().describe("Outcome status filter.")
|
|
571
|
+
},
|
|
572
|
+
async (args) => {
|
|
573
|
+
const capturesDir = args.capturesDir ?? capturesDirFromEnv(deps.env);
|
|
574
|
+
const limit = args.limit ?? DEFAULT_DISTIL_CAPTURE_LIMIT;
|
|
575
|
+
const captures = loadRecentCaptures(capturesDir, limit);
|
|
576
|
+
const cards = searchTraceCards(captures.map(traceCardFromCapture), {
|
|
577
|
+
query: args.query,
|
|
578
|
+
command: args.command,
|
|
579
|
+
file: args.file,
|
|
580
|
+
error: args.error,
|
|
581
|
+
tool: args.tool,
|
|
582
|
+
outcome: args.outcome,
|
|
583
|
+
limit
|
|
584
|
+
});
|
|
585
|
+
return jsonResponse({ capturesDir, count: cards.length, cards });
|
|
586
|
+
}
|
|
587
|
+
);
|
|
588
|
+
server2.tool(
|
|
589
|
+
"distill_trace_read",
|
|
590
|
+
"Read a selected local trace by traceId or sessionId. Prefer summary, transcript_excerpt, or tool_calls before requesting full_transcript.",
|
|
591
|
+
{
|
|
592
|
+
capturesDir: z5.string().optional().describe("Directory containing CapturedTask JSON files."),
|
|
593
|
+
limit: z5.number().int().positive().max(500).optional().describe("Maximum captures to load while locating the trace."),
|
|
594
|
+
traceId: z5.string().optional().describe("Trace id returned by distill_trace_search, e.g. local-capture:<sessionId>."),
|
|
595
|
+
sessionId: z5.string().optional().describe("Raw session id when traceId is not available."),
|
|
596
|
+
mode: z5.enum(traceReadModes).optional().describe("Read mode. full_transcript requires allowFullTranscript=true."),
|
|
597
|
+
query: z5.string().optional().describe("Optional excerpt filter for transcript_excerpt mode."),
|
|
598
|
+
readLimit: z5.number().int().positive().max(200).optional().describe("Maximum events returned for transcript_excerpt mode."),
|
|
599
|
+
allowFullTranscript: z5.boolean().optional().describe("Required explicit opt-in for full_transcript reads.")
|
|
600
|
+
},
|
|
601
|
+
async (args) => {
|
|
602
|
+
const capturesDir = args.capturesDir ?? capturesDirFromEnv(deps.env);
|
|
603
|
+
const captures = loadRecentCaptures(capturesDir, args.limit ?? DEFAULT_DISTIL_CAPTURE_LIMIT);
|
|
604
|
+
const capture = findCapture(captures, { traceId: args.traceId, sessionId: args.sessionId });
|
|
605
|
+
if (!capture) return errorResponse(`Trace not found: ${args.traceId ?? args.sessionId ?? "(missing id)"}`);
|
|
606
|
+
try {
|
|
607
|
+
return jsonResponse(readTrace(capture, {
|
|
608
|
+
mode: args.mode ?? "summary",
|
|
609
|
+
query: args.query,
|
|
610
|
+
limit: args.readLimit,
|
|
611
|
+
allowFullTranscript: args.allowFullTranscript
|
|
612
|
+
}));
|
|
613
|
+
} catch (err) {
|
|
614
|
+
return errorResponse(err instanceof Error ? err.message : String(err));
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
);
|
|
618
|
+
server2.tool(
|
|
619
|
+
"distill_trace_cluster",
|
|
620
|
+
"Group local trace cards into candidate skill opportunities using repeated commands, files, and error signals. This is a cheap pre-distill scan.",
|
|
621
|
+
{
|
|
622
|
+
capturesDir: z5.string().optional().describe("Directory containing CapturedTask JSON files."),
|
|
623
|
+
limit: z5.number().int().positive().max(500).optional().describe("Maximum captures to load.")
|
|
624
|
+
},
|
|
625
|
+
async (args) => {
|
|
626
|
+
const capturesDir = args.capturesDir ?? capturesDirFromEnv(deps.env);
|
|
627
|
+
const captures = loadRecentCaptures(capturesDir, args.limit ?? DEFAULT_DISTIL_CAPTURE_LIMIT);
|
|
628
|
+
const candidates = clusterTraceCards(captures.map(traceCardFromCapture));
|
|
629
|
+
return jsonResponse({ capturesDir, count: candidates.length, candidates });
|
|
630
|
+
}
|
|
631
|
+
);
|
|
632
|
+
server2.tool(
|
|
633
|
+
"distill_local",
|
|
634
|
+
"Run local skill distillation over captured traces by delegating to jinn-layer distil. Requires confirm:true because it can call an LLM and write staged or installed skills.",
|
|
635
|
+
{
|
|
636
|
+
confirm: z5.boolean().optional().describe("Must be true to execute. Omit or false to receive a preview envelope."),
|
|
637
|
+
capturesDir: z5.string().optional().describe("Directory containing CapturedTask JSON files."),
|
|
638
|
+
out: z5.string().optional().describe("Output directory for distilled skills."),
|
|
639
|
+
limit: z5.number().int().positive().max(500).optional().describe("Maximum captures to distill."),
|
|
640
|
+
traceIds: z5.array(z5.string()).optional().describe("Optional selected trace IDs to distill, as returned by distill_trace_search or distill_trace_cluster."),
|
|
641
|
+
sessionIds: z5.array(z5.string()).optional().describe("Optional selected raw session IDs to distill."),
|
|
642
|
+
install: z5.string().optional().describe("Install choice passed to --install: all, none, or a specific skill name."),
|
|
643
|
+
resume: z5.boolean().optional().describe("Pass --resume so already-covered sessions are skipped."),
|
|
644
|
+
distiller: z5.enum(["claude", "codex"]).optional().describe("LLM provider to use for the distiller pass."),
|
|
645
|
+
distillerModel: z5.string().optional().describe("Distiller model name. This is separate from the runtime model recorded in the skill.")
|
|
646
|
+
},
|
|
647
|
+
async (args) => {
|
|
648
|
+
if (!args.confirm) {
|
|
649
|
+
return jsonResponse({
|
|
650
|
+
schemaVersion: 1,
|
|
651
|
+
status: "preview",
|
|
652
|
+
tool: "distill_local",
|
|
653
|
+
description: "Run local distillation over captured traces.",
|
|
654
|
+
effects: [
|
|
655
|
+
"Reads local captured-task JSON files.",
|
|
656
|
+
"Calls the selected user LLM provider through the existing jinn-layer distil flow.",
|
|
657
|
+
"Writes distilled skill packages under the output/staging directory and may install selected skills."
|
|
658
|
+
],
|
|
659
|
+
followUp: {
|
|
660
|
+
tool: "distill_local",
|
|
661
|
+
arguments: { ...args, confirm: true }
|
|
662
|
+
}
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
return runLocalDistil({
|
|
666
|
+
capturesDir: args.capturesDir,
|
|
667
|
+
out: args.out,
|
|
668
|
+
limit: args.limit,
|
|
669
|
+
traceIds: args.traceIds,
|
|
670
|
+
sessionIds: args.sessionIds,
|
|
671
|
+
install: args.install,
|
|
672
|
+
resume: args.resume,
|
|
673
|
+
distiller: args.distiller,
|
|
674
|
+
distillerModel: args.distillerModel
|
|
675
|
+
}, deps);
|
|
676
|
+
}
|
|
677
|
+
);
|
|
678
|
+
server2.tool(
|
|
679
|
+
"distill_feedback_record",
|
|
680
|
+
"Record local user feedback for an experimental distilled skill. Use this after a later session uses the skill and the user accepts a helped/hurt/mixed/unused verdict.",
|
|
681
|
+
{
|
|
682
|
+
skillName: z5.string().min(1).describe("Distilled skill name."),
|
|
683
|
+
verdict: z5.enum(["helped", "hurt", "mixed", "unused"]).describe("User-visible outcome of using the skill."),
|
|
684
|
+
sessionId: z5.string().optional().describe("Session where the skill was used, if known."),
|
|
685
|
+
notes: z5.string().optional().describe("Short user-approved note about what to improve or preserve."),
|
|
686
|
+
acceptedChanges: z5.array(z5.string()).optional().describe("Concrete user-approved changes to apply in a later skill improvement pass."),
|
|
687
|
+
feedbackPath: z5.string().optional().describe("Override feedback JSONL path. Defaults to JINN_LAYER_DISTIL_FEEDBACK_PATH or ~/.jinn-client/harness-layer/distil-feedback.jsonl.")
|
|
688
|
+
},
|
|
689
|
+
async (args) => {
|
|
690
|
+
const record = recordDistilFeedback({
|
|
691
|
+
skillName: args.skillName,
|
|
692
|
+
verdict: args.verdict,
|
|
693
|
+
...args.sessionId ? { sessionId: args.sessionId } : {},
|
|
694
|
+
...args.notes ? { notes: args.notes } : {},
|
|
695
|
+
...args.acceptedChanges ? { acceptedChanges: args.acceptedChanges } : {}
|
|
696
|
+
}, {
|
|
697
|
+
...args.feedbackPath ? { path: args.feedbackPath } : {},
|
|
698
|
+
...deps.env ? { env: deps.env } : {}
|
|
699
|
+
});
|
|
700
|
+
return jsonResponse({ recorded: record });
|
|
701
|
+
}
|
|
702
|
+
);
|
|
703
|
+
return server2;
|
|
704
|
+
}
|
|
705
|
+
async function runLocalDistil(args, deps = {}) {
|
|
706
|
+
const resolved = resolveJinnLayerCommand(deps.env);
|
|
707
|
+
const selected = materializeSelectedCaptures(args, deps.env);
|
|
708
|
+
if (selected.error) return errorResponse(selected.error);
|
|
709
|
+
const argv = [
|
|
710
|
+
...resolved.prefixArgs,
|
|
711
|
+
"distil",
|
|
712
|
+
"--where",
|
|
713
|
+
"local",
|
|
714
|
+
"--json"
|
|
715
|
+
];
|
|
716
|
+
const capturesDir = selected.capturesDir ?? args.capturesDir;
|
|
717
|
+
if (capturesDir) argv.push("--captures", capturesDir);
|
|
718
|
+
if (args.out) argv.push("--out", args.out);
|
|
719
|
+
if (args.limit !== void 0) argv.push("--limit", String(args.limit));
|
|
720
|
+
if (args.install) argv.push("--install", args.install);
|
|
721
|
+
if (args.resume) argv.push("--resume");
|
|
722
|
+
if (args.distiller) argv.push("--distiller", args.distiller);
|
|
723
|
+
if (args.distillerModel) argv.push("--distiller-model", args.distillerModel);
|
|
724
|
+
const spawnFn = deps.spawn ?? spawn;
|
|
725
|
+
const child = spawnFn(resolved.command, argv, {
|
|
726
|
+
env: { ...process.env, ...deps.env ?? {} },
|
|
727
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
728
|
+
});
|
|
729
|
+
try {
|
|
730
|
+
const result = await collectChild(child);
|
|
731
|
+
return jsonResponse({
|
|
732
|
+
command: [basename(resolved.command), ...argv],
|
|
733
|
+
exitCode: result.exitCode,
|
|
734
|
+
stdout: result.stdout,
|
|
735
|
+
stderr: result.stderr,
|
|
736
|
+
...selected.traceCount !== void 0 ? { selectedTraceCount: selected.traceCount } : {}
|
|
737
|
+
}, result.exitCode === 0 ? void 0 : true);
|
|
738
|
+
} finally {
|
|
739
|
+
if (selected.tempDir) rmSync(selected.tempDir, { recursive: true, force: true });
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
function jsonResponse(value, isError) {
|
|
743
|
+
return {
|
|
744
|
+
content: [{ type: "text", text: JSON.stringify(value) }],
|
|
745
|
+
...isError ? { isError } : {}
|
|
746
|
+
};
|
|
747
|
+
}
|
|
748
|
+
function errorResponse(message) {
|
|
749
|
+
return jsonResponse({ error: { message } }, true);
|
|
750
|
+
}
|
|
751
|
+
function capturesDirFromEnv(env = process.env) {
|
|
752
|
+
return env["JINN_LAYER_CAPTURES_DIR"] ?? DEFAULT_CAPTURES_DIR;
|
|
753
|
+
}
|
|
754
|
+
function findCapture(captures, ids) {
|
|
755
|
+
const sessionId = ids.sessionId ?? ids.traceId?.replace(/^local-capture:/, "");
|
|
756
|
+
if (!sessionId) return void 0;
|
|
757
|
+
return captures.find((capture) => capture.session.sessionId === sessionId);
|
|
758
|
+
}
|
|
759
|
+
function resolveJinnLayerCommand(env = process.env) {
|
|
760
|
+
if (env["JINN_LAYER_BIN"]) return { command: env["JINN_LAYER_BIN"], prefixArgs: [] };
|
|
761
|
+
const sibling = fileURLToPath(new URL("./jinn-layer.js", import.meta.url));
|
|
762
|
+
if (existsSync2(sibling)) return { command: process.execPath, prefixArgs: [sibling] };
|
|
763
|
+
return { command: "jinn-layer", prefixArgs: [] };
|
|
764
|
+
}
|
|
765
|
+
function materializeSelectedCaptures(args, env = process.env) {
|
|
766
|
+
const selectedIds = new Set([
|
|
767
|
+
...args.sessionIds ?? [],
|
|
768
|
+
...(args.traceIds ?? []).map((id) => id.replace(/^local-capture:/, ""))
|
|
769
|
+
].filter((id) => id.trim() !== ""));
|
|
770
|
+
if (selectedIds.size === 0) return {};
|
|
771
|
+
const sourceDir = args.capturesDir ?? capturesDirFromEnv(env);
|
|
772
|
+
const captures = loadRecentCaptures(sourceDir, args.limit ?? DEFAULT_DISTIL_CAPTURE_LIMIT).filter((capture) => selectedIds.has(capture.session.sessionId));
|
|
773
|
+
if (captures.length === 0) {
|
|
774
|
+
return { error: `No selected traces found in ${sourceDir}` };
|
|
775
|
+
}
|
|
776
|
+
const tempDir = mkdtempSync(join3(tmpdir(), "jinn-distil-selected-"));
|
|
777
|
+
for (const capture of captures) {
|
|
778
|
+
writeFileSync(
|
|
779
|
+
join3(tempDir, `${safeFilePart(capture.session.sessionId)}.json`),
|
|
780
|
+
`${JSON.stringify(capture, null, 2)}
|
|
781
|
+
`,
|
|
782
|
+
{ mode: 384 }
|
|
783
|
+
);
|
|
784
|
+
}
|
|
785
|
+
return { capturesDir: tempDir, tempDir, traceCount: captures.length };
|
|
786
|
+
}
|
|
787
|
+
function safeFilePart(value) {
|
|
788
|
+
const safe = value.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 128);
|
|
789
|
+
return safe || "capture";
|
|
790
|
+
}
|
|
791
|
+
function collectChild(child) {
|
|
792
|
+
return new Promise((resolve, reject) => {
|
|
793
|
+
let stdout = "";
|
|
794
|
+
let stderr = "";
|
|
795
|
+
child.stdout?.on("data", (chunk) => {
|
|
796
|
+
stdout += chunk.toString();
|
|
797
|
+
});
|
|
798
|
+
child.stderr?.on("data", (chunk) => {
|
|
799
|
+
stderr += chunk.toString();
|
|
800
|
+
});
|
|
801
|
+
child.once("error", reject);
|
|
802
|
+
child.once("close", (code) => resolve({ exitCode: code, stdout, stderr }));
|
|
803
|
+
});
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
// packages/harness-layer/src/bin/jinn-distil-mcp.ts
|
|
807
|
+
var server = createDistilMcpServer();
|
|
808
|
+
var transport = new StdioServerTransport();
|
|
809
|
+
server.connect(transport).catch((err) => {
|
|
810
|
+
console.error("[jinn-distil-mcp] failed to start");
|
|
811
|
+
console.error(err);
|
|
812
|
+
process.exit(1);
|
|
813
|
+
});
|