@provos/ironcurtain 0.11.0 → 0.13.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 +23 -19
- 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 +14 -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.d.ts +33 -1
- package/dist/config/config-command.js +723 -11
- 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/openrouter-catalog.d.ts +46 -0
- package/dist/config/openrouter-catalog.js +111 -0
- package/dist/config/openrouter-catalog.js.map +1 -0
- package/dist/config/openrouter-models-fallback.d.ts +15 -0
- package/dist/config/openrouter-models-fallback.js +49 -0
- package/dist/config/openrouter-models-fallback.js.map +1 -0
- 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/types.d.ts +8 -0
- package/dist/config/user-config.d.ts +179 -6
- package/dist/config/user-config.js +282 -5
- 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 +28 -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/claude-code.js +109 -1
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/adapters/codex.d.ts +18 -0
- package/dist/docker/adapters/codex.js +376 -0
- package/dist/docker/adapters/codex.js.map +1 -0
- package/dist/docker/adapters/goose.js +38 -2
- package/dist/docker/adapters/goose.js.map +1 -1
- package/dist/docker/agent-adapter.d.ts +34 -6
- 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 +486 -0
- package/dist/docker/apple-container-manager.js.map +1 -0
- package/dist/docker/ca.js +9 -2
- package/dist/docker/ca.js.map +1 -1
- 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 +9 -0
- 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 +31 -0
- package/dist/docker/docker-agent-session.js +97 -7
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-infrastructure.d.ts +232 -15
- package/dist/docker/docker-infrastructure.js +762 -118
- package/dist/docker/docker-infrastructure.js.map +1 -1
- package/dist/docker/docker-manager.d.ts +25 -5
- package/dist/docker/docker-manager.js +388 -21
- 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/docker-resource-lifecycle.d.ts +71 -0
- package/dist/docker/docker-resource-lifecycle.js +454 -0
- package/dist/docker/docker-resource-lifecycle.js.map +1 -0
- package/dist/docker/gc-command.d.ts +2 -0
- package/dist/docker/gc-command.js +37 -0
- package/dist/docker/gc-command.js.map +1 -0
- package/dist/docker/mitm-proxy.d.ts +58 -5
- package/dist/docker/mitm-proxy.js +338 -26
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/network-topology.d.ts +88 -0
- package/dist/docker/network-topology.js +167 -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/openrouter.d.ts +107 -0
- package/dist/docker/openrouter.js +236 -0
- package/dist/docker/openrouter.js.map +1 -0
- package/dist/docker/orientation.js +1 -1
- package/dist/docker/orientation.js.map +1 -1
- package/dist/docker/package-types.d.ts +1 -1
- package/dist/docker/platform.d.ts +3 -1
- package/dist/docker/platform.js +3 -1
- package/dist/docker/platform.js.map +1 -1
- package/dist/docker/provider-config.d.ts +35 -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 +22 -0
- package/dist/docker/pty-session.js +238 -84
- package/dist/docker/pty-session.js.map +1 -1
- package/dist/docker/pty-types.d.ts +15 -0
- package/dist/docker/pty-types.js +8 -0
- 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 +14 -5
- package/dist/docker/resource-limits.js +11 -8
- package/dist/docker/resource-limits.js.map +1 -1
- package/dist/docker/sse-extractor.js +55 -5
- package/dist/docker/sse-extractor.js.map +1 -1
- package/dist/docker/stream-delay.d.ts +86 -0
- package/dist/docker/stream-delay.js +218 -0
- package/dist/docker/stream-delay.js.map +1 -0
- package/dist/docker/token-stream-types.d.ts +15 -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 +1010 -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 +116 -12
- package/dist/doctor/checks.d.ts +39 -6
- package/dist/doctor/checks.js +129 -25
- 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/escalation/escalation-watcher.js +6 -0
- package/dist/escalation/escalation-watcher.js.map +1 -1
- package/dist/{mux → escalation}/trusted-input.d.ts +7 -4
- package/dist/{mux → escalation}/trusted-input.js +8 -5
- package/dist/escalation/trusted-input.js.map +1 -0
- package/dist/hash.js.map +1 -1
- package/dist/index.js +65 -16
- package/dist/index.js.map +1 -1
- package/dist/mux/mux-app.d.ts +9 -0
- package/dist/mux/mux-app.js +18 -16
- package/dist/mux/mux-app.js.map +1 -1
- package/dist/mux/mux-command.js +26 -8
- package/dist/mux/mux-command.js.map +1 -1
- package/dist/mux/mux-input-handler.d.ts +26 -2
- package/dist/mux/mux-input-handler.js +93 -11
- package/dist/mux/mux-input-handler.js.map +1 -1
- package/dist/mux/mux-renderer.d.ts +2 -1
- package/dist/mux/mux-renderer.js +67 -0
- package/dist/mux/mux-renderer.js.map +1 -1
- package/dist/mux/provider-profile-snapshot.d.ts +44 -0
- package/dist/mux/provider-profile-snapshot.js +56 -0
- package/dist/mux/provider-profile-snapshot.js.map +1 -0
- package/dist/mux/types.d.ts +3 -2
- package/dist/mux/types.js +6 -2
- package/dist/mux/types.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/constitution-compiler.js.map +1 -1
- package/dist/pipeline/generate-with-repair.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/pipeline/scenario-schema-validator.js.map +1 -1
- package/dist/{mux → pty}/pty-bridge.d.ts +41 -3
- package/dist/{mux → pty}/pty-bridge.js +71 -18
- package/dist/pty/pty-bridge.js.map +1 -0
- package/dist/pty/resolve-ironcurtain-bin.d.ts +17 -0
- package/dist/pty/resolve-ironcurtain-bin.js +22 -0
- package/dist/pty/resolve-ironcurtain-bin.js.map +1 -0
- 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/servers/fetch-server.js +2 -0
- package/dist/servers/fetch-server.js.map +1 -1
- package/dist/session/index.d.ts +1 -1
- package/dist/session/index.js +20 -2
- package/dist/session/index.js.map +1 -1
- package/dist/session/preflight.d.ts +20 -35
- package/dist/session/preflight.js +92 -109
- package/dist/session/preflight.js.map +1 -1
- package/dist/session/resource-budget-tracker.js +8 -0
- package/dist/session/resource-budget-tracker.js.map +1 -1
- package/dist/session/session-manager.d.ts +7 -0
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/types.d.ts +23 -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-bot-daemon.d.ts +1 -0
- package/dist/signal/signal-bot-daemon.js +9 -2
- 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 +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-error-utils.js +4 -1
- package/dist/trusted-process/mcp-error-utils.js.map +1 -1
- package/dist/trusted-process/mcp-proxy-server.js +37 -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 +19 -1
- package/dist/trusted-process/tcp-server-transport.js +56 -10
- 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/utils/preflight-checks.js +1 -3
- package/dist/utils/preflight-checks.js.map +1 -1
- package/dist/utils/stdio-guard.d.ts +1 -0
- package/dist/utils/stdio-guard.js +27 -0
- package/dist/utils/stdio-guard.js.map +1 -0
- package/dist/web-ui/__tests__/config-dispatch.test.d.ts +13 -0
- package/dist/web-ui/__tests__/config-dispatch.test.js +383 -0
- package/dist/web-ui/__tests__/config-dispatch.test.js.map +1 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.js +6 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.js.map +1 -1
- 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/config-dispatch.d.ts +15 -0
- package/dist/web-ui/dispatch/config-dispatch.js +277 -0
- package/dist/web-ui/dispatch/config-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/escalation-dispatch.js +11 -2
- package/dist/web-ui/dispatch/escalation-dispatch.js.map +1 -1
- 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/pty-dispatch.d.ts +15 -0
- package/dist/web-ui/dispatch/pty-dispatch.js +66 -0
- package/dist/web-ui/dispatch/pty-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/session-dispatch.js +89 -6
- package/dist/web-ui/dispatch/session-dispatch.js.map +1 -1
- package/dist/web-ui/dispatch/types.d.ts +35 -0
- package/dist/web-ui/dispatch/types.js +42 -1
- 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 +4 -1
- package/dist/web-ui/json-rpc-dispatch.js.map +1 -1
- package/dist/web-ui/pty-session-manager.d.ts +234 -0
- package/dist/web-ui/pty-session-manager.js +599 -0
- package/dist/web-ui/pty-session-manager.js.map +1 -0
- package/dist/web-ui/web-event-bus.d.ts +34 -1
- package/dist/web-ui/web-event-bus.js.map +1 -1
- package/dist/web-ui/web-session-transport.js.map +1 -1
- package/dist/web-ui/web-ui-server.d.ts +22 -0
- package/dist/web-ui/web-ui-server.js +41 -0
- package/dist/web-ui/web-ui-server.js.map +1 -1
- package/dist/web-ui/web-ui-types.d.ts +212 -5
- package/dist/web-ui/web-ui-types.js.map +1 -1
- package/dist/web-ui-static/assets/index-CCVI4nEK.css +1 -0
- package/dist/web-ui-static/assets/index-Dm012gvY.js +114 -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 +595 -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 +1725 -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/shutdown-signals.d.ts +7 -0
- package/dist/workflow/shutdown-signals.js +40 -0
- package/dist/workflow/shutdown-signals.js.map +1 -0
- 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 +118 -94
- 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/README.md +66 -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/README.md +54 -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 +28 -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 +39 -30
- 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/README.md +66 -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/README.md +54 -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/mux/pty-bridge.js.map +0 -1
- package/dist/mux/trusted-input.js.map +0 -1
- package/dist/web-ui-static/assets/index-BFO5z1js.js +0 -76
- package/dist/web-ui-static/assets/index-CCUwrkIL.css +0 -1
- package/packages/web-ui/README.md +0 -113
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomic file-write primitive shared across layers.
|
|
3
|
+
*
|
|
4
|
+
* A neutral leaf with no domain imports, so both offline pipeline tooling
|
|
5
|
+
* (`src/pipeline/`) and live-layer modules (`src/persona/`, etc.) can use it
|
|
6
|
+
* without a layering violation. The raw-text primitive lives here; pipeline
|
|
7
|
+
* artifacts append their own trailing newline on top of it.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Atomically writes raw text using write-to-temp-then-rename.
|
|
11
|
+
*
|
|
12
|
+
* `renameSync` is atomic on POSIX filesystems, so a concurrent reader either
|
|
13
|
+
* sees the complete old file or the complete new file — never a torn write.
|
|
14
|
+
* The parent directory is created if missing.
|
|
15
|
+
*
|
|
16
|
+
* The temp file name is unique per call (`<file>.<pid>.<n>.tmp`) so two writers
|
|
17
|
+
* racing on the SAME target path can't clobber each other's temp and rename the
|
|
18
|
+
* wrong content into place — making the write atomic across concurrent writers,
|
|
19
|
+
* not just concurrent readers. The temp stays in the target's directory so the
|
|
20
|
+
* rename is a same-filesystem (atomic) move.
|
|
21
|
+
*/
|
|
22
|
+
export declare function atomicWriteTextSync(filePath: string, text: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Atomically writes a pretty-printed JSON value (NO trailing newline) via
|
|
25
|
+
* {@link atomicWriteTextSync} (which also creates the parent dir). The
|
|
26
|
+
* no-newline layout matches the historical `persona.json` on-disk convention,
|
|
27
|
+
* so persona-service can use a leaf primitive instead of importing from the
|
|
28
|
+
* escalation domain module. Consumers needing a trailing newline (e.g. pipeline
|
|
29
|
+
* artifacts) append it themselves.
|
|
30
|
+
*/
|
|
31
|
+
export declare function atomicWriteJsonSync(filePath: string, data: unknown): void;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomic file-write primitive shared across layers.
|
|
3
|
+
*
|
|
4
|
+
* A neutral leaf with no domain imports, so both offline pipeline tooling
|
|
5
|
+
* (`src/pipeline/`) and live-layer modules (`src/persona/`, etc.) can use it
|
|
6
|
+
* without a layering violation. The raw-text primitive lives here; pipeline
|
|
7
|
+
* artifacts append their own trailing newline on top of it.
|
|
8
|
+
*/
|
|
9
|
+
import { mkdirSync, writeFileSync, renameSync } from 'node:fs';
|
|
10
|
+
import { dirname } from 'node:path';
|
|
11
|
+
/** Monotonic per-process counter to disambiguate temp files within one process. */
|
|
12
|
+
let tmpCounter = 0;
|
|
13
|
+
/**
|
|
14
|
+
* Atomically writes raw text using write-to-temp-then-rename.
|
|
15
|
+
*
|
|
16
|
+
* `renameSync` is atomic on POSIX filesystems, so a concurrent reader either
|
|
17
|
+
* sees the complete old file or the complete new file — never a torn write.
|
|
18
|
+
* The parent directory is created if missing.
|
|
19
|
+
*
|
|
20
|
+
* The temp file name is unique per call (`<file>.<pid>.<n>.tmp`) so two writers
|
|
21
|
+
* racing on the SAME target path can't clobber each other's temp and rename the
|
|
22
|
+
* wrong content into place — making the write atomic across concurrent writers,
|
|
23
|
+
* not just concurrent readers. The temp stays in the target's directory so the
|
|
24
|
+
* rename is a same-filesystem (atomic) move.
|
|
25
|
+
*/
|
|
26
|
+
export function atomicWriteTextSync(filePath, text) {
|
|
27
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
28
|
+
const tmpPath = `${filePath}.${process.pid}.${tmpCounter++}.tmp`;
|
|
29
|
+
writeFileSync(tmpPath, text);
|
|
30
|
+
renameSync(tmpPath, filePath);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Atomically writes a pretty-printed JSON value (NO trailing newline) via
|
|
34
|
+
* {@link atomicWriteTextSync} (which also creates the parent dir). The
|
|
35
|
+
* no-newline layout matches the historical `persona.json` on-disk convention,
|
|
36
|
+
* so persona-service can use a leaf primitive instead of importing from the
|
|
37
|
+
* escalation domain module. Consumers needing a trailing newline (e.g. pipeline
|
|
38
|
+
* artifacts) append it themselves.
|
|
39
|
+
*/
|
|
40
|
+
export function atomicWriteJsonSync(filePath, data) {
|
|
41
|
+
atomicWriteTextSync(filePath, JSON.stringify(data, null, 2));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=atomic-write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomic-write.js","sourceRoot":"","sources":["../../src/util/atomic-write.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,mFAAmF;AACnF,IAAI,UAAU,GAAG,CAAC,CAAC;AAEnB;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,IAAY;IAChE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CAAC;IACjE,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,IAAa;IACjE,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -148,9 +148,7 @@ function runSandboxViabilityCheck() {
|
|
|
148
148
|
if (signal) {
|
|
149
149
|
message = `V8 sandbox crashed with signal ${signal}.`;
|
|
150
150
|
if (signal === 'SIGSEGV' || signal === 'SIGILL') {
|
|
151
|
-
hint =
|
|
152
|
-
'This is often caused by an incompatible Node.js version (e.g., Node 25). ' +
|
|
153
|
-
'Please use Node.js 22, 23, or 24.';
|
|
151
|
+
hint = 'This is often caused by an unsupported Node.js version. Please use Node.js 22, 24, or 26.';
|
|
154
152
|
}
|
|
155
153
|
}
|
|
156
154
|
else if (stderr.includes('NODE_MODULE_VERSION')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight-checks.js","sourceRoot":"","sources":["../../src/utils/preflight-checks.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"preflight-checks.js","sourceRoot":"","sources":["../../src/utils/preflight-checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function guardStdioStreamErrors(stream?: NodeJS.WriteStream): void;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attaches an `'error'` listener to a stdio stream (default `process.stdout`)
|
|
3
|
+
* that swallows benign pipe-closed errors (`EPIPE` / `ECONNRESET`).
|
|
4
|
+
*
|
|
5
|
+
* Stdio MCP servers (the SDK's `StdioServerTransport`) write responses to the
|
|
6
|
+
* process's stdout. When the peer closes the pipe during shutdown while a write
|
|
7
|
+
* is in flight, Node emits an `'error'` (`EPIPE`) on the stream — and a stream
|
|
8
|
+
* `'error'` with no listener is an *unhandled* error that crashes the whole
|
|
9
|
+
* process. Under vitest's worker pool this surfaces as an opaque "worker exited
|
|
10
|
+
* unexpectedly" with no error text. Swallowing only the benign shutdown codes
|
|
11
|
+
* keeps any real stdout error visible.
|
|
12
|
+
*
|
|
13
|
+
* Idempotent per stream: re-invocations are no-ops, so it is safe to call from
|
|
14
|
+
* multiple module entry points that share a process.
|
|
15
|
+
*/
|
|
16
|
+
const guarded = new WeakSet();
|
|
17
|
+
export function guardStdioStreamErrors(stream = process.stdout) {
|
|
18
|
+
if (guarded.has(stream))
|
|
19
|
+
return;
|
|
20
|
+
guarded.add(stream);
|
|
21
|
+
stream.on('error', (err) => {
|
|
22
|
+
if (err.code === 'EPIPE' || err.code === 'ECONNRESET')
|
|
23
|
+
return;
|
|
24
|
+
process.stderr.write(`[stdio-guard] unexpected stdout error: ${err.message}\n`);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=stdio-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio-guard.js","sourceRoot":"","sources":["../../src/utils/stdio-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAyB,CAAC;AAErD,MAAM,UAAU,sBAAsB,CAAC,SAA6B,OAAO,CAAC,MAAM;IAChF,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO;IAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;QAChD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO;QAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for `config.*` dispatch (config-dispatch.ts).
|
|
3
|
+
*
|
|
4
|
+
* Covers the §12.6 wire contract for `config.getModelProviders` /
|
|
5
|
+
* `config.setModelProviders`: masking, the POLICY_MUTATION_FORBIDDEN gate, the
|
|
6
|
+
* per-profile M5 mask-unchanged/clear/set round-trip, the F7 `native`-key
|
|
7
|
+
* accept-and-drop / reject-other asymmetry, F10 delete-repoints-default, the
|
|
8
|
+
* validation-passthrough rejection (bad `default`), and `config.changed`.
|
|
9
|
+
*
|
|
10
|
+
* Config IO is isolated via a temp `IRONCURTAIN_HOME` (mirroring
|
|
11
|
+
* test/user-config.test.ts) so nothing touches the real ~/.ironcurtain.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for `config.*` dispatch (config-dispatch.ts).
|
|
3
|
+
*
|
|
4
|
+
* Covers the §12.6 wire contract for `config.getModelProviders` /
|
|
5
|
+
* `config.setModelProviders`: masking, the POLICY_MUTATION_FORBIDDEN gate, the
|
|
6
|
+
* per-profile M5 mask-unchanged/clear/set round-trip, the F7 `native`-key
|
|
7
|
+
* accept-and-drop / reject-other asymmetry, F10 delete-repoints-default, the
|
|
8
|
+
* validation-passthrough rejection (bad `default`), and `config.changed`.
|
|
9
|
+
*
|
|
10
|
+
* Config IO is isolated via a temp `IRONCURTAIN_HOME` (mirroring
|
|
11
|
+
* test/user-config.test.ts) so nothing touches the real ~/.ironcurtain.
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
14
|
+
import { mkdtempSync, rmSync, readFileSync, writeFileSync } from 'node:fs';
|
|
15
|
+
import { resolve } from 'node:path';
|
|
16
|
+
import { tmpdir } from 'node:os';
|
|
17
|
+
import { configDispatch } from '../dispatch/config-dispatch.js';
|
|
18
|
+
import { WebEventBus } from '../web-event-bus.js';
|
|
19
|
+
import { RpcError } from '../web-ui-types.js';
|
|
20
|
+
import { loadUserConfig } from '../../config/user-config.js';
|
|
21
|
+
// Env vars that affect config loading; save/restore between tests.
|
|
22
|
+
const ENV_VARS_TO_ISOLATE = ['IRONCURTAIN_HOME', 'OPENROUTER_API_KEY'];
|
|
23
|
+
let testHome;
|
|
24
|
+
const savedEnv = {};
|
|
25
|
+
function configPath() {
|
|
26
|
+
return resolve(testHome, 'config.json');
|
|
27
|
+
}
|
|
28
|
+
/** Writes a raw config.json into the isolated home. */
|
|
29
|
+
function writeConfig(config) {
|
|
30
|
+
writeFileSync(configPath(), JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
31
|
+
}
|
|
32
|
+
/** Reads the raw on-disk config.json (throws if absent). */
|
|
33
|
+
function readConfig() {
|
|
34
|
+
return JSON.parse(readFileSync(configPath(), 'utf-8'));
|
|
35
|
+
}
|
|
36
|
+
/** A minimal dispatch context — only eventBus + allowPolicyMutation are used. */
|
|
37
|
+
function makeCtx(allowPolicyMutation) {
|
|
38
|
+
return {
|
|
39
|
+
eventBus: new WebEventBus(),
|
|
40
|
+
allowPolicyMutation,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async function get(ctx) {
|
|
44
|
+
return (await configDispatch(ctx, 'config.getModelProviders', {}));
|
|
45
|
+
}
|
|
46
|
+
async function set(ctx, params) {
|
|
47
|
+
return (await configDispatch(ctx, 'config.setModelProviders', params));
|
|
48
|
+
}
|
|
49
|
+
const SK_GLM = 'sk-or-v1-glmkeyREDACTED0000000000end';
|
|
50
|
+
const SK_KIMI = 'sk-or-v1-kimikeyREDACTED000000000end';
|
|
51
|
+
const MASK_GLM = 'sk-...end';
|
|
52
|
+
beforeEach(() => {
|
|
53
|
+
testHome = mkdtempSync(resolve(tmpdir(), 'ironcurtain-config-dispatch-'));
|
|
54
|
+
for (const key of ENV_VARS_TO_ISOLATE) {
|
|
55
|
+
savedEnv[key] = process.env[key];
|
|
56
|
+
Reflect.deleteProperty(process.env, key);
|
|
57
|
+
}
|
|
58
|
+
process.env.IRONCURTAIN_HOME = testHome;
|
|
59
|
+
});
|
|
60
|
+
afterEach(() => {
|
|
61
|
+
for (const key of ENV_VARS_TO_ISOLATE) {
|
|
62
|
+
if (savedEnv[key] !== undefined)
|
|
63
|
+
process.env[key] = savedEnv[key];
|
|
64
|
+
else
|
|
65
|
+
Reflect.deleteProperty(process.env, key);
|
|
66
|
+
}
|
|
67
|
+
rmSync(testHome, { recursive: true, force: true });
|
|
68
|
+
});
|
|
69
|
+
describe('config.getModelProviders', () => {
|
|
70
|
+
it('returns native-only registry when modelProviders is absent', async () => {
|
|
71
|
+
writeConfig({ preferredMode: 'container' });
|
|
72
|
+
const dto = await get(makeCtx(false));
|
|
73
|
+
expect(dto.default).toBe('native');
|
|
74
|
+
expect(dto.profiles.native).toEqual({ type: 'native' });
|
|
75
|
+
expect(Object.keys(dto.profiles)).toEqual(['native']);
|
|
76
|
+
});
|
|
77
|
+
it('masks every openrouter profile key; native present and key-less', async () => {
|
|
78
|
+
writeConfig({
|
|
79
|
+
modelProviders: {
|
|
80
|
+
default: 'glm',
|
|
81
|
+
profiles: {
|
|
82
|
+
glm: { type: 'openrouter', apiKey: SK_GLM },
|
|
83
|
+
kimi: { type: 'openrouter', apiKey: SK_KIMI },
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
const dto = await get(makeCtx(false));
|
|
88
|
+
expect(dto.default).toBe('glm');
|
|
89
|
+
// native is always present and carries no key.
|
|
90
|
+
expect(dto.profiles.native).toEqual({ type: 'native' });
|
|
91
|
+
const glm = dto.profiles.glm;
|
|
92
|
+
const kimi = dto.profiles.kimi;
|
|
93
|
+
expect(glm.type).toBe('openrouter');
|
|
94
|
+
expect(kimi.type).toBe('openrouter');
|
|
95
|
+
if (glm.type !== 'openrouter' || kimi.type !== 'openrouter')
|
|
96
|
+
throw new Error('unreachable');
|
|
97
|
+
expect(glm.apiKey).toBe(MASK_GLM);
|
|
98
|
+
expect(kimi.apiKey).toBe('sk-...end');
|
|
99
|
+
// The masks never leak the raw key.
|
|
100
|
+
expect(glm.apiKey).not.toContain('glmkey');
|
|
101
|
+
expect(kimi.apiKey).not.toContain('kimikey');
|
|
102
|
+
});
|
|
103
|
+
it('reports "none" for a profile that shares the env key only (no config apiKey)', async () => {
|
|
104
|
+
writeConfig({
|
|
105
|
+
modelProviders: { profiles: { kimi: { type: 'openrouter' } } },
|
|
106
|
+
});
|
|
107
|
+
const dto = await get(makeCtx(false));
|
|
108
|
+
const kimi = dto.profiles.kimi;
|
|
109
|
+
if (kimi.type !== 'openrouter')
|
|
110
|
+
throw new Error('unreachable');
|
|
111
|
+
expect(kimi.apiKey).toBe('none');
|
|
112
|
+
});
|
|
113
|
+
it('surfaces resolved defaults (perAgent/sessionAffinity) and OMITS modelMap for a minimal profile', async () => {
|
|
114
|
+
writeConfig({
|
|
115
|
+
modelProviders: { profiles: { glm: { type: 'openrouter', apiKey: SK_GLM } } },
|
|
116
|
+
});
|
|
117
|
+
const dto = await get(makeCtx(false));
|
|
118
|
+
const glm = dto.profiles.glm;
|
|
119
|
+
if (glm.type !== 'openrouter')
|
|
120
|
+
throw new Error('unreachable');
|
|
121
|
+
// A default-tracking profile OMITS modelMap so the "track defaults" intent
|
|
122
|
+
// survives a set-back round-trip (rather than materializing DEFAULT_MODEL_MAP).
|
|
123
|
+
expect(glm.modelMap).toBeUndefined();
|
|
124
|
+
expect(glm.sessionAffinity).toBe(true);
|
|
125
|
+
expect(glm.perAgent).toBeDefined();
|
|
126
|
+
});
|
|
127
|
+
it('includes modelMap for a profile with an explicit non-empty map', async () => {
|
|
128
|
+
writeConfig({
|
|
129
|
+
modelProviders: {
|
|
130
|
+
profiles: {
|
|
131
|
+
glm: { type: 'openrouter', apiKey: SK_GLM, modelMap: [{ match: '*', model: 'z-ai/glm-5.2' }] },
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
const dto = await get(makeCtx(false));
|
|
136
|
+
const glm = dto.profiles.glm;
|
|
137
|
+
if (glm.type !== 'openrouter')
|
|
138
|
+
throw new Error('unreachable');
|
|
139
|
+
expect(glm.modelMap).toEqual([{ match: '*', model: 'z-ai/glm-5.2' }]);
|
|
140
|
+
});
|
|
141
|
+
it('includes an explicit empty modelMap (per-agent-only mode, distinct from default-tracking)', async () => {
|
|
142
|
+
writeConfig({
|
|
143
|
+
modelProviders: { profiles: { glm: { type: 'openrouter', apiKey: SK_GLM, modelMap: [] } } },
|
|
144
|
+
});
|
|
145
|
+
const dto = await get(makeCtx(false));
|
|
146
|
+
const glm = dto.profiles.glm;
|
|
147
|
+
if (glm.type !== 'openrouter')
|
|
148
|
+
throw new Error('unreachable');
|
|
149
|
+
expect(glm.modelMap).toEqual([]);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
describe('config.setModelProviders — gate', () => {
|
|
153
|
+
it('returns POLICY_MUTATION_FORBIDDEN when allowPolicyMutation is false', async () => {
|
|
154
|
+
writeConfig({});
|
|
155
|
+
await expect(set(makeCtx(false), { profiles: { glm: { type: 'openrouter', apiKey: SK_GLM } } })).rejects.toMatchObject({ code: 'POLICY_MUTATION_FORBIDDEN' });
|
|
156
|
+
// Nothing was written.
|
|
157
|
+
expect(readConfig().modelProviders).toBeUndefined();
|
|
158
|
+
});
|
|
159
|
+
it('persists the whole section and emits config.changed when the gate is on', async () => {
|
|
160
|
+
writeConfig({});
|
|
161
|
+
const ctx = makeCtx(true);
|
|
162
|
+
const emitSpy = vi.spyOn(ctx.eventBus, 'emit');
|
|
163
|
+
const result = await set(ctx, {
|
|
164
|
+
default: 'glm',
|
|
165
|
+
profiles: { glm: { type: 'openrouter', apiKey: SK_GLM } },
|
|
166
|
+
});
|
|
167
|
+
expect(emitSpy).toHaveBeenCalledWith('config.changed', {});
|
|
168
|
+
expect(result.default).toBe('glm');
|
|
169
|
+
// Persisted with the real key on disk (masked over the wire).
|
|
170
|
+
const onDisk = readConfig().modelProviders;
|
|
171
|
+
expect(onDisk.default).toBe('glm');
|
|
172
|
+
expect(onDisk.profiles.glm.apiKey).toBe(SK_GLM);
|
|
173
|
+
// The get response never returns the raw key.
|
|
174
|
+
const glm = result.profiles.glm;
|
|
175
|
+
if (glm.type !== 'openrouter')
|
|
176
|
+
throw new Error('unreachable');
|
|
177
|
+
expect(glm.apiKey).toBe(MASK_GLM);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
describe('config.setModelProviders — M5 per-profile apiKey', () => {
|
|
181
|
+
function seedTwoProfiles() {
|
|
182
|
+
writeConfig({
|
|
183
|
+
modelProviders: {
|
|
184
|
+
default: 'glm',
|
|
185
|
+
profiles: {
|
|
186
|
+
glm: { type: 'openrouter', apiKey: SK_GLM },
|
|
187
|
+
kimi: { type: 'openrouter', apiKey: SK_KIMI },
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
it('round-trip: set-back the masked DTO verbatim preserves every stored key', async () => {
|
|
193
|
+
seedTwoProfiles();
|
|
194
|
+
const ctx = makeCtx(true);
|
|
195
|
+
// get (masked) -> set-back verbatim (including the native echo, F7).
|
|
196
|
+
const gotten = await get(ctx);
|
|
197
|
+
await set(ctx, { default: gotten.default, profiles: gotten.profiles });
|
|
198
|
+
const onDisk = readConfig().modelProviders;
|
|
199
|
+
expect(onDisk.profiles.glm.apiKey).toBe(SK_GLM);
|
|
200
|
+
expect(onDisk.profiles.kimi.apiKey).toBe(SK_KIMI);
|
|
201
|
+
// native is NOT persisted (always implicit).
|
|
202
|
+
expect(onDisk.profiles.native).toBeUndefined();
|
|
203
|
+
// A subsequent load does not throw.
|
|
204
|
+
expect(() => loadUserConfig({ readOnly: true })).not.toThrow();
|
|
205
|
+
});
|
|
206
|
+
it('empty string clears a profile key; a new string sets it', async () => {
|
|
207
|
+
seedTwoProfiles();
|
|
208
|
+
const ctx = makeCtx(true);
|
|
209
|
+
await set(ctx, {
|
|
210
|
+
default: 'glm',
|
|
211
|
+
profiles: {
|
|
212
|
+
glm: { type: 'openrouter', apiKey: '' }, // clear
|
|
213
|
+
kimi: { type: 'openrouter', apiKey: 'sk-or-v1-BRANDNEWkey0000000000000new' }, // set
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
const onDisk = readConfig().modelProviders;
|
|
217
|
+
// Cleared: apiKey omitted from the persisted profile.
|
|
218
|
+
expect(onDisk.profiles.glm.apiKey).toBeUndefined();
|
|
219
|
+
expect(onDisk.profiles.kimi.apiKey).toBe('sk-or-v1-BRANDNEWkey0000000000000new');
|
|
220
|
+
});
|
|
221
|
+
it('absent apiKey keeps the stored key; null keeps it too', async () => {
|
|
222
|
+
seedTwoProfiles();
|
|
223
|
+
const ctx = makeCtx(true);
|
|
224
|
+
await set(ctx, {
|
|
225
|
+
default: 'glm',
|
|
226
|
+
profiles: {
|
|
227
|
+
glm: { type: 'openrouter' }, // apiKey absent -> keep
|
|
228
|
+
kimi: { type: 'openrouter', apiKey: null }, // null -> keep
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
const onDisk = readConfig().modelProviders;
|
|
232
|
+
expect(onDisk.profiles.glm.apiKey).toBe(SK_GLM);
|
|
233
|
+
expect(onDisk.profiles.kimi.apiKey).toBe(SK_KIMI);
|
|
234
|
+
});
|
|
235
|
+
it('drops a profile omitted from the request (whole-record replace)', async () => {
|
|
236
|
+
seedTwoProfiles();
|
|
237
|
+
const ctx = makeCtx(true);
|
|
238
|
+
await set(ctx, {
|
|
239
|
+
default: 'glm',
|
|
240
|
+
profiles: { glm: { type: 'openrouter', apiKey: MASK_GLM } }, // kimi omitted
|
|
241
|
+
});
|
|
242
|
+
const onDisk = readConfig().modelProviders;
|
|
243
|
+
expect(onDisk.profiles.glm).toBeDefined();
|
|
244
|
+
expect(onDisk.profiles.kimi).toBeUndefined();
|
|
245
|
+
// glm key preserved (mask-equal).
|
|
246
|
+
const glm = onDisk.profiles.glm;
|
|
247
|
+
expect(glm.apiKey).toBe(SK_GLM);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
describe('config.setModelProviders — default-map preservation (round-trip)', () => {
|
|
251
|
+
it('a default-tracking profile stays default-tracking after a GET/SET round-trip', async () => {
|
|
252
|
+
// On-disk profile OMITS modelMap => it tracks DEFAULT_MODEL_MAP.
|
|
253
|
+
writeConfig({
|
|
254
|
+
modelProviders: { profiles: { glm: { type: 'openrouter', apiKey: SK_GLM } } },
|
|
255
|
+
});
|
|
256
|
+
const ctx = makeCtx(true);
|
|
257
|
+
// GET returns the profile with modelMap OMITTED...
|
|
258
|
+
const gotten = await get(ctx);
|
|
259
|
+
const gotGlm = gotten.profiles.glm;
|
|
260
|
+
if (gotGlm.type !== 'openrouter')
|
|
261
|
+
throw new Error('unreachable');
|
|
262
|
+
expect(gotGlm.modelMap).toBeUndefined();
|
|
263
|
+
// ...and setting it back verbatim must NOT materialize DEFAULT_MODEL_MAP.
|
|
264
|
+
await set(ctx, { default: gotten.default, profiles: gotten.profiles });
|
|
265
|
+
const onDisk = readConfig().modelProviders;
|
|
266
|
+
expect(onDisk.profiles.glm.modelMap).toBeUndefined();
|
|
267
|
+
});
|
|
268
|
+
it('an explicit empty modelMap is preserved (not dropped) across a round-trip', async () => {
|
|
269
|
+
writeConfig({
|
|
270
|
+
modelProviders: { profiles: { glm: { type: 'openrouter', apiKey: SK_GLM, modelMap: [] } } },
|
|
271
|
+
});
|
|
272
|
+
const ctx = makeCtx(true);
|
|
273
|
+
const gotten = await get(ctx);
|
|
274
|
+
await set(ctx, { default: gotten.default, profiles: gotten.profiles });
|
|
275
|
+
const onDisk = readConfig().modelProviders;
|
|
276
|
+
expect(onDisk.profiles.glm.modelMap).toEqual([]);
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
describe('config.setModelProviders — F7 native-key asymmetry', () => {
|
|
280
|
+
it('accepts-and-drops a verbatim { type: "native" } under profiles.native', async () => {
|
|
281
|
+
writeConfig({ modelProviders: { profiles: { glm: { type: 'openrouter', apiKey: SK_GLM } } } });
|
|
282
|
+
const ctx = makeCtx(true);
|
|
283
|
+
// Set-back a get response verbatim (which includes native) — must not throw.
|
|
284
|
+
const gotten = await get(ctx);
|
|
285
|
+
await expect(set(ctx, { default: gotten.default, profiles: gotten.profiles })).resolves.toBeDefined();
|
|
286
|
+
const onDisk = readConfig().modelProviders;
|
|
287
|
+
expect(onDisk.profiles.native).toBeUndefined();
|
|
288
|
+
});
|
|
289
|
+
it('rejects any non-native value under the native key', async () => {
|
|
290
|
+
writeConfig({});
|
|
291
|
+
const ctx = makeCtx(true);
|
|
292
|
+
await expect(set(ctx, { profiles: { native: { type: 'openrouter', apiKey: SK_GLM } } })).rejects.toBeInstanceOf(RpcError);
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
describe('config.setModelProviders — F10 delete-repoints-default', () => {
|
|
296
|
+
it('re-points default to native when the request drops the current default profile', async () => {
|
|
297
|
+
writeConfig({
|
|
298
|
+
modelProviders: {
|
|
299
|
+
default: 'glm',
|
|
300
|
+
profiles: {
|
|
301
|
+
glm: { type: 'openrouter', apiKey: SK_GLM },
|
|
302
|
+
kimi: { type: 'openrouter', apiKey: SK_KIMI },
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
const ctx = makeCtx(true);
|
|
307
|
+
// Delete glm (the current default) by omitting it; send default: 'glm' as
|
|
308
|
+
// the naive frontend would after removing it from the local list. Backend
|
|
309
|
+
// must re-point to native rather than persist a dangling default.
|
|
310
|
+
const result = await set(ctx, {
|
|
311
|
+
default: 'glm',
|
|
312
|
+
profiles: { kimi: { type: 'openrouter', apiKey: 'sk-...end' } },
|
|
313
|
+
});
|
|
314
|
+
const onDisk = readConfig().modelProviders;
|
|
315
|
+
expect(onDisk.default).toBe('native');
|
|
316
|
+
expect(onDisk.profiles.glm).toBeUndefined();
|
|
317
|
+
expect(onDisk.profiles.kimi).toBeDefined();
|
|
318
|
+
expect(result.default).toBe('native');
|
|
319
|
+
// The next load does not throw (no dangling default).
|
|
320
|
+
expect(() => loadUserConfig({ readOnly: true })).not.toThrow();
|
|
321
|
+
});
|
|
322
|
+
it('re-points to native when the request DROPS the current default and OMITS default entirely', async () => {
|
|
323
|
+
writeConfig({
|
|
324
|
+
modelProviders: {
|
|
325
|
+
default: 'glm',
|
|
326
|
+
profiles: {
|
|
327
|
+
glm: { type: 'openrouter', apiKey: SK_GLM },
|
|
328
|
+
kimi: { type: 'openrouter', apiKey: SK_KIMI },
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
});
|
|
332
|
+
const ctx = makeCtx(true);
|
|
333
|
+
// A raw client deletes glm (the current default) WITHOUT resending `default`.
|
|
334
|
+
// The shallow merge would preserve the stale `default: 'glm'` and dangle it;
|
|
335
|
+
// the backend must auto-repoint to native rather than reject the write.
|
|
336
|
+
const result = await set(ctx, { profiles: { kimi: { type: 'openrouter', apiKey: 'sk-...end' } } });
|
|
337
|
+
const onDisk = readConfig().modelProviders;
|
|
338
|
+
expect(onDisk.default).toBe('native');
|
|
339
|
+
expect(onDisk.profiles.glm).toBeUndefined();
|
|
340
|
+
expect(result.default).toBe('native');
|
|
341
|
+
expect(() => loadUserConfig({ readOnly: true })).not.toThrow();
|
|
342
|
+
});
|
|
343
|
+
it('leaves the stored default untouched when default is omitted and its profile survives', async () => {
|
|
344
|
+
writeConfig({
|
|
345
|
+
modelProviders: {
|
|
346
|
+
default: 'glm',
|
|
347
|
+
profiles: {
|
|
348
|
+
glm: { type: 'openrouter', apiKey: SK_GLM },
|
|
349
|
+
kimi: { type: 'openrouter', apiKey: SK_KIMI },
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
const ctx = makeCtx(true);
|
|
354
|
+
// Omit `default`; glm (the stored default) is still present, so preservation
|
|
355
|
+
// is correct — the fix must not gratuitously rewrite the default.
|
|
356
|
+
const result = await set(ctx, {
|
|
357
|
+
profiles: { glm: { type: 'openrouter', apiKey: 'sk-...glm' }, kimi: { type: 'openrouter', apiKey: 'sk-...end' } },
|
|
358
|
+
});
|
|
359
|
+
expect(result.default).toBe('glm');
|
|
360
|
+
expect(readConfig().modelProviders.default).toBe('glm');
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
describe('config.setModelProviders — validation passthrough', () => {
|
|
364
|
+
it('rejects a request whose default names a profile that never existed (bad default)', async () => {
|
|
365
|
+
// 'ghost' is neither in the request nor in the stored config, so it is NOT
|
|
366
|
+
// a delete-repoint case — the request itself set a bad default. The backend
|
|
367
|
+
// leaves it dangling so the Zod .refine in saveUserConfig rejects it.
|
|
368
|
+
writeConfig({});
|
|
369
|
+
const ctx = makeCtx(true);
|
|
370
|
+
await expect(set(ctx, { default: 'ghost', profiles: { real: { type: 'openrouter', apiKey: SK_GLM } } })).rejects.toBeInstanceOf(RpcError);
|
|
371
|
+
// Nothing was persisted.
|
|
372
|
+
expect(readConfig().modelProviders).toBeUndefined();
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
describe('config dispatch — routing', () => {
|
|
376
|
+
it('throws MethodNotFoundError for an unknown config method', async () => {
|
|
377
|
+
writeConfig({});
|
|
378
|
+
await expect(configDispatch(makeCtx(false), 'config.bogus', {})).rejects.toMatchObject({
|
|
379
|
+
code: 'METHOD_NOT_FOUND',
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
//# sourceMappingURL=config-dispatch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-dispatch.test.js","sourceRoot":"","sources":["../../../src/web-ui/__tests__/config-dispatch.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -706,6 +706,7 @@ describe('dispatch()', () => {
|
|
|
706
706
|
expect(dto.webUiListening).toBe(true);
|
|
707
707
|
expect(dto.activeSessions).toBe(ctx.sessionManager.size);
|
|
708
708
|
expect(typeof dto.nextFireTime).toBe('string');
|
|
709
|
+
expect(dto.sessionMode).toBe('container');
|
|
709
710
|
});
|
|
710
711
|
it('returns null nextFireTime when no scheduled jobs', () => {
|
|
711
712
|
const handler = createMockHandler({
|
|
@@ -720,6 +721,11 @@ describe('dispatch()', () => {
|
|
|
720
721
|
const dto = buildStatusDto(ctx);
|
|
721
722
|
expect(dto.nextFireTime).toBeNull();
|
|
722
723
|
});
|
|
724
|
+
it('returns builtin sessionMode for builtin daemon mode', () => {
|
|
725
|
+
const ctx = createMockContext({ mode: { kind: 'builtin' } });
|
|
726
|
+
const dto = buildStatusDto(ctx);
|
|
727
|
+
expect(dto.sessionMode).toBe('builtin');
|
|
728
|
+
});
|
|
723
729
|
});
|
|
724
730
|
});
|
|
725
731
|
//# sourceMappingURL=json-rpc-dispatch.test.js.map
|