@provos/ironcurtain 0.6.0 → 0.7.1

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.
Files changed (235) hide show
  1. package/README.md +29 -86
  2. package/dist/cli-help.d.ts +63 -0
  3. package/dist/cli-help.js +102 -0
  4. package/dist/cli-help.js.map +1 -0
  5. package/dist/cli.js +79 -56
  6. package/dist/cli.js.map +1 -1
  7. package/dist/config/config-command.js +136 -2
  8. package/dist/config/config-command.js.map +1 -1
  9. package/dist/config/constitution-readonly.md +21 -0
  10. package/dist/config/generated/tool-annotations.json +487 -338
  11. package/dist/config/generated-readonly/compiled-policy.json +468 -0
  12. package/dist/config/index.d.ts +21 -1
  13. package/dist/config/index.js +12 -4
  14. package/dist/config/index.js.map +1 -1
  15. package/dist/config/mcp-servers.json +2 -8
  16. package/dist/config/paths.d.ts +47 -0
  17. package/dist/config/paths.js +81 -0
  18. package/dist/config/paths.js.map +1 -1
  19. package/dist/config/tool-description-hints.json +15 -0
  20. package/dist/config/types.d.ts +7 -0
  21. package/dist/config/user-config.d.ts +21 -0
  22. package/dist/config/user-config.js +8 -0
  23. package/dist/config/user-config.js.map +1 -1
  24. package/dist/cron/compile-task-policy.d.ts +17 -0
  25. package/dist/cron/compile-task-policy.js +39 -0
  26. package/dist/cron/compile-task-policy.js.map +1 -0
  27. package/dist/cron/constitution-generator.d.ts +60 -0
  28. package/dist/cron/constitution-generator.js +217 -0
  29. package/dist/cron/constitution-generator.js.map +1 -0
  30. package/dist/cron/cron-scheduler.d.ts +65 -0
  31. package/dist/cron/cron-scheduler.js +184 -0
  32. package/dist/cron/cron-scheduler.js.map +1 -0
  33. package/dist/cron/file-lock.d.ts +41 -0
  34. package/dist/cron/file-lock.js +156 -0
  35. package/dist/cron/file-lock.js.map +1 -0
  36. package/dist/cron/format-utils.d.ts +18 -0
  37. package/dist/cron/format-utils.js +145 -0
  38. package/dist/cron/format-utils.js.map +1 -0
  39. package/dist/cron/git-sync.d.ts +22 -0
  40. package/dist/cron/git-sync.js +121 -0
  41. package/dist/cron/git-sync.js.map +1 -0
  42. package/dist/cron/headless-transport.d.ts +27 -0
  43. package/dist/cron/headless-transport.js +43 -0
  44. package/dist/cron/headless-transport.js.map +1 -0
  45. package/dist/cron/job-commands.d.ts +39 -0
  46. package/dist/cron/job-commands.js +585 -0
  47. package/dist/cron/job-commands.js.map +1 -0
  48. package/dist/cron/job-customizer.d.ts +22 -0
  49. package/dist/cron/job-customizer.js +47 -0
  50. package/dist/cron/job-customizer.js.map +1 -0
  51. package/dist/cron/job-store.d.ts +35 -0
  52. package/dist/cron/job-store.js +111 -0
  53. package/dist/cron/job-store.js.map +1 -0
  54. package/dist/cron/types.d.ts +135 -0
  55. package/dist/cron/types.js +22 -0
  56. package/dist/cron/types.js.map +1 -0
  57. package/dist/daemon/control-socket.d.ts +127 -0
  58. package/dist/daemon/control-socket.js +261 -0
  59. package/dist/daemon/control-socket.js.map +1 -0
  60. package/dist/daemon/daemon-command.d.ts +13 -0
  61. package/dist/daemon/daemon-command.js +230 -0
  62. package/dist/daemon/daemon-command.js.map +1 -0
  63. package/dist/daemon/ironcurtain-daemon.d.ts +90 -0
  64. package/dist/daemon/ironcurtain-daemon.js +550 -0
  65. package/dist/daemon/ironcurtain-daemon.js.map +1 -0
  66. package/dist/docker/adapters/claude-code.js +7 -47
  67. package/dist/docker/adapters/claude-code.js.map +1 -1
  68. package/dist/docker/adapters/goose.d.ts +58 -0
  69. package/dist/docker/adapters/goose.js +250 -0
  70. package/dist/docker/adapters/goose.js.map +1 -0
  71. package/dist/docker/adapters/shared-scripts.d.ts +29 -0
  72. package/dist/docker/adapters/shared-scripts.js +80 -0
  73. package/dist/docker/adapters/shared-scripts.js.map +1 -0
  74. package/dist/docker/agent-adapter.d.ts +12 -0
  75. package/dist/docker/agent-adapter.js.map +1 -1
  76. package/dist/docker/agent-registry.d.ts +6 -1
  77. package/dist/docker/agent-registry.js +10 -1
  78. package/dist/docker/agent-registry.js.map +1 -1
  79. package/dist/docker/docker-agent-session.d.ts +2 -25
  80. package/dist/docker/docker-agent-session.js +7 -106
  81. package/dist/docker/docker-agent-session.js.map +1 -1
  82. package/dist/docker/docker-infrastructure.d.ts +8 -0
  83. package/dist/docker/docker-infrastructure.js +12 -11
  84. package/dist/docker/docker-infrastructure.js.map +1 -1
  85. package/dist/docker/mitm-proxy.js +10 -5
  86. package/dist/docker/mitm-proxy.js.map +1 -1
  87. package/dist/docker/oauth-credentials.js +2 -2
  88. package/dist/docker/oauth-credentials.js.map +1 -1
  89. package/dist/docker/pty-session.js +146 -39
  90. package/dist/docker/pty-session.js.map +1 -1
  91. package/dist/escalation/escalation-watcher.d.ts +2 -0
  92. package/dist/escalation/escalation-watcher.js +3 -0
  93. package/dist/escalation/escalation-watcher.js.map +1 -1
  94. package/dist/escalation/session-registry.js +1 -14
  95. package/dist/escalation/session-registry.js.map +1 -1
  96. package/dist/index.js +43 -5
  97. package/dist/index.js.map +1 -1
  98. package/dist/mux/mux-app.js +11 -6
  99. package/dist/mux/mux-app.js.map +1 -1
  100. package/dist/mux/mux-command.js +49 -10
  101. package/dist/mux/mux-command.js.map +1 -1
  102. package/dist/mux/mux-input-handler.d.ts +5 -0
  103. package/dist/mux/mux-input-handler.js +64 -9
  104. package/dist/mux/mux-input-handler.js.map +1 -1
  105. package/dist/mux/mux-renderer.d.ts +20 -0
  106. package/dist/mux/mux-renderer.js +127 -35
  107. package/dist/mux/mux-renderer.js.map +1 -1
  108. package/dist/mux/mux-splash.js +2 -1
  109. package/dist/mux/mux-splash.js.map +1 -1
  110. package/dist/mux/paste-interceptor.d.ts +22 -0
  111. package/dist/mux/paste-interceptor.js +143 -0
  112. package/dist/mux/paste-interceptor.js.map +1 -0
  113. package/dist/mux/pty-bridge.js +1 -1
  114. package/dist/mux/pty-bridge.js.map +1 -1
  115. package/dist/mux/types.d.ts +8 -1
  116. package/dist/mux/types.js +17 -5
  117. package/dist/mux/types.js.map +1 -1
  118. package/dist/persona/compile-persona-policy.d.ts +21 -0
  119. package/dist/persona/compile-persona-policy.js +50 -0
  120. package/dist/persona/compile-persona-policy.js.map +1 -0
  121. package/dist/persona/persona-command.d.ts +9 -0
  122. package/dist/persona/persona-command.js +479 -0
  123. package/dist/persona/persona-command.js.map +1 -0
  124. package/dist/persona/persona-customizer.d.ts +23 -0
  125. package/dist/persona/persona-customizer.js +52 -0
  126. package/dist/persona/persona-customizer.js.map +1 -0
  127. package/dist/persona/persona-prompt.d.ts +19 -0
  128. package/dist/persona/persona-prompt.js +42 -0
  129. package/dist/persona/persona-prompt.js.map +1 -0
  130. package/dist/persona/resolve.d.ts +46 -0
  131. package/dist/persona/resolve.js +108 -0
  132. package/dist/persona/resolve.js.map +1 -0
  133. package/dist/persona/types.d.ts +40 -0
  134. package/dist/persona/types.js +20 -0
  135. package/dist/persona/types.js.map +1 -0
  136. package/dist/pipeline/annotate.js +10 -4
  137. package/dist/pipeline/annotate.js.map +1 -1
  138. package/dist/pipeline/compile.d.ts +14 -31
  139. package/dist/pipeline/compile.js +50 -563
  140. package/dist/pipeline/compile.js.map +1 -1
  141. package/dist/pipeline/constitution-compiler.d.ts +6 -0
  142. package/dist/pipeline/constitution-compiler.js +42 -6
  143. package/dist/pipeline/constitution-compiler.js.map +1 -1
  144. package/dist/pipeline/constitution-customizer.d.ts +3 -0
  145. package/dist/pipeline/constitution-customizer.js +19 -5
  146. package/dist/pipeline/constitution-customizer.js.map +1 -1
  147. package/dist/pipeline/customizer-loop.d.ts +34 -0
  148. package/dist/pipeline/customizer-loop.js +167 -0
  149. package/dist/pipeline/customizer-loop.js.map +1 -0
  150. package/dist/pipeline/mcp-connections.d.ts +16 -0
  151. package/dist/pipeline/mcp-connections.js +61 -0
  152. package/dist/pipeline/mcp-connections.js.map +1 -0
  153. package/dist/pipeline/pipeline-runner.d.ts +86 -0
  154. package/dist/pipeline/pipeline-runner.js +547 -0
  155. package/dist/pipeline/pipeline-runner.js.map +1 -0
  156. package/dist/pipeline/pipeline-shared.d.ts +37 -3
  157. package/dist/pipeline/pipeline-shared.js +77 -16
  158. package/dist/pipeline/pipeline-shared.js.map +1 -1
  159. package/dist/pipeline/refresh-lists.js +38 -12
  160. package/dist/pipeline/refresh-lists.js.map +1 -1
  161. package/dist/pipeline/scenario-generator.js +2 -1
  162. package/dist/pipeline/scenario-generator.js.map +1 -1
  163. package/dist/pipeline/tool-annotator.d.ts +3 -3
  164. package/dist/pipeline/tool-annotator.js +114 -4
  165. package/dist/pipeline/tool-annotator.js.map +1 -1
  166. package/dist/pipeline/types.d.ts +52 -0
  167. package/dist/sandbox/index.js +36 -1
  168. package/dist/sandbox/index.js.map +1 -1
  169. package/dist/session/agent-session.d.ts +3 -0
  170. package/dist/session/agent-session.js +10 -1
  171. package/dist/session/agent-session.js.map +1 -1
  172. package/dist/session/index.d.ts +10 -0
  173. package/dist/session/index.js +134 -12
  174. package/dist/session/index.js.map +1 -1
  175. package/dist/session/preflight.js +26 -6
  176. package/dist/session/preflight.js.map +1 -1
  177. package/dist/session/prompts.d.ts +14 -0
  178. package/dist/session/prompts.js +39 -2
  179. package/dist/session/prompts.js.map +1 -1
  180. package/dist/session/session-manager.d.ts +105 -0
  181. package/dist/session/session-manager.js +134 -0
  182. package/dist/session/session-manager.js.map +1 -0
  183. package/dist/session/session-metadata.d.ts +18 -0
  184. package/dist/session/session-metadata.js +34 -0
  185. package/dist/session/session-metadata.js.map +1 -0
  186. package/dist/session/types.d.ts +47 -0
  187. package/dist/session/workspace-validation.d.ts +2 -0
  188. package/dist/session/workspace-validation.js +6 -5
  189. package/dist/session/workspace-validation.js.map +1 -1
  190. package/dist/signal/bot-command.d.ts +2 -0
  191. package/dist/signal/bot-command.js +8 -0
  192. package/dist/signal/bot-command.js.map +1 -1
  193. package/dist/signal/format.d.ts +27 -0
  194. package/dist/signal/format.js +59 -0
  195. package/dist/signal/format.js.map +1 -1
  196. package/dist/signal/signal-bot-daemon.d.ts +27 -25
  197. package/dist/signal/signal-bot-daemon.js +153 -135
  198. package/dist/signal/signal-bot-daemon.js.map +1 -1
  199. package/dist/signal/signal-container.js +63 -19
  200. package/dist/signal/signal-container.js.map +1 -1
  201. package/dist/signal/signal-transport.js +3 -8
  202. package/dist/signal/signal-transport.js.map +1 -1
  203. package/dist/trusted-process/domain-utils.d.ts +37 -4
  204. package/dist/trusted-process/domain-utils.js +130 -11
  205. package/dist/trusted-process/domain-utils.js.map +1 -1
  206. package/dist/trusted-process/index.js +6 -2
  207. package/dist/trusted-process/index.js.map +1 -1
  208. package/dist/trusted-process/mcp-client-manager.js +11 -5
  209. package/dist/trusted-process/mcp-client-manager.js.map +1 -1
  210. package/dist/trusted-process/mcp-proxy-server.d.ts +21 -0
  211. package/dist/trusted-process/mcp-proxy-server.js +91 -28
  212. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  213. package/dist/trusted-process/permissive-output-validator.d.ts +23 -0
  214. package/dist/trusted-process/permissive-output-validator.js +10 -0
  215. package/dist/trusted-process/permissive-output-validator.js.map +1 -0
  216. package/dist/trusted-process/policy-engine.d.ts +29 -7
  217. package/dist/trusted-process/policy-engine.js +149 -92
  218. package/dist/trusted-process/policy-engine.js.map +1 -1
  219. package/dist/trusted-process/tool-description-hints.d.ts +19 -0
  220. package/dist/trusted-process/tool-description-hints.js +53 -0
  221. package/dist/trusted-process/tool-description-hints.js.map +1 -0
  222. package/dist/types/argument-roles.d.ts +33 -1
  223. package/dist/types/argument-roles.js +129 -1
  224. package/dist/types/argument-roles.js.map +1 -1
  225. package/dist/types/slug.d.ts +7 -0
  226. package/dist/types/slug.js +14 -0
  227. package/dist/types/slug.js.map +1 -0
  228. package/dist/utils/editor.d.ts +24 -0
  229. package/dist/utils/editor.js +66 -0
  230. package/dist/utils/editor.js.map +1 -0
  231. package/docker/Dockerfile.goose +34 -0
  232. package/docker/entrypoint-goose.sh +30 -0
  233. package/package.json +1 -1
  234. package/src/config/generated/tool-annotations.json +487 -338
  235. package/src/config/mcp-servers.json +2 -8
