@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,35 @@
|
|
|
1
|
+
import { type KeyPolicy } from './key-policy.js';
|
|
2
|
+
import type { ScrubStage } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Secrets stage. Two passes over each `content`-classified string value:
|
|
5
|
+
* 1. secretlint preset-recommend rules (AWS secret-key assignments, GitHub,
|
|
6
|
+
* Slack, npm, GCP service-account JSON, …) — each match replaced inline
|
|
7
|
+
* with `[SECRET:<rule>]`. Note the preset's defaults are narrower than the
|
|
8
|
+
* rule names suggest: bare AWS key IDs (AKIA…) and `AIza…` GCP API keys
|
|
9
|
+
* are NOT detected in this pass.
|
|
10
|
+
* 2. a conservative Shannon-entropy + secret-shape fallback that catches
|
|
11
|
+
* near-random tokens no specific rule matched (≥ 20 chars by entropy alone,
|
|
12
|
+
* or 16–19 chars when the token is a single high-density secret-charset run
|
|
13
|
+
* mixing multiple character classes), replaced with `[SECRET:high-entropy]`.
|
|
14
|
+
* Path-shaped tokens (`owner/repo/slug` and friends, #1348) are judged
|
|
15
|
+
* per-segment rather than whole-token, so slug identifiers survive while a
|
|
16
|
+
* secret embedded as a path segment still redacts.
|
|
17
|
+
* `safe` and non-string values pass through untouched.
|
|
18
|
+
*/
|
|
19
|
+
export interface SecretlintStageOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Gate for the pass-2 Shannon-entropy fallback (#1409). Default true (trace
|
|
22
|
+
* profile, unchanged). The seed-import profile sets false: SKILL.md bodies
|
|
23
|
+
* are public licence-checked prose where the probabilistic sweep demonstrably
|
|
24
|
+
* false-positives (env-var assignments with dated slugs, ≥20-char camelCase
|
|
25
|
+
* identifiers) — pass-1 deterministic rules still run unconditionally. With
|
|
26
|
+
* the fallback off, bare AWS key IDs (AKIA…), `AIza…` GCP API keys, JWTs,
|
|
27
|
+
* and generic high-entropy blobs pass this stage unredacted (pass-1 catches
|
|
28
|
+
* AWS secret-key assignments and GCP service-account JSON only). The seed
|
|
29
|
+
* profile covers the AWS/GCP key-ID shapes upstream in plain-patterns
|
|
30
|
+
* (#1415); the JWT / high-entropy residual is accepted for public,
|
|
31
|
+
* licence-checked seed content.
|
|
32
|
+
*/
|
|
33
|
+
entropyFallback?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare function secretlintStage(policy: KeyPolicy, opts?: SecretlintStageOptions): ScrubStage;
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { lintSource } from '@secretlint/core';
|
|
2
|
+
import { creator } from '@secretlint/secretlint-rule-preset-recommend';
|
|
3
|
+
import { classifyKey } from './key-policy.js';
|
|
4
|
+
const VERSION = '0.4.1'; // 0.4.1: public SWE-rebench instance ids skip the entropy fallback
|
|
5
|
+
const PRESET_RULE_ID = '@secretlint/secretlint-rule-preset-recommend';
|
|
6
|
+
// Entropy fallback thresholds. Conservative on purpose: a long token whose
|
|
7
|
+
// character distribution is near-random is almost certainly a key/token, not
|
|
8
|
+
// prose. Tunable; raise the bar if legitimate high-entropy content over-redacts.
|
|
9
|
+
//
|
|
10
|
+
// `ENTROPY_MIN_BITS` stays at 4.0: English prose sits ~4.0–4.5 bits/char, so
|
|
11
|
+
// lowering it below 4.0 globally nukes legitimate prose. `ENTROPY_MIN_LEN` is
|
|
12
|
+
// lowered from 20 → 16 so secret-shaped tokens in the 16–19 char band (which
|
|
13
|
+
// the old 20-char floor never even considered) are caught — but only when they
|
|
14
|
+
// ALSO pass the structural shape gate below, so the longer tail of legit
|
|
15
|
+
// identifiers/words in that band is not swept in. Tokens of length ≥ 20 keep
|
|
16
|
+
// the original entropy-only behaviour (the shape gate does not narrow it).
|
|
17
|
+
const ENTROPY_MIN_LEN = 16;
|
|
18
|
+
const ENTROPY_MIN_BITS = 4.0;
|
|
19
|
+
// Above this length the entropy bar alone decides (original behaviour). Between
|
|
20
|
+
// ENTROPY_MIN_LEN and here the structural shape gate is additionally required.
|
|
21
|
+
const ENTROPY_STRICT_LEN = 20;
|
|
22
|
+
// A "secret-shaped" token: a single run of base64 / base64url / hex charset
|
|
23
|
+
// characters only (letters, digits, and the `+/=_-` set), with NO natural-language
|
|
24
|
+
// punctuation or spaces.
|
|
25
|
+
const SECRET_CHARSET = /^[A-Za-z0-9+/=_-]+$/;
|
|
26
|
+
// Tuning note (#1348): a path-shaped token — slug segments joined by `/`,
|
|
27
|
+
// e.g. `obra/superpowers/skills/test-driven-development` — is judged
|
|
28
|
+
// per-SEGMENT, not whole-token, but ONLY when the whole token mixes at most
|
|
29
|
+
// 2 character classes. Concatenating several short human-readable slugs
|
|
30
|
+
// inflates whole-token Shannon entropy past 4.0 bits/char purely by
|
|
31
|
+
// length/variety, which was redacting seed-import task summaries as
|
|
32
|
+
// `[SECRET:high-entropy]`; real slugs are overwhelmingly lowercase (1–2
|
|
33
|
+
// classes), while secrets that merely contain `/` or `.` (AWS-style base64
|
|
34
|
+
// keys, `dir/<blob>.tar.gz` filenames) almost always mix 3 classes and keep
|
|
35
|
+
// the original whole-token entropy behaviour. The segment charset excludes
|
|
36
|
+
// `+` and `=`, so base64 blobs containing either are never path-shaped.
|
|
37
|
+
// Residual exposure: a secret with ≤ 2 whole-token character classes whose
|
|
38
|
+
// every `[/.]`-split segment is under 16 chars (or below the entropy bar)
|
|
39
|
+
// qualifies as a path and escapes the fallback.
|
|
40
|
+
const PATH_SHAPED = /^[A-Za-z0-9._-]+(\/[A-Za-z0-9._-]+)+$/;
|
|
41
|
+
// SWE-rebench instance ids are public corpus identifiers (`owner__repo-PR`),
|
|
42
|
+
// not key material. Some short bridge summaries repeat them and otherwise cross
|
|
43
|
+
// the defacement gate after entropy redaction.
|
|
44
|
+
const SWE_REBENCH_INSTANCE_ID = /^[a-z0-9][a-z0-9._-]*__[a-z0-9][a-z0-9._-]*-\d+$/;
|
|
45
|
+
// Tuning note (#1391): the entropy fallback's threat model is ASCII key
|
|
46
|
+
// material — base64 / base64url / hex runs. Natural-language text outside the
|
|
47
|
+
// Latin script (CJK especially) has char-level Shannon entropy far above 4.0
|
|
48
|
+
// bits/char (most characters in a sentence are unique), so whole-token entropy
|
|
49
|
+
// classified ordinary Chinese skill prose as secrets and shredded it. A token
|
|
50
|
+
// whose non-ASCII share exceeds this threshold skips the entropy fallback
|
|
51
|
+
// entirely; the pass-1 secretlint preset rules still run on everything.
|
|
52
|
+
// Residual exposure: a generic (rule-less) secret glued WITHOUT whitespace
|
|
53
|
+
// into a majority-non-ASCII token escapes the fallback — prefixed keys
|
|
54
|
+
// (ghp_…, AKIA…, sk-…) are still caught by pass 1, and CJK prose separates
|
|
55
|
+
// embedded ASCII material with spacing or punctuation in practice.
|
|
56
|
+
const NON_ASCII_MAX_SHARE = 0.3;
|
|
57
|
+
// Tuning note (#1391): a STRUCTURED token — one containing characters outside
|
|
58
|
+
// SECRET_CHARSET, i.e. URLs (`://`, `?`, `&`, `#`), markdown links (`](`),
|
|
59
|
+
// shell interpolations (`${…}`), serialised code — cannot itself be a
|
|
60
|
+
// contiguous key: real key material never contains brackets, quotes or `?`.
|
|
61
|
+
// A key can only be EMBEDDED in such a token as a delimited segment, so the
|
|
62
|
+
// token is judged per-segment (mirroring the #1348 PATH_SHAPED carve-out)
|
|
63
|
+
// instead of by whole-token entropy, which URLs and markdown links inflate
|
|
64
|
+
// past 4.0 bits/char purely by punctuation/length variety (every seed
|
|
65
|
+
// envelope's attribution URL published as [SECRET:high-entropy]).
|
|
66
|
+
// Segments split on everything outside `[A-Za-z0-9+=_-]`: `/` and `.` split
|
|
67
|
+
// (slug and query-string segments stay short and human-readable — matching
|
|
68
|
+
// the PATH gate's `[/.]` split), while `-`, `_`, `+`, `=` stay inside a
|
|
69
|
+
// segment because base64url alphabets and key=value pairs use them
|
|
70
|
+
// (`?key=<blob>` gates as one segment; a JWT's `.`-separated base64url
|
|
71
|
+
// segments gate individually). Residual exposure, same shape as the #1348
|
|
72
|
+
// note: a secret whose every delimited segment falls under 16 chars (or the
|
|
73
|
+
// entropy bar, or a single character class) escapes — e.g. a base64 blob
|
|
74
|
+
// with `/` every few chars additionally wrapped in punctuation.
|
|
75
|
+
const STRUCTURED_SEGMENT_DELIMITER = /[^A-Za-z0-9+=_-]+/;
|
|
76
|
+
// Tuning note (#1391): a "wordish" segment — two or more purely-alphabetic
|
|
77
|
+
// runs joined by `_` or `-` (`Microsoft_Azure_Capacity`, `backend-refactor`)
|
|
78
|
+
// — is an identifier, not key material, even when its length and character
|
|
79
|
+
// variety clear the entropy bar (the Azure portal URL's
|
|
80
|
+
// `Microsoft_Azure_Capacity` sits at 4.002 bits/char). Key material of
|
|
81
|
+
// segment-gate length (≥ 16 chars) drawn from a base64/base64url alphabet
|
|
82
|
+
// contains a digit with ~94% probability and separator-split all-alphabetic
|
|
83
|
+
// runs almost never; the residual all-alpha, separator-structured key is
|
|
84
|
+
// accepted as out of the fallback's reach.
|
|
85
|
+
const WORDISH_SEGMENT = /^[A-Za-z]+([_-][A-Za-z]+)+$/;
|
|
86
|
+
function shannonEntropy(s) {
|
|
87
|
+
const freq = {};
|
|
88
|
+
for (const ch of s)
|
|
89
|
+
freq[ch] = (freq[ch] ?? 0) + 1;
|
|
90
|
+
let e = 0;
|
|
91
|
+
for (const count of Object.values(freq)) {
|
|
92
|
+
const p = count / s.length;
|
|
93
|
+
e -= p * Math.log2(p);
|
|
94
|
+
}
|
|
95
|
+
return e;
|
|
96
|
+
}
|
|
97
|
+
/** Count distinct character classes present (lowercase / uppercase / digit). */
|
|
98
|
+
function charClassCount(s) {
|
|
99
|
+
let n = 0;
|
|
100
|
+
if (/[a-z]/.test(s))
|
|
101
|
+
n += 1;
|
|
102
|
+
if (/[A-Z]/.test(s))
|
|
103
|
+
n += 1;
|
|
104
|
+
if (/[0-9]/.test(s))
|
|
105
|
+
n += 1;
|
|
106
|
+
return n;
|
|
107
|
+
}
|
|
108
|
+
function isSweRebenchInstanceId(token) {
|
|
109
|
+
return SWE_REBENCH_INSTANCE_ID.test(token);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Decide whether a single whitespace-delimited token should be redacted as a
|
|
113
|
+
* high-entropy / secret-shaped value. Purely additive over the original rule:
|
|
114
|
+
* - length ≥ ENTROPY_STRICT_LEN (20): entropy bar alone (unchanged behaviour),
|
|
115
|
+
* - ENTROPY_MIN_LEN (16) ≤ length < 20: entropy bar AND the structural shape
|
|
116
|
+
* gate — the token must be a single secret-charset run mixing ≥ 2 character
|
|
117
|
+
* classes (so dictionary words + a trailing suffix like `authentication123`,
|
|
118
|
+
* which sit below 4.0 bits/char anyway, are not swept in).
|
|
119
|
+
* Never fires below ENTROPY_MIN_LEN.
|
|
120
|
+
*
|
|
121
|
+
* Path carve-out (#1348): a PATH_SHAPED token whose WHOLE-token character-
|
|
122
|
+
* class count is ≤ 2 is redacted only when at least one `[/.]`-delimited
|
|
123
|
+
* segment independently passes the strict shape gate (length ≥
|
|
124
|
+
* ENTROPY_MIN_LEN, entropy ≥ ENTROPY_MIN_BITS, secret charset, ≥ 2 character
|
|
125
|
+
* classes) — applied at ALL lengths, so a long path of short slugs never
|
|
126
|
+
* trips the whole-token entropy bar, while a real key embedded as a path
|
|
127
|
+
* segment (`api/v1/ghp_…`) still redacts. A path-shaped token mixing ≥ 3
|
|
128
|
+
* whole-token classes never takes the carve-out — real slugs are 1–2
|
|
129
|
+
* classes, and 3-class "paths" are secrets wearing slashes/dots (#1348
|
|
130
|
+
* review finding) — it falls through to the whole-token logic below.
|
|
131
|
+
* Splitting on dots as well as slashes means a sentence full stop or a file
|
|
132
|
+
* extension yields its own (failing) segment instead of poisoning the
|
|
133
|
+
* secret blob next to it. Non-path tokens are unaffected.
|
|
134
|
+
*
|
|
135
|
+
* #1391 additions, checked in order:
|
|
136
|
+
* - a non-ASCII-dominant token (share > NON_ASCII_MAX_SHARE) is prose in a
|
|
137
|
+
* non-Latin script, not ASCII key material — never entropy-gated;
|
|
138
|
+
* - a structured token (any character outside SECRET_CHARSET: URLs,
|
|
139
|
+
* markdown links, shell interpolations) is judged per delimited segment
|
|
140
|
+
* via the same strict gate as path segments — see the
|
|
141
|
+
* STRUCTURED_SEGMENT_DELIMITER tuning note.
|
|
142
|
+
* Pure SECRET_CHARSET runs keep the original whole-token behaviour.
|
|
143
|
+
*/
|
|
144
|
+
function isSecretShapedToken(token) {
|
|
145
|
+
if (token.length < ENTROPY_MIN_LEN)
|
|
146
|
+
return false;
|
|
147
|
+
if (nonAsciiShare(token) > NON_ASCII_MAX_SHARE)
|
|
148
|
+
return false;
|
|
149
|
+
if (isSweRebenchInstanceId(token))
|
|
150
|
+
return false;
|
|
151
|
+
if (PATH_SHAPED.test(token) && charClassCount(token) <= 2) {
|
|
152
|
+
return token.split(/[/.]/).some(passesStrictSegmentGate);
|
|
153
|
+
}
|
|
154
|
+
if (!SECRET_CHARSET.test(token)) {
|
|
155
|
+
// Structured token (#1391) — URL, markdown link, shell interpolation…
|
|
156
|
+
// A contiguous key can only live inside a delimited segment.
|
|
157
|
+
return token.split(STRUCTURED_SEGMENT_DELIMITER).some(passesStrictSegmentGate);
|
|
158
|
+
}
|
|
159
|
+
if (shannonEntropy(token) < ENTROPY_MIN_BITS)
|
|
160
|
+
return false;
|
|
161
|
+
if (token.length >= ENTROPY_STRICT_LEN)
|
|
162
|
+
return true;
|
|
163
|
+
return charClassCount(token) >= 2;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The strict per-segment gate shared by the PATH_SHAPED (#1348) and
|
|
167
|
+
* structured-token (#1391) carve-outs: a segment is secret-shaped only when
|
|
168
|
+
* it is ≥ ENTROPY_MIN_LEN chars, clears the entropy bar, is a single
|
|
169
|
+
* secret-charset run, and mixes ≥ 2 character classes.
|
|
170
|
+
*/
|
|
171
|
+
function passesStrictSegmentGate(segment) {
|
|
172
|
+
return (segment.length >= ENTROPY_MIN_LEN &&
|
|
173
|
+
!WORDISH_SEGMENT.test(segment) &&
|
|
174
|
+
shannonEntropy(segment) >= ENTROPY_MIN_BITS &&
|
|
175
|
+
SECRET_CHARSET.test(segment) &&
|
|
176
|
+
charClassCount(segment) >= 2);
|
|
177
|
+
}
|
|
178
|
+
/** Share of characters outside the 7-bit ASCII range (by code point). */
|
|
179
|
+
function nonAsciiShare(s) {
|
|
180
|
+
let n = 0;
|
|
181
|
+
let total = 0;
|
|
182
|
+
for (const ch of s) {
|
|
183
|
+
total += 1;
|
|
184
|
+
if ((ch.codePointAt(0) ?? 0) > 0x7f)
|
|
185
|
+
n += 1;
|
|
186
|
+
}
|
|
187
|
+
return total === 0 ? 0 : n / total;
|
|
188
|
+
}
|
|
189
|
+
/** Short label from a secretlint ruleId, e.g. `@secretlint/secretlint-rule-github` → `github`. */
|
|
190
|
+
function shortRule(ruleId) {
|
|
191
|
+
return ruleId.replace(/^@secretlint\/secretlint-rule-/, '').replace(/^@secretlint\//, '');
|
|
192
|
+
}
|
|
193
|
+
// #1378 cosmetic: a `\S+` token inside serialised JSON drags its wrapping
|
|
194
|
+
// delimiters along (`"…/blob",` is one whitespace-delimited token), so
|
|
195
|
+
// replacing the whole token swallowed the quotes/comma and left malformed
|
|
196
|
+
// JSON (`"resolved_path": [SECRET:high-entropy] "files_modified": …`). Split
|
|
197
|
+
// each token into leading punctuation / core / trailing punctuation, gate on
|
|
198
|
+
// the core, and reattach the punctuation around the placeholder. None of the
|
|
199
|
+
// stripped characters belong to SECRET_CHARSET (`=` deliberately excluded —
|
|
200
|
+
// base64 padding), so no secret material is ever preserved; if anything,
|
|
201
|
+
// stripping the wrapper improves detection (the 16–19 char shape gate
|
|
202
|
+
// previously failed on quoted tokens because the quotes broke the charset).
|
|
203
|
+
const TOKEN_WRAPPING = /^([("'`[{,;:]*)([\s\S]*?)([)"'`\]},;:.]*)$/;
|
|
204
|
+
export function secretlintStage(policy, opts = {}) {
|
|
205
|
+
const entropyFallback = opts.entropyFallback ?? true;
|
|
206
|
+
const config = { rules: [{ id: PRESET_RULE_ID, rule: creator }] };
|
|
207
|
+
return {
|
|
208
|
+
name: 'secretlint',
|
|
209
|
+
version: VERSION,
|
|
210
|
+
async scrub(attributes) {
|
|
211
|
+
const out = {};
|
|
212
|
+
const redactions = [];
|
|
213
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
214
|
+
if (typeof value !== 'string' || classifyKey(key, policy) !== 'content') {
|
|
215
|
+
out[key] = value;
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
// Pass 1 — rule-based detection.
|
|
219
|
+
const result = await lintSource({
|
|
220
|
+
source: { filePath: '/span', content: value, ext: '.txt', contentType: 'text' },
|
|
221
|
+
options: { config },
|
|
222
|
+
});
|
|
223
|
+
let text = value;
|
|
224
|
+
// Replace from last range to first so earlier indices stay valid.
|
|
225
|
+
const ranges = [...result.messages].sort((a, b) => b.range[0] - a.range[0]);
|
|
226
|
+
for (const m of ranges) {
|
|
227
|
+
const label = shortRule(m.ruleId);
|
|
228
|
+
text = text.slice(0, m.range[0]) + `[SECRET:${label}]` + text.slice(m.range[1]);
|
|
229
|
+
redactions.push({ key, stage: 'secretlint', kind: 'secret', detail: label });
|
|
230
|
+
}
|
|
231
|
+
// Pass 2 — entropy + secret-shape fallback on whatever survived.
|
|
232
|
+
// Wrapping punctuation is preserved around the placeholder (#1378).
|
|
233
|
+
// Skipped entirely under the seed profile (#1409).
|
|
234
|
+
if (entropyFallback) {
|
|
235
|
+
text = text.replace(/\S+/g, (token) => {
|
|
236
|
+
const [, lead = '', core = token, trail = ''] = TOKEN_WRAPPING.exec(token) ?? [];
|
|
237
|
+
if (isSecretShapedToken(core)) {
|
|
238
|
+
redactions.push({ key, stage: 'secretlint', kind: 'secret', detail: 'high-entropy' });
|
|
239
|
+
return `${lead}[SECRET:high-entropy]${trail}`;
|
|
240
|
+
}
|
|
241
|
+
return token;
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
out[key] = text;
|
|
245
|
+
}
|
|
246
|
+
return { attributes: out, redactions };
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=secretlint-stage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretlint-stage.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/secretlint-stage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PiiDetector, PiiEntity } from './ml-pii-stage.js';
|
|
2
|
+
/** Default Transformers.js-compatible ONNX NER model (person/org/location/misc). */
|
|
3
|
+
export declare const DEFAULT_NER_MODEL = "Xenova/bert-base-NER";
|
|
4
|
+
/**
|
|
5
|
+
* Entity groups treated as PII to redact. Structured PII (emails, cards, SSNs)
|
|
6
|
+
* is handled upstream by openredaction; this tier catches the free-text
|
|
7
|
+
* entities regex can't — names, organizations, places. MISC is excluded (noisy).
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_PII_ENTITY_GROUPS: string[];
|
|
10
|
+
export interface TransformersPiiDetectorOptions {
|
|
11
|
+
model?: string;
|
|
12
|
+
/** Minimum NER confidence to redact (0–1). */
|
|
13
|
+
threshold?: number;
|
|
14
|
+
/** Entity groups to treat as PII. */
|
|
15
|
+
entityGroups?: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Real ML PII detector — the production implementation of the `PiiDetector`
|
|
19
|
+
* seam. Wraps a Transformers.js token-classification (NER) pipeline running an
|
|
20
|
+
* ONNX model entirely in-process (no Python, no separate process). Loaded lazily
|
|
21
|
+
* (or eagerly via `init()`); the heavy onnxruntime-node dependency is pulled in
|
|
22
|
+
* only when the detector is actually used.
|
|
23
|
+
*/
|
|
24
|
+
export declare class TransformersPiiDetector implements PiiDetector {
|
|
25
|
+
private pipe;
|
|
26
|
+
private initPromise;
|
|
27
|
+
private readonly model;
|
|
28
|
+
private readonly threshold;
|
|
29
|
+
private readonly entityGroups;
|
|
30
|
+
constructor(opts?: TransformersPiiDetectorOptions);
|
|
31
|
+
/** Eagerly load the model (e.g. at daemon boot) so the first publish isn't slow. */
|
|
32
|
+
init(): Promise<void>;
|
|
33
|
+
private ensureReady;
|
|
34
|
+
detect(text: string): Promise<PiiEntity[]>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** Default Transformers.js-compatible ONNX NER model (person/org/location/misc). */
|
|
2
|
+
export const DEFAULT_NER_MODEL = 'Xenova/bert-base-NER';
|
|
3
|
+
/**
|
|
4
|
+
* Entity groups treated as PII to redact. Structured PII (emails, cards, SSNs)
|
|
5
|
+
* is handled upstream by openredaction; this tier catches the free-text
|
|
6
|
+
* entities regex can't — names, organizations, places. MISC is excluded (noisy).
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_PII_ENTITY_GROUPS = ['PER', 'ORG', 'LOC'];
|
|
9
|
+
/**
|
|
10
|
+
* Real ML PII detector — the production implementation of the `PiiDetector`
|
|
11
|
+
* seam. Wraps a Transformers.js token-classification (NER) pipeline running an
|
|
12
|
+
* ONNX model entirely in-process (no Python, no separate process). Loaded lazily
|
|
13
|
+
* (or eagerly via `init()`); the heavy onnxruntime-node dependency is pulled in
|
|
14
|
+
* only when the detector is actually used.
|
|
15
|
+
*/
|
|
16
|
+
export class TransformersPiiDetector {
|
|
17
|
+
pipe;
|
|
18
|
+
initPromise;
|
|
19
|
+
model;
|
|
20
|
+
threshold;
|
|
21
|
+
entityGroups;
|
|
22
|
+
constructor(opts = {}) {
|
|
23
|
+
this.model = opts.model ?? DEFAULT_NER_MODEL;
|
|
24
|
+
this.threshold = opts.threshold ?? 0.6;
|
|
25
|
+
this.entityGroups = new Set(opts.entityGroups ?? DEFAULT_PII_ENTITY_GROUPS);
|
|
26
|
+
}
|
|
27
|
+
/** Eagerly load the model (e.g. at daemon boot) so the first publish isn't slow. */
|
|
28
|
+
async init() {
|
|
29
|
+
await this.ensureReady();
|
|
30
|
+
}
|
|
31
|
+
ensureReady() {
|
|
32
|
+
if (this.pipe)
|
|
33
|
+
return Promise.resolve(this.pipe);
|
|
34
|
+
if (!this.initPromise) {
|
|
35
|
+
this.initPromise = (async () => {
|
|
36
|
+
const { pipeline } = await import('@huggingface/transformers');
|
|
37
|
+
const pipe = (await pipeline('token-classification', this.model));
|
|
38
|
+
this.pipe = pipe;
|
|
39
|
+
return pipe;
|
|
40
|
+
})();
|
|
41
|
+
}
|
|
42
|
+
return this.initPromise;
|
|
43
|
+
}
|
|
44
|
+
async detect(text) {
|
|
45
|
+
if (!text.trim())
|
|
46
|
+
return [];
|
|
47
|
+
const pipe = await this.ensureReady();
|
|
48
|
+
const results = await pipe(text, { aggregation_strategy: 'simple' });
|
|
49
|
+
const out = [];
|
|
50
|
+
const seen = new Set();
|
|
51
|
+
for (const r of results) {
|
|
52
|
+
if (r.score < this.threshold)
|
|
53
|
+
continue;
|
|
54
|
+
if (!this.entityGroups.has(r.entity_group))
|
|
55
|
+
continue;
|
|
56
|
+
const t = r.word.trim();
|
|
57
|
+
if (!t)
|
|
58
|
+
continue;
|
|
59
|
+
const key = `${r.entity_group}:${t}`;
|
|
60
|
+
if (seen.has(key))
|
|
61
|
+
continue;
|
|
62
|
+
seen.add(key);
|
|
63
|
+
out.push({ label: r.entity_group, text: t });
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=transformers-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers-detector.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/transformers-detector.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAe/D;;;;;;GAMG;AACH,MAAM,OAAO,uBAAuB;IAC1B,IAAI,CAA0B;IAC9B,WAAW,CAAmC;IACrC,KAAK,CAAS;IACd,SAAS,CAAS;IAClB,YAAY,CAAc;IAE3C,YAAY,OAAuC,EAAE;QACnD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,iBAAiB,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,yBAAyB,CAAC,CAAC;IAC9E,CAAC;IAED,oFAAoF;IACpF,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;gBAC/D,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,sBAAsB,EAAE,IAAI,CAAC,KAAK,CAAC,CAA2B,CAAC;gBAC5F,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrE,MAAM,GAAG,GAAgB,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS;gBAAE,SAAS;YACvC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;gBAAE,SAAS;YACrD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC;gBAAE,SAAS;YACjB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type Attributes = Record<string, unknown>;
|
|
2
|
+
export interface RedactionRecord {
|
|
3
|
+
/** attribute key affected */
|
|
4
|
+
key: string;
|
|
5
|
+
/** stage that made the redaction (matches ScrubStage.name) */
|
|
6
|
+
stage: string;
|
|
7
|
+
/** category, e.g. 'dropped-key' | 'secret' | 'pii' */
|
|
8
|
+
kind: string;
|
|
9
|
+
/** optional detail, e.g. a rule id or entity type */
|
|
10
|
+
detail?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ScrubResult {
|
|
13
|
+
attributes: Attributes;
|
|
14
|
+
redactions: RedactionRecord[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A single stage in the seller-side scrub pipeline. `name` + `version` are
|
|
18
|
+
* recorded in the signed provenance manifest so a buyer/auditor can see exactly
|
|
19
|
+
* which components (and versions) produced a published trajectory.
|
|
20
|
+
*/
|
|
21
|
+
export interface ScrubStage {
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly version: string;
|
|
24
|
+
scrub(attributes: Attributes): ScrubResult | Promise<ScrubResult>;
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/types.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/trajectory/transcript-parsers/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/trajectory/transcript-parsers/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAChE,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;QAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;QACpC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KAC5B,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KAChC,CAAC;IACF,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;KACjB,CAAC;CACH,CAAC,CAAC"}
|
|
@@ -74,8 +74,34 @@ export interface TranscriptWatcherConfig {
|
|
|
74
74
|
/** Standard session directories (Codex, Claude Code, …). */
|
|
75
75
|
directories?: WatchedDirectory[];
|
|
76
76
|
onEvent: (envelope: DispatchEnvelope) => void;
|
|
77
|
+
/**
|
|
78
|
+
* #1422: skip `directories`-mode session files whose mtime is older than
|
|
79
|
+
* this many ms — dormant sessions are done growing and don't need a live
|
|
80
|
+
* OS-level watch handle. On an operator machine with a large accumulated
|
|
81
|
+
* history under `~/.claude/projects` / `~/.codex/sessions`, watching every
|
|
82
|
+
* historical file unbounded creates tens of thousands of native FSWatcher
|
|
83
|
+
* handles, starving the daemon's event loop (confirmed live: 15k+ handles,
|
|
84
|
+
* multiple daemon loops wedged for 70+ minutes; closing the handles
|
|
85
|
+
* in-process immediately unwedged them). Explicit `sources` are always
|
|
86
|
+
* watched regardless — they're operator-supplied, not bulk-enumerated.
|
|
87
|
+
* Default 7 days. `jinn capture import` remains the one-shot path for
|
|
88
|
+
* ingesting older history.
|
|
89
|
+
*/
|
|
90
|
+
maxDirectoryFileAgeMs?: number;
|
|
77
91
|
}
|
|
78
92
|
export interface TranscriptWatcher {
|
|
79
93
|
shutdown(): Promise<void>;
|
|
80
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* #1422: whether a `directories`-mode file is recent enough to warrant an
|
|
97
|
+
* active watch (pre-registration + chokidar's native handle). `stats` is
|
|
98
|
+
* `undefined` on chokidar's path-only pre-check (before it has stat'd the
|
|
99
|
+
* candidate) — always allow through at that stage; it re-checks with stats
|
|
100
|
+
* once available. Directories are always kept so recursion can still
|
|
101
|
+
* discover freshly-active sessions underneath an old-looking parent.
|
|
102
|
+
*/
|
|
103
|
+
export declare function shouldWatchDirectoryFile(filePath: string, stats: {
|
|
104
|
+
isDirectory(): boolean;
|
|
105
|
+
mtimeMs: number;
|
|
106
|
+
} | undefined, maxAgeMs: number): boolean;
|
|
81
107
|
export declare function startTranscriptWatcher(cfg: TranscriptWatcherConfig): Promise<TranscriptWatcher>;
|
|
@@ -51,6 +51,7 @@ import { GeminiSessionParser } from './transcript-parsers/gemini-session.js';
|
|
|
51
51
|
import { AiderHistoryParser } from './transcript-parsers/aider-history.js';
|
|
52
52
|
import { ContinueDevDataParser } from './transcript-parsers/continue-devdata.js';
|
|
53
53
|
import { listSessionJsonlFiles } from './transcript-session-dirs.js';
|
|
54
|
+
const DEFAULT_MAX_DIRECTORY_FILE_AGE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
54
55
|
function makeParser(tool) {
|
|
55
56
|
switch (tool) {
|
|
56
57
|
case 'claude-code':
|
|
@@ -84,6 +85,23 @@ async function tailOffsetForPath(filePath) {
|
|
|
84
85
|
function isJsonlSessionFile(filePath) {
|
|
85
86
|
return filePath.endsWith('.jsonl');
|
|
86
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* #1422: whether a `directories`-mode file is recent enough to warrant an
|
|
90
|
+
* active watch (pre-registration + chokidar's native handle). `stats` is
|
|
91
|
+
* `undefined` on chokidar's path-only pre-check (before it has stat'd the
|
|
92
|
+
* candidate) — always allow through at that stage; it re-checks with stats
|
|
93
|
+
* once available. Directories are always kept so recursion can still
|
|
94
|
+
* discover freshly-active sessions underneath an old-looking parent.
|
|
95
|
+
*/
|
|
96
|
+
export function shouldWatchDirectoryFile(filePath, stats, maxAgeMs) {
|
|
97
|
+
if (!stats)
|
|
98
|
+
return true;
|
|
99
|
+
if (stats.isDirectory())
|
|
100
|
+
return true;
|
|
101
|
+
if (!isJsonlSessionFile(filePath))
|
|
102
|
+
return false;
|
|
103
|
+
return Date.now() - stats.mtimeMs <= maxAgeMs;
|
|
104
|
+
}
|
|
87
105
|
export async function startTranscriptWatcher(cfg) {
|
|
88
106
|
const sources = cfg.sources ?? [];
|
|
89
107
|
const directories = cfg.directories ?? [];
|
|
@@ -92,6 +110,7 @@ export async function startTranscriptWatcher(cfg) {
|
|
|
92
110
|
}
|
|
93
111
|
const states = new Map();
|
|
94
112
|
const directoryParsers = new Map();
|
|
113
|
+
const maxDirectoryFileAgeMs = cfg.maxDirectoryFileAgeMs ?? DEFAULT_MAX_DIRECTORY_FILE_AGE_MS;
|
|
95
114
|
const registerSource = async (source, opts) => {
|
|
96
115
|
const normalizedPath = resolvePath(source.path);
|
|
97
116
|
const nextOffset = opts.tailFromEnd ? await tailOffsetForPath(normalizedPath) : 0;
|
|
@@ -111,6 +130,9 @@ export async function startTranscriptWatcher(cfg) {
|
|
|
111
130
|
directoryParsers.set(dir.tool, parser);
|
|
112
131
|
const files = await listSessionJsonlFiles(dir.directory, dir.recursive === true);
|
|
113
132
|
for (const filePath of files) {
|
|
133
|
+
const stats = await fs.stat(filePath).catch(() => undefined);
|
|
134
|
+
if (!shouldWatchDirectoryFile(filePath, stats, maxDirectoryFileAgeMs))
|
|
135
|
+
continue;
|
|
114
136
|
await registerSource({
|
|
115
137
|
tool: dir.tool,
|
|
116
138
|
path: filePath,
|
|
@@ -123,10 +145,21 @@ export async function startTranscriptWatcher(cfg) {
|
|
|
123
145
|
...sources.map((s) => s.path),
|
|
124
146
|
...directories.map((d) => d.directory),
|
|
125
147
|
];
|
|
148
|
+
// #1422: explicit `sources` are operator-supplied and always watched
|
|
149
|
+
// regardless of extension/age; only `directories`-mode bulk enumeration is
|
|
150
|
+
// bounded (see maxDirectoryFileAgeMs above — this is the other half of the
|
|
151
|
+
// same fix, applied where it actually matters: chokidar's own native watch
|
|
152
|
+
// handles, not just this module's pre-registration).
|
|
153
|
+
const explicitSourcePaths = new Set(sources.map((s) => resolvePath(s.path)));
|
|
126
154
|
const watcher = chokidar.watch(watchPaths, {
|
|
127
155
|
persistent: true,
|
|
128
156
|
awaitWriteFinish: { stabilityThreshold: 50, pollInterval: 25 },
|
|
129
157
|
ignoreInitial: true,
|
|
158
|
+
ignored: (candidatePath, stats) => {
|
|
159
|
+
if (explicitSourcePaths.has(resolvePath(candidatePath)))
|
|
160
|
+
return false;
|
|
161
|
+
return !shouldWatchDirectoryFile(candidatePath, stats, maxDirectoryFileAgeMs);
|
|
162
|
+
},
|
|
130
163
|
});
|
|
131
164
|
const resolveDirectoryForPath = (filepath) => {
|
|
132
165
|
const normalized = resolvePath(filepath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-watcher.js","sourceRoot":"","sources":["../../src/trajectory/transcript-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,QAA4B,MAAM,UAAU,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"transcript-watcher.js","sourceRoot":"","sources":["../../src/trajectory/transcript-watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/tx-retry.d.ts
CHANGED
|
@@ -27,6 +27,18 @@ export declare function isRecoverableTransactionError(error: unknown): boolean;
|
|
|
27
27
|
* to refresh the pinned nonce before the next retry attempt.
|
|
28
28
|
*/
|
|
29
29
|
export declare function isNonceTooLowError(error: unknown): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* True when the RPC rejected an `eth_sendRawTransaction` because a tx already
|
|
32
|
+
* occupies the target nonce and the resubmission's fee bump was insufficient to
|
|
33
|
+
* replace it ("replacement underpriced"). Distinct from `nonce too low`: the
|
|
34
|
+
* original tx is still PENDING at this nonce, not yet mined.
|
|
35
|
+
*
|
|
36
|
+
* Issue #897: the Safe execTransaction retry uses this to refresh the pinned
|
|
37
|
+
* nonce before the next fee bump and to trigger a reconcile against the
|
|
38
|
+
* pending original tx (it may mine mid-retry). The substrings mirror the
|
|
39
|
+
* replacement branch of `isRecoverableTransactionError`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function isReplacementUnderpricedError(error: unknown): boolean;
|
|
30
42
|
export declare function sleep(ms: number): Promise<void>;
|
|
31
43
|
export declare function backoffDelay(attemptIndex: number, baseMs: number, maxMs: number): Promise<void>;
|
|
32
44
|
export interface TxRetryOptions {
|