@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
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow semantic linter. Receives a `WorkflowDefinition` that has
|
|
3
|
+
* already passed `validateDefinition()` and returns `Diagnostic`s for
|
|
4
|
+
* higher-level smells (cross-cutting or requiring external context)
|
|
5
|
+
* that structural validation deliberately leaves alone.
|
|
6
|
+
*
|
|
7
|
+
* See `docs/designs/workflow-semantic-linter-v2.md` for each check's
|
|
8
|
+
* rationale.
|
|
9
|
+
*/
|
|
10
|
+
import { resolve } from 'node:path';
|
|
11
|
+
import { GLOBAL_PERSONA } from './types.js';
|
|
12
|
+
import { findReachableStates, iterateSkillRefIssues, parseArtifactRef } from './validate.js';
|
|
13
|
+
import { getWorkflowPackageDir } from './discovery.js';
|
|
14
|
+
import { ACTIONABLE_DISCOVERY_REASONS, discoverSkillsWithErrors } from '../skills/discovery.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Entry point
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Runs all registered checks against `def`. Pure: same input => same
|
|
20
|
+
* output. Diagnostics come back in stable order (WF001 first, WF007 last).
|
|
21
|
+
*/
|
|
22
|
+
export function lintWorkflow(def, ctx) {
|
|
23
|
+
const reachable = findReachableStates(def.initial, def.states);
|
|
24
|
+
const reachableAgentOutputs = collectReachableAgentOutputs(def, reachable);
|
|
25
|
+
return [
|
|
26
|
+
...checkUnreachableTerminal(def, reachable),
|
|
27
|
+
...checkUnversionedArtifacts(def, reachableAgentOutputs),
|
|
28
|
+
...checkTerminalOutputs(def, reachable, reachableAgentOutputs),
|
|
29
|
+
...checkHumanGatePresent(def, reachable, reachableAgentOutputs),
|
|
30
|
+
...checkMaxRoundsHasGuard(def),
|
|
31
|
+
...checkPersonaExists(def, ctx),
|
|
32
|
+
...checkVisitCapTransitionOrder(def),
|
|
33
|
+
...checkSkillReferencesAndManifests(def, ctx),
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
export function countBySeverity(diagnostics) {
|
|
37
|
+
let errors = 0;
|
|
38
|
+
let warnings = 0;
|
|
39
|
+
for (const d of diagnostics) {
|
|
40
|
+
if (d.severity === 'error')
|
|
41
|
+
errors++;
|
|
42
|
+
else
|
|
43
|
+
warnings++;
|
|
44
|
+
}
|
|
45
|
+
return { errors, warnings };
|
|
46
|
+
}
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Shared helpers
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
/**
|
|
51
|
+
* Output artifacts produced by reachable agent states. Terminal
|
|
52
|
+
* `outputs:` are declarations of expected arrival state, not production
|
|
53
|
+
* (no runtime code writes them), so they don't count: WF002/WF003/WF004
|
|
54
|
+
* all ask "is this name actually produced?"
|
|
55
|
+
*/
|
|
56
|
+
function collectReachableAgentOutputs(def, reachable) {
|
|
57
|
+
const outputs = new Set();
|
|
58
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
59
|
+
if (!reachable.has(stateId))
|
|
60
|
+
continue;
|
|
61
|
+
if (state.type === 'agent') {
|
|
62
|
+
for (const o of state.outputs)
|
|
63
|
+
outputs.add(o);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return outputs;
|
|
67
|
+
}
|
|
68
|
+
function isAgentState(state) {
|
|
69
|
+
return state.type === 'agent';
|
|
70
|
+
}
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// WF001 — State can't reach any terminal
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
function checkUnreachableTerminal(def, reachable) {
|
|
75
|
+
const diagnostics = [];
|
|
76
|
+
for (const stateId of reachable) {
|
|
77
|
+
const state = def.states[stateId];
|
|
78
|
+
if (state.type === 'terminal')
|
|
79
|
+
continue;
|
|
80
|
+
const cone = findReachableStates(stateId, def.states);
|
|
81
|
+
let touchesTerminal = false;
|
|
82
|
+
for (const target of cone) {
|
|
83
|
+
if (def.states[target].type === 'terminal') {
|
|
84
|
+
touchesTerminal = true;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (!touchesTerminal) {
|
|
89
|
+
diagnostics.push({
|
|
90
|
+
code: 'WF001',
|
|
91
|
+
severity: 'error',
|
|
92
|
+
stateId,
|
|
93
|
+
message: `State "${stateId}" cannot reach any terminal state — the workflow will loop forever if it enters this state.`,
|
|
94
|
+
hint: 'Add a transition (guarded or unconditional) whose forward graph eventually reaches a terminal state.',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return diagnostics;
|
|
99
|
+
}
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// WF002 — unversionedArtifacts entry not produced by any state
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
function checkUnversionedArtifacts(def, produced) {
|
|
104
|
+
const entries = def.settings?.unversionedArtifacts ?? [];
|
|
105
|
+
if (entries.length === 0)
|
|
106
|
+
return [];
|
|
107
|
+
const diagnostics = [];
|
|
108
|
+
for (const name of entries) {
|
|
109
|
+
if (!produced.has(name)) {
|
|
110
|
+
diagnostics.push({
|
|
111
|
+
code: 'WF002',
|
|
112
|
+
severity: 'warning',
|
|
113
|
+
message: `settings.unversionedArtifacts entry "${name}" is not produced by any state — it will be silently versioned.`,
|
|
114
|
+
hint: "Remove the entry, or add the artifact to some agent state's outputs list.",
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return diagnostics;
|
|
119
|
+
}
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// WF003 — terminal.outputs entry not produced by any reachable state
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
function checkTerminalOutputs(def, reachable, produced) {
|
|
124
|
+
const diagnostics = [];
|
|
125
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
126
|
+
if (state.type !== 'terminal')
|
|
127
|
+
continue;
|
|
128
|
+
if (!reachable.has(stateId))
|
|
129
|
+
continue;
|
|
130
|
+
for (const name of state.outputs ?? []) {
|
|
131
|
+
if (!produced.has(name)) {
|
|
132
|
+
diagnostics.push({
|
|
133
|
+
code: 'WF003',
|
|
134
|
+
severity: 'warning',
|
|
135
|
+
stateId,
|
|
136
|
+
message: `Terminal "${stateId}" lists output "${name}" which is not produced by any reachable state.`,
|
|
137
|
+
hint: 'Remove the output from the terminal, or ensure a reachable agent state produces it.',
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return diagnostics;
|
|
143
|
+
}
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// WF004 — human_gate present entry not produced by any reachable state
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
function checkHumanGatePresent(def, reachable, produced) {
|
|
148
|
+
const diagnostics = [];
|
|
149
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
150
|
+
if (state.type !== 'human_gate')
|
|
151
|
+
continue;
|
|
152
|
+
if (!reachable.has(stateId))
|
|
153
|
+
continue;
|
|
154
|
+
for (const entry of state.present ?? []) {
|
|
155
|
+
const { name } = parseArtifactRef(entry);
|
|
156
|
+
if (!produced.has(name)) {
|
|
157
|
+
diagnostics.push({
|
|
158
|
+
code: 'WF004',
|
|
159
|
+
severity: 'error',
|
|
160
|
+
stateId,
|
|
161
|
+
message: `Human gate "${stateId}" presents artifact "${name}" which is not produced by any reachable state — the human will approve without seeing it.`,
|
|
162
|
+
hint: 'Fix the artifact name, or ensure a reachable agent state produces it.',
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return diagnostics;
|
|
168
|
+
}
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
// WF006 — maxRounds set without any isRoundLimitReached guard
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
const ROUND_LIMIT_GUARD = 'isRoundLimitReached';
|
|
173
|
+
function checkMaxRoundsHasGuard(def) {
|
|
174
|
+
if (def.settings?.maxRounds === undefined)
|
|
175
|
+
return [];
|
|
176
|
+
for (const state of Object.values(def.states)) {
|
|
177
|
+
if (state.type !== 'agent' && state.type !== 'deterministic')
|
|
178
|
+
continue;
|
|
179
|
+
for (const t of state.transitions) {
|
|
180
|
+
if (t.guard === ROUND_LIMIT_GUARD)
|
|
181
|
+
return [];
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return [
|
|
185
|
+
{
|
|
186
|
+
code: 'WF006',
|
|
187
|
+
severity: 'warning',
|
|
188
|
+
message: `settings.maxRounds=${def.settings.maxRounds} is set but no transition uses the "isRoundLimitReached" guard — the limit is silently ignored.`,
|
|
189
|
+
hint: 'Add a transition with guard: isRoundLimitReached to an iterative state, or remove maxRounds.',
|
|
190
|
+
},
|
|
191
|
+
];
|
|
192
|
+
}
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
// WF007 — agent persona not installed
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
/**
|
|
197
|
+
* Flags any agent state whose `persona` is neither the reserved
|
|
198
|
+
* `GLOBAL_PERSONA` alias nor an installed persona directory.
|
|
199
|
+
*
|
|
200
|
+
* Emitted as a warning (not error) because personas are user-local state:
|
|
201
|
+
* a workflow author may legitimately ship a definition that depends on
|
|
202
|
+
* a persona the user hasn't installed yet. `--strict-lint` promotes this
|
|
203
|
+
* to a failure.
|
|
204
|
+
*/
|
|
205
|
+
function checkPersonaExists(def, ctx) {
|
|
206
|
+
const diagnostics = [];
|
|
207
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
208
|
+
if (!isAgentState(state))
|
|
209
|
+
continue;
|
|
210
|
+
const persona = state.persona;
|
|
211
|
+
if (persona === GLOBAL_PERSONA)
|
|
212
|
+
continue;
|
|
213
|
+
if (ctx.personaExists(persona))
|
|
214
|
+
continue;
|
|
215
|
+
diagnostics.push({
|
|
216
|
+
code: 'WF007',
|
|
217
|
+
severity: 'warning',
|
|
218
|
+
stateId,
|
|
219
|
+
message: `Agent state "${stateId}" references persona "${persona}" which is not installed locally — session creation will fail at runtime.`,
|
|
220
|
+
hint: `Install the persona with: ironcurtain persona create ${persona}, or change the state's persona to "${GLOBAL_PERSONA}".`,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
return diagnostics;
|
|
224
|
+
}
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
// WF008 — visit-cap guard must precede loop-continuing transitions
|
|
227
|
+
// ---------------------------------------------------------------------------
|
|
228
|
+
/**
|
|
229
|
+
* Verdict values that indicate an approval-style exit from a bounded loop.
|
|
230
|
+
* Transitions taken on these verdicts represent the success path out of the
|
|
231
|
+
* loop, so a visit-cap guard is legitimately ordered AFTER them (on the cap
|
|
232
|
+
* visit, if the agent still emits `approved`, we take the approval exit
|
|
233
|
+
* rather than escalating).
|
|
234
|
+
*
|
|
235
|
+
* Any other `when` verdict (rejected, rejected_build, blocked, or any
|
|
236
|
+
* workflow-specific loop-continuation verdict) must NOT precede the cap
|
|
237
|
+
* guard: if it did, the cap would never fire and the loop is effectively
|
|
238
|
+
* unbounded except for the workflow-wide `maxRounds`.
|
|
239
|
+
*/
|
|
240
|
+
const VISIT_CAP_GUARD = 'isStateVisitLimitReached';
|
|
241
|
+
const APPROVAL_EXIT_VERDICTS = new Set(['approved', 'complete', 'done', 'success', 'passed']);
|
|
242
|
+
/**
|
|
243
|
+
* Returns true if `t.when` represents an approval-style exit. Approval
|
|
244
|
+
* exits are allowed to precede the visit-cap guard. Everything else is
|
|
245
|
+
* considered loop-continuing for the purposes of WF008 — including:
|
|
246
|
+
* - no `when` clause at all (always matches)
|
|
247
|
+
* - empty `when: {}` (always matches; flagged separately by validation)
|
|
248
|
+
* - a verdict not in the approval allowlist
|
|
249
|
+
* - a `when` clause that sets fields other than `verdict` (future-
|
|
250
|
+
* proofing: those match something other than the approval verdict)
|
|
251
|
+
*/
|
|
252
|
+
function isApprovalExitTransition(t) {
|
|
253
|
+
if (!t.when)
|
|
254
|
+
return false;
|
|
255
|
+
const keys = Object.keys(t.when);
|
|
256
|
+
if (keys.length === 0)
|
|
257
|
+
return false;
|
|
258
|
+
if (keys.length !== 1 || keys[0] !== 'verdict')
|
|
259
|
+
return false;
|
|
260
|
+
const verdict = t.when.verdict;
|
|
261
|
+
return typeof verdict === 'string' && APPROVAL_EXIT_VERDICTS.has(verdict);
|
|
262
|
+
}
|
|
263
|
+
function checkVisitCapTransitionOrder(def) {
|
|
264
|
+
const diagnostics = [];
|
|
265
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
266
|
+
if (!isAgentState(state))
|
|
267
|
+
continue;
|
|
268
|
+
if (state.maxVisits === undefined)
|
|
269
|
+
continue;
|
|
270
|
+
const transitions = state.transitions;
|
|
271
|
+
const capIndex = transitions.findIndex((t) => t.guard === VISIT_CAP_GUARD);
|
|
272
|
+
if (capIndex === -1)
|
|
273
|
+
continue;
|
|
274
|
+
// Find the first loop-continuing transition that precedes the cap.
|
|
275
|
+
for (let i = 0; i < capIndex; i++) {
|
|
276
|
+
const t = transitions[i];
|
|
277
|
+
if (isApprovalExitTransition(t))
|
|
278
|
+
continue;
|
|
279
|
+
// `t` is either unconditional, a non-approval `when`, or a different
|
|
280
|
+
// guard — all of which can match before the cap guard is evaluated.
|
|
281
|
+
const descriptor = describeTransition(t);
|
|
282
|
+
diagnostics.push({
|
|
283
|
+
code: 'WF008',
|
|
284
|
+
severity: 'error',
|
|
285
|
+
stateId,
|
|
286
|
+
message: `State "${stateId}" has maxVisits=${state.maxVisits} with an "${VISIT_CAP_GUARD}" ` +
|
|
287
|
+
`transition at position ${capIndex + 1}, but a loop-continuing transition (${descriptor}) ` +
|
|
288
|
+
`at position ${i + 1} will match first on every iteration, so the visit cap is never ` +
|
|
289
|
+
`reached and the loop is effectively unbounded except by settings.maxRounds.`,
|
|
290
|
+
hint: `Move the "${VISIT_CAP_GUARD}" transition above any non-approval "when" clause ` +
|
|
291
|
+
`(only ${Array.from(APPROVAL_EXIT_VERDICTS).join('/')} verdicts may precede the cap).`,
|
|
292
|
+
});
|
|
293
|
+
// One diagnostic per state is sufficient; multiple preceding loop-
|
|
294
|
+
// continuing transitions all share the same fix.
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return diagnostics;
|
|
299
|
+
}
|
|
300
|
+
function describeTransition(t) {
|
|
301
|
+
if (t.guard)
|
|
302
|
+
return `guard: ${t.guard} -> ${t.to}`;
|
|
303
|
+
if (t.when) {
|
|
304
|
+
const parts = Object.entries(t.when).map(([k, v]) => `${k}: ${JSON.stringify(v)}`);
|
|
305
|
+
return `when { ${parts.join(', ')} } -> ${t.to}`;
|
|
306
|
+
}
|
|
307
|
+
return `unconditional -> ${t.to}`;
|
|
308
|
+
}
|
|
309
|
+
// ---------------------------------------------------------------------------
|
|
310
|
+
// WF010 — skill references and skill-manifest integrity
|
|
311
|
+
// ---------------------------------------------------------------------------
|
|
312
|
+
/**
|
|
313
|
+
* Entry point for WF010. Skips cleanly when `ctx.workflowFilePath` is
|
|
314
|
+
* absent (in-memory definitions have no package dir to scan).
|
|
315
|
+
* `checkSkillManifests` runs independently of any state reference so
|
|
316
|
+
* a typo'd frontmatter — which would silently disappear from
|
|
317
|
+
* discovery — still surfaces.
|
|
318
|
+
*/
|
|
319
|
+
function checkSkillReferencesAndManifests(def, ctx) {
|
|
320
|
+
if (!ctx.workflowFilePath)
|
|
321
|
+
return [];
|
|
322
|
+
const skillsRoot = resolve(getWorkflowPackageDir(ctx.workflowFilePath), 'skills');
|
|
323
|
+
const { skills, errors } = discoverSkillsWithErrors(skillsRoot, 'workflow');
|
|
324
|
+
return [...checkSkillManifests(errors), ...checkSkillReferences(def, skills, skillsRoot)];
|
|
325
|
+
}
|
|
326
|
+
function checkSkillManifests(errors) {
|
|
327
|
+
const diagnostics = [];
|
|
328
|
+
for (const err of errors) {
|
|
329
|
+
if (!ACTIONABLE_DISCOVERY_REASONS.has(err.reason))
|
|
330
|
+
continue;
|
|
331
|
+
diagnostics.push({
|
|
332
|
+
code: 'WF010',
|
|
333
|
+
severity: 'error',
|
|
334
|
+
...buildSkillManifestDiagnostic(err),
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
return diagnostics;
|
|
338
|
+
}
|
|
339
|
+
function buildSkillManifestDiagnostic(err) {
|
|
340
|
+
const detail = err.detail ?? err.reason;
|
|
341
|
+
// Switch is exhaustive over `SkillDiscoveryErrorReason`. No `default`:
|
|
342
|
+
// a new union member must add a case here or TypeScript will flag the
|
|
343
|
+
// missing return-type coverage at compile time.
|
|
344
|
+
switch (err.reason) {
|
|
345
|
+
case 'malformed-frontmatter':
|
|
346
|
+
return {
|
|
347
|
+
message: `Malformed SKILL.md frontmatter at ${err.skillDir}: ${detail}.`,
|
|
348
|
+
hint: 'Fix the YAML frontmatter (the block fenced by `---` lines at the top of SKILL.md).',
|
|
349
|
+
};
|
|
350
|
+
case 'missing-required-fields':
|
|
351
|
+
return {
|
|
352
|
+
message: `SKILL.md at ${err.skillDir} is missing required frontmatter fields: ${detail}.`,
|
|
353
|
+
hint: 'SKILL.md frontmatter must declare both `name:` and `description:` as strings.',
|
|
354
|
+
};
|
|
355
|
+
case 'unreadable':
|
|
356
|
+
return {
|
|
357
|
+
message: `Unreadable SKILL.md at ${err.skillDir}: ${detail}.`,
|
|
358
|
+
hint: 'Check filesystem permissions or whether the path is a directory.',
|
|
359
|
+
};
|
|
360
|
+
case 'missing-manifest':
|
|
361
|
+
return {
|
|
362
|
+
message: `Missing SKILL.md at ${err.skillDir}: ${detail}.`,
|
|
363
|
+
hint: 'Create a SKILL.md file with a `---`-fenced YAML frontmatter declaring `name:` and `description:`.',
|
|
364
|
+
};
|
|
365
|
+
case 'duplicate-name':
|
|
366
|
+
return {
|
|
367
|
+
message: `Duplicate skill at ${err.skillDir}: ${detail}.`,
|
|
368
|
+
hint: 'Two skill directories under the same skills root cannot share the same frontmatter `name:`. Rename one in its SKILL.md frontmatter.',
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Walks every agent state's `skills?: string[]` and emits one
|
|
374
|
+
* diagnostic per offending entry — either an invalid name (rejected by
|
|
375
|
+
* `validateSkillName`) or a name that does not match any discovered
|
|
376
|
+
* skill's frontmatter `name:` under `<packageDir>/skills/`. The
|
|
377
|
+
* frontmatter name is the user-facing identifier (matched by
|
|
378
|
+
* `workflowSkillFilter` in `src/skills/discovery.ts`), not the
|
|
379
|
+
* directory name. The orchestrator's `validateWorkflowSkillReferences`
|
|
380
|
+
* throws for the same conditions at start; surfacing them at lint time
|
|
381
|
+
* gives authors fast feedback before they hit runtime.
|
|
382
|
+
*/
|
|
383
|
+
function checkSkillReferences(def, discovered, skillsRoot) {
|
|
384
|
+
const discoveredNames = new Set(discovered.map((s) => s.name));
|
|
385
|
+
const available = [...discoveredNames].sort();
|
|
386
|
+
const availableHint = available.length > 0 ? available.join(', ') : '(none)';
|
|
387
|
+
const diagnostics = [];
|
|
388
|
+
for (const issue of iterateSkillRefIssues(def, discoveredNames)) {
|
|
389
|
+
if (issue.kind === 'invalid-name') {
|
|
390
|
+
diagnostics.push({
|
|
391
|
+
code: 'WF010',
|
|
392
|
+
severity: 'error',
|
|
393
|
+
stateId: issue.stateId,
|
|
394
|
+
message: `Invalid skill name "${issue.name}" in state "${issue.stateId}": ${issue.detail}.`,
|
|
395
|
+
hint: 'Skill names must be a single non-empty path segment with no separators or "."/"..".',
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
diagnostics.push({
|
|
400
|
+
code: 'WF010',
|
|
401
|
+
severity: 'error',
|
|
402
|
+
stateId: issue.stateId,
|
|
403
|
+
message: `State "${issue.stateId}" references skill "${issue.name}" but no skill with that frontmatter name was found under ${skillsRoot}. Available: ${availableHint}.`,
|
|
404
|
+
hint: `Add a SKILL.md under <workflow-pkg>/skills/ whose frontmatter \`name:\` is "${issue.name}", or remove "${issue.name}" from the state's skills list.`,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return diagnostics;
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/workflow/lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { type AnyStateMachine } from 'xstate';
|
|
2
|
+
import type { WorkflowDefinition, WorkflowContext, AgentStateDefinition, AgentOutput } from './types.js';
|
|
3
|
+
import type { AgentConversationId } from '../session/types.js';
|
|
4
|
+
/** Input provided to each invoked agent service. */
|
|
5
|
+
export interface AgentInvokeInput {
|
|
6
|
+
readonly stateId: string;
|
|
7
|
+
readonly stateConfig: AgentStateDefinition;
|
|
8
|
+
readonly context: WorkflowContext;
|
|
9
|
+
}
|
|
10
|
+
/** Result returned by an agent service promise. */
|
|
11
|
+
export interface AgentInvokeResult {
|
|
12
|
+
readonly output: AgentOutput;
|
|
13
|
+
/**
|
|
14
|
+
* Agent CLI conversation id used for this invocation. Minted or reused
|
|
15
|
+
* by the orchestrator before session construction (see
|
|
16
|
+
* `executeAgentState` and `docs/designs/workflow-session-identity.md`
|
|
17
|
+
* §3). Threaded through the result only so the
|
|
18
|
+
* `updateContextFromAgentResult` XState action can write it into
|
|
19
|
+
* `agentConversationsByState[stateId]`; not a read-back from the
|
|
20
|
+
* session.
|
|
21
|
+
*/
|
|
22
|
+
readonly agentConversationId: AgentConversationId;
|
|
23
|
+
readonly artifacts: Record<string, string>;
|
|
24
|
+
/** SHA-256 of output artifacts, computed by the orchestrator. */
|
|
25
|
+
readonly outputHash: string;
|
|
26
|
+
/** Raw response text from session.sendMessage(). */
|
|
27
|
+
readonly responseText: string;
|
|
28
|
+
/**
|
|
29
|
+
* Cumulative workflow-level output-token count at the moment this
|
|
30
|
+
* agent finished. Copied onto `ctx.totalTokens` by the XState
|
|
31
|
+
* `updateContextFromAgentResult` assign action. Sourced from the
|
|
32
|
+
* orchestrator's token-stream bus subscription, which sums every
|
|
33
|
+
* `message_end.outputTokens` seen for sessions belonging to this
|
|
34
|
+
* workflow run.
|
|
35
|
+
*/
|
|
36
|
+
readonly totalTokens: number;
|
|
37
|
+
}
|
|
38
|
+
/** Input provided to each invoked deterministic service. */
|
|
39
|
+
export interface DeterministicInvokeInput {
|
|
40
|
+
readonly stateId: string;
|
|
41
|
+
readonly commands: readonly (readonly string[])[];
|
|
42
|
+
readonly context: WorkflowContext;
|
|
43
|
+
}
|
|
44
|
+
/** Result from a deterministic (test/lint) state. */
|
|
45
|
+
export interface DeterministicInvokeResult {
|
|
46
|
+
readonly passed: boolean;
|
|
47
|
+
readonly testCount?: number;
|
|
48
|
+
readonly errors?: string;
|
|
49
|
+
}
|
|
50
|
+
export interface BuildMachineResult {
|
|
51
|
+
/** The XState machine (with placeholder actors). */
|
|
52
|
+
readonly machine: AnyStateMachine;
|
|
53
|
+
/** Set of state names that are human gates (for snapshot.matches()). */
|
|
54
|
+
readonly gateStateNames: ReadonlySet<string>;
|
|
55
|
+
/** Set of state names that are terminal (for completion detection). */
|
|
56
|
+
readonly terminalStateNames: ReadonlySet<string>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Sanitizes agent response text for reuse in subsequent prompts: escapes any
|
|
60
|
+
* literal NUL bytes and truncates to stay within the 32KB limit.
|
|
61
|
+
*
|
|
62
|
+
* NUL escaping is load-bearing, not cosmetic. Agent output flows back into
|
|
63
|
+
* later prompts via `previousAgentOutput` / `previousAgentNotes`, which the
|
|
64
|
+
* Docker adapter passes as an argv element to `child_process.spawn`. Node
|
|
65
|
+
* refuses argv strings containing `\0` (`ERR_INVALID_ARG_VALUE`) and throws
|
|
66
|
+
* synchronously before the container even starts — aborting the workflow. A
|
|
67
|
+
* security-research agent describing a binary file format ("APP1 'Exif\\0\\0'")
|
|
68
|
+
* is the natural way this happens. We escape rather than strip so the textual
|
|
69
|
+
* description survives intact for downstream readers.
|
|
70
|
+
*
|
|
71
|
+
* Exported for testing.
|
|
72
|
+
*/
|
|
73
|
+
export declare function truncateAgentOutput(text: string): string;
|
|
74
|
+
/**
|
|
75
|
+
* Creates the initial WorkflowContext for a given definition.
|
|
76
|
+
* Exported for testing.
|
|
77
|
+
*/
|
|
78
|
+
export declare function createInitialContext(definition: WorkflowDefinition): Omit<WorkflowContext, 'taskDescription'>;
|
|
79
|
+
/**
|
|
80
|
+
* Builds an XState v5 machine from a validated WorkflowDefinition.
|
|
81
|
+
*
|
|
82
|
+
* The returned machine has placeholder actors (`agentService`,
|
|
83
|
+
* `deterministicService`) that throw if invoked directly. Callers
|
|
84
|
+
* must call `.provide({ actors: { ... } })` to inject real
|
|
85
|
+
* implementations before passing to `createActor()`.
|
|
86
|
+
*
|
|
87
|
+
* Guards are registered with concrete implementations from the guards
|
|
88
|
+
* module. Actions for context updates are defined inline via `assign`.
|
|
89
|
+
*/
|
|
90
|
+
export declare function buildWorkflowMachine(definition: WorkflowDefinition, taskDescription: string): BuildMachineResult;
|