@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,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs a child process with an *idle* timeout: the watchdog resets every time
|
|
3
|
+
* the child emits stdout or stderr, and only fires when no output has been
|
|
4
|
+
* seen for `idleTimeoutMs`. This is the right primitive for long-running
|
|
5
|
+
* Docker operations (pull/build) where total wall-clock can legitimately span
|
|
6
|
+
* hours, but a genuine hang means the daemon has stopped emitting progress.
|
|
7
|
+
*
|
|
8
|
+
* The child's stdout/stderr are also piped to the parent's stdout/stderr so
|
|
9
|
+
* the user sees layer downloads / build steps in real time. Today's
|
|
10
|
+
* execFile-based callers buffer everything until exit, which is what makes
|
|
11
|
+
* pulls feel like silent hangs.
|
|
12
|
+
*/
|
|
13
|
+
import { spawn as nodeSpawn } from 'node:child_process';
|
|
14
|
+
/**
|
|
15
|
+
* Cap on the rolling stderr tail kept for error messages. Measured in JS
|
|
16
|
+
* string length (UTF-16 code units), not UTF-8 bytes — for ASCII-only
|
|
17
|
+
* output (the overwhelming majority of docker stderr) the two are equal;
|
|
18
|
+
* for multi-byte UTF-8 the retained byte count is up to ~3× this value.
|
|
19
|
+
* 4096 is comfortably enough headroom for the short stderr blurbs we
|
|
20
|
+
* actually quote back to the user.
|
|
21
|
+
*/
|
|
22
|
+
const STDERR_TAIL_CHARS = 4096;
|
|
23
|
+
const DEFAULT_KILL_GRACE_MS = 2_000;
|
|
24
|
+
/**
|
|
25
|
+
* Spawns `cmd args`, streams stdio to the parent terminal, and enforces an
|
|
26
|
+
* idle (not wall-clock) timeout. Resolves on clean exit; rejects on
|
|
27
|
+
* non-zero exit, idle timeout, or spawn error.
|
|
28
|
+
*/
|
|
29
|
+
export function spawnWithIdleTimeout(cmd, args, options) {
|
|
30
|
+
const { idleTimeoutMs, operation, env, stdoutSink = process.stdout, stderrSink = process.stderr, spawn = nodeSpawn, killGraceMs = DEFAULT_KILL_GRACE_MS, } = options;
|
|
31
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
32
|
+
let child;
|
|
33
|
+
try {
|
|
34
|
+
child = spawn(cmd, [...args], {
|
|
35
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
36
|
+
env: env ? { ...process.env, ...env } : process.env,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
// `spawn()` can throw synchronously on invalid options/args (the
|
|
41
|
+
// async `error` event handles the ENOENT-class failures). Reformat
|
|
42
|
+
// with the operation label so callers get a consistent error shape.
|
|
43
|
+
rejectPromise(new Error(`${operation} failed to spawn: ${err instanceof Error ? err.message : String(err)}`));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const safeKill = (signal) => {
|
|
47
|
+
try {
|
|
48
|
+
child.kill(signal);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// kill() returns false (doesn't throw) on ESRCH per Node's docs;
|
|
52
|
+
// a throw here would only come from an invalid signal name or an
|
|
53
|
+
// unexpectedly torn-down child handle. Either way the timeout
|
|
54
|
+
// callback should never crash the process.
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
let stderrTail = '';
|
|
58
|
+
let settled = false;
|
|
59
|
+
let exited = false;
|
|
60
|
+
let idleTimer = null;
|
|
61
|
+
const settle = (action) => {
|
|
62
|
+
if (settled)
|
|
63
|
+
return;
|
|
64
|
+
settled = true;
|
|
65
|
+
if (idleTimer) {
|
|
66
|
+
clearTimeout(idleTimer);
|
|
67
|
+
idleTimer = null;
|
|
68
|
+
}
|
|
69
|
+
// Detach data listeners so a SIGTERM-resistant child can't keep
|
|
70
|
+
// spamming the user's terminal (or mutating `stderrTail`) between
|
|
71
|
+
// the promise rejection and the eventual SIGKILL. The kill-escalation
|
|
72
|
+
// setTimeout is left to fire on its own schedule.
|
|
73
|
+
child.stdout?.removeAllListeners('data');
|
|
74
|
+
child.stderr?.removeAllListeners('data');
|
|
75
|
+
action();
|
|
76
|
+
};
|
|
77
|
+
const onIdleTimeout = () => {
|
|
78
|
+
// Defensive bail: settle() clears the idle timer synchronously, so a
|
|
79
|
+
// queued callback should not see settled=true — but if a future edit
|
|
80
|
+
// ever rearranges the close path, the guard prevents duplicate kills
|
|
81
|
+
// (and a no-op settle()) from this callback.
|
|
82
|
+
if (settled || exited)
|
|
83
|
+
return;
|
|
84
|
+
// Two-phase kill: SIGTERM first, SIGKILL after the grace period for
|
|
85
|
+
// children that ignore SIGTERM. We gate the SIGKILL on our own
|
|
86
|
+
// `exited` flag (set in the `close` handler) rather than on
|
|
87
|
+
// `child.killed`, because Node flips `child.killed` to true the moment
|
|
88
|
+
// a signal is *sent*, not when the child actually exits — using it
|
|
89
|
+
// here would make SIGKILL unreachable in practice. The grace timer is
|
|
90
|
+
// `.unref()`'d so a dropped promise never keeps the Node event loop
|
|
91
|
+
// alive on it alone.
|
|
92
|
+
safeKill('SIGTERM');
|
|
93
|
+
setTimeout(() => {
|
|
94
|
+
if (!exited)
|
|
95
|
+
safeKill('SIGKILL');
|
|
96
|
+
}, killGraceMs).unref();
|
|
97
|
+
settle(() => {
|
|
98
|
+
rejectPromise(new Error(`${operation} produced no output for ${idleTimeoutMs}ms and was killed. ` +
|
|
99
|
+
`The Docker daemon may be hung or the registry/builder is unresponsive.`));
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
const resetIdleTimer = () => {
|
|
103
|
+
if (settled)
|
|
104
|
+
return;
|
|
105
|
+
if (idleTimer)
|
|
106
|
+
clearTimeout(idleTimer);
|
|
107
|
+
idleTimer = setTimeout(onIdleTimeout, idleTimeoutMs);
|
|
108
|
+
// Match `killTimer.unref()`: don't keep the event loop alive if the
|
|
109
|
+
// caller drops the promise reference (e.g. a CLI early-exit path).
|
|
110
|
+
idleTimer.unref();
|
|
111
|
+
};
|
|
112
|
+
const forward = (chunk, sink, captureTail) => {
|
|
113
|
+
const text = typeof chunk === 'string' ? chunk : chunk.toString('utf-8');
|
|
114
|
+
// Best-effort write; ignore backpressure since stdio piping is informational.
|
|
115
|
+
sink.write(text);
|
|
116
|
+
if (captureTail) {
|
|
117
|
+
stderrTail = (stderrTail + text).slice(-STDERR_TAIL_CHARS);
|
|
118
|
+
}
|
|
119
|
+
resetIdleTimer();
|
|
120
|
+
};
|
|
121
|
+
child.stdout?.on('data', (chunk) => {
|
|
122
|
+
forward(chunk, stdoutSink, false);
|
|
123
|
+
});
|
|
124
|
+
child.stderr?.on('data', (chunk) => {
|
|
125
|
+
forward(chunk, stderrSink, true);
|
|
126
|
+
});
|
|
127
|
+
child.on('error', (err) => {
|
|
128
|
+
settle(() => {
|
|
129
|
+
rejectPromise(new Error(`${operation} failed to spawn: ${err.message}`));
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
child.on('close', (code, signal) => {
|
|
133
|
+
exited = true;
|
|
134
|
+
if (settled)
|
|
135
|
+
return;
|
|
136
|
+
if (code === 0 && !signal) {
|
|
137
|
+
settle(() => resolvePromise());
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const tail = stderrTail.trim();
|
|
141
|
+
const tailSuffix = tail ? `: ${tail}` : '';
|
|
142
|
+
const reason = signal ? `killed by signal ${signal}` : `exited with code ${code ?? 'unknown'}`;
|
|
143
|
+
settle(() => {
|
|
144
|
+
rejectPromise(new Error(`${operation} ${reason}${tailSuffix}`));
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
// Arm the watchdog. If the child produces no output at all, this fires
|
|
148
|
+
// exactly once at `idleTimeoutMs` from start.
|
|
149
|
+
resetIdleTimer();
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=spawn-with-idle-timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn-with-idle-timeout.js","sourceRoot":"","sources":["../../src/docker/spawn-with-idle-timeout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE extraction transform stream for the MITM proxy.
|
|
3
|
+
*
|
|
4
|
+
* Sits in the response pipeline between the upstream LLM API and the
|
|
5
|
+
* Docker container. All data passes through unmodified -- the extractor
|
|
6
|
+
* only emits structured side-channel events via a callback.
|
|
7
|
+
*
|
|
8
|
+
* Handles Anthropic and OpenAI SSE formats. Unknown providers emit
|
|
9
|
+
* raw events for every complete SSE line.
|
|
10
|
+
*/
|
|
11
|
+
import { Transform, type TransformCallback } from 'node:stream';
|
|
12
|
+
import type { SseEventCallback, SseProvider } from './token-stream-types.js';
|
|
13
|
+
/** Maximum length of a single SSE line buffer before truncation (1 MB). */
|
|
14
|
+
export declare const MAX_SSE_LINE_LENGTH = 1048576;
|
|
15
|
+
/**
|
|
16
|
+
* A passthrough Transform stream that intercepts SSE data flowing
|
|
17
|
+
* through the MITM proxy without modifying the forwarded bytes.
|
|
18
|
+
*
|
|
19
|
+
* Usage:
|
|
20
|
+
* upstreamRes.pipe(extractor).pipe(clientRes)
|
|
21
|
+
*
|
|
22
|
+
* The extractor reassembles SSE lines across chunk boundaries,
|
|
23
|
+
* parses provider-specific event formats, and invokes the callback
|
|
24
|
+
* with structured TokenStreamEvents.
|
|
25
|
+
*
|
|
26
|
+
* All data passes through unmodified. The extractor never drops,
|
|
27
|
+
* delays, or modifies chunks. If parsing fails for any event,
|
|
28
|
+
* a `raw` event is emitted and data continues to flow.
|
|
29
|
+
*
|
|
30
|
+
* ERROR CONTRACT: `_transform()` must NEVER throw or call
|
|
31
|
+
* `callback(err)`. The entire body is wrapped in a try/catch
|
|
32
|
+
* that always calls `callback(null, chunk)`. A parsing bug must
|
|
33
|
+
* never interrupt the forwarding path to the Docker container.
|
|
34
|
+
*/
|
|
35
|
+
export declare class SseExtractorTransform extends Transform {
|
|
36
|
+
private lineBuffer;
|
|
37
|
+
private currentEventType;
|
|
38
|
+
private readonly provider;
|
|
39
|
+
private readonly onEvent;
|
|
40
|
+
constructor(provider: SseProvider, onEvent: SseEventCallback);
|
|
41
|
+
_transform(chunk: Buffer, _encoding: BufferEncoding, callback: TransformCallback): void;
|
|
42
|
+
_flush(callback: TransformCallback): void;
|
|
43
|
+
private processText;
|
|
44
|
+
private processLine;
|
|
45
|
+
private processUnknownLine;
|
|
46
|
+
private parseAnthropicData;
|
|
47
|
+
private parseOpenaiData;
|
|
48
|
+
private makeMessageEnd;
|
|
49
|
+
/** Invoke the callback, swallowing any listener errors. */
|
|
50
|
+
private emitSafe;
|
|
51
|
+
}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSE extraction transform stream for the MITM proxy.
|
|
3
|
+
*
|
|
4
|
+
* Sits in the response pipeline between the upstream LLM API and the
|
|
5
|
+
* Docker container. All data passes through unmodified -- the extractor
|
|
6
|
+
* only emits structured side-channel events via a callback.
|
|
7
|
+
*
|
|
8
|
+
* Handles Anthropic and OpenAI SSE formats. Unknown providers emit
|
|
9
|
+
* raw events for every complete SSE line.
|
|
10
|
+
*/
|
|
11
|
+
import { Transform } from 'node:stream';
|
|
12
|
+
/** Maximum length of a single SSE line buffer before truncation (1 MB). */
|
|
13
|
+
export const MAX_SSE_LINE_LENGTH = 1_048_576;
|
|
14
|
+
/** Safely extract a string from an unknown value. */
|
|
15
|
+
function str(value, fallback = '') {
|
|
16
|
+
return typeof value === 'string' ? value : fallback;
|
|
17
|
+
}
|
|
18
|
+
/** Safely extract a number from an unknown value. */
|
|
19
|
+
function num(value, fallback = 0) {
|
|
20
|
+
return typeof value === 'number' ? value : fallback;
|
|
21
|
+
}
|
|
22
|
+
/** Safely extract a record from an unknown value. */
|
|
23
|
+
function obj(value) {
|
|
24
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
25
|
+
? value
|
|
26
|
+
: undefined;
|
|
27
|
+
}
|
|
28
|
+
/** Safely extract an array from an unknown value. */
|
|
29
|
+
function arr(value) {
|
|
30
|
+
return Array.isArray(value) ? value : undefined;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A passthrough Transform stream that intercepts SSE data flowing
|
|
34
|
+
* through the MITM proxy without modifying the forwarded bytes.
|
|
35
|
+
*
|
|
36
|
+
* Usage:
|
|
37
|
+
* upstreamRes.pipe(extractor).pipe(clientRes)
|
|
38
|
+
*
|
|
39
|
+
* The extractor reassembles SSE lines across chunk boundaries,
|
|
40
|
+
* parses provider-specific event formats, and invokes the callback
|
|
41
|
+
* with structured TokenStreamEvents.
|
|
42
|
+
*
|
|
43
|
+
* All data passes through unmodified. The extractor never drops,
|
|
44
|
+
* delays, or modifies chunks. If parsing fails for any event,
|
|
45
|
+
* a `raw` event is emitted and data continues to flow.
|
|
46
|
+
*
|
|
47
|
+
* ERROR CONTRACT: `_transform()` must NEVER throw or call
|
|
48
|
+
* `callback(err)`. The entire body is wrapped in a try/catch
|
|
49
|
+
* that always calls `callback(null, chunk)`. A parsing bug must
|
|
50
|
+
* never interrupt the forwarding path to the Docker container.
|
|
51
|
+
*/
|
|
52
|
+
export class SseExtractorTransform extends Transform {
|
|
53
|
+
lineBuffer = '';
|
|
54
|
+
currentEventType = '';
|
|
55
|
+
provider;
|
|
56
|
+
onEvent;
|
|
57
|
+
constructor(provider, onEvent) {
|
|
58
|
+
super();
|
|
59
|
+
this.provider = provider;
|
|
60
|
+
this.onEvent = onEvent;
|
|
61
|
+
}
|
|
62
|
+
_transform(chunk, _encoding, callback) {
|
|
63
|
+
try {
|
|
64
|
+
const text = chunk.toString('utf-8');
|
|
65
|
+
this.processText(text);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Parsing errors must never propagate -- the forwarding path is sacred.
|
|
69
|
+
}
|
|
70
|
+
callback(null, chunk);
|
|
71
|
+
}
|
|
72
|
+
_flush(callback) {
|
|
73
|
+
try {
|
|
74
|
+
if (this.lineBuffer.length > 0) {
|
|
75
|
+
this.processLine(this.lineBuffer);
|
|
76
|
+
this.lineBuffer = '';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Same error contract as _transform.
|
|
81
|
+
}
|
|
82
|
+
callback();
|
|
83
|
+
}
|
|
84
|
+
processText(text) {
|
|
85
|
+
let pos = 0;
|
|
86
|
+
while (pos < text.length) {
|
|
87
|
+
const nextLf = text.indexOf('\n', pos);
|
|
88
|
+
const nextCr = text.indexOf('\r', pos);
|
|
89
|
+
// Find the nearest line ending (-1 means not found)
|
|
90
|
+
let lineEnd;
|
|
91
|
+
if (nextLf === -1 && nextCr === -1) {
|
|
92
|
+
// No more line endings -- buffer the rest
|
|
93
|
+
this.lineBuffer += text.slice(pos);
|
|
94
|
+
if (this.lineBuffer.length > MAX_SSE_LINE_LENGTH) {
|
|
95
|
+
this.emitSafe({
|
|
96
|
+
kind: 'raw',
|
|
97
|
+
eventType: 'truncated',
|
|
98
|
+
data: '',
|
|
99
|
+
timestamp: Date.now(),
|
|
100
|
+
});
|
|
101
|
+
this.lineBuffer = '';
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
else if (nextCr === -1) {
|
|
106
|
+
lineEnd = nextLf;
|
|
107
|
+
}
|
|
108
|
+
else if (nextLf === -1) {
|
|
109
|
+
lineEnd = nextCr;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
lineEnd = Math.min(nextLf, nextCr);
|
|
113
|
+
}
|
|
114
|
+
// Append the segment before the line ending and process
|
|
115
|
+
this.lineBuffer += text.slice(pos, lineEnd);
|
|
116
|
+
if (this.lineBuffer.length > MAX_SSE_LINE_LENGTH) {
|
|
117
|
+
this.emitSafe({
|
|
118
|
+
kind: 'raw',
|
|
119
|
+
eventType: 'truncated',
|
|
120
|
+
data: '',
|
|
121
|
+
timestamp: Date.now(),
|
|
122
|
+
});
|
|
123
|
+
this.lineBuffer = '';
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
this.processLine(this.lineBuffer);
|
|
127
|
+
this.lineBuffer = '';
|
|
128
|
+
}
|
|
129
|
+
// Advance past the line ending, consuming CRLF as a single break
|
|
130
|
+
pos = lineEnd + 1;
|
|
131
|
+
if (text[lineEnd] === '\r' && pos < text.length && text[pos] === '\n') {
|
|
132
|
+
pos++;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
processLine(line) {
|
|
137
|
+
if (this.provider === 'unknown') {
|
|
138
|
+
this.processUnknownLine(line);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (line === '') {
|
|
142
|
+
// Empty line = SSE event boundary. Reset event type for next event.
|
|
143
|
+
this.currentEventType = '';
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (line.startsWith('event:')) {
|
|
147
|
+
this.currentEventType = line.slice(6).trim();
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (line.startsWith('data:')) {
|
|
151
|
+
const data = line.slice(5).trim();
|
|
152
|
+
if (this.provider === 'anthropic') {
|
|
153
|
+
this.parseAnthropicData(data);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
this.parseOpenaiData(data);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Ignore other SSE fields (id:, retry:, comments starting with :)
|
|
160
|
+
}
|
|
161
|
+
processUnknownLine(line) {
|
|
162
|
+
if (line === '')
|
|
163
|
+
return;
|
|
164
|
+
this.emitSafe({
|
|
165
|
+
kind: 'raw',
|
|
166
|
+
eventType: 'unknown_provider',
|
|
167
|
+
data: line,
|
|
168
|
+
timestamp: Date.now(),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
parseAnthropicData(data) {
|
|
172
|
+
let parsed;
|
|
173
|
+
try {
|
|
174
|
+
parsed = JSON.parse(data);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
this.emitSafe({ kind: 'raw', eventType: this.currentEventType || 'parse_error', data, timestamp: Date.now() });
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const root = obj(parsed);
|
|
181
|
+
if (!root)
|
|
182
|
+
return;
|
|
183
|
+
const type = str(root['type']);
|
|
184
|
+
const now = Date.now();
|
|
185
|
+
if (type === 'message_start') {
|
|
186
|
+
const message = obj(root['message']);
|
|
187
|
+
this.emitSafe({ kind: 'message_start', model: str(message?.['model'], 'unknown'), timestamp: now });
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (type === 'content_block_delta') {
|
|
191
|
+
const delta = obj(root['delta']);
|
|
192
|
+
if (!delta)
|
|
193
|
+
return;
|
|
194
|
+
const deltaType = str(delta['type']);
|
|
195
|
+
if (deltaType === 'text_delta') {
|
|
196
|
+
this.emitSafe({ kind: 'text_delta', text: str(delta['text']), timestamp: now });
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (deltaType === 'input_json_delta') {
|
|
200
|
+
this.emitSafe({ kind: 'tool_use', toolName: '', inputDelta: str(delta['partial_json']), timestamp: now });
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (type === 'content_block_start') {
|
|
205
|
+
const block = obj(root['content_block']);
|
|
206
|
+
if (str(block?.['type']) === 'tool_use') {
|
|
207
|
+
this.emitSafe({ kind: 'tool_use', toolName: str(block?.['name']), inputDelta: '', timestamp: now });
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (type === 'message_delta') {
|
|
212
|
+
const delta = obj(root['delta']);
|
|
213
|
+
const usage = obj(root['usage']);
|
|
214
|
+
this.emitSafe(this.makeMessageEnd(str(delta?.['stop_reason']), 0, num(usage?.['output_tokens'])));
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (type === 'message_stop') {
|
|
218
|
+
this.emitSafe({ kind: 'raw', eventType: 'message_stop', data, timestamp: now });
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
if (type === 'error') {
|
|
222
|
+
const error = obj(root['error']);
|
|
223
|
+
this.emitSafe({ kind: 'error', message: str(error?.['message'], data), timestamp: now });
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
// Unknown Anthropic event type -- emit as raw.
|
|
227
|
+
this.emitSafe({ kind: 'raw', eventType: type || this.currentEventType || 'unknown', data, timestamp: now });
|
|
228
|
+
}
|
|
229
|
+
parseOpenaiData(data) {
|
|
230
|
+
if (data === '[DONE]') {
|
|
231
|
+
this.emitSafe(this.makeMessageEnd('stop', 0, 0));
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
let parsed;
|
|
235
|
+
try {
|
|
236
|
+
parsed = JSON.parse(data);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
this.emitSafe({ kind: 'raw', eventType: 'parse_error', data, timestamp: Date.now() });
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const root = obj(parsed);
|
|
243
|
+
if (!root)
|
|
244
|
+
return;
|
|
245
|
+
const now = Date.now();
|
|
246
|
+
const choices = arr(root['choices']);
|
|
247
|
+
if (!choices || choices.length === 0) {
|
|
248
|
+
const model = typeof root['model'] === 'string' ? root['model'] : undefined;
|
|
249
|
+
if (model) {
|
|
250
|
+
this.emitSafe({ kind: 'message_start', model, timestamp: now });
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
this.emitSafe({ kind: 'raw', eventType: 'openai_chunk', data, timestamp: now });
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const choice = choices[0];
|
|
257
|
+
const delta = obj(choice['delta']);
|
|
258
|
+
if (!delta) {
|
|
259
|
+
const finishReason = str(choice['finish_reason']) || undefined;
|
|
260
|
+
if (finishReason) {
|
|
261
|
+
this.emitSafe(this.makeMessageEnd(finishReason, 0, 0));
|
|
262
|
+
}
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (typeof delta['content'] === 'string') {
|
|
266
|
+
this.emitSafe({ kind: 'text_delta', text: delta['content'], timestamp: now });
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const toolCalls = arr(delta['tool_calls']);
|
|
270
|
+
if (toolCalls && toolCalls.length > 0) {
|
|
271
|
+
const tc = toolCalls[0];
|
|
272
|
+
const fn = obj(tc['function']);
|
|
273
|
+
this.emitSafe({
|
|
274
|
+
kind: 'tool_use',
|
|
275
|
+
toolName: str(fn?.['name']),
|
|
276
|
+
inputDelta: str(fn?.['arguments']),
|
|
277
|
+
timestamp: now,
|
|
278
|
+
});
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
// Empty delta with finish_reason (common OpenAI pattern for stream end).
|
|
282
|
+
const finishReason = str(choice['finish_reason']) || undefined;
|
|
283
|
+
if (finishReason) {
|
|
284
|
+
this.emitSafe(this.makeMessageEnd(finishReason, 0, 0));
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
// Unknown delta shape -- emit as raw.
|
|
288
|
+
this.emitSafe({ kind: 'raw', eventType: 'openai_delta', data, timestamp: now });
|
|
289
|
+
}
|
|
290
|
+
makeMessageEnd(stopReason, inputTokens, outputTokens) {
|
|
291
|
+
return { kind: 'message_end', stopReason, inputTokens, outputTokens, timestamp: Date.now() };
|
|
292
|
+
}
|
|
293
|
+
/** Invoke the callback, swallowing any listener errors. */
|
|
294
|
+
emitSafe(event) {
|
|
295
|
+
try {
|
|
296
|
+
this.onEvent(event);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
// Listener errors must never propagate to the stream pipeline.
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=sse-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-extractor.js","sourceRoot":"","sources":["../../src/docker/sse-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stateless pub/sub dispatcher for LLM token stream events.
|
|
3
|
+
*
|
|
4
|
+
* A module-scoped singleton (see `getTokenStreamBus()`) is shared
|
|
5
|
+
* across all publishers and subscribers in-process. No buffering --
|
|
6
|
+
* events are delivered synchronously to current listeners and
|
|
7
|
+
* discarded if none exist.
|
|
8
|
+
*/
|
|
9
|
+
import type { SessionId } from '../session/types.js';
|
|
10
|
+
import type { TokenStreamEvent, TokenStreamListener } from './token-stream-types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Stateless pub/sub dispatcher for LLM token stream events.
|
|
13
|
+
*
|
|
14
|
+
* The bus maintains two listener collections:
|
|
15
|
+
* - Per-session: `Map<SessionId, Set<Listener>>` for consumers watching
|
|
16
|
+
* a specific session (web UI session view, CLI `observe <session>`)
|
|
17
|
+
* - Global: `Set<Listener>` for consumers watching all sessions
|
|
18
|
+
* (CLI `observe --all`, future Matrix rain visualization)
|
|
19
|
+
*
|
|
20
|
+
* `push(sessionId, event)` dispatches to both the session-specific
|
|
21
|
+
* listener set and the global listener set.
|
|
22
|
+
*
|
|
23
|
+
* Invariants:
|
|
24
|
+
* - `subscribe()` and `subscribeAll()` return unsubscribe functions
|
|
25
|
+
* for RAII-style cleanup.
|
|
26
|
+
* - Subscribers receive only live events from the point of subscription
|
|
27
|
+
* forward. There is no history or replay.
|
|
28
|
+
* - Push never blocks or throws, even with zero subscribers.
|
|
29
|
+
*/
|
|
30
|
+
export interface TokenStreamBus {
|
|
31
|
+
/**
|
|
32
|
+
* Push an event to all listeners for the given session and all
|
|
33
|
+
* global listeners. Discarded silently if no listeners exist.
|
|
34
|
+
*/
|
|
35
|
+
push(sessionId: SessionId, event: TokenStreamEvent): void;
|
|
36
|
+
/**
|
|
37
|
+
* Subscribe to a single session's token stream.
|
|
38
|
+
* The listener receives only live events from this point forward.
|
|
39
|
+
*
|
|
40
|
+
* @returns An unsubscribe function. Calling it removes the listener.
|
|
41
|
+
*/
|
|
42
|
+
subscribe(sessionId: SessionId, listener: TokenStreamListener): () => void;
|
|
43
|
+
/**
|
|
44
|
+
* Subscribe to token stream events from all sessions.
|
|
45
|
+
* The listener receives every event pushed to the bus,
|
|
46
|
+
* regardless of session.
|
|
47
|
+
*
|
|
48
|
+
* @returns An unsubscribe function. Calling it removes the listener.
|
|
49
|
+
*/
|
|
50
|
+
subscribeAll(listener: TokenStreamListener): () => void;
|
|
51
|
+
/**
|
|
52
|
+
* Signal that a session has ended. Removes the session's
|
|
53
|
+
* per-session listener set.
|
|
54
|
+
*/
|
|
55
|
+
endSession(sessionId: SessionId): void;
|
|
56
|
+
}
|
|
57
|
+
/** Creates a new TokenStreamBus instance. */
|
|
58
|
+
export declare function createTokenStreamBus(): TokenStreamBus;
|
|
59
|
+
/**
|
|
60
|
+
* Returns the module-scoped singleton TokenStreamBus, creating it on
|
|
61
|
+
* first access. Subsequent calls return the same instance.
|
|
62
|
+
*
|
|
63
|
+
* Use this from daemon-level producers/consumers (MITM proxy, web UI
|
|
64
|
+
* bridge, observe CLI) that all need to share a single bus. Tests that
|
|
65
|
+
* want isolated, stack-local instances should call `createTokenStreamBus()`
|
|
66
|
+
* directly.
|
|
67
|
+
*/
|
|
68
|
+
export declare function getTokenStreamBus(): TokenStreamBus;
|
|
69
|
+
/**
|
|
70
|
+
* Clears the module-scoped singleton so the next `getTokenStreamBus()`
|
|
71
|
+
* call returns a fresh instance. Intended for test `beforeEach` hooks.
|
|
72
|
+
*
|
|
73
|
+
* INVARIANT: do NOT call this while any `TokenStreamBridge` instance has
|
|
74
|
+
* active subscriptions. The bridge caches bus unsubscribe handles in
|
|
75
|
+
* `this.subscriptions` / `this.globalUnsubscribe` that are bound to the
|
|
76
|
+
* old bus; after reset, subsequent `addClient`/`addGlobalClient` calls
|
|
77
|
+
* will subscribe on the NEW bus, but events pushed on behalf of old
|
|
78
|
+
* subscriptions still target the stale bus and never reach the new one.
|
|
79
|
+
* The safe pattern is: construct a fresh `TokenStreamBridge` after every
|
|
80
|
+
* reset (i.e. build both in the same `beforeEach`). Daemon production
|
|
81
|
+
* code never resets.
|
|
82
|
+
*/
|
|
83
|
+
export declare function resetTokenStreamBus(): void;
|