@provos/ironcurtain 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -14
- package/dist/auth/oauth-provider.js +1 -4
- package/dist/auth/oauth-provider.js.map +1 -1
- package/dist/cli-help.d.ts +12 -0
- package/dist/cli-help.js +21 -0
- package/dist/cli-help.js.map +1 -1
- package/dist/cli.js +46 -6
- package/dist/cli.js.map +1 -1
- package/dist/config/agent-model-guard.d.ts +14 -0
- package/dist/config/agent-model-guard.js +24 -0
- package/dist/config/agent-model-guard.js.map +1 -0
- package/dist/config/config-command.js +277 -7
- package/dist/config/config-command.js.map +1 -1
- package/dist/config/first-start.js +62 -7
- package/dist/config/first-start.js.map +1 -1
- package/dist/config/generated/compiled-policy.json +528 -161
- package/dist/config/generated/test-scenarios.json +4810 -170
- package/dist/config/generated/tool-annotations.json +34 -47
- package/dist/config/index.d.ts +58 -0
- package/dist/config/index.js +97 -15
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-servers.json +2 -2
- package/dist/config/model-provider.d.ts +9 -0
- package/dist/config/model-provider.js +13 -0
- package/dist/config/model-provider.js.map +1 -1
- package/dist/config/paths.d.ts +217 -0
- package/dist/config/paths.js +363 -14
- package/dist/config/paths.js.map +1 -1
- package/dist/config/types.d.ts +7 -1
- package/dist/config/user-config.d.ts +101 -6
- package/dist/config/user-config.js +145 -31
- package/dist/config/user-config.js.map +1 -1
- package/dist/config/validate-policy-dir.d.ts +10 -0
- package/dist/config/validate-policy-dir.js +59 -0
- package/dist/config/validate-policy-dir.js.map +1 -0
- package/dist/cron/job-commands.js +22 -2
- package/dist/cron/job-commands.js.map +1 -1
- package/dist/cron/types.d.ts +16 -2
- package/dist/cron/types.js +1 -3
- package/dist/cron/types.js.map +1 -1
- package/dist/daemon/daemon-command.js +30 -7
- package/dist/daemon/daemon-command.js.map +1 -1
- package/dist/daemon/ironcurtain-daemon.d.ts +62 -1
- package/dist/daemon/ironcurtain-daemon.js +231 -8
- package/dist/daemon/ironcurtain-daemon.js.map +1 -1
- package/dist/daemon-client/daemon-client.d.ts +123 -0
- package/dist/daemon-client/daemon-client.js +324 -0
- package/dist/daemon-client/daemon-client.js.map +1 -0
- package/dist/docker/adapters/claude-code.js +194 -20
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/adapters/codex.d.ts +9 -0
- package/dist/docker/adapters/codex.js +297 -0
- package/dist/docker/adapters/codex.js.map +1 -0
- package/dist/docker/adapters/goose.d.ts +12 -11
- package/dist/docker/adapters/goose.js +80 -27
- package/dist/docker/adapters/goose.js.map +1 -1
- package/dist/docker/agent-adapter.d.ts +183 -5
- package/dist/docker/agent-adapter.js +16 -0
- package/dist/docker/agent-adapter.js.map +1 -1
- package/dist/docker/agent-registry.js +5 -0
- package/dist/docker/agent-registry.js.map +1 -1
- package/dist/docker/apple-container-manager.d.ts +49 -0
- package/dist/docker/apple-container-manager.js +464 -0
- package/dist/docker/apple-container-manager.js.map +1 -0
- package/dist/docker/code-mode-proxy.d.ts +38 -0
- package/dist/docker/code-mode-proxy.js +6 -1
- package/dist/docker/code-mode-proxy.js.map +1 -1
- package/dist/docker/container-lifecycle.d.ts +2 -2
- package/dist/docker/container-lifecycle.js.map +1 -1
- package/dist/docker/container-runtime.d.ts +29 -0
- package/dist/docker/container-runtime.js +76 -0
- package/dist/docker/container-runtime.js.map +1 -0
- package/dist/docker/docker-agent-session.d.ts +113 -62
- package/dist/docker/docker-agent-session.js +271 -294
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-infrastructure.d.ts +428 -26
- package/dist/docker/docker-infrastructure.js +1005 -70
- package/dist/docker/docker-infrastructure.js.map +1 -1
- package/dist/docker/docker-manager.d.ts +58 -3
- package/dist/docker/docker-manager.js +378 -33
- package/dist/docker/docker-manager.js.map +1 -1
- package/dist/docker/docker-probe.d.ts +45 -0
- package/dist/docker/docker-probe.js +86 -0
- package/dist/docker/docker-probe.js.map +1 -0
- package/dist/docker/docker-progress-sink.d.ts +43 -0
- package/dist/docker/docker-progress-sink.js +299 -0
- package/dist/docker/docker-progress-sink.js.map +1 -0
- package/dist/docker/mitm-proxy.d.ts +135 -1
- package/dist/docker/mitm-proxy.js +611 -25
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/network-topology.d.ts +81 -0
- package/dist/docker/network-topology.js +160 -0
- package/dist/docker/network-topology.js.map +1 -0
- package/dist/docker/oauth-credentials.d.ts +59 -3
- package/dist/docker/oauth-credentials.js +181 -14
- package/dist/docker/oauth-credentials.js.map +1 -1
- package/dist/docker/oauth-token-manager.js +2 -2
- package/dist/docker/oauth-token-manager.js.map +1 -1
- package/dist/docker/orientation.d.ts +1 -1
- package/dist/docker/package-types.d.ts +1 -1
- package/dist/docker/provider-config.d.ts +78 -3
- package/dist/docker/provider-config.js +295 -31
- package/dist/docker/provider-config.js.map +1 -1
- package/dist/docker/provision-lock.d.ts +46 -0
- package/dist/docker/provision-lock.js +152 -0
- package/dist/docker/provision-lock.js.map +1 -0
- package/dist/docker/proxy-tools.d.ts +0 -2
- package/dist/docker/proxy-tools.js +2 -7
- package/dist/docker/proxy-tools.js.map +1 -1
- package/dist/docker/pty-session.d.ts +64 -1
- package/dist/docker/pty-session.js +306 -104
- package/dist/docker/pty-session.js.map +1 -1
- package/dist/docker/pty-types.d.ts +0 -2
- package/dist/docker/pty-types.js +0 -2
- package/dist/docker/pty-types.js.map +1 -1
- package/dist/docker/registry-proxy.d.ts +46 -0
- package/dist/docker/registry-proxy.js +255 -1
- package/dist/docker/registry-proxy.js.map +1 -1
- package/dist/docker/resource-limits.d.ts +134 -0
- package/dist/docker/resource-limits.js +203 -0
- package/dist/docker/resource-limits.js.map +1 -0
- package/dist/docker/spawn-with-idle-timeout.d.ts +39 -0
- package/dist/docker/spawn-with-idle-timeout.js +152 -0
- package/dist/docker/spawn-with-idle-timeout.js.map +1 -0
- package/dist/docker/sse-extractor.d.ts +51 -0
- package/dist/docker/sse-extractor.js +303 -0
- package/dist/docker/sse-extractor.js.map +1 -0
- package/dist/docker/token-stream-bus.d.ts +83 -0
- package/dist/docker/token-stream-bus.js +98 -0
- package/dist/docker/token-stream-bus.js.map +1 -0
- package/dist/docker/token-stream-types.d.ts +71 -0
- package/dist/docker/token-stream-types.js +8 -0
- package/dist/docker/token-stream-types.js.map +1 -0
- package/dist/docker/trajectory-capture.d.ts +79 -0
- package/dist/docker/trajectory-capture.js +521 -0
- package/dist/docker/trajectory-capture.js.map +1 -0
- package/dist/docker/trajectory-reassembler.d.ts +286 -0
- package/dist/docker/trajectory-reassembler.js +990 -0
- package/dist/docker/trajectory-reassembler.js.map +1 -0
- package/dist/docker/trajectory-tap.d.ts +100 -0
- package/dist/docker/trajectory-tap.js +410 -0
- package/dist/docker/trajectory-tap.js.map +1 -0
- package/dist/docker/trajectory-types.d.ts +187 -0
- package/dist/docker/trajectory-types.js +43 -0
- package/dist/docker/trajectory-types.js.map +1 -0
- package/dist/docker/types.d.ts +105 -12
- package/dist/doctor/checks.d.ts +171 -0
- package/dist/doctor/checks.js +598 -0
- package/dist/doctor/checks.js.map +1 -0
- package/dist/doctor/doctor-command.d.ts +29 -0
- package/dist/doctor/doctor-command.js +190 -0
- package/dist/doctor/doctor-command.js.map +1 -0
- package/dist/doctor/mcp-liveness.d.ts +28 -0
- package/dist/doctor/mcp-liveness.js +92 -0
- package/dist/doctor/mcp-liveness.js.map +1 -0
- package/dist/doctor/oauth-checks.d.ts +23 -0
- package/dist/doctor/oauth-checks.js +157 -0
- package/dist/doctor/oauth-checks.js.map +1 -0
- package/dist/doctor/output.d.ts +26 -0
- package/dist/doctor/output.js +82 -0
- package/dist/doctor/output.js.map +1 -0
- package/dist/escalation/listener-command.js +0 -3
- package/dist/escalation/listener-command.js.map +1 -1
- package/dist/event-bus/typed-event-bus.d.ts +26 -0
- package/dist/event-bus/typed-event-bus.js +35 -0
- package/dist/event-bus/typed-event-bus.js.map +1 -0
- package/dist/index.js +54 -21
- package/dist/index.js.map +1 -1
- package/dist/logger.js +31 -2
- package/dist/logger.js.map +1 -1
- package/dist/memory/auto-save.d.ts +18 -4
- package/dist/memory/auto-save.js +46 -6
- package/dist/memory/auto-save.js.map +1 -1
- package/dist/memory/memory-policy.d.ts +41 -0
- package/dist/memory/memory-policy.js +36 -0
- package/dist/memory/memory-policy.js.map +1 -0
- package/dist/mux/mux-app.d.ts +2 -0
- package/dist/mux/mux-app.js +1 -0
- package/dist/mux/mux-app.js.map +1 -1
- package/dist/mux/mux-command.d.ts +10 -1
- package/dist/mux/mux-command.js +74 -40
- package/dist/mux/mux-command.js.map +1 -1
- package/dist/mux/mux-renderer.js +2 -12
- package/dist/mux/mux-renderer.js.map +1 -1
- package/dist/mux/pty-bridge.d.ts +2 -0
- package/dist/mux/pty-bridge.js +3 -0
- package/dist/mux/pty-bridge.js.map +1 -1
- package/dist/mux/session-scanner.js +1 -2
- package/dist/mux/session-scanner.js.map +1 -1
- package/dist/{pipeline → observability}/llm-logger.d.ts +8 -3
- package/dist/{pipeline → observability}/llm-logger.js +8 -3
- package/dist/observability/llm-logger.js.map +1 -0
- package/dist/observe/observe-command.d.ts +12 -0
- package/dist/observe/observe-command.js +285 -0
- package/dist/observe/observe-command.js.map +1 -0
- package/dist/observe/observe-renderer.d.ts +24 -0
- package/dist/observe/observe-renderer.js +87 -0
- package/dist/observe/observe-renderer.js.map +1 -0
- package/dist/observe/observe-tui-rain.d.ts +42 -0
- package/dist/observe/observe-tui-rain.js +531 -0
- package/dist/observe/observe-tui-rain.js.map +1 -0
- package/dist/observe/observe-tui-text-panel.d.ts +46 -0
- package/dist/observe/observe-tui-text-panel.js +525 -0
- package/dist/observe/observe-tui-text-panel.js.map +1 -0
- package/dist/observe/observe-tui-types.d.ts +270 -0
- package/dist/observe/observe-tui-types.js +200 -0
- package/dist/observe/observe-tui-types.js.map +1 -0
- package/dist/observe/observe-tui-word-scorer.d.ts +143 -0
- package/dist/observe/observe-tui-word-scorer.js +572 -0
- package/dist/observe/observe-tui-word-scorer.js.map +1 -0
- package/dist/observe/observe-tui.d.ts +59 -0
- package/dist/observe/observe-tui.js +592 -0
- package/dist/observe/observe-tui.js.map +1 -0
- package/dist/persona/broad-policy-validator.d.ts +95 -0
- package/dist/persona/broad-policy-validator.js +171 -0
- package/dist/persona/broad-policy-validator.js.map +1 -0
- package/dist/persona/compile-persona-policy.d.ts +54 -2
- package/dist/persona/compile-persona-policy.js +29 -4
- package/dist/persona/compile-persona-policy.js.map +1 -1
- package/dist/persona/event-bus-progress-reporter.d.ts +57 -0
- package/dist/persona/event-bus-progress-reporter.js +66 -0
- package/dist/persona/event-bus-progress-reporter.js.map +1 -0
- package/dist/persona/memory-gate.d.ts +19 -0
- package/dist/persona/memory-gate.js +33 -0
- package/dist/persona/memory-gate.js.map +1 -0
- package/dist/persona/persona-command.js +77 -72
- package/dist/persona/persona-command.js.map +1 -1
- package/dist/persona/persona-compile-orchestrator.d.ts +101 -0
- package/dist/persona/persona-compile-orchestrator.js +504 -0
- package/dist/persona/persona-compile-orchestrator.js.map +1 -0
- package/dist/persona/persona-service.d.ts +137 -0
- package/dist/persona/persona-service.js +263 -0
- package/dist/persona/persona-service.js.map +1 -0
- package/dist/persona/policy-mutation-audit.d.ts +109 -0
- package/dist/persona/policy-mutation-audit.js +179 -0
- package/dist/persona/policy-mutation-audit.js.map +1 -0
- package/dist/persona/resolve.d.ts +22 -0
- package/dist/persona/resolve.js +45 -2
- package/dist/persona/resolve.js.map +1 -1
- package/dist/persona/rule-delta.d.ts +30 -0
- package/dist/persona/rule-delta.js +82 -0
- package/dist/persona/rule-delta.js.map +1 -0
- package/dist/persona/types.d.ts +28 -0
- package/dist/pipeline/annotate.js +10 -2
- package/dist/pipeline/annotate.js.map +1 -1
- package/dist/pipeline/compile.js +14 -2
- package/dist/pipeline/compile.js.map +1 -1
- package/dist/pipeline/constitution-compiler.d.ts +25 -14
- package/dist/pipeline/constitution-compiler.js +107 -38
- package/dist/pipeline/constitution-compiler.js.map +1 -1
- package/dist/pipeline/dynamic-list-types.d.ts +3 -6
- package/dist/pipeline/dynamic-list-types.js +3 -16
- package/dist/pipeline/dynamic-list-types.js.map +1 -1
- package/dist/pipeline/pipeline-runner.d.ts +63 -4
- package/dist/pipeline/pipeline-runner.js +242 -94
- package/dist/pipeline/pipeline-runner.js.map +1 -1
- package/dist/pipeline/pipeline-shared.d.ts +33 -4
- package/dist/pipeline/pipeline-shared.js +79 -19
- package/dist/pipeline/pipeline-shared.js.map +1 -1
- package/dist/pipeline/policy-verifier.js +16 -3
- package/dist/pipeline/policy-verifier.js.map +1 -1
- package/dist/pipeline/proxy-mcp-connections.js +17 -2
- package/dist/pipeline/proxy-mcp-connections.js.map +1 -1
- package/dist/pipeline/refresh-lists.js +3 -5
- package/dist/pipeline/refresh-lists.js.map +1 -1
- package/dist/pipeline/scenario-generator.d.ts +4 -8
- package/dist/pipeline/scenario-generator.js +13 -46
- package/dist/pipeline/scenario-generator.js.map +1 -1
- package/dist/sandbox/index.d.ts +29 -0
- package/dist/sandbox/index.js +351 -119
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/ironcurtain-protocol.d.ts +52 -0
- package/dist/sandbox/ironcurtain-protocol.js +185 -0
- package/dist/sandbox/ironcurtain-protocol.js.map +1 -0
- package/dist/session/agent-session.d.ts +6 -0
- package/dist/session/agent-session.js +16 -5
- package/dist/session/agent-session.js.map +1 -1
- package/dist/session/cli-transport.js +0 -6
- package/dist/session/cli-transport.js.map +1 -1
- package/dist/session/index.d.ts +35 -14
- package/dist/session/index.js +333 -130
- package/dist/session/index.js.map +1 -1
- package/dist/session/preflight.d.ts +21 -13
- package/dist/session/preflight.js +227 -88
- package/dist/session/preflight.js.map +1 -1
- package/dist/session/prompts.d.ts +2 -5
- package/dist/session/prompts.js.map +1 -1
- package/dist/session/session-manager.d.ts +61 -6
- package/dist/session/session-manager.js +72 -10
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/session-metadata.d.ts +21 -5
- package/dist/session/session-metadata.js +34 -12
- package/dist/session/session-metadata.js.map +1 -1
- package/dist/session/types.d.ts +320 -5
- package/dist/session/types.js +57 -1
- package/dist/session/types.js.map +1 -1
- package/dist/signal/bot-command.js +6 -1
- package/dist/signal/bot-command.js.map +1 -1
- package/dist/signal/setup-signal.js +13 -21
- package/dist/signal/setup-signal.js.map +1 -1
- package/dist/signal/signal-bot-daemon.d.ts +16 -1
- package/dist/signal/signal-bot-daemon.js +39 -27
- package/dist/signal/signal-bot-daemon.js.map +1 -1
- package/dist/signal/signal-container.d.ts +3 -3
- package/dist/signal/signal-container.js +9 -3
- package/dist/signal/signal-container.js.map +1 -1
- package/dist/skills/discovery.d.ts +77 -0
- package/dist/skills/discovery.js +206 -0
- package/dist/skills/discovery.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.js +3 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/staging.d.ts +28 -0
- package/dist/skills/staging.js +68 -0
- package/dist/skills/staging.js.map +1 -0
- package/dist/skills/types.d.ts +46 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/trusted-process/approval-whitelist.d.ts +0 -2
- package/dist/trusted-process/approval-whitelist.js +17 -17
- package/dist/trusted-process/approval-whitelist.js.map +1 -1
- package/dist/trusted-process/async-mutex.d.ts +32 -0
- package/dist/trusted-process/async-mutex.js +50 -0
- package/dist/trusted-process/async-mutex.js.map +1 -0
- package/dist/trusted-process/audit-log.d.ts +38 -1
- package/dist/trusted-process/audit-log.js +82 -13
- package/dist/trusted-process/audit-log.js.map +1 -1
- package/dist/trusted-process/call-circuit-breaker.d.ts +6 -0
- package/dist/trusted-process/call-circuit-breaker.js +23 -3
- package/dist/trusted-process/call-circuit-breaker.js.map +1 -1
- package/dist/trusted-process/container-command.d.ts +35 -0
- package/dist/trusted-process/container-command.js +49 -0
- package/dist/trusted-process/container-command.js.map +1 -0
- package/dist/trusted-process/control-server.d.ts +101 -0
- package/dist/trusted-process/control-server.js +282 -0
- package/dist/trusted-process/control-server.js.map +1 -0
- package/dist/trusted-process/domain-utils.d.ts +6 -6
- package/dist/trusted-process/domain-utils.js +7 -23
- package/dist/trusted-process/domain-utils.js.map +1 -1
- package/dist/trusted-process/error-prefixes.d.ts +16 -0
- package/dist/trusted-process/error-prefixes.js +17 -0
- package/dist/trusted-process/error-prefixes.js.map +1 -0
- package/dist/trusted-process/index.d.ts +40 -23
- package/dist/trusted-process/index.js +131 -225
- package/dist/trusted-process/index.js.map +1 -1
- package/dist/trusted-process/list-matcher.d.ts +17 -0
- package/dist/trusted-process/list-matcher.js +31 -0
- package/dist/trusted-process/list-matcher.js.map +1 -0
- package/dist/trusted-process/mcp-client-manager.d.ts +35 -6
- package/dist/trusted-process/mcp-client-manager.js +40 -45
- package/dist/trusted-process/mcp-client-manager.js.map +1 -1
- package/dist/trusted-process/mcp-proxy-server.d.ts +31 -120
- package/dist/trusted-process/mcp-proxy-server.js +201 -660
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/policy-engine.d.ts +16 -4
- package/dist/trusted-process/policy-engine.js +103 -47
- package/dist/trusted-process/policy-engine.js.map +1 -1
- package/dist/trusted-process/policy-roots.d.ts +6 -0
- package/dist/trusted-process/policy-roots.js +20 -0
- package/dist/trusted-process/policy-roots.js.map +1 -1
- package/dist/trusted-process/sandbox-integration.d.ts +12 -0
- package/dist/trusted-process/sandbox-integration.js +18 -0
- package/dist/trusted-process/sandbox-integration.js.map +1 -1
- package/dist/trusted-process/tcp-server-transport.d.ts +12 -1
- package/dist/trusted-process/tcp-server-transport.js +9 -1
- package/dist/trusted-process/tcp-server-transport.js.map +1 -1
- package/dist/trusted-process/tool-call-coordinator.d.ts +283 -0
- package/dist/trusted-process/tool-call-coordinator.js +592 -0
- package/dist/trusted-process/tool-call-coordinator.js.map +1 -0
- package/dist/trusted-process/tool-call-pipeline.d.ts +213 -0
- package/dist/trusted-process/tool-call-pipeline.js +832 -0
- package/dist/trusted-process/tool-call-pipeline.js.map +1 -0
- package/dist/trusted-process/tool-description-hints.d.ts +1 -1
- package/dist/types/argument-roles.d.ts +1 -1
- package/dist/types/argument-roles.js +14 -1
- package/dist/types/argument-roles.js.map +1 -1
- package/dist/types/audit.d.ts +9 -0
- package/dist/{session → types}/errors.d.ts +8 -2
- package/dist/{session → types}/errors.js +8 -2
- package/dist/types/errors.js.map +1 -0
- package/dist/types/reserved-servers.d.ts +11 -0
- package/dist/types/reserved-servers.js +12 -0
- package/dist/types/reserved-servers.js.map +1 -0
- package/dist/types/server-listing.d.ts +14 -0
- package/dist/types/server-listing.js +2 -0
- package/dist/types/server-listing.js.map +1 -0
- package/dist/types/slug.d.ts +2 -0
- package/dist/types/slug.js +2 -0
- package/dist/types/slug.js.map +1 -1
- package/dist/types/url-normalize.d.ts +16 -0
- package/dist/types/url-normalize.js +33 -0
- package/dist/types/url-normalize.js.map +1 -0
- package/dist/util/atomic-write.d.ts +31 -0
- package/dist/util/atomic-write.js +43 -0
- package/dist/util/atomic-write.js.map +1 -0
- package/dist/utils/error-message.d.ts +8 -0
- package/dist/utils/error-message.js +11 -0
- package/dist/utils/error-message.js.map +1 -0
- package/dist/utils/exec-error.d.ts +19 -0
- package/dist/utils/exec-error.js +16 -0
- package/dist/utils/exec-error.js.map +1 -0
- package/dist/utils/is-plain-object.d.ts +7 -0
- package/dist/utils/is-plain-object.js +12 -0
- package/dist/utils/is-plain-object.js.map +1 -0
- package/dist/utils/preflight-checks.d.ts +16 -0
- package/dist/utils/preflight-checks.js +178 -0
- package/dist/utils/preflight-checks.js.map +1 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.d.ts +7 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.js +725 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.js.map +1 -0
- package/dist/web-ui/conn-registry.d.ts +14 -0
- package/dist/web-ui/conn-registry.js +25 -0
- package/dist/web-ui/conn-registry.js.map +1 -0
- package/dist/web-ui/dispatch/escalation-dispatch.d.ts +7 -0
- package/dist/web-ui/dispatch/escalation-dispatch.js +52 -0
- package/dist/web-ui/dispatch/escalation-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/job-dispatch.d.ts +8 -0
- package/dist/web-ui/dispatch/job-dispatch.js +83 -0
- package/dist/web-ui/dispatch/job-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/persona-dispatch.d.ts +50 -0
- package/dist/web-ui/dispatch/persona-dispatch.js +269 -0
- package/dist/web-ui/dispatch/persona-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/session-dispatch.d.ts +9 -0
- package/dist/web-ui/dispatch/session-dispatch.js +219 -0
- package/dist/web-ui/dispatch/session-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/token-stream-dispatch.d.ts +15 -0
- package/dist/web-ui/dispatch/token-stream-dispatch.js +55 -0
- package/dist/web-ui/dispatch/token-stream-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/types.d.ts +54 -0
- package/dist/web-ui/dispatch/types.js +72 -0
- package/dist/web-ui/dispatch/types.js.map +1 -0
- package/dist/web-ui/dispatch/workflow-dispatch.d.ts +103 -0
- package/dist/web-ui/dispatch/workflow-dispatch.js +1036 -0
- package/dist/web-ui/dispatch/workflow-dispatch.js.map +1 -0
- package/dist/web-ui/json-rpc-dispatch.d.ts +12 -0
- package/dist/web-ui/json-rpc-dispatch.js +34 -0
- package/dist/web-ui/json-rpc-dispatch.js.map +1 -0
- package/dist/web-ui/state-graph.d.ts +13 -0
- package/dist/web-ui/state-graph.js +82 -0
- package/dist/web-ui/state-graph.js.map +1 -0
- package/dist/web-ui/token-stream-bridge.d.ts +76 -0
- package/dist/web-ui/token-stream-bridge.js +265 -0
- package/dist/web-ui/token-stream-bridge.js.map +1 -0
- package/dist/web-ui/web-event-bus.d.ts +176 -0
- package/dist/web-ui/web-event-bus.js +19 -0
- package/dist/web-ui/web-event-bus.js.map +1 -0
- package/dist/web-ui/web-session-transport.d.ts +31 -0
- package/dist/web-ui/web-session-transport.js +109 -0
- package/dist/web-ui/web-session-transport.js.map +1 -0
- package/dist/web-ui/web-ui-server.d.ts +90 -0
- package/dist/web-ui/web-ui-server.js +477 -0
- package/dist/web-ui/web-ui-server.js.map +1 -0
- package/dist/web-ui/web-ui-types.d.ts +418 -0
- package/dist/web-ui/web-ui-types.js +32 -0
- package/dist/web-ui/web-ui-types.js.map +1 -0
- package/dist/web-ui/ws-utils.d.ts +5 -0
- package/dist/web-ui/ws-utils.js +12 -0
- package/dist/web-ui/ws-utils.js.map +1 -0
- package/dist/web-ui-static/assets/index-BD5U6ILh.css +1 -0
- package/dist/web-ui-static/assets/index-FMsHWEfK.js +79 -0
- package/dist/web-ui-static/assets/orbitron-latin-700-normal-4jsRXGGJ.woff2 +0 -0
- package/dist/web-ui-static/assets/orbitron-latin-700-normal-DmYOh-W9.woff +0 -0
- package/dist/web-ui-static/index.html +14 -0
- package/dist/workflow/artifacts.d.ts +59 -0
- package/dist/workflow/artifacts.js +188 -0
- package/dist/workflow/artifacts.js.map +1 -0
- package/dist/workflow/checkpoint-selection.d.ts +34 -0
- package/dist/workflow/checkpoint-selection.js +48 -0
- package/dist/workflow/checkpoint-selection.js.map +1 -0
- package/dist/workflow/checkpoint.d.ts +35 -0
- package/dist/workflow/checkpoint.js +84 -0
- package/dist/workflow/checkpoint.js.map +1 -0
- package/dist/workflow/cli-shared.d.ts +62 -0
- package/dist/workflow/cli-shared.js +117 -0
- package/dist/workflow/cli-shared.js.map +1 -0
- package/dist/workflow/cli-support.d.ts +92 -0
- package/dist/workflow/cli-support.js +421 -0
- package/dist/workflow/cli-support.js.map +1 -0
- package/dist/workflow/container-snapshots.d.ts +29 -0
- package/dist/workflow/container-snapshots.js +137 -0
- package/dist/workflow/container-snapshots.js.map +1 -0
- package/dist/workflow/daemon-gate-commands.d.ts +21 -0
- package/dist/workflow/daemon-gate-commands.js +599 -0
- package/dist/workflow/daemon-gate-commands.js.map +1 -0
- package/dist/workflow/definition-loader.d.ts +32 -0
- package/dist/workflow/definition-loader.js +56 -0
- package/dist/workflow/definition-loader.js.map +1 -0
- package/dist/workflow/discovery.d.ts +107 -0
- package/dist/workflow/discovery.js +263 -0
- package/dist/workflow/discovery.js.map +1 -0
- package/dist/workflow/errors.d.ts +66 -0
- package/dist/workflow/errors.js +49 -0
- package/dist/workflow/errors.js.map +1 -0
- package/dist/workflow/guards.d.ts +8 -0
- package/dist/workflow/guards.js +38 -0
- package/dist/workflow/guards.js.map +1 -0
- package/dist/workflow/lane-template.d.ts +89 -0
- package/dist/workflow/lane-template.js +141 -0
- package/dist/workflow/lane-template.js.map +1 -0
- package/dist/workflow/lint-integration.d.ts +64 -0
- package/dist/workflow/lint-integration.js +56 -0
- package/dist/workflow/lint-integration.js.map +1 -0
- package/dist/workflow/lint.d.ts +72 -0
- package/dist/workflow/lint.js +593 -0
- package/dist/workflow/lint.js.map +1 -0
- package/dist/workflow/machine-builder.d.ts +178 -0
- package/dist/workflow/machine-builder.js +678 -0
- package/dist/workflow/machine-builder.js.map +1 -0
- package/dist/workflow/message-log.d.ts +99 -0
- package/dist/workflow/message-log.js +40 -0
- package/dist/workflow/message-log.js.map +1 -0
- package/dist/workflow/orchestrator.d.ts +954 -0
- package/dist/workflow/orchestrator.js +3594 -0
- package/dist/workflow/orchestrator.js.map +1 -0
- package/dist/workflow/prompt-builder.d.ts +39 -0
- package/dist/workflow/prompt-builder.js +243 -0
- package/dist/workflow/prompt-builder.js.map +1 -0
- package/dist/workflow/run-state-command.d.ts +9 -0
- package/dist/workflow/run-state-command.js +414 -0
- package/dist/workflow/run-state-command.js.map +1 -0
- package/dist/workflow/run-state-debug-capture.d.ts +40 -0
- package/dist/workflow/run-state-debug-capture.js +101 -0
- package/dist/workflow/run-state-debug-capture.js.map +1 -0
- package/dist/workflow/status-parser.d.ts +68 -0
- package/dist/workflow/status-parser.js +274 -0
- package/dist/workflow/status-parser.js.map +1 -0
- package/dist/workflow/types.d.ts +598 -0
- package/dist/workflow/types.js +85 -0
- package/dist/workflow/types.js.map +1 -0
- package/dist/workflow/validate.d.ts +80 -0
- package/dist/workflow/validate.js +788 -0
- package/dist/workflow/validate.js.map +1 -0
- package/dist/workflow/workflow-command.d.ts +9 -0
- package/dist/workflow/workflow-command.js +670 -0
- package/dist/workflow/workflow-command.js.map +1 -0
- package/dist/workflow/workflow-discovery.d.ts +27 -0
- package/dist/workflow/workflow-discovery.js +121 -0
- package/dist/workflow/workflow-discovery.js.map +1 -0
- package/dist/workflow/workflow-manager.d.ts +156 -0
- package/dist/workflow/workflow-manager.js +359 -0
- package/dist/workflow/workflow-manager.js.map +1 -0
- package/dist/workflow/workflows/design-and-code/README.md +50 -0
- package/dist/workflow/workflows/design-and-code/workflow.yaml +169 -0
- package/dist/workflow/workflows/deterministic-eval-smoke/scripts/format_report.js +29 -0
- package/dist/workflow/workflows/deterministic-eval-smoke/scripts/package.json +5 -0
- package/dist/workflow/workflows/deterministic-eval-smoke/scripts/requirements.txt +1 -0
- package/dist/workflow/workflows/deterministic-eval-smoke/scripts/run_eval.py +41 -0
- package/dist/workflow/workflows/deterministic-eval-smoke/workflow.yaml +57 -0
- package/dist/workflow/workflows/deterministic-verdict-smoke/scripts/classify.py +18 -0
- package/dist/workflow/workflows/deterministic-verdict-smoke/workflow.yaml +51 -0
- package/dist/workflow/workflows/evolve/scripts/LICENSE +201 -0
- package/dist/workflow/workflows/evolve/scripts/README.md +314 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-brief +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-cognition +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-db +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-eval +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-files +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve-summary +16 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/__init__.py +14 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/__init__.py +17 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/base.py +21 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/factory.py +90 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/greedy.py +17 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/island.py +316 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/random.py +18 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/algorithms/ucb1.py +55 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/best_snapshot.py +62 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/cli.py +752 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/cognition.py +127 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/database.py +218 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/diff.py +57 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/embedding.py +84 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/file_lock.py +45 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/run_state.py +343 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/sampling_config.py +173 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/structures.py +93 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_core/vector_index.py +191 -0
- package/dist/workflow/workflows/evolve/scripts/evolve_result.py +1503 -0
- package/dist/workflow/workflows/evolve/scripts/requirements.txt +2 -0
- package/dist/workflow/workflows/evolve/workflow.yaml +646 -0
- package/dist/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
- package/dist/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
- package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
- package/dist/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
- package/dist/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
- package/dist/workflow/workflows/test-email-summary/workflow.yaml +90 -0
- package/dist/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +206 -0
- package/dist/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +167 -0
- package/dist/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +189 -0
- package/dist/workflow/workflows/vuln-discovery/workflow.yaml +925 -0
- package/dist/workflow/worktree.d.ts +43 -0
- package/dist/workflow/worktree.js +106 -0
- package/dist/workflow/worktree.js.map +1 -0
- package/docker/Dockerfile.base +31 -0
- package/docker/Dockerfile.base.arm64 +27 -0
- package/docker/Dockerfile.claude-code +3 -1
- package/docker/Dockerfile.codex +17 -0
- package/docker/Dockerfile.goose +3 -1
- package/docker/entrypoint-claude-code.sh +7 -0
- package/docker/entrypoint-codex.sh +42 -0
- package/docker/entrypoint-goose.sh +6 -0
- package/docker/entrypoint-uid-remap.sh +93 -0
- package/package.json +27 -11
- package/packages/web-ui/README.md +113 -0
- package/packages/web-ui/docs/workflow-state-machine.png +0 -0
- package/src/config/generated/compiled-policy.json +528 -161
- package/src/config/generated/test-scenarios.json +4810 -170
- package/src/config/generated/tool-annotations.json +34 -47
- package/src/config/mcp-servers.json +2 -2
- package/src/workflow/workflows/design-and-code/README.md +50 -0
- package/src/workflow/workflows/design-and-code/workflow.yaml +169 -0
- package/src/workflow/workflows/deterministic-eval-smoke/scripts/format_report.js +29 -0
- package/src/workflow/workflows/deterministic-eval-smoke/scripts/package.json +5 -0
- package/src/workflow/workflows/deterministic-eval-smoke/scripts/requirements.txt +1 -0
- package/src/workflow/workflows/deterministic-eval-smoke/scripts/run_eval.py +41 -0
- package/src/workflow/workflows/deterministic-eval-smoke/workflow.yaml +57 -0
- package/src/workflow/workflows/deterministic-verdict-smoke/scripts/classify.py +18 -0
- package/src/workflow/workflows/deterministic-verdict-smoke/workflow.yaml +51 -0
- package/src/workflow/workflows/evolve/scripts/LICENSE +201 -0
- package/src/workflow/workflows/evolve/scripts/README.md +314 -0
- package/src/workflow/workflows/evolve/scripts/evolve-brief +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve-cognition +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve-db +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve-eval +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve-files +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve-summary +16 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/__init__.py +14 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/__init__.py +17 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/base.py +21 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/factory.py +90 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/greedy.py +17 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/island.py +316 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/random.py +18 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/algorithms/ucb1.py +55 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/best_snapshot.py +62 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/cli.py +752 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/cognition.py +127 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/database.py +218 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/diff.py +57 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/embedding.py +84 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/file_lock.py +45 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/run_state.py +343 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/sampling_config.py +173 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/structures.py +93 -0
- package/src/workflow/workflows/evolve/scripts/evolve_core/vector_index.py +191 -0
- package/src/workflow/workflows/evolve/scripts/evolve_result.py +1503 -0
- package/src/workflow/workflows/evolve/scripts/requirements.txt +2 -0
- package/src/workflow/workflows/evolve/workflow.yaml +646 -0
- package/src/workflow/workflows/test-email-summary/skills/email-formatting/SKILL.md +55 -0
- package/src/workflow/workflows/test-email-summary/skills/gmail-query-syntax/SKILL.md +63 -0
- package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/SKILL.md +41 -0
- package/src/workflow/workflows/test-email-summary/skills/json-schema-emails/schema.json +34 -0
- package/src/workflow/workflows/test-email-summary/skills/summary-style-guide/SKILL.md +51 -0
- package/src/workflow/workflows/test-email-summary/workflow.yaml +90 -0
- package/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing/SKILL.md +206 -0
- package/src/workflow/workflows/vuln-discovery/skills/memory-safety-c-cpp/SKILL.md +167 -0
- package/src/workflow/workflows/vuln-discovery/skills/vulnerability-triage/SKILL.md +189 -0
- package/src/workflow/workflows/vuln-discovery/workflow.yaml +925 -0
- package/dist/pipeline/llm-logger.js.map +0 -1
- package/dist/session/errors.js.map +0 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" data-theme="iron" class="h-full">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>IronCurtain</title>
|
|
7
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-FMsHWEfK.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BD5U6ILh.css">
|
|
10
|
+
</head>
|
|
11
|
+
<body class="bg-background text-foreground h-full antialiased">
|
|
12
|
+
<div id="app"></div>
|
|
13
|
+
</body>
|
|
14
|
+
</html>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { WorkflowId } from './types.js';
|
|
2
|
+
export interface CollectedFile {
|
|
3
|
+
/** Path relative to the root directory, using forward slashes. */
|
|
4
|
+
readonly relativePath: string;
|
|
5
|
+
/** Absolute path on disk. */
|
|
6
|
+
readonly fullPath: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Recursively walks a directory and returns all regular files (not directories
|
|
10
|
+
* or symlinks). Results are sorted by relative path for deterministic ordering.
|
|
11
|
+
*/
|
|
12
|
+
export declare function collectFilesRecursive(dir: string): CollectedFile[];
|
|
13
|
+
/**
|
|
14
|
+
* Recursively checks whether a directory contains any regular files.
|
|
15
|
+
* More efficient than collectFilesRecursive when you only need a boolean.
|
|
16
|
+
*/
|
|
17
|
+
export declare function hasAnyFiles(dir: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Copies output artifact directories to versioned backups before a state
|
|
20
|
+
* is re-entered. Agents always write to the same canonical paths — versioning
|
|
21
|
+
* is transparent to them.
|
|
22
|
+
*
|
|
23
|
+
* On the Nth visit (N > 1), each output's directory is copied to `<name>.v<N-1>`.
|
|
24
|
+
* For example, the second visit creates `.v1`, the third creates `.v2`.
|
|
25
|
+
*
|
|
26
|
+
* Idempotency: if the versioned directory already exists (e.g., on resume),
|
|
27
|
+
* the copy is skipped to avoid overwriting a clean snapshot with corrupted data.
|
|
28
|
+
*/
|
|
29
|
+
export declare function snapshotArtifacts(artifactDir: string, outputs: readonly string[], visitNumber: number, unversionedArtifacts: ReadonlySet<string>): void;
|
|
30
|
+
/** Manages artifact directories and files for workflow state transitions. */
|
|
31
|
+
export interface ArtifactManager {
|
|
32
|
+
/** Ensure the artifact directory structure exists for a workflow. Returns artifact dir path. */
|
|
33
|
+
initialize(workflowId: WorkflowId): string;
|
|
34
|
+
/** Read an artifact file's content. Returns undefined if not found. */
|
|
35
|
+
read(workflowId: WorkflowId, artifactName: string): string | undefined;
|
|
36
|
+
/** List all files in an artifact subdirectory. */
|
|
37
|
+
listArtifactFiles(workflowId: WorkflowId, artifactName: string): string[];
|
|
38
|
+
/** Check which expected outputs are missing. Returns list of missing artifact names. */
|
|
39
|
+
findMissing(workflowId: WorkflowId, expectedOutputs: readonly string[]): string[];
|
|
40
|
+
/** Compute SHA-256 hash of artifact directories' contents. Deterministic ordering. */
|
|
41
|
+
computeHash(workflowId: WorkflowId, artifactNames: readonly string[]): string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* File-based artifact manager. Each workflow gets an artifact directory at
|
|
45
|
+
* `{baseDir}/{workflowId}/artifacts/`. Within that, each artifact name
|
|
46
|
+
* maps to a subdirectory containing one or more files.
|
|
47
|
+
*/
|
|
48
|
+
export declare class FileArtifactManager implements ArtifactManager {
|
|
49
|
+
private readonly baseDir;
|
|
50
|
+
constructor(baseDir: string);
|
|
51
|
+
initialize(workflowId: WorkflowId): string;
|
|
52
|
+
read(workflowId: WorkflowId, artifactName: string): string | undefined;
|
|
53
|
+
listArtifactFiles(workflowId: WorkflowId, artifactName: string): string[];
|
|
54
|
+
findMissing(workflowId: WorkflowId, expectedOutputs: readonly string[]): string[];
|
|
55
|
+
computeHash(workflowId: WorkflowId, artifactNames: readonly string[]): string;
|
|
56
|
+
/** Get the artifact directory path for a workflow. */
|
|
57
|
+
artifactDirFor(workflowId: WorkflowId): string;
|
|
58
|
+
private artifactDir;
|
|
59
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { readFileSync, mkdirSync, readdirSync, existsSync, lstatSync, statSync, cpSync } from 'node:fs';
|
|
2
|
+
import { resolve, relative, sep } from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
/**
|
|
5
|
+
* Recursively walks a directory and returns all regular files (not directories
|
|
6
|
+
* or symlinks). Results are sorted by relative path for deterministic ordering.
|
|
7
|
+
*/
|
|
8
|
+
export function collectFilesRecursive(dir) {
|
|
9
|
+
if (!existsSync(dir))
|
|
10
|
+
return [];
|
|
11
|
+
const results = [];
|
|
12
|
+
walkDir(dir, dir, results);
|
|
13
|
+
results.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
|
|
14
|
+
return results;
|
|
15
|
+
}
|
|
16
|
+
function walkDir(rootDir, currentDir, results) {
|
|
17
|
+
let entries;
|
|
18
|
+
try {
|
|
19
|
+
entries = readdirSync(currentDir);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return; // Directory removed or inaccessible
|
|
23
|
+
}
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
const fullPath = resolve(currentDir, entry);
|
|
26
|
+
try {
|
|
27
|
+
const lstats = lstatSync(fullPath);
|
|
28
|
+
if (lstats.isSymbolicLink())
|
|
29
|
+
continue;
|
|
30
|
+
if (lstats.isDirectory()) {
|
|
31
|
+
walkDir(rootDir, fullPath, results);
|
|
32
|
+
}
|
|
33
|
+
else if (lstats.isFile()) {
|
|
34
|
+
results.push({
|
|
35
|
+
relativePath: relative(rootDir, fullPath).split(sep).join('/'),
|
|
36
|
+
fullPath,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// File removed between readdir and lstat, or permission error — skip
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Recursively checks whether a directory contains any regular files.
|
|
48
|
+
* More efficient than collectFilesRecursive when you only need a boolean.
|
|
49
|
+
*/
|
|
50
|
+
export function hasAnyFiles(dir) {
|
|
51
|
+
if (!existsSync(dir))
|
|
52
|
+
return false;
|
|
53
|
+
return hasAnyFilesInDir(dir);
|
|
54
|
+
}
|
|
55
|
+
function hasAnyFilesInDir(currentDir) {
|
|
56
|
+
let entries;
|
|
57
|
+
try {
|
|
58
|
+
entries = readdirSync(currentDir);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return false; // Directory removed or inaccessible
|
|
62
|
+
}
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
const fullPath = resolve(currentDir, entry);
|
|
65
|
+
try {
|
|
66
|
+
const lstats = lstatSync(fullPath);
|
|
67
|
+
if (lstats.isSymbolicLink())
|
|
68
|
+
continue;
|
|
69
|
+
if (lstats.isFile())
|
|
70
|
+
return true;
|
|
71
|
+
if (lstats.isDirectory() && hasAnyFilesInDir(fullPath))
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// File removed between readdir and lstat, or permission error — skip
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// Artifact versioning
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
/**
|
|
85
|
+
* Copies output artifact directories to versioned backups before a state
|
|
86
|
+
* is re-entered. Agents always write to the same canonical paths — versioning
|
|
87
|
+
* is transparent to them.
|
|
88
|
+
*
|
|
89
|
+
* On the Nth visit (N > 1), each output's directory is copied to `<name>.v<N-1>`.
|
|
90
|
+
* For example, the second visit creates `.v1`, the third creates `.v2`.
|
|
91
|
+
*
|
|
92
|
+
* Idempotency: if the versioned directory already exists (e.g., on resume),
|
|
93
|
+
* the copy is skipped to avoid overwriting a clean snapshot with corrupted data.
|
|
94
|
+
*/
|
|
95
|
+
export function snapshotArtifacts(artifactDir, outputs, visitNumber, unversionedArtifacts) {
|
|
96
|
+
if (visitNumber <= 1)
|
|
97
|
+
return;
|
|
98
|
+
const versionSuffix = `.v${visitNumber - 1}`;
|
|
99
|
+
for (const output of outputs) {
|
|
100
|
+
if (unversionedArtifacts.has(output))
|
|
101
|
+
continue;
|
|
102
|
+
const src = resolve(artifactDir, output);
|
|
103
|
+
if (!existsSync(src))
|
|
104
|
+
continue;
|
|
105
|
+
const dest = resolve(artifactDir, `${output}${versionSuffix}`);
|
|
106
|
+
if (existsSync(dest))
|
|
107
|
+
continue;
|
|
108
|
+
try {
|
|
109
|
+
cpSync(src, dest, { recursive: true });
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
// Best-effort: a single failed copy must not abort a long-running agent run.
|
|
113
|
+
// Write directly to stderr to bypass any console hijacking
|
|
114
|
+
// (logger.setup() redirects console.error to a log file).
|
|
115
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
116
|
+
process.stderr.write(`[workflow] snapshotArtifacts: failed to copy "${src}" to "${dest}": ${message}\n`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// File-based implementation
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
/**
|
|
124
|
+
* File-based artifact manager. Each workflow gets an artifact directory at
|
|
125
|
+
* `{baseDir}/{workflowId}/artifacts/`. Within that, each artifact name
|
|
126
|
+
* maps to a subdirectory containing one or more files.
|
|
127
|
+
*/
|
|
128
|
+
export class FileArtifactManager {
|
|
129
|
+
baseDir;
|
|
130
|
+
constructor(baseDir) {
|
|
131
|
+
this.baseDir = baseDir;
|
|
132
|
+
}
|
|
133
|
+
initialize(workflowId) {
|
|
134
|
+
const artifactDir = this.artifactDir(workflowId);
|
|
135
|
+
mkdirSync(artifactDir, { recursive: true });
|
|
136
|
+
return artifactDir;
|
|
137
|
+
}
|
|
138
|
+
read(workflowId, artifactName) {
|
|
139
|
+
const dir = resolve(this.artifactDir(workflowId), artifactName);
|
|
140
|
+
if (!existsSync(dir))
|
|
141
|
+
return undefined;
|
|
142
|
+
// Try convention name first, then fall back to first file
|
|
143
|
+
const conventionPath = resolve(dir, `${artifactName}.md`);
|
|
144
|
+
if (existsSync(conventionPath)) {
|
|
145
|
+
return readFileSync(conventionPath, 'utf-8');
|
|
146
|
+
}
|
|
147
|
+
const files = collectFilesRecursive(dir);
|
|
148
|
+
if (files.length === 0)
|
|
149
|
+
return undefined;
|
|
150
|
+
return readFileSync(files[0].fullPath, 'utf-8');
|
|
151
|
+
}
|
|
152
|
+
listArtifactFiles(workflowId, artifactName) {
|
|
153
|
+
const dir = resolve(this.artifactDir(workflowId), artifactName);
|
|
154
|
+
return collectFilesRecursive(dir).map((f) => f.relativePath);
|
|
155
|
+
}
|
|
156
|
+
findMissing(workflowId, expectedOutputs) {
|
|
157
|
+
const artifactDir = this.artifactDir(workflowId);
|
|
158
|
+
const missing = [];
|
|
159
|
+
for (const name of expectedOutputs) {
|
|
160
|
+
const dir = resolve(artifactDir, name);
|
|
161
|
+
if (!hasAnyFiles(dir)) {
|
|
162
|
+
missing.push(name);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return missing;
|
|
166
|
+
}
|
|
167
|
+
computeHash(workflowId, artifactNames) {
|
|
168
|
+
const hash = createHash('sha256');
|
|
169
|
+
const artifactDir = this.artifactDir(workflowId);
|
|
170
|
+
for (const name of [...artifactNames].sort()) {
|
|
171
|
+
const dir = resolve(artifactDir, name);
|
|
172
|
+
const files = collectFilesRecursive(dir);
|
|
173
|
+
for (const file of files) {
|
|
174
|
+
const { size, mtimeMs } = statSync(file.fullPath);
|
|
175
|
+
hash.update(`${file.relativePath}:${size}:${mtimeMs}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return hash.digest('hex');
|
|
179
|
+
}
|
|
180
|
+
/** Get the artifact directory path for a workflow. */
|
|
181
|
+
artifactDirFor(workflowId) {
|
|
182
|
+
return this.artifactDir(workflowId);
|
|
183
|
+
}
|
|
184
|
+
artifactDir(workflowId) {
|
|
185
|
+
return resolve(this.baseDir, workflowId, 'artifacts');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/workflow/artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Past-run checkpoint selection helpers.
|
|
3
|
+
*
|
|
4
|
+
* Both the CLI (`workflow resume`) and the daemon's
|
|
5
|
+
* `WorkflowManager.importExternalCheckpoint` need to scan a base directory
|
|
6
|
+
* for resumable workflow runs and pick the most recent. Centralized here
|
|
7
|
+
* so both paths use the same enumeration + filter + sort logic.
|
|
8
|
+
*
|
|
9
|
+
* Sort comparator: ISO-8601 string compare on `checkpoint.timestamp`. Both
|
|
10
|
+
* the previous CLI implementation (`new Date(...).getTime()`) and the
|
|
11
|
+
* previous daemon implementation (`a > b` string compare) produce the same
|
|
12
|
+
* order; string compare is one fewer allocation per row.
|
|
13
|
+
*/
|
|
14
|
+
import { type FileCheckpointStore } from './checkpoint.js';
|
|
15
|
+
import type { WorkflowCheckpoint, WorkflowId } from './types.js';
|
|
16
|
+
/** A resumable past run paired with its loaded checkpoint. */
|
|
17
|
+
export interface ResumableCheckpoint {
|
|
18
|
+
readonly workflowId: WorkflowId;
|
|
19
|
+
readonly checkpoint: WorkflowCheckpoint;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Returns every resumable past run under `baseDir`, sorted newest-first by
|
|
23
|
+
* `checkpoint.timestamp` (ISO-8601 string compare).
|
|
24
|
+
*
|
|
25
|
+
* "Resumable" means: the directory has a checkpoint file, the checkpoint
|
|
26
|
+
* loads successfully, and {@link isCheckpointResumable} returns true
|
|
27
|
+
* (i.e. the checkpoint is not in a `completed` final phase).
|
|
28
|
+
*/
|
|
29
|
+
export declare function findResumableCheckpoints(baseDir: string, store: FileCheckpointStore): ResumableCheckpoint[];
|
|
30
|
+
/**
|
|
31
|
+
* Returns the most recent resumable past run under `baseDir`, or `undefined`
|
|
32
|
+
* if none exist. Convenience wrapper over {@link findResumableCheckpoints}.
|
|
33
|
+
*/
|
|
34
|
+
export declare function findLatestResumableCheckpoint(baseDir: string, store: FileCheckpointStore): ResumableCheckpoint | undefined;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Past-run checkpoint selection helpers.
|
|
3
|
+
*
|
|
4
|
+
* Both the CLI (`workflow resume`) and the daemon's
|
|
5
|
+
* `WorkflowManager.importExternalCheckpoint` need to scan a base directory
|
|
6
|
+
* for resumable workflow runs and pick the most recent. Centralized here
|
|
7
|
+
* so both paths use the same enumeration + filter + sort logic.
|
|
8
|
+
*
|
|
9
|
+
* Sort comparator: ISO-8601 string compare on `checkpoint.timestamp`. Both
|
|
10
|
+
* the previous CLI implementation (`new Date(...).getTime()`) and the
|
|
11
|
+
* previous daemon implementation (`a > b` string compare) produce the same
|
|
12
|
+
* order; string compare is one fewer allocation per row.
|
|
13
|
+
*/
|
|
14
|
+
import { discoverWorkflowRuns } from './workflow-discovery.js';
|
|
15
|
+
import { isCheckpointResumable } from './checkpoint.js';
|
|
16
|
+
/**
|
|
17
|
+
* Returns every resumable past run under `baseDir`, sorted newest-first by
|
|
18
|
+
* `checkpoint.timestamp` (ISO-8601 string compare).
|
|
19
|
+
*
|
|
20
|
+
* "Resumable" means: the directory has a checkpoint file, the checkpoint
|
|
21
|
+
* loads successfully, and {@link isCheckpointResumable} returns true
|
|
22
|
+
* (i.e. the checkpoint is not in a `completed` final phase).
|
|
23
|
+
*/
|
|
24
|
+
export function findResumableCheckpoints(baseDir, store) {
|
|
25
|
+
const candidates = [];
|
|
26
|
+
for (const run of discoverWorkflowRuns(baseDir)) {
|
|
27
|
+
if (!run.hasCheckpoint)
|
|
28
|
+
continue;
|
|
29
|
+
const cp = store.load(run.workflowId);
|
|
30
|
+
if (!cp || !isCheckpointResumable(cp))
|
|
31
|
+
continue;
|
|
32
|
+
candidates.push({ workflowId: run.workflowId, checkpoint: cp });
|
|
33
|
+
}
|
|
34
|
+
candidates.sort((a, b) => {
|
|
35
|
+
if (a.checkpoint.timestamp === b.checkpoint.timestamp)
|
|
36
|
+
return 0;
|
|
37
|
+
return a.checkpoint.timestamp < b.checkpoint.timestamp ? 1 : -1;
|
|
38
|
+
});
|
|
39
|
+
return candidates;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Returns the most recent resumable past run under `baseDir`, or `undefined`
|
|
43
|
+
* if none exist. Convenience wrapper over {@link findResumableCheckpoints}.
|
|
44
|
+
*/
|
|
45
|
+
export function findLatestResumableCheckpoint(baseDir, store) {
|
|
46
|
+
return findResumableCheckpoints(baseDir, store)[0];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=checkpoint-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-selection.js","sourceRoot":"","sources":["../../src/workflow/checkpoint-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAA4B,MAAM,iBAAiB,CAAC;AASlF;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAe,EAAE,KAA0B;IAClF,MAAM,UAAU,GAA0B,EAAE,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,aAAa;YAAE,SAAS;QACjC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAAE,SAAS;QAChD,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,KAAK,CAAC,CAAC,UAAU,CAAC,SAAS;YAAE,OAAO,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAC3C,OAAe,EACf,KAA0B;IAE1B,OAAO,wBAAwB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { WorkflowId, WorkflowCheckpoint } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resumable iff not completed. `finalStatus` is undefined for mid-run and
|
|
4
|
+
* pre-B3b legacy checkpoints — both correctly resolve to `true`.
|
|
5
|
+
*
|
|
6
|
+
* Co-located with `WorkflowCheckpoint` storage so other modules can import
|
|
7
|
+
* the predicate without pulling in CLI / session dependencies.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isCheckpointResumable(cp: WorkflowCheckpoint): boolean;
|
|
10
|
+
/** Persistent storage for workflow checkpoints. */
|
|
11
|
+
export interface CheckpointStore {
|
|
12
|
+
/** Save a checkpoint. Overwrites any previous checkpoint for this workflow. */
|
|
13
|
+
save(workflowId: WorkflowId, checkpoint: WorkflowCheckpoint): void;
|
|
14
|
+
/** Load the most recent checkpoint for a workflow. Returns undefined if none exists. */
|
|
15
|
+
load(workflowId: WorkflowId): WorkflowCheckpoint | undefined;
|
|
16
|
+
/** List workflow IDs that have checkpoints (for resume discovery). */
|
|
17
|
+
listAll(): WorkflowId[];
|
|
18
|
+
/** Remove a checkpoint (on workflow completion or abort). */
|
|
19
|
+
remove(workflowId: WorkflowId): void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* File-based checkpoint store. Each workflow gets a directory at
|
|
23
|
+
* `{baseDir}/{workflowId}/checkpoint.json`. Writes are atomic
|
|
24
|
+
* (write to temp file, then rename) to prevent corruption from
|
|
25
|
+
* partial writes.
|
|
26
|
+
*/
|
|
27
|
+
export declare class FileCheckpointStore implements CheckpointStore {
|
|
28
|
+
private readonly baseDir;
|
|
29
|
+
constructor(baseDir: string);
|
|
30
|
+
save(workflowId: WorkflowId, checkpoint: WorkflowCheckpoint): void;
|
|
31
|
+
load(workflowId: WorkflowId): WorkflowCheckpoint | undefined;
|
|
32
|
+
listAll(): WorkflowId[];
|
|
33
|
+
remove(workflowId: WorkflowId): void;
|
|
34
|
+
private checkpointPath;
|
|
35
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, rmSync, readdirSync, existsSync, renameSync } from 'node:fs';
|
|
2
|
+
import { resolve, dirname } from 'node:path';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Resumability predicate
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
/**
|
|
8
|
+
* Resumable iff not completed. `finalStatus` is undefined for mid-run and
|
|
9
|
+
* pre-B3b legacy checkpoints — both correctly resolve to `true`.
|
|
10
|
+
*
|
|
11
|
+
* Co-located with `WorkflowCheckpoint` storage so other modules can import
|
|
12
|
+
* the predicate without pulling in CLI / session dependencies.
|
|
13
|
+
*/
|
|
14
|
+
export function isCheckpointResumable(cp) {
|
|
15
|
+
return cp.finalStatus?.phase !== 'completed';
|
|
16
|
+
}
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// File-based implementation
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/**
|
|
21
|
+
* File-based checkpoint store. Each workflow gets a directory at
|
|
22
|
+
* `{baseDir}/{workflowId}/checkpoint.json`. Writes are atomic
|
|
23
|
+
* (write to temp file, then rename) to prevent corruption from
|
|
24
|
+
* partial writes.
|
|
25
|
+
*/
|
|
26
|
+
export class FileCheckpointStore {
|
|
27
|
+
baseDir;
|
|
28
|
+
constructor(baseDir) {
|
|
29
|
+
this.baseDir = baseDir;
|
|
30
|
+
}
|
|
31
|
+
save(workflowId, checkpoint) {
|
|
32
|
+
const filePath = this.checkpointPath(workflowId);
|
|
33
|
+
const dir = dirname(filePath);
|
|
34
|
+
mkdirSync(dir, { recursive: true });
|
|
35
|
+
const content = JSON.stringify(checkpoint, null, 2);
|
|
36
|
+
const tempPath = resolve(dir, `checkpoint.tmp.${randomUUID()}`);
|
|
37
|
+
writeFileSync(tempPath, content, 'utf-8');
|
|
38
|
+
renameSync(tempPath, filePath);
|
|
39
|
+
}
|
|
40
|
+
load(workflowId) {
|
|
41
|
+
const filePath = this.checkpointPath(workflowId);
|
|
42
|
+
try {
|
|
43
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
44
|
+
return JSON.parse(content);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
if (err instanceof Error && 'code' in err && err.code === 'ENOENT') {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
throw err;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
listAll() {
|
|
54
|
+
if (!existsSync(this.baseDir))
|
|
55
|
+
return [];
|
|
56
|
+
const entries = readdirSync(this.baseDir, { withFileTypes: true });
|
|
57
|
+
const ids = [];
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (!entry.isDirectory())
|
|
60
|
+
continue;
|
|
61
|
+
const checkpointFile = resolve(this.baseDir, entry.name, 'checkpoint.json');
|
|
62
|
+
if (existsSync(checkpointFile)) {
|
|
63
|
+
ids.push(entry.name);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return ids;
|
|
67
|
+
}
|
|
68
|
+
remove(workflowId) {
|
|
69
|
+
const filePath = this.checkpointPath(workflowId);
|
|
70
|
+
try {
|
|
71
|
+
rmSync(filePath);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
if (err instanceof Error && 'code' in err && err.code === 'ENOENT') {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
checkpointPath(workflowId) {
|
|
81
|
+
return resolve(this.baseDir, workflowId, 'checkpoint.json');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/workflow/checkpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared CLI helpers used by both `workflow-command.ts` (the dispatcher) and
|
|
3
|
+
* `run-state-command.ts` (a subcommand handler).
|
|
4
|
+
*
|
|
5
|
+
* This module is a leaf: it depends only on other shared leaves
|
|
6
|
+
* (`./cli-support.js`, `./lint-integration.js`, `./definition-loader.js`,
|
|
7
|
+
* `./lint.js`, `./types.js`) and must NOT import from `workflow-command.ts`
|
|
8
|
+
* or `run-state-command.ts`. It exists to break the runtime import cycle
|
|
9
|
+
* those two modules would otherwise form.
|
|
10
|
+
*/
|
|
11
|
+
import { parseArgs } from 'node:util';
|
|
12
|
+
import { type LintMode } from './lint-integration.js';
|
|
13
|
+
import type { Diagnostic } from './lint.js';
|
|
14
|
+
import type { WorkflowDefinition } from './types.js';
|
|
15
|
+
export declare function formatDiagnostic(d: Diagnostic): string[];
|
|
16
|
+
export declare function printDiagnostics(diagnostics: readonly Diagnostic[]): void;
|
|
17
|
+
/**
|
|
18
|
+
* Loads + validates a workflow definition from a path via the shared
|
|
19
|
+
* {@link loadDefinition} helper. Prints CLI-formatted errors and exits on
|
|
20
|
+
* any failure (parse or validate). Validation errors take precedence over
|
|
21
|
+
* lint diagnostics.
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadAndValidateDefinition(path: string): WorkflowDefinition;
|
|
24
|
+
/**
|
|
25
|
+
* Loads + lints a workflow definition file via the shared
|
|
26
|
+
* {@link runPreflight} helper. CLI-specific reporting: prints diagnostics
|
|
27
|
+
* to stderr and exits on any failure (load or lint). On success with
|
|
28
|
+
* warnings-only output, prints a short continue notice.
|
|
29
|
+
*
|
|
30
|
+
* Returns the loaded definition on success so callers can continue using it
|
|
31
|
+
* without re-parsing (start/resume have already routed through the same
|
|
32
|
+
* file before calling this).
|
|
33
|
+
*/
|
|
34
|
+
export declare function runCliPreflightLint(definitionPath: string, mode: LintMode): WorkflowDefinition;
|
|
35
|
+
type ParseArgsConfig = Parameters<typeof parseArgs>[0];
|
|
36
|
+
/** The `options` map accepted by {@link parseArgsStrict} / {@link parseArgsResult}. */
|
|
37
|
+
export type ParseArgsOptions = NonNullable<NonNullable<ParseArgsConfig>['options']>;
|
|
38
|
+
export declare function parseArgsStrict(opts: Omit<ParseArgsConfig, 'strict'>): ReturnType<typeof parseArgs>;
|
|
39
|
+
/**
|
|
40
|
+
* Outcome of {@link parseArgsResult}: either the parsed `values`/`positionals`,
|
|
41
|
+
* or a structured failure carrying the parse error message.
|
|
42
|
+
*/
|
|
43
|
+
export type ParseArgsResult = ({
|
|
44
|
+
readonly ok: true;
|
|
45
|
+
} & ReturnType<typeof parseArgs>) | {
|
|
46
|
+
readonly ok: false;
|
|
47
|
+
readonly message: string;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Strict {@link parseArgs} that RETURNS a discriminated failure on an unknown/
|
|
51
|
+
* typo'd flag or a missing option value, instead of writing to stderr and
|
|
52
|
+
* calling `process.exit(1)` like {@link parseArgsStrict}.
|
|
53
|
+
*
|
|
54
|
+
* Kept as a separate sibling so the existing exit-on-error callers
|
|
55
|
+
* (`workflow-command`, `run-state-command`) are unaffected. Callers that own a
|
|
56
|
+
* structured output contract — e.g. the agent-facing daemon-gate commands,
|
|
57
|
+
* where every result must be a single JSON object on stdout with a
|
|
58
|
+
* usage-derived exit code — use this so a parse error can be reported on the
|
|
59
|
+
* right channel rather than crashing the process with a generic exit code.
|
|
60
|
+
*/
|
|
61
|
+
export declare function parseArgsResult(opts: Omit<ParseArgsConfig, 'strict'>): ParseArgsResult;
|
|
62
|
+
export {};
|