@provos/ironcurtain 0.11.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 +9 -7
- 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 +8 -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 +116 -1
- package/dist/config/config-command.js.map +1 -1
- package/dist/config/first-start.js +2 -8
- package/dist/config/first-start.js.map +1 -1
- 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 +48 -6
- package/dist/config/paths.js +63 -8
- package/dist/config/paths.js.map +1 -1
- package/dist/config/user-config.d.ts +48 -1
- package/dist/config/user-config.js +49 -1
- package/dist/config/user-config.js.map +1 -1
- package/dist/daemon/daemon-command.js +14 -5
- package/dist/daemon/daemon-command.js.map +1 -1
- package/dist/daemon/ironcurtain-daemon.d.ts +18 -0
- package/dist/daemon/ironcurtain-daemon.js +22 -1
- 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/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/agent-adapter.d.ts +5 -1
- package/dist/docker/agent-adapter.js +2 -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 +11 -0
- package/dist/docker/code-mode-proxy.js +3 -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.js +30 -1
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-infrastructure.d.ts +186 -9
- package/dist/docker/docker-infrastructure.js +521 -77
- package/dist/docker/docker-infrastructure.js.map +1 -1
- package/dist/docker/docker-manager.d.ts +25 -5
- package/dist/docker/docker-manager.js +262 -22
- 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 +1 -1
- package/dist/docker/mitm-proxy.d.ts +52 -1
- package/dist/docker/mitm-proxy.js +234 -10
- 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 +13 -0
- package/dist/docker/oauth-credentials.js +125 -0
- package/dist/docker/oauth-credentials.js.map +1 -1
- package/dist/docker/package-types.d.ts +1 -1
- package/dist/docker/provider-config.d.ts +29 -1
- package/dist/docker/provider-config.js +93 -3
- 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/pty-session.d.ts +15 -0
- package/dist/docker/pty-session.js +139 -67
- package/dist/docker/pty-session.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 +14 -5
- package/dist/docker/resource-limits.js +11 -8
- package/dist/docker/resource-limits.js.map +1 -1
- 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 +53 -7
- package/dist/doctor/checks.d.ts +36 -3
- package/dist/doctor/checks.js +102 -15
- package/dist/doctor/checks.js.map +1 -1
- package/dist/doctor/doctor-command.js +39 -9
- package/dist/doctor/doctor-command.js.map +1 -1
- package/dist/doctor/mcp-liveness.d.ts +1 -1
- package/dist/doctor/mcp-liveness.js +12 -4
- package/dist/doctor/mcp-liveness.js.map +1 -1
- package/dist/index.js +30 -12
- package/dist/index.js.map +1 -1
- 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.js +19 -6
- package/dist/mux/mux-command.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/observe/observe-command.js +112 -125
- package/dist/observe/observe-command.js.map +1 -1
- 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/persona-command.js +46 -76
- 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/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 +12 -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/pipeline-runner.d.ts +63 -4
- package/dist/pipeline/pipeline-runner.js +159 -50
- package/dist/pipeline/pipeline-runner.js.map +1 -1
- package/dist/pipeline/pipeline-shared.d.ts +32 -3
- package/dist/pipeline/pipeline-shared.js +76 -8
- package/dist/pipeline/pipeline-shared.js.map +1 -1
- package/dist/pipeline/refresh-lists.js +3 -5
- package/dist/pipeline/refresh-lists.js.map +1 -1
- package/dist/sandbox/index.d.ts +19 -4
- package/dist/sandbox/index.js +31 -18
- package/dist/sandbox/index.js.map +1 -1
- package/dist/session/index.js +10 -1
- package/dist/session/index.js.map +1 -1
- package/dist/session/preflight.d.ts +1 -30
- package/dist/session/preflight.js +52 -85
- package/dist/session/preflight.js.map +1 -1
- package/dist/session/types.d.ts +9 -0
- package/dist/signal/bot-command.js +6 -1
- package/dist/signal/bot-command.js.map +1 -1
- package/dist/signal/setup-signal.js +1 -1
- package/dist/signal/setup-signal.js.map +1 -1
- package/dist/signal/signal-container.d.ts +3 -3
- package/dist/signal/signal-container.js +2 -2
- package/dist/signal/signal-container.js.map +1 -1
- package/dist/trusted-process/call-circuit-breaker.d.ts +6 -0
- package/dist/trusted-process/call-circuit-breaker.js +22 -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/mcp-proxy-server.js +35 -3
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/policy-engine.js +13 -2
- package/dist/trusted-process/policy-engine.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 +22 -8
- package/dist/trusted-process/tool-call-coordinator.js +149 -65
- package/dist/trusted-process/tool-call-coordinator.js.map +1 -1
- package/dist/trusted-process/tool-call-pipeline.d.ts +8 -0
- package/dist/trusted-process/tool-call-pipeline.js +68 -34
- package/dist/trusted-process/tool-call-pipeline.js.map +1 -1
- 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/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/persona-dispatch.d.ts +46 -2
- package/dist/web-ui/dispatch/persona-dispatch.js +209 -56
- package/dist/web-ui/dispatch/persona-dispatch.js.map +1 -1
- package/dist/web-ui/dispatch/session-dispatch.js +22 -4
- package/dist/web-ui/dispatch/session-dispatch.js.map +1 -1
- package/dist/web-ui/dispatch/types.d.ts +23 -0
- package/dist/web-ui/dispatch/types.js +4 -0
- package/dist/web-ui/dispatch/types.js.map +1 -1
- package/dist/web-ui/dispatch/workflow-dispatch.js +116 -5
- package/dist/web-ui/dispatch/workflow-dispatch.js.map +1 -1
- package/dist/web-ui/json-rpc-dispatch.js +1 -1
- package/dist/web-ui/json-rpc-dispatch.js.map +1 -1
- package/dist/web-ui/web-event-bus.d.ts +25 -1
- package/dist/web-ui/web-event-bus.js.map +1 -1
- package/dist/web-ui/web-ui-server.d.ts +14 -0
- package/dist/web-ui/web-ui-server.js +16 -0
- package/dist/web-ui/web-ui-server.js.map +1 -1
- package/dist/web-ui/web-ui-types.d.ts +133 -5
- package/dist/web-ui/web-ui-types.js.map +1 -1
- 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/index.html +2 -2
- 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.js +0 -2
- package/dist/workflow/cli-support.js.map +1 -1
- 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/discovery.d.ts +29 -0
- package/dist/workflow/discovery.js +67 -7
- package/dist/workflow/discovery.js.map +1 -1
- 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.d.ts +7 -1
- package/dist/workflow/lint.js +186 -3
- package/dist/workflow/lint.js.map +1 -1
- package/dist/workflow/machine-builder.d.ts +90 -2
- package/dist/workflow/machine-builder.js +222 -29
- package/dist/workflow/machine-builder.js.map +1 -1
- package/dist/workflow/message-log.d.ts +15 -1
- package/dist/workflow/message-log.js.map +1 -1
- package/dist/workflow/orchestrator.d.ts +505 -1
- package/dist/workflow/orchestrator.js +1722 -69
- package/dist/workflow/orchestrator.js.map +1 -1
- package/dist/workflow/prompt-builder.js +2 -1
- package/dist/workflow/prompt-builder.js.map +1 -1
- package/dist/workflow/run-state-command.js +1 -1
- package/dist/workflow/run-state-command.js.map +1 -1
- package/dist/workflow/status-parser.js +19 -4
- package/dist/workflow/status-parser.js.map +1 -1
- package/dist/workflow/types.d.ts +123 -23
- package/dist/workflow/types.js +2 -0
- package/dist/workflow/types.js.map +1 -1
- package/dist/workflow/validate.d.ts +23 -1
- package/dist/workflow/validate.js +311 -22
- package/dist/workflow/validate.js.map +1 -1
- package/dist/workflow/workflow-command.d.ts +0 -17
- package/dist/workflow/workflow-command.js +110 -88
- package/dist/workflow/workflow-command.js.map +1 -1
- package/dist/workflow/workflow-discovery.d.ts +2 -0
- package/dist/workflow/workflow-discovery.js +22 -1
- package/dist/workflow/workflow-discovery.js.map +1 -1
- package/dist/workflow/workflow-manager.d.ts +34 -0
- package/dist/workflow/workflow-manager.js +52 -1
- package/dist/workflow/workflow-manager.js.map +1 -1
- package/dist/workflow/workflows/design-and-code/README.md +50 -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/workflow.yaml +1 -0
- package/dist/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +6 -1
- package/dist/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +1 -0
- package/dist/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +4 -0
- package/dist/workflow/workflows/vuln-discovery/workflow.yaml +13 -8
- package/docker/Dockerfile.base +22 -0
- package/docker/Dockerfile.base.arm64 +18 -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 +6 -45
- package/docker/entrypoint-codex.sh +42 -0
- package/docker/entrypoint-goose.sh +5 -24
- package/docker/entrypoint-uid-remap.sh +93 -0
- package/package.json +9 -4
- package/src/workflow/workflows/design-and-code/README.md +50 -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/workflow.yaml +1 -0
- package/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +6 -1
- package/src/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +1 -0
- package/src/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +4 -0
- package/src/workflow/workflows/vuln-discovery/workflow.yaml +13 -8
- package/dist/web-ui-static/assets/index-BFO5z1js.js +0 -76
- package/dist/web-ui-static/assets/index-CCUwrkIL.css +0 -1
|
@@ -15,6 +15,8 @@ import type { AuthMethod } from './oauth-credentials.js';
|
|
|
15
15
|
* between container and host in both directions.
|
|
16
16
|
*/
|
|
17
17
|
export declare const CONTAINER_WORKSPACE_DIR = "/workspace";
|
|
18
|
+
/** Workflow package helper scripts are mounted read-only at this path. */
|
|
19
|
+
export declare const CONTAINER_SCRIPTS_DIR = "/workflow-scripts";
|
|
18
20
|
/**
|
|
19
21
|
* Structured response from an agent adapter, carrying both the
|
|
20
22
|
* text response and optional cost/usage metadata reported by the agent.
|
|
@@ -260,8 +262,10 @@ export interface AgentAdapter {
|
|
|
260
262
|
*
|
|
261
263
|
* @param exitCode - the container's exit code
|
|
262
264
|
* @param stdout - captured stdout from the container
|
|
265
|
+
* @param stderr - captured stderr from the container, useful for CLIs that
|
|
266
|
+
* report non-zero errors there instead of stdout
|
|
263
267
|
*/
|
|
264
|
-
extractResponse(exitCode: number, stdout: string): AgentResponse;
|
|
268
|
+
extractResponse(exitCode: number, stdout: string, stderr?: string): AgentResponse;
|
|
265
269
|
/**
|
|
266
270
|
* Returns the Docker container command for PTY mode.
|
|
267
271
|
* When provided, the container runs this command directly instead of
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
* between container and host in both directions.
|
|
12
12
|
*/
|
|
13
13
|
export const CONTAINER_WORKSPACE_DIR = '/workspace';
|
|
14
|
+
/** Workflow package helper scripts are mounted read-only at this path. */
|
|
15
|
+
export const CONTAINER_SCRIPTS_DIR = '/workflow-scripts';
|
|
14
16
|
/**
|
|
15
17
|
* Human-readable description of a transient-failure kind, used in
|
|
16
18
|
* user-facing terminal-status text and error messages. Centralized so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-adapter.js","sourceRoot":"","sources":["../../src/docker/agent-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-adapter.js","sourceRoot":"","sources":["../../src/docker/agent-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAEpD,0EAA0E;AAC1E,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAuFzD;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAA0B;IACrE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,qBAAqB;YACxB,OAAO,+DAA+D,CAAC;QACzE,KAAK,cAAc;YACjB,OAAO,2DAA2D,CAAC;IACvE,CAAC;AACH,CAAC"}
|
|
@@ -41,5 +41,10 @@ export async function registerBuiltinAdapters(userConfig) {
|
|
|
41
41
|
const gooseAdapter = createGooseAdapter(userConfig);
|
|
42
42
|
registry.set(gooseAdapter.id, gooseAdapter);
|
|
43
43
|
}
|
|
44
|
+
if (!registry.has('codex')) {
|
|
45
|
+
const { createCodexAdapter } = await import('./adapters/codex.js');
|
|
46
|
+
const codexAdapter = createCodexAdapter();
|
|
47
|
+
registry.set(codexAdapter.id, codexAdapter);
|
|
48
|
+
}
|
|
44
49
|
}
|
|
45
50
|
//# sourceMappingURL=agent-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../../src/docker/agent-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;AAElD,MAAM,UAAU,aAAa,CAAC,OAAqB;IACjD,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAW;IAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,kBAAkB,EAAE,gBAAgB,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,UAA+B;IAC3E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAwB,CAAC,EAAE,CAAC;QAC5C,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC9E,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;QAC9D,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAkB,CAAC,EAAE,CAAC;QACtC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACpD,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../../src/docker/agent-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAC;AAElD,MAAM,UAAU,aAAa,CAAC,OAAqB;IACjD,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAW;IAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,kBAAkB,EAAE,gBAAgB,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,UAA+B;IAC3E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAwB,CAAC,EAAE,CAAC;QAC5C,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC9E,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;QAC9D,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAkB,CAAC,EAAE,CAAC;QACtC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACpD,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAkB,CAAC,EAAE,CAAC;QACtC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;QAC1C,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apple `container` CLI wrapper implementing the ContainerRuntime interface.
|
|
3
|
+
*
|
|
4
|
+
* Peer implementation to docker-manager.ts for macOS 26+ on Apple silicon
|
|
5
|
+
* (see docs/designs/apple-container-runtime.md). Each container runs in its
|
|
6
|
+
* own lightweight VM; networking uses host-only vmnet networks instead of
|
|
7
|
+
* Docker's bridge + sidecar arrangement.
|
|
8
|
+
*
|
|
9
|
+
* This module is the only place allowed to spawn the `container` binary,
|
|
10
|
+
* always via execFile with argument arrays (no shell strings).
|
|
11
|
+
*
|
|
12
|
+
* CLI semantics verified against `container` 1.0.0:
|
|
13
|
+
* - `create`/`start`/`exec`/`stop`/`delete` mirror the Docker verbs;
|
|
14
|
+
* `--init`, `--cap-drop ALL`, `--label`, `--cpus`/`--memory`, `--user`,
|
|
15
|
+
* `--entrypoint`, `-t` all exist with Docker-compatible meanings.
|
|
16
|
+
* - `inspect` family returns JSON only (no Go templates); shapes are
|
|
17
|
+
* parsed below (`AppleContainerInspect` / `AppleImageInspect`).
|
|
18
|
+
* - `network create --internal` creates a host-only vmnet network and
|
|
19
|
+
* duplicate creation fails with "already exists" on stderr.
|
|
20
|
+
* - Inspecting a missing container/image exits non-zero.
|
|
21
|
+
* - No `--add-host`, no `--restart`, no restartable `network connect`:
|
|
22
|
+
* those configs throw instead of being silently dropped.
|
|
23
|
+
*/
|
|
24
|
+
import type { ContainerRuntime, DockerContainerConfig } from './types.js';
|
|
25
|
+
import type { DockerAvailability } from './docker-probe.js';
|
|
26
|
+
import { type ExecFileFn, type CreateDockerManagerOptions } from './docker-manager.js';
|
|
27
|
+
/** Host facts consulted by the availability probe; injectable for tests. */
|
|
28
|
+
export interface AppleContainerHostInfo {
|
|
29
|
+
readonly platform: string;
|
|
30
|
+
readonly arch: string;
|
|
31
|
+
/** Darwin kernel release, e.g. "25.5.0" (macOS 26.5). */
|
|
32
|
+
readonly release: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Availability probe for the Apple container runtime. Mirrors the shape of
|
|
36
|
+
* `checkDockerAvailable` so mode selection can treat backends uniformly.
|
|
37
|
+
*/
|
|
38
|
+
export declare function checkAppleContainerAvailable(execFileFn?: ExecFileFn, host?: AppleContainerHostInfo): Promise<DockerAvailability>;
|
|
39
|
+
/**
|
|
40
|
+
* Builds the `container create` argument list from a container config.
|
|
41
|
+
* Exported for testing.
|
|
42
|
+
*
|
|
43
|
+
* Configs that encode Docker-only mechanisms (`extraHosts`, `restartPolicy`,
|
|
44
|
+
* `network: 'none'`) throw rather than being silently dropped: they only
|
|
45
|
+
* occur on the Docker-specific topologies, and reaching here with one set
|
|
46
|
+
* means a wiring bug, not a portable request.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildAppleCreateArgs(config: DockerContainerConfig): string[];
|
|
49
|
+
export declare function createAppleContainerManager(execFileFn?: ExecFileFn, availabilityProbe?: (execFileFn?: ExecFileFn) => Promise<DockerAvailability>, spawnOpts?: CreateDockerManagerOptions): ContainerRuntime;
|
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apple `container` CLI wrapper implementing the ContainerRuntime interface.
|
|
3
|
+
*
|
|
4
|
+
* Peer implementation to docker-manager.ts for macOS 26+ on Apple silicon
|
|
5
|
+
* (see docs/designs/apple-container-runtime.md). Each container runs in its
|
|
6
|
+
* own lightweight VM; networking uses host-only vmnet networks instead of
|
|
7
|
+
* Docker's bridge + sidecar arrangement.
|
|
8
|
+
*
|
|
9
|
+
* This module is the only place allowed to spawn the `container` binary,
|
|
10
|
+
* always via execFile with argument arrays (no shell strings).
|
|
11
|
+
*
|
|
12
|
+
* CLI semantics verified against `container` 1.0.0:
|
|
13
|
+
* - `create`/`start`/`exec`/`stop`/`delete` mirror the Docker verbs;
|
|
14
|
+
* `--init`, `--cap-drop ALL`, `--label`, `--cpus`/`--memory`, `--user`,
|
|
15
|
+
* `--entrypoint`, `-t` all exist with Docker-compatible meanings.
|
|
16
|
+
* - `inspect` family returns JSON only (no Go templates); shapes are
|
|
17
|
+
* parsed below (`AppleContainerInspect` / `AppleImageInspect`).
|
|
18
|
+
* - `network create --internal` creates a host-only vmnet network and
|
|
19
|
+
* duplicate creation fails with "already exists" on stderr.
|
|
20
|
+
* - Inspecting a missing container/image exits non-zero.
|
|
21
|
+
* - No `--add-host`, no `--restart`, no restartable `network connect`:
|
|
22
|
+
* those configs throw instead of being silently dropped.
|
|
23
|
+
*/
|
|
24
|
+
import { arch, platform, release } from 'node:os';
|
|
25
|
+
import * as logger from '../logger.js';
|
|
26
|
+
import { isExecError, isExecTimeout } from '../utils/exec-error.js';
|
|
27
|
+
import { defaultExecFile, DEFAULT_EXEC_TIMEOUT_MS, PULL_IDLE_TIMEOUT_MS, BUILD_IDLE_TIMEOUT_MS, IRONCURTAIN_LABEL_BUNDLE, IRONCURTAIN_LABEL_WORKFLOW, IRONCURTAIN_LABEL_SCOPE, makeRunStreamed, } from './docker-manager.js';
|
|
28
|
+
import { createDockerProgressSink } from './docker-progress-sink.js';
|
|
29
|
+
/** Grace period for `container stop` before the runtime kills the VM. */
|
|
30
|
+
const STOP_TIMEOUT_SECONDS = 10;
|
|
31
|
+
/** Minimum supported `container` CLI major version (1.0.0 stability line). */
|
|
32
|
+
const MIN_MAJOR_VERSION = 1;
|
|
33
|
+
/**
|
|
34
|
+
* Minimum Darwin kernel major for macOS 26. The `container network`
|
|
35
|
+
* commands this backend depends on do not function on macOS 15 (Darwin 24).
|
|
36
|
+
*/
|
|
37
|
+
const MIN_DARWIN_MAJOR = 25;
|
|
38
|
+
function firstInspectEntry(stdout) {
|
|
39
|
+
const parsed = JSON.parse(stdout);
|
|
40
|
+
return parsed[0];
|
|
41
|
+
}
|
|
42
|
+
/** Digests appear both bare and `sha256:`-prefixed; compare normalized. */
|
|
43
|
+
function normalizeDigest(digest) {
|
|
44
|
+
return digest.startsWith('sha256:') ? digest.slice('sha256:'.length) : digest;
|
|
45
|
+
}
|
|
46
|
+
/** Rejects with a consistent "feature is Docker-only" error for unsupported runtime ops. */
|
|
47
|
+
function unsupported(feature) {
|
|
48
|
+
return Promise.reject(new Error(`apple-container does not support ${feature}; use the Docker backend`));
|
|
49
|
+
}
|
|
50
|
+
function currentHostInfo() {
|
|
51
|
+
return { platform: platform(), arch: arch(), release: release() };
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Availability probe for the Apple container runtime. Mirrors the shape of
|
|
55
|
+
* `checkDockerAvailable` so mode selection can treat backends uniformly.
|
|
56
|
+
*/
|
|
57
|
+
export async function checkAppleContainerAvailable(execFileFn = defaultExecFile, host = currentHostInfo()) {
|
|
58
|
+
if (host.platform !== 'darwin' || host.arch !== 'arm64') {
|
|
59
|
+
return {
|
|
60
|
+
available: false,
|
|
61
|
+
reason: 'apple-container requires macOS on Apple silicon',
|
|
62
|
+
detailedMessage: 'The Apple container runtime only runs on Apple silicon Macs.',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const darwinMajor = Number.parseInt(host.release.split('.')[0] ?? '0', 10);
|
|
66
|
+
if (darwinMajor < MIN_DARWIN_MAJOR) {
|
|
67
|
+
return {
|
|
68
|
+
available: false,
|
|
69
|
+
reason: 'apple-container requires macOS 26 or later',
|
|
70
|
+
detailedMessage: 'The `container network` commands this backend depends on do not function before macOS 26. ' +
|
|
71
|
+
'Upgrade macOS or use the Docker backend.',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
let versionLine;
|
|
75
|
+
try {
|
|
76
|
+
const { stdout } = await execFileFn('container', ['--version'], { timeout: 10_000 });
|
|
77
|
+
versionLine = stdout.trim();
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return {
|
|
81
|
+
available: false,
|
|
82
|
+
reason: 'container CLI not installed',
|
|
83
|
+
detailedMessage: 'The `container` binary was not found. Install it from https://github.com/apple/container/releases ' +
|
|
84
|
+
'and start its services with `container system start`.',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const match = /version\s+(\d+)\.(\d+)\.(\d+)/.exec(versionLine);
|
|
88
|
+
const major = match ? Number.parseInt(match[1], 10) : 0;
|
|
89
|
+
if (!match || major < MIN_MAJOR_VERSION) {
|
|
90
|
+
return {
|
|
91
|
+
available: false,
|
|
92
|
+
reason: `container CLI too old (need >= ${MIN_MAJOR_VERSION}.0.0)`,
|
|
93
|
+
detailedMessage: `Found "${versionLine}" but IronCurtain requires the ${MIN_MAJOR_VERSION}.0.0 stability line. ` +
|
|
94
|
+
'Upgrade from https://github.com/apple/container/releases.',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
await execFileFn('container', ['system', 'status'], { timeout: 10_000 });
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return {
|
|
102
|
+
available: false,
|
|
103
|
+
reason: 'container services not running',
|
|
104
|
+
detailedMessage: 'The container apiserver is not running. Start it with `container system start`.',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return { available: true };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Builds the `container create` argument list from a container config.
|
|
111
|
+
* Exported for testing.
|
|
112
|
+
*
|
|
113
|
+
* Configs that encode Docker-only mechanisms (`extraHosts`, `restartPolicy`,
|
|
114
|
+
* `network: 'none'`) throw rather than being silently dropped: they only
|
|
115
|
+
* occur on the Docker-specific topologies, and reaching here with one set
|
|
116
|
+
* means a wiring bug, not a portable request.
|
|
117
|
+
*/
|
|
118
|
+
export function buildAppleCreateArgs(config) {
|
|
119
|
+
if (config.extraHosts && config.extraHosts.length > 0) {
|
|
120
|
+
throw new Error('apple-container does not support extra host mappings (--add-host); use a host-only network');
|
|
121
|
+
}
|
|
122
|
+
if (config.restartPolicy) {
|
|
123
|
+
throw new Error('apple-container does not support restart policies');
|
|
124
|
+
}
|
|
125
|
+
if (config.network === 'none') {
|
|
126
|
+
throw new Error("apple-container has no '--network=none'; use an --internal (host-only) network");
|
|
127
|
+
}
|
|
128
|
+
const args = ['create'];
|
|
129
|
+
args.push('--name', config.name);
|
|
130
|
+
args.push('--network', config.network);
|
|
131
|
+
// Reap-and-forward init for the workload, same rationale as Docker's
|
|
132
|
+
// --init (zombie children under `sleep infinity`; see docker-manager.ts).
|
|
133
|
+
// vminitd is the VM's PID 1 regardless; this adds the in-container init.
|
|
134
|
+
args.push('--init');
|
|
135
|
+
// Security: drop all capabilities, then selectively re-add. Inside the
|
|
136
|
+
// per-container VM this guards the workload, not the host boundary.
|
|
137
|
+
args.push('--cap-drop', 'ALL');
|
|
138
|
+
for (const cap of config.capAdd ?? []) {
|
|
139
|
+
args.push('--cap-add', cap);
|
|
140
|
+
}
|
|
141
|
+
for (const port of config.ports ?? []) {
|
|
142
|
+
args.push('--publish', port);
|
|
143
|
+
}
|
|
144
|
+
// Same present-or-absent label contract as buildCreateArgs (docker).
|
|
145
|
+
if (config.bundleLabel !== undefined) {
|
|
146
|
+
args.push('--label', `${IRONCURTAIN_LABEL_BUNDLE}=${config.bundleLabel}`);
|
|
147
|
+
}
|
|
148
|
+
if (config.workflowLabel !== undefined) {
|
|
149
|
+
args.push('--label', `${IRONCURTAIN_LABEL_WORKFLOW}=${config.workflowLabel}`);
|
|
150
|
+
}
|
|
151
|
+
if (config.scopeLabel !== undefined) {
|
|
152
|
+
args.push('--label', `${IRONCURTAIN_LABEL_SCOPE}=${config.scopeLabel}`);
|
|
153
|
+
}
|
|
154
|
+
if (config.resources?.memoryMb) {
|
|
155
|
+
args.push('--memory', `${config.resources.memoryMb}M`);
|
|
156
|
+
}
|
|
157
|
+
if (config.resources?.cpus) {
|
|
158
|
+
args.push('--cpus', String(config.resources.cpus));
|
|
159
|
+
}
|
|
160
|
+
for (const mount of config.mounts) {
|
|
161
|
+
// `--mount` is the only syntax with an explicit readonly option. Its
|
|
162
|
+
// comma/equals-separated format has no escaping, so reject paths that
|
|
163
|
+
// would corrupt it rather than emit a wrong mount.
|
|
164
|
+
if (/[,=]/.test(mount.source) || /[,=]/.test(mount.target)) {
|
|
165
|
+
throw new Error(`mount path contains ',' or '=' which the --mount format cannot escape: ${mount.source}`);
|
|
166
|
+
}
|
|
167
|
+
const readonlySuffix = mount.readonly ? ',readonly' : '';
|
|
168
|
+
args.push('--mount', `source=${mount.source},target=${mount.target}${readonlySuffix}`);
|
|
169
|
+
}
|
|
170
|
+
for (const [key, value] of Object.entries(config.env)) {
|
|
171
|
+
args.push('-e', `${key}=${value}`);
|
|
172
|
+
}
|
|
173
|
+
if (config.entrypoint !== undefined) {
|
|
174
|
+
args.push('--entrypoint', config.entrypoint);
|
|
175
|
+
}
|
|
176
|
+
if (config.tty) {
|
|
177
|
+
args.push('-t');
|
|
178
|
+
}
|
|
179
|
+
if (config.user !== undefined) {
|
|
180
|
+
args.push('--user', config.user);
|
|
181
|
+
}
|
|
182
|
+
args.push(config.image);
|
|
183
|
+
args.push(...config.command);
|
|
184
|
+
return args;
|
|
185
|
+
}
|
|
186
|
+
export function createAppleContainerManager(execFileFn, availabilityProbe = checkAppleContainerAvailable, spawnOpts) {
|
|
187
|
+
const exec = execFileFn ?? defaultExecFile;
|
|
188
|
+
const streamOpts = {
|
|
189
|
+
spawn: spawnOpts?.spawn,
|
|
190
|
+
stdoutSink: spawnOpts?.stdoutSink,
|
|
191
|
+
stderrSink: spawnOpts?.stderrSink,
|
|
192
|
+
};
|
|
193
|
+
const progressSinkFactory = spawnOpts?.progressSinkFactory ?? createDockerProgressSink;
|
|
194
|
+
const runStreamed = makeRunStreamed('container', streamOpts, progressSinkFactory);
|
|
195
|
+
const inspectContainer = async (nameOrId, timeout) => {
|
|
196
|
+
const { stdout } = await exec('container', ['inspect', nameOrId], { timeout });
|
|
197
|
+
return firstInspectEntry(stdout);
|
|
198
|
+
};
|
|
199
|
+
return {
|
|
200
|
+
async preflight(image) {
|
|
201
|
+
const status = await availabilityProbe(execFileFn);
|
|
202
|
+
if (!status.available) {
|
|
203
|
+
throw new Error(`Apple container runtime is not available. ${status.detailedMessage}`);
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
await exec('container', ['image', 'inspect', image], { timeout: 10_000 });
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
throw new Error(`Container image not found: ${image}. Build it first.`);
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
async create(config) {
|
|
213
|
+
const args = buildAppleCreateArgs(config);
|
|
214
|
+
const { stdout } = await exec('container', args, { timeout: 60_000 });
|
|
215
|
+
return stdout.trim();
|
|
216
|
+
},
|
|
217
|
+
async start(nameOrId) {
|
|
218
|
+
await exec('container', ['start', nameOrId], { timeout: 60_000 });
|
|
219
|
+
},
|
|
220
|
+
async exec(nameOrId, command, timeoutMs, execUser) {
|
|
221
|
+
const timeout = timeoutMs ?? DEFAULT_EXEC_TIMEOUT_MS;
|
|
222
|
+
// Same --user resolution contract as the Docker implementation (see
|
|
223
|
+
// ContainerRuntime.exec JSDoc): undefined → 'codespace', null → omit.
|
|
224
|
+
const resolvedUser = execUser === undefined ? 'codespace' : execUser;
|
|
225
|
+
const userArgs = resolvedUser === null ? [] : ['--user', resolvedUser];
|
|
226
|
+
try {
|
|
227
|
+
const { stdout, stderr } = await exec('container', ['exec', ...userArgs, nameOrId, ...command], {
|
|
228
|
+
timeout,
|
|
229
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
230
|
+
});
|
|
231
|
+
return { exitCode: 0, stdout, stderr };
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
if (isExecError(err)) {
|
|
235
|
+
if (isExecTimeout(err)) {
|
|
236
|
+
logger.warn(`[apple-container-manager] exec timed out after ${timeout}ms (killed=${String(err.killed)}, ` +
|
|
237
|
+
`signal=${err.signal ?? 'none'}): container exec ${nameOrId} ${command[0] ?? ''}`);
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
exitCode: typeof err.code === 'number' ? err.code : 1,
|
|
241
|
+
stdout: err.stdout,
|
|
242
|
+
stderr: err.stderr,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
throw err;
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
async stop(nameOrId) {
|
|
249
|
+
try {
|
|
250
|
+
await exec('container', ['stop', '--time', String(STOP_TIMEOUT_SECONDS), nameOrId], {
|
|
251
|
+
timeout: (STOP_TIMEOUT_SECONDS + 5) * 1000,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// Container may already be stopped
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
async remove(nameOrId) {
|
|
259
|
+
try {
|
|
260
|
+
await exec('container', ['delete', '--force', nameOrId], { timeout: 30_000 });
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
// Container may already be removed
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
async isRunning(nameOrId) {
|
|
267
|
+
try {
|
|
268
|
+
const entry = await inspectContainer(nameOrId, 5_000);
|
|
269
|
+
return entry?.status?.state === 'running';
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
async imageExists(image) {
|
|
276
|
+
try {
|
|
277
|
+
await exec('container', ['image', 'inspect', image], { timeout: 10_000 });
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
async buildImage(tag, dockerfilePath, contextDir, labels) {
|
|
285
|
+
const args = ['build', '--progress', 'plain', '-t', tag, '-f', dockerfilePath];
|
|
286
|
+
if (labels) {
|
|
287
|
+
for (const [key, value] of Object.entries(labels)) {
|
|
288
|
+
args.push('--label', `${key}=${value}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
args.push(contextDir);
|
|
292
|
+
try {
|
|
293
|
+
await runStreamed({
|
|
294
|
+
operation: 'container build',
|
|
295
|
+
args,
|
|
296
|
+
idleTimeoutMs: BUILD_IDLE_TIMEOUT_MS,
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
catch (err) {
|
|
300
|
+
// The BuildKit builder VM currently requires Rosetta; surface the
|
|
301
|
+
// one-command fix instead of the raw virtualization error.
|
|
302
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
303
|
+
if (message.includes('Rosetta is not installed')) {
|
|
304
|
+
throw new Error(`container build failed: the BuildKit builder VM requires Rosetta. ` +
|
|
305
|
+
`Install it with \`softwareupdate --install-rosetta --agree-to-license\` and retry.\n${message}`, { cause: err });
|
|
306
|
+
}
|
|
307
|
+
throw err;
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
async getImageLabel(image, label) {
|
|
311
|
+
try {
|
|
312
|
+
const { stdout } = await exec('container', ['image', 'inspect', image], { timeout: 10_000 });
|
|
313
|
+
const entry = firstInspectEntry(stdout);
|
|
314
|
+
for (const variant of entry?.variants ?? []) {
|
|
315
|
+
const value = variant.config?.config?.Labels?.[label];
|
|
316
|
+
if (value !== undefined)
|
|
317
|
+
return value;
|
|
318
|
+
}
|
|
319
|
+
return undefined;
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
// Workflow snapshot/image management (commit, removeImage, listImages,
|
|
326
|
+
// inspectImage) is Docker-only. The orchestrator's snapshot paths call
|
|
327
|
+
// createDockerManager() directly, so these are never reached on the
|
|
328
|
+
// apple-container backend; reject loudly rather than degrade silently.
|
|
329
|
+
commit: () => unsupported('image commit (workflow snapshots)'),
|
|
330
|
+
removeImage: () => unsupported('image removal'),
|
|
331
|
+
listImages: () => unsupported('image listing'),
|
|
332
|
+
inspectImage: () => unsupported('image inspection'),
|
|
333
|
+
async getContainerLabel(container, label) {
|
|
334
|
+
try {
|
|
335
|
+
const entry = await inspectContainer(container, 5_000);
|
|
336
|
+
return entry?.configuration?.labels?.[label];
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
return undefined;
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
async createNetwork(name, options) {
|
|
343
|
+
if (options?.gateway) {
|
|
344
|
+
throw new Error('apple-container networks do not support an explicit gateway; the runtime assigns it');
|
|
345
|
+
}
|
|
346
|
+
try {
|
|
347
|
+
const args = ['network', 'create'];
|
|
348
|
+
if (options?.internal)
|
|
349
|
+
args.push('--internal');
|
|
350
|
+
if (options?.subnet)
|
|
351
|
+
args.push('--subnet', options.subnet);
|
|
352
|
+
args.push(name);
|
|
353
|
+
await exec('container', args, { timeout: 30_000 });
|
|
354
|
+
}
|
|
355
|
+
catch (err) {
|
|
356
|
+
if (isExecError(err) && err.stderr.includes('already exists'))
|
|
357
|
+
return;
|
|
358
|
+
throw err;
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
async removeNetwork(name) {
|
|
362
|
+
try {
|
|
363
|
+
await exec('container', ['network', 'delete', name], { timeout: 30_000 });
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
// Ignore errors -- network may already be removed
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
async pullImage(image) {
|
|
370
|
+
await runStreamed({
|
|
371
|
+
operation: 'container pull',
|
|
372
|
+
args: ['image', 'pull', '--progress', 'plain', image],
|
|
373
|
+
idleTimeoutMs: PULL_IDLE_TIMEOUT_MS,
|
|
374
|
+
});
|
|
375
|
+
},
|
|
376
|
+
async getImageId(nameOrId) {
|
|
377
|
+
// Try as image first (returns the image's own digest)
|
|
378
|
+
try {
|
|
379
|
+
const { stdout } = await exec('container', ['image', 'inspect', nameOrId], { timeout: 5_000 });
|
|
380
|
+
const id = firstInspectEntry(stdout)?.id;
|
|
381
|
+
if (id)
|
|
382
|
+
return normalizeDigest(id);
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
// Not an image - fall through to container inspection
|
|
386
|
+
}
|
|
387
|
+
// Try as container (returns the digest of the image it was created from)
|
|
388
|
+
try {
|
|
389
|
+
const entry = await inspectContainer(nameOrId, 5_000);
|
|
390
|
+
const digest = entry?.configuration?.image?.descriptor?.digest;
|
|
391
|
+
return digest ? normalizeDigest(digest) : undefined;
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
return undefined;
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
async getNetworkGateway(name) {
|
|
398
|
+
try {
|
|
399
|
+
const { stdout } = await exec('container', ['network', 'inspect', name], { timeout: 10_000 });
|
|
400
|
+
const entry = firstInspectEntry(stdout);
|
|
401
|
+
return entry?.status?.ipv4Gateway;
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
return undefined;
|
|
405
|
+
}
|
|
406
|
+
},
|
|
407
|
+
connectNetwork() {
|
|
408
|
+
// Only the Docker tcp-sidecar topology attaches a running container
|
|
409
|
+
// to a second network; the host-only topology never needs it.
|
|
410
|
+
return Promise.reject(new Error('apple-container does not support connecting a container to additional networks'));
|
|
411
|
+
},
|
|
412
|
+
async getContainerIp(containerId, network) {
|
|
413
|
+
// The address may not be assigned immediately after start; retry
|
|
414
|
+
// briefly, mirroring the Docker implementation.
|
|
415
|
+
const maxAttempts = 5;
|
|
416
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
417
|
+
const entry = await inspectContainer(containerId, 10_000);
|
|
418
|
+
const attachment = entry?.status?.networks?.find((n) => n.network === network);
|
|
419
|
+
const cidr = attachment?.ipv4Address;
|
|
420
|
+
if (cidr) {
|
|
421
|
+
const ip = cidr.split('/')[0];
|
|
422
|
+
if (ip)
|
|
423
|
+
return ip;
|
|
424
|
+
}
|
|
425
|
+
if (attempt < maxAttempts) {
|
|
426
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
throw new Error(`No IP address found for container ${containerId} on network ${network}`);
|
|
430
|
+
},
|
|
431
|
+
async containerExists(nameOrId) {
|
|
432
|
+
try {
|
|
433
|
+
// `container inspect` exits non-zero when the container does not
|
|
434
|
+
// exist, for both running and stopped containers otherwise.
|
|
435
|
+
await exec('container', ['inspect', nameOrId], { timeout: 5_000 });
|
|
436
|
+
return true;
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
},
|
|
442
|
+
async removeStaleContainer(name) {
|
|
443
|
+
const exists = await this.containerExists(name);
|
|
444
|
+
if (!exists)
|
|
445
|
+
return false;
|
|
446
|
+
// Verify the container belongs to IronCurtain before removing it,
|
|
447
|
+
// same `ironcurtain.bundle` ownership check as the Docker backend.
|
|
448
|
+
const label = await this.getContainerLabel(name, IRONCURTAIN_LABEL_BUNDLE);
|
|
449
|
+
if (!label) {
|
|
450
|
+
logger.warn(`Container "${name}" exists but lacks ${IRONCURTAIN_LABEL_BUNDLE} label; skipping removal`);
|
|
451
|
+
return false;
|
|
452
|
+
}
|
|
453
|
+
logger.warn(`Removing stale container "${name}" from a previous session`);
|
|
454
|
+
await this.stop(name);
|
|
455
|
+
await this.remove(name);
|
|
456
|
+
// Verify removal succeeded (remove() swallows errors)
|
|
457
|
+
if (await this.containerExists(name)) {
|
|
458
|
+
throw new Error(`Failed to remove stale container "${name}"`);
|
|
459
|
+
}
|
|
460
|
+
return true;
|
|
461
|
+
},
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=apple-container-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apple-container-manager.js","sourceRoot":"","sources":["../../src/docker/apple-container-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,5 +57,16 @@ export interface CodeModeProxyOptions {
|
|
|
57
57
|
readonly config: IronCurtainConfig;
|
|
58
58
|
/** Listen mode: 'uds' (default) or 'tcp'. TCP mode uses OS-assigned port. */
|
|
59
59
|
readonly listenMode?: 'uds' | 'tcp';
|
|
60
|
+
/**
|
|
61
|
+
* TCP bind address. Defaults to 127.0.0.1 (the tcp-sidecar topology,
|
|
62
|
+
* where Docker Desktop forwards `host.docker.internal` to loopback).
|
|
63
|
+
* The tcp-hostonly topology binds 0.0.0.0 — the vmnet gateway interface
|
|
64
|
+
* does not exist until the first container attaches — and MUST pair
|
|
65
|
+
* that with `allowRemoteAddress` to keep the unauthenticated MCP
|
|
66
|
+
* endpoint off the LAN. Ignored in UDS mode.
|
|
67
|
+
*/
|
|
68
|
+
readonly bindHost?: string;
|
|
69
|
+
/** Connection-source filter forwarded to the TCP transport. Ignored in UDS mode. */
|
|
70
|
+
readonly allowRemoteAddress?: (remoteAddress: string | undefined) => boolean;
|
|
60
71
|
}
|
|
61
72
|
export declare function createCodeModeProxy(options: CodeModeProxyOptions): DockerProxy;
|
|
@@ -113,7 +113,9 @@ export function createCodeModeProxy(options) {
|
|
|
113
113
|
});
|
|
114
114
|
// 3. Start the transport
|
|
115
115
|
if (useTcp) {
|
|
116
|
-
transport = new TcpServerTransport('127.0.0.1', 0
|
|
116
|
+
transport = new TcpServerTransport(options.bindHost ?? '127.0.0.1', 0, {
|
|
117
|
+
allowRemoteAddress: options.allowRemoteAddress,
|
|
118
|
+
});
|
|
117
119
|
}
|
|
118
120
|
else {
|
|
119
121
|
transport = new UdsServerTransport(options.socketPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-mode-proxy.js","sourceRoot":"","sources":["../../src/docker/code-mode-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,OAAO,EAAiB,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"code-mode-proxy.js","sourceRoot":"","sources":["../../src/docker/code-mode-proxy.ts"],"names":[],"mappings":"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"}
|