@@ -0,0 +1,547 @@
1
+ /**
2
+ * PipelineRunner -- Encapsulates the full policy compilation pipeline.
3
+ *
4
+ * Provides a reusable abstraction over the compile-verify-repair loop.
5
+ * Used by both:
6
+ * - compile.ts CLI (constitutionKind: 'constitution')
7
+ * - compileTaskPolicy() (constitutionKind: 'task-policy')
8
+ *
9
+ * The two constitutionKind variants differ only in the LLM prompt:
10
+ * - 'constitution': broad-principle compilation from a constitution doc
11
+ * - 'task-policy': whitelist-generation from an English task description
12
+ */
13
+ import { resolve } from 'node:path';
14
+ import chalk from 'chalk';
15
+ import { extractServerDomainAllowlists } from '../config/index.js';
16
+ import { PolicyEngine } from '../trusted-process/policy-engine.js';
17
+ import { buildCompilerSystemPrompt, ConstitutionCompilerSession, formatAnnotationsSummary, validateCompiledRules, } from './constitution-compiler.js';
18
+ import { getHandwrittenScenarios } from './handwritten-scenarios.js';
19
+ import { resolveAllLists } from './list-resolver.js';
20
+ import { computeHash, loadExistingArtifact, loadToolAnnotationsFile, mergeReplacements, resolveRulePaths, writeArtifact, withSpinner, showCached, createPipelineLlm, } from './pipeline-shared.js';
21
+ import { applyScenarioCorrections, buildJudgeSystemPrompt, extractScenarioCorrections, filterStructuralConflicts, PolicyVerifierSession, verifyPolicy, } from './policy-verifier.js';
22
+ import { buildGeneratorSystemPrompt, ScenarioGeneratorSession } from './scenario-generator.js';
23
+ import { connectMcpServersForLists, disconnectMcpServers } from './mcp-connections.js';
24
+ /** Creates PipelineModels from user config. Delegates to shared createPipelineLlm. */
25
+ export async function createPipelineModels(logDir) {
26
+ const effectiveLogDir = logDir ?? resolve(process.cwd(), 'generated');
27
+ const llm = await createPipelineLlm(effectiveLogDir, 'unknown');
28
+ return {
29
+ compilationModel: llm.model,
30
+ cacheStrategy: llm.cacheStrategy,
31
+ logContext: llm.logContext,
32
+ logPath: llm.logPath,
33
+ };
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Internal helpers
37
+ // ---------------------------------------------------------------------------
38
+ function computePolicyHash(systemPrompt, annotations) {
39
+ return computeHash(systemPrompt, JSON.stringify(annotations));
40
+ }
41
+ function computeScenariosHash(systemPrompt, handwrittenScenarios) {
42
+ return computeHash(systemPrompt, JSON.stringify(handwrittenScenarios));
43
+ }
44
+ function extractPermittedDirectories(rules) {
45
+ const dirs = new Set();
46
+ for (const rule of rules) {
47
+ if (rule.if.paths?.within) {
48
+ dirs.add(rule.if.paths.within);
49
+ }
50
+ }
51
+ return [...dirs].sort();
52
+ }
53
+ function collectProbeScenarios(result) {
54
+ return result.rounds.flatMap((round) => round.newScenarios);
55
+ }
56
+ function filterAndLogStructuralConflicts(engine, scenarios, label = 'Discarded scenario (structural conflict)') {
57
+ const { valid, discarded } = filterStructuralConflicts(engine, scenarios);
58
+ for (const d of discarded) {
59
+ const prefix = d.scenario.source === 'handwritten'
60
+ ? chalk.yellow('Warning: handwritten scenario conflicts with structural invariant:')
61
+ : chalk.dim(`${label}:`);
62
+ console.error(` ${prefix} "${d.scenario.description}" — ${d.rule} always returns ${d.actual}`);
63
+ }
64
+ return { valid, discarded };
65
+ }
66
+ class RuleValidationError extends Error {
67
+ errors;
68
+ constructor(errors) {
69
+ super('Compiled rule validation failed');
70
+ this.errors = errors;
71
+ this.name = 'RuleValidationError';
72
+ }
73
+ }
74
+ function validateRulesOrThrow(rules, listDefinitions = []) {
75
+ const ruleValidation = validateCompiledRules(rules, listDefinitions);
76
+ if (ruleValidation.warnings.length > 0) {
77
+ for (const w of ruleValidation.warnings) {
78
+ console.error(` ${chalk.yellow('Warning:')} ${w}`);
79
+ }
80
+ }
81
+ if (!ruleValidation.valid) {
82
+ throw new RuleValidationError(ruleValidation.errors);
83
+ }
84
+ }
85
+ function buildPolicyArtifact(constitutionHash, rules, listDefinitions, inputHash) {
86
+ const artifact = {
87
+ generatedAt: new Date().toISOString(),
88
+ constitutionHash,
89
+ inputHash,
90
+ rules,
91
+ };
92
+ if (listDefinitions.length > 0) {
93
+ artifact.listDefinitions = listDefinitions;
94
+ }
95
+ return artifact;
96
+ }
97
+ /**
98
+ * Builds the task-policy system prompt for per-job compilation.
99
+ * Instructs the LLM to generate a strict whitelist from the task.
100
+ */
101
+ function buildTaskCompilerSystemPrompt(taskDescription, annotations, protectedPaths, allowedDirectory) {
102
+ const annotationsSummary = formatAnnotationsSummary(annotations);
103
+ return `You are compiling a task-scoped security policy for an automated scheduled job. The job runs unattended on a schedule. Your goal is to generate the MINIMUM set of policy rules required for this specific task -- nothing more.
104
+
105
+ ## Task Description
106
+
107
+ ${taskDescription}
108
+
109
+ ## Tool Annotations
110
+
111
+ These are the available tools and their classified capabilities:
112
+
113
+ ${annotationsSummary}
114
+
115
+ ## Structural Invariants (handled automatically -- do NOT generate rules for these)
116
+
117
+ 1. **Protected paths** -- reads/writes/deletes to these paths are automatically denied:
118
+ ${protectedPaths.map((p) => `- ${p}`).join('\n')}
119
+
120
+ 2. **Workspace containment** -- operations within the job's workspace (${allowedDirectory}) are automatically allowed.
121
+
122
+ 3. **Default deny** -- if no compiled rule matches, the operation is DENIED. You do NOT need catch-all rules.
123
+
124
+ ## Instructions
125
+
126
+ Generate an ORDERED list of policy rules (first match wins) that allow EXACTLY the operations this task needs. Be a strict whitelist:
127
+
128
+ 1. **Allow** operations the task explicitly describes or clearly requires.
129
+ - "label each issue by type" -> allow github.add_label
130
+ - "add a comment" -> allow github.create_comment
131
+ - "close issues with no response for 30+ days" -> allow github.close_issue (the task explicitly authorizes this)
132
+
133
+ 2. **Escalate** operations that are consequential AND only implicitly needed.
134
+ - If the task says "fix bugs" but doesn't mention specific files, escalate write operations.
135
+ - If an operation could cause data loss and the task doesn't explicitly authorize it, escalate.
136
+
137
+ 3. **Omit** operations the task does not need. Default deny handles them.
138
+ - Do NOT generate rules for tools unrelated to the task.
139
+ - Do NOT generate broad "allow all reads" rules unless the task requires broad read access.
140
+
141
+ 4. **Filesystem access**: The agent's workspace is automatically allowed. Only generate rules for filesystem access OUTSIDE the workspace if the task requires it.
142
+
143
+ 5. **Side-effect-free operations**: Reading and listing operations for tools the task uses should generally be allowed. The task cannot operate without discovering available data.
144
+
145
+ ## Rule Format
146
+
147
+ Produce an ORDERED list of policy rules (first match wins). Each rule has:
148
+ - "name": a kebab-case identifier
149
+ - "description": what the rule does
150
+ - "principle": which task requirement this implements
151
+ - "if": conditions that must ALL be true for the rule to fire:
152
+ - "roles": array of argument roles to match. Omit = any tool.
153
+ - "server": array of server names (omit = any server)
154
+ - "tool": array of specific tool names (omit = any matching tool)
155
+ - "sideEffects": match on the tool's sideEffects annotation (omit = don't filter)
156
+ - "paths": path condition with "roles" and "within" (concrete absolute directory)
157
+ - "domains": domain condition with "roles" and "allowed" (list of allowed domain patterns). For git-remote-url roles, use hostname/owner/repo patterns for specific repos (e.g., "github.com/provos/ironcurtain") or hostname-only for any repo on that host (e.g., "github.com"). Git tools with both path and URL roles need "domains" conditions for git-remote-url (path roles get sandbox-resolved separately).
158
+ - "lists": array of list conditions with "roles", "allowed", and "matchType"
159
+ - "then": "allow" or "escalate" (deny is implicit via default-deny)
160
+ - "reason": human-readable explanation
161
+
162
+ CRITICAL RULES:
163
+ 1. Do NOT generate rules for protected path checking, unknown tool denial, or sandbox containment.
164
+ 2. Use CONCRETE ABSOLUTE paths when needed.
165
+ 3. Order matters: more specific rules before more general ones.
166
+ 4. Only output "allow" and "escalate" rules.
167
+ 5. Be concise in descriptions and reasons -- one sentence each.`;
168
+ }
169
+ // ---------------------------------------------------------------------------
170
+ // PipelineRunner
171
+ // ---------------------------------------------------------------------------
172
+ /**
173
+ * Encapsulates the full policy compilation pipeline:
174
+ * compile rules -> generate scenarios -> verify -> repair loop.
175
+ */
176
+ export class PipelineRunner {
177
+ model;
178
+ cacheStrategy;
179
+ logContext;
180
+ constructor(models) {
181
+ this.model = models.compilationModel;
182
+ this.cacheStrategy = models.cacheStrategy;
183
+ this.logContext = models.logContext;
184
+ }
185
+ /**
186
+ * Runs the full pipeline. Returns the compiled policy on success.
187
+ */
188
+ async run(config) {
189
+ const toolAnnotationsFile = config.preloadedToolAnnotations ??
190
+ loadToolAnnotationsFile(config.toolAnnotationsDir, config.toolAnnotationsFallbackDir);
191
+ if (!toolAnnotationsFile) {
192
+ throw new Error("tool-annotations.json not found. Run 'ironcurtain annotate-tools' first.");
193
+ }
194
+ const allAnnotations = Object.values(toolAnnotationsFile.servers).flatMap((server) => server.tools);
195
+ const serverDomainAllowlists = config.mcpServers ? extractServerDomainAllowlists(config.mcpServers) : undefined;
196
+ const includeHandwritten = config.includeHandwrittenScenarios ?? config.constitutionKind === 'constitution';
197
+ const constitutionHash = computeHash(config.constitutionInput);
198
+ // Build the system prompt based on constitutionKind
199
+ const handwrittenScenarios = includeHandwritten ? getHandwrittenScenarios(config.allowedDirectory) : [];
200
+ const compilerPrompt = config.constitutionKind === 'task-policy'
201
+ ? buildTaskCompilerSystemPrompt(config.constitutionInput, allAnnotations, config.protectedPaths, config.allowedDirectory)
202
+ : buildCompilerSystemPrompt(config.constitutionInput, allAnnotations, { protectedPaths: config.protectedPaths }, handwrittenScenarios.length > 0 ? handwrittenScenarios : undefined);
203
+ const compilerHash = computePolicyHash(compilerPrompt, allAnnotations);
204
+ const compilerSystem = this.cacheStrategy.wrapSystemPrompt(compilerPrompt);
205
+ // Load existing artifacts for cache comparison
206
+ const existingPolicy = loadExistingArtifact(config.outputDir, 'compiled-policy.json');
207
+ const existingScenarios = loadExistingArtifact(config.outputDir, 'test-scenarios.json');
208
+ // Step 1: Compile constitution/task into policy rules
209
+ this.logContext.stepName = 'compile-constitution';
210
+ let { rules, listDefinitions, inputHash, session: compilerSession, } = await this.compilePolicyRules(allAnnotations, compilerHash, existingPolicy, compilerSystem);
211
+ let compiledPolicyFile = buildPolicyArtifact(constitutionHash, rules, listDefinitions, inputHash);
212
+ writeArtifact(config.outputDir, 'compiled-policy.json', compiledPolicyFile);
213
+ // Resolve dynamic lists if the compiler emitted list definitions
214
+ const hasLists = listDefinitions.length > 0;
215
+ const totalSteps = hasLists ? 4 : 3;
216
+ let dynamicLists;
217
+ if (hasLists) {
218
+ this.logContext.stepName = 'resolve-lists';
219
+ const existingLists = loadExistingArtifact(config.outputDir, 'dynamic-lists.json');
220
+ const needsMcp = listDefinitions.some((d) => d.requiresMcp);
221
+ let mcpConnections;
222
+ if (needsMcp && config.mcpServers) {
223
+ mcpConnections = await connectMcpServersForLists(listDefinitions, config.mcpServers);
224
+ }
225
+ const listStepText = `[2/${totalSteps}] Resolving dynamic lists`;
226
+ try {
227
+ const { result: resolvedLists } = await withSpinner(listStepText, async (spinner) => resolveAllLists(listDefinitions, { model: this.model, mcpConnections }, existingLists, (msg) => {
228
+ spinner.text = `${listStepText} — ${msg}`;
229
+ }), (result, elapsed) => {
230
+ const count = Object.keys(result.lists).length;
231
+ return `${listStepText}: ${count} list(s) resolved (${elapsed.toFixed(1)}s)`;
232
+ });
233
+ dynamicLists = resolvedLists;
234
+ writeArtifact(config.outputDir, 'dynamic-lists.json', dynamicLists);
235
+ }
236
+ finally {
237
+ if (mcpConnections) {
238
+ await disconnectMcpServers(mcpConnections);
239
+ }
240
+ }
241
+ }
242
+ // Extract permitted directories from compiled rules
243
+ const permittedDirectories = extractPermittedDirectories(rules);
244
+ // Step 2: Generate test scenarios
245
+ const scenarioStepLabel = `[${hasLists ? 3 : 2}/${totalSteps}]`;
246
+ this.logContext.stepName = 'generate-scenarios';
247
+ const scenarioPrompt = buildGeneratorSystemPrompt(config.constitutionInput, allAnnotations, config.allowedDirectory, permittedDirectories, dynamicLists);
248
+ const scenarioHash = computeScenariosHash(scenarioPrompt, handwrittenScenarios);
249
+ const scenarioSystem = this.cacheStrategy.wrapSystemPrompt(scenarioPrompt);
250
+ const scenarioResult = await this.generateTestScenarios(allAnnotations, config.allowedDirectory, handwrittenScenarios, scenarioHash, existingScenarios, scenarioStepLabel, scenarioSystem);
251
+ writeArtifact(config.outputDir, 'test-scenarios.json', {
252
+ generatedAt: new Date().toISOString(),
253
+ constitutionHash,
254
+ inputHash: scenarioResult.inputHash,
255
+ scenarios: scenarioResult.scenarios,
256
+ });
257
+ // Filter scenarios against structural invariants
258
+ const filterEngine = new PolicyEngine(compiledPolicyFile, toolAnnotationsFile, config.protectedPaths, config.allowedDirectory, undefined, dynamicLists);
259
+ const { valid: initialValid, discarded: discardedScenarios } = filterAndLogStructuralConflicts(filterEngine, scenarioResult.scenarios);
260
+ let filteredScenarios = initialValid;
261
+ // Step 3: Verify compiled policy against scenarios
262
+ const verifyStepLabel = `[${totalSteps}/${totalSteps}]`;
263
+ this.logContext.stepName = 'verify-policy';
264
+ const allAvailableTools = allAnnotations.map((a) => ({ serverName: a.serverName, toolName: a.toolName }));
265
+ const serverNamesList = [...new Set(allAnnotations.map((a) => a.serverName))];
266
+ const toolNamesList = [...new Set(allAnnotations.map((a) => a.toolName))];
267
+ let verifierSystem = this.cacheStrategy.wrapSystemPrompt(buildJudgeSystemPrompt(config.constitutionInput, compiledPolicyFile, config.protectedPaths, allAvailableTools, dynamicLists, config.allowedDirectory));
268
+ let verifierSession = new PolicyVerifierSession({
269
+ system: verifierSystem,
270
+ model: this.model,
271
+ serverNames: serverNamesList,
272
+ toolNames: toolNamesList,
273
+ });
274
+ const { result: verificationResultInitial } = await withSpinner(`${verifyStepLabel} Verifying policy`, async (spinner) => verifyPolicy(config.constitutionInput, compiledPolicyFile, toolAnnotationsFile, config.protectedPaths, filteredScenarios, this.model, 3, config.allowedDirectory, (msg) => {
275
+ spinner.text = `${verifyStepLabel} Verifying policy — ${msg}`;
276
+ }, serverDomainAllowlists, dynamicLists, verifierSystem, verifierSession), (r, elapsed) => r.pass
277
+ ? `${verifyStepLabel} Verified policy: ${r.rounds.length} round(s) (${elapsed.toFixed(1)}s)`
278
+ : `${verifyStepLabel} Verification completed with failures (${elapsed.toFixed(1)}s)`);
279
+ let verificationResult = verificationResultInitial;
280
+ if (!verificationResult.pass) {
281
+ this.logVerboseFailures(verificationResult);
282
+ }
283
+ // Collect probe scenarios from verifier
284
+ const { valid: filteredInitialProbes } = filterAndLogStructuralConflicts(filterEngine, collectProbeScenarios(verificationResult), 'Discarded probe (structural conflict)');
285
+ const accumulatedProbes = filteredInitialProbes;
286
+ // Compile-verify-repair loop (up to 2 repair attempts)
287
+ const MAX_REPAIRS = 2;
288
+ let repairAttempts = 0;
289
+ let scenarioCorrectionsApplied = 0;
290
+ if (!verificationResult.pass) {
291
+ const baseInputHash = inputHash;
292
+ for (let attempt = 1; attempt <= MAX_REPAIRS; attempt++) {
293
+ console.error('');
294
+ const lastRound = verificationResult.rounds[verificationResult.rounds.length - 1];
295
+ const judgeAnalysis = lastRound?.llmAnalysis ?? verificationResult.summary;
296
+ const attributedFailures = lastRound?.attributedFailures ?? [];
297
+ const allScenarios = [...scenarioResult.scenarios, ...accumulatedProbes];
298
+ const { corrections, handwrittenWarnings } = extractScenarioCorrections(attributedFailures, allScenarios);
299
+ for (const warning of handwrittenWarnings) {
300
+ console.error(` ${chalk.yellow('Warning:')} ${warning}`);
301
+ }
302
+ if (corrections.length > 0) {
303
+ scenarioResult.scenarios = applyScenarioCorrections(scenarioResult.scenarios, corrections);
304
+ const correctedProbes = applyScenarioCorrections(accumulatedProbes, corrections);
305
+ accumulatedProbes.splice(0, accumulatedProbes.length, ...correctedProbes);
306
+ scenarioCorrectionsApplied += corrections.length;
307
+ console.error(` ${chalk.dim(`Corrected ${corrections.length} scenario expectation(s)`)}`);
308
+ }
309
+ // Feed corrections back to the scenario generator session
310
+ const { session: scenarioSession } = scenarioResult;
311
+ if (scenarioSession &&
312
+ (corrections.length > 0 || discardedScenarios.length > 0 || accumulatedProbes.length > 0)) {
313
+ const feedback = {
314
+ corrections,
315
+ discardedScenarios,
316
+ probeScenarios: accumulatedProbes,
317
+ };
318
+ this.logContext.stepName = `repair-regenerate-${attempt}`;
319
+ const regenText = `Repair ${attempt}/${MAX_REPAIRS}: Regenerating scenarios`;
320
+ const { result: replacements } = await withSpinner(regenText, async (spinner) => scenarioSession.regenerate(feedback, (msg) => {
321
+ spinner.text = `${regenText} — ${msg}`;
322
+ }), (r, elapsed) => `${regenText}: ${r.length} replacement(s) (${elapsed.toFixed(1)}s)`);
323
+ scenarioResult.scenarios = mergeReplacements(scenarioResult.scenarios, replacements, corrections, discardedScenarios);
324
+ }
325
+ ({ valid: filteredScenarios } = filterAndLogStructuralConflicts(filterEngine, scenarioResult.scenarios));
326
+ const allRuleBlamedFailures = verificationResult.failedScenarios.filter((f) => {
327
+ const attr = attributedFailures.find((a) => a.scenarioDescription === f.scenario.description);
328
+ if (!attr || attr.blame.kind === 'rule' || attr.blame.kind === 'both')
329
+ return true;
330
+ return handwrittenWarnings.some((w) => w.includes(f.scenario.description));
331
+ });
332
+ if (allRuleBlamedFailures.length > 0) {
333
+ const repairContext = {
334
+ failedScenarios: allRuleBlamedFailures,
335
+ judgeAnalysis,
336
+ attemptNumber: attempt,
337
+ existingListDefinitions: listDefinitions.length > 0 ? listDefinitions : undefined,
338
+ handwrittenScenarios: includeHandwritten ? handwrittenScenarios : undefined,
339
+ };
340
+ this.logContext.stepName = `repair-compile-${attempt}`;
341
+ const repairCompileText = `Repair ${attempt}/${MAX_REPAIRS}: Recompiling`;
342
+ const { result: repairResult } = await withSpinner(repairCompileText, async (spinner) => this.compilePolicyRulesWithRepair(allAnnotations, config.protectedPaths, baseInputHash, repairContext, compilerSystem, compilerSession, (msg) => {
343
+ spinner.text = `${repairCompileText} — ${msg}`;
344
+ }), (r, elapsed) => `Repair ${attempt}/${MAX_REPAIRS}: Recompiled ${r.rules.length} rules (${elapsed.toFixed(1)}s)`);
345
+ rules = repairResult.rules;
346
+ listDefinitions = repairResult.listDefinitions;
347
+ inputHash = repairResult.inputHash;
348
+ compilerSession = repairResult.session;
349
+ // Re-resolve dynamic lists if repair introduced new ones
350
+ if (dynamicLists && listDefinitions.length > 0) {
351
+ const currentLists = dynamicLists;
352
+ const newListDefs = listDefinitions.filter((def) => !(def.name in currentLists.lists));
353
+ if (newListDefs.length > 0) {
354
+ const mcpRequired = newListDefs.filter((d) => d.requiresMcp);
355
+ if (mcpRequired.length > 0) {
356
+ console.error(` ${chalk.yellow('Warning:')} Repair introduced ${mcpRequired.length} new MCP-requiring list(s) — skipping resolution`);
357
+ }
358
+ const knowledgeDefs = newListDefs.filter((d) => !d.requiresMcp);
359
+ if (knowledgeDefs.length > 0) {
360
+ console.error(` ${chalk.dim(`Resolving ${knowledgeDefs.length} new list(s) from repair...`)}`);
361
+ const resolved = await resolveAllLists(knowledgeDefs, { model: this.model }, currentLists);
362
+ dynamicLists = {
363
+ ...resolved,
364
+ lists: { ...currentLists.lists, ...resolved.lists },
365
+ };
366
+ writeArtifact(config.outputDir, 'dynamic-lists.json', dynamicLists);
367
+ }
368
+ }
369
+ }
370
+ compiledPolicyFile = buildPolicyArtifact(constitutionHash, rules, listDefinitions, inputHash);
371
+ writeArtifact(config.outputDir, 'compiled-policy.json', compiledPolicyFile);
372
+ verifierSystem = this.cacheStrategy.wrapSystemPrompt(buildJudgeSystemPrompt(config.constitutionInput, compiledPolicyFile, config.protectedPaths, allAvailableTools, dynamicLists, config.allowedDirectory));
373
+ verifierSession = new PolicyVerifierSession({
374
+ system: verifierSystem,
375
+ model: this.model,
376
+ serverNames: serverNamesList,
377
+ toolNames: toolNamesList,
378
+ });
379
+ }
380
+ else {
381
+ console.error(` ${chalk.dim('No rule-blamed failures — skipping recompilation')}`);
382
+ }
383
+ this.logContext.stepName = `repair-verify-${attempt}`;
384
+ const repairScenarios = [...filteredScenarios, ...accumulatedProbes];
385
+ const repairVerifyText = `Repair ${attempt}/${MAX_REPAIRS}: Verifying`;
386
+ const { result: repairVerifyResult } = await withSpinner(repairVerifyText, async (spinner) => verifyPolicy(config.constitutionInput, compiledPolicyFile, toolAnnotationsFile, config.protectedPaths, repairScenarios, this.model, 1, config.allowedDirectory, (msg) => {
387
+ spinner.text = `${repairVerifyText} — ${msg}`;
388
+ }, serverDomainAllowlists, dynamicLists, verifierSystem, verifierSession), (r, elapsed) => r.pass
389
+ ? `Repair ${attempt}/${MAX_REPAIRS}: Verified (${elapsed.toFixed(1)}s)`
390
+ : `Repair ${attempt}/${MAX_REPAIRS}: ${r.failedScenarios.length} failure(s) (${elapsed.toFixed(1)}s)`);
391
+ verificationResult = repairVerifyResult;
392
+ if (!verificationResult.pass) {
393
+ this.logVerboseFailures(verificationResult);
394
+ }
395
+ const { valid: validRepairProbes } = filterAndLogStructuralConflicts(filterEngine, collectProbeScenarios(verificationResult), 'Discarded probe (structural conflict)');
396
+ accumulatedProbes.push(...validRepairProbes);
397
+ repairAttempts = attempt;
398
+ if (verificationResult.pass) {
399
+ // Final full verification
400
+ this.logContext.stepName = 'final-verify';
401
+ const finalScenarios = [...filteredScenarios, ...accumulatedProbes];
402
+ const finalSession = new PolicyVerifierSession({
403
+ system: verifierSystem,
404
+ model: this.model,
405
+ serverNames: serverNamesList,
406
+ toolNames: toolNamesList,
407
+ });
408
+ const { result: finalVerifyResult } = await withSpinner('Final full verification', async (spinner) => verifyPolicy(config.constitutionInput, compiledPolicyFile, toolAnnotationsFile, config.protectedPaths, finalScenarios, this.model, 3, config.allowedDirectory, (msg) => {
409
+ spinner.text = `Final full verification — ${msg}`;
410
+ }, serverDomainAllowlists, dynamicLists, verifierSystem, finalSession), (r, elapsed) => r.pass
411
+ ? `Final full verification: passed (${elapsed.toFixed(1)}s)`
412
+ : `Final full verification: ${r.failedScenarios.length} failure(s) (${elapsed.toFixed(1)}s)`);
413
+ verificationResult = finalVerifyResult;
414
+ const { valid: validFinalProbes } = filterAndLogStructuralConflicts(filterEngine, collectProbeScenarios(verificationResult), 'Discarded probe (structural conflict)');
415
+ accumulatedProbes.push(...validFinalProbes);
416
+ break;
417
+ }
418
+ }
419
+ }
420
+ // Re-write scenarios if the repair loop modified them
421
+ if (repairAttempts > 0) {
422
+ writeArtifact(config.outputDir, 'test-scenarios.json', {
423
+ generatedAt: new Date().toISOString(),
424
+ constitutionHash,
425
+ inputHash: scenarioResult.inputHash,
426
+ scenarios: scenarioResult.scenarios,
427
+ });
428
+ }
429
+ // Summary
430
+ const seenDescriptions = new Set(scenarioResult.scenarios.map((s) => s.description));
431
+ const uniqueProbes = accumulatedProbes.filter((s) => {
432
+ if (seenDescriptions.has(s.description))
433
+ return false;
434
+ seenDescriptions.add(s.description);
435
+ return true;
436
+ });
437
+ const totalScenariosTested = filteredScenarios.length + uniqueProbes.length;
438
+ console.error('');
439
+ console.error(` Rules: ${rules.length}`);
440
+ console.error(` Scenarios tested: ${totalScenariosTested}`);
441
+ if (discardedScenarios.length > 0) {
442
+ console.error(` Scenarios discarded (structural conflicts): ${discardedScenarios.length}`);
443
+ }
444
+ if (uniqueProbes.length > 0) {
445
+ console.error(` Probe scenarios accumulated: ${uniqueProbes.length}`);
446
+ }
447
+ if (repairAttempts > 0) {
448
+ console.error(` Repair attempts: ${repairAttempts}`);
449
+ }
450
+ if (scenarioCorrectionsApplied > 0) {
451
+ console.error(` Scenario corrections: ${scenarioCorrectionsApplied}`);
452
+ }
453
+ console.error(` Artifacts written to: ${chalk.dim(config.outputDir + '/')}`);
454
+ if (config.llmLogPath) {
455
+ console.error(` LLM interaction log: ${chalk.dim(config.llmLogPath)}`);
456
+ }
457
+ if (!verificationResult.pass) {
458
+ throw new Error('Verification FAILED — artifacts written but policy may need review.');
459
+ }
460
+ console.error('');
461
+ console.error(chalk.green.bold('Policy compilation successful!'));
462
+ return compiledPolicyFile;
463
+ }
464
+ // -----------------------------------------------------------------------
465
+ // Private compilation methods
466
+ // -----------------------------------------------------------------------
467
+ async compilePolicyRules(annotations, inputHash, existingPolicy, system) {
468
+ const stepText = '[1/3] Compiling constitution';
469
+ if (existingPolicy && existingPolicy.inputHash === inputHash) {
470
+ showCached(stepText);
471
+ return {
472
+ rules: resolveRulePaths(existingPolicy.rules),
473
+ listDefinitions: existingPolicy.listDefinitions ?? [],
474
+ inputHash,
475
+ };
476
+ }
477
+ const session = new ConstitutionCompilerSession({
478
+ system,
479
+ model: this.model,
480
+ annotations,
481
+ });
482
+ const { result: compilationOutput } = await withSpinner(stepText, async (spinner) => {
483
+ const output = await session.compile((msg) => {
484
+ spinner.text = `${stepText} — ${msg}`;
485
+ });
486
+ const compiledRules = resolveRulePaths(output.rules);
487
+ validateRulesOrThrow(compiledRules, output.listDefinitions);
488
+ return { rules: compiledRules, listDefinitions: output.listDefinitions };
489
+ }, (output, elapsed) => `${stepText}: ${output.rules.length} rules compiled (${elapsed.toFixed(1)}s)`);
490
+ return {
491
+ rules: compilationOutput.rules,
492
+ listDefinitions: compilationOutput.listDefinitions,
493
+ inputHash,
494
+ session,
495
+ };
496
+ }
497
+ async compilePolicyRulesWithRepair(annotations, protectedPaths, baseInputHash, repairContext, system, session, onProgress) {
498
+ let output;
499
+ if (session) {
500
+ output = await session.recompile(repairContext, onProgress);
501
+ }
502
+ else {
503
+ const { compileConstitution } = await import('./constitution-compiler.js');
504
+ output = await compileConstitution('', // Not needed when system prompt is provided
505
+ annotations, { protectedPaths }, this.model, repairContext, onProgress, system);
506
+ }
507
+ const compiledRules = resolveRulePaths(output.rules);
508
+ validateRulesOrThrow(compiledRules, output.listDefinitions);
509
+ return {
510
+ rules: compiledRules,
511
+ listDefinitions: output.listDefinitions,
512
+ inputHash: `${baseInputHash}-repair`,
513
+ session,
514
+ };
515
+ }
516
+ async generateTestScenarios(annotations, allowedDirectory, handwrittenScenarios, inputHash, existingScenarios, stepLabel, system) {
517
+ const stepText = `${stepLabel} Generating test scenarios`;
518
+ if (existingScenarios && existingScenarios.inputHash === inputHash) {
519
+ showCached(stepText);
520
+ return { scenarios: existingScenarios.scenarios, inputHash };
521
+ }
522
+ const session = new ScenarioGeneratorSession({
523
+ system,
524
+ model: this.model,
525
+ annotations,
526
+ handwrittenScenarios,
527
+ });
528
+ const { result: scenarios } = await withSpinner(stepText, async (spinner) => session.generate((msg) => {
529
+ spinner.text = `${stepText} — ${msg}`;
530
+ }), (scenarios, elapsed) => {
531
+ const generatedCount = scenarios.length - handwrittenScenarios.length;
532
+ return `${stepText}: ${scenarios.length} scenarios (${handwrittenScenarios.length} handwritten + ${generatedCount} generated) (${elapsed.toFixed(1)}s)`;
533
+ });
534
+ return { scenarios, inputHash, session };
535
+ }
536
+ logVerboseFailures(result) {
537
+ console.error('');
538
+ console.error(chalk.red('Verification FAILED:'));
539
+ console.error(result.summary);
540
+ console.error('');
541
+ for (const f of result.failedScenarios) {
542
+ console.error(` ${chalk.red('FAIL:')} ${f.scenario.description}`);
543
+ console.error(` Expected: ${f.scenario.expectedDecision}, Got: ${f.actualDecision} (rule: ${f.matchingRule})`);
544
+ }
545
+ }
546
+ }
547
+ //# sourceMappingURL=pipeline-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-runner.js","sourceRoot":"","sources":["../../src/pipeline/pipeline-runner.ts"],"names":[],"mappings":"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"}