@provos/ironcurtain 0.10.0 → 0.12.0
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 +68 -14
- package/dist/auth/oauth-provider.js +1 -4
- package/dist/auth/oauth-provider.js.map +1 -1
- package/dist/cli-help.d.ts +12 -0
- package/dist/cli-help.js +21 -0
- package/dist/cli-help.js.map +1 -1
- package/dist/cli.js +46 -6
- package/dist/cli.js.map +1 -1
- package/dist/config/agent-model-guard.d.ts +14 -0
- package/dist/config/agent-model-guard.js +24 -0
- package/dist/config/agent-model-guard.js.map +1 -0
- package/dist/config/config-command.js +277 -7
- package/dist/config/config-command.js.map +1 -1
- package/dist/config/first-start.js +62 -7
- package/dist/config/first-start.js.map +1 -1
- package/dist/config/generated/compiled-policy.json +528 -161
- package/dist/config/generated/test-scenarios.json +4810 -170
- package/dist/config/generated/tool-annotations.json +34 -47
- package/dist/config/index.d.ts +58 -0
- package/dist/config/index.js +97 -15
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-servers.json +2 -2
- package/dist/config/model-provider.d.ts +9 -0
- package/dist/config/model-provider.js +13 -0
- package/dist/config/model-provider.js.map +1 -1
- package/dist/config/paths.d.ts +217 -0
- package/dist/config/paths.js +363 -14
- package/dist/config/paths.js.map +1 -1
- package/dist/config/types.d.ts +7 -1
- package/dist/config/user-config.d.ts +101 -6
- package/dist/config/user-config.js +145 -31
- package/dist/config/user-config.js.map +1 -1
- package/dist/config/validate-policy-dir.d.ts +10 -0
- package/dist/config/validate-policy-dir.js +59 -0
- package/dist/config/validate-policy-dir.js.map +1 -0
- package/dist/cron/job-commands.js +22 -2
- package/dist/cron/job-commands.js.map +1 -1
- package/dist/cron/types.d.ts +16 -2
- package/dist/cron/types.js +1 -3
- package/dist/cron/types.js.map +1 -1
- package/dist/daemon/daemon-command.js +30 -7
- package/dist/daemon/daemon-command.js.map +1 -1
- package/dist/daemon/ironcurtain-daemon.d.ts +62 -1
- package/dist/daemon/ironcurtain-daemon.js +231 -8
- package/dist/daemon/ironcurtain-daemon.js.map +1 -1
- package/dist/daemon-client/daemon-client.d.ts +123 -0
- package/dist/daemon-client/daemon-client.js +324 -0
- package/dist/daemon-client/daemon-client.js.map +1 -0
- package/dist/docker/adapters/claude-code.js +194 -20
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/adapters/codex.d.ts +9 -0
- package/dist/docker/adapters/codex.js +297 -0
- package/dist/docker/adapters/codex.js.map +1 -0
- package/dist/docker/adapters/goose.d.ts +12 -11
- package/dist/docker/adapters/goose.js +80 -27
- package/dist/docker/adapters/goose.js.map +1 -1
- package/dist/docker/agent-adapter.d.ts +183 -5
- package/dist/docker/agent-adapter.js +16 -0
- package/dist/docker/agent-adapter.js.map +1 -1
- package/dist/docker/agent-registry.js +5 -0
- package/dist/docker/agent-registry.js.map +1 -1
- package/dist/docker/apple-container-manager.d.ts +49 -0
- package/dist/docker/apple-container-manager.js +464 -0
- package/dist/docker/apple-container-manager.js.map +1 -0
- package/dist/docker/code-mode-proxy.d.ts +38 -0
- package/dist/docker/code-mode-proxy.js +6 -1
- package/dist/docker/code-mode-proxy.js.map +1 -1
- package/dist/docker/container-lifecycle.d.ts +2 -2
- package/dist/docker/container-lifecycle.js.map +1 -1
- package/dist/docker/container-runtime.d.ts +29 -0
- package/dist/docker/container-runtime.js +76 -0
- package/dist/docker/container-runtime.js.map +1 -0
- package/dist/docker/docker-agent-session.d.ts +113 -62
- package/dist/docker/docker-agent-session.js +271 -294
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-infrastructure.d.ts +428 -26
- package/dist/docker/docker-infrastructure.js +1005 -70
- package/dist/docker/docker-infrastructure.js.map +1 -1
- package/dist/docker/docker-manager.d.ts +58 -3
- package/dist/docker/docker-manager.js +378 -33
- package/dist/docker/docker-manager.js.map +1 -1
- package/dist/docker/docker-probe.d.ts +45 -0
- package/dist/docker/docker-probe.js +86 -0
- package/dist/docker/docker-probe.js.map +1 -0
- package/dist/docker/docker-progress-sink.d.ts +43 -0
- package/dist/docker/docker-progress-sink.js +299 -0
- package/dist/docker/docker-progress-sink.js.map +1 -0
- package/dist/docker/mitm-proxy.d.ts +135 -1
- package/dist/docker/mitm-proxy.js +611 -25
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/network-topology.d.ts +81 -0
- package/dist/docker/network-topology.js +160 -0
- package/dist/docker/network-topology.js.map +1 -0
- package/dist/docker/oauth-credentials.d.ts +59 -3
- package/dist/docker/oauth-credentials.js +181 -14
- package/dist/docker/oauth-credentials.js.map +1 -1
- package/dist/docker/oauth-token-manager.js +2 -2
- package/dist/docker/oauth-token-manager.js.map +1 -1
- package/dist/docker/orientation.d.ts +1 -1
- package/dist/docker/package-types.d.ts +1 -1
- package/dist/docker/provider-config.d.ts +78 -3
- package/dist/docker/provider-config.js +295 -31
- package/dist/docker/provider-config.js.map +1 -1
- package/dist/docker/provision-lock.d.ts +46 -0
- package/dist/docker/provision-lock.js +152 -0
- package/dist/docker/provision-lock.js.map +1 -0
- package/dist/docker/proxy-tools.d.ts +0 -2
- package/dist/docker/proxy-tools.js +2 -7
- package/dist/docker/proxy-tools.js.map +1 -1
- package/dist/docker/pty-session.d.ts +64 -1
- package/dist/docker/pty-session.js +306 -104
- package/dist/docker/pty-session.js.map +1 -1
- package/dist/docker/pty-types.d.ts +0 -2
- package/dist/docker/pty-types.js +0 -2
- package/dist/docker/pty-types.js.map +1 -1
- package/dist/docker/registry-proxy.d.ts +46 -0
- package/dist/docker/registry-proxy.js +255 -1
- package/dist/docker/registry-proxy.js.map +1 -1
- package/dist/docker/resource-limits.d.ts +134 -0
- package/dist/docker/resource-limits.js +203 -0
- package/dist/docker/resource-limits.js.map +1 -0
- package/dist/docker/spawn-with-idle-timeout.d.ts +39 -0
- package/dist/docker/spawn-with-idle-timeout.js +152 -0
- package/dist/docker/spawn-with-idle-timeout.js.map +1 -0
- package/dist/docker/sse-extractor.d.ts +51 -0
- package/dist/docker/sse-extractor.js +303 -0
- package/dist/docker/sse-extractor.js.map +1 -0
- package/dist/docker/token-stream-bus.d.ts +83 -0
- package/dist/docker/token-stream-bus.js +98 -0
- package/dist/docker/token-stream-bus.js.map +1 -0
- package/dist/docker/token-stream-types.d.ts +71 -0
- package/dist/docker/token-stream-types.js +8 -0
- package/dist/docker/token-stream-types.js.map +1 -0
- package/dist/docker/trajectory-capture.d.ts +79 -0
- package/dist/docker/trajectory-capture.js +521 -0
- package/dist/docker/trajectory-capture.js.map +1 -0
- package/dist/docker/trajectory-reassembler.d.ts +286 -0
- package/dist/docker/trajectory-reassembler.js +990 -0
- package/dist/docker/trajectory-reassembler.js.map +1 -0
- package/dist/docker/trajectory-tap.d.ts +100 -0
- package/dist/docker/trajectory-tap.js +410 -0
- package/dist/docker/trajectory-tap.js.map +1 -0
- package/dist/docker/trajectory-types.d.ts +187 -0
- package/dist/docker/trajectory-types.js +43 -0
- package/dist/docker/trajectory-types.js.map +1 -0
- package/dist/docker/types.d.ts +105 -12
- package/dist/doctor/checks.d.ts +171 -0
- package/dist/doctor/checks.js +598 -0
- package/dist/doctor/checks.js.map +1 -0
- package/dist/doctor/doctor-command.d.ts +29 -0
- package/dist/doctor/doctor-command.js +190 -0
- package/dist/doctor/doctor-command.js.map +1 -0
- package/dist/doctor/mcp-liveness.d.ts +28 -0
- package/dist/doctor/mcp-liveness.js +92 -0
- package/dist/doctor/mcp-liveness.js.map +1 -0
- package/dist/doctor/oauth-checks.d.ts +23 -0
- package/dist/doctor/oauth-checks.js +157 -0
- package/dist/doctor/oauth-checks.js.map +1 -0
- package/dist/doctor/output.d.ts +26 -0
- package/dist/doctor/output.js +82 -0
- package/dist/doctor/output.js.map +1 -0
- package/dist/escalation/listener-command.js +0 -3
- package/dist/escalation/listener-command.js.map +1 -1
- package/dist/event-bus/typed-event-bus.d.ts +26 -0
- package/dist/event-bus/typed-event-bus.js +35 -0
- package/dist/event-bus/typed-event-bus.js.map +1 -0
- package/dist/index.js +54 -21
- package/dist/index.js.map +1 -1
- package/dist/logger.js +31 -2
- package/dist/logger.js.map +1 -1
- package/dist/memory/auto-save.d.ts +18 -4
- package/dist/memory/auto-save.js +46 -6
- package/dist/memory/auto-save.js.map +1 -1
- package/dist/memory/memory-policy.d.ts +41 -0
- package/dist/memory/memory-policy.js +36 -0
- package/dist/memory/memory-policy.js.map +1 -0
- package/dist/mux/mux-app.d.ts +2 -0
- package/dist/mux/mux-app.js +1 -0
- package/dist/mux/mux-app.js.map +1 -1
- package/dist/mux/mux-command.d.ts +10 -1
- package/dist/mux/mux-command.js +74 -40
- package/dist/mux/mux-command.js.map +1 -1
- package/dist/mux/mux-renderer.js +2 -12
- package/dist/mux/mux-renderer.js.map +1 -1
- package/dist/mux/pty-bridge.d.ts +2 -0
- package/dist/mux/pty-bridge.js +3 -0
- package/dist/mux/pty-bridge.js.map +1 -1
- package/dist/mux/session-scanner.js +1 -2
- package/dist/mux/session-scanner.js.map +1 -1
- package/dist/{pipeline → observability}/llm-logger.d.ts +8 -3
- package/dist/{pipeline → observability}/llm-logger.js +8 -3
- package/dist/observability/llm-logger.js.map +1 -0
- package/dist/observe/observe-command.d.ts +12 -0
- package/dist/observe/observe-command.js +285 -0
- package/dist/observe/observe-command.js.map +1 -0
- package/dist/observe/observe-renderer.d.ts +24 -0
- package/dist/observe/observe-renderer.js +87 -0
- package/dist/observe/observe-renderer.js.map +1 -0
- package/dist/observe/observe-tui-rain.d.ts +42 -0
- package/dist/observe/observe-tui-rain.js +531 -0
- package/dist/observe/observe-tui-rain.js.map +1 -0
- package/dist/observe/observe-tui-text-panel.d.ts +46 -0
- package/dist/observe/observe-tui-text-panel.js +525 -0
- package/dist/observe/observe-tui-text-panel.js.map +1 -0
- package/dist/observe/observe-tui-types.d.ts +270 -0
- package/dist/observe/observe-tui-types.js +200 -0
- package/dist/observe/observe-tui-types.js.map +1 -0
- package/dist/observe/observe-tui-word-scorer.d.ts +143 -0
- package/dist/observe/observe-tui-word-scorer.js +572 -0
- package/dist/observe/observe-tui-word-scorer.js.map +1 -0
- package/dist/observe/observe-tui.d.ts +59 -0
- package/dist/observe/observe-tui.js +592 -0
- package/dist/observe/observe-tui.js.map +1 -0
- package/dist/persona/broad-policy-validator.d.ts +95 -0
- package/dist/persona/broad-policy-validator.js +171 -0
- package/dist/persona/broad-policy-validator.js.map +1 -0
- package/dist/persona/compile-persona-policy.d.ts +54 -2
- package/dist/persona/compile-persona-policy.js +29 -4
- package/dist/persona/compile-persona-policy.js.map +1 -1
- package/dist/persona/event-bus-progress-reporter.d.ts +57 -0
- package/dist/persona/event-bus-progress-reporter.js +66 -0
- package/dist/persona/event-bus-progress-reporter.js.map +1 -0
- package/dist/persona/memory-gate.d.ts +19 -0
- package/dist/persona/memory-gate.js +33 -0
- package/dist/persona/memory-gate.js.map +1 -0
- package/dist/persona/persona-command.js +77 -72
- package/dist/persona/persona-command.js.map +1 -1
- package/dist/persona/persona-compile-orchestrator.d.ts +101 -0
- package/dist/persona/persona-compile-orchestrator.js +504 -0
- package/dist/persona/persona-compile-orchestrator.js.map +1 -0
- package/dist/persona/persona-service.d.ts +137 -0
- package/dist/persona/persona-service.js +263 -0
- package/dist/persona/persona-service.js.map +1 -0
- package/dist/persona/policy-mutation-audit.d.ts +109 -0
- package/dist/persona/policy-mutation-audit.js +179 -0
- package/dist/persona/policy-mutation-audit.js.map +1 -0
- package/dist/persona/resolve.d.ts +22 -0
- package/dist/persona/resolve.js +45 -2
- package/dist/persona/resolve.js.map +1 -1
- package/dist/persona/rule-delta.d.ts +30 -0
- package/dist/persona/rule-delta.js +82 -0
- package/dist/persona/rule-delta.js.map +1 -0
- package/dist/persona/types.d.ts +28 -0
- package/dist/pipeline/annotate.js +10 -2
- package/dist/pipeline/annotate.js.map +1 -1
- package/dist/pipeline/compile.js +14 -2
- package/dist/pipeline/compile.js.map +1 -1
- package/dist/pipeline/constitution-compiler.d.ts +25 -14
- package/dist/pipeline/constitution-compiler.js +107 -38
- package/dist/pipeline/constitution-compiler.js.map +1 -1
- package/dist/pipeline/dynamic-list-types.d.ts +3 -6
- package/dist/pipeline/dynamic-list-types.js +3 -16
- package/dist/pipeline/dynamic-list-types.js.map +1 -1
- package/dist/pipeline/pipeline-runner.d.ts +63 -4
- package/dist/pipeline/pipeline-runner.js +242 -94
- package/dist/pipeline/pipeline-runner.js.map +1 -1
- package/dist/pipeline/pipeline-shared.d.ts +33 -4
- package/dist/pipeline/pipeline-shared.js +79 -19
- package/dist/pipeline/pipeline-shared.js.map +1 -1
- package/dist/pipeline/policy-verifier.js +16 -3
- package/dist/pipeline/policy-verifier.js.map +1 -1
- package/dist/pipeline/proxy-mcp-connections.js +17 -2
- package/dist/pipeline/proxy-mcp-connections.js.map +1 -1
- package/dist/pipeline/refresh-lists.js +3 -5
- package/dist/pipeline/refresh-lists.js.map +1 -1
- package/dist/pipeline/scenario-generator.d.ts +4 -8
- package/dist/pipeline/scenario-generator.js +13 -46
- package/dist/pipeline/scenario-generator.js.map +1 -1
- package/dist/sandbox/index.d.ts +29 -0
- package/dist/sandbox/index.js +351 -119
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/ironcurtain-protocol.d.ts +52 -0
- package/dist/sandbox/ironcurtain-protocol.js +185 -0
- package/dist/sandbox/ironcurtain-protocol.js.map +1 -0
- package/dist/session/agent-session.d.ts +6 -0
- package/dist/session/agent-session.js +16 -5
- package/dist/session/agent-session.js.map +1 -1
- package/dist/session/cli-transport.js +0 -6
- package/dist/session/cli-transport.js.map +1 -1
- package/dist/session/index.d.ts +35 -14
- package/dist/session/index.js +333 -130
- package/dist/session/index.js.map +1 -1
- package/dist/session/preflight.d.ts +21 -13
- package/dist/session/preflight.js +227 -88
- package/dist/session/preflight.js.map +1 -1
- package/dist/session/prompts.d.ts +2 -5
- package/dist/session/prompts.js.map +1 -1
- package/dist/session/session-manager.d.ts +61 -6
- package/dist/session/session-manager.js +72 -10
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/session-metadata.d.ts +21 -5
- package/dist/session/session-metadata.js +34 -12
- package/dist/session/session-metadata.js.map +1 -1
- package/dist/session/types.d.ts +320 -5
- package/dist/session/types.js +57 -1
- package/dist/session/types.js.map +1 -1
- package/dist/signal/bot-command.js +6 -1
- package/dist/signal/bot-command.js.map +1 -1
- package/dist/signal/setup-signal.js +13 -21
- package/dist/signal/setup-signal.js.map +1 -1
- package/dist/signal/signal-bot-daemon.d.ts +16 -1
- package/dist/signal/signal-bot-daemon.js +39 -27
- package/dist/signal/signal-bot-daemon.js.map +1 -1
- package/dist/signal/signal-container.d.ts +3 -3
- package/dist/signal/signal-container.js +9 -3
- package/dist/signal/signal-container.js.map +1 -1
- package/dist/skills/discovery.d.ts +77 -0
- package/dist/skills/discovery.js +206 -0
- package/dist/skills/discovery.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.js +3 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/staging.d.ts +28 -0
- package/dist/skills/staging.js +68 -0
- package/dist/skills/staging.js.map +1 -0
- package/dist/skills/types.d.ts +46 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/trusted-process/approval-whitelist.d.ts +0 -2
- package/dist/trusted-process/approval-whitelist.js +17 -17
- package/dist/trusted-process/approval-whitelist.js.map +1 -1
- package/dist/trusted-process/async-mutex.d.ts +32 -0
- package/dist/trusted-process/async-mutex.js +50 -0
- package/dist/trusted-process/async-mutex.js.map +1 -0
- package/dist/trusted-process/audit-log.d.ts +38 -1
- package/dist/trusted-process/audit-log.js +82 -13
- package/dist/trusted-process/audit-log.js.map +1 -1
- package/dist/trusted-process/call-circuit-breaker.d.ts +6 -0
- package/dist/trusted-process/call-circuit-breaker.js +23 -3
- package/dist/trusted-process/call-circuit-breaker.js.map +1 -1
- package/dist/trusted-process/container-command.d.ts +35 -0
- package/dist/trusted-process/container-command.js +49 -0
- package/dist/trusted-process/container-command.js.map +1 -0
- package/dist/trusted-process/control-server.d.ts +101 -0
- package/dist/trusted-process/control-server.js +282 -0
- package/dist/trusted-process/control-server.js.map +1 -0
- package/dist/trusted-process/domain-utils.d.ts +6 -6
- package/dist/trusted-process/domain-utils.js +7 -23
- package/dist/trusted-process/domain-utils.js.map +1 -1
- package/dist/trusted-process/error-prefixes.d.ts +16 -0
- package/dist/trusted-process/error-prefixes.js +17 -0
- package/dist/trusted-process/error-prefixes.js.map +1 -0
- package/dist/trusted-process/index.d.ts +40 -23
- package/dist/trusted-process/index.js +131 -225
- package/dist/trusted-process/index.js.map +1 -1
- package/dist/trusted-process/list-matcher.d.ts +17 -0
- package/dist/trusted-process/list-matcher.js +31 -0
- package/dist/trusted-process/list-matcher.js.map +1 -0
- package/dist/trusted-process/mcp-client-manager.d.ts +35 -6
- package/dist/trusted-process/mcp-client-manager.js +40 -45
- package/dist/trusted-process/mcp-client-manager.js.map +1 -1
- package/dist/trusted-process/mcp-proxy-server.d.ts +31 -120
- package/dist/trusted-process/mcp-proxy-server.js +201 -660
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/policy-engine.d.ts +16 -4
- package/dist/trusted-process/policy-engine.js +103 -47
- package/dist/trusted-process/policy-engine.js.map +1 -1
- package/dist/trusted-process/policy-roots.d.ts +6 -0
- package/dist/trusted-process/policy-roots.js +20 -0
- package/dist/trusted-process/policy-roots.js.map +1 -1
- package/dist/trusted-process/sandbox-integration.d.ts +12 -0
- package/dist/trusted-process/sandbox-integration.js +18 -0
- package/dist/trusted-process/sandbox-integration.js.map +1 -1
- package/dist/trusted-process/tcp-server-transport.d.ts +12 -1
- package/dist/trusted-process/tcp-server-transport.js +9 -1
- package/dist/trusted-process/tcp-server-transport.js.map +1 -1
- package/dist/trusted-process/tool-call-coordinator.d.ts +283 -0
- package/dist/trusted-process/tool-call-coordinator.js +592 -0
- package/dist/trusted-process/tool-call-coordinator.js.map +1 -0
- package/dist/trusted-process/tool-call-pipeline.d.ts +213 -0
- package/dist/trusted-process/tool-call-pipeline.js +832 -0
- package/dist/trusted-process/tool-call-pipeline.js.map +1 -0
- package/dist/trusted-process/tool-description-hints.d.ts +1 -1
- package/dist/types/argument-roles.d.ts +1 -1
- package/dist/types/argument-roles.js +14 -1
- package/dist/types/argument-roles.js.map +1 -1
- package/dist/types/audit.d.ts +9 -0
- package/dist/{session → types}/errors.d.ts +8 -2
- package/dist/{session → types}/errors.js +8 -2
- package/dist/types/errors.js.map +1 -0
- package/dist/types/reserved-servers.d.ts +11 -0
- package/dist/types/reserved-servers.js +12 -0
- package/dist/types/reserved-servers.js.map +1 -0
- package/dist/types/server-listing.d.ts +14 -0
- package/dist/types/server-listing.js +2 -0
- package/dist/types/server-listing.js.map +1 -0
- package/dist/types/slug.d.ts +2 -0
- package/dist/types/slug.js +2 -0
- package/dist/types/slug.js.map +1 -1
- package/dist/types/url-normalize.d.ts +16 -0
- package/dist/types/url-normalize.js +33 -0
- package/dist/types/url-normalize.js.map +1 -0
- package/dist/util/atomic-write.d.ts +31 -0
- package/dist/util/atomic-write.js +43 -0
- package/dist/util/atomic-write.js.map +1 -0
- package/dist/utils/error-message.d.ts +8 -0
- package/dist/utils/error-message.js +11 -0
- package/dist/utils/error-message.js.map +1 -0
- package/dist/utils/exec-error.d.ts +19 -0
- package/dist/utils/exec-error.js +16 -0
- package/dist/utils/exec-error.js.map +1 -0
- package/dist/utils/is-plain-object.d.ts +7 -0
- package/dist/utils/is-plain-object.js +12 -0
- package/dist/utils/is-plain-object.js.map +1 -0
- package/dist/utils/preflight-checks.d.ts +16 -0
- package/dist/utils/preflight-checks.js +178 -0
- package/dist/utils/preflight-checks.js.map +1 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.d.ts +7 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.js +725 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.js.map +1 -0
- package/dist/web-ui/conn-registry.d.ts +14 -0
- package/dist/web-ui/conn-registry.js +25 -0
- package/dist/web-ui/conn-registry.js.map +1 -0
- package/dist/web-ui/dispatch/escalation-dispatch.d.ts +7 -0
- package/dist/web-ui/dispatch/escalation-dispatch.js +52 -0
- package/dist/web-ui/dispatch/escalation-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/job-dispatch.d.ts +8 -0
- package/dist/web-ui/dispatch/job-dispatch.js +83 -0
- package/dist/web-ui/dispatch/job-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/persona-dispatch.d.ts +50 -0
- package/dist/web-ui/dispatch/persona-dispatch.js +269 -0
- package/dist/web-ui/dispatch/persona-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/session-dispatch.d.ts +9 -0
- package/dist/web-ui/dispatch/session-dispatch.js +219 -0
- package/dist/web-ui/dispatch/session-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/token-stream-dispatch.d.ts +15 -0
- package/dist/web-ui/dispatch/token-stream-dispatch.js +55 -0
- package/dist/web-ui/dispatch/token-stream-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/types.d.ts +54 -0
- package/dist/web-ui/dispatch/types.js +72 -0
- package/dist/web-ui/dispatch/types.js.map +1 -0
- package/dist/web-ui/dispatch/workflow-dispatch.d.ts +103 -0
- package/dist/web-ui/dispatch/workflow-dispatch.js +1036 -0
- package/dist/web-ui/dispatch/workflow-dispatch.js.map +1 -0
- package/dist/web-ui/json-rpc-dispatch.d.ts +12 -0
- package/dist/web-ui/json-rpc-dispatch.js +34 -0
- package/dist/web-ui/json-rpc-dispatch.js.map +1 -0
- package/dist/web-ui/state-graph.d.ts +13 -0
- package/dist/web-ui/state-graph.js +82 -0
- package/dist/web-ui/state-graph.js.map +1 -0
- package/dist/web-ui/token-stream-bridge.d.ts +76 -0
- package/dist/web-ui/token-stream-bridge.js +265 -0
- package/dist/web-ui/token-stream-bridge.js.map +1 -0
- package/dist/web-ui/web-event-bus.d.ts +176 -0
- package/dist/web-ui/web-event-bus.js +19 -0
- package/dist/web-ui/web-event-bus.js.map +1 -0
- package/dist/web-ui/web-session-transport.d.ts +31 -0
- package/dist/web-ui/web-session-transport.js +109 -0
- package/dist/web-ui/web-session-transport.js.map +1 -0
- package/dist/web-ui/web-ui-server.d.ts +90 -0
- package/dist/web-ui/web-ui-server.js +477 -0
- package/dist/web-ui/web-ui-server.js.map +1 -0
- package/dist/web-ui/web-ui-types.d.ts +418 -0
- package/dist/web-ui/web-ui-types.js +32 -0
- package/dist/web-ui/web-ui-types.js.map +1 -0
- package/dist/web-ui/ws-utils.d.ts +5 -0
- package/dist/web-ui/ws-utils.js +12 -0
- package/dist/web-ui/ws-utils.js.map +1 -0
- package/dist/web-ui-static/assets/index-BD5U6ILh.css +1 -0
- package/dist/web-ui-static/assets/index-FMsHWEfK.js +79 -0
- package/dist/web-ui-static/assets/orbitron-latin-700-normal-4jsRXGGJ.woff2 +0 -0
- package/dist/web-ui-static/assets/orbitron-latin-700-normal-DmYOh-W9.woff +0 -0
- package/dist/web-ui-static/index.html +14 -0
- package/dist/workflow/artifacts.d.ts +59 -0
- package/dist/workflow/artifacts.js +188 -0
- package/dist/workflow/artifacts.js.map +1 -0
- package/dist/workflow/checkpoint-selection.d.ts +34 -0
- package/dist/workflow/checkpoint-selection.js +48 -0
- package/dist/workflow/checkpoint-selection.js.map +1 -0
- package/dist/workflow/checkpoint.d.ts +35 -0
- package/dist/workflow/checkpoint.js +84 -0
- package/dist/workflow/checkpoint.js.map +1 -0
- package/dist/workflow/cli-shared.d.ts +62 -0
- package/dist/workflow/cli-shared.js +117 -0
- package/dist/workflow/cli-shared.js.map +1 -0
- package/dist/workflow/cli-support.d.ts +92 -0
- package/dist/workflow/cli-support.js +421 -0
- package/dist/workflow/cli-support.js.map +1 -0
- package/dist/workflow/container-snapshots.d.ts +29 -0
- package/dist/workflow/container-snapshots.js +137 -0
- package/dist/workflow/container-snapshots.js.map +1 -0
- package/dist/workflow/daemon-gate-commands.d.ts +21 -0
- package/dist/workflow/daemon-gate-commands.js +599 -0
- package/dist/workflow/daemon-gate-commands.js.map +1 -0
- package/dist/workflow/definition-loader.d.ts +32 -0
- package/dist/workflow/definition-loader.js +56 -0
- package/dist/workflow/definition-loader.js.map +1 -0
- package/dist/workflow/discovery.d.ts +107 -0
- package/dist/workflow/discovery.js +263 -0
- package/dist/workflow/discovery.js.map +1 -0
- package/dist/workflow/errors.d.ts +66 -0
- package/dist/workflow/errors.js +49 -0
- package/dist/workflow/errors.js.map +1 -0
- package/dist/workflow/guards.d.ts +8 -0
- package/dist/workflow/guards.js +38 -0
- package/dist/workflow/guards.js.map +1 -0
- package/dist/workflow/lane-template.d.ts +89 -0
- package/dist/workflow/lane-template.js +141 -0
- package/dist/workflow/lane-template.js.map +1 -0
- package/dist/workflow/lint-integration.d.ts +64 -0
- package/dist/workflow/lint-integration.js +56 -0
- package/dist/workflow/lint-integration.js.map +1 -0
- package/dist/workflow/lint.d.ts +72 -0
- package/dist/workflow/lint.js +593 -0
- package/dist/workflow/lint.js.map +1 -0
- package/dist/workflow/machine-builder.d.ts +178 -0
- package/dist/workflow/machine-builder.js +678 -0
- package/dist/workflow/machine-builder.js.map +1 -0
- package/dist/workflow/message-log.d.ts +99 -0
- package/dist/workflow/message-log.js +40 -0
- package/dist/workflow/message-log.js.map +1 -0
- package/dist/workflow/orchestrator.d.ts +954 -0
- package/dist/workflow/orchestrator.js +3594 -0
- package/dist/workflow/orchestrator.js.map +1 -0
- package/dist/workflow/prompt-builder.d.ts +39 -0
- package/dist/workflow/prompt-builder.js +243 -0
- package/dist/workflow/prompt-builder.js.map +1 -0
- package/dist/workflow/run-state-command.d.ts +9 -0
- package/dist/workflow/run-state-command.js +414 -0
- package/dist/workflow/run-state-command.js.map +1 -0
- package/dist/workflow/run-state-debug-capture.d.ts +40 -0
- package/dist/workflow/run-state-debug-capture.js +101 -0
- package/dist/workflow/run-state-debug-capture.js.map +1 -0
- package/dist/workflow/status-parser.d.ts +68 -0
- package/dist/workflow/status-parser.js +274 -0
- package/dist/workflow/status-parser.js.map +1 -0
- package/dist/workflow/types.d.ts +598 -0
- package/dist/workflow/types.js +85 -0
- package/dist/workflow/types.js.map +1 -0
- package/dist/workflow/validate.d.ts +80 -0
- package/dist/workflow/validate.js +788 -0
- package/dist/workflow/validate.js.map +1 -0
- package/dist/workflow/workflow-command.d.ts +9 -0
- package/dist/workflow/workflow-command.js +670 -0
- package/dist/workflow/workflow-command.js.map +1 -0
- package/dist/workflow/workflow-discovery.d.ts +27 -0
- package/dist/workflow/workflow-discovery.js +121 -0
- package/dist/workflow/workflow-discovery.js.map +1 -0
- package/dist/workflow/workflow-manager.d.ts +156 -0
- package/dist/workflow/workflow-manager.js +359 -0
- package/dist/workflow/workflow-manager.js.map +1 -0
- package/dist/workflow/workflows/design-and-code/README.md +50 -0
- package/dist/workflow/workflows/design-and-code/workflow.yaml +169 -0
- package/dist/workflow/workflows/deterministic-eval-smoke/scripts/format_report.js +29 -0
- package/dist/workflow/workflows/deterministic-eval-smoke/scripts/package.json +5 -0
- package/dist/workflow/workflows/deterministic-eval-smoke/scripts/requirements.txt +1 -0
- package/dist/workflow/workflows/deterministic-eval-smoke/scripts/run_eval.py +41 -0
- package/dist/workflow/workflows/deterministic-eval-smoke/workflow.yaml +57 -0
- package/dist/workflow/workflows/deterministic-verdict-smoke/scripts/classify.py +18 -0
- package/dist/workflow/workflows/deterministic-verdict-smoke/workflow.yaml +51 -0
- package/dist/workflow/workflows/evolve/scripts/LICENSE +201 -0
- package/dist/workflow/workflows/evolve/scripts/README.md +314 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-brief +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-cognition +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-db +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-eval +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-files +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-summary +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/__init__.py +14 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/__init__.py +17 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/base.py +21 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/factory.py +90 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/greedy.py +17 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/island.py +316 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/random.py +18 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/ucb1.py +55 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/best_snapshot.py +62 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/cli.py +752 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/cognition.py +127 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/database.py +218 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/diff.py +57 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/embedding.py +84 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/file_lock.py +45 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/run_state.py +343 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/sampling_config.py +173 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/structures.py +93 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/vector_index.py +191 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_result.py +1503 -0
- package/dist/workflow/workflows/evolve/scripts/requirements.txt +2 -0
- package/dist/workflow/workflows/evolve/workflow.yaml +646 -0
- package/dist/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
- package/dist/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
- package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
- package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
- package/dist/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
- package/dist/workflow/workflows/test-email-summary/workflow.yaml +90 -0
- package/dist/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +206 -0
- package/dist/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +167 -0
- package/dist/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +189 -0
- package/dist/workflow/workflows/vuln-discovery/workflow.yaml +925 -0
- package/dist/workflow/worktree.d.ts +43 -0
- package/dist/workflow/worktree.js +106 -0
- package/dist/workflow/worktree.js.map +1 -0
- package/docker/Dockerfile.base +31 -0
- package/docker/Dockerfile.base.arm64 +27 -0
- package/docker/Dockerfile.claude-code +3 -1
- package/docker/Dockerfile.codex +17 -0
- package/docker/Dockerfile.goose +3 -1
- package/docker/entrypoint-claude-code.sh +7 -0
- package/docker/entrypoint-codex.sh +42 -0
- package/docker/entrypoint-goose.sh +6 -0
- package/docker/entrypoint-uid-remap.sh +93 -0
- package/package.json +27 -11
- package/packages/web-ui/README.md +113 -0
- package/packages/web-ui/docs/workflow-state-machine.png +0 -0
- package/src/config/generated/compiled-policy.json +528 -161
- package/src/config/generated/test-scenarios.json +4810 -170
- package/src/config/generated/tool-annotations.json +34 -47
- package/src/config/mcp-servers.json +2 -2
- package/src/workflow/workflows/design-and-code/README.md +50 -0
- package/src/workflow/workflows/design-and-code/workflow.yaml +169 -0
- package/src/workflow/workflows/deterministic-eval-smoke/scripts/format_report.js +29 -0
- package/src/workflow/workflows/deterministic-eval-smoke/scripts/package.json +5 -0
- package/src/workflow/workflows/deterministic-eval-smoke/scripts/requirements.txt +1 -0
- package/src/workflow/workflows/deterministic-eval-smoke/scripts/run_eval.py +41 -0
- package/src/workflow/workflows/deterministic-eval-smoke/workflow.yaml +57 -0
- package/src/workflow/workflows/deterministic-verdict-smoke/scripts/classify.py +18 -0
- package/src/workflow/workflows/deterministic-verdict-smoke/workflow.yaml +51 -0
- package/src/workflow/workflows/evolve/scripts/LICENSE +201 -0
- package/src/workflow/workflows/evolve/scripts/README.md +314 -0
- package/src/workflow/workflows/evolve/scripts/evolve-brief +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve-cognition +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve-db +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve-eval +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve-files +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve-summary +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/__init__.py +14 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/__init__.py +17 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/base.py +21 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/factory.py +90 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/greedy.py +17 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/island.py +316 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/random.py +18 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/ucb1.py +55 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/best_snapshot.py +62 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/cli.py +752 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/cognition.py +127 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/database.py +218 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/diff.py +57 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/embedding.py +84 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/file_lock.py +45 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/run_state.py +343 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/sampling_config.py +173 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/structures.py +93 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/vector_index.py +191 -0
- package/src/workflow/workflows/evolve/scripts/evolve_result.py +1503 -0
- package/src/workflow/workflows/evolve/scripts/requirements.txt +2 -0
- package/src/workflow/workflows/evolve/workflow.yaml +646 -0
- package/src/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
- package/src/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
- package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
- package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
- package/src/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
- package/src/workflow/workflows/test-email-summary/workflow.yaml +90 -0
- package/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +206 -0
- package/src/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +167 -0
- package/src/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +189 -0
- package/src/workflow/workflows/vuln-discovery/workflow.yaml +925 -0
- package/dist/pipeline/llm-logger.js.map +0 -1
- package/dist/session/errors.js.map +0 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker availability probe (leaf module).
|
|
3
|
+
*
|
|
4
|
+
* The single canonical "is Docker available?" check, extracted here so that
|
|
5
|
+
* runtime modules (`docker-manager.ts`, `container-runtime.ts`,
|
|
6
|
+
* `apple-container-manager.ts`) can depend on it without importing
|
|
7
|
+
* `session/preflight.ts` — which itself lazily reaches back into the
|
|
8
|
+
* container-runtime backends. Keeping the probe in a dependency-free leaf
|
|
9
|
+
* breaks that import cycle.
|
|
10
|
+
*
|
|
11
|
+
* This module must stay a leaf: it may import only Node built-ins and
|
|
12
|
+
* `utils/exec-error.js`. Do not add imports from `session/`, `docker/`
|
|
13
|
+
* runtime modules, or any layer that could reach back here.
|
|
14
|
+
*/
|
|
15
|
+
import { execFile as execFileCb } from 'node:child_process';
|
|
16
|
+
import { promisify } from 'node:util';
|
|
17
|
+
import { isExecError, isExecTimeout } from '../utils/exec-error.js';
|
|
18
|
+
const execFile = promisify(execFileCb);
|
|
19
|
+
/**
|
|
20
|
+
* Per-attempt timeout for `docker info`. The daemon call can be slow under
|
|
21
|
+
* load (cold daemon, busy machine), so we use a generous timeout and retry
|
|
22
|
+
* on timeout-class failures rather than tightening the bound.
|
|
23
|
+
*/
|
|
24
|
+
const DOCKER_PROBE_TIMEOUT_MS = 10_000;
|
|
25
|
+
/** Maximum number of additional attempts after the first one. */
|
|
26
|
+
const DOCKER_PROBE_MAX_RETRIES = 2;
|
|
27
|
+
const DOCKER_UNAVAILABLE_REASON = 'Docker not available';
|
|
28
|
+
function describeProbeFailure(err, fallback) {
|
|
29
|
+
if (!isExecError(err))
|
|
30
|
+
return fallback;
|
|
31
|
+
if (err.code === 'ENOENT') {
|
|
32
|
+
return 'The "docker" command was not found in your PATH. Is Docker installed?';
|
|
33
|
+
}
|
|
34
|
+
const stderr = err.stderr.trim();
|
|
35
|
+
if (stderr.length === 0)
|
|
36
|
+
return fallback;
|
|
37
|
+
if (stderr.includes('permission denied')) {
|
|
38
|
+
return 'Permission denied while connecting to the Docker daemon socket.\nIs your user in the "docker" group?';
|
|
39
|
+
}
|
|
40
|
+
if (stderr.includes('Cannot connect to the Docker daemon')) {
|
|
41
|
+
return ('Cannot connect to the Docker daemon.\n' +
|
|
42
|
+
'Is the Docker service running? On macOS/Windows, ensure Docker Desktop is started.');
|
|
43
|
+
}
|
|
44
|
+
return stderr;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Single canonical "is Docker available?" probe for the entire codebase. Other
|
|
48
|
+
* modules MUST call this rather than re-implementing `docker info`.
|
|
49
|
+
*
|
|
50
|
+
* `docker info` can blow past a tight timeout on a cold/busy daemon, so we use
|
|
51
|
+
* a generous 10s per attempt and retry on timeout-class failures. We do NOT
|
|
52
|
+
* retry on deterministic failures (ENOENT, permission denied, "Cannot connect
|
|
53
|
+
* to the Docker daemon") — those won't change between attempts and the
|
|
54
|
+
* user-visible failure path should be fast.
|
|
55
|
+
*
|
|
56
|
+
* @param execFileFn Optional `execFile` implementation for tests.
|
|
57
|
+
*/
|
|
58
|
+
export async function checkDockerAvailable(execFileFn = execFile) {
|
|
59
|
+
const totalAttempts = DOCKER_PROBE_MAX_RETRIES + 1;
|
|
60
|
+
let lastErr;
|
|
61
|
+
for (let attempt = 1; attempt <= totalAttempts; attempt++) {
|
|
62
|
+
try {
|
|
63
|
+
await execFileFn('docker', ['info'], { timeout: DOCKER_PROBE_TIMEOUT_MS });
|
|
64
|
+
return { available: true };
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
lastErr = err;
|
|
68
|
+
if (!isExecError(err) || !isExecTimeout(err)) {
|
|
69
|
+
return {
|
|
70
|
+
available: false,
|
|
71
|
+
reason: DOCKER_UNAVAILABLE_REASON,
|
|
72
|
+
detailedMessage: describeProbeFailure(err, err instanceof Error ? err.message : String(err)),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const baseMessage = lastErr instanceof Error ? lastErr.message : String(lastErr);
|
|
78
|
+
const timeoutSeconds = DOCKER_PROBE_TIMEOUT_MS / 1000;
|
|
79
|
+
return {
|
|
80
|
+
available: false,
|
|
81
|
+
reason: DOCKER_UNAVAILABLE_REASON,
|
|
82
|
+
detailedMessage: `Docker daemon did not respond within ${timeoutSeconds}s after ${totalAttempts} attempts. ` +
|
|
83
|
+
`The daemon may be overloaded or starting up. Original error: ${baseMessage}`,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=docker-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-probe.js","sourceRoot":"","sources":["../../src/docker/docker-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AAEvC;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,iEAAiE;AACjE,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAEnC,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAezD,SAAS,oBAAoB,CAAC,GAAY,EAAE,QAAgB;IAC1D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEvC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,uEAAuE,CAAC;IACjF,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACzC,OAAO,sGAAsG,CAAC;IAChH,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE,CAAC;QAC3D,OAAO,CACL,wCAAwC;YACxC,oFAAoF,CACrF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,aAA8B,QAAQ;IAC/E,MAAM,aAAa,GAAG,wBAAwB,GAAG,CAAC,CAAC;IACnD,IAAI,OAAgB,CAAC;IAErB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,aAAa,EAAE,OAAO,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC3E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,OAAO,GAAG,GAAG,CAAC;YACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7C,OAAO;oBACL,SAAS,EAAE,KAAK;oBAChB,MAAM,EAAE,yBAAyB;oBACjC,eAAe,EAAE,oBAAoB,CAAC,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;iBAC7F,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjF,MAAM,cAAc,GAAG,uBAAuB,GAAG,IAAI,CAAC;IACtD,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,yBAAyB;QACjC,eAAe,EACb,wCAAwC,cAAc,WAAW,aAAa,aAAa;YAC3F,gEAAgE,WAAW,EAAE;KAChF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-line progress renderer for `docker pull` / `docker build` streams.
|
|
3
|
+
*
|
|
4
|
+
* `spawnWithIdleTimeout` (PR #250) restored real-time visibility into image
|
|
5
|
+
* pulls/builds by piping the child's stdout/stderr verbatim to the parent's
|
|
6
|
+
* terminal — fixing silent hangs but flooding the user with thousands of
|
|
7
|
+
* lines of BuildKit / per-layer chatter. This sink replaces that verbatim
|
|
8
|
+
* dump in the interactive (TTY) case with a single status line that
|
|
9
|
+
* updates in place, while still feeding every chunk to the watchdog (the
|
|
10
|
+
* heartbeat detection in `spawnWithIdleTimeout` runs before the chunk
|
|
11
|
+
* reaches the sink — see `forward()` in that file).
|
|
12
|
+
*
|
|
13
|
+
* On non-TTY stderr (CI, redirected logs) the sink passes chunks through
|
|
14
|
+
* verbatim, matching the pre-existing behavior and keeping CI logs useful.
|
|
15
|
+
*
|
|
16
|
+
* On failure, `dumpRecent()` flushes the last ~200 raw lines so the user
|
|
17
|
+
* gets a real diagnostic — the 4 KB stderr-tail quoted in the rejection
|
|
18
|
+
* message from `spawnWithIdleTimeout` is often too short to capture an
|
|
19
|
+
* earlier RUN step that actually went wrong.
|
|
20
|
+
*/
|
|
21
|
+
export type DockerProgressOperation = 'docker pull' | 'docker build' | 'container pull' | 'container build';
|
|
22
|
+
export interface DockerProgressSink {
|
|
23
|
+
/** Writable that the child's stdout pipes into. */
|
|
24
|
+
stdout: NodeJS.WritableStream;
|
|
25
|
+
/** Writable that the child's stderr pipes into. */
|
|
26
|
+
stderr: NodeJS.WritableStream;
|
|
27
|
+
/** Commit the in-place line (TTY) or emit a final summary (non-TTY). */
|
|
28
|
+
finish(success: boolean): void;
|
|
29
|
+
/** Flush the rolling raw-line buffer; intended for the failure path. */
|
|
30
|
+
dumpRecent(): void;
|
|
31
|
+
}
|
|
32
|
+
export interface CreateDockerProgressSinkOptions {
|
|
33
|
+
operation: DockerProgressOperation;
|
|
34
|
+
/** Underlying writable. Defaults to `process.stderr`. */
|
|
35
|
+
output?: NodeJS.WritableStream;
|
|
36
|
+
/** Override TTY detection (used by tests). */
|
|
37
|
+
isTTY?: boolean;
|
|
38
|
+
/** Max raw lines retained for failure dump. Defaults to 200. */
|
|
39
|
+
bufferSize?: number;
|
|
40
|
+
/** Override clock for elapsed timers (used by tests). */
|
|
41
|
+
now?: () => number;
|
|
42
|
+
}
|
|
43
|
+
export declare function createDockerProgressSink(opts: CreateDockerProgressSinkOptions): DockerProgressSink;
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-line progress renderer for `docker pull` / `docker build` streams.
|
|
3
|
+
*
|
|
4
|
+
* `spawnWithIdleTimeout` (PR #250) restored real-time visibility into image
|
|
5
|
+
* pulls/builds by piping the child's stdout/stderr verbatim to the parent's
|
|
6
|
+
* terminal — fixing silent hangs but flooding the user with thousands of
|
|
7
|
+
* lines of BuildKit / per-layer chatter. This sink replaces that verbatim
|
|
8
|
+
* dump in the interactive (TTY) case with a single status line that
|
|
9
|
+
* updates in place, while still feeding every chunk to the watchdog (the
|
|
10
|
+
* heartbeat detection in `spawnWithIdleTimeout` runs before the chunk
|
|
11
|
+
* reaches the sink — see `forward()` in that file).
|
|
12
|
+
*
|
|
13
|
+
* On non-TTY stderr (CI, redirected logs) the sink passes chunks through
|
|
14
|
+
* verbatim, matching the pre-existing behavior and keeping CI logs useful.
|
|
15
|
+
*
|
|
16
|
+
* On failure, `dumpRecent()` flushes the last ~200 raw lines so the user
|
|
17
|
+
* gets a real diagnostic — the 4 KB stderr-tail quoted in the rejection
|
|
18
|
+
* message from `spawnWithIdleTimeout` is often too short to capture an
|
|
19
|
+
* earlier RUN step that actually went wrong.
|
|
20
|
+
*/
|
|
21
|
+
import { Writable } from 'node:stream';
|
|
22
|
+
import chalk from 'chalk';
|
|
23
|
+
const DEFAULT_BUFFER_LINES = 200;
|
|
24
|
+
const PENDING_BUFFER_HARD_CAP = 8 * 1024;
|
|
25
|
+
export function createDockerProgressSink(opts) {
|
|
26
|
+
const output = opts.output ?? process.stderr;
|
|
27
|
+
// `process.stderr` is typed as `WriteStream` (with `isTTY: true | undefined`);
|
|
28
|
+
// a generic `WritableStream` may not have the property at all. Cast to a
|
|
29
|
+
// shape that admits either so ESLint does not flag the comparison.
|
|
30
|
+
const isTTY = opts.isTTY ?? output.isTTY === true;
|
|
31
|
+
const bufferSize = opts.bufferSize ?? DEFAULT_BUFFER_LINES;
|
|
32
|
+
const now = opts.now ?? Date.now;
|
|
33
|
+
// Non-TTY fast path: behave like the pre-sink `process.stderr` so CI logs
|
|
34
|
+
// keep their full transcript. finish/dumpRecent are no-ops because the
|
|
35
|
+
// raw transcript is already on screen.
|
|
36
|
+
if (!isTTY) {
|
|
37
|
+
const makeStream = () => new Writable({
|
|
38
|
+
write(chunk, _encoding, cb) {
|
|
39
|
+
output.write(typeof chunk === 'string' ? chunk : chunk.toString('utf-8'));
|
|
40
|
+
cb();
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
stdout: makeStream(),
|
|
45
|
+
stderr: makeStream(),
|
|
46
|
+
finish: () => { },
|
|
47
|
+
dumpRecent: () => { },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const parser = opts.operation === 'docker pull' ? createPullParser(now) : createBuildParser(now);
|
|
51
|
+
const ringBuffer = [];
|
|
52
|
+
const startTime = now();
|
|
53
|
+
let pendingStdout = '';
|
|
54
|
+
let pendingStderr = '';
|
|
55
|
+
// Empty string means no in-place line is currently on screen.
|
|
56
|
+
let lastRendered = '';
|
|
57
|
+
let finished = false;
|
|
58
|
+
const record = (line) => {
|
|
59
|
+
if (!line)
|
|
60
|
+
return;
|
|
61
|
+
ringBuffer.push(line);
|
|
62
|
+
if (ringBuffer.length > bufferSize)
|
|
63
|
+
ringBuffer.shift();
|
|
64
|
+
};
|
|
65
|
+
const render = () => {
|
|
66
|
+
if (finished)
|
|
67
|
+
return;
|
|
68
|
+
const summary = parser.summary();
|
|
69
|
+
if (summary === lastRendered)
|
|
70
|
+
return;
|
|
71
|
+
lastRendered = summary;
|
|
72
|
+
output.write(`\r\x1B[2K${summary}`);
|
|
73
|
+
};
|
|
74
|
+
const processChunk = (chunk, isStderr) => {
|
|
75
|
+
const text = typeof chunk === 'string' ? chunk : chunk.toString('utf-8');
|
|
76
|
+
let pending = (isStderr ? pendingStderr : pendingStdout) + text;
|
|
77
|
+
// Docker pull uses `\r` (not `\n`) to update its progress meter in place;
|
|
78
|
+
// we treat both as line boundaries so each transient state is parsed.
|
|
79
|
+
const splitter = /[^\r\n]*[\r\n]/g;
|
|
80
|
+
let lastIdx = 0;
|
|
81
|
+
let match;
|
|
82
|
+
while ((match = splitter.exec(pending)) !== null) {
|
|
83
|
+
const segment = match[0];
|
|
84
|
+
const line = segment.replace(/[\r\n]+$/, '').trimEnd();
|
|
85
|
+
if (line) {
|
|
86
|
+
record(line);
|
|
87
|
+
try {
|
|
88
|
+
parser.feed(line);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Parser bugs MUST NOT propagate — the streaming pipeline relies
|
|
92
|
+
// on the sink consuming bytes without error so the watchdog stays
|
|
93
|
+
// armed.
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
lastIdx = splitter.lastIndex;
|
|
97
|
+
}
|
|
98
|
+
pending = pending.slice(lastIdx);
|
|
99
|
+
// Guard against pathological no-newline output (e.g. a malicious image
|
|
100
|
+
// streaming a giant binary blob to stderr). Keep only the trailing half
|
|
101
|
+
// of the cap so we don't OOM on the pending buffer.
|
|
102
|
+
if (pending.length > PENDING_BUFFER_HARD_CAP) {
|
|
103
|
+
pending = pending.slice(-PENDING_BUFFER_HARD_CAP / 2);
|
|
104
|
+
}
|
|
105
|
+
if (isStderr)
|
|
106
|
+
pendingStderr = pending;
|
|
107
|
+
else
|
|
108
|
+
pendingStdout = pending;
|
|
109
|
+
render();
|
|
110
|
+
};
|
|
111
|
+
const makeWritable = (isStderr) => new Writable({
|
|
112
|
+
write(chunk, _encoding, cb) {
|
|
113
|
+
try {
|
|
114
|
+
processChunk(chunk, isStderr);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// see comment above — never throw from the write path
|
|
118
|
+
}
|
|
119
|
+
cb();
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
const flushPending = () => {
|
|
123
|
+
for (const pending of [pendingStdout, pendingStderr]) {
|
|
124
|
+
const trimmed = pending.replace(/[\r\n]+$/, '').trimEnd();
|
|
125
|
+
if (!trimmed)
|
|
126
|
+
continue;
|
|
127
|
+
record(trimmed);
|
|
128
|
+
try {
|
|
129
|
+
parser.feed(trimmed);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
/* swallow */
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
pendingStdout = '';
|
|
136
|
+
pendingStderr = '';
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
stdout: makeWritable(false),
|
|
140
|
+
stderr: makeWritable(true),
|
|
141
|
+
finish(success) {
|
|
142
|
+
if (finished)
|
|
143
|
+
return;
|
|
144
|
+
finished = true;
|
|
145
|
+
flushPending();
|
|
146
|
+
const elapsed = ((now() - startTime) / 1000).toFixed(1);
|
|
147
|
+
const summary = parser.summary();
|
|
148
|
+
const tag = success ? chalk.green(`${opts.operation} done`) : chalk.red(`${opts.operation} failed`);
|
|
149
|
+
const line = `${tag} ${chalk.dim(`(${elapsed}s)`)} ${chalk.dim(summary)}`;
|
|
150
|
+
if (lastRendered) {
|
|
151
|
+
output.write(`\r\x1B[2K${line}\n`);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
output.write(`${line}\n`);
|
|
155
|
+
}
|
|
156
|
+
lastRendered = '';
|
|
157
|
+
},
|
|
158
|
+
dumpRecent() {
|
|
159
|
+
if (ringBuffer.length === 0)
|
|
160
|
+
return;
|
|
161
|
+
if (lastRendered) {
|
|
162
|
+
// Make sure our dump starts on a fresh line.
|
|
163
|
+
output.write('\r\x1B[2K');
|
|
164
|
+
lastRendered = '';
|
|
165
|
+
}
|
|
166
|
+
output.write(chalk.dim(`--- last ${ringBuffer.length} lines from ${opts.operation} ---`) + '\n');
|
|
167
|
+
for (const line of ringBuffer) {
|
|
168
|
+
output.write(line + '\n');
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function createPullParser(now) {
|
|
174
|
+
const layers = new Map();
|
|
175
|
+
let statusLine = '';
|
|
176
|
+
const startTime = now();
|
|
177
|
+
return {
|
|
178
|
+
feed(line) {
|
|
179
|
+
const clean = stripAnsi(line).trim();
|
|
180
|
+
// Layer-scoped messages: `<id>: <message>` where id is a short hex
|
|
181
|
+
// digest or a tag name in the case of the first line.
|
|
182
|
+
const layerMatch = clean.match(/^([0-9a-f]{8,}|[A-Za-z][\w.-]*):\s+(.+?)\s*$/);
|
|
183
|
+
if (layerMatch) {
|
|
184
|
+
const [, id, msg] = layerMatch;
|
|
185
|
+
if (/^Pulling fs layer$/i.test(msg) || /^Waiting$/i.test(msg)) {
|
|
186
|
+
if (!layers.has(id))
|
|
187
|
+
layers.set(id, 'pending');
|
|
188
|
+
}
|
|
189
|
+
else if (/^Downloading/i.test(msg)) {
|
|
190
|
+
layers.set(id, 'downloading');
|
|
191
|
+
}
|
|
192
|
+
else if (/^Verifying Checksum/i.test(msg)) {
|
|
193
|
+
layers.set(id, 'verifying');
|
|
194
|
+
}
|
|
195
|
+
else if (/^Download complete/i.test(msg)) {
|
|
196
|
+
layers.set(id, 'downloaded');
|
|
197
|
+
}
|
|
198
|
+
else if (/^Extracting/i.test(msg)) {
|
|
199
|
+
layers.set(id, 'extracting');
|
|
200
|
+
}
|
|
201
|
+
else if (/^Pull complete/i.test(msg)) {
|
|
202
|
+
layers.set(id, 'done');
|
|
203
|
+
}
|
|
204
|
+
else if (/^Already exists/i.test(msg)) {
|
|
205
|
+
layers.set(id, 'exists');
|
|
206
|
+
}
|
|
207
|
+
else if (/^Pulling from /i.test(msg)) {
|
|
208
|
+
statusLine = clean;
|
|
209
|
+
}
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (/^Status:|^Digest:/i.test(clean) || /Pulling from /i.test(clean)) {
|
|
213
|
+
statusLine = clean;
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
summary() {
|
|
217
|
+
const total = layers.size;
|
|
218
|
+
const phases = [...layers.values()];
|
|
219
|
+
const done = phases.filter((p) => p === 'done' || p === 'exists').length;
|
|
220
|
+
const downloading = phases.filter((p) => p === 'downloading').length;
|
|
221
|
+
const extracting = phases.filter((p) => p === 'extracting').length;
|
|
222
|
+
const elapsed = ((now() - startTime) / 1000).toFixed(0);
|
|
223
|
+
const parts = [chalk.cyan('docker pull')];
|
|
224
|
+
if (total === 0) {
|
|
225
|
+
parts.push(chalk.dim(statusLine || 'starting...'));
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
parts.push(chalk.dim(`${done}/${total} layers`));
|
|
229
|
+
if (downloading > 0)
|
|
230
|
+
parts.push(chalk.yellow(`${downloading} downloading`));
|
|
231
|
+
if (extracting > 0)
|
|
232
|
+
parts.push(chalk.blue(`${extracting} extracting`));
|
|
233
|
+
}
|
|
234
|
+
parts.push(chalk.dim(`(${elapsed}s)`));
|
|
235
|
+
return parts.join(' ');
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function createBuildParser(now) {
|
|
240
|
+
let currentStep;
|
|
241
|
+
let totalSteps;
|
|
242
|
+
let currentDesc;
|
|
243
|
+
let lastBracket;
|
|
244
|
+
const startTime = now();
|
|
245
|
+
return {
|
|
246
|
+
feed(line) {
|
|
247
|
+
const clean = stripAnsi(line);
|
|
248
|
+
// BuildKit `--progress=plain` format. Step headers look like:
|
|
249
|
+
// #5 [stage 2/8] RUN apt-get install -y curl
|
|
250
|
+
// #4 [internal] load build definition from Dockerfile
|
|
251
|
+
// #6 [build 3/5] COPY . /workspace
|
|
252
|
+
// We pull the `N/M` out of the bracket when present so the summary
|
|
253
|
+
// can show progress; otherwise we fall back to the bracket label.
|
|
254
|
+
const stepHeader = clean.match(/^#\d+\s+\[([^\]]+)\]\s+(.+?)\s*$/);
|
|
255
|
+
if (stepHeader) {
|
|
256
|
+
const [, bracket, desc] = stepHeader;
|
|
257
|
+
const numbered = bracket.match(/(\d+)\/(\d+)/);
|
|
258
|
+
if (numbered) {
|
|
259
|
+
currentStep = Number.parseInt(numbered[1], 10);
|
|
260
|
+
totalSteps = Number.parseInt(numbered[2], 10);
|
|
261
|
+
}
|
|
262
|
+
lastBracket = bracket;
|
|
263
|
+
currentDesc = truncate(desc, 80);
|
|
264
|
+
}
|
|
265
|
+
// Step continuation lines (`#5 0.234 ...output...`) and DONE markers
|
|
266
|
+
// intentionally don't update the summary — they'd just flicker the
|
|
267
|
+
// line. Their job is to advance the watchdog, which already happens
|
|
268
|
+
// before the sink is reached.
|
|
269
|
+
},
|
|
270
|
+
summary() {
|
|
271
|
+
const elapsed = ((now() - startTime) / 1000).toFixed(0);
|
|
272
|
+
const parts = [chalk.cyan('docker build')];
|
|
273
|
+
if (currentStep !== undefined && totalSteps !== undefined) {
|
|
274
|
+
parts.push(chalk.dim(`step ${currentStep}/${totalSteps}`));
|
|
275
|
+
}
|
|
276
|
+
else if (lastBracket) {
|
|
277
|
+
parts.push(chalk.dim(lastBracket));
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
parts.push(chalk.dim('starting...'));
|
|
281
|
+
}
|
|
282
|
+
if (currentDesc)
|
|
283
|
+
parts.push(currentDesc);
|
|
284
|
+
parts.push(chalk.dim(`(${elapsed}s)`));
|
|
285
|
+
return parts.join(' ');
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
function truncate(s, max) {
|
|
290
|
+
return s.length > max ? s.slice(0, max - 1) + '…' : s;
|
|
291
|
+
}
|
|
292
|
+
// CSI sequence: ESC [ <params> <intermediate> <final>. Strips colors and
|
|
293
|
+
// cursor-control codes BuildKit/docker may embed in line output.
|
|
294
|
+
// eslint-disable-next-line no-control-regex
|
|
295
|
+
const ANSI_PATTERN = /\u001B\[[0-?]*[ -/]*[@-~]/g;
|
|
296
|
+
function stripAnsi(s) {
|
|
297
|
+
return s.replace(ANSI_PATTERN, '');
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=docker-progress-sink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-progress-sink.js","sourceRoot":"","sources":["../../src/docker/docker-progress-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,MAAM,OAAO,CAAC;AA2B1B,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,uBAAuB,GAAG,CAAC,GAAG,IAAI,CAAC;AAEzC,MAAM,UAAU,wBAAwB,CAAC,IAAqC;IAC5E,MAAM,MAAM,GAA0B,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IACpE,+EAA+E;IAC/E,yEAAyE;IACzE,mEAAmE;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAK,MAA8B,CAAC,KAAK,KAAK,IAAI,CAAC;IAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,oBAAoB,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAEjC,0EAA0E;IAC1E,uEAAuE;IACvE,uCAAuC;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,GAA0B,EAAE,CAC7C,IAAI,QAAQ,CAAC;YACX,KAAK,CAAC,KAAsB,EAAE,SAAS,EAAE,EAAE;gBACzC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1E,EAAE,EAAE,CAAC;YACP,CAAC;SACF,CAAC,CAAC;QACL,OAAO;YACL,MAAM,EAAE,UAAU,EAAE;YACpB,MAAM,EAAE,UAAU,EAAE;YACpB,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;YAChB,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;SACrB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,KAAK,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACjG,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IAExB,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,8DAA8D;IAC9D,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAQ,EAAE;QACpC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,UAAU,CAAC,MAAM,GAAG,UAAU;YAAE,UAAU,CAAC,KAAK,EAAE,CAAC;IACzD,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,IAAI,QAAQ;YAAE,OAAO;QACrB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,OAAO,KAAK,YAAY;YAAE,OAAO;QACrC,YAAY,GAAG,OAAO,CAAC;QACvB,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,KAAsB,EAAE,QAAiB,EAAQ,EAAE;QACvE,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzE,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;QAChE,0EAA0E;QAC1E,sEAAsE;QACtE,MAAM,QAAQ,GAAG,iBAAiB,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,KAA6B,CAAC;QAClC,OAAO,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YACvD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,IAAI,CAAC,CAAC;gBACb,IAAI,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;gBAAC,MAAM,CAAC;oBACP,iEAAiE;oBACjE,kEAAkE;oBAClE,SAAS;gBACX,CAAC;YACH,CAAC;YACD,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC/B,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,uEAAuE;QACvE,wEAAwE;QACxE,oDAAoD;QACpD,IAAI,OAAO,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;YAC7C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,uBAAuB,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,QAAQ;YAAE,aAAa,GAAG,OAAO,CAAC;;YACjC,aAAa,GAAG,OAAO,CAAC;QAC7B,MAAM,EAAE,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,QAAiB,EAAyB,EAAE,CAChE,IAAI,QAAQ,CAAC;QACX,KAAK,CAAC,KAAsB,EAAE,SAAS,EAAE,EAAE;YACzC,IAAI,CAAC;gBACH,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,sDAAsD;YACxD,CAAC;YACD,EAAE,EAAE,CAAC;QACP,CAAC;KACF,CAAC,CAAC;IAEL,MAAM,YAAY,GAAG,GAAS,EAAE;QAC9B,KAAK,MAAM,OAAO,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAC1D,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,MAAM,CAAC,OAAO,CAAC,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,aAAa;YACf,CAAC;QACH,CAAC;QACD,aAAa,GAAG,EAAE,CAAC;QACnB,aAAa,GAAG,EAAE,CAAC;IACrB,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;QAC3B,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC;QAC1B,MAAM,CAAC,OAAO;YACZ,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,YAAY,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,SAAS,CAAC,CAAC;YACpG,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5E,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,YAAY,GAAG,EAAE,CAAC;QACpB,CAAC;QACD,UAAU;YACR,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACpC,IAAI,YAAY,EAAE,CAAC;gBACjB,6CAA6C;gBAC7C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAC1B,YAAY,GAAG,EAAE,CAAC;YACpB,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,UAAU,CAAC,MAAM,eAAe,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YACjG,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAaD,SAAS,gBAAgB,CAAC,GAAiB;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC5C,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IAExB,OAAO;QACL,IAAI,CAAC,IAAI;YACP,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,mEAAmE;YACnE,sDAAsD;YACtD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC/E,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC;gBAC/B,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC9D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;wBAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBACjD,CAAC;qBAAM,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;gBAChC,CAAC;qBAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5C,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBAC9B,CAAC;qBAAM,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3C,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;gBAC/B,CAAC;qBAAM,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACpC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;gBAC/B,CAAC;qBAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBACzB,CAAC;qBAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;gBAC3B,CAAC;qBAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvC,UAAU,GAAG,KAAK,CAAC;gBACrB,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrE,UAAU,GAAG,KAAK,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO;YACL,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;YAC1B,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;YACzE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,MAAM,CAAC;YACrE,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,MAAM,CAAC;YACnE,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAExD,MAAM,KAAK,GAAa,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YACpD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC;gBACjD,IAAI,WAAW,GAAG,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,WAAW,cAAc,CAAC,CAAC,CAAC;gBAC5E,IAAI,UAAU,GAAG,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,aAAa,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC;YACvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAiB;IAC1C,IAAI,WAA+B,CAAC;IACpC,IAAI,UAA8B,CAAC;IACnC,IAAI,WAA+B,CAAC;IACpC,IAAI,WAA+B,CAAC;IACpC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IAExB,OAAO;QACL,IAAI,CAAC,IAAI;YACP,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9B,8DAA8D;YAC9D,+CAA+C;YAC/C,wDAAwD;YACxD,qCAAqC;YACrC,mEAAmE;YACnE,kEAAkE;YAClE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACnE,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC;gBACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC/C,IAAI,QAAQ,EAAE,CAAC;oBACb,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC/C,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChD,CAAC;gBACD,WAAW,GAAG,OAAO,CAAC;gBACtB,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC;YACD,qEAAqE;YACrE,mEAAmE;YACnE,oEAAoE;YACpE,8BAA8B;QAChC,CAAC;QACD,OAAO;YACL,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,KAAK,GAAa,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YACrD,IAAI,WAAW,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,WAAW,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC;iBAAM,IAAI,WAAW,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC;YACvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,GAAW;IACtC,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,yEAAyE;AACzE,iEAAiE;AACjE,4CAA4C;AAC5C,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAElD,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -14,10 +14,12 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import * as http from 'node:http';
|
|
16
16
|
import { type CertificateAuthority } from './ca.js';
|
|
17
|
-
import { type ProviderConfig } from './provider-config.js';
|
|
17
|
+
import { type AgentKind, type ProviderConfig } from './provider-config.js';
|
|
18
18
|
import type { OAuthTokenManager } from './oauth-token-manager.js';
|
|
19
19
|
import type { RegistryConfig, PackageValidator } from './package-types.js';
|
|
20
20
|
import { type DomainListing } from './proxy-tools.js';
|
|
21
|
+
import type { SseProvider } from './token-stream-types.js';
|
|
22
|
+
import type { TrajectoryCaptureWriter } from './trajectory-capture.js';
|
|
21
23
|
/**
|
|
22
24
|
* Runtime control surface for the MITM proxy's host allowlist.
|
|
23
25
|
*
|
|
@@ -65,6 +67,41 @@ export interface MitmProxy {
|
|
|
65
67
|
stop(): Promise<void>;
|
|
66
68
|
/** Runtime control for the dynamic host allowlist. */
|
|
67
69
|
readonly hosts: DynamicHostController;
|
|
70
|
+
/**
|
|
71
|
+
* Set (or clear) the session ID that token-stream events extracted from
|
|
72
|
+
* LLM API responses are routed under.
|
|
73
|
+
*
|
|
74
|
+
* The MITM proxy is long-lived in shared-container workflow mode, where
|
|
75
|
+
* multiple per-state agent sessions share a single proxy instance. Token
|
|
76
|
+
* events for the active agent must be labeled with that agent's session
|
|
77
|
+
* ID, not with any static workflow-wide ID. Callers flip this value
|
|
78
|
+
* around each agent run: set to the session's ID before the agent runs,
|
|
79
|
+
* reset to `undefined` when the session ends.
|
|
80
|
+
*
|
|
81
|
+
* When the current session ID is `undefined`, extraction sites skip the
|
|
82
|
+
* `bus.push()` entirely — no events are emitted under a sentinel value.
|
|
83
|
+
*/
|
|
84
|
+
setTokenSessionId(id: import('../session/types.js').SessionId | undefined): void;
|
|
85
|
+
/**
|
|
86
|
+
* Internal capture-attribution setter. Sets the session ID stamped on
|
|
87
|
+
* subsequent captured ExchangeRecords. Decoupled from
|
|
88
|
+
* `setTokenSessionId` because token-stream-bus and capture are
|
|
89
|
+
* different code paths that must not corrupt each other.
|
|
90
|
+
*
|
|
91
|
+
* Not called directly by orchestrator code — wrapped by
|
|
92
|
+
* `DockerInfrastructure.beginCaptureSession()` / `endCaptureSession()`.
|
|
93
|
+
* Exposed for unit-testing the proxy in isolation.
|
|
94
|
+
*
|
|
95
|
+
* When `undefined`, no capture record is produced for incoming
|
|
96
|
+
* exchanges (the per-handler snapshot is `undefined`).
|
|
97
|
+
*/
|
|
98
|
+
setCaptureSessionId(id: import('../session/types.js').SessionId | undefined): void;
|
|
99
|
+
/**
|
|
100
|
+
* Internal capture-attribution setter. Sets the persona stamped on
|
|
101
|
+
* subsequent captured ExchangeRecords. Wrapped by
|
|
102
|
+
* `DockerInfrastructure.beginCaptureSession()`.
|
|
103
|
+
*/
|
|
104
|
+
setCapturePersona(persona: string | undefined): void;
|
|
68
105
|
}
|
|
69
106
|
export interface MitmProxyOptions {
|
|
70
107
|
/** Absolute path for the Unix domain socket (UDS mode). Omit for TCP mode. */
|
|
@@ -107,6 +144,56 @@ export interface MitmProxyOptions {
|
|
|
107
144
|
* Used in tests to avoid real DNS resolution.
|
|
108
145
|
*/
|
|
109
146
|
readonly dnsLookup?: http.RequestOptions['lookup'];
|
|
147
|
+
/**
|
|
148
|
+
* Connection-source filter for TCP mode. When set, sockets whose
|
|
149
|
+
* remote address fails the predicate are destroyed before any request
|
|
150
|
+
* parsing. Used by the tcp-hostonly topology, where the proxy listens
|
|
151
|
+
* on 0.0.0.0 and only the agent VM's host-only subnet may connect
|
|
152
|
+
* (see src/docker/network-topology.ts). No effect in UDS mode.
|
|
153
|
+
*/
|
|
154
|
+
readonly allowRemoteAddress?: (remoteAddress: string | undefined) => boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Initial session ID for token stream routing. When provided, token
|
|
157
|
+
* events extracted from LLM API endpoints are published into the
|
|
158
|
+
* module-scoped singleton bus (see `getTokenStreamBus`) under this ID.
|
|
159
|
+
*
|
|
160
|
+
* The value is mutable at runtime via `MitmProxy.setTokenSessionId()`:
|
|
161
|
+
* long-lived proxies (shared-container workflows) flip this around each
|
|
162
|
+
* agent so the active agent's session ID is used. When no session ID
|
|
163
|
+
* is set (initial value `undefined` AND no subsequent `setTokenSessionId`
|
|
164
|
+
* call), extraction sites skip publishing entirely.
|
|
165
|
+
*
|
|
166
|
+
* Routinely stale in workflow shared-container mode where the
|
|
167
|
+
* orchestrator overrides via `setTokenSessionId`; the seed is only
|
|
168
|
+
* meaningful in single-session standalone mode.
|
|
169
|
+
*/
|
|
170
|
+
readonly initialTokenSessionId?: import('../session/types.js').SessionId;
|
|
171
|
+
/**
|
|
172
|
+
* Kind of agent driving this proxy, used by request-body rewriters to
|
|
173
|
+
* apply agent-kind-conditional transforms (currently: stripping the
|
|
174
|
+
* schedule built-in skill's tools when set to `'workflow'`). Immutable
|
|
175
|
+
* over the proxy's lifetime — a single bundle serves a single agent kind.
|
|
176
|
+
* `undefined` means rewriters fall back to the most conservative behavior.
|
|
177
|
+
*/
|
|
178
|
+
readonly agentKind?: AgentKind;
|
|
179
|
+
/**
|
|
180
|
+
* Trajectory-capture dispatcher. When set, the proxy taps decrypted
|
|
181
|
+
* request and response bytes on allowed LLM API endpoints and hands
|
|
182
|
+
* complete `ExchangeRecord`s to the writer. When `undefined`, no taps
|
|
183
|
+
* are installed and capture is zero-cost. See
|
|
184
|
+
* docs/designs/mitm-token-trajectory-capture.md.
|
|
185
|
+
*/
|
|
186
|
+
readonly capture?: TrajectoryCaptureWriter;
|
|
187
|
+
/**
|
|
188
|
+
* Human-readable agent name (e.g. `'claude-code'`) stamped onto every
|
|
189
|
+
* captured ExchangeRecord. Distinct from `agentKind` (which is the
|
|
190
|
+
* closed `'workflow' | undefined` enum used by the request rewriter).
|
|
191
|
+
*/
|
|
192
|
+
readonly recordedAgentName?: string;
|
|
193
|
+
/** Workflow-run ID stamped onto every captured ExchangeRecord (when present). */
|
|
194
|
+
readonly workflowRunId?: string;
|
|
195
|
+
/** Bundle ID stamped onto every captured ExchangeRecord (when present). */
|
|
196
|
+
readonly bundleId?: string;
|
|
110
197
|
}
|
|
111
198
|
export interface ProviderKeyMapping {
|
|
112
199
|
readonly config: ProviderConfig;
|
|
@@ -117,4 +204,51 @@ export interface ProviderKeyMapping {
|
|
|
117
204
|
/** Optional token manager for OAuth providers — enables proactive refresh and 401 retry. */
|
|
118
205
|
readonly tokenManager?: OAuthTokenManager;
|
|
119
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* Max bytes buffered from a non-streaming JSON response body for token stream
|
|
209
|
+
* extraction. The response is still streamed to the client unchanged; only
|
|
210
|
+
* the extraction side stops capturing once the cap is hit. This protects the
|
|
211
|
+
* proxy from unbounded memory growth on very large completions.
|
|
212
|
+
*/
|
|
213
|
+
export declare const MAX_JSON_RESPONSE_CAPTURE_BYTES: number;
|
|
214
|
+
/**
|
|
215
|
+
* Output of `createBoundedJsonResponseCapture` -- the stateful hooks used to
|
|
216
|
+
* drive a bounded capture over a chunked response stream.
|
|
217
|
+
*
|
|
218
|
+
* Exposed primarily for unit testing the OOM guard without standing up the
|
|
219
|
+
* full mitm proxy pipeline.
|
|
220
|
+
*/
|
|
221
|
+
export interface BoundedJsonResponseCapture {
|
|
222
|
+
/** Feed a chunk into the capture buffer. Always safe to call. */
|
|
223
|
+
onData(chunk: Buffer): void;
|
|
224
|
+
/**
|
|
225
|
+
* Signal end-of-stream. The callback receives the concatenated buffer,
|
|
226
|
+
* or `null` if the capture overflowed and was discarded.
|
|
227
|
+
*/
|
|
228
|
+
onEnd(onComplete: (body: Buffer | null) => void): void;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Create a size-bounded capture for a JSON response body.
|
|
232
|
+
*
|
|
233
|
+
* Up to `maxBytes` of data is accumulated into an internal chunk array.
|
|
234
|
+
* Once that threshold is crossed, any already-buffered chunks are released
|
|
235
|
+
* (so large responses do not pin memory) and further chunks are ignored.
|
|
236
|
+
* The caller is still responsible for piping the stream through to the
|
|
237
|
+
* client -- this helper only manages the extraction-side buffer.
|
|
238
|
+
*/
|
|
239
|
+
export declare function createBoundedJsonResponseCapture(maxBytes?: number): BoundedJsonResponseCapture;
|
|
240
|
+
/**
|
|
241
|
+
* Maps a target hostname to the SSE provider for token stream parsing.
|
|
242
|
+
* Only Anthropic and OpenAI hosts are recognized; everything else
|
|
243
|
+
* falls back to 'unknown'.
|
|
244
|
+
*/
|
|
245
|
+
export declare function resolveSseProvider(hostname: string): SseProvider;
|
|
246
|
+
export declare function extractToolResults(parsed: Record<string, unknown>, sessionId: import('../session/types.js').SessionId): void;
|
|
247
|
+
/**
|
|
248
|
+
* Extract token stream events from a non-streaming JSON response body.
|
|
249
|
+
* Used when the upstream returns application/json instead of text/event-stream.
|
|
250
|
+
*
|
|
251
|
+
* Emits message_start (model), text_delta (content), and message_end (usage).
|
|
252
|
+
*/
|
|
253
|
+
export declare function extractFromJsonResponse(body: Buffer, sessionId: import('../session/types.js').SessionId): void;
|
|
120
254
|
export declare function createMitmProxy(options: MitmProxyOptions): MitmProxy;
|