@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,269 @@
|
|
|
1
|
+
import { OpenRedaction } from 'openredaction';
|
|
2
|
+
import { classifyKey } from './key-policy.js';
|
|
3
|
+
const VERSION = '0.4.0'; // 0.4.0: #1391 full-corpus denylist extensions (42-seed characterisation)
|
|
4
|
+
/**
|
|
5
|
+
* Patterns excluded from the default detector (#1331). All three ship with a
|
|
6
|
+
* bare-word regex (`\b[a-zA-Z0-9._]{3,30}\b` or equivalent) that matches
|
|
7
|
+
* nearly every token of ordinary technical prose — "Update the staging
|
|
8
|
+
* bucket config" came back as `[IG_USER_…] the staging [IG_USER_…]
|
|
9
|
+
* [IG_USER_…]`, destroying the readability and distillation value of every
|
|
10
|
+
* published trajectory. A social handle has no shape of its own outside its
|
|
11
|
+
* platform context, so dropping these loses no genuine coverage: emails,
|
|
12
|
+
* keys, cards, SSNs, phones etc. all keep their dedicated patterns (pinned
|
|
13
|
+
* by test/trajectory/scrub/openredaction-tuning.test.ts and the
|
|
14
|
+
* harness-layer seeded-secrets fixture).
|
|
15
|
+
*
|
|
16
|
+
* `NAME` is denylisted for the same reason with an acknowledged trade-off:
|
|
17
|
+
* its follower branch accepts lowercase words (`[A-Z][a-z…]+ (\s+[a-z…]+){1,3}`),
|
|
18
|
+
* so ANY sentence-initial capitalised word plus 1–3 words matches — "Fix the
|
|
19
|
+
* failing test" is a "name" to it, which mangles the first sentence of
|
|
20
|
+
* essentially every task summary. Person-name detection is the ML PII
|
|
21
|
+
* stage's job (GLiNER, `mlPiiStage`), which the daemon wires when the model
|
|
22
|
+
* is available; a bare unlabelled name in prose is not regex-detectable at
|
|
23
|
+
* acceptable precision.
|
|
24
|
+
*
|
|
25
|
+
* `LAB_TEST_ID` and `EXAM_ID` are denylisted for the same reason (#1348):
|
|
26
|
+
* both trigger on ubiquitous software words (`\b(?:LAB|TEST|SAMPLE)…` and
|
|
27
|
+
* `\b(?:EXAM|TEST|QUIZ|ASSESSMENT)…`, case-insensitive, same bare
|
|
28
|
+
* `[A-Z0-9]{6,12}` tail) — "test-driven-development" came back as
|
|
29
|
+
* `test-[LAB_8465]-development` — and lab-specimen / exam IDs are not
|
|
30
|
+
* plausible in agent-trajectory content. Nothing in the seeded-secrets
|
|
31
|
+
* fixture pins either pattern.
|
|
32
|
+
*
|
|
33
|
+
* #1391 additions (full 42-seed characterisation) — bare-SHAPE patterns
|
|
34
|
+
* whose regex matches ordinary technical tokens with no trigger word at all:
|
|
35
|
+
*
|
|
36
|
+
* - `ZIP_CODE_US` — `\b\d{5}(…)?\b`: ANY 5-digit number. Fired on GitHub
|
|
37
|
+
* issue numbers ("#26251", "#41417"), millisecond values ("60000"), quota
|
|
38
|
+
* figures ("25000"), Lark error codes ("41050"). A bare 5-digit number in
|
|
39
|
+
* trajectory content is overwhelmingly a count, id, or port, not a home
|
|
40
|
+
* address component; street-level address detection is the ML PII stage's
|
|
41
|
+
* job, where the surrounding words disambiguate.
|
|
42
|
+
* - `POSTCODE_UK` — matches hex colour literals ("#FF00FF" → `[POSTCODE]`).
|
|
43
|
+
* Same rationale: a bare alphanumeric cluster is not a location without
|
|
44
|
+
* context, which the ML PII stage has and this regex does not.
|
|
45
|
+
* - `SWIFT_BIC` — `\b[A-Z]{6}[A-Z0-9]{2}([A-Z0-9]{3})?\b`: ANY 8- or 11-char
|
|
46
|
+
* uppercase word ("REQUIRED", from an HTTP header name). BIC codes are
|
|
47
|
+
* public bank identifiers, not secrets, and the shape is indistinguishable
|
|
48
|
+
* from an all-caps word.
|
|
49
|
+
* - `TIKTOK_USERNAME` / `SOCIAL_MEDIA_HANDLE` — the #1331 social-handle
|
|
50
|
+
* family: `@`-prefixed bare words. Fired on npm scoped packages
|
|
51
|
+
* ("@n8n/n8n-nodes-langchain…", "@github/copilot-sdk"), which are
|
|
52
|
+
* ubiquitous in technical prose.
|
|
53
|
+
*/
|
|
54
|
+
export const BARE_WORD_PATTERN_DENYLIST = [
|
|
55
|
+
'INSTAGRAM_USERNAME',
|
|
56
|
+
'XBOX_GAMERTAG',
|
|
57
|
+
'PSN_ID',
|
|
58
|
+
'NAME',
|
|
59
|
+
'LAB_TEST_ID',
|
|
60
|
+
'EXAM_ID',
|
|
61
|
+
// #1391:
|
|
62
|
+
'ZIP_CODE_US',
|
|
63
|
+
'POSTCODE_UK',
|
|
64
|
+
'SWIFT_BIC',
|
|
65
|
+
'TIKTOK_USERNAME',
|
|
66
|
+
'SOCIAL_MEDIA_HANDLE',
|
|
67
|
+
];
|
|
68
|
+
/**
|
|
69
|
+
* Trigger-word patterns excluded for #1372 (kept as a separate block from the
|
|
70
|
+
* bare-word denylist above so parallel denylist additions merge cleanly).
|
|
71
|
+
*
|
|
72
|
+
* These share one pathology: an ordinary English trigger word (`TO`,
|
|
73
|
+
* `APPROVAL`, `PROJECT`, `ORDER`, `REVIEW`, `PASS`, `LOT`, `SO`, `REG`, `WO`,
|
|
74
|
+
* `MISSING`, `RETURN`, `user`, `prod`, `ice`…), case-insensitive, followed by
|
|
75
|
+
* a bare `[A-Z0-9]{n,m}` tail with no intrinsic shape. On the published seed
|
|
76
|
+
* skills' SKILL.md prose every one of them fired — all 42 seed bodies were
|
|
77
|
+
* defaced ("project context" → `project [PROJECT_3875]`, "get your approval
|
|
78
|
+
* before" → `approval [AUTH_5211]`), several mid-word ("something" →
|
|
79
|
+
* `so[SO_1826]`, "workflow" → `wo[WO_3602]`, "regressions" →
|
|
80
|
+
* `[REG]ressions`). Observed trigger words per pattern, from the #1372
|
|
81
|
+
* characterisation over five real seed bodies:
|
|
82
|
+
*
|
|
83
|
+
* - `USERNAME` — "user intent", "user has"; a bare word after "user"/"login"
|
|
84
|
+
* is not a credential. Credentials keep their shaped patterns; person
|
|
85
|
+
* names are the ML PII stage's job (see the `NAME` note above).
|
|
86
|
+
* - `PROJECT_CODE` — "project context", "project goes through".
|
|
87
|
+
* - `CARD_AUTH_CODE` — "approval before" (card auth codes travel with card
|
|
88
|
+
* numbers, which `CREDIT_CARD` still catches).
|
|
89
|
+
* - `IATA_AIRPORT_CODE` — "to use" ("TO" + any 3 capitalisable letters).
|
|
90
|
+
* - `JUDGMENT_NUMBER` — "order should".
|
|
91
|
+
* - `STANDING_ORDER_REF` — "SO" matches inside "something"/"solution".
|
|
92
|
+
* - `PRODUCTION_ID` — "production classes"; nested self-replacement
|
|
93
|
+
* corrupted "NO PRODUCTION CODE" into `PROD[PROD[PROD…`.
|
|
94
|
+
* - `WORK_ORDER_NUMBER` — "wo" matches inside "workflow"/"worktree".
|
|
95
|
+
* - `PERFORMANCE_REVIEW_ID` — "performance problems", "evaluation between".
|
|
96
|
+
* - `TNT_TRACKING` — every clause optional except the tail, so ANY 9- or
|
|
97
|
+
* 13-character word matches ("variation", "statement").
|
|
98
|
+
* - `THEME_PARK_TICKET` — "pass immediately".
|
|
99
|
+
* - `TOURNAMENT_REGISTRATION_ID` — "REG" matches inside "regressions".
|
|
100
|
+
* - `MISSING_PERSON_CASE` — "missing requirements".
|
|
101
|
+
* - `RMA_NUMBER` — "return expected".
|
|
102
|
+
* - `BATCH_LOT_NUMBER` — "a lot faster".
|
|
103
|
+
* - `EMERGENCY_CONTACT` — "ice" (unanchored, matches inside "practice")
|
|
104
|
+
* followed by any 2–4 words.
|
|
105
|
+
*
|
|
106
|
+
* Lab-grade coverage loss is acceptable: these label niche reference numbers
|
|
107
|
+
* (parcel tracking, theme-park tickets, tournament brackets, standing
|
|
108
|
+
* orders, RMAs…) that are implausible in agent-trajectory content and carry
|
|
109
|
+
* no shape of their own beyond the trigger word. Genuinely secret-shaped
|
|
110
|
+
* content keeps its dedicated patterns (emails, cards, SSNs, API keys —
|
|
111
|
+
* pinned below and by the harness-layer seeded-secrets fixture), and the
|
|
112
|
+
* secretlint + plain-patterns stages still run behind this one.
|
|
113
|
+
*
|
|
114
|
+
* #1391 additions — the #1372 characterisation ran 5 sample bodies; the
|
|
115
|
+
* full-42-seed sweep surfaced the longer tail below (same pathology, same
|
|
116
|
+
* fix, observed trigger words in parentheses). One aggravator worth naming:
|
|
117
|
+
* openredaction substitutes a detection's captured VALUE case-insensitively
|
|
118
|
+
* across the whole document, so a single trigger FP defaces every other
|
|
119
|
+
* occurrence of that value. Every seed's frontmatter contains
|
|
120
|
+
* `license: MIT` — LICENSE_PLATE captures `MIT`, and every "limit(s)" /
|
|
121
|
+
* "submit" in the body came back as `li[PLATE_2299]s` / `Sub[PLATE_2299]`.
|
|
122
|
+
*
|
|
123
|
+
* - `LICENSE_PLATE` — "license: MIT" (frontmatter, all 42 seeds); `REG`
|
|
124
|
+
* trigger mid-word ("registers" → `[PLATE]isters`).
|
|
125
|
+
* - `US_LICENSE_PLATE` / `INTERNATIONAL_LICENSE_PLATE` — same trigger family
|
|
126
|
+
* (`PLATE|LICENSE|TAG|REGISTRATION`): "tag-driven", "tagged as data".
|
|
127
|
+
* - `EDITORIAL_TICKET` — "edit existing", "edit endpoints" (`EDIT` trigger).
|
|
128
|
+
* - `TRANSACTION_ID` — `TRANS` trigger mid-word: "transformations" →
|
|
129
|
+
* `[TXN]formations`.
|
|
130
|
+
* - `AIRLINE_BOOKING_REFERENCE` — "reference images", "reference videos",
|
|
131
|
+
* "node reference syntax" (`REFERENCE` trigger).
|
|
132
|
+
* - `SOURCE_ID` — "source images", "source directory", "multi-source
|
|
133
|
+
* aggregation".
|
|
134
|
+
* - `SERVICE_REQUEST_NUMBER` — "service discovery", "app-service assessment".
|
|
135
|
+
* - `TERMINAL_ID` — "terminal status"; `POS` trigger mid-word: "false
|
|
136
|
+
* positives", "PostToolUse".
|
|
137
|
+
* - `EXIT_INTERVIEW_ID` — "termination criterion/oracle", "separation
|
|
138
|
+
* exists" (`EXIT|TERMINATION|SEPARATION` triggers).
|
|
139
|
+
* - `HOTEL_LOYALTY_NUMBER` — "member-remove" (wiki commands), "rewards
|
|
140
|
+
* padding" (`MEMBER|LOYALTY|REWARDS` triggers).
|
|
141
|
+
* - `SEARCH_RESCUE_MISSION_ID` — "search operations", "web/search results"
|
|
142
|
+
* (`SEARCH|RESCUE|MISSION` triggers).
|
|
143
|
+
* - `APPLICATION_ID` / `JOB_APPLICATION_ID` — "application gateway",
|
|
144
|
+
* "candidate contradicts", "candidate regions" (`APPLICATION|CANDIDATE|
|
|
145
|
+
* APPLICANT` triggers).
|
|
146
|
+
* - `ARTICLE_ID` — "user story should", "user-story-example" (`STORY`
|
|
147
|
+
* trigger).
|
|
148
|
+
* - `EMERGENCY_CALL_REF` — "incident investigation" (`INCIDENT` trigger).
|
|
149
|
+
* - `CAMPAIGN_CODE` — "brand campaigns", "brand campaign jingle".
|
|
150
|
+
* - `INSTALLATION_REF` — "brew install imagemagick", "apt-get install".
|
|
151
|
+
* - `PRODUCT_SKU` — "SKU changes", "SKU upgrades" (Azure sizing prose).
|
|
152
|
+
* - `BAR_NUMBER` — "raises the bar because" (`BAR` trigger).
|
|
153
|
+
* - `PREMIUM_PAYMENT_REF` — "premium commercial cuts", "premium brand".
|
|
154
|
+
* - `HOUSING_ASSIGNMENT` — "ambient room tone" (`ROOM` trigger).
|
|
155
|
+
* - `MANUSCRIPT_ID` — `MS` trigger: "0.8 ms overhead" → `[MANUSCRIPT]`.
|
|
156
|
+
* - `STATEMENT_REF` — "return statement exists".
|
|
157
|
+
* - `QUOTE_REFERENCE` — "quote shortest decisive line".
|
|
158
|
+
* - `RESUME_ID` — "Resume caveman after" (`RESUME|CV` triggers).
|
|
159
|
+
* - `PAYMENT_REFERENCE` — `PAY` trigger mid-word: "paymentGateway" →
|
|
160
|
+
* `pay[PAY_REF]`.
|
|
161
|
+
* - `ROUTING_NUMBER_MFG` — "routing convention".
|
|
162
|
+
* - `MICROSOFT_CERTIFICATION` — "Microsoft documentation" (`MICROSOFT|MS`
|
|
163
|
+
* triggers).
|
|
164
|
+
*
|
|
165
|
+
* Revealed at fixpoint (iteration 2 — patterns previously shadowed by a
|
|
166
|
+
* higher-priority pattern that the first pass denylisted):
|
|
167
|
+
* - `INCIDENT_REPORT_NUMBER` — "Incident Investigation" (`INCIDENT` trigger,
|
|
168
|
+
* surfaced once EMERGENCY_CALL_REF was gone).
|
|
169
|
+
* - `ENROLLMENT_NUMBER` — "registration succeeds" (`REGISTRATION` trigger).
|
|
170
|
+
* - `HOTEL_RESERVATION` — "Capacity Reservation Groups" (`RESERVATION`
|
|
171
|
+
* trigger, surfaced once AIRLINE_BOOKING_REFERENCE was gone).
|
|
172
|
+
*/
|
|
173
|
+
export const PROSE_TRIGGER_PATTERN_DENYLIST = [
|
|
174
|
+
'USERNAME',
|
|
175
|
+
'PROJECT_CODE',
|
|
176
|
+
'CARD_AUTH_CODE',
|
|
177
|
+
'IATA_AIRPORT_CODE',
|
|
178
|
+
'JUDGMENT_NUMBER',
|
|
179
|
+
'STANDING_ORDER_REF',
|
|
180
|
+
'PRODUCTION_ID',
|
|
181
|
+
'WORK_ORDER_NUMBER',
|
|
182
|
+
'PERFORMANCE_REVIEW_ID',
|
|
183
|
+
'TNT_TRACKING',
|
|
184
|
+
'THEME_PARK_TICKET',
|
|
185
|
+
'TOURNAMENT_REGISTRATION_ID',
|
|
186
|
+
'MISSING_PERSON_CASE',
|
|
187
|
+
'RMA_NUMBER',
|
|
188
|
+
'BATCH_LOT_NUMBER',
|
|
189
|
+
'EMERGENCY_CONTACT',
|
|
190
|
+
// #1391:
|
|
191
|
+
'LICENSE_PLATE',
|
|
192
|
+
'US_LICENSE_PLATE',
|
|
193
|
+
'INTERNATIONAL_LICENSE_PLATE',
|
|
194
|
+
'EDITORIAL_TICKET',
|
|
195
|
+
'TRANSACTION_ID',
|
|
196
|
+
'AIRLINE_BOOKING_REFERENCE',
|
|
197
|
+
'SOURCE_ID',
|
|
198
|
+
'SERVICE_REQUEST_NUMBER',
|
|
199
|
+
'TERMINAL_ID',
|
|
200
|
+
'EXIT_INTERVIEW_ID',
|
|
201
|
+
'HOTEL_LOYALTY_NUMBER',
|
|
202
|
+
'SEARCH_RESCUE_MISSION_ID',
|
|
203
|
+
'APPLICATION_ID',
|
|
204
|
+
'JOB_APPLICATION_ID',
|
|
205
|
+
'ARTICLE_ID',
|
|
206
|
+
'EMERGENCY_CALL_REF',
|
|
207
|
+
'CAMPAIGN_CODE',
|
|
208
|
+
'INSTALLATION_REF',
|
|
209
|
+
'PRODUCT_SKU',
|
|
210
|
+
'BAR_NUMBER',
|
|
211
|
+
'PREMIUM_PAYMENT_REF',
|
|
212
|
+
'HOUSING_ASSIGNMENT',
|
|
213
|
+
'MANUSCRIPT_ID',
|
|
214
|
+
'STATEMENT_REF',
|
|
215
|
+
'QUOTE_REFERENCE',
|
|
216
|
+
'RESUME_ID',
|
|
217
|
+
'PAYMENT_REFERENCE',
|
|
218
|
+
'ROUTING_NUMBER_MFG',
|
|
219
|
+
'MICROSOFT_CERTIFICATION',
|
|
220
|
+
// #1391 fixpoint iteration 2:
|
|
221
|
+
'INCIDENT_REPORT_NUMBER',
|
|
222
|
+
'ENROLLMENT_NUMBER',
|
|
223
|
+
'HOTEL_RESERVATION',
|
|
224
|
+
];
|
|
225
|
+
/**
|
|
226
|
+
* Default detector: openredaction's full pattern set minus the audited
|
|
227
|
+
* bare-word matchers. Built via the `patterns` whitelist option (the
|
|
228
|
+
* library has no exclude option), so a version bump that renames patterns
|
|
229
|
+
* fails loudly in the tuning tests rather than silently re-enabling junk.
|
|
230
|
+
*/
|
|
231
|
+
export function buildDefaultDetector() {
|
|
232
|
+
const allTypes = [...new Set(new OpenRedaction().getPatterns().map((p) => p.type))];
|
|
233
|
+
return new OpenRedaction({
|
|
234
|
+
patterns: allTypes.filter((t) => !BARE_WORD_PATTERN_DENYLIST.includes(t) && !PROSE_TRIGGER_PATTERN_DENYLIST.includes(t)),
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Structured-PII stage backed by `openredaction` (570+ curated regex patterns +
|
|
239
|
+
* checksum validation, e.g. Luhn for cards). Runs only on `content`-classified
|
|
240
|
+
* string attributes; `safe` and non-string values pass through untouched. Each
|
|
241
|
+
* detection is replaced inline (openredaction's placeholder substitution) and
|
|
242
|
+
* recorded as a `pii` redaction for the provenance manifest.
|
|
243
|
+
*
|
|
244
|
+
* The detector is constructed once at factory time and reused across spans
|
|
245
|
+
* (pattern compilation is not free).
|
|
246
|
+
*/
|
|
247
|
+
export function openredactionStage(policy, detector = buildDefaultDetector()) {
|
|
248
|
+
return {
|
|
249
|
+
name: 'openredaction',
|
|
250
|
+
version: VERSION,
|
|
251
|
+
async scrub(attributes) {
|
|
252
|
+
const out = {};
|
|
253
|
+
const redactions = [];
|
|
254
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
255
|
+
if (typeof value !== 'string' || classifyKey(key, policy) !== 'content') {
|
|
256
|
+
out[key] = value;
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
const result = await detector.detect(value);
|
|
260
|
+
out[key] = result.redacted;
|
|
261
|
+
for (const det of result.detections) {
|
|
262
|
+
redactions.push({ key, stage: 'openredaction', kind: 'pii', detail: det.type });
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return { attributes: out, redactions };
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
//# 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":"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"}
|
|
@@ -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,37 @@
|
|
|
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
|
+
* Nested values (#1378): the stages themselves operate on flat string values —
|
|
9
|
+
* a non-string attribute value (e.g. `tool.args` captured as an object) used
|
|
10
|
+
* to pass through every stage untouched and publish verbatim, leaking the
|
|
11
|
+
* exact strings the same pipeline redacted out of `tool.result`. `run()` now
|
|
12
|
+
* walks surviving object/array values after the flat pass and scrubs every
|
|
13
|
+
* string leaf through the same stage chain, keyed by the TOP-LEVEL attribute
|
|
14
|
+
* key so the key policy classifies leaves exactly like the flat value
|
|
15
|
+
* (`jinn.*` structural attributes stay raw; `drop` keys are already gone
|
|
16
|
+
* before the walk). Redactions from leaf runs carry the top-level key, so the
|
|
17
|
+
* redaction manifest and capture redaction diff report `tool.args` as the
|
|
18
|
+
* touched field.
|
|
19
|
+
*/
|
|
20
|
+
export declare class ScrubPipeline {
|
|
21
|
+
private readonly stages;
|
|
22
|
+
constructor(stages: ScrubStage[]);
|
|
23
|
+
get components(): Array<{
|
|
24
|
+
name: string;
|
|
25
|
+
version: string;
|
|
26
|
+
}>;
|
|
27
|
+
run(attributes: Attributes): Promise<ScrubResult>;
|
|
28
|
+
/** One pass of every stage over a flat attribute bag (the original `run`). */
|
|
29
|
+
private runStages;
|
|
30
|
+
/**
|
|
31
|
+
* Recursively scrub the string leaves of a nested attribute value through
|
|
32
|
+
* the full stage chain, using the top-level attribute key for policy
|
|
33
|
+
* classification. Non-container, non-string values (numbers, booleans,
|
|
34
|
+
* null) and non-plain objects pass through unchanged.
|
|
35
|
+
*/
|
|
36
|
+
private scrubNested;
|
|
37
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
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
|
+
* Nested values (#1378): the stages themselves operate on flat string values —
|
|
8
|
+
* a non-string attribute value (e.g. `tool.args` captured as an object) used
|
|
9
|
+
* to pass through every stage untouched and publish verbatim, leaking the
|
|
10
|
+
* exact strings the same pipeline redacted out of `tool.result`. `run()` now
|
|
11
|
+
* walks surviving object/array values after the flat pass and scrubs every
|
|
12
|
+
* string leaf through the same stage chain, keyed by the TOP-LEVEL attribute
|
|
13
|
+
* key so the key policy classifies leaves exactly like the flat value
|
|
14
|
+
* (`jinn.*` structural attributes stay raw; `drop` keys are already gone
|
|
15
|
+
* before the walk). Redactions from leaf runs carry the top-level key, so the
|
|
16
|
+
* redaction manifest and capture redaction diff report `tool.args` as the
|
|
17
|
+
* touched field.
|
|
18
|
+
*/
|
|
19
|
+
export class ScrubPipeline {
|
|
20
|
+
stages;
|
|
21
|
+
constructor(stages) {
|
|
22
|
+
this.stages = stages;
|
|
23
|
+
}
|
|
24
|
+
get components() {
|
|
25
|
+
return this.stages.map((s) => ({ name: s.name, version: s.version }));
|
|
26
|
+
}
|
|
27
|
+
async run(attributes) {
|
|
28
|
+
const flat = await this.runStages(attributes);
|
|
29
|
+
const out = {};
|
|
30
|
+
const redactions = [...flat.redactions];
|
|
31
|
+
for (const [key, value] of Object.entries(flat.attributes)) {
|
|
32
|
+
// Flat strings were scrubbed by the pass above; only container values
|
|
33
|
+
// (objects/arrays) still hold unscrubbed string leaves.
|
|
34
|
+
out[key] = typeof value === 'string' ? value : await this.scrubNested(key, value, redactions);
|
|
35
|
+
}
|
|
36
|
+
return { attributes: out, redactions };
|
|
37
|
+
}
|
|
38
|
+
/** One pass of every stage over a flat attribute bag (the original `run`). */
|
|
39
|
+
async runStages(attributes) {
|
|
40
|
+
let current = attributes;
|
|
41
|
+
const redactions = [];
|
|
42
|
+
for (const stage of this.stages) {
|
|
43
|
+
const result = await stage.scrub(current);
|
|
44
|
+
current = result.attributes;
|
|
45
|
+
redactions.push(...result.redactions);
|
|
46
|
+
}
|
|
47
|
+
return { attributes: current, redactions };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Recursively scrub the string leaves of a nested attribute value through
|
|
51
|
+
* the full stage chain, using the top-level attribute key for policy
|
|
52
|
+
* classification. Non-container, non-string values (numbers, booleans,
|
|
53
|
+
* null) and non-plain objects pass through unchanged.
|
|
54
|
+
*/
|
|
55
|
+
async scrubNested(key, value, redactions) {
|
|
56
|
+
if (typeof value === 'string') {
|
|
57
|
+
const result = await this.runStages({ [key]: value });
|
|
58
|
+
redactions.push(...result.redactions);
|
|
59
|
+
const scrubbed = result.attributes[key];
|
|
60
|
+
// Stages only rewrite strings; a `drop`-classified key never reaches
|
|
61
|
+
// here (dropped in the flat pass), so non-string means untouched.
|
|
62
|
+
return typeof scrubbed === 'string' ? scrubbed : value;
|
|
63
|
+
}
|
|
64
|
+
if (Array.isArray(value)) {
|
|
65
|
+
const items = [];
|
|
66
|
+
for (const item of value)
|
|
67
|
+
items.push(await this.scrubNested(key, item, redactions));
|
|
68
|
+
return items;
|
|
69
|
+
}
|
|
70
|
+
if (value !== null && typeof value === 'object') {
|
|
71
|
+
const proto = Object.getPrototypeOf(value);
|
|
72
|
+
if (proto !== Object.prototype && proto !== null)
|
|
73
|
+
return value; // non-plain: pass through
|
|
74
|
+
const entries = {};
|
|
75
|
+
for (const [k, v] of Object.entries(value)) {
|
|
76
|
+
entries[k] = await this.scrubNested(key, v, redactions);
|
|
77
|
+
}
|
|
78
|
+
return entries;
|
|
79
|
+
}
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* plain-patterns stage — deterministic regex redaction for two shapes the
|
|
3
|
+
* probabilistic stages demonstrably miss (issue #1330, found while building
|
|
4
|
+
* the harness-layer capture path in #1310):
|
|
5
|
+
*
|
|
6
|
+
* - plain email addresses: openredaction's EMAIL pattern is unreliable
|
|
7
|
+
* (misses e.g. `jane.doe@example-corp.com`);
|
|
8
|
+
* - POSIX home-directory paths carrying a username
|
|
9
|
+
* (`/Users/<name>/…`, `/home/<name>/…`) — nothing else touches paths.
|
|
10
|
+
*
|
|
11
|
+
* Graduated here from the harness-layer's capture-local stages so the daemon
|
|
12
|
+
* capture publish path and the harness layer share ONE implementation.
|
|
13
|
+
* Deliberately broad: over-redacting an email or a username is cheap; leaking
|
|
14
|
+
* one is not.
|
|
15
|
+
*
|
|
16
|
+
* An opt-in third set (`credentialIds`, #1415) adds deterministic cloud
|
|
17
|
+
* credential-ID prefixes for the seed profile, which runs without the entropy
|
|
18
|
+
* fallback that covers these shapes in the trace profile.
|
|
19
|
+
*/
|
|
20
|
+
import { type KeyPolicy } from './key-policy.js';
|
|
21
|
+
import type { ScrubStage } from './types.js';
|
|
22
|
+
export interface PlainPatternsOptions {
|
|
23
|
+
/**
|
|
24
|
+
* Adds the deterministic credential-ID prefixes above (#1415). Default false:
|
|
25
|
+
* the trace profile already catches these via secretlint's entropy fallback
|
|
26
|
+
* and must stay byte-identical. The seed profile (which runs without the
|
|
27
|
+
* fallback) turns this on.
|
|
28
|
+
*/
|
|
29
|
+
credentialIds?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export declare function plainPatternsStage(policy: KeyPolicy, opts?: PlainPatternsOptions): ScrubStage;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* plain-patterns stage — deterministic regex redaction for two shapes the
|
|
3
|
+
* probabilistic stages demonstrably miss (issue #1330, found while building
|
|
4
|
+
* the harness-layer capture path in #1310):
|
|
5
|
+
*
|
|
6
|
+
* - plain email addresses: openredaction's EMAIL pattern is unreliable
|
|
7
|
+
* (misses e.g. `jane.doe@example-corp.com`);
|
|
8
|
+
* - POSIX home-directory paths carrying a username
|
|
9
|
+
* (`/Users/<name>/…`, `/home/<name>/…`) — nothing else touches paths.
|
|
10
|
+
*
|
|
11
|
+
* Graduated here from the harness-layer's capture-local stages so the daemon
|
|
12
|
+
* capture publish path and the harness layer share ONE implementation.
|
|
13
|
+
* Deliberately broad: over-redacting an email or a username is cheap; leaking
|
|
14
|
+
* one is not.
|
|
15
|
+
*
|
|
16
|
+
* An opt-in third set (`credentialIds`, #1415) adds deterministic cloud
|
|
17
|
+
* credential-ID prefixes for the seed profile, which runs without the entropy
|
|
18
|
+
* fallback that covers these shapes in the trace profile.
|
|
19
|
+
*/
|
|
20
|
+
import { classifyKey } from './key-policy.js';
|
|
21
|
+
const VERSION = '0.1.0';
|
|
22
|
+
/** Plain email shape. */
|
|
23
|
+
const EMAIL_PATTERN = /[A-Za-z0-9._%+-]+@[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])+)+/g;
|
|
24
|
+
/** POSIX home-dir path segment carrying a username. */
|
|
25
|
+
const HOME_PATH_PATTERN = /\/(?:Users|home)\/[^/\s"'`]+/g;
|
|
26
|
+
const PATTERNS = [
|
|
27
|
+
{ pattern: EMAIL_PATTERN, replacement: '[EMAIL]', detail: 'email', kind: 'pii' },
|
|
28
|
+
{ pattern: HOME_PATH_PATTERN, replacement: '/users/anon', detail: 'home-path', kind: 'pii' },
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Bare AWS access-key ID — the fixed four-char prefixes + 16 key chars that
|
|
32
|
+
* secretlint's aws rule only scans for under `enableIDScanRule: true`, which
|
|
33
|
+
* preset-recommend leaves off (#1415).
|
|
34
|
+
*/
|
|
35
|
+
const AWS_KEY_ID_PATTERN = /\b(?:A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}\b/g;
|
|
36
|
+
/**
|
|
37
|
+
* GCP API key: fixed `AIza` prefix + 35 key chars. No trailing `\b` — the key
|
|
38
|
+
* charset includes `-`, which breaks word-boundary semantics at the end.
|
|
39
|
+
*/
|
|
40
|
+
const GCP_API_KEY_PATTERN = /\bAIza[0-9A-Za-z_-]{35}/g;
|
|
41
|
+
const CREDENTIAL_ID_PATTERNS = [
|
|
42
|
+
{
|
|
43
|
+
pattern: AWS_KEY_ID_PATTERN,
|
|
44
|
+
replacement: '[SECRET:aws-access-key-id]',
|
|
45
|
+
detail: 'aws-access-key-id',
|
|
46
|
+
kind: 'secret',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
pattern: GCP_API_KEY_PATTERN,
|
|
50
|
+
replacement: '[SECRET:gcp-api-key]',
|
|
51
|
+
detail: 'gcp-api-key',
|
|
52
|
+
kind: 'secret',
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
export function plainPatternsStage(policy, opts = {}) {
|
|
56
|
+
const patterns = opts.credentialIds ? [...PATTERNS, ...CREDENTIAL_ID_PATTERNS] : PATTERNS;
|
|
57
|
+
return {
|
|
58
|
+
name: 'plain-patterns',
|
|
59
|
+
version: VERSION,
|
|
60
|
+
scrub(attributes) {
|
|
61
|
+
const out = {};
|
|
62
|
+
const redactions = [];
|
|
63
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
64
|
+
if (typeof value !== 'string' || classifyKey(key, policy) !== 'content') {
|
|
65
|
+
out[key] = value;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
let scrubbed = value;
|
|
69
|
+
for (const { pattern, replacement, detail, kind } of patterns) {
|
|
70
|
+
let hits = 0;
|
|
71
|
+
scrubbed = scrubbed.replace(pattern, () => {
|
|
72
|
+
hits += 1;
|
|
73
|
+
return replacement;
|
|
74
|
+
});
|
|
75
|
+
for (let i = 0; i < hits; i += 1) {
|
|
76
|
+
redactions.push({ key, stage: 'plain-patterns', kind, detail });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
out[key] = scrubbed;
|
|
80
|
+
}
|
|
81
|
+
return { attributes: out, redactions };
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=plain-patterns-stage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plain-patterns-stage.js","sourceRoot":"","sources":["../../../src/trajectory/scrub/plain-patterns-stage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,WAAW,EAAkB,MAAM,iBAAiB,CAAC;AAG9D,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,yBAAyB;AACzB,MAAM,aAAa,GACjB,4GAA4G,CAAC;AAE/G,uDAAuD;AACvD,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AAI1D,MAAM,QAAQ,GAAkB;IAC9B,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;IAChF,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE;CAC7F,CAAC;AAEF;;;;GAIG;AACH,MAAM,kBAAkB,GACtB,0EAA0E,CAAC;AAE7E;;;GAGG;AACH,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAEvD,MAAM,sBAAsB,GAAkB;IAC5C;QACE,OAAO,EAAE,kBAAkB;QAC3B,WAAW,EAAE,4BAA4B;QACzC,MAAM,EAAE,mBAAmB;QAC3B,IAAI,EAAE,QAAQ;KACf;IACD;QACE,OAAO,EAAE,mBAAmB;QAC5B,WAAW,EAAE,sBAAsB;QACnC,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,QAAQ;KACf;CACF,CAAC;AAYF,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,OAA6B,EAAE;IACnF,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1F,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,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,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,IAAI,QAAQ,GAAG,KAAK,CAAC;gBACrB,KAAK,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC;oBAC9D,IAAI,IAAI,GAAG,CAAC,CAAC;oBACb,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE;wBACxC,IAAI,IAAI,CAAC,CAAC;wBACV,OAAO,WAAW,CAAC;oBACrB,CAAC,CAAC,CAAC;oBACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;wBACjC,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAClE,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;YACtB,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
|