@provos/ironcurtain 0.9.1 → 0.11.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 +69 -10
- package/dist/auth/oauth-provider.js +1 -4
- package/dist/auth/oauth-provider.js.map +1 -1
- package/dist/cli.js +40 -2
- package/dist/cli.js.map +1 -1
- package/dist/config/config-command.js +174 -10
- package/dist/config/config-command.js.map +1 -1
- package/dist/config/first-start.js +61 -0
- package/dist/config/first-start.js.map +1 -1
- package/dist/config/generated/compiled-policy.json +528 -161
- package/dist/config/generated/test-scenarios.json +4810 -170
- package/dist/config/generated/tool-annotations.json +34 -47
- package/dist/config/index.d.ts +58 -0
- package/dist/config/index.js +97 -15
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-servers.json +2 -2
- package/dist/config/model-provider.d.ts +8 -2
- package/dist/config/model-provider.js +52 -9
- package/dist/config/model-provider.js.map +1 -1
- package/dist/config/paths.d.ts +181 -0
- package/dist/config/paths.js +326 -23
- package/dist/config/paths.js.map +1 -1
- package/dist/config/types.d.ts +7 -1
- package/dist/config/user-config.d.ts +61 -4
- package/dist/config/user-config.js +108 -21
- package/dist/config/user-config.js.map +1 -1
- package/dist/config/validate-policy-dir.d.ts +10 -0
- package/dist/config/validate-policy-dir.js +59 -0
- package/dist/config/validate-policy-dir.js.map +1 -0
- package/dist/cron/compile-task-policy.js +1 -0
- package/dist/cron/compile-task-policy.js.map +1 -1
- package/dist/cron/job-commands.js +22 -2
- package/dist/cron/job-commands.js.map +1 -1
- package/dist/cron/types.d.ts +16 -2
- package/dist/cron/types.js +1 -3
- package/dist/cron/types.js.map +1 -1
- package/dist/daemon/daemon-command.js +16 -2
- package/dist/daemon/daemon-command.js.map +1 -1
- package/dist/daemon/ironcurtain-daemon.d.ts +44 -1
- package/dist/daemon/ironcurtain-daemon.js +210 -8
- package/dist/daemon/ironcurtain-daemon.js.map +1 -1
- package/dist/docker/adapters/claude-code.d.ts +2 -1
- package/dist/docker/adapters/claude-code.js +320 -131
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/adapters/goose.d.ts +12 -11
- package/dist/docker/adapters/goose.js +80 -27
- package/dist/docker/adapters/goose.js.map +1 -1
- package/dist/docker/agent-adapter.d.ts +178 -4
- package/dist/docker/agent-adapter.js +14 -0
- package/dist/docker/agent-adapter.js.map +1 -1
- package/dist/docker/agent-registry.js +3 -2
- package/dist/docker/agent-registry.js.map +1 -1
- package/dist/docker/code-mode-proxy.d.ts +27 -0
- package/dist/docker/code-mode-proxy.js +3 -0
- package/dist/docker/code-mode-proxy.js.map +1 -1
- package/dist/docker/container-lifecycle.d.ts +15 -0
- package/dist/docker/container-lifecycle.js +32 -0
- package/dist/docker/container-lifecycle.js.map +1 -0
- package/dist/docker/docker-agent-session.d.ts +113 -62
- package/dist/docker/docker-agent-session.js +241 -300
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-infrastructure.d.ts +256 -21
- package/dist/docker/docker-infrastructure.js +585 -30
- package/dist/docker/docker-infrastructure.js.map +1 -1
- package/dist/docker/docker-manager.d.ts +36 -1
- package/dist/docker/docker-manager.js +168 -26
- package/dist/docker/docker-manager.js.map +1 -1
- package/dist/docker/docker-progress-sink.d.ts +43 -0
- package/dist/docker/docker-progress-sink.js +299 -0
- package/dist/docker/docker-progress-sink.js.map +1 -0
- package/dist/docker/mitm-proxy.d.ts +90 -1
- package/dist/docker/mitm-proxy.js +720 -40
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/oauth-credentials.d.ts +46 -3
- package/dist/docker/oauth-credentials.js +56 -14
- package/dist/docker/oauth-credentials.js.map +1 -1
- package/dist/docker/oauth-token-manager.js +2 -2
- package/dist/docker/oauth-token-manager.js.map +1 -1
- package/dist/docker/orientation.d.ts +1 -1
- package/dist/docker/provider-config.d.ts +81 -2
- package/dist/docker/provider-config.js +222 -28
- package/dist/docker/provider-config.js.map +1 -1
- package/dist/docker/proxy-tools.d.ts +0 -2
- package/dist/docker/proxy-tools.js +2 -7
- package/dist/docker/proxy-tools.js.map +1 -1
- package/dist/docker/pty-session.d.ts +49 -1
- package/dist/docker/pty-session.js +212 -90
- package/dist/docker/pty-session.js.map +1 -1
- package/dist/docker/pty-types.d.ts +0 -2
- package/dist/docker/pty-types.js +0 -2
- package/dist/docker/pty-types.js.map +1 -1
- package/dist/docker/resource-limits.d.ts +125 -0
- package/dist/docker/resource-limits.js +200 -0
- package/dist/docker/resource-limits.js.map +1 -0
- package/dist/docker/spawn-with-idle-timeout.d.ts +39 -0
- package/dist/docker/spawn-with-idle-timeout.js +152 -0
- package/dist/docker/spawn-with-idle-timeout.js.map +1 -0
- package/dist/docker/sse-extractor.d.ts +51 -0
- package/dist/docker/sse-extractor.js +303 -0
- package/dist/docker/sse-extractor.js.map +1 -0
- package/dist/docker/token-stream-bus.d.ts +83 -0
- package/dist/docker/token-stream-bus.js +98 -0
- package/dist/docker/token-stream-bus.js.map +1 -0
- package/dist/docker/token-stream-types.d.ts +71 -0
- package/dist/docker/token-stream-types.js +8 -0
- package/dist/docker/token-stream-types.js.map +1 -0
- package/dist/docker/types.d.ts +61 -6
- package/dist/doctor/checks.d.ts +138 -0
- package/dist/doctor/checks.js +511 -0
- package/dist/doctor/checks.js.map +1 -0
- package/dist/doctor/doctor-command.d.ts +29 -0
- package/dist/doctor/doctor-command.js +160 -0
- package/dist/doctor/doctor-command.js.map +1 -0
- package/dist/doctor/mcp-liveness.d.ts +28 -0
- package/dist/doctor/mcp-liveness.js +84 -0
- package/dist/doctor/mcp-liveness.js.map +1 -0
- package/dist/doctor/oauth-checks.d.ts +23 -0
- package/dist/doctor/oauth-checks.js +157 -0
- package/dist/doctor/oauth-checks.js.map +1 -0
- package/dist/doctor/output.d.ts +26 -0
- package/dist/doctor/output.js +82 -0
- package/dist/doctor/output.js.map +1 -0
- package/dist/escalation/listener-command.js +0 -3
- package/dist/escalation/listener-command.js.map +1 -1
- package/dist/event-bus/typed-event-bus.d.ts +26 -0
- package/dist/event-bus/typed-event-bus.js +35 -0
- package/dist/event-bus/typed-event-bus.js.map +1 -0
- package/dist/index.js +32 -9
- package/dist/index.js.map +1 -1
- package/dist/logger.js +31 -2
- package/dist/logger.js.map +1 -1
- package/dist/memory/auto-save.d.ts +18 -4
- package/dist/memory/auto-save.js +46 -6
- package/dist/memory/auto-save.js.map +1 -1
- package/dist/memory/memory-policy.d.ts +41 -0
- package/dist/memory/memory-policy.js +36 -0
- package/dist/memory/memory-policy.js.map +1 -0
- package/dist/mux/mux-app.d.ts +2 -0
- package/dist/mux/mux-app.js +30 -34
- package/dist/mux/mux-app.js.map +1 -1
- package/dist/mux/mux-command.d.ts +10 -1
- package/dist/mux/mux-command.js +62 -35
- package/dist/mux/mux-command.js.map +1 -1
- package/dist/mux/mux-renderer.js +22 -17
- package/dist/mux/mux-renderer.js.map +1 -1
- package/dist/mux/pty-bridge.d.ts +2 -0
- package/dist/mux/pty-bridge.js +3 -0
- package/dist/mux/pty-bridge.js.map +1 -1
- package/dist/mux/session-scanner.d.ts +7 -0
- package/dist/mux/session-scanner.js +21 -2
- package/dist/mux/session-scanner.js.map +1 -1
- package/dist/mux/types.d.ts +0 -4
- package/dist/mux/types.js.map +1 -1
- package/dist/{pipeline → observability}/llm-logger.d.ts +9 -3
- package/dist/{pipeline → observability}/llm-logger.js +16 -4
- package/dist/observability/llm-logger.js.map +1 -0
- package/dist/observe/observe-command.d.ts +12 -0
- package/dist/observe/observe-command.js +298 -0
- package/dist/observe/observe-command.js.map +1 -0
- package/dist/observe/observe-renderer.d.ts +24 -0
- package/dist/observe/observe-renderer.js +87 -0
- package/dist/observe/observe-renderer.js.map +1 -0
- package/dist/observe/observe-tui-rain.d.ts +42 -0
- package/dist/observe/observe-tui-rain.js +531 -0
- package/dist/observe/observe-tui-rain.js.map +1 -0
- package/dist/observe/observe-tui-text-panel.d.ts +46 -0
- package/dist/observe/observe-tui-text-panel.js +525 -0
- package/dist/observe/observe-tui-text-panel.js.map +1 -0
- package/dist/observe/observe-tui-types.d.ts +270 -0
- package/dist/observe/observe-tui-types.js +200 -0
- package/dist/observe/observe-tui-types.js.map +1 -0
- package/dist/observe/observe-tui-word-scorer.d.ts +143 -0
- package/dist/observe/observe-tui-word-scorer.js +572 -0
- package/dist/observe/observe-tui-word-scorer.js.map +1 -0
- package/dist/observe/observe-tui.d.ts +59 -0
- package/dist/observe/observe-tui.js +592 -0
- package/dist/observe/observe-tui.js.map +1 -0
- package/dist/persona/compile-persona-policy.js +1 -0
- package/dist/persona/compile-persona-policy.js.map +1 -1
- package/dist/persona/memory-gate.d.ts +19 -0
- package/dist/persona/memory-gate.js +33 -0
- package/dist/persona/memory-gate.js.map +1 -0
- package/dist/persona/persona-command.js +41 -6
- package/dist/persona/persona-command.js.map +1 -1
- package/dist/persona/resolve.d.ts +22 -0
- package/dist/persona/resolve.js +45 -2
- package/dist/persona/resolve.js.map +1 -1
- package/dist/persona/types.d.ts +16 -0
- package/dist/pipeline/annotate.d.ts +7 -1
- package/dist/pipeline/annotate.js +92 -2
- package/dist/pipeline/annotate.js.map +1 -1
- package/dist/pipeline/compile.js +2 -0
- package/dist/pipeline/compile.js.map +1 -1
- package/dist/pipeline/constitution-compiler.d.ts +25 -14
- package/dist/pipeline/constitution-compiler.js +107 -38
- package/dist/pipeline/constitution-compiler.js.map +1 -1
- package/dist/pipeline/dynamic-list-types.d.ts +3 -6
- package/dist/pipeline/dynamic-list-types.js +3 -16
- package/dist/pipeline/dynamic-list-types.js.map +1 -1
- package/dist/pipeline/parallel-progress.d.ts +59 -0
- package/dist/pipeline/parallel-progress.js +263 -0
- package/dist/pipeline/parallel-progress.js.map +1 -0
- package/dist/pipeline/pipeline-runner.d.ts +49 -8
- package/dist/pipeline/pipeline-runner.js +419 -231
- package/dist/pipeline/pipeline-runner.js.map +1 -1
- package/dist/pipeline/pipeline-shared.d.ts +59 -1
- package/dist/pipeline/pipeline-shared.js +127 -12
- package/dist/pipeline/pipeline-shared.js.map +1 -1
- package/dist/pipeline/policy-verifier.js +16 -3
- package/dist/pipeline/policy-verifier.js.map +1 -1
- package/dist/pipeline/proxy-mcp-connections.js +17 -2
- package/dist/pipeline/proxy-mcp-connections.js.map +1 -1
- package/dist/pipeline/scenario-generator.d.ts +4 -8
- package/dist/pipeline/scenario-generator.js +13 -46
- package/dist/pipeline/scenario-generator.js.map +1 -1
- package/dist/pipeline/server-prefilter.d.ts +31 -0
- package/dist/pipeline/server-prefilter.js +115 -0
- package/dist/pipeline/server-prefilter.js.map +1 -0
- package/dist/pipeline/types.d.ts +5 -0
- package/dist/sandbox/index.d.ts +14 -0
- package/dist/sandbox/index.js +335 -116
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/ironcurtain-protocol.d.ts +52 -0
- package/dist/sandbox/ironcurtain-protocol.js +185 -0
- package/dist/sandbox/ironcurtain-protocol.js.map +1 -0
- package/dist/session/agent-session.d.ts +6 -0
- package/dist/session/agent-session.js +16 -5
- package/dist/session/agent-session.js.map +1 -1
- package/dist/session/cli-transport.js +0 -6
- package/dist/session/cli-transport.js.map +1 -1
- package/dist/session/index.d.ts +35 -14
- package/dist/session/index.js +324 -130
- package/dist/session/index.js.map +1 -1
- package/dist/session/preflight.d.ts +50 -13
- package/dist/session/preflight.js +252 -80
- package/dist/session/preflight.js.map +1 -1
- package/dist/session/prompts.d.ts +2 -5
- package/dist/session/prompts.js.map +1 -1
- package/dist/session/session-manager.d.ts +61 -6
- package/dist/session/session-manager.js +72 -10
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/session-metadata.d.ts +21 -5
- package/dist/session/session-metadata.js +34 -12
- package/dist/session/session-metadata.js.map +1 -1
- package/dist/session/types.d.ts +311 -5
- package/dist/session/types.js +57 -1
- package/dist/session/types.js.map +1 -1
- package/dist/signal/setup-signal.js +13 -21
- package/dist/signal/setup-signal.js.map +1 -1
- package/dist/signal/signal-bot-daemon.d.ts +16 -1
- package/dist/signal/signal-bot-daemon.js +39 -27
- package/dist/signal/signal-bot-daemon.js.map +1 -1
- package/dist/signal/signal-container.js +7 -1
- package/dist/signal/signal-container.js.map +1 -1
- package/dist/skills/discovery.d.ts +77 -0
- package/dist/skills/discovery.js +206 -0
- package/dist/skills/discovery.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.js +3 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/staging.d.ts +28 -0
- package/dist/skills/staging.js +68 -0
- package/dist/skills/staging.js.map +1 -0
- package/dist/skills/types.d.ts +46 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/trusted-process/approval-whitelist.d.ts +0 -2
- package/dist/trusted-process/approval-whitelist.js +17 -17
- package/dist/trusted-process/approval-whitelist.js.map +1 -1
- package/dist/trusted-process/async-mutex.d.ts +32 -0
- package/dist/trusted-process/async-mutex.js +50 -0
- package/dist/trusted-process/async-mutex.js.map +1 -0
- package/dist/trusted-process/audit-log.d.ts +38 -1
- package/dist/trusted-process/audit-log.js +82 -13
- package/dist/trusted-process/audit-log.js.map +1 -1
- package/dist/trusted-process/call-circuit-breaker.js +2 -1
- package/dist/trusted-process/call-circuit-breaker.js.map +1 -1
- package/dist/trusted-process/control-server.d.ts +101 -0
- package/dist/trusted-process/control-server.js +282 -0
- package/dist/trusted-process/control-server.js.map +1 -0
- package/dist/trusted-process/domain-utils.d.ts +6 -6
- package/dist/trusted-process/domain-utils.js +7 -23
- package/dist/trusted-process/domain-utils.js.map +1 -1
- package/dist/trusted-process/error-prefixes.d.ts +16 -0
- package/dist/trusted-process/error-prefixes.js +17 -0
- package/dist/trusted-process/error-prefixes.js.map +1 -0
- package/dist/trusted-process/index.d.ts +40 -23
- package/dist/trusted-process/index.js +131 -225
- package/dist/trusted-process/index.js.map +1 -1
- package/dist/trusted-process/list-matcher.d.ts +17 -0
- package/dist/trusted-process/list-matcher.js +31 -0
- package/dist/trusted-process/list-matcher.js.map +1 -0
- package/dist/trusted-process/mcp-client-manager.d.ts +35 -6
- package/dist/trusted-process/mcp-client-manager.js +40 -45
- package/dist/trusted-process/mcp-client-manager.js.map +1 -1
- package/dist/trusted-process/mcp-proxy-server.d.ts +31 -120
- package/dist/trusted-process/mcp-proxy-server.js +166 -657
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/policy-engine.d.ts +16 -4
- package/dist/trusted-process/policy-engine.js +90 -45
- package/dist/trusted-process/policy-engine.js.map +1 -1
- package/dist/trusted-process/policy-roots.d.ts +6 -0
- package/dist/trusted-process/policy-roots.js +20 -0
- package/dist/trusted-process/policy-roots.js.map +1 -1
- package/dist/trusted-process/sandbox-integration.d.ts +12 -0
- package/dist/trusted-process/sandbox-integration.js +26 -0
- package/dist/trusted-process/sandbox-integration.js.map +1 -1
- package/dist/trusted-process/tool-call-coordinator.d.ts +269 -0
- package/dist/trusted-process/tool-call-coordinator.js +508 -0
- package/dist/trusted-process/tool-call-coordinator.js.map +1 -0
- package/dist/trusted-process/tool-call-pipeline.d.ts +205 -0
- package/dist/trusted-process/tool-call-pipeline.js +798 -0
- package/dist/trusted-process/tool-call-pipeline.js.map +1 -0
- package/dist/trusted-process/tool-description-hints.d.ts +1 -1
- package/dist/types/argument-roles.d.ts +1 -1
- package/dist/types/argument-roles.js +14 -1
- package/dist/types/argument-roles.js.map +1 -1
- package/dist/types/audit.d.ts +9 -0
- package/dist/{session → types}/errors.d.ts +8 -2
- package/dist/{session → types}/errors.js +8 -2
- package/dist/types/errors.js.map +1 -0
- package/dist/types/reserved-servers.d.ts +11 -0
- package/dist/types/reserved-servers.js +12 -0
- package/dist/types/reserved-servers.js.map +1 -0
- package/dist/types/server-listing.d.ts +14 -0
- package/dist/types/server-listing.js +2 -0
- package/dist/types/server-listing.js.map +1 -0
- package/dist/types/slug.d.ts +2 -0
- package/dist/types/slug.js +2 -0
- package/dist/types/slug.js.map +1 -1
- package/dist/types/url-normalize.d.ts +16 -0
- package/dist/types/url-normalize.js +33 -0
- package/dist/types/url-normalize.js.map +1 -0
- package/dist/utils/error-message.d.ts +8 -0
- package/dist/utils/error-message.js +11 -0
- package/dist/utils/error-message.js.map +1 -0
- package/dist/utils/exec-error.d.ts +19 -0
- package/dist/utils/exec-error.js +16 -0
- package/dist/utils/exec-error.js.map +1 -0
- package/dist/utils/is-plain-object.d.ts +7 -0
- package/dist/utils/is-plain-object.js +12 -0
- package/dist/utils/is-plain-object.js.map +1 -0
- package/dist/utils/preflight-checks.d.ts +16 -0
- package/dist/utils/preflight-checks.js +178 -0
- package/dist/utils/preflight-checks.js.map +1 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.d.ts +7 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.js +725 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.js.map +1 -0
- package/dist/web-ui/dispatch/escalation-dispatch.d.ts +7 -0
- package/dist/web-ui/dispatch/escalation-dispatch.js +52 -0
- package/dist/web-ui/dispatch/escalation-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/job-dispatch.d.ts +8 -0
- package/dist/web-ui/dispatch/job-dispatch.js +83 -0
- package/dist/web-ui/dispatch/job-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/persona-dispatch.d.ts +6 -0
- package/dist/web-ui/dispatch/persona-dispatch.js +116 -0
- package/dist/web-ui/dispatch/persona-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/session-dispatch.d.ts +9 -0
- package/dist/web-ui/dispatch/session-dispatch.js +201 -0
- package/dist/web-ui/dispatch/session-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/token-stream-dispatch.d.ts +15 -0
- package/dist/web-ui/dispatch/token-stream-dispatch.js +55 -0
- package/dist/web-ui/dispatch/token-stream-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/types.d.ts +31 -0
- package/dist/web-ui/dispatch/types.js +68 -0
- package/dist/web-ui/dispatch/types.js.map +1 -0
- package/dist/web-ui/dispatch/workflow-dispatch.d.ts +103 -0
- package/dist/web-ui/dispatch/workflow-dispatch.js +925 -0
- package/dist/web-ui/dispatch/workflow-dispatch.js.map +1 -0
- package/dist/web-ui/json-rpc-dispatch.d.ts +12 -0
- package/dist/web-ui/json-rpc-dispatch.js +34 -0
- package/dist/web-ui/json-rpc-dispatch.js.map +1 -0
- package/dist/web-ui/state-graph.d.ts +13 -0
- package/dist/web-ui/state-graph.js +82 -0
- package/dist/web-ui/state-graph.js.map +1 -0
- package/dist/web-ui/token-stream-bridge.d.ts +76 -0
- package/dist/web-ui/token-stream-bridge.js +265 -0
- package/dist/web-ui/token-stream-bridge.js.map +1 -0
- package/dist/web-ui/web-event-bus.d.ts +152 -0
- package/dist/web-ui/web-event-bus.js +19 -0
- package/dist/web-ui/web-event-bus.js.map +1 -0
- package/dist/web-ui/web-session-transport.d.ts +31 -0
- package/dist/web-ui/web-session-transport.js +109 -0
- package/dist/web-ui/web-session-transport.js.map +1 -0
- package/dist/web-ui/web-ui-server.d.ts +76 -0
- package/dist/web-ui/web-ui-server.js +461 -0
- package/dist/web-ui/web-ui-server.js.map +1 -0
- package/dist/web-ui/web-ui-types.d.ts +290 -0
- package/dist/web-ui/web-ui-types.js +32 -0
- package/dist/web-ui/web-ui-types.js.map +1 -0
- package/dist/web-ui/ws-utils.d.ts +5 -0
- package/dist/web-ui/ws-utils.js +12 -0
- package/dist/web-ui/ws-utils.js.map +1 -0
- package/dist/web-ui-static/assets/index-BFO5z1js.js +76 -0
- package/dist/web-ui-static/assets/index-CCUwrkIL.css +1 -0
- package/dist/web-ui-static/assets/orbitron-latin-700-normal-4jsRXGGJ.woff2 +0 -0
- package/dist/web-ui-static/assets/orbitron-latin-700-normal-DmYOh-W9.woff +0 -0
- package/dist/web-ui-static/index.html +14 -0
- package/dist/workflow/artifacts.d.ts +59 -0
- package/dist/workflow/artifacts.js +188 -0
- package/dist/workflow/artifacts.js.map +1 -0
- package/dist/workflow/checkpoint-selection.d.ts +34 -0
- package/dist/workflow/checkpoint-selection.js +48 -0
- package/dist/workflow/checkpoint-selection.js.map +1 -0
- package/dist/workflow/checkpoint.d.ts +35 -0
- package/dist/workflow/checkpoint.js +84 -0
- package/dist/workflow/checkpoint.js.map +1 -0
- package/dist/workflow/cli-support.d.ts +92 -0
- package/dist/workflow/cli-support.js +423 -0
- package/dist/workflow/cli-support.js.map +1 -0
- package/dist/workflow/definition-loader.d.ts +32 -0
- package/dist/workflow/definition-loader.js +56 -0
- package/dist/workflow/definition-loader.js.map +1 -0
- package/dist/workflow/discovery.d.ts +78 -0
- package/dist/workflow/discovery.js +203 -0
- package/dist/workflow/discovery.js.map +1 -0
- package/dist/workflow/errors.d.ts +66 -0
- package/dist/workflow/errors.js +49 -0
- package/dist/workflow/errors.js.map +1 -0
- package/dist/workflow/guards.d.ts +8 -0
- package/dist/workflow/guards.js +38 -0
- package/dist/workflow/guards.js.map +1 -0
- package/dist/workflow/lint-integration.d.ts +64 -0
- package/dist/workflow/lint-integration.js +56 -0
- package/dist/workflow/lint-integration.js.map +1 -0
- package/dist/workflow/lint.d.ts +66 -0
- package/dist/workflow/lint.js +410 -0
- package/dist/workflow/lint.js.map +1 -0
- package/dist/workflow/machine-builder.d.ts +90 -0
- package/dist/workflow/machine-builder.js +485 -0
- package/dist/workflow/machine-builder.js.map +1 -0
- package/dist/workflow/message-log.d.ts +85 -0
- package/dist/workflow/message-log.js +40 -0
- package/dist/workflow/message-log.js.map +1 -0
- package/dist/workflow/orchestrator.d.ts +450 -0
- package/dist/workflow/orchestrator.js +1941 -0
- package/dist/workflow/orchestrator.js.map +1 -0
- package/dist/workflow/prompt-builder.d.ts +39 -0
- package/dist/workflow/prompt-builder.js +242 -0
- package/dist/workflow/prompt-builder.js.map +1 -0
- package/dist/workflow/run-state-command.d.ts +9 -0
- package/dist/workflow/run-state-command.js +414 -0
- package/dist/workflow/run-state-command.js.map +1 -0
- package/dist/workflow/run-state-debug-capture.d.ts +40 -0
- package/dist/workflow/run-state-debug-capture.js +101 -0
- package/dist/workflow/run-state-debug-capture.js.map +1 -0
- package/dist/workflow/status-parser.d.ts +68 -0
- package/dist/workflow/status-parser.js +259 -0
- package/dist/workflow/status-parser.js.map +1 -0
- package/dist/workflow/types.d.ts +498 -0
- package/dist/workflow/types.js +83 -0
- package/dist/workflow/types.js.map +1 -0
- package/dist/workflow/validate.d.ts +58 -0
- package/dist/workflow/validate.js +499 -0
- package/dist/workflow/validate.js.map +1 -0
- package/dist/workflow/workflow-command.d.ts +26 -0
- package/dist/workflow/workflow-command.js +648 -0
- package/dist/workflow/workflow-command.js.map +1 -0
- package/dist/workflow/workflow-discovery.d.ts +25 -0
- package/dist/workflow/workflow-discovery.js +100 -0
- package/dist/workflow/workflow-discovery.js.map +1 -0
- package/dist/workflow/workflow-manager.d.ts +122 -0
- package/dist/workflow/workflow-manager.js +308 -0
- package/dist/workflow/workflow-manager.js.map +1 -0
- package/dist/workflow/workflows/design-and-code/workflow.yaml +169 -0
- package/dist/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
- package/dist/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
- package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
- package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
- package/dist/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
- package/dist/workflow/workflows/test-email-summary/workflow.yaml +89 -0
- package/dist/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +201 -0
- package/dist/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +166 -0
- package/dist/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +185 -0
- package/dist/workflow/workflows/vuln-discovery/workflow.yaml +920 -0
- package/dist/workflow/worktree.d.ts +43 -0
- package/dist/workflow/worktree.js +106 -0
- package/dist/workflow/worktree.js.map +1 -0
- package/docker/Dockerfile.base +12 -1
- package/docker/Dockerfile.base.arm64 +17 -1
- package/docker/entrypoint-claude-code.sh +46 -0
- package/docker/entrypoint-goose.sh +25 -0
- package/package.json +22 -8
- package/packages/web-ui/README.md +113 -0
- package/packages/web-ui/docs/workflow-state-machine.png +0 -0
- package/src/config/generated/compiled-policy.json +528 -161
- package/src/config/generated/test-scenarios.json +4810 -170
- package/src/config/generated/tool-annotations.json +34 -47
- package/src/config/mcp-servers.json +2 -2
- package/src/workflow/workflows/design-and-code/workflow.yaml +169 -0
- package/src/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
- package/src/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
- package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
- package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
- package/src/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
- package/src/workflow/workflows/test-email-summary/workflow.yaml +89 -0
- package/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +201 -0
- package/src/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +166 -0
- package/src/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +185 -0
- package/src/workflow/workflows/vuln-discovery/workflow.yaml +920 -0
- package/dist/pipeline/llm-logger.js.map +0 -1
- package/dist/session/errors.js.map +0 -1
package/README.md
CHANGED
|
@@ -127,7 +127,30 @@ ironcurtain start --persona my-assistant "Check my email" # Use a persona
|
|
|
127
127
|
|
|
128
128
|
### Other running modes
|
|
129
129
|
|
|
130
|
-
IronCurtain also supports PTY mode, session resume (`--resume <session-id>`), a Signal messaging transport for mobile approval, and a daemon mode for scheduled cron jobs. See [RUNNING_MODES.md](RUNNING_MODES.md) for details.
|
|
130
|
+
IronCurtain also supports PTY mode, session resume (`--resume <session-id>`), a Signal messaging transport for mobile approval, and a daemon mode for scheduled cron jobs. The daemon has an optional [web UI](DAEMON.md#web-ui) (`--web-ui`) for browser-based monitoring and escalation handling. See [RUNNING_MODES.md](RUNNING_MODES.md) for details.
|
|
131
|
+
|
|
132
|
+
### Multi-agent workflows
|
|
133
|
+
|
|
134
|
+
IronCurtain orchestrates multiple AI agents through structured workflows. The bundled **vulnerability discovery** workflow hunts memory-safety and logic bugs in native code through a tiered harness pipeline (Tier 1 isolated function → Tier 2 multi-component → Tier 3 full build) with libFuzzer/AFL++ coverage gating, hypothesis-driven `discover`/`triage` states, and a final human report-review gate. The **design-and-code** workflow runs plan / design / implement / review cycles, also with human gates. Each agent runs in its own Docker container with role-specific policy boundaries; the engine manages state transitions, artifact passing, and crash-resume checkpointing automatically. Open source, runs entirely on your machine, enforces per-agent security policies via the constitution-based policy engine, and works with any Docker-containerized agent — comparable in scope to Amazon Kiro and Google Jules for coding tasks, but with first-class security and an extensible workflow definition format.
|
|
135
|
+
|
|
136
|
+

|
|
137
|
+
|
|
138
|
+
**The web UI is the intended interface for workflow runs.** Start the daemon, open the printed URL, and drive runs from the Workflows page — the state-machine graph above is live, the agent-message timeline streams with markdown rendering, gate reviews include a workspace + artifact browser, and past runs stay listed.
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
ironcurtain daemon --web-ui
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
CLI access is available for scripting, automation, and debugging:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
ironcurtain workflow start vuln-discovery \
|
|
148
|
+
"Find memory-safety bugs in libical" --workspace ~/src/libical
|
|
149
|
+
ironcurtain workflow start design-and-code \
|
|
150
|
+
"Build a REST API with authentication"
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
See [WORKFLOWS.md](WORKFLOWS.md) for the full documentation.
|
|
131
154
|
|
|
132
155
|
## Customizing Your Policy
|
|
133
156
|
|
|
@@ -161,6 +184,10 @@ ironcurtain start --persona my-assistant "Check my calendar"
|
|
|
161
184
|
|
|
162
185
|
In mux mode, `/new my-assistant` spawns a tab using that persona. Personas can also be assigned to cron jobs. See [DAEMON.md](DAEMON.md) for scheduled job configuration.
|
|
163
186
|
|
|
187
|
+
### Skills
|
|
188
|
+
|
|
189
|
+
Drop SKILL.md packages under `~/.ironcurtain/skills/<name>/` to make purpose-specific guidance (helper scripts, deterministic checks, domain knowledge) available to every Docker agent session. The merged set is staged into a per-bundle host directory and bind-mounted **read-only** into the container at the path the active agent's native discovery walks — Claude Code is pointed at the staging dir via `--add-dir`, Goose scans `~/.config/goose/skills/<name>/SKILL.md`. The agent discovers them automatically and decides when to read them based on each skill's frontmatter description. The SKILL.md _format_ is the open standard adopted by Claude Code, Goose, and Codex; only the _discovery path_ differs per agent. Workflows can ship per-state skills inside the workflow package — see [WORKFLOWS.md](WORKFLOWS.md#skills).
|
|
190
|
+
|
|
164
191
|
## Policy: Constitution → Enforcement
|
|
165
192
|
|
|
166
193
|
You write intent in plain English; IronCurtain compiles it into deterministic rules:
|
|
@@ -203,7 +230,8 @@ compiles to:
|
|
|
203
230
|
Any call that doesn't match an explicit `allow` or `escalate` rule is **denied by default**.
|
|
204
231
|
|
|
205
232
|
```bash
|
|
206
|
-
ironcurtain annotate-tools
|
|
233
|
+
ironcurtain annotate-tools --server filesystem # Annotate one server (merge with existing)
|
|
234
|
+
ironcurtain annotate-tools --all # Re-annotate all servers
|
|
207
235
|
ironcurtain compile-policy # Compile constitution into rules and verify
|
|
208
236
|
ironcurtain refresh-lists # Re-resolve dynamic lists without full recompilation
|
|
209
237
|
ironcurtain refresh-lists --list major-news # Refresh a single list
|
|
@@ -222,6 +250,7 @@ IronCurtain stores configuration and session data in `~/.ironcurtain/`:
|
|
|
222
250
|
├── constitution-user.md # Your policy customizations (generated by customize-policy)
|
|
223
251
|
├── generated/ # User-compiled policy artifacts (overrides package defaults)
|
|
224
252
|
├── personas/ # Persona directories (constitution, policy, workspace, memory)
|
|
253
|
+
├── skills/ # User-global SKILL.md packages, mounted into every Docker session
|
|
225
254
|
├── jobs/ # Cron job definitions, workspaces, and run records
|
|
226
255
|
├── sessions/
|
|
227
256
|
│ └── {sessionId}/
|
|
@@ -229,7 +258,27 @@ IronCurtain stores configuration and session data in `~/.ironcurtain/`:
|
|
|
229
258
|
│ ├── escalations/ # File-based IPC for human approval
|
|
230
259
|
│ ├── audit.jsonl # Per-session audit log
|
|
231
260
|
│ └── session.log # Diagnostics
|
|
261
|
+
└── workflow-runs/ # Shared-container workflow runs (see below)
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Single-session runs (`ironcurtain start`, mux tabs, cron jobs) write under `sessions/`. Shared-container workflow runs write under `workflow-runs/` instead — see the next section.
|
|
265
|
+
|
|
266
|
+
### Workflow run layout
|
|
267
|
+
|
|
268
|
+
A workflow definition can opt in to a shared Docker container by setting `settings.sharedContainer: true` in its YAML. In that mode every agent state runs inside the same long-lived container and shares one policy engine instance; between states the orchestrator hot-swaps the active policy so each persona sees its own rules. All artifacts for the run land in a single tree:
|
|
269
|
+
|
|
232
270
|
```
|
|
271
|
+
~/.ironcurtain/workflow-runs/<workflowId>/
|
|
272
|
+
├── audit.jsonl # Persona-tagged append-only audit
|
|
273
|
+
├── messages.jsonl # Orchestrator message log
|
|
274
|
+
├── workspace/ # Agent workspace (filesystem MCP root)
|
|
275
|
+
├── bundle/ # Shared container support (claude-state, orientation, sockets, escalations, system-prompt.txt)
|
|
276
|
+
├── states/
|
|
277
|
+
│ └── <stateId>.<visitCount>/ # session.log + session-metadata.json per invocation
|
|
278
|
+
└── proxy-control.sock # Coordinator UDS for policy hot-swap
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
No per-session entries are created under `~/.ironcurtain/sessions/` for a shared-container workflow run. User-visible commands (`ironcurtain workflow start|resume|inspect|list`) are unchanged. See [WORKFLOWS.md](WORKFLOWS.md) for authoring workflow definitions and the full lifecycle.
|
|
233
282
|
|
|
234
283
|
Edit configuration interactively:
|
|
235
284
|
|
|
@@ -239,20 +288,28 @@ ironcurtain config
|
|
|
239
288
|
|
|
240
289
|
Key configuration areas: models and API keys, resource budgets (token/step/time/cost limits), auto-approve escalations, web search provider, audit redaction, and memory server LLM settings. See [CONFIG.md](CONFIG.md) for the full reference.
|
|
241
290
|
|
|
291
|
+
To route LLM traffic through a gateway like LiteLLM or OpenRouter (in both Code Mode and Docker Agent Mode), see [MODEL_ROUTING.md](MODEL_ROUTING.md).
|
|
292
|
+
|
|
242
293
|
## Built-in Capabilities
|
|
243
294
|
|
|
244
295
|
IronCurtain ships with six pre-configured MCP servers. All tool calls (except memory) are governed by your compiled policy.
|
|
245
296
|
|
|
246
|
-
| Server | Tools | Key capabilities
|
|
247
|
-
| -------------------- | ----- |
|
|
248
|
-
| **Filesystem** | 14 | Read, write, edit, search files; directory tree; move; diff calculation
|
|
249
|
-
| **Git** | 28 | Full git workflow: status, diff, log, commit, branch, push/pull/fetch, clone, stash, blame
|
|
250
|
-
| **Fetch** | 2 | HTTP GET with HTML-to-markdown conversion; web search (Brave, Tavily, SerpAPI)
|
|
251
|
-
| **GitHub** | 41 | Issues, PRs, code search, reviews via `ghcr.io/github/github-mcp-server`; requires a GitHub personal access token
|
|
252
|
-
| **Google Workspace** | 128 | Gmail, Calendar, Drive, Docs, Sheets — requires OAuth setup via `ironcurtain auth`
|
|
297
|
+
| Server | Tools | Key capabilities |
|
|
298
|
+
| -------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
299
|
+
| **Filesystem** | 14 | Read, write, edit, search files; directory tree; move; diff calculation |
|
|
300
|
+
| **Git** | 28 | Full git workflow: status, diff, log, commit, branch, push/pull/fetch, clone, stash, blame |
|
|
301
|
+
| **Fetch** | 2 | HTTP GET with HTML-to-markdown conversion; web search (Brave, Tavily, SerpAPI) |
|
|
302
|
+
| **GitHub** | 41 | Issues, PRs, code search, reviews via `ghcr.io/github/github-mcp-server`; requires a GitHub personal access token |
|
|
303
|
+
| **Google Workspace** | 128 | Gmail, Calendar, Drive, Docs, Sheets — requires OAuth setup via `ironcurtain auth` |
|
|
253
304
|
| **Memory** | 5 | Persistent semantic memory with hybrid vector+keyword search, LLM summarization, and automatic compaction. Enabled for persona and cron sessions. |
|
|
254
305
|
|
|
255
|
-
Read-only operations are allowed by default policy; mutations (writes, pushes, PR creation) escalate for human approval. Tools use `server.tool` naming (e.g., `filesystem.read_file`, `memory.recall`).
|
|
306
|
+
Read-only operations are allowed by default policy; mutations (writes, pushes, PR creation) escalate for human approval. Tools use `server.tool` naming (e.g., `filesystem.read_file`, `memory.recall`). See [ADDING_MCP_SERVERS.md](ADDING_MCP_SERVERS.md) to add your own.
|
|
307
|
+
|
|
308
|
+
### Network Passthrough (Docker Agent Mode)
|
|
309
|
+
|
|
310
|
+
In Docker Agent Mode, the container has no network access — all traffic goes through IronCurtain's MITM proxy. By default, only LLM provider domains are reachable. The agent can request access to additional domains at runtime via the `proxy` virtual MCP server (`add_proxy_domain`). Each request requires human approval via the escalation flow.
|
|
311
|
+
|
|
312
|
+
Approved domains get a **raw passthrough tunnel** — HTTP, HTTPS, and WebSocket connections are forwarded without content inspection or credential injection. This gives the agent greater utility (calling third-party APIs, streaming data from external services) but means traffic to those domains is **unmediated**. See [SECURITY_CONCERNS.md](docs/SECURITY_CONCERNS.md) Section 2b-i for the threat model and [DEVELOPER_GUIDE.md](DEVELOPER_GUIDE.md) for usage details.
|
|
256
313
|
|
|
257
314
|
## Security Model
|
|
258
315
|
|
|
@@ -323,6 +380,8 @@ src/
|
|
|
323
380
|
├── daemon/ # Unified daemon (Signal + cron scheduler, control socket)
|
|
324
381
|
├── cron/ # Cron job management (scheduler, job store, git sync, policy)
|
|
325
382
|
├── docker/ # Docker agent mode, PTY session, MITM proxy, registry proxy
|
|
383
|
+
├── workflow/ # Multi-agent workflow engine (orchestrator, state machine, gates)
|
|
384
|
+
├── web-ui/ # Web UI backend (JSON-RPC dispatch, event bus, workflow manager)
|
|
326
385
|
├── servers/ # Built-in MCP servers (fetch, web search providers)
|
|
327
386
|
└── types/ # Shared type definitions
|
|
328
387
|
packages/
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { existsSync, readFileSync } from 'node:fs';
|
|
8
8
|
import { resolve } from 'node:path';
|
|
9
9
|
import { getOAuthDir } from '../config/paths.js';
|
|
10
|
+
import { isPlainObject } from '../utils/is-plain-object.js';
|
|
10
11
|
// ---------------------------------------------------------------------------
|
|
11
12
|
// Credential loading
|
|
12
13
|
// ---------------------------------------------------------------------------
|
|
@@ -66,8 +67,4 @@ function extractClientCredentials(parsed, filePath) {
|
|
|
66
67
|
}
|
|
67
68
|
return { clientId, clientSecret };
|
|
68
69
|
}
|
|
69
|
-
/** Type guard for non-null, non-array objects. */
|
|
70
|
-
function isPlainObject(value) {
|
|
71
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
72
|
-
}
|
|
73
70
|
//# sourceMappingURL=oauth-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../../src/auth/oauth-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../../src/auth/oauth-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAgD5D,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAA6B;IACjE,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAE7E,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC1D,OAAO,wBAAwB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,GAAW,EAAE,QAAgB;IACzD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,KAAK,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,wBAAwB,CAAC,MAAe,EAAE,QAAgB;IACjE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,0BAA0B,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,GAAG,GAAG,MAAiC,CAAC;IAE9C,4DAA4D;IAC5D,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAExE,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IAE7C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACpC,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -26,11 +26,14 @@ const topLevelSpec = {
|
|
|
26
26
|
{ name: 'auth', description: 'Manage OAuth providers (import credentials, authorize, revoke)' },
|
|
27
27
|
{ name: 'setup', description: 'Run the first-start wizard (always runs)' },
|
|
28
28
|
{ name: 'setup-signal', description: 'Interactive Signal transport onboarding' },
|
|
29
|
-
{ name: 'annotate-tools', description: 'Classify MCP tool arguments via LLM' },
|
|
29
|
+
{ name: 'annotate-tools', description: 'Classify MCP tool arguments via LLM (--server <name> or --all)' },
|
|
30
30
|
{ name: 'compile-policy', description: 'Compile constitution into enforceable policy rules' },
|
|
31
31
|
{ name: 'refresh-lists', description: 'Re-resolve dynamic lists without full recompilation' },
|
|
32
32
|
{ name: 'customize-policy', description: 'Customize your policy via LLM-assisted conversation' },
|
|
33
33
|
{ name: 'config', description: 'Edit configuration interactively' },
|
|
34
|
+
{ name: 'workflow', description: 'Run multi-agent workflows (start, resume, inspect)' },
|
|
35
|
+
{ name: 'observe', description: 'Watch live LLM token output for running sessions' },
|
|
36
|
+
{ name: 'doctor', description: 'Diagnose installation, credentials, and MCP server health' },
|
|
34
37
|
{ name: 'help', description: 'Show this help message' },
|
|
35
38
|
],
|
|
36
39
|
options: [
|
|
@@ -77,6 +80,26 @@ if (!subcommand || subcommand === 'help') {
|
|
|
77
80
|
printSpecHelp(topLevelSpec);
|
|
78
81
|
process.exit(0);
|
|
79
82
|
}
|
|
83
|
+
// Commands that require the V8 sandbox. We check early to catch Node version
|
|
84
|
+
// mismatches (like Node 25) or stale native module builds before importing heavy dependencies.
|
|
85
|
+
// `compile-policy` is the offline policy pipeline and never instantiates the V8 sandbox.
|
|
86
|
+
const requiresSandbox = ['start', 'daemon', 'bot', 'workflow'];
|
|
87
|
+
if (requiresSandbox.includes(subcommand)) {
|
|
88
|
+
const { checkSandboxViability } = await import('./utils/preflight-checks.js');
|
|
89
|
+
const result = await checkSandboxViability();
|
|
90
|
+
if (!result.ok) {
|
|
91
|
+
const chalk = (await import('chalk')).default;
|
|
92
|
+
// Use process.stderr.write rather than console.error because the logger
|
|
93
|
+
// (src/logger.ts) monkey-patches console.* to redirect into the session log
|
|
94
|
+
// file. Writing directly to stderr keeps fatal errors visible on the terminal.
|
|
95
|
+
process.stderr.write(`\n${chalk.bold(chalk.red('Fatal Error:'))} ${result.message}\n`);
|
|
96
|
+
if (result.details) {
|
|
97
|
+
process.stderr.write(chalk.dim(result.details) + '\n');
|
|
98
|
+
}
|
|
99
|
+
process.stderr.write(chalk.dim('Run `ironcurtain doctor` for a full diagnostic.\n\n'));
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
80
103
|
switch (subcommand) {
|
|
81
104
|
case 'start': {
|
|
82
105
|
const { main } = await import('./index.js');
|
|
@@ -85,7 +108,7 @@ switch (subcommand) {
|
|
|
85
108
|
}
|
|
86
109
|
case 'annotate-tools': {
|
|
87
110
|
const { main } = await import('./pipeline/annotate.js');
|
|
88
|
-
await main();
|
|
111
|
+
await main(process.argv.slice(3));
|
|
89
112
|
break;
|
|
90
113
|
}
|
|
91
114
|
case 'compile-policy': {
|
|
@@ -159,6 +182,21 @@ switch (subcommand) {
|
|
|
159
182
|
await listenerMain();
|
|
160
183
|
break;
|
|
161
184
|
}
|
|
185
|
+
case 'workflow': {
|
|
186
|
+
const { main: workflowMain } = await import('./workflow/workflow-command.js');
|
|
187
|
+
await workflowMain(process.argv.slice(3));
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
case 'observe': {
|
|
191
|
+
const { runObserveCommand } = await import('./observe/observe-command.js');
|
|
192
|
+
await runObserveCommand(process.argv.slice(3));
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
case 'doctor': {
|
|
196
|
+
const { runDoctorCommand } = await import('./doctor/doctor-command.js');
|
|
197
|
+
await runDoctorCommand(process.argv.slice(3));
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
162
200
|
case 'setup-signal': {
|
|
163
201
|
if (checkHelp({ help: process.argv.includes('--help') || process.argv.includes('-h') }, setupSignalSpec))
|
|
164
202
|
break;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,aAAa,EAAoB,MAAM,eAAe,CAAC;AAExF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,SAAS,UAAU;IACjB,oFAAoF;IACpF,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAwB,CAAC;IACtF,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,MAAM,YAAY,GAAgB;IAChC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,wDAAwD;IACrE,KAAK,EAAE,CAAC,iCAAiC,CAAC;IAC1C,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,4CAA4C,EAAE;QACnF,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;QAC/D,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,2DAA2D,EAAE;QACzF,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,sDAAsD,EAAE;QACpG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,0CAA0C,EAAE;QACxE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yCAAyC,EAAE;QAC3E,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gEAAgE,EAAE;QAC/F,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,0CAA0C,EAAE;QAC1E,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,yCAAyC,EAAE;QAChF,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,aAAa,EAAoB,MAAM,eAAe,CAAC;AAExF,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,SAAS,UAAU;IACjB,oFAAoF;IACpF,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAwB,CAAC;IACtF,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,MAAM,YAAY,GAAgB;IAChC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,wDAAwD;IACrE,KAAK,EAAE,CAAC,iCAAiC,CAAC;IAC1C,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,4CAA4C,EAAE;QACnF,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;QAC/D,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,2DAA2D,EAAE;QACzF,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,sDAAsD,EAAE;QACpG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,0CAA0C,EAAE;QACxE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yCAAyC,EAAE;QAC3E,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,gEAAgE,EAAE;QAC/F,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,0CAA0C,EAAE;QAC1E,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,yCAAyC,EAAE;QAChF,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,gEAAgE,EAAE;QACzG,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,oDAAoD,EAAE;QAC7F,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,qDAAqD,EAAE;QAC7F,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,qDAAqD,EAAE;QAChG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;QACnE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,oDAAoD,EAAE;QACvF,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kDAAkD,EAAE;QACpF,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2DAA2D,EAAE;QAC5F,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,wBAAwB,EAAE;KACxD;IACD,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,wBAAwB,EAAE;QACnE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,qBAAqB,EAAE;KACpE;IACD,QAAQ,EAAE;QACR,mEAAmE;QACnE,sEAAsE;QACtE,mEAAmE;QACnE,6EAA6E;QAC7E,sEAAsE;QACtE,2DAA2D;QAC3D,mEAAmE;QACnE,sEAAsE;QACtE,iEAAiE;QACjE,wEAAwE;KACzE;CACF,CAAC;AAEF,MAAM,eAAe,GAAgB;IACnC,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,yCAAyC;IACtD,KAAK,EAAE,CAAC,oCAAoC,CAAC;IAC7C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC;CACjF,CAAC;AAEF,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACxC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;QACrC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;KACzC;IACD,gBAAgB,EAAE,IAAI;IACtB,MAAM,EAAE,KAAK;CACd,CAAC,CAAC;AAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAElC,+EAA+E;AAC/E,wEAAwE;AACxE,gDAAgD;AAChD,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;IACzC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,6EAA6E;AAC7E,+FAA+F;AAC/F,yFAAyF;AACzF,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAC/D,IAAI,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;IACzC,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9C,wEAAwE;QACxE,4EAA4E;QAC5E,+EAA+E;QAC/E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACvF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,QAAQ,UAAU,EAAE,CAAC;IACnB,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM;IACR,CAAC;IACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACxD,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM;IACR,CAAC;IACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACvD,MAAM,IAAI,EAAE,CAAC;QACb,MAAM;IACR,CAAC;IACD,KAAK,eAAe,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC7D,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM;IACR,CAAC;IACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;QACvE,MAAM,IAAI,EAAE,CAAC;QACb,MAAM;IACR,CAAC;IACD,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACxE,MAAM,gBAAgB,EAAE,CAAC;QACzB,MAAM;IACR,CAAC;IACD,KAAK,SAAS,CAAC,CAAC,CAAC;QACf,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAC3E,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM;IACR,CAAC;IACD,KAAK,MAAM,CAAC,CAAC,CAAC;QACZ,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAClE,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM;IACR,CAAC;IACD,KAAK,OAAO,CAAC,CAAC,CAAC;QACb,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAClE,MAAM,aAAa,EAAE,CAAC;QACtB,MAAM;IACR,CAAC;IACD,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACxE,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM;IACR,CAAC;IACD,KAAK,KAAK,CAAC,CAAC,CAAC;QACX,0DAA0D;QAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;YAC5D,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,KAA2B,CAAC;QACrD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5C,kDAAkD;YAClD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;YACxE,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;YAC3D,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrC,CAAC;QACD,MAAM;IACR,CAAC;IACD,KAAK,KAAK,CAAC,CAAC,CAAC;QACX,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC/D,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM;IACR,CAAC;IACD,KAAK,qBAAqB,CAAC,CAAC,CAAC;QAC3B,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAChF,MAAM,YAAY,EAAE,CAAC;QACrB,MAAM;IACR,CAAC;IACD,KAAK,UAAU,CAAC,CAAC,CAAC;QAChB,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QAC9E,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM;IACR,CAAC;IACD,KAAK,SAAS,CAAC,CAAC,CAAC;QACf,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAC3E,MAAM,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM;IACR,CAAC;IACD,KAAK,QAAQ,CAAC,CAAC,CAAC;QACd,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACxE,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM;IACR,CAAC;IACD,KAAK,cAAc,CAAC,CAAC,CAAC;QACpB,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC;YAAE,MAAM;QAChH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACpE,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAClC,MAAM;IACR,CAAC;IACD;QACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,UAAU,IAAI,CAAC,CAAC;QAClD,aAAa,CAAC,YAAY,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -9,7 +9,7 @@ import * as p from '@clack/prompts';
|
|
|
9
9
|
import { readFileSync } from 'node:fs';
|
|
10
10
|
import { resolve, dirname } from 'node:path';
|
|
11
11
|
import { fileURLToPath } from 'node:url';
|
|
12
|
-
import { loadUserConfig, saveUserConfig, validateModelId, ESCALATION_TIMEOUT_MIN, ESCALATION_TIMEOUT_MAX, WEB_SEARCH_PROVIDERS, WEB_SEARCH_PROVIDER_LABELS, WEB_SEARCH_PROVIDER_URLS, GOOSE_PROVIDERS, DOCKER_AGENTS, } from './user-config.js';
|
|
12
|
+
import { loadUserConfig, saveUserConfig, validateModelId, ESCALATION_TIMEOUT_MIN, ESCALATION_TIMEOUT_MAX, WEB_SEARCH_PROVIDERS, WEB_SEARCH_PROVIDER_LABELS, WEB_SEARCH_PROVIDER_URLS, GOOSE_PROVIDERS, DOCKER_AGENTS, SESSION_MODES, } from './user-config.js';
|
|
13
13
|
import { getUserConfigPath } from './paths.js';
|
|
14
14
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
15
15
|
/** Known model options for selection prompts. */
|
|
@@ -73,17 +73,26 @@ export function computeDiff(resolved, pending) {
|
|
|
73
73
|
const topLevelKeys = [
|
|
74
74
|
'agentModelId',
|
|
75
75
|
'policyModelId',
|
|
76
|
+
'prefilterModelId',
|
|
76
77
|
'escalationTimeoutSeconds',
|
|
77
78
|
'gooseProvider',
|
|
78
79
|
'gooseModel',
|
|
79
80
|
'preferredDockerAgent',
|
|
81
|
+
'preferredMode',
|
|
80
82
|
];
|
|
81
83
|
for (const key of topLevelKeys) {
|
|
82
84
|
if (key in pending && pending[key] !== undefined && pending[key] !== resolved[key]) {
|
|
83
85
|
diffs.push([key, { from: resolved[key], to: pending[key] }]);
|
|
84
86
|
}
|
|
85
87
|
}
|
|
86
|
-
const nestedSections = [
|
|
88
|
+
const nestedSections = [
|
|
89
|
+
'resourceBudget',
|
|
90
|
+
'autoCompact',
|
|
91
|
+
'autoApprove',
|
|
92
|
+
'auditRedaction',
|
|
93
|
+
'memory',
|
|
94
|
+
'dockerResources',
|
|
95
|
+
];
|
|
87
96
|
for (const section of nestedSections) {
|
|
88
97
|
const pendingSection = pending[section];
|
|
89
98
|
if (!pendingSection)
|
|
@@ -198,8 +207,8 @@ async function promptNullableNumber(opts) {
|
|
|
198
207
|
if (!val || val.trim() === '')
|
|
199
208
|
return 'Must be a number';
|
|
200
209
|
const n = Number(val);
|
|
201
|
-
if (
|
|
202
|
-
return 'Must be a number';
|
|
210
|
+
if (!Number.isFinite(n))
|
|
211
|
+
return 'Must be a finite number';
|
|
203
212
|
return opts.validate?.(n);
|
|
204
213
|
},
|
|
205
214
|
});
|
|
@@ -213,18 +222,25 @@ async function handleModels(resolved, pending) {
|
|
|
213
222
|
while (true) {
|
|
214
223
|
const currentAgent = pending.agentModelId ?? resolved.agentModelId;
|
|
215
224
|
const currentPolicy = pending.policyModelId ?? resolved.policyModelId;
|
|
225
|
+
const currentPrefilter = pending.prefilterModelId ?? resolved.prefilterModelId;
|
|
216
226
|
const field = await p.select({
|
|
217
227
|
message: 'Models',
|
|
218
228
|
options: [
|
|
219
229
|
{ value: 'agentModelId', label: 'Agent model', hint: formatModelShort(currentAgent) },
|
|
220
230
|
{ value: 'policyModelId', label: 'Policy model', hint: formatModelShort(currentPolicy) },
|
|
231
|
+
{ value: 'prefilterModelId', label: 'Pre-filter model', hint: formatModelShort(currentPrefilter) },
|
|
221
232
|
{ value: 'back', label: 'Back' },
|
|
222
233
|
],
|
|
223
234
|
});
|
|
224
235
|
if (isCancelled(field) || field === 'back')
|
|
225
236
|
return;
|
|
226
|
-
const current = field === 'agentModelId' ? currentAgent : currentPolicy;
|
|
227
|
-
const
|
|
237
|
+
const current = field === 'agentModelId' ? currentAgent : field === 'policyModelId' ? currentPolicy : currentPrefilter;
|
|
238
|
+
const promptLabel = field === 'agentModelId'
|
|
239
|
+
? 'Select agent model:'
|
|
240
|
+
: field === 'policyModelId'
|
|
241
|
+
? 'Select policy model:'
|
|
242
|
+
: 'Select pre-filter model:';
|
|
243
|
+
const newValue = await promptModelId(promptLabel, current);
|
|
228
244
|
if (newValue !== undefined && newValue !== current) {
|
|
229
245
|
pending[field] = newValue;
|
|
230
246
|
}
|
|
@@ -305,10 +321,16 @@ async function handleSecurity(resolved, pending) {
|
|
|
305
321
|
async function handleMemory(resolved, pending) {
|
|
306
322
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- interactive loop exited via return
|
|
307
323
|
while (true) {
|
|
324
|
+
const currentEnabled = pending.memory?.enabled ?? resolved.memory.enabled;
|
|
308
325
|
const currentAutoSave = pending.memory?.autoSave ?? resolved.memory.autoSave;
|
|
309
326
|
const field = await p.select({
|
|
310
327
|
message: 'Memory',
|
|
311
328
|
options: [
|
|
329
|
+
{
|
|
330
|
+
value: 'enabled',
|
|
331
|
+
label: 'Enabled (kill switch — affects all personas/jobs)',
|
|
332
|
+
hint: currentEnabled ? 'on' : 'off',
|
|
333
|
+
},
|
|
312
334
|
{
|
|
313
335
|
value: 'autoSave',
|
|
314
336
|
label: 'Auto-save session summary to memory',
|
|
@@ -319,7 +341,18 @@ async function handleMemory(resolved, pending) {
|
|
|
319
341
|
});
|
|
320
342
|
if (isCancelled(field) || field === 'back')
|
|
321
343
|
return;
|
|
322
|
-
if (field === '
|
|
344
|
+
if (field === 'enabled') {
|
|
345
|
+
const enabled = await p.confirm({
|
|
346
|
+
message: 'Enable memory globally? (turning this off disables memory for all personas and jobs)',
|
|
347
|
+
initialValue: currentEnabled,
|
|
348
|
+
});
|
|
349
|
+
if (isCancelled(enabled))
|
|
350
|
+
continue;
|
|
351
|
+
if (enabled !== currentEnabled) {
|
|
352
|
+
pending.memory = { ...pending.memory, enabled: enabled };
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
else if (field === 'autoSave') {
|
|
323
356
|
const enabled = await p.confirm({
|
|
324
357
|
message: 'Auto-save a session summary to memory when sessions end?',
|
|
325
358
|
initialValue: currentAutoSave,
|
|
@@ -652,6 +685,54 @@ async function handleServerCredentials(resolved, pending) {
|
|
|
652
685
|
}
|
|
653
686
|
}
|
|
654
687
|
}
|
|
688
|
+
// ─── Session Mode ─────────────────────────────────────────────
|
|
689
|
+
/** Human-readable labels for session modes. */
|
|
690
|
+
const SESSION_MODE_LABELS = {
|
|
691
|
+
docker: 'Docker (recommended)',
|
|
692
|
+
builtin: 'Builtin (V8 sandbox)',
|
|
693
|
+
};
|
|
694
|
+
/** Short labels used in hints (no parenthetical). */
|
|
695
|
+
const SESSION_MODE_SHORT_LABELS = {
|
|
696
|
+
docker: 'Docker',
|
|
697
|
+
builtin: 'Builtin',
|
|
698
|
+
};
|
|
699
|
+
async function handleSessionMode(resolved, pending) {
|
|
700
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- interactive loop exited via return
|
|
701
|
+
while (true) {
|
|
702
|
+
const currentMode = pending.preferredMode ?? resolved.preferredMode;
|
|
703
|
+
const field = await p.select({
|
|
704
|
+
message: 'Session Mode',
|
|
705
|
+
options: [
|
|
706
|
+
{
|
|
707
|
+
value: 'preferredMode',
|
|
708
|
+
label: 'Preferred mode',
|
|
709
|
+
hint: SESSION_MODE_LABELS[currentMode],
|
|
710
|
+
},
|
|
711
|
+
{ value: 'back', label: 'Back' },
|
|
712
|
+
],
|
|
713
|
+
});
|
|
714
|
+
if (isCancelled(field) || field === 'back')
|
|
715
|
+
return;
|
|
716
|
+
if (field === 'preferredMode') {
|
|
717
|
+
const modeOptions = SESSION_MODES.map((mode) => ({
|
|
718
|
+
value: mode,
|
|
719
|
+
label: SESSION_MODE_LABELS[mode],
|
|
720
|
+
hint: mode === currentMode ? '(current)' : undefined,
|
|
721
|
+
}));
|
|
722
|
+
const selected = await p.select({
|
|
723
|
+
message: 'Select preferred session mode:',
|
|
724
|
+
options: modeOptions,
|
|
725
|
+
initialValue: currentMode,
|
|
726
|
+
});
|
|
727
|
+
if (isCancelled(selected))
|
|
728
|
+
continue;
|
|
729
|
+
const mode = selected;
|
|
730
|
+
if (mode !== currentMode) {
|
|
731
|
+
pending.preferredMode = mode;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
}
|
|
655
736
|
// ─── Docker Agent Settings ────────────────────────────────────
|
|
656
737
|
/** Human-readable labels for Goose providers. */
|
|
657
738
|
const GOOSE_PROVIDER_LABELS = {
|
|
@@ -674,6 +755,11 @@ async function handleDockerAgent(resolved, pending) {
|
|
|
674
755
|
label: 'Preferred agent',
|
|
675
756
|
hint: DOCKER_AGENT_LABELS[currentPreferred],
|
|
676
757
|
},
|
|
758
|
+
{
|
|
759
|
+
value: 'dockerResources',
|
|
760
|
+
label: 'Container resources...',
|
|
761
|
+
hint: dockerResourcesSummary(resolved, pending),
|
|
762
|
+
},
|
|
677
763
|
{
|
|
678
764
|
value: 'configureGoose',
|
|
679
765
|
label: 'Configure Goose...',
|
|
@@ -708,8 +794,74 @@ async function handleDockerAgent(resolved, pending) {
|
|
|
708
794
|
else if (field === 'configureGoose') {
|
|
709
795
|
await handleGooseConfig(resolved, pending);
|
|
710
796
|
}
|
|
797
|
+
else if (field === 'dockerResources') {
|
|
798
|
+
await handleDockerResources(resolved, pending);
|
|
799
|
+
}
|
|
711
800
|
}
|
|
712
801
|
}
|
|
802
|
+
/** Submenu for Docker container memory and cpu ceilings. */
|
|
803
|
+
async function handleDockerResources(resolved, pending) {
|
|
804
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- interactive loop exited via return
|
|
805
|
+
while (true) {
|
|
806
|
+
const current = { ...resolved.dockerResources, ...(pending.dockerResources ?? {}) };
|
|
807
|
+
const field = await p.select({
|
|
808
|
+
message: 'Docker container resources',
|
|
809
|
+
options: [
|
|
810
|
+
{
|
|
811
|
+
value: 'memoryMb',
|
|
812
|
+
label: 'Memory ceiling (MB)',
|
|
813
|
+
hint: current.memoryMb === null ? 'unlimited' : `${current.memoryMb} MB`,
|
|
814
|
+
},
|
|
815
|
+
{
|
|
816
|
+
value: 'cpus',
|
|
817
|
+
label: 'CPU ceiling',
|
|
818
|
+
hint: current.cpus === null ? 'unlimited' : String(current.cpus),
|
|
819
|
+
},
|
|
820
|
+
{ value: 'back', label: 'Back' },
|
|
821
|
+
],
|
|
822
|
+
});
|
|
823
|
+
if (isCancelled(field) || field === 'back')
|
|
824
|
+
return;
|
|
825
|
+
if (field === 'memoryMb') {
|
|
826
|
+
const result = await promptNullableNumber({
|
|
827
|
+
message: 'Memory ceiling (MB):',
|
|
828
|
+
current: current.memoryMb,
|
|
829
|
+
format: (n) => (n === null ? 'unlimited' : `${n} MB`),
|
|
830
|
+
validate: (n) => {
|
|
831
|
+
if (!Number.isInteger(n))
|
|
832
|
+
return 'Must be an integer';
|
|
833
|
+
if (n < 6)
|
|
834
|
+
return 'Must be at least 6 (Docker minimum)';
|
|
835
|
+
return undefined;
|
|
836
|
+
},
|
|
837
|
+
});
|
|
838
|
+
if (result !== undefined) {
|
|
839
|
+
pending.dockerResources = { ...(pending.dockerResources ?? {}), memoryMb: result };
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
else if (field === 'cpus') {
|
|
843
|
+
const result = await promptNullableNumber({
|
|
844
|
+
message: 'CPU ceiling (decimal allowed, e.g. 1.5):',
|
|
845
|
+
current: current.cpus,
|
|
846
|
+
format: (n) => (n === null ? 'unlimited' : String(n)),
|
|
847
|
+
validate: (n) => {
|
|
848
|
+
if (n < 0.01)
|
|
849
|
+
return 'Must be at least 0.01 (Docker minimum)';
|
|
850
|
+
return undefined;
|
|
851
|
+
},
|
|
852
|
+
});
|
|
853
|
+
if (result !== undefined) {
|
|
854
|
+
pending.dockerResources = { ...(pending.dockerResources ?? {}), cpus: result };
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
function dockerResourcesSummary(resolved, pending) {
|
|
860
|
+
const r = { ...resolved.dockerResources, ...(pending.dockerResources ?? {}) };
|
|
861
|
+
const cpu = r.cpus === null ? 'unlimited' : `${r.cpus} cpus`;
|
|
862
|
+
const mem = r.memoryMb === null ? 'unlimited' : `${r.memoryMb} MB`;
|
|
863
|
+
return `${cpu}, ${mem}`;
|
|
864
|
+
}
|
|
713
865
|
/** Goose-specific configuration submenu (provider + model). */
|
|
714
866
|
async function handleGooseConfig(resolved, pending) {
|
|
715
867
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- interactive loop exited via return
|
|
@@ -776,7 +928,8 @@ function gooseConfigHint(resolved, pending) {
|
|
|
776
928
|
function modelsHint(resolved, pending) {
|
|
777
929
|
const agent = formatModelShort(pending.agentModelId ?? resolved.agentModelId);
|
|
778
930
|
const policy = formatModelShort(pending.policyModelId ?? resolved.policyModelId);
|
|
779
|
-
|
|
931
|
+
const prefilter = formatModelShort(pending.prefilterModelId ?? resolved.prefilterModelId);
|
|
932
|
+
return `${agent}, ${policy}, pre-filter: ${prefilter}`;
|
|
780
933
|
}
|
|
781
934
|
function securityHint(resolved, pending) {
|
|
782
935
|
const timeout = formatSeconds(pending.escalationTimeoutSeconds ?? resolved.escalationTimeoutSeconds);
|
|
@@ -803,11 +956,18 @@ function serverCredentialsHint(resolved, pending) {
|
|
|
803
956
|
return configured.map(([name]) => name).join(', ');
|
|
804
957
|
}
|
|
805
958
|
function memoryHint(resolved, pending) {
|
|
959
|
+
const enabled = pending.memory?.enabled ?? resolved.memory.enabled;
|
|
806
960
|
const autoSave = pending.memory?.autoSave ?? resolved.memory.autoSave;
|
|
807
|
-
|
|
961
|
+
if (!enabled)
|
|
962
|
+
return 'off (kill switch)';
|
|
963
|
+
return `on, auto-save: ${autoSave ? 'on' : 'off'}`;
|
|
808
964
|
}
|
|
809
965
|
function dockerAgentHint(resolved, pending) {
|
|
810
|
-
|
|
966
|
+
const agent = DOCKER_AGENT_LABELS[pending.preferredDockerAgent ?? resolved.preferredDockerAgent];
|
|
967
|
+
return `${agent}, ${dockerResourcesSummary(resolved, pending)}`;
|
|
968
|
+
}
|
|
969
|
+
function sessionModeHint(resolved, pending) {
|
|
970
|
+
return SESSION_MODE_SHORT_LABELS[pending.preferredMode ?? resolved.preferredMode];
|
|
811
971
|
}
|
|
812
972
|
function changeCount(resolved, pending) {
|
|
813
973
|
const diffs = computeDiff(resolved, pending);
|
|
@@ -845,6 +1005,7 @@ export async function runConfigCommand() {
|
|
|
845
1005
|
{ value: 'websearch', label: `Web Search (${webSearchHint(resolved, pending)})` },
|
|
846
1006
|
{ value: 'credentials', label: `Server Credentials (${serverCredentialsHint(resolved, pending)})` },
|
|
847
1007
|
{ value: 'memory', label: `Memory (${memoryHint(resolved, pending)})` },
|
|
1008
|
+
{ value: 'sessionMode', label: `Session Mode (${sessionModeHint(resolved, pending)})` },
|
|
848
1009
|
{ value: 'dockerAgent', label: `Docker Agent (${dockerAgentHint(resolved, pending)})` },
|
|
849
1010
|
{ value: 'save', label: 'Save & Exit', hint: changeCount(resolved, pending) },
|
|
850
1011
|
{ value: 'cancel', label: 'Cancel', hint: 'discard all changes' },
|
|
@@ -876,6 +1037,9 @@ export async function runConfigCommand() {
|
|
|
876
1037
|
case 'memory':
|
|
877
1038
|
await handleMemory(resolved, pending);
|
|
878
1039
|
break;
|
|
1040
|
+
case 'sessionMode':
|
|
1041
|
+
await handleSessionMode(resolved, pending);
|
|
1042
|
+
break;
|
|
879
1043
|
case 'dockerAgent':
|
|
880
1044
|
await handleDockerAgent(resolved, pending);
|
|
881
1045
|
break;
|