@jinn-network/client 0.1.8 → 0.1.9-canary.02befda9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +3 -3
- package/deployments/deployment-stolas-l2-baseSepolia-fast.json +23 -3
- package/deployments/deployment-task-coordinator-router-v3-baseSepolia-fast.json +34 -6
- package/dist/adapters/mech/adapter.d.ts +21 -1
- package/dist/adapters/mech/adapter.js +107 -52
- package/dist/adapters/mech/adapter.js.map +1 -1
- package/dist/adapters/mech/contracts.d.ts +174 -13
- package/dist/adapters/mech/contracts.js +99 -49
- package/dist/adapters/mech/contracts.js.map +1 -1
- package/dist/adapters/mech/safe-revert.d.ts +4 -0
- package/dist/adapters/mech/safe-revert.js +5 -1
- package/dist/adapters/mech/safe-revert.js.map +1 -1
- package/dist/adapters/mech/safe.js +77 -1
- package/dist/adapters/mech/safe.js.map +1 -1
- package/dist/adapters/mech/types.d.ts +4 -42
- package/dist/adapters/mech/types.js +8 -20
- package/dist/adapters/mech/types.js.map +1 -1
- package/dist/adapters/mech/verdict-code.js +1 -1
- package/dist/adapters/mech/verdict-code.js.map +1 -1
- package/dist/api/bootstrap-endpoint.d.ts +1 -0
- package/dist/api/bootstrap-endpoint.js +1 -0
- package/dist/api/bootstrap-endpoint.js.map +1 -1
- package/dist/api/discovery-endpoint.d.ts +1 -0
- package/dist/api/discovery-endpoint.js +24 -0
- package/dist/api/discovery-endpoint.js.map +1 -1
- package/dist/api/fleet-build.d.ts +1 -7
- package/dist/api/fleet-build.js +0 -7
- package/dist/api/fleet-build.js.map +1 -1
- package/dist/api/gather-status.d.ts +26 -17
- package/dist/api/gather-status.js +57 -516
- package/dist/api/gather-status.js.map +1 -1
- package/dist/api/harness-auth-status-endpoint.d.ts +21 -0
- package/dist/api/harness-auth-status-endpoint.js +17 -0
- package/dist/api/harness-auth-status-endpoint.js.map +1 -0
- package/dist/api/loop-completion-build.d.ts +79 -0
- package/dist/api/loop-completion-build.js +155 -0
- package/dist/api/loop-completion-build.js.map +1 -0
- package/dist/api/operator-artifacts-endpoint.js +1 -1
- package/dist/api/operator-artifacts-endpoint.js.map +1 -1
- package/dist/api/peers.js +2 -0
- package/dist/api/peers.js.map +1 -1
- package/dist/api/rewards-build.d.ts +8 -1
- package/dist/api/rewards-build.js +32 -4
- package/dist/api/rewards-build.js.map +1 -1
- package/dist/api/rewards-endpoint.d.ts +12 -0
- package/dist/api/rewards-endpoint.js +46 -0
- package/dist/api/rewards-endpoint.js.map +1 -0
- package/dist/api/server.d.ts +6 -16
- package/dist/api/server.js +29 -26
- package/dist/api/server.js.map +1 -1
- package/dist/api/setup-endpoints.d.ts +41 -0
- package/dist/api/setup-endpoints.js +258 -45
- package/dist/api/setup-endpoints.js.map +1 -1
- package/dist/api/solvernets-endpoints.js +4 -1
- package/dist/api/solvernets-endpoints.js.map +1 -1
- package/dist/api/status-build.d.ts +71 -94
- package/dist/api/status-build.js +11 -77
- package/dist/api/status-build.js.map +1 -1
- package/dist/api/status-rollup-build.d.ts +0 -4
- package/dist/api/status-rollup-build.js +0 -4
- package/dist/api/status-rollup-build.js.map +1 -1
- package/dist/api/stop-hook.d.ts +1 -1
- package/dist/api/stop-hook.js +1 -1
- package/dist/api/stop-hook.js.map +1 -1
- package/dist/build-info.json +4 -4
- package/dist/build-meta.json +1 -1
- package/dist/captures/live-publisher.d.ts +9 -0
- package/dist/captures/live-publisher.js +1 -0
- package/dist/captures/live-publisher.js.map +1 -1
- package/dist/captures/publish.d.ts +11 -0
- package/dist/captures/publish.js +15 -5
- package/dist/captures/publish.js.map +1 -1
- package/dist/cli/commands/codedigest-revert-check.js +6 -2
- package/dist/cli/commands/codedigest-revert-check.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.js +36 -4
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/eval.d.ts +87 -0
- package/dist/cli/commands/eval.js +481 -0
- package/dist/cli/commands/eval.js.map +1 -0
- package/dist/cli/commands/rewards.d.ts +2 -0
- package/dist/cli/commands/rewards.js +39 -10
- package/dist/cli/commands/rewards.js.map +1 -1
- package/dist/cli/commands/solver-nets.js +68 -0
- package/dist/cli/commands/solver-nets.js.map +1 -1
- package/dist/cli/commands/status.js +0 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/update.js +8 -0
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/version.js +4 -0
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/introspection-context.js +0 -3
- package/dist/cli/introspection-context.js.map +1 -1
- package/dist/config.d.ts +158 -541
- package/dist/config.js +189 -196
- package/dist/config.js.map +1 -1
- package/dist/corpus/acquire.d.ts +7 -6
- package/dist/corpus/acquire.js +10 -10
- package/dist/corpus/acquire.js.map +1 -1
- package/dist/corpus/fetch-artifact.d.ts +21 -0
- package/dist/corpus/fetch-artifact.js +33 -0
- package/dist/corpus/fetch-artifact.js.map +1 -0
- package/dist/corpus/index.d.ts +2 -2
- package/dist/corpus/route-resolver.d.ts +3 -3
- package/dist/corpus/route-resolver.js +3 -3
- package/dist/daemon/ai-units-gate.d.ts +6 -6
- package/dist/daemon/ai-units-gate.js +11 -10
- package/dist/daemon/ai-units-gate.js.map +1 -1
- package/dist/daemon/balance-topup-loop.js +3 -0
- package/dist/daemon/balance-topup-loop.js.map +1 -1
- package/dist/daemon/checkpoint-loop.js +2 -2
- package/dist/daemon/creator.d.ts +1 -0
- package/dist/daemon/creator.js +26 -14
- package/dist/daemon/creator.js.map +1 -1
- package/dist/daemon/daemon.d.ts +15 -10
- package/dist/daemon/daemon.js +71 -39
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/delivery-watcher.d.ts +9 -0
- package/dist/daemon/delivery-watcher.js +24 -1
- package/dist/daemon/delivery-watcher.js.map +1 -1
- package/dist/daemon/eviction-loop.d.ts +7 -0
- package/dist/daemon/eviction-loop.js +19 -3
- package/dist/daemon/eviction-loop.js.map +1 -1
- package/dist/daemon/join-applier.d.ts +35 -0
- package/dist/daemon/join-applier.js +49 -0
- package/dist/daemon/join-applier.js.map +1 -0
- package/dist/daemon/loop-heartbeat.d.ts +34 -0
- package/dist/daemon/loop-heartbeat.js +38 -0
- package/dist/daemon/loop-heartbeat.js.map +1 -0
- package/dist/daemon/reward-claim-loop.js +4 -1
- package/dist/daemon/reward-claim-loop.js.map +1 -1
- package/dist/daemon/skip-log-dedup.d.ts +1 -1
- package/dist/daemon/skip-log-dedup.js +3 -0
- package/dist/daemon/skip-log-dedup.js.map +1 -1
- package/dist/daemon/watchdog-loop.d.ts +84 -0
- package/dist/daemon/watchdog-loop.js +91 -0
- package/dist/daemon/watchdog-loop.js.map +1 -0
- package/dist/dashboard/assets/index-BsrAAmvC.js +171 -0
- package/dist/dashboard/assets/index-DQOWJ2SF.css +1 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/discovery/http.d.ts +17 -0
- package/dist/discovery/http.js +295 -25
- package/dist/discovery/http.js.map +1 -1
- package/dist/discovery/onchain.js +158 -2
- package/dist/discovery/onchain.js.map +1 -1
- package/dist/discovery/types.d.ts +106 -0
- package/dist/discovery/types.js +40 -0
- package/dist/discovery/types.js.map +1 -1
- package/dist/discovery/with-fallback.js +14 -0
- package/dist/discovery/with-fallback.js.map +1 -1
- package/dist/earning/bootstrap.d.ts +25 -0
- package/dist/earning/bootstrap.js +79 -28
- package/dist/earning/bootstrap.js.map +1 -1
- package/dist/earning/contracts.d.ts +0 -229
- package/dist/earning/contracts.js +4 -184
- package/dist/earning/contracts.js.map +1 -1
- package/dist/earning/faucet-topup-store.d.ts +41 -0
- package/dist/earning/faucet-topup-store.js +89 -0
- package/dist/earning/faucet-topup-store.js.map +1 -0
- package/dist/earning/faucet.d.ts +1 -1
- package/dist/earning/faucet.js +2 -2
- package/dist/earning/faucet.js.map +1 -1
- package/dist/earning/safe-adapter.js +11 -0
- package/dist/earning/safe-adapter.js.map +1 -1
- package/dist/earning/stolas-claim.js +8 -8
- package/dist/earning/stolas-claim.js.map +1 -1
- package/dist/earning/{jinn-rewards.d.ts → stolas-staking.d.ts} +4 -8
- package/dist/earning/{jinn-rewards.js → stolas-staking.js} +6 -10
- package/dist/earning/stolas-staking.js.map +1 -0
- package/dist/earning/testnet-setup-migration.d.ts +1 -0
- package/dist/earning/testnet-setup-migration.js +7 -2
- package/dist/earning/testnet-setup-migration.js.map +1 -1
- package/dist/earning/types.d.ts +1 -1
- package/dist/earning/types.js +1 -1
- package/dist/earning/types.js.map +1 -1
- package/dist/earning/viem-clients.d.ts +3 -19
- package/dist/earning/viem-clients.js +4 -31
- package/dist/earning/viem-clients.js.map +1 -1
- package/dist/eval/eval-harness-run.d.ts +63 -0
- package/dist/eval/eval-harness-run.js +123 -0
- package/dist/eval/eval-harness-run.js.map +1 -0
- package/dist/eval/orchestrator.d.ts +224 -0
- package/dist/eval/orchestrator.js +250 -0
- package/dist/eval/orchestrator.js.map +1 -0
- package/dist/eval/paired.d.ts +68 -0
- package/dist/eval/paired.js +93 -0
- package/dist/eval/paired.js.map +1 -0
- package/dist/eval/resolve-slate-tasks.d.ts +35 -0
- package/dist/eval/resolve-slate-tasks.js +56 -0
- package/dist/eval/resolve-slate-tasks.js.map +1 -0
- package/dist/eval/screen-discovery.d.ts +22 -0
- package/dist/eval/screen-discovery.js +71 -0
- package/dist/eval/screen-discovery.js.map +1 -0
- package/dist/eval/screen-progress.d.ts +41 -0
- package/dist/eval/screen-progress.js +60 -0
- package/dist/eval/screen-progress.js.map +1 -0
- package/dist/eval/screen-runner.d.ts +30 -0
- package/dist/eval/screen-runner.js +289 -0
- package/dist/eval/screen-runner.js.map +1 -0
- package/dist/eval/screen.d.ts +107 -0
- package/dist/eval/screen.js +159 -0
- package/dist/eval/screen.js.map +1 -0
- package/dist/eval/slope.d.ts +29 -0
- package/dist/eval/slope.js +46 -0
- package/dist/eval/slope.js.map +1 -0
- package/dist/eval/train-sequence.d.ts +35 -0
- package/dist/eval/train-sequence.js +59 -0
- package/dist/eval/train-sequence.js.map +1 -0
- package/dist/eval/wilson.d.ts +45 -0
- package/dist/eval/wilson.js +48 -0
- package/dist/eval/wilson.js.map +1 -0
- package/dist/events/types.d.ts +1 -1
- package/dist/events/types.js +1 -1
- package/dist/events/types.js.map +1 -1
- package/dist/harnesses/auth-source.d.ts +51 -0
- package/dist/harnesses/auth-source.js +155 -0
- package/dist/harnesses/auth-source.js.map +1 -0
- package/dist/harnesses/engine/canonical-json.js +5 -3
- package/dist/harnesses/engine/canonical-json.js.map +1 -1
- package/dist/harnesses/engine/engine.d.ts +32 -0
- package/dist/harnesses/engine/engine.js +76 -9
- package/dist/harnesses/engine/engine.js.map +1 -1
- package/dist/harnesses/engine/packaging.js +5 -5
- package/dist/harnesses/engine/packaging.js.map +1 -1
- package/dist/harnesses/engine/persistence.d.ts +17 -0
- package/dist/harnesses/engine/persistence.js +28 -0
- package/dist/harnesses/engine/persistence.js.map +1 -1
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +1 -1
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js +1 -1
- package/dist/harnesses/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/adapter.d.ts +2 -0
- package/dist/harnesses/impls/hermes-agent/adapter.js +8 -5
- package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +1 -0
- package/dist/harnesses/impls/hermes-agent/bootstrap.js +6 -1
- package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
- package/dist/harnesses/impls/hermes-agent/harness.d.ts +25 -3
- package/dist/harnesses/impls/hermes-agent/harness.js +89 -5
- package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
- package/dist/harnesses/impls/index.d.ts +2 -0
- package/dist/harnesses/impls/index.js +10 -1
- package/dist/harnesses/impls/index.js.map +1 -1
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.d.ts +34 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js +111 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/eval-runner.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.d.ts +24 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js +19 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/evaluator.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.d.ts +64 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.js +125 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/harness.js.map +1 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.d.ts +32 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.js +73 -0
- package/dist/harnesses/impls/jinn-repo-evaluator/repro.js.map +1 -0
- package/dist/harnesses/impls/learner/adapters/claude-code.js +5 -0
- package/dist/harnesses/impls/learner/adapters/claude-code.js.map +1 -1
- package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +8 -0
- package/dist/harnesses/impls/learner/adapters/codex-code.js +91 -11
- package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
- package/dist/harnesses/impls/learner/harness.d.ts +29 -1
- package/dist/harnesses/impls/learner/harness.js +85 -1
- package/dist/harnesses/impls/learner/harness.js.map +1 -1
- package/dist/harnesses/impls/learner/harvest.d.ts +2 -0
- package/dist/harnesses/impls/learner/harvest.js +51 -1
- package/dist/harnesses/impls/learner/harvest.js.map +1 -1
- package/dist/harnesses/impls/learner/plugin-path.js +1 -0
- package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
- package/dist/harnesses/impls/stub.d.ts +2 -2
- package/dist/harnesses/impls/stub.js +2 -2
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +3 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +2 -2
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +3 -1
- package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
- package/dist/harnesses/readiness-registry.d.ts +16 -0
- package/dist/harnesses/readiness-registry.js +28 -6
- package/dist/harnesses/readiness-registry.js.map +1 -1
- package/dist/harnesses/types.d.ts +26 -0
- package/dist/learner/revert-decision.d.ts +16 -1
- package/dist/learner/revert-decision.js +38 -18
- package/dist/learner/revert-decision.js.map +1 -1
- package/dist/learner/revert-stats.d.ts +14 -0
- package/dist/learner/revert-stats.js +42 -0
- package/dist/learner/revert-stats.js.map +1 -1
- package/dist/local-provider-url.d.ts +3 -0
- package/dist/local-provider-url.js +28 -0
- package/dist/local-provider-url.js.map +1 -0
- package/dist/main.js +125 -120
- package/dist/main.js.map +1 -1
- package/dist/mcp/acquire-artifact.d.ts +3 -3
- package/dist/mcp/acquire-artifact.js +3 -3
- package/dist/mcp/operator-server.js +1 -1
- package/dist/mcp/operator-server.js.map +1 -1
- package/dist/mcp/server.js +5 -6
- package/dist/mcp/server.js.map +1 -1
- package/dist/observability/emit-event.d.ts +1 -1
- package/dist/observability/emit-event.js +0 -4
- package/dist/observability/emit-event.js.map +1 -1
- package/dist/plugins/learner/.claude-plugin/plugin.json +1 -1
- package/dist/plugins/learner/.codex-plugin/plugin.json +1 -1
- package/dist/plugins/learner/hooks/session-start +30 -1
- package/dist/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
- package/dist/preflight/deployment-readiness.d.ts +127 -0
- package/dist/preflight/deployment-readiness.js +308 -0
- package/dist/preflight/deployment-readiness.js.map +1 -0
- package/dist/preflight/pidfile-liveness.d.ts +7 -1
- package/dist/preflight/pidfile-liveness.js +14 -0
- package/dist/preflight/pidfile-liveness.js.map +1 -1
- package/dist/rpc/transport.d.ts +43 -5
- package/dist/rpc/transport.js +131 -30
- package/dist/rpc/transport.js.map +1 -1
- package/dist/scripts/swe-rebench-v2-seed-pool.json +2 -1
- package/dist/solver-nets/registry.d.ts +19 -0
- package/dist/solver-nets/registry.js +95 -66
- package/dist/solver-nets/registry.js.map +1 -1
- package/dist/solver-types/_jinn-repo-pool.d.ts +27 -0
- package/dist/solver-types/_jinn-repo-pool.js +27 -0
- package/dist/solver-types/_jinn-repo-pool.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.d.ts +76 -0
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.js +156 -0
- package/dist/solver-types/_swe-rebench-v2-held-out-slate.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.d.ts +81 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.js +116 -0
- package/dist/solver-types/_swe-rebench-v2-pool-recovery.js.map +1 -0
- package/dist/solver-types/_swe-rebench-v2-state.d.ts +9 -0
- package/dist/solver-types/_swe-rebench-v2-state.js +14 -0
- package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
- package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +30 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js +40 -0
- package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
- package/dist/solver-types/index.js +2 -0
- package/dist/solver-types/index.js.map +1 -1
- package/dist/solver-types/jinn-repo-admit.d.ts +17 -0
- package/dist/solver-types/jinn-repo-admit.js +16 -0
- package/dist/solver-types/jinn-repo-admit.js.map +1 -0
- package/dist/solver-types/jinn-repo-auto.d.ts +60 -0
- package/dist/solver-types/jinn-repo-auto.js +163 -0
- package/dist/solver-types/jinn-repo-auto.js.map +1 -0
- package/dist/solver-types/jinn-repo-definition.d.ts +15 -0
- package/dist/solver-types/jinn-repo-definition.js +34 -0
- package/dist/solver-types/jinn-repo-definition.js.map +1 -0
- package/dist/solver-types/jinn-repo-extract.d.ts +16 -0
- package/dist/solver-types/jinn-repo-extract.js +32 -0
- package/dist/solver-types/jinn-repo-extract.js.map +1 -0
- package/dist/solver-types/jinn-repo.d.ts +21 -0
- package/dist/solver-types/jinn-repo.js +23 -0
- package/dist/solver-types/jinn-repo.js.map +1 -0
- package/dist/solver-types/learner-loop-test.js +1 -1
- package/dist/solver-types/learner-loop-test.js.map +1 -1
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v1.json +20 -0
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.json +19 -0
- package/dist/solver-types/slates/held-out-slate.swe-rebench-v2.v2.screening-report.json +628 -0
- package/dist/solver-types/solver-type.d.ts +8 -0
- package/dist/solver-types/swe-rebench-v2.d.ts +2 -0
- package/dist/solver-types/swe-rebench-v2.js +115 -10
- package/dist/solver-types/swe-rebench-v2.js.map +1 -1
- package/dist/solvernets/launched-record-dispatcher.d.ts +5 -0
- package/dist/solvernets/launched-record-dispatcher.js +8 -1
- package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
- package/dist/solvernets/registry-client-erc8004.js +29 -37
- package/dist/solvernets/registry-client-erc8004.js.map +1 -1
- package/dist/solvernets/registry-client.d.ts +6 -0
- package/dist/solvernets/store.d.ts +1 -1
- package/dist/solvernets/store.js +8 -3
- package/dist/solvernets/store.js.map +1 -1
- package/dist/spend/ai-units-config.d.ts +10 -0
- package/dist/spend/ai-units-config.js +7 -1
- package/dist/spend/ai-units-config.js.map +1 -1
- package/dist/spend/ai-units.d.ts +51 -0
- package/dist/spend/ai-units.js +73 -0
- package/dist/spend/ai-units.js.map +1 -1
- package/dist/spend/record.js +12 -5
- package/dist/spend/record.js.map +1 -1
- package/dist/spend/usage.js +39 -3
- package/dist/spend/usage.js.map +1 -1
- package/dist/store/store.d.ts +92 -5
- package/dist/store/store.js +184 -7
- package/dist/store/store.js.map +1 -1
- package/dist/trajectory/emit.d.ts +6 -0
- package/dist/trajectory/emit.js +9 -1
- package/dist/trajectory/emit.js.map +1 -1
- package/dist/trajectory/harness-bundle-schema.d.ts +1 -1
- package/dist/trajectory/harness-bundle-schema.js +1 -1
- package/dist/trajectory/harness-bundle-schema.js.map +1 -1
- package/dist/trajectory/schema.d.ts +1 -1
- package/dist/trajectory/schema.js +1 -1
- package/dist/trajectory/schema.js.map +1 -1
- package/dist/trajectory/scrub/build.d.ts +27 -0
- package/dist/trajectory/scrub/build.js +43 -0
- package/dist/trajectory/scrub/build.js.map +1 -0
- package/dist/trajectory/scrub/emit-scrub.d.ts +41 -0
- package/dist/trajectory/scrub/emit-scrub.js +88 -0
- package/dist/trajectory/scrub/emit-scrub.js.map +1 -0
- package/dist/trajectory/scrub/key-policy.d.ts +20 -0
- package/dist/trajectory/scrub/key-policy.js +43 -0
- package/dist/trajectory/scrub/key-policy.js.map +1 -0
- package/dist/trajectory/scrub/ml-pii-stage.d.ts +24 -0
- package/dist/trajectory/scrub/ml-pii-stage.js +43 -0
- package/dist/trajectory/scrub/ml-pii-stage.js.map +1 -0
- package/dist/trajectory/scrub/openredaction-stage.d.ts +14 -0
- package/dist/trajectory/scrub/openredaction-stage.js +36 -0
- package/dist/trajectory/scrub/openredaction-stage.js.map +1 -0
- package/dist/trajectory/scrub/pii-build.d.ts +31 -0
- package/dist/trajectory/scrub/pii-build.js +64 -0
- package/dist/trajectory/scrub/pii-build.js.map +1 -0
- package/dist/trajectory/scrub/pipeline.d.ts +16 -0
- package/dist/trajectory/scrub/pipeline.js +26 -0
- package/dist/trajectory/scrub/pipeline.js.map +1 -0
- package/dist/trajectory/scrub/secretlint-stage.d.ts +13 -0
- package/dist/trajectory/scrub/secretlint-stage.js +121 -0
- package/dist/trajectory/scrub/secretlint-stage.js.map +1 -0
- package/dist/trajectory/scrub/transformers-detector.d.ts +35 -0
- package/dist/trajectory/scrub/transformers-detector.js +68 -0
- package/dist/trajectory/scrub/transformers-detector.js.map +1 -0
- package/dist/trajectory/scrub/types.d.ts +25 -0
- package/dist/trajectory/scrub/types.js +2 -0
- package/dist/trajectory/scrub/types.js.map +1 -0
- package/dist/trajectory/transcript-parsers/types.d.ts +1 -1
- package/dist/trajectory/transcript-parsers/types.js +1 -1
- package/dist/trajectory/transcript-parsers/types.js.map +1 -1
- package/dist/tx-retry.d.ts +12 -0
- package/dist/tx-retry.js +41 -12
- package/dist/tx-retry.js.map +1 -1
- package/dist/types/envelope.d.ts +1 -1
- package/dist/types/envelope.js +1 -1
- package/dist/types/envelope.js.map +1 -1
- package/dist/types/payloads/index.d.ts +1 -1
- package/dist/types/payloads/index.js +7 -1
- package/dist/types/payloads/index.js.map +1 -1
- package/dist/types/payloads/portfolio-v0.d.ts +1 -1
- package/dist/types/payloads/portfolio-v0.js +1 -1
- package/dist/types/payloads/portfolio-v0.js.map +1 -1
- package/dist/types/payloads/prediction-apy-v0.d.ts +1 -1
- package/dist/types/payloads/prediction-apy-v0.js +1 -1
- package/dist/types/payloads/prediction-apy-v0.js.map +1 -1
- package/dist/types/payloads/prediction-v0.d.ts +1 -1
- package/dist/types/payloads/prediction-v0.js +1 -1
- package/dist/types/payloads/prediction-v0.js.map +1 -1
- package/dist/types/portfolio.d.ts +1 -1
- package/dist/types/portfolio.js +1 -1
- package/dist/types/portfolio.js.map +1 -1
- package/dist/types/prediction-apy.d.ts +1 -1
- package/dist/types/prediction-apy.js +1 -1
- package/dist/types/prediction-apy.js.map +1 -1
- package/dist/types/prediction.d.ts +1 -1
- package/dist/types/prediction.js +1 -1
- package/dist/types/prediction.js.map +1 -1
- package/dist/types/session-provenance.d.ts +1 -1
- package/dist/types/session-provenance.js +1 -1
- package/dist/types/session-provenance.js.map +1 -1
- package/dist/types/task-document.d.ts +315 -1
- package/dist/types/task-document.js +9 -1
- package/dist/types/task-document.js.map +1 -1
- package/dist/types/task.d.ts +29 -1
- package/dist/types/task.js +1 -1
- package/dist/types/task.js.map +1 -1
- package/dist/types/window.d.ts +1 -1
- package/dist/types/window.js +1 -1
- package/dist/types/window.js.map +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/checkpoint.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/checkpoint.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/contracts.d.ts +3 -2
- package/dist/vendor/@jinn-network/sdk/dist/contracts.js +49 -0
- package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.d.ts +44 -0
- package/dist/vendor/@jinn-network/sdk/dist/jinn-repo.js +25 -0
- package/dist/vendor/@jinn-network/sdk/dist/json-schema.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/json-schema.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.d.ts +38 -0
- package/dist/vendor/@jinn-network/sdk/dist/payloads/jinn-repo.js +22 -0
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/prediction-v1.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/session-derived.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.d.ts +109 -2
- package/dist/vendor/@jinn-network/sdk/dist/payloads/swe-rebench-v2.js +26 -2
- package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/prediction-v1.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.d.ts +4 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/jinn-repo.js +2 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.d.ts +65 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2-held-out-slate.js +123 -0
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.d.ts +2 -2
- package/dist/vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.d.ts +1 -1
- package/dist/vendor/@jinn-network/sdk/dist/swe-rebench-v2.js +1 -1
- package/dist/vendor/@jinn-network/sdk/package.json +9 -1
- package/docker-compose.yml +3 -2
- package/package.json +36 -26
- package/plugins/jinn-repo-runtime/.claude-plugin/plugin.json +5 -0
- package/plugins/jinn-repo-runtime/.codex-plugin/plugin.json +39 -0
- package/plugins/jinn-repo-runtime/README.md +27 -0
- package/plugins/jinn-repo-runtime/hooks/hooks.json +16 -0
- package/plugins/jinn-repo-runtime/hooks/session-start +73 -0
- package/plugins/jinn-repo-runtime/jinn.plugin.json +11 -0
- package/plugins/jinn-repo-runtime/skills/task/SKILL.md +92 -0
- package/plugins/learner/.claude-plugin/plugin.json +1 -1
- package/plugins/learner/.codex-plugin/plugin.json +1 -1
- package/plugins/learner/hooks/session-start +30 -1
- package/plugins/learner/skills/learn/consolidator-prompt.md +4 -0
- package/plugins/swe-rebench-v2-runtime/hooks/hooks.json +16 -0
- package/plugins/swe-rebench-v2-runtime/hooks/session-start +74 -0
- package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +0 -55
- package/deployments/deployment-jinn-mvi-l1-sepolia.json +0 -55
- package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +0 -13
- package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +0 -15
- package/dist/daemon/jinn-claim-loop-canonical.d.ts +0 -207
- package/dist/daemon/jinn-claim-loop-canonical.js +0 -296
- package/dist/daemon/jinn-claim-loop-canonical.js.map +0 -1
- package/dist/daemon/jinn-claim-loop-mock.d.ts +0 -61
- package/dist/daemon/jinn-claim-loop-mock.js +0 -122
- package/dist/daemon/jinn-claim-loop-mock.js.map +0 -1
- package/dist/daemon/jinn-claim-loop-wiring.d.ts +0 -33
- package/dist/daemon/jinn-claim-loop-wiring.js +0 -40
- package/dist/daemon/jinn-claim-loop-wiring.js.map +0 -1
- package/dist/daemon/jinn-claim-loop.d.ts +0 -130
- package/dist/daemon/jinn-claim-loop.js +0 -328
- package/dist/daemon/jinn-claim-loop.js.map +0 -1
- package/dist/dashboard/assets/index-CzKxvMcU.css +0 -32
- package/dist/dashboard/assets/index-yVemxHot.js +0 -351
- package/dist/earning/jinn-rewards.js.map +0 -1
- package/dist/scripts/donation-consumption-acceptance.d.ts +0 -85
- package/dist/scripts/donation-consumption-acceptance.js +0 -1382
- package/dist/scripts/donation-consumption-acceptance.js.map +0 -1
- package/dist/x402/acquire.d.ts +0 -17
- package/dist/x402/acquire.js +0 -49
- package/dist/x402/acquire.js.map +0 -1
- package/dist/x402/facilitator.d.ts +0 -11
- package/dist/x402/facilitator.js +0 -52
- package/dist/x402/facilitator.js.map +0 -1
- package/dist/x402/handler.d.ts +0 -27
- package/dist/x402/handler.js +0 -236
- package/dist/x402/handler.js.map +0 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ScrubPipeline } from './pipeline.js';
|
|
2
|
+
import { keyPolicyStage } from './key-policy.js';
|
|
3
|
+
import { openredactionStage } from './openredaction-stage.js';
|
|
4
|
+
import { secretlintStage } from './secretlint-stage.js';
|
|
5
|
+
import { mlPiiStage } from './ml-pii-stage.js';
|
|
6
|
+
/**
|
|
7
|
+
* Default key policy. `jinn.*` identity/chain attributes are structural and pass
|
|
8
|
+
* raw. The `drop` tier deletes the spec's stage-1 high-confidence keys outright
|
|
9
|
+
* (auth headers, cookies, env dumps — see `spec/2026-06-15-ts-trajectory-scrub-stack.md`):
|
|
10
|
+
* these never carry sellable content and are never safe to publish. Globs use the
|
|
11
|
+
* trailing-`*` prefix form `classifyKey` supports; the HTTP header keys are listed
|
|
12
|
+
* per request/response direction (a leading `*.header.…` glob is not matched, so
|
|
13
|
+
* we enumerate the concrete keys). Everything else is `content` and flows through
|
|
14
|
+
* the value-scrubbing stages.
|
|
15
|
+
*/
|
|
16
|
+
export const DEFAULT_KEY_POLICY = {
|
|
17
|
+
safe: ['jinn.*'],
|
|
18
|
+
drop: [
|
|
19
|
+
'http.request.header.authorization',
|
|
20
|
+
'http.response.header.authorization',
|
|
21
|
+
'http.request.header.cookie',
|
|
22
|
+
'http.response.header.cookie',
|
|
23
|
+
'http.request.header.set-cookie',
|
|
24
|
+
'http.response.header.set-cookie',
|
|
25
|
+
'env.*',
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Assembles the seller-side scrub pipeline (cost-ascending): structural key
|
|
30
|
+
* policy → openredaction (structured PII) → secretlint + entropy (secrets) →
|
|
31
|
+
* optional GLiNER (ML PII). The GLiNER stage is added only when a detector is
|
|
32
|
+
* supplied, so the daemon degrades gracefully (regex + secrets still scrub) when
|
|
33
|
+
* the ML model is unavailable.
|
|
34
|
+
*/
|
|
35
|
+
export function buildScrubPipeline(opts = {}) {
|
|
36
|
+
const policy = opts.policy ?? DEFAULT_KEY_POLICY;
|
|
37
|
+
const stages = [keyPolicyStage(policy), openredactionStage(policy), secretlintStage(policy)];
|
|
38
|
+
if (opts.piiDetector) {
|
|
39
|
+
stages.push(mlPiiStage(policy, opts.piiDetector));
|
|
40
|
+
}
|
|
41
|
+
return new ScrubPipeline(stages);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAkB,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AAEjE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAc;IAC3C,IAAI,EAAE,CAAC,QAAQ,CAAC;IAChB,IAAI,EAAE;QACJ,mCAAmC;QACnC,oCAAoC;QACpC,4BAA4B;QAC5B,6BAA6B;QAC7B,gCAAgC;QAChC,iCAAiC;QACjC,OAAO;KACR;CACF,CAAC;AAQF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAkC,EAAE;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,kBAAkB,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { RedactionManifest, Span } from '../schema.js';
|
|
2
|
+
import type { ScrubPipeline } from './pipeline.js';
|
|
3
|
+
/**
|
|
4
|
+
* Seller-side scrub applied at emit time, before a trajectory is signed and
|
|
5
|
+
* published. Runs every span's attributes (and each event's attributes) through
|
|
6
|
+
* the pipeline, rebuilds the prev-span hash chain over the scrubbed spans, and
|
|
7
|
+
* produces the redaction manifest (one entry per span listing the keys touched;
|
|
8
|
+
* `event.<key>` for event-attribute redactions).
|
|
9
|
+
*/
|
|
10
|
+
export declare function scrubSpansForEmit(spans: Span[], pipeline: ScrubPipeline, taskCid: string): Promise<{
|
|
11
|
+
spans: Span[];
|
|
12
|
+
redactionManifest: RedactionManifest;
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* Minimal structural shape of a capture span (jinn.capture-trajectory.v1): a
|
|
16
|
+
* flat attribute bag plus the keys already redacted at ingest. Captures have no
|
|
17
|
+
* events array and no in-run hash chain, so they cannot go through
|
|
18
|
+
* {@link scrubSpansForEmit}; this is their dedicated seller-side scrub.
|
|
19
|
+
*/
|
|
20
|
+
export interface ScrubbableCaptureSpan {
|
|
21
|
+
attributes: Record<string, unknown>;
|
|
22
|
+
redactedKeys: string[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Seller-side scrub for capture spans, applied at publish time before the
|
|
26
|
+
* capture trajectory is uploaded. Runs each span's attributes through the
|
|
27
|
+
* pipeline, replacing them with the scrubbed values, and unions the pipeline's
|
|
28
|
+
* redactions into the span's existing `redactedKeys`. Unlike
|
|
29
|
+
* {@link scrubSpansForEmit} it does NOT touch events or inject a hash chain —
|
|
30
|
+
* capture spans carry neither. Generic over the span type so the concrete
|
|
31
|
+
* `SpanRow` (with its extra columns) is returned unchanged apart from
|
|
32
|
+
* `attributes` and `redactedKeys`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function scrubCaptureSpans<T extends ScrubbableCaptureSpan>(spans: T[], pipeline: ScrubPipeline): Promise<T[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Unions two redaction manifests by spanId (dedup redactedKeys per span). Used
|
|
37
|
+
* when an ingestion-time manifest (e.g. a capture's stored redactedKeys) is
|
|
38
|
+
* combined with the emit-time pipeline manifest. Keeps the
|
|
39
|
+
* `totalRedactions === sum(redactedKeys)` invariant the schema enforces.
|
|
40
|
+
*/
|
|
41
|
+
export declare function mergeRedactionManifests(a: RedactionManifest, b: RedactionManifest): RedactionManifest;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { computeGenesisHash, computePrevSpanHash } from '../hash-chain.js';
|
|
2
|
+
/**
|
|
3
|
+
* Seller-side scrub applied at emit time, before a trajectory is signed and
|
|
4
|
+
* published. Runs every span's attributes (and each event's attributes) through
|
|
5
|
+
* the pipeline, rebuilds the prev-span hash chain over the scrubbed spans, and
|
|
6
|
+
* produces the redaction manifest (one entry per span listing the keys touched;
|
|
7
|
+
* `event.<key>` for event-attribute redactions).
|
|
8
|
+
*/
|
|
9
|
+
export async function scrubSpansForEmit(spans, pipeline, taskCid) {
|
|
10
|
+
const out = [];
|
|
11
|
+
const manifestSpans = [];
|
|
12
|
+
let total = 0;
|
|
13
|
+
let prev = computeGenesisHash(taskCid);
|
|
14
|
+
for (const span of spans) {
|
|
15
|
+
const redactedKeys = new Set();
|
|
16
|
+
const attrResult = await pipeline.run(span.attributes ?? {});
|
|
17
|
+
for (const r of attrResult.redactions)
|
|
18
|
+
redactedKeys.add(r.key);
|
|
19
|
+
const events = [];
|
|
20
|
+
for (const event of span.events) {
|
|
21
|
+
if (event.attributes && Object.keys(event.attributes).length > 0) {
|
|
22
|
+
const evResult = await pipeline.run(event.attributes);
|
|
23
|
+
events.push({ ...event, attributes: evResult.attributes });
|
|
24
|
+
for (const r of evResult.redactions)
|
|
25
|
+
redactedKeys.add(`event.${r.key}`);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
events.push(event);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const scrubbed = {
|
|
32
|
+
...span,
|
|
33
|
+
attributes: { ...attrResult.attributes, 'jinn.prevSpanHash': prev },
|
|
34
|
+
events,
|
|
35
|
+
};
|
|
36
|
+
out.push(scrubbed);
|
|
37
|
+
prev = computePrevSpanHash(scrubbed);
|
|
38
|
+
if (redactedKeys.size > 0) {
|
|
39
|
+
const keys = [...redactedKeys];
|
|
40
|
+
manifestSpans.push({ spanId: span.spanId, redactedKeys: keys });
|
|
41
|
+
total += keys.length;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { spans: out, redactionManifest: { spans: manifestSpans, totalRedactions: total } };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Seller-side scrub for capture spans, applied at publish time before the
|
|
48
|
+
* capture trajectory is uploaded. Runs each span's attributes through the
|
|
49
|
+
* pipeline, replacing them with the scrubbed values, and unions the pipeline's
|
|
50
|
+
* redactions into the span's existing `redactedKeys`. Unlike
|
|
51
|
+
* {@link scrubSpansForEmit} it does NOT touch events or inject a hash chain —
|
|
52
|
+
* capture spans carry neither. Generic over the span type so the concrete
|
|
53
|
+
* `SpanRow` (with its extra columns) is returned unchanged apart from
|
|
54
|
+
* `attributes` and `redactedKeys`.
|
|
55
|
+
*/
|
|
56
|
+
export async function scrubCaptureSpans(spans, pipeline) {
|
|
57
|
+
const out = [];
|
|
58
|
+
for (const span of spans) {
|
|
59
|
+
const result = await pipeline.run(span.attributes ?? {});
|
|
60
|
+
const redactedKeys = new Set(span.redactedKeys);
|
|
61
|
+
for (const r of result.redactions)
|
|
62
|
+
redactedKeys.add(r.key);
|
|
63
|
+
out.push({ ...span, attributes: result.attributes, redactedKeys: [...redactedKeys] });
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Unions two redaction manifests by spanId (dedup redactedKeys per span). Used
|
|
69
|
+
* when an ingestion-time manifest (e.g. a capture's stored redactedKeys) is
|
|
70
|
+
* combined with the emit-time pipeline manifest. Keeps the
|
|
71
|
+
* `totalRedactions === sum(redactedKeys)` invariant the schema enforces.
|
|
72
|
+
*/
|
|
73
|
+
export function mergeRedactionManifests(a, b) {
|
|
74
|
+
const bySpan = new Map();
|
|
75
|
+
for (const m of [a, b]) {
|
|
76
|
+
for (const s of m.spans) {
|
|
77
|
+
const set = bySpan.get(s.spanId) ?? new Set();
|
|
78
|
+
for (const k of s.redactedKeys)
|
|
79
|
+
set.add(k);
|
|
80
|
+
bySpan.set(s.spanId, set);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const spans = [...bySpan]
|
|
84
|
+
.map(([spanId, keys]) => ({ spanId, redactedKeys: [...keys] }))
|
|
85
|
+
.filter((s) => s.redactedKeys.length > 0);
|
|
86
|
+
return { spans, totalRedactions: spans.reduce((n, s) => n + s.redactedKeys.length, 0) };
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=emit-scrub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-scrub.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/emit-scrub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ScrubStage } from './types.js';
|
|
2
|
+
export interface KeyPolicy {
|
|
3
|
+
/** keys whose values are structural and safe to publish raw */
|
|
4
|
+
safe: string[];
|
|
5
|
+
/** keys to delete entirely (never published) */
|
|
6
|
+
drop: string[];
|
|
7
|
+
}
|
|
8
|
+
export type KeyClass = 'safe' | 'content' | 'drop';
|
|
9
|
+
/**
|
|
10
|
+
* Classify an attribute key against the policy. `drop` wins over `safe` (a key
|
|
11
|
+
* matching both is dropped — fail safe). Unmatched keys are `content` and flow
|
|
12
|
+
* to the value-scrubbing stages.
|
|
13
|
+
*/
|
|
14
|
+
export declare function classifyKey(key: string, policy: KeyPolicy): KeyClass;
|
|
15
|
+
/**
|
|
16
|
+
* Structural key-policy stage: deletes `drop` keys outright (recording a
|
|
17
|
+
* redaction) and passes `safe` + `content` keys through unchanged. Value-level
|
|
18
|
+
* scrubbing of `content` keys is handled by later stages.
|
|
19
|
+
*/
|
|
20
|
+
export declare function keyPolicyStage(policy: KeyPolicy): ScrubStage;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const VERSION = '0.1.0';
|
|
2
|
+
/** Exact match, or prefix match when the pattern ends with `*`. */
|
|
3
|
+
function matches(key, pattern) {
|
|
4
|
+
if (pattern.endsWith('*'))
|
|
5
|
+
return key.startsWith(pattern.slice(0, -1));
|
|
6
|
+
return key === pattern;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Classify an attribute key against the policy. `drop` wins over `safe` (a key
|
|
10
|
+
* matching both is dropped — fail safe). Unmatched keys are `content` and flow
|
|
11
|
+
* to the value-scrubbing stages.
|
|
12
|
+
*/
|
|
13
|
+
export function classifyKey(key, policy) {
|
|
14
|
+
if (policy.drop.some((p) => matches(key, p)))
|
|
15
|
+
return 'drop';
|
|
16
|
+
if (policy.safe.some((p) => matches(key, p)))
|
|
17
|
+
return 'safe';
|
|
18
|
+
return 'content';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Structural key-policy stage: deletes `drop` keys outright (recording a
|
|
22
|
+
* redaction) and passes `safe` + `content` keys through unchanged. Value-level
|
|
23
|
+
* scrubbing of `content` keys is handled by later stages.
|
|
24
|
+
*/
|
|
25
|
+
export function keyPolicyStage(policy) {
|
|
26
|
+
return {
|
|
27
|
+
name: 'key-policy',
|
|
28
|
+
version: VERSION,
|
|
29
|
+
scrub(attributes) {
|
|
30
|
+
const out = {};
|
|
31
|
+
const redactions = [];
|
|
32
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
33
|
+
if (classifyKey(key, policy) === 'drop') {
|
|
34
|
+
redactions.push({ key, stage: 'key-policy', kind: 'dropped-key' });
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
out[key] = value;
|
|
38
|
+
}
|
|
39
|
+
return { attributes: out, redactions };
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=key-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-policy.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/key-policy.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,mEAAmE;AACnE,SAAS,OAAO,CAAC,GAAW,EAAE,OAAe;IAC3C,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,OAAO,GAAG,KAAK,OAAO,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,MAAiB;IACxD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5D,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,KAAK,CAAC,UAAsB;YAC1B,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAsB,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtD,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;oBACxC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;oBACnE,SAAS;gBACX,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACnB,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type KeyPolicy } from './key-policy.js';
|
|
2
|
+
import type { ScrubStage } from './types.js';
|
|
3
|
+
/** A PII entity detected in text: a label (PER/ORG/LOC/…) and the matched span text. */
|
|
4
|
+
export interface PiiEntity {
|
|
5
|
+
label: string;
|
|
6
|
+
text: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* ML PII detector seam. The production implementation wraps a Transformers.js
|
|
10
|
+
* token-classification (NER) model; tests inject a deterministic fake. Kept
|
|
11
|
+
* behind an interface so the stage logic is unit-tested without loading a model.
|
|
12
|
+
*/
|
|
13
|
+
export interface PiiDetector {
|
|
14
|
+
detect(text: string): Promise<PiiEntity[]>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* ML PII stage. Runs the injected NER detector over each `content`-classified
|
|
18
|
+
* string value and replaces whole-word occurrences of each detected entity with
|
|
19
|
+
* `[PII:<label>]` (word-boundary matching so substrings aren't corrupted — e.g.
|
|
20
|
+
* detecting "London" leaves "Londoner" intact). `safe` and non-string values
|
|
21
|
+
* pass through untouched. The detector returns matched text rather than offsets
|
|
22
|
+
* because the Transformers.js NER pipeline does not surface character offsets.
|
|
23
|
+
*/
|
|
24
|
+
export declare function mlPiiStage(policy: KeyPolicy, detector: PiiDetector): ScrubStage;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { classifyKey } from './key-policy.js';
|
|
2
|
+
const VERSION = '0.1.0';
|
|
3
|
+
function escapeRegExp(s) {
|
|
4
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* ML PII stage. Runs the injected NER detector over each `content`-classified
|
|
8
|
+
* string value and replaces whole-word occurrences of each detected entity with
|
|
9
|
+
* `[PII:<label>]` (word-boundary matching so substrings aren't corrupted — e.g.
|
|
10
|
+
* detecting "London" leaves "Londoner" intact). `safe` and non-string values
|
|
11
|
+
* pass through untouched. The detector returns matched text rather than offsets
|
|
12
|
+
* because the Transformers.js NER pipeline does not surface character offsets.
|
|
13
|
+
*/
|
|
14
|
+
export function mlPiiStage(policy, detector) {
|
|
15
|
+
return {
|
|
16
|
+
name: 'ml-pii',
|
|
17
|
+
version: VERSION,
|
|
18
|
+
async scrub(attributes) {
|
|
19
|
+
const out = {};
|
|
20
|
+
const redactions = [];
|
|
21
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
22
|
+
if (typeof value !== 'string' || classifyKey(key, policy) !== 'content') {
|
|
23
|
+
out[key] = value;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
let text = value;
|
|
27
|
+
for (const ent of await detector.detect(value)) {
|
|
28
|
+
if (!ent.text)
|
|
29
|
+
continue;
|
|
30
|
+
const re = new RegExp(`\\b${escapeRegExp(ent.text)}\\b`, 'g');
|
|
31
|
+
const replaced = text.replace(re, `[PII:${ent.label}]`);
|
|
32
|
+
if (replaced !== text) {
|
|
33
|
+
redactions.push({ key, stage: 'ml-pii', kind: 'pii', detail: ent.label });
|
|
34
|
+
text = replaced;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
out[key] = text;
|
|
38
|
+
}
|
|
39
|
+
return { attributes: out, redactions };
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=ml-pii-stage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ml-pii-stage.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/ml-pii-stage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,iBAAiB,CAAC;AAkB9D,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,MAAiB,EAAE,QAAqB;IACjE,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,OAAO;QAChB,KAAK,CAAC,KAAK,CAAC,UAAsB;YAChC,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAsB,EAAE,CAAC;YAEzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;oBACxE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBACjB,SAAS;gBACX,CAAC;gBAED,IAAI,IAAI,GAAG,KAAK,CAAC;gBACjB,KAAK,MAAM,GAAG,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/C,IAAI,CAAC,GAAG,CAAC,IAAI;wBAAE,SAAS;oBACxB,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;oBACxD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;wBACtB,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;wBAC1E,IAAI,GAAG,QAAQ,CAAC;oBAClB,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAClB,CAAC;YAED,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OpenRedaction } from 'openredaction';
|
|
2
|
+
import { type KeyPolicy } from './key-policy.js';
|
|
3
|
+
import type { ScrubStage } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Structured-PII stage backed by `openredaction` (570+ curated regex patterns +
|
|
6
|
+
* checksum validation, e.g. Luhn for cards). Runs only on `content`-classified
|
|
7
|
+
* string attributes; `safe` and non-string values pass through untouched. Each
|
|
8
|
+
* detection is replaced inline (openredaction's placeholder substitution) and
|
|
9
|
+
* recorded as a `pii` redaction for the provenance manifest.
|
|
10
|
+
*
|
|
11
|
+
* The detector is constructed once at factory time and reused across spans
|
|
12
|
+
* (pattern compilation is not free).
|
|
13
|
+
*/
|
|
14
|
+
export declare function openredactionStage(policy: KeyPolicy, detector?: OpenRedaction): ScrubStage;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { OpenRedaction } from 'openredaction';
|
|
2
|
+
import { classifyKey } from './key-policy.js';
|
|
3
|
+
const VERSION = '0.1.0';
|
|
4
|
+
/**
|
|
5
|
+
* Structured-PII stage backed by `openredaction` (570+ curated regex patterns +
|
|
6
|
+
* checksum validation, e.g. Luhn for cards). Runs only on `content`-classified
|
|
7
|
+
* string attributes; `safe` and non-string values pass through untouched. Each
|
|
8
|
+
* detection is replaced inline (openredaction's placeholder substitution) and
|
|
9
|
+
* recorded as a `pii` redaction for the provenance manifest.
|
|
10
|
+
*
|
|
11
|
+
* The detector is constructed once at factory time and reused across spans
|
|
12
|
+
* (pattern compilation is not free).
|
|
13
|
+
*/
|
|
14
|
+
export function openredactionStage(policy, detector = new OpenRedaction()) {
|
|
15
|
+
return {
|
|
16
|
+
name: 'openredaction',
|
|
17
|
+
version: VERSION,
|
|
18
|
+
async scrub(attributes) {
|
|
19
|
+
const out = {};
|
|
20
|
+
const redactions = [];
|
|
21
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
22
|
+
if (typeof value !== 'string' || classifyKey(key, policy) !== 'content') {
|
|
23
|
+
out[key] = value;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const result = await detector.detect(value);
|
|
27
|
+
out[key] = result.redacted;
|
|
28
|
+
for (const det of result.detections) {
|
|
29
|
+
redactions.push({ key, stage: 'openredaction', kind: 'pii', detail: det.type });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { attributes: out, redactions };
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=openredaction-stage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openredaction-stage.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/openredaction-stage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAkB,MAAM,iBAAiB,CAAC;AAG9D,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,WAA0B,IAAI,aAAa,EAAE;IAE7C,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;QAChB,KAAK,CAAC,KAAK,CAAC,UAAsB;YAChC,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAsB,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;oBACxE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBACjB,SAAS;gBACX,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5C,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACpC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { PiiDetector } from './ml-pii-stage.js';
|
|
2
|
+
export interface PiiDetectionConfig {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
/** Optional Transformers.js NER model id (defaults to Xenova/bert-base-NER). */
|
|
5
|
+
model?: string;
|
|
6
|
+
}
|
|
7
|
+
/** Thrown by the fail-closed detector on every scrub call when ML PII was enabled but the model never loaded. */
|
|
8
|
+
export declare class MlPiiUnavailableError extends Error {
|
|
9
|
+
constructor(cause: string);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Builds the ML PII detector (Transformers.js NER, in-process) when enabled,
|
|
13
|
+
* warming up the model.
|
|
14
|
+
*
|
|
15
|
+
* Failure altitude is **publish-time, not boot-time** (per
|
|
16
|
+
* `spec/2026-06-15-ts-trajectory-scrub-stack.md`, §"Failure posture": "if any
|
|
17
|
+
* stage errors or the model fails to load, the trajectory is **not**
|
|
18
|
+
* published"). Three cases:
|
|
19
|
+
*
|
|
20
|
+
* - Disabled (the default): returns `undefined` — the scrub pipeline runs the
|
|
21
|
+
* structural key policy + openredaction + secretlint/entropy stages only, with
|
|
22
|
+
* no ML PII tier and no error. Exactly the legacy behaviour.
|
|
23
|
+
* - Enabled and the model loads: returns the real detector.
|
|
24
|
+
* - Enabled but the model fails to load: does NOT throw at construction. Returns
|
|
25
|
+
* a fail-closed detector that hard-throws on every scrub call, so each affected
|
|
26
|
+
* publish aborts (fails closed — never publishes under-redacted/raw) while the
|
|
27
|
+
* rest of the daemon keeps running. A loud one-time boot warning is emitted so
|
|
28
|
+
* the degraded posture is visible in logs; the per-publish throw carries its own
|
|
29
|
+
* clear error so aborted publishes are never silent.
|
|
30
|
+
*/
|
|
31
|
+
export declare function maybeBuildPiiDetector(cfg: PiiDetectionConfig, log?: (msg: string) => void): Promise<PiiDetector | undefined>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { TransformersPiiDetector } from './transformers-detector.js';
|
|
2
|
+
/** Thrown by the fail-closed detector on every scrub call when ML PII was enabled but the model never loaded. */
|
|
3
|
+
export class MlPiiUnavailableError extends Error {
|
|
4
|
+
constructor(cause) {
|
|
5
|
+
super('ML PII detection was enabled but the model failed to load; failing closed — ' +
|
|
6
|
+
`this trajectory is NOT published (disable captures.piiDetection or fix the model to publish): ${cause}`);
|
|
7
|
+
this.name = 'MlPiiUnavailableError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A detector that hard-throws on every `detect()` call. Used when ML PII is
|
|
12
|
+
* enabled but the model failed to load: the failure is narrowed to **publish
|
|
13
|
+
* altitude** — the throw propagates through the ML scrub stage and aborts the
|
|
14
|
+
* one publish in flight (capture publish aborts; task-trajectory ref drops to
|
|
15
|
+
* null), so no raw trajectory is ever published. The daemon's other loops
|
|
16
|
+
* (earning, claim, engine, balance-topup) are unaffected because the failure
|
|
17
|
+
* is no longer raised at construction/boot.
|
|
18
|
+
*/
|
|
19
|
+
function failClosedDetector(cause) {
|
|
20
|
+
return {
|
|
21
|
+
detect() {
|
|
22
|
+
return Promise.reject(new MlPiiUnavailableError(cause));
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Builds the ML PII detector (Transformers.js NER, in-process) when enabled,
|
|
28
|
+
* warming up the model.
|
|
29
|
+
*
|
|
30
|
+
* Failure altitude is **publish-time, not boot-time** (per
|
|
31
|
+
* `spec/2026-06-15-ts-trajectory-scrub-stack.md`, §"Failure posture": "if any
|
|
32
|
+
* stage errors or the model fails to load, the trajectory is **not**
|
|
33
|
+
* published"). Three cases:
|
|
34
|
+
*
|
|
35
|
+
* - Disabled (the default): returns `undefined` — the scrub pipeline runs the
|
|
36
|
+
* structural key policy + openredaction + secretlint/entropy stages only, with
|
|
37
|
+
* no ML PII tier and no error. Exactly the legacy behaviour.
|
|
38
|
+
* - Enabled and the model loads: returns the real detector.
|
|
39
|
+
* - Enabled but the model fails to load: does NOT throw at construction. Returns
|
|
40
|
+
* a fail-closed detector that hard-throws on every scrub call, so each affected
|
|
41
|
+
* publish aborts (fails closed — never publishes under-redacted/raw) while the
|
|
42
|
+
* rest of the daemon keeps running. A loud one-time boot warning is emitted so
|
|
43
|
+
* the degraded posture is visible in logs; the per-publish throw carries its own
|
|
44
|
+
* clear error so aborted publishes are never silent.
|
|
45
|
+
*/
|
|
46
|
+
export async function maybeBuildPiiDetector(cfg, log = (m) => console.warn(m)) {
|
|
47
|
+
if (!cfg.enabled)
|
|
48
|
+
return undefined;
|
|
49
|
+
try {
|
|
50
|
+
const detector = new TransformersPiiDetector(cfg.model ? { model: cfg.model } : {});
|
|
51
|
+
await detector.init();
|
|
52
|
+
log('[scrub] ML PII detection (Transformers.js NER) enabled.');
|
|
53
|
+
return detector;
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
57
|
+
log('[scrub] WARNING: ML PII detection is enabled but the model failed to load. ' +
|
|
58
|
+
'Failing closed at publish altitude: trajectory/capture publishing will ABORT ' +
|
|
59
|
+
'(no raw trajectories are published) until this is resolved or captures.piiDetection ' +
|
|
60
|
+
`is disabled. The daemon's other loops continue running. Cause: ${message}`);
|
|
61
|
+
return failClosedDetector(message);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=pii-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pii-build.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/pii-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AASrE,iHAAiH;AACjH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,KAAa;QACvB,KAAK,CACH,8EAA8E;YAC5E,iGAAiG,KAAK,EAAE,CAC3G,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CAAC,KAAa;IACvC,OAAO;QACL,MAAM;YACJ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAuB,EACvB,MAA6B,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnD,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpF,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,GAAG,CAAC,yDAAyD,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,GAAG,CACD,6EAA6E;YAC3E,+EAA+E;YAC/E,sFAAsF;YACtF,kEAAkE,OAAO,EAAE,CAC9E,CAAC;QACF,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Attributes, ScrubResult, ScrubStage } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Runs scrub stages in order over a span's attributes: each stage's output
|
|
4
|
+
* attributes feed the next, and redaction records accumulate across the whole
|
|
5
|
+
* chain. Stages may be async (e.g. the ML PII stage). The `components` list
|
|
6
|
+
* (stage name + pinned version) is what the signed provenance manifest records.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ScrubPipeline {
|
|
9
|
+
private readonly stages;
|
|
10
|
+
constructor(stages: ScrubStage[]);
|
|
11
|
+
get components(): Array<{
|
|
12
|
+
name: string;
|
|
13
|
+
version: string;
|
|
14
|
+
}>;
|
|
15
|
+
run(attributes: Attributes): Promise<ScrubResult>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs scrub stages in order over a span's attributes: each stage's output
|
|
3
|
+
* attributes feed the next, and redaction records accumulate across the whole
|
|
4
|
+
* chain. Stages may be async (e.g. the ML PII stage). The `components` list
|
|
5
|
+
* (stage name + pinned version) is what the signed provenance manifest records.
|
|
6
|
+
*/
|
|
7
|
+
export class ScrubPipeline {
|
|
8
|
+
stages;
|
|
9
|
+
constructor(stages) {
|
|
10
|
+
this.stages = stages;
|
|
11
|
+
}
|
|
12
|
+
get components() {
|
|
13
|
+
return this.stages.map((s) => ({ name: s.name, version: s.version }));
|
|
14
|
+
}
|
|
15
|
+
async run(attributes) {
|
|
16
|
+
let current = attributes;
|
|
17
|
+
const redactions = [];
|
|
18
|
+
for (const stage of this.stages) {
|
|
19
|
+
const result = await stage.scrub(current);
|
|
20
|
+
current = result.attributes;
|
|
21
|
+
redactions.push(...result.redactions);
|
|
22
|
+
}
|
|
23
|
+
return { attributes: current, redactions };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/pipeline.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAErD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,UAAsB;QAC9B,IAAI,OAAO,GAAG,UAAU,CAAC;QACzB,MAAM,UAAU,GAAsB,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAC7C,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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, GitHub, Slack, GCP, npm, …) —
|
|
6
|
+
* each match replaced inline with `[SECRET:<rule>]`.
|
|
7
|
+
* 2. a conservative Shannon-entropy + secret-shape fallback that catches
|
|
8
|
+
* near-random tokens no specific rule matched (≥ 20 chars by entropy alone,
|
|
9
|
+
* or 16–19 chars when the token is a single high-density secret-charset run
|
|
10
|
+
* mixing multiple character classes), replaced with `[SECRET:high-entropy]`.
|
|
11
|
+
* `safe` and non-string values pass through untouched.
|
|
12
|
+
*/
|
|
13
|
+
export declare function secretlintStage(policy: KeyPolicy): ScrubStage;
|