@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,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/persona/broad-policy-validator.ts
|
|
3
|
+
*
|
|
4
|
+
* Broad-policy validator (Phase 1c, §7). Passed as the `validateCompiled` hook
|
|
5
|
+
* to `compilePersonaPolicy` by the persona-compile orchestrator. It runs on the
|
|
6
|
+
* in-memory `CompiledPolicyFile` BEFORE any artifact is written, so a rejection
|
|
7
|
+
* leaves the prior generation's files intact (no partial write).
|
|
8
|
+
*
|
|
9
|
+
* It defeats constitution prompt-injection toward an over-permissive policy in a
|
|
10
|
+
* way that is fully LLM-independent: it inspects the COMPILED rules, not the
|
|
11
|
+
* constitution text. A persona may only emit a "broad" policy if it has been
|
|
12
|
+
* explicitly opted in via the gated `personas.setBroadPolicyOptIn` flow
|
|
13
|
+
* (`persona.allowBroadPolicy === true`). Otherwise the following are rejected:
|
|
14
|
+
*
|
|
15
|
+
* - any "broad wildcard" `domains.allowed` entry (see isBroadDomainPattern),
|
|
16
|
+
* - any "broad wildcard" `lists[].allowed` entry,
|
|
17
|
+
* - any `paths.within` that resolves OUTSIDE the persona's workspace dir.
|
|
18
|
+
*
|
|
19
|
+
* A "broad wildcard" is not just the literal `*`. The runtime matcher
|
|
20
|
+
* (domainMatchesAllowlist in trusted-process/domain-utils.ts) treats any
|
|
21
|
+
* `*.`-prefixed pattern as a hostname suffix match, and the compiler is
|
|
22
|
+
* explicitly allowed to emit prefix wildcards (`*.example.com`). A TLD-level
|
|
23
|
+
* wildcard like `*.com`, `*.gov`, or the empty-suffix `*.` therefore grants
|
|
24
|
+
* near-wildcard egress and must be treated as broad — only a wildcard whose
|
|
25
|
+
* suffix has TWO OR MORE labels (e.g. `*.github.com`, scoped to a single
|
|
26
|
+
* registered domain) is considered narrow and allowed without opt-in.
|
|
27
|
+
*
|
|
28
|
+
* Rejection throws {@link BroadPolicyRejectedError}; the orchestrator maps the
|
|
29
|
+
* `code` (`BROAD_POLICY_REJECTED`) onto a terminal `persona.compile.failed`
|
|
30
|
+
* event.
|
|
31
|
+
*
|
|
32
|
+
* ZERO runtime value-imports from src/pipeline — the `CompiledPolicyFile` shape
|
|
33
|
+
* is a type-only import. Path containment uses the live-layer `resolveRealPath`
|
|
34
|
+
* helper (symlink-aware), consistent with the policy engine.
|
|
35
|
+
*
|
|
36
|
+
* @see docs/designs/web-ui-policy-persona-management.md §7
|
|
37
|
+
*/
|
|
38
|
+
import type { ErrorCode } from '../web-ui/web-ui-types.js';
|
|
39
|
+
import type { CompiledPolicyFile, DynamicListsFile } from '../pipeline/types.js';
|
|
40
|
+
/** Thrown when a compiled policy is "broad" but the persona is not opted in. */
|
|
41
|
+
export declare class BroadPolicyRejectedError extends Error {
|
|
42
|
+
readonly data?: {
|
|
43
|
+
broadenedDomains: string[];
|
|
44
|
+
outOfWorkspacePaths: string[];
|
|
45
|
+
} | undefined;
|
|
46
|
+
readonly code: ErrorCode;
|
|
47
|
+
constructor(message: string, data?: {
|
|
48
|
+
broadenedDomains: string[];
|
|
49
|
+
outOfWorkspacePaths: string[];
|
|
50
|
+
} | undefined);
|
|
51
|
+
}
|
|
52
|
+
/** Findings produced by inspecting a compiled policy for broadening. */
|
|
53
|
+
export interface BroadPolicyFindings {
|
|
54
|
+
/**
|
|
55
|
+
* Broad-wildcard entries found in any `domains.allowed` or `lists[].allowed`
|
|
56
|
+
* (the literal pattern, e.g. `*`, `*.`, `*.com`). See {@link isBroadDomainPattern}.
|
|
57
|
+
*/
|
|
58
|
+
readonly broadenedDomains: string[];
|
|
59
|
+
/** `paths.within` values resolving outside the workspace dir. */
|
|
60
|
+
readonly outOfWorkspacePaths: string[];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Returns true iff `pattern` grants near-wildcard egress and therefore requires
|
|
64
|
+
* the broad-policy opt-in. This mirrors the runtime matcher semantics in
|
|
65
|
+
* `domainMatchesAllowlist` (trusted-process/domain-utils.ts), where `*` matches
|
|
66
|
+
* any non-IP host and `*.<suffix>` matches every host ending in `.<suffix>`.
|
|
67
|
+
*
|
|
68
|
+
* Broad (rejected without opt-in):
|
|
69
|
+
* - `*` — matches every (non-IP) host
|
|
70
|
+
* - `*.` — empty suffix; `endsWith('.')` matches ~everything
|
|
71
|
+
* - `*.com`/`*.gov`— TLD-only suffix (<= 1 label after the `*.`)
|
|
72
|
+
*
|
|
73
|
+
* Narrow (allowed without opt-in):
|
|
74
|
+
* - `*.github.com` — suffix has >= 2 labels (one registered domain)
|
|
75
|
+
* - `github.com` — bare hostname (no wildcard)
|
|
76
|
+
*/
|
|
77
|
+
export declare function isBroadDomainPattern(pattern: string): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Inspects a compiled policy and returns the set of "broad" findings. Pure /
|
|
80
|
+
* side-effect-free so it can also feed the ruleDelta computation. A path is
|
|
81
|
+
* "out of workspace" iff its real-resolved form is neither the workspace dir nor
|
|
82
|
+
* a descendant of it. When `dynamicLists` is supplied, `@list` references in
|
|
83
|
+
* `domains.allowed` / `lists[].allowed` are resolved to their concrete values so
|
|
84
|
+
* a list that resolves to a broad wildcard is detected (the validator passes it;
|
|
85
|
+
* callers without the resolved lists — e.g. the rule-delta report — still get the
|
|
86
|
+
* literal-pattern findings).
|
|
87
|
+
*/
|
|
88
|
+
export declare function findBroadPolicy(policy: CompiledPolicyFile, workspaceDir: string, dynamicLists?: DynamicListsFile): BroadPolicyFindings;
|
|
89
|
+
/**
|
|
90
|
+
* Builds a `validateCompiled` hook bound to a persona's workspace dir and
|
|
91
|
+
* opt-in flag. When `allowBroadPolicy` is true the hook is a no-op (broadening
|
|
92
|
+
* is permitted); otherwise it throws {@link BroadPolicyRejectedError} on any
|
|
93
|
+
* broad finding.
|
|
94
|
+
*/
|
|
95
|
+
export declare function makeBroadPolicyValidator(workspaceDir: string, allowBroadPolicy: boolean): (policy: CompiledPolicyFile, dynamicLists?: DynamicListsFile) => void;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/persona/broad-policy-validator.ts
|
|
3
|
+
*
|
|
4
|
+
* Broad-policy validator (Phase 1c, §7). Passed as the `validateCompiled` hook
|
|
5
|
+
* to `compilePersonaPolicy` by the persona-compile orchestrator. It runs on the
|
|
6
|
+
* in-memory `CompiledPolicyFile` BEFORE any artifact is written, so a rejection
|
|
7
|
+
* leaves the prior generation's files intact (no partial write).
|
|
8
|
+
*
|
|
9
|
+
* It defeats constitution prompt-injection toward an over-permissive policy in a
|
|
10
|
+
* way that is fully LLM-independent: it inspects the COMPILED rules, not the
|
|
11
|
+
* constitution text. A persona may only emit a "broad" policy if it has been
|
|
12
|
+
* explicitly opted in via the gated `personas.setBroadPolicyOptIn` flow
|
|
13
|
+
* (`persona.allowBroadPolicy === true`). Otherwise the following are rejected:
|
|
14
|
+
*
|
|
15
|
+
* - any "broad wildcard" `domains.allowed` entry (see isBroadDomainPattern),
|
|
16
|
+
* - any "broad wildcard" `lists[].allowed` entry,
|
|
17
|
+
* - any `paths.within` that resolves OUTSIDE the persona's workspace dir.
|
|
18
|
+
*
|
|
19
|
+
* A "broad wildcard" is not just the literal `*`. The runtime matcher
|
|
20
|
+
* (domainMatchesAllowlist in trusted-process/domain-utils.ts) treats any
|
|
21
|
+
* `*.`-prefixed pattern as a hostname suffix match, and the compiler is
|
|
22
|
+
* explicitly allowed to emit prefix wildcards (`*.example.com`). A TLD-level
|
|
23
|
+
* wildcard like `*.com`, `*.gov`, or the empty-suffix `*.` therefore grants
|
|
24
|
+
* near-wildcard egress and must be treated as broad — only a wildcard whose
|
|
25
|
+
* suffix has TWO OR MORE labels (e.g. `*.github.com`, scoped to a single
|
|
26
|
+
* registered domain) is considered narrow and allowed without opt-in.
|
|
27
|
+
*
|
|
28
|
+
* Rejection throws {@link BroadPolicyRejectedError}; the orchestrator maps the
|
|
29
|
+
* `code` (`BROAD_POLICY_REJECTED`) onto a terminal `persona.compile.failed`
|
|
30
|
+
* event.
|
|
31
|
+
*
|
|
32
|
+
* ZERO runtime value-imports from src/pipeline — the `CompiledPolicyFile` shape
|
|
33
|
+
* is a type-only import. Path containment uses the live-layer `resolveRealPath`
|
|
34
|
+
* helper (symlink-aware), consistent with the policy engine.
|
|
35
|
+
*
|
|
36
|
+
* @see docs/designs/web-ui-policy-persona-management.md §7
|
|
37
|
+
*/
|
|
38
|
+
import { resolveRealPath } from '../types/argument-roles.js';
|
|
39
|
+
/** Thrown when a compiled policy is "broad" but the persona is not opted in. */
|
|
40
|
+
export class BroadPolicyRejectedError extends Error {
|
|
41
|
+
data;
|
|
42
|
+
code = 'BROAD_POLICY_REJECTED';
|
|
43
|
+
constructor(message, data) {
|
|
44
|
+
super(message);
|
|
45
|
+
this.data = data;
|
|
46
|
+
this.name = 'BroadPolicyRejectedError';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Returns true iff `pattern` grants near-wildcard egress and therefore requires
|
|
51
|
+
* the broad-policy opt-in. This mirrors the runtime matcher semantics in
|
|
52
|
+
* `domainMatchesAllowlist` (trusted-process/domain-utils.ts), where `*` matches
|
|
53
|
+
* any non-IP host and `*.<suffix>` matches every host ending in `.<suffix>`.
|
|
54
|
+
*
|
|
55
|
+
* Broad (rejected without opt-in):
|
|
56
|
+
* - `*` — matches every (non-IP) host
|
|
57
|
+
* - `*.` — empty suffix; `endsWith('.')` matches ~everything
|
|
58
|
+
* - `*.com`/`*.gov`— TLD-only suffix (<= 1 label after the `*.`)
|
|
59
|
+
*
|
|
60
|
+
* Narrow (allowed without opt-in):
|
|
61
|
+
* - `*.github.com` — suffix has >= 2 labels (one registered domain)
|
|
62
|
+
* - `github.com` — bare hostname (no wildcard)
|
|
63
|
+
*/
|
|
64
|
+
export function isBroadDomainPattern(pattern) {
|
|
65
|
+
if (pattern === '*')
|
|
66
|
+
return true;
|
|
67
|
+
if (!pattern.startsWith('*.'))
|
|
68
|
+
return false;
|
|
69
|
+
const suffix = pattern.slice(2); // drop the leading "*."
|
|
70
|
+
// Empty or single-label suffix (TLD-only) => broad. Count non-empty labels.
|
|
71
|
+
const labels = suffix.split('.').filter((l) => l.length > 0);
|
|
72
|
+
return labels.length <= 1;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Expands an `allowed` array (from `domains.allowed` or `lists[].allowed`) into
|
|
76
|
+
* the concrete values to test for breadth. A `@list` reference contributes its
|
|
77
|
+
* EFFECTIVE values (values + manualAdditions − manualRemovals), mirroring
|
|
78
|
+
* `PolicyEngine.getEffectiveListValues` — so a list that RESOLVES to a broad
|
|
79
|
+
* wildcard (e.g. a "major news sites" list containing `*.com`) is caught even
|
|
80
|
+
* though the rule only stores the `@list` symbol and the resolved values live
|
|
81
|
+
* separately in dynamic-lists.json. A missing list contributes nothing: the
|
|
82
|
+
* runtime fails closed (missing `@list` => empty => deny), so there is nothing
|
|
83
|
+
* broad to flag. `via` records the originating `@list` for a clear message.
|
|
84
|
+
*/
|
|
85
|
+
function expandAllowedForBreadth(allowed, dynamicLists) {
|
|
86
|
+
const out = [];
|
|
87
|
+
for (const entry of allowed) {
|
|
88
|
+
if (!entry.startsWith('@')) {
|
|
89
|
+
out.push({ value: entry });
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const list = dynamicLists?.lists[entry.slice(1)];
|
|
93
|
+
if (!list)
|
|
94
|
+
continue;
|
|
95
|
+
const removals = new Set(list.manualRemovals);
|
|
96
|
+
for (const v of new Set([...list.values, ...list.manualAdditions])) {
|
|
97
|
+
if (!removals.has(v))
|
|
98
|
+
out.push({ value: v, via: entry });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Inspects a compiled policy and returns the set of "broad" findings. Pure /
|
|
105
|
+
* side-effect-free so it can also feed the ruleDelta computation. A path is
|
|
106
|
+
* "out of workspace" iff its real-resolved form is neither the workspace dir nor
|
|
107
|
+
* a descendant of it. When `dynamicLists` is supplied, `@list` references in
|
|
108
|
+
* `domains.allowed` / `lists[].allowed` are resolved to their concrete values so
|
|
109
|
+
* a list that resolves to a broad wildcard is detected (the validator passes it;
|
|
110
|
+
* callers without the resolved lists — e.g. the rule-delta report — still get the
|
|
111
|
+
* literal-pattern findings).
|
|
112
|
+
*/
|
|
113
|
+
export function findBroadPolicy(policy, workspaceDir, dynamicLists) {
|
|
114
|
+
const broadenedDomains = new Set();
|
|
115
|
+
const outOfWorkspacePaths = new Set();
|
|
116
|
+
const workspaceReal = resolveRealPath(workspaceDir);
|
|
117
|
+
const flagBroad = (entries) => {
|
|
118
|
+
for (const { value, via } of expandAllowedForBreadth(entries, dynamicLists)) {
|
|
119
|
+
if (isBroadDomainPattern(value))
|
|
120
|
+
broadenedDomains.add(via ? `${value} (via ${via})` : value);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
for (const rule of policy.rules) {
|
|
124
|
+
const cond = rule.if;
|
|
125
|
+
// Wildcard domains — incl. those reached through a resolved @list.
|
|
126
|
+
if (cond.domains?.allowed)
|
|
127
|
+
flagBroad(cond.domains.allowed);
|
|
128
|
+
// Wildcard list allowances.
|
|
129
|
+
if (cond.lists) {
|
|
130
|
+
for (const list of cond.lists)
|
|
131
|
+
flagBroad(list.allowed);
|
|
132
|
+
}
|
|
133
|
+
// Out-of-workspace path containment.
|
|
134
|
+
if (cond.paths?.within) {
|
|
135
|
+
const within = cond.paths.within;
|
|
136
|
+
const withinReal = resolveRealPath(within);
|
|
137
|
+
const contained = withinReal === workspaceReal || withinReal.startsWith(workspaceReal + '/');
|
|
138
|
+
if (!contained)
|
|
139
|
+
outOfWorkspacePaths.add(within);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
broadenedDomains: [...broadenedDomains],
|
|
144
|
+
outOfWorkspacePaths: [...outOfWorkspacePaths],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Builds a `validateCompiled` hook bound to a persona's workspace dir and
|
|
149
|
+
* opt-in flag. When `allowBroadPolicy` is true the hook is a no-op (broadening
|
|
150
|
+
* is permitted); otherwise it throws {@link BroadPolicyRejectedError} on any
|
|
151
|
+
* broad finding.
|
|
152
|
+
*/
|
|
153
|
+
export function makeBroadPolicyValidator(workspaceDir, allowBroadPolicy) {
|
|
154
|
+
return (policy, dynamicLists) => {
|
|
155
|
+
if (allowBroadPolicy)
|
|
156
|
+
return;
|
|
157
|
+
const findings = findBroadPolicy(policy, workspaceDir, dynamicLists);
|
|
158
|
+
if (findings.broadenedDomains.length === 0 && findings.outOfWorkspacePaths.length === 0) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const parts = [];
|
|
162
|
+
if (findings.broadenedDomains.length > 0) {
|
|
163
|
+
parts.push(`broad wildcard domain/list access: ${findings.broadenedDomains.join(', ')}`);
|
|
164
|
+
}
|
|
165
|
+
if (findings.outOfWorkspacePaths.length > 0) {
|
|
166
|
+
parts.push(`out-of-workspace path(s): ${findings.outOfWorkspacePaths.join(', ')}`);
|
|
167
|
+
}
|
|
168
|
+
throw new BroadPolicyRejectedError(`Compiled policy is too broad (${parts.join('; ')}). Enable broad policy for this persona to allow it.`, { broadenedDomains: findings.broadenedDomains, outOfWorkspacePaths: findings.outOfWorkspacePaths });
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=broad-policy-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broad-policy-validator.js","sourceRoot":"","sources":["../../src/persona/broad-policy-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,61 @@
|
|
|
6
6
|
* compileTaskPolicy() in src/cron/compile-task-policy.ts. The key
|
|
7
7
|
* difference is constitutionKind: 'constitution' (broad principles)
|
|
8
8
|
* vs 'task-policy' (task-specific whitelist).
|
|
9
|
+
*
|
|
10
|
+
* This is the SANCTIONED pipeline value-import seam (see
|
|
11
|
+
* test/pipeline-import-boundary.test.ts + the ESLint no-restricted-imports
|
|
12
|
+
* rule). It is reached ONLY via `await import(...)` from
|
|
13
|
+
* persona-compile-orchestrator.ts; nothing on the live runtime path imports it
|
|
14
|
+
* statically.
|
|
9
15
|
*/
|
|
16
|
+
import { type PipelineModels } from '../pipeline/pipeline-runner.js';
|
|
10
17
|
import type { PersonaName } from './types.js';
|
|
11
|
-
import type { CompiledPolicyFile } from '../pipeline/types.js';
|
|
18
|
+
import type { CompiledPolicyFile, DynamicListsFile } from '../pipeline/types.js';
|
|
19
|
+
import type { ServerProgressReporter } from '../pipeline/pipeline-shared.js';
|
|
20
|
+
/**
|
|
21
|
+
* Options for a streamed persona compile (Phase 1b). Threads the long-running
|
|
22
|
+
* concerns through to `PipelineRunner.run`. All fields are optional; absent =>
|
|
23
|
+
* the legacy CLI behavior (no reporter factory, no signal, not quiet, MCP lists
|
|
24
|
+
* allowed, workspace-bound allowedDirectory).
|
|
25
|
+
*/
|
|
26
|
+
export interface CompilePersonaOptions {
|
|
27
|
+
/** Per-server progress reporter factory (the EventBusProgressReporter). */
|
|
28
|
+
readonly reporterFactory?: (serverName: string) => ServerProgressReporter;
|
|
29
|
+
/** Cooperative cancellation (wall-clock cap / shutdown). */
|
|
30
|
+
readonly signal?: AbortSignal;
|
|
31
|
+
/** Suppress narrative stderr; requires a reporterFactory. */
|
|
32
|
+
readonly quiet?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Operation id used to scope the per-op LLM interaction log to
|
|
35
|
+
* `generated/llm-interactions/<operationId>.jsonl`.
|
|
36
|
+
*/
|
|
37
|
+
readonly operationId?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Whether the list resolver may connect to live MCP servers. The WS path
|
|
40
|
+
* passes false (no live MCP) so MCP-backed lists fail fast.
|
|
41
|
+
*/
|
|
42
|
+
readonly allowMcpLists?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Sandbox boundary for structural invariant checks. Defaults to the
|
|
45
|
+
* persona's workspace dir (stable, persona-bound). Per spike A9 this is for
|
|
46
|
+
* cache/log stability only — it is NOT the runtime containment authority.
|
|
47
|
+
*/
|
|
48
|
+
readonly allowedDirectory?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Optional validation hook invoked on the in-memory compiled policy BEFORE any
|
|
51
|
+
* artifact is written (threads through to `PipelineRunner.run`). Throwing
|
|
52
|
+
* rejects the compile and leaves prior artifacts intact. Phase 1c uses this to
|
|
53
|
+
* enforce the broad-policy invariant (reject `'*'` domains/lists or
|
|
54
|
+
* out-of-workspace `paths.within` unless the persona is opted in).
|
|
55
|
+
*/
|
|
56
|
+
readonly validateCompiled?: (policy: CompiledPolicyFile, dynamicLists?: DynamicListsFile) => void;
|
|
57
|
+
/**
|
|
58
|
+
* TEST-ONLY injection seam: pre-built PipelineModels (fake LLM). When absent,
|
|
59
|
+
* `createPipelineModels` is called (real provider). Production callers never
|
|
60
|
+
* pass this.
|
|
61
|
+
*/
|
|
62
|
+
readonly models?: PipelineModels;
|
|
63
|
+
}
|
|
12
64
|
/**
|
|
13
65
|
* Compiles a persona's constitution.md into policy rules, writing
|
|
14
66
|
* output to the persona's generated/ directory.
|
|
@@ -18,4 +70,4 @@ import type { CompiledPolicyFile } from '../pipeline/types.js';
|
|
|
18
70
|
* allowlist, only filtered servers are passed to the pipeline so the
|
|
19
71
|
* compiled policy only references relevant tools.
|
|
20
72
|
*/
|
|
21
|
-
export declare function compilePersonaPolicy(name: PersonaName): Promise<CompiledPolicyFile>;
|
|
73
|
+
export declare function compilePersonaPolicy(name: PersonaName, opts?: CompilePersonaOptions): Promise<CompiledPolicyFile>;
|
|
@@ -6,12 +6,19 @@
|
|
|
6
6
|
* compileTaskPolicy() in src/cron/compile-task-policy.ts. The key
|
|
7
7
|
* difference is constitutionKind: 'constitution' (broad principles)
|
|
8
8
|
* vs 'task-policy' (task-specific whitelist).
|
|
9
|
+
*
|
|
10
|
+
* This is the SANCTIONED pipeline value-import seam (see
|
|
11
|
+
* test/pipeline-import-boundary.test.ts + the ESLint no-restricted-imports
|
|
12
|
+
* rule). It is reached ONLY via `await import(...)` from
|
|
13
|
+
* persona-compile-orchestrator.ts; nothing on the live runtime path imports it
|
|
14
|
+
* statically.
|
|
9
15
|
*/
|
|
10
16
|
import { readFileSync } from 'node:fs';
|
|
17
|
+
import { resolve } from 'node:path';
|
|
11
18
|
import { PipelineRunner, createPipelineModels } from '../pipeline/pipeline-runner.js';
|
|
12
19
|
import { loadConfig, getPackageGeneratedDir } from '../config/index.js';
|
|
13
20
|
import { getUserGeneratedDir } from '../config/paths.js';
|
|
14
|
-
import { getPersonaConstitutionPath, getPersonaGeneratedDir, loadPersona, applyServerAllowlist } from './resolve.js';
|
|
21
|
+
import { getPersonaConstitutionPath, getPersonaGeneratedDir, getPersonaWorkspaceDir, loadPersona, applyServerAllowlist, } from './resolve.js';
|
|
15
22
|
/**
|
|
16
23
|
* Compiles a persona's constitution.md into policy rules, writing
|
|
17
24
|
* output to the persona's generated/ directory.
|
|
@@ -21,13 +28,23 @@ import { getPersonaConstitutionPath, getPersonaGeneratedDir, loadPersona, applyS
|
|
|
21
28
|
* allowlist, only filtered servers are passed to the pipeline so the
|
|
22
29
|
* compiled policy only references relevant tools.
|
|
23
30
|
*/
|
|
24
|
-
export async function compilePersonaPolicy(name) {
|
|
31
|
+
export async function compilePersonaPolicy(name, opts = {}) {
|
|
25
32
|
const config = loadConfig();
|
|
26
33
|
const outputDir = getPersonaGeneratedDir(name);
|
|
27
34
|
const constitutionPath = getPersonaConstitutionPath(name);
|
|
28
35
|
const constitutionText = readFileSync(constitutionPath, 'utf-8');
|
|
29
36
|
const annotationsDir = getUserGeneratedDir();
|
|
30
|
-
|
|
37
|
+
// Per-operation LLM log path when an operationId is supplied:
|
|
38
|
+
// `generated/llm-interactions/<operationId>.jsonl`. The pipeline truncates the
|
|
39
|
+
// file when it initializes the log (createLlmLoggingMiddleware -> initLogFile)
|
|
40
|
+
// and appends thereafter; because the operationId is interpolated into the
|
|
41
|
+
// FILENAME (not just used as a presence check), each compile writes to its own
|
|
42
|
+
// fresh file, so concurrent/successive compiles of the same persona never
|
|
43
|
+
// co-mingle or clobber one another. Without an operationId, the pipeline
|
|
44
|
+
// default (`<outputDir>/llm-interactions.jsonl`) applies.
|
|
45
|
+
const logDir = opts.operationId ? resolve(outputDir, 'llm-interactions') : outputDir;
|
|
46
|
+
const logFileName = opts.operationId ? `${opts.operationId}.jsonl` : undefined;
|
|
47
|
+
const models = opts.models ?? (await createPipelineModels(logDir, logFileName));
|
|
31
48
|
const runner = new PipelineRunner(models);
|
|
32
49
|
// Apply server allowlist if the persona specifies one
|
|
33
50
|
let mcpServers = config.mcpServers;
|
|
@@ -35,17 +52,25 @@ export async function compilePersonaPolicy(name) {
|
|
|
35
52
|
if (persona.servers) {
|
|
36
53
|
mcpServers = applyServerAllowlist(mcpServers, persona.servers);
|
|
37
54
|
}
|
|
55
|
+
// allowedDirectory defaults to the persona workspace dir (stable, persona-
|
|
56
|
+
// bound) rather than the daemon's process.env.ALLOWED_DIRECTORY fallback.
|
|
57
|
+
const allowedDirectory = opts.allowedDirectory ?? getPersonaWorkspaceDir(name);
|
|
38
58
|
return runner.run({
|
|
39
59
|
constitutionInput: constitutionText,
|
|
40
60
|
constitutionKind: 'constitution',
|
|
41
61
|
outputDir,
|
|
42
62
|
toolAnnotationsDir: annotationsDir,
|
|
43
63
|
toolAnnotationsFallbackDir: getPackageGeneratedDir(),
|
|
44
|
-
allowedDirectory
|
|
64
|
+
allowedDirectory,
|
|
45
65
|
protectedPaths: config.protectedPaths,
|
|
46
66
|
mcpServers,
|
|
47
67
|
includeHandwrittenScenarios: false,
|
|
48
68
|
prefilterText: constitutionText,
|
|
69
|
+
...(opts.reporterFactory ? { reporterFactory: opts.reporterFactory } : {}),
|
|
70
|
+
...(opts.signal ? { signal: opts.signal } : {}),
|
|
71
|
+
...(opts.quiet !== undefined ? { quiet: opts.quiet } : {}),
|
|
72
|
+
...(opts.allowMcpLists !== undefined ? { allowMcpLists: opts.allowMcpLists } : {}),
|
|
73
|
+
...(opts.validateCompiled ? { validateCompiled: opts.validateCompiled } : {}),
|
|
49
74
|
});
|
|
50
75
|
}
|
|
51
76
|
//# sourceMappingURL=compile-persona-policy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-persona-policy.js","sourceRoot":"","sources":["../../src/persona/compile-persona-policy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"compile-persona-policy.js","sourceRoot":"","sources":["../../src/persona/compile-persona-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/persona/event-bus-progress-reporter.ts
|
|
3
|
+
*
|
|
4
|
+
* Bridges the pipeline's per-server {@link ServerProgressReporter} contract to
|
|
5
|
+
* the daemon's persona-compile operation record + WS event bus (Phase 1b, §4.2).
|
|
6
|
+
*
|
|
7
|
+
* The reporter is created per server via the `reporterFactory` injected into
|
|
8
|
+
* `PipelineRunConfig`. On every phase transition it:
|
|
9
|
+
* 1. writes the live `{ serverName, compilationPhase, detail }` into the
|
|
10
|
+
* active operation record (the SNAPSHOT — the source of truth, so a
|
|
11
|
+
* reconnecting client renders the current phase from one `listCompiles`
|
|
12
|
+
* call), THEN
|
|
13
|
+
* 2. emits the best-effort / lossy `persona.compile.progress` event (which
|
|
14
|
+
* only reaches currently-open WS clients).
|
|
15
|
+
*
|
|
16
|
+
* ZERO runtime value-imports from src/pipeline — the `ServerProgressReporter` /
|
|
17
|
+
* `CompilationPhase` contracts are TYPE-ONLY imports. Enforced by the Phase-0
|
|
18
|
+
* ESLint no-restricted-imports rule + test/pipeline-import-boundary.test.ts.
|
|
19
|
+
*
|
|
20
|
+
* @see docs/designs/web-ui-policy-persona-management.md §4.2
|
|
21
|
+
*/
|
|
22
|
+
import type { ServerProgressReporter, CompilationPhase } from '../pipeline/pipeline-shared.js';
|
|
23
|
+
/** Live server-progress snapshot written into the operation record. */
|
|
24
|
+
export interface ServerProgressSnapshot {
|
|
25
|
+
readonly serverName: string;
|
|
26
|
+
readonly compilationPhase: CompilationPhase;
|
|
27
|
+
readonly detail?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Wiring the reporter needs to update the snapshot and emit progress. */
|
|
30
|
+
export interface EventBusProgressReporterContext {
|
|
31
|
+
readonly operationId: string;
|
|
32
|
+
readonly personaName: string;
|
|
33
|
+
readonly serverName: string;
|
|
34
|
+
/** Emit the (best-effort) progress event. */
|
|
35
|
+
readonly emit: (progress: {
|
|
36
|
+
name: string;
|
|
37
|
+
operationId: string;
|
|
38
|
+
serverName: string;
|
|
39
|
+
phase: CompilationPhase;
|
|
40
|
+
detail?: string;
|
|
41
|
+
}) => void;
|
|
42
|
+
/** Write the live phase into the active operation record (source of truth). */
|
|
43
|
+
readonly snapshotUpdate: (snapshot: ServerProgressSnapshot) => void;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* `ServerProgressReporter` implementation that drives the operation-record
|
|
47
|
+
* snapshot first, then emits a progress event.
|
|
48
|
+
*/
|
|
49
|
+
export declare class EventBusProgressReporter implements ServerProgressReporter {
|
|
50
|
+
private readonly ctx;
|
|
51
|
+
constructor(ctx: EventBusProgressReporterContext);
|
|
52
|
+
update(phase: CompilationPhase, detail?: string): void;
|
|
53
|
+
complete(phase: CompilationPhase, summary: string, elapsed: number): void;
|
|
54
|
+
warn(message: string): void;
|
|
55
|
+
fail(phase: CompilationPhase, error: Error): void;
|
|
56
|
+
done(summary: string): void;
|
|
57
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/persona/event-bus-progress-reporter.ts
|
|
3
|
+
*
|
|
4
|
+
* Bridges the pipeline's per-server {@link ServerProgressReporter} contract to
|
|
5
|
+
* the daemon's persona-compile operation record + WS event bus (Phase 1b, §4.2).
|
|
6
|
+
*
|
|
7
|
+
* The reporter is created per server via the `reporterFactory` injected into
|
|
8
|
+
* `PipelineRunConfig`. On every phase transition it:
|
|
9
|
+
* 1. writes the live `{ serverName, compilationPhase, detail }` into the
|
|
10
|
+
* active operation record (the SNAPSHOT — the source of truth, so a
|
|
11
|
+
* reconnecting client renders the current phase from one `listCompiles`
|
|
12
|
+
* call), THEN
|
|
13
|
+
* 2. emits the best-effort / lossy `persona.compile.progress` event (which
|
|
14
|
+
* only reaches currently-open WS clients).
|
|
15
|
+
*
|
|
16
|
+
* ZERO runtime value-imports from src/pipeline — the `ServerProgressReporter` /
|
|
17
|
+
* `CompilationPhase` contracts are TYPE-ONLY imports. Enforced by the Phase-0
|
|
18
|
+
* ESLint no-restricted-imports rule + test/pipeline-import-boundary.test.ts.
|
|
19
|
+
*
|
|
20
|
+
* @see docs/designs/web-ui-policy-persona-management.md §4.2
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* `ServerProgressReporter` implementation that drives the operation-record
|
|
24
|
+
* snapshot first, then emits a progress event.
|
|
25
|
+
*/
|
|
26
|
+
export class EventBusProgressReporter {
|
|
27
|
+
ctx;
|
|
28
|
+
constructor(ctx) {
|
|
29
|
+
this.ctx = ctx;
|
|
30
|
+
}
|
|
31
|
+
update(phase, detail) {
|
|
32
|
+
// 1) snapshot = source of truth — write BEFORE emitting.
|
|
33
|
+
this.ctx.snapshotUpdate({
|
|
34
|
+
serverName: this.ctx.serverName,
|
|
35
|
+
compilationPhase: phase,
|
|
36
|
+
...(detail ? { detail } : {}),
|
|
37
|
+
});
|
|
38
|
+
// 2) best-effort, lossy progress event.
|
|
39
|
+
this.ctx.emit({
|
|
40
|
+
name: this.ctx.personaName,
|
|
41
|
+
operationId: this.ctx.operationId,
|
|
42
|
+
serverName: this.ctx.serverName,
|
|
43
|
+
phase,
|
|
44
|
+
...(detail ? { detail } : {}),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- interface conformance (elapsed unused)
|
|
48
|
+
complete(phase, summary, elapsed) {
|
|
49
|
+
this.update(phase, summary);
|
|
50
|
+
}
|
|
51
|
+
warn(message) {
|
|
52
|
+
// Route applyServerAllowlist-style warnings as progress, not stderr.
|
|
53
|
+
this.update('compiling', message);
|
|
54
|
+
}
|
|
55
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- interface conformance
|
|
56
|
+
fail(phase, error) {
|
|
57
|
+
// The terminal `persona.compile.failed` event is emitted by the
|
|
58
|
+
// orchestrator's finally block; nothing to do here.
|
|
59
|
+
}
|
|
60
|
+
done(summary) {
|
|
61
|
+
// The terminal `persona.compile.done` event is emitted by the
|
|
62
|
+
// orchestrator's finally block; reflect the final phase in the snapshot.
|
|
63
|
+
this.update('done', summary);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=event-bus-progress-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus-progress-reporter.js","sourceRoot":"","sources":["../../src/persona/event-bus-progress-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA4BH;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IACN;IAA7B,YAA6B,GAAoC;QAApC,QAAG,GAAH,GAAG,CAAiC;IAAG,CAAC;IAErE,MAAM,CAAC,KAAuB,EAAE,MAAe;QAC7C,yDAAyD;QACzD,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;YACtB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU;YAC/B,gBAAgB,EAAE,KAAK;YACvB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;QACH,wCAAwC;QACxC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW;YAC1B,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW;YACjC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU;YAC/B,KAAK;YACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,uGAAuG;IACvG,QAAQ,CAAC,KAAuB,EAAE,OAAe,EAAE,OAAe;QAChE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,qEAAqE;QACrE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,sFAAsF;IACtF,IAAI,CAAC,KAAuB,EAAE,KAAY;QACxC,gEAAgE;QAChE,oDAAoD;IACtD,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,8DAA8D;QAC9D,yEAAyE;QACzE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loader-aware memory-gate wrapper for callers that have only a persona
|
|
3
|
+
* NAME in scope (e.g., the workflow orchestrator at relay-derivation
|
|
4
|
+
* time).
|
|
5
|
+
*
|
|
6
|
+
* Lives in `src/persona/` (not `src/memory/`) to avoid closing a
|
|
7
|
+
* `memory/ -> persona/ -> memory/` import cycle: `loadPersona` lives
|
|
8
|
+
* in `src/persona/resolve.ts`, which already imports from
|
|
9
|
+
* `src/memory/memory-annotations.ts`.
|
|
10
|
+
*/
|
|
11
|
+
import type { ResolvedUserConfig } from '../config/user-config.js';
|
|
12
|
+
/**
|
|
13
|
+
* Loads the persona definition by name and runs the memory gate.
|
|
14
|
+
*
|
|
15
|
+
* Fail-closed: if the persona file is missing or malformed (loadPersona
|
|
16
|
+
* throws), returns false. The orchestrator should not spawn a memory
|
|
17
|
+
* relay for a persona it cannot load.
|
|
18
|
+
*/
|
|
19
|
+
export declare function isMemoryEnabledForPersonaName(name: string, userConfig: ResolvedUserConfig): boolean;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loader-aware memory-gate wrapper for callers that have only a persona
|
|
3
|
+
* NAME in scope (e.g., the workflow orchestrator at relay-derivation
|
|
4
|
+
* time).
|
|
5
|
+
*
|
|
6
|
+
* Lives in `src/persona/` (not `src/memory/`) to avoid closing a
|
|
7
|
+
* `memory/ -> persona/ -> memory/` import cycle: `loadPersona` lives
|
|
8
|
+
* in `src/persona/resolve.ts`, which already imports from
|
|
9
|
+
* `src/memory/memory-annotations.ts`.
|
|
10
|
+
*/
|
|
11
|
+
import { isMemoryEnabledFor } from '../memory/memory-policy.js';
|
|
12
|
+
import { loadPersona } from './resolve.js';
|
|
13
|
+
import { createPersonaName } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Loads the persona definition by name and runs the memory gate.
|
|
16
|
+
*
|
|
17
|
+
* Fail-closed: if the persona file is missing or malformed (loadPersona
|
|
18
|
+
* throws), returns false. The orchestrator should not spawn a memory
|
|
19
|
+
* relay for a persona it cannot load.
|
|
20
|
+
*/
|
|
21
|
+
export function isMemoryEnabledForPersonaName(name, userConfig) {
|
|
22
|
+
if (!userConfig.memory.enabled)
|
|
23
|
+
return false;
|
|
24
|
+
let persona;
|
|
25
|
+
try {
|
|
26
|
+
persona = loadPersona(createPersonaName(name));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
return isMemoryEnabledFor({ persona, userConfig });
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=memory-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-gate.js","sourceRoot":"","sources":["../../src/persona/memory-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAA0B,MAAM,YAAY,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAAC,IAAY,EAAE,UAA8B;IACxF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,OAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,kBAAkB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;AACrD,CAAC"}
|