@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,593 @@
|
|
|
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, DEFAULT_CONTAINER_SCOPE } from './types.js';
|
|
12
|
+
import { collectTransitionTargets, findReachableStates, isExecutableState, iterateSkillRefIssues, parseArtifactRef, usesVerdictEdges, } from './validate.js';
|
|
13
|
+
import { resolveFanOutWorkers } from './lane-template.js';
|
|
14
|
+
import { getWorkflowPackageDir } from './discovery.js';
|
|
15
|
+
import { ACTIONABLE_DISCOVERY_REASONS, discoverSkillsWithErrors } from '../skills/discovery.js';
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Entry point
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/**
|
|
20
|
+
* Runs all registered checks against `def`. Pure: same input => same
|
|
21
|
+
* output. Diagnostics come back in stable order (WF001 first, WF007 last).
|
|
22
|
+
*/
|
|
23
|
+
export function lintWorkflow(def, ctx) {
|
|
24
|
+
const reachable = findReachableStates(def.initial, def.states);
|
|
25
|
+
const reachableAgentOutputs = collectReachableAgentOutputs(def, reachable);
|
|
26
|
+
return [
|
|
27
|
+
...checkUnreachableTerminal(def, reachable),
|
|
28
|
+
...checkUnversionedArtifacts(def, reachableAgentOutputs),
|
|
29
|
+
...checkTerminalOutputs(def, reachable, reachableAgentOutputs),
|
|
30
|
+
...checkHumanGatePresent(def, reachable, reachableAgentOutputs),
|
|
31
|
+
...checkMaxRoundsHasGuard(def),
|
|
32
|
+
...checkPersonaExists(def, ctx),
|
|
33
|
+
...checkVisitCapTransitionOrder(def),
|
|
34
|
+
...checkContainerScopePopulatedByAgent(def),
|
|
35
|
+
...checkVerdictEdgesHaveResultFile(def),
|
|
36
|
+
...checkFanOutBudget(def),
|
|
37
|
+
...checkFanOutChildBounds(def),
|
|
38
|
+
...checkSkillReferencesAndManifests(def, ctx),
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
export function countBySeverity(diagnostics) {
|
|
42
|
+
let errors = 0;
|
|
43
|
+
let warnings = 0;
|
|
44
|
+
for (const d of diagnostics) {
|
|
45
|
+
if (d.severity === 'error')
|
|
46
|
+
errors++;
|
|
47
|
+
else
|
|
48
|
+
warnings++;
|
|
49
|
+
}
|
|
50
|
+
return { errors, warnings };
|
|
51
|
+
}
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Shared helpers
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
/**
|
|
56
|
+
* Output artifacts produced by reachable agent states. Terminal
|
|
57
|
+
* `outputs:` are declarations of expected arrival state, not production
|
|
58
|
+
* (no runtime code writes them), so they don't count: WF002/WF003/WF004
|
|
59
|
+
* all ask "is this name actually produced?"
|
|
60
|
+
*/
|
|
61
|
+
function collectReachableAgentOutputs(def, reachable) {
|
|
62
|
+
const outputs = new Set();
|
|
63
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
64
|
+
if (!reachable.has(stateId))
|
|
65
|
+
continue;
|
|
66
|
+
if (state.type === 'agent') {
|
|
67
|
+
for (const o of state.outputs)
|
|
68
|
+
outputs.add(o);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return outputs;
|
|
72
|
+
}
|
|
73
|
+
function isAgentState(state) {
|
|
74
|
+
return state.type === 'agent';
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// WF001 — State can't reach any terminal
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
function checkUnreachableTerminal(def, reachable) {
|
|
80
|
+
const diagnostics = [];
|
|
81
|
+
for (const stateId of reachable) {
|
|
82
|
+
const state = def.states[stateId];
|
|
83
|
+
if (state.type === 'terminal')
|
|
84
|
+
continue;
|
|
85
|
+
const cone = findReachableStates(stateId, def.states);
|
|
86
|
+
let touchesTerminal = false;
|
|
87
|
+
for (const target of cone) {
|
|
88
|
+
if (def.states[target].type === 'terminal') {
|
|
89
|
+
touchesTerminal = true;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (!touchesTerminal) {
|
|
94
|
+
diagnostics.push({
|
|
95
|
+
code: 'WF001',
|
|
96
|
+
severity: 'error',
|
|
97
|
+
stateId,
|
|
98
|
+
message: `State "${stateId}" cannot reach any terminal state — the workflow will loop forever if it enters this state.`,
|
|
99
|
+
hint: 'Add a transition (guarded or unconditional) whose forward graph eventually reaches a terminal state.',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return diagnostics;
|
|
104
|
+
}
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// WF002 — unversionedArtifacts entry not produced by any state
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
function checkUnversionedArtifacts(def, produced) {
|
|
109
|
+
const entries = def.settings?.unversionedArtifacts ?? [];
|
|
110
|
+
if (entries.length === 0)
|
|
111
|
+
return [];
|
|
112
|
+
const diagnostics = [];
|
|
113
|
+
for (const name of entries) {
|
|
114
|
+
if (!produced.has(name)) {
|
|
115
|
+
diagnostics.push({
|
|
116
|
+
code: 'WF002',
|
|
117
|
+
severity: 'warning',
|
|
118
|
+
message: `settings.unversionedArtifacts entry "${name}" is not produced by any state — it will be silently versioned.`,
|
|
119
|
+
hint: "Remove the entry, or add the artifact to some agent state's outputs list.",
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return diagnostics;
|
|
124
|
+
}
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// WF003 — terminal.outputs entry not produced by any reachable state
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
function checkTerminalOutputs(def, reachable, produced) {
|
|
129
|
+
const diagnostics = [];
|
|
130
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
131
|
+
if (state.type !== 'terminal')
|
|
132
|
+
continue;
|
|
133
|
+
if (!reachable.has(stateId))
|
|
134
|
+
continue;
|
|
135
|
+
for (const name of state.outputs ?? []) {
|
|
136
|
+
if (!produced.has(name)) {
|
|
137
|
+
diagnostics.push({
|
|
138
|
+
code: 'WF003',
|
|
139
|
+
severity: 'warning',
|
|
140
|
+
stateId,
|
|
141
|
+
message: `Terminal "${stateId}" lists output "${name}" which is not produced by any reachable state.`,
|
|
142
|
+
hint: 'Remove the output from the terminal, or ensure a reachable agent state produces it.',
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return diagnostics;
|
|
148
|
+
}
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
// WF004 — human_gate present entry not produced by any reachable state
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
function checkHumanGatePresent(def, reachable, produced) {
|
|
153
|
+
const diagnostics = [];
|
|
154
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
155
|
+
if (state.type !== 'human_gate')
|
|
156
|
+
continue;
|
|
157
|
+
if (!reachable.has(stateId))
|
|
158
|
+
continue;
|
|
159
|
+
for (const entry of state.present ?? []) {
|
|
160
|
+
const { name } = parseArtifactRef(entry);
|
|
161
|
+
if (!produced.has(name)) {
|
|
162
|
+
diagnostics.push({
|
|
163
|
+
code: 'WF004',
|
|
164
|
+
severity: 'error',
|
|
165
|
+
stateId,
|
|
166
|
+
message: `Human gate "${stateId}" presents artifact "${name}" which is not produced by any reachable state — the human will approve without seeing it.`,
|
|
167
|
+
hint: 'Fix the artifact name, or ensure a reachable agent state produces it.',
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return diagnostics;
|
|
173
|
+
}
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
// WF006 — maxRounds set without any isRoundLimitReached guard
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
const ROUND_LIMIT_GUARD = 'isRoundLimitReached';
|
|
178
|
+
function checkMaxRoundsHasGuard(def) {
|
|
179
|
+
if (def.settings?.maxRounds === undefined)
|
|
180
|
+
return [];
|
|
181
|
+
for (const state of Object.values(def.states)) {
|
|
182
|
+
if (!isExecutableState(state))
|
|
183
|
+
continue;
|
|
184
|
+
for (const t of state.transitions) {
|
|
185
|
+
if (t.guard === ROUND_LIMIT_GUARD)
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return [
|
|
190
|
+
{
|
|
191
|
+
code: 'WF006',
|
|
192
|
+
severity: 'warning',
|
|
193
|
+
message: `settings.maxRounds=${def.settings.maxRounds} is set but no transition uses the "isRoundLimitReached" guard — the limit is silently ignored.`,
|
|
194
|
+
hint: 'Add a transition with guard: isRoundLimitReached to an iterative state, or remove maxRounds.',
|
|
195
|
+
},
|
|
196
|
+
];
|
|
197
|
+
}
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
// WF007 — agent persona not installed
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
/**
|
|
202
|
+
* Flags any agent state whose `persona` is neither the reserved
|
|
203
|
+
* `GLOBAL_PERSONA` alias nor an installed persona directory.
|
|
204
|
+
*
|
|
205
|
+
* Emitted as a warning (not error) because personas are user-local state:
|
|
206
|
+
* a workflow author may legitimately ship a definition that depends on
|
|
207
|
+
* a persona the user hasn't installed yet. `--strict-lint` promotes this
|
|
208
|
+
* to a failure.
|
|
209
|
+
*/
|
|
210
|
+
function checkPersonaExists(def, ctx) {
|
|
211
|
+
const diagnostics = [];
|
|
212
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
213
|
+
if (!isAgentState(state))
|
|
214
|
+
continue;
|
|
215
|
+
const persona = state.persona;
|
|
216
|
+
if (persona === GLOBAL_PERSONA)
|
|
217
|
+
continue;
|
|
218
|
+
if (ctx.personaExists(persona))
|
|
219
|
+
continue;
|
|
220
|
+
diagnostics.push({
|
|
221
|
+
code: 'WF007',
|
|
222
|
+
severity: 'warning',
|
|
223
|
+
stateId,
|
|
224
|
+
message: `Agent state "${stateId}" references persona "${persona}" which is not installed locally — session creation will fail at runtime.`,
|
|
225
|
+
hint: `Install the persona with: ironcurtain persona create ${persona}, or change the state's persona to "${GLOBAL_PERSONA}".`,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return diagnostics;
|
|
229
|
+
}
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
// WF008 — visit-cap guard must precede loop-continuing transitions
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
/**
|
|
234
|
+
* Verdict values that indicate an approval-style exit from a bounded loop.
|
|
235
|
+
* Transitions taken on these verdicts represent the success path out of the
|
|
236
|
+
* loop, so a visit-cap guard is legitimately ordered AFTER them (on the cap
|
|
237
|
+
* visit, if the agent still emits `approved`, we take the approval exit
|
|
238
|
+
* rather than escalating).
|
|
239
|
+
*
|
|
240
|
+
* Any other `when` verdict (rejected, rejected_build, blocked, or any
|
|
241
|
+
* workflow-specific loop-continuation verdict) must NOT precede the cap
|
|
242
|
+
* guard: if it did, the cap would never fire and the loop is effectively
|
|
243
|
+
* unbounded except for the workflow-wide `maxRounds`.
|
|
244
|
+
*/
|
|
245
|
+
const VISIT_CAP_GUARD = 'isStateVisitLimitReached';
|
|
246
|
+
const APPROVAL_EXIT_VERDICTS = new Set(['approved', 'complete', 'done', 'success', 'passed']);
|
|
247
|
+
/**
|
|
248
|
+
* Returns true if `t.when` represents an approval-style exit. Approval
|
|
249
|
+
* exits are allowed to precede the visit-cap guard. Everything else is
|
|
250
|
+
* considered loop-continuing for the purposes of WF008 — including:
|
|
251
|
+
* - no `when` clause at all (always matches)
|
|
252
|
+
* - empty `when: {}` (always matches; flagged separately by validation)
|
|
253
|
+
* - a verdict not in the approval allowlist
|
|
254
|
+
* - a `when` clause that sets fields other than `verdict` (future-
|
|
255
|
+
* proofing: those match something other than the approval verdict)
|
|
256
|
+
*/
|
|
257
|
+
function isApprovalExitTransition(t) {
|
|
258
|
+
if (!t.when)
|
|
259
|
+
return false;
|
|
260
|
+
const keys = Object.keys(t.when);
|
|
261
|
+
if (keys.length === 0)
|
|
262
|
+
return false;
|
|
263
|
+
if (keys.length !== 1 || keys[0] !== 'verdict')
|
|
264
|
+
return false;
|
|
265
|
+
const verdict = t.when.verdict;
|
|
266
|
+
return typeof verdict === 'string' && APPROVAL_EXIT_VERDICTS.has(verdict);
|
|
267
|
+
}
|
|
268
|
+
function checkVisitCapTransitionOrder(def) {
|
|
269
|
+
const diagnostics = [];
|
|
270
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
271
|
+
if (!isAgentState(state))
|
|
272
|
+
continue;
|
|
273
|
+
if (state.maxVisits === undefined)
|
|
274
|
+
continue;
|
|
275
|
+
const transitions = state.transitions;
|
|
276
|
+
const capIndex = transitions.findIndex((t) => t.guard === VISIT_CAP_GUARD);
|
|
277
|
+
if (capIndex === -1)
|
|
278
|
+
continue;
|
|
279
|
+
// Find the first loop-continuing transition that precedes the cap.
|
|
280
|
+
for (let i = 0; i < capIndex; i++) {
|
|
281
|
+
const t = transitions[i];
|
|
282
|
+
if (isApprovalExitTransition(t))
|
|
283
|
+
continue;
|
|
284
|
+
// `t` is either unconditional, a non-approval `when`, or a different
|
|
285
|
+
// guard — all of which can match before the cap guard is evaluated.
|
|
286
|
+
const descriptor = describeTransition(t);
|
|
287
|
+
diagnostics.push({
|
|
288
|
+
code: 'WF008',
|
|
289
|
+
severity: 'error',
|
|
290
|
+
stateId,
|
|
291
|
+
message: `State "${stateId}" has maxVisits=${state.maxVisits} with an "${VISIT_CAP_GUARD}" ` +
|
|
292
|
+
`transition at position ${capIndex + 1}, but a loop-continuing transition (${descriptor}) ` +
|
|
293
|
+
`at position ${i + 1} will match first on every iteration, so the visit cap is never ` +
|
|
294
|
+
`reached and the loop is effectively unbounded except by settings.maxRounds.`,
|
|
295
|
+
hint: `Move the "${VISIT_CAP_GUARD}" transition above any non-approval "when" clause ` +
|
|
296
|
+
`(only ${Array.from(APPROVAL_EXIT_VERDICTS).join('/')} verdicts may precede the cap).`,
|
|
297
|
+
});
|
|
298
|
+
// One diagnostic per state is sufficient; multiple preceding loop-
|
|
299
|
+
// continuing transitions all share the same fix.
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return diagnostics;
|
|
304
|
+
}
|
|
305
|
+
function describeTransition(t) {
|
|
306
|
+
if (t.guard)
|
|
307
|
+
return `guard: ${t.guard} -> ${t.to}`;
|
|
308
|
+
if (t.when) {
|
|
309
|
+
const parts = Object.entries(t.when).map(([k, v]) => `${k}: ${JSON.stringify(v)}`);
|
|
310
|
+
return `when { ${parts.join(', ')} } -> ${t.to}`;
|
|
311
|
+
}
|
|
312
|
+
return `unconditional -> ${t.to}`;
|
|
313
|
+
}
|
|
314
|
+
// ---------------------------------------------------------------------------
|
|
315
|
+
// WF011 — container deterministic state may run before its scope is minted
|
|
316
|
+
// ---------------------------------------------------------------------------
|
|
317
|
+
/**
|
|
318
|
+
* A `container: true` deterministic state execs into the shared-container
|
|
319
|
+
* bundle for its `containerScope`. That bundle is minted lazily by the first
|
|
320
|
+
* state that needs the scope, and on a fresh run only *agent* states populate
|
|
321
|
+
* it (a deterministic state is a helper that runs after an agent has worked in
|
|
322
|
+
* the scope — there is no valid FSM of only deterministic states; the runtime
|
|
323
|
+
* exists to mediate agent runs). If such a state is reachable from `initial`
|
|
324
|
+
* without first passing through an agent state in the same scope, then on a
|
|
325
|
+
* fresh run it may exec against a scope whose `/workspace` was never populated
|
|
326
|
+
* — a graph-ordering smell. Resume is unaffected (the bundle is re-minted with
|
|
327
|
+
* the persisted workspace); the runtime keeps a soft-warning backstop, and this
|
|
328
|
+
* surfaces the fresh-run case at author time.
|
|
329
|
+
*/
|
|
330
|
+
function checkContainerScopePopulatedByAgent(def) {
|
|
331
|
+
const diagnostics = [];
|
|
332
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
333
|
+
if (state.type !== 'deterministic' || state.container !== true)
|
|
334
|
+
continue;
|
|
335
|
+
const scope = state.containerScope ?? DEFAULT_CONTAINER_SCOPE;
|
|
336
|
+
if (!isReachableWithoutScopeAgent(def, stateId, scope))
|
|
337
|
+
continue;
|
|
338
|
+
diagnostics.push({
|
|
339
|
+
code: 'WF011',
|
|
340
|
+
severity: 'warning',
|
|
341
|
+
stateId,
|
|
342
|
+
message: `Deterministic state "${stateId}" runs in container scope "${scope}" but is reachable from ` +
|
|
343
|
+
`"${def.initial}" without first passing through an agent state in that scope — on a fresh run ` +
|
|
344
|
+
`its container may not be minted yet.`,
|
|
345
|
+
hint: `Place a "${scope}"-scope agent state before "${stateId}" (a deterministic state is a helper ` +
|
|
346
|
+
`that runs after an agent populates the scope), or move it onto a path that such an agent ` +
|
|
347
|
+
`state precedes.`,
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
return diagnostics;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* BFS from `initial` over the transition graph, treating agent states in
|
|
354
|
+
* `scope` as absorbing — their successors are not expanded, because reaching
|
|
355
|
+
* one means the scope's container is minted on that path. Returns true iff
|
|
356
|
+
* `target` is reachable via at least one path that never passes through such an
|
|
357
|
+
* agent state, i.e. an unsafe fresh-run path exists.
|
|
358
|
+
*/
|
|
359
|
+
function isReachableWithoutScopeAgent(def, target, scope) {
|
|
360
|
+
const seen = new Set();
|
|
361
|
+
const queue = [def.initial];
|
|
362
|
+
while (queue.length > 0) {
|
|
363
|
+
const id = queue.pop();
|
|
364
|
+
if (id === undefined || seen.has(id))
|
|
365
|
+
continue;
|
|
366
|
+
seen.add(id);
|
|
367
|
+
if (id === target)
|
|
368
|
+
return true;
|
|
369
|
+
const state = def.states[id];
|
|
370
|
+
if (!state)
|
|
371
|
+
continue;
|
|
372
|
+
// An agent state in the target scope populates it; any continuation is
|
|
373
|
+
// safe, so stop expanding this path.
|
|
374
|
+
if (state.type === 'agent' && (state.containerScope ?? DEFAULT_CONTAINER_SCOPE) === scope)
|
|
375
|
+
continue;
|
|
376
|
+
for (const next of collectTransitionTargets(state)) {
|
|
377
|
+
if (!seen.has(next))
|
|
378
|
+
queue.push(next);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
// ---------------------------------------------------------------------------
|
|
384
|
+
// WF012 — deterministic verdict edges need a resultFile source
|
|
385
|
+
// ---------------------------------------------------------------------------
|
|
386
|
+
function checkVerdictEdgesHaveResultFile(def) {
|
|
387
|
+
const diagnostics = [];
|
|
388
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
389
|
+
if (state.type !== 'deterministic')
|
|
390
|
+
continue;
|
|
391
|
+
if (state.fanOut !== undefined)
|
|
392
|
+
continue;
|
|
393
|
+
if (state.resultFile !== undefined)
|
|
394
|
+
continue;
|
|
395
|
+
if (!usesVerdictEdges(state.transitions))
|
|
396
|
+
continue;
|
|
397
|
+
diagnostics.push({
|
|
398
|
+
code: 'WF012',
|
|
399
|
+
severity: 'warning',
|
|
400
|
+
stateId,
|
|
401
|
+
message: `Deterministic state "${stateId}" routes on when:{verdict} but declares no resultFile; ` +
|
|
402
|
+
`the verdict will always be undefined and these edges are dead.`,
|
|
403
|
+
hint: `Add resultFile: <path> and have the helper write { "verdict": ... } there.`,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
return diagnostics;
|
|
407
|
+
}
|
|
408
|
+
// ---------------------------------------------------------------------------
|
|
409
|
+
// WF013 — fan-out re-scopes the maxRounds budget from candidates to batches
|
|
410
|
+
// ---------------------------------------------------------------------------
|
|
411
|
+
function checkFanOutBudget(def) {
|
|
412
|
+
if (def.settings?.maxRounds === undefined)
|
|
413
|
+
return [];
|
|
414
|
+
const maxRounds = def.settings.maxRounds;
|
|
415
|
+
const diagnostics = [];
|
|
416
|
+
for (const [stateId, state] of Object.entries(def.states)) {
|
|
417
|
+
if (!isExecutableState(state) || state.fanOut === undefined)
|
|
418
|
+
continue;
|
|
419
|
+
// Gate on THIS state's effective lane count (a numeric fanOut.count override
|
|
420
|
+
// multiplies the budget even when settings.workers is 1), and use it in the
|
|
421
|
+
// maxRounds × workers math. Mirrors orchestrator.runFanOutSegment.
|
|
422
|
+
const workers = resolveFanOutWorkers(state.fanOut, def.settings);
|
|
423
|
+
if (workers <= 1)
|
|
424
|
+
continue;
|
|
425
|
+
diagnostics.push({
|
|
426
|
+
code: 'WF013',
|
|
427
|
+
severity: 'warning',
|
|
428
|
+
stateId,
|
|
429
|
+
message: `Fan-out state "${stateId}" runs with ${workers} lanes; settings.maxRounds=${maxRounds} ` +
|
|
430
|
+
`now caps batches, so the candidate budget is maxRounds × workers = ${maxRounds * workers}.`,
|
|
431
|
+
hint: 'If maxRounds is intended as a candidate budget, divide it by workers or set an explicit batch budget.',
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
return diagnostics;
|
|
435
|
+
}
|
|
436
|
+
// ---------------------------------------------------------------------------
|
|
437
|
+
// WF014 — self-loopable fan-out segment child lacks a per-lane visit bound
|
|
438
|
+
// ---------------------------------------------------------------------------
|
|
439
|
+
function checkFanOutChildBounds(def) {
|
|
440
|
+
const diagnostics = [];
|
|
441
|
+
for (const state of Object.values(def.states)) {
|
|
442
|
+
if (!isExecutableState(state) || state.fanOut === undefined)
|
|
443
|
+
continue;
|
|
444
|
+
// Gate on THIS state's effective lane count: a numeric fanOut.count override
|
|
445
|
+
// runs multiple lanes even at settings.workers: 1. Mirrors the runtime.
|
|
446
|
+
if (resolveFanOutWorkers(state.fanOut, def.settings) <= 1)
|
|
447
|
+
continue;
|
|
448
|
+
const segment = state.segment ?? [];
|
|
449
|
+
const segmentSet = new Set(segment);
|
|
450
|
+
for (const memberId of segment) {
|
|
451
|
+
const member = def.states[memberId];
|
|
452
|
+
if (member === undefined)
|
|
453
|
+
continue;
|
|
454
|
+
if (!isSelfLoopableWithinSegment(def, memberId, segmentSet))
|
|
455
|
+
continue;
|
|
456
|
+
if (member.type === 'agent' && member.maxVisits !== undefined)
|
|
457
|
+
continue;
|
|
458
|
+
diagnostics.push({
|
|
459
|
+
code: 'WF014',
|
|
460
|
+
severity: 'warning',
|
|
461
|
+
stateId: memberId,
|
|
462
|
+
message: `Fan-out segment member "${memberId}" can loop within the segment but has no per-lane maxVisits bound; ` +
|
|
463
|
+
`the parent maxRounds guard is blind to lane-internal visits.`,
|
|
464
|
+
hint: 'Add maxVisits to the child state, or add an explicit child-level round-limit guard when the fan-out pump is implemented.',
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return diagnostics;
|
|
469
|
+
}
|
|
470
|
+
function isSelfLoopableWithinSegment(def, stateId, segment) {
|
|
471
|
+
const seen = new Set();
|
|
472
|
+
const queue = collectTransitionTargets(def.states[stateId]).filter((target) => segment.has(target));
|
|
473
|
+
while (queue.length > 0) {
|
|
474
|
+
const current = queue.shift();
|
|
475
|
+
if (current === undefined)
|
|
476
|
+
continue;
|
|
477
|
+
if (current === stateId)
|
|
478
|
+
return true;
|
|
479
|
+
if (seen.has(current))
|
|
480
|
+
continue;
|
|
481
|
+
seen.add(current);
|
|
482
|
+
const state = def.states[current];
|
|
483
|
+
if (state === undefined)
|
|
484
|
+
continue;
|
|
485
|
+
for (const target of collectTransitionTargets(state)) {
|
|
486
|
+
if (segment.has(target))
|
|
487
|
+
queue.push(target);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
return false;
|
|
491
|
+
}
|
|
492
|
+
// ---------------------------------------------------------------------------
|
|
493
|
+
// WF010 — skill references and skill-manifest integrity
|
|
494
|
+
// ---------------------------------------------------------------------------
|
|
495
|
+
/**
|
|
496
|
+
* Entry point for WF010. Skips cleanly when `ctx.workflowFilePath` is
|
|
497
|
+
* absent (in-memory definitions have no package dir to scan).
|
|
498
|
+
* `checkSkillManifests` runs independently of any state reference so
|
|
499
|
+
* a typo'd frontmatter — which would silently disappear from
|
|
500
|
+
* discovery — still surfaces.
|
|
501
|
+
*/
|
|
502
|
+
function checkSkillReferencesAndManifests(def, ctx) {
|
|
503
|
+
if (!ctx.workflowFilePath)
|
|
504
|
+
return [];
|
|
505
|
+
const skillsRoot = resolve(getWorkflowPackageDir(ctx.workflowFilePath), 'skills');
|
|
506
|
+
const { skills, errors } = discoverSkillsWithErrors(skillsRoot, 'workflow');
|
|
507
|
+
return [...checkSkillManifests(errors), ...checkSkillReferences(def, skills, skillsRoot)];
|
|
508
|
+
}
|
|
509
|
+
function checkSkillManifests(errors) {
|
|
510
|
+
const diagnostics = [];
|
|
511
|
+
for (const err of errors) {
|
|
512
|
+
if (!ACTIONABLE_DISCOVERY_REASONS.has(err.reason))
|
|
513
|
+
continue;
|
|
514
|
+
diagnostics.push({
|
|
515
|
+
code: 'WF010',
|
|
516
|
+
severity: 'error',
|
|
517
|
+
...buildSkillManifestDiagnostic(err),
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
return diagnostics;
|
|
521
|
+
}
|
|
522
|
+
function buildSkillManifestDiagnostic(err) {
|
|
523
|
+
const detail = err.detail ?? err.reason;
|
|
524
|
+
// Switch is exhaustive over `SkillDiscoveryErrorReason`. No `default`:
|
|
525
|
+
// a new union member must add a case here or TypeScript will flag the
|
|
526
|
+
// missing return-type coverage at compile time.
|
|
527
|
+
switch (err.reason) {
|
|
528
|
+
case 'malformed-frontmatter':
|
|
529
|
+
return {
|
|
530
|
+
message: `Malformed SKILL.md frontmatter at ${err.skillDir}: ${detail}.`,
|
|
531
|
+
hint: 'Fix the YAML frontmatter (the block fenced by `---` lines at the top of SKILL.md).',
|
|
532
|
+
};
|
|
533
|
+
case 'missing-required-fields':
|
|
534
|
+
return {
|
|
535
|
+
message: `SKILL.md at ${err.skillDir} is missing required frontmatter fields: ${detail}.`,
|
|
536
|
+
hint: 'SKILL.md frontmatter must declare both `name:` and `description:` as strings.',
|
|
537
|
+
};
|
|
538
|
+
case 'unreadable':
|
|
539
|
+
return {
|
|
540
|
+
message: `Unreadable SKILL.md at ${err.skillDir}: ${detail}.`,
|
|
541
|
+
hint: 'Check filesystem permissions or whether the path is a directory.',
|
|
542
|
+
};
|
|
543
|
+
case 'missing-manifest':
|
|
544
|
+
return {
|
|
545
|
+
message: `Missing SKILL.md at ${err.skillDir}: ${detail}.`,
|
|
546
|
+
hint: 'Create a SKILL.md file with a `---`-fenced YAML frontmatter declaring `name:` and `description:`.',
|
|
547
|
+
};
|
|
548
|
+
case 'duplicate-name':
|
|
549
|
+
return {
|
|
550
|
+
message: `Duplicate skill at ${err.skillDir}: ${detail}.`,
|
|
551
|
+
hint: 'Two skill directories under the same skills root cannot share the same frontmatter `name:`. Rename one in its SKILL.md frontmatter.',
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
/**
|
|
556
|
+
* Walks every agent state's `skills?: string[]` and emits one
|
|
557
|
+
* diagnostic per offending entry — either an invalid name (rejected by
|
|
558
|
+
* `validateSkillName`) or a name that does not match any discovered
|
|
559
|
+
* skill's frontmatter `name:` under `<packageDir>/skills/`. The
|
|
560
|
+
* frontmatter name is the user-facing identifier (matched by
|
|
561
|
+
* `workflowSkillFilter` in `src/skills/discovery.ts`), not the
|
|
562
|
+
* directory name. The orchestrator's `validateWorkflowSkillReferences`
|
|
563
|
+
* throws for the same conditions at start; surfacing them at lint time
|
|
564
|
+
* gives authors fast feedback before they hit runtime.
|
|
565
|
+
*/
|
|
566
|
+
function checkSkillReferences(def, discovered, skillsRoot) {
|
|
567
|
+
const discoveredNames = new Set(discovered.map((s) => s.name));
|
|
568
|
+
const available = [...discoveredNames].sort();
|
|
569
|
+
const availableHint = available.length > 0 ? available.join(', ') : '(none)';
|
|
570
|
+
const diagnostics = [];
|
|
571
|
+
for (const issue of iterateSkillRefIssues(def, discoveredNames)) {
|
|
572
|
+
if (issue.kind === 'invalid-name') {
|
|
573
|
+
diagnostics.push({
|
|
574
|
+
code: 'WF010',
|
|
575
|
+
severity: 'error',
|
|
576
|
+
stateId: issue.stateId,
|
|
577
|
+
message: `Invalid skill name "${issue.name}" in state "${issue.stateId}": ${issue.detail}.`,
|
|
578
|
+
hint: 'Skill names must be a single non-empty path segment with no separators or "."/"..".',
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
else {
|
|
582
|
+
diagnostics.push({
|
|
583
|
+
code: 'WF010',
|
|
584
|
+
severity: 'error',
|
|
585
|
+
stateId: issue.stateId,
|
|
586
|
+
message: `State "${issue.stateId}" references skill "${issue.name}" but no skill with that frontmatter name was found under ${skillsRoot}. Available: ${availableHint}.`,
|
|
587
|
+
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.`,
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
return diagnostics;
|
|
592
|
+
}
|
|
593
|
+
//# 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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"}
|