@provos/ironcurtain 0.1.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.
Files changed (160) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +311 -0
  3. package/dist/agent/index.d.ts +10 -0
  4. package/dist/agent/index.js +71 -0
  5. package/dist/agent/index.js.map +1 -0
  6. package/dist/agent/prompts.d.ts +5 -0
  7. package/dist/agent/prompts.js +26 -0
  8. package/dist/agent/prompts.js.map +1 -0
  9. package/dist/agent/tools.d.ts +13 -0
  10. package/dist/agent/tools.js +51 -0
  11. package/dist/agent/tools.js.map +1 -0
  12. package/dist/cli.d.ts +2 -0
  13. package/dist/cli.js +78 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config/constitution.md +16 -0
  16. package/dist/config/generated/compiled-policy.json +236 -0
  17. package/dist/config/generated/test-scenarios.json +765 -0
  18. package/dist/config/generated/tool-annotations.json +955 -0
  19. package/dist/config/index.d.ts +25 -0
  20. package/dist/config/index.js +151 -0
  21. package/dist/config/index.js.map +1 -0
  22. package/dist/config/mcp-servers.json +22 -0
  23. package/dist/config/model-provider.d.ts +49 -0
  24. package/dist/config/model-provider.js +78 -0
  25. package/dist/config/model-provider.js.map +1 -0
  26. package/dist/config/paths.d.ts +59 -0
  27. package/dist/config/paths.js +96 -0
  28. package/dist/config/paths.js.map +1 -0
  29. package/dist/config/types.d.ts +89 -0
  30. package/dist/config/types.js +2 -0
  31. package/dist/config/types.js.map +1 -0
  32. package/dist/config/user-config.d.ts +93 -0
  33. package/dist/config/user-config.js +309 -0
  34. package/dist/config/user-config.js.map +1 -0
  35. package/dist/hash.d.ts +17 -0
  36. package/dist/hash.js +34 -0
  37. package/dist/hash.js.map +1 -0
  38. package/dist/index.d.ts +1 -0
  39. package/dist/index.js +61 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/logger.d.ts +11 -0
  42. package/dist/logger.js +93 -0
  43. package/dist/logger.js.map +1 -0
  44. package/dist/pipeline/annotate.d.ts +9 -0
  45. package/dist/pipeline/annotate.js +136 -0
  46. package/dist/pipeline/annotate.js.map +1 -0
  47. package/dist/pipeline/compile.d.ts +23 -0
  48. package/dist/pipeline/compile.js +386 -0
  49. package/dist/pipeline/compile.js.map +1 -0
  50. package/dist/pipeline/constitution-compiler.d.ts +22 -0
  51. package/dist/pipeline/constitution-compiler.js +197 -0
  52. package/dist/pipeline/constitution-compiler.js.map +1 -0
  53. package/dist/pipeline/generate-with-repair.d.ts +22 -0
  54. package/dist/pipeline/generate-with-repair.js +64 -0
  55. package/dist/pipeline/generate-with-repair.js.map +1 -0
  56. package/dist/pipeline/handwritten-scenarios.d.ts +9 -0
  57. package/dist/pipeline/handwritten-scenarios.js +321 -0
  58. package/dist/pipeline/handwritten-scenarios.js.map +1 -0
  59. package/dist/pipeline/llm-logger.d.ts +42 -0
  60. package/dist/pipeline/llm-logger.js +78 -0
  61. package/dist/pipeline/llm-logger.js.map +1 -0
  62. package/dist/pipeline/pipeline-shared.d.ts +47 -0
  63. package/dist/pipeline/pipeline-shared.js +145 -0
  64. package/dist/pipeline/pipeline-shared.js.map +1 -0
  65. package/dist/pipeline/policy-verifier.d.ts +46 -0
  66. package/dist/pipeline/policy-verifier.js +277 -0
  67. package/dist/pipeline/policy-verifier.js.map +1 -0
  68. package/dist/pipeline/scenario-generator.d.ts +11 -0
  69. package/dist/pipeline/scenario-generator.js +128 -0
  70. package/dist/pipeline/scenario-generator.js.map +1 -0
  71. package/dist/pipeline/tool-annotator.d.ts +24 -0
  72. package/dist/pipeline/tool-annotator.js +201 -0
  73. package/dist/pipeline/tool-annotator.js.map +1 -0
  74. package/dist/pipeline/types.d.ts +122 -0
  75. package/dist/pipeline/types.js +10 -0
  76. package/dist/pipeline/types.js.map +1 -0
  77. package/dist/sandbox/index.d.ts +39 -0
  78. package/dist/sandbox/index.js +178 -0
  79. package/dist/sandbox/index.js.map +1 -0
  80. package/dist/session/agent-session.d.ts +83 -0
  81. package/dist/session/agent-session.js +382 -0
  82. package/dist/session/agent-session.js.map +1 -0
  83. package/dist/session/cli-transport.d.ts +61 -0
  84. package/dist/session/cli-transport.js +320 -0
  85. package/dist/session/cli-transport.js.map +1 -0
  86. package/dist/session/errors.d.ts +19 -0
  87. package/dist/session/errors.js +33 -0
  88. package/dist/session/errors.js.map +1 -0
  89. package/dist/session/index.d.ts +29 -0
  90. package/dist/session/index.js +104 -0
  91. package/dist/session/index.js.map +1 -0
  92. package/dist/session/message-compactor.d.ts +32 -0
  93. package/dist/session/message-compactor.js +81 -0
  94. package/dist/session/message-compactor.js.map +1 -0
  95. package/dist/session/prompts.d.ts +5 -0
  96. package/dist/session/prompts.js +62 -0
  97. package/dist/session/prompts.js.map +1 -0
  98. package/dist/session/resource-budget-tracker.d.ts +124 -0
  99. package/dist/session/resource-budget-tracker.js +327 -0
  100. package/dist/session/resource-budget-tracker.js.map +1 -0
  101. package/dist/session/step-loop-detector.d.ts +63 -0
  102. package/dist/session/step-loop-detector.js +136 -0
  103. package/dist/session/step-loop-detector.js.map +1 -0
  104. package/dist/session/transport.d.ts +24 -0
  105. package/dist/session/transport.js +2 -0
  106. package/dist/session/transport.js.map +1 -0
  107. package/dist/session/truncate-result.d.ts +35 -0
  108. package/dist/session/truncate-result.js +71 -0
  109. package/dist/session/truncate-result.js.map +1 -0
  110. package/dist/session/types.d.ts +220 -0
  111. package/dist/session/types.js +6 -0
  112. package/dist/session/types.js.map +1 -0
  113. package/dist/trusted-process/audit-log.d.ts +7 -0
  114. package/dist/trusted-process/audit-log.js +21 -0
  115. package/dist/trusted-process/audit-log.js.map +1 -0
  116. package/dist/trusted-process/call-circuit-breaker.d.ts +33 -0
  117. package/dist/trusted-process/call-circuit-breaker.js +61 -0
  118. package/dist/trusted-process/call-circuit-breaker.js.map +1 -0
  119. package/dist/trusted-process/escalation.d.ts +7 -0
  120. package/dist/trusted-process/escalation.js +38 -0
  121. package/dist/trusted-process/escalation.js.map +1 -0
  122. package/dist/trusted-process/index.d.ts +32 -0
  123. package/dist/trusted-process/index.js +151 -0
  124. package/dist/trusted-process/index.js.map +1 -0
  125. package/dist/trusted-process/mcp-client-manager.d.ts +25 -0
  126. package/dist/trusted-process/mcp-client-manager.js +90 -0
  127. package/dist/trusted-process/mcp-client-manager.js.map +1 -0
  128. package/dist/trusted-process/mcp-proxy-server.d.ts +24 -0
  129. package/dist/trusted-process/mcp-proxy-server.js +451 -0
  130. package/dist/trusted-process/mcp-proxy-server.js.map +1 -0
  131. package/dist/trusted-process/path-utils.d.ts +50 -0
  132. package/dist/trusted-process/path-utils.js +158 -0
  133. package/dist/trusted-process/path-utils.js.map +1 -0
  134. package/dist/trusted-process/policy-engine.d.ts +88 -0
  135. package/dist/trusted-process/policy-engine.js +523 -0
  136. package/dist/trusted-process/policy-engine.js.map +1 -0
  137. package/dist/trusted-process/policy-roots.d.ts +50 -0
  138. package/dist/trusted-process/policy-roots.js +67 -0
  139. package/dist/trusted-process/policy-roots.js.map +1 -0
  140. package/dist/trusted-process/policy-types.d.ts +6 -0
  141. package/dist/trusted-process/policy-types.js +2 -0
  142. package/dist/trusted-process/policy-types.js.map +1 -0
  143. package/dist/trusted-process/sandbox-integration.d.ts +92 -0
  144. package/dist/trusted-process/sandbox-integration.js +184 -0
  145. package/dist/trusted-process/sandbox-integration.js.map +1 -0
  146. package/dist/types/argument-roles.d.ts +112 -0
  147. package/dist/types/argument-roles.js +344 -0
  148. package/dist/types/argument-roles.js.map +1 -0
  149. package/dist/types/audit.d.ts +18 -0
  150. package/dist/types/audit.js +2 -0
  151. package/dist/types/audit.js.map +1 -0
  152. package/dist/types/mcp.d.ts +20 -0
  153. package/dist/types/mcp.js +2 -0
  154. package/dist/types/mcp.js.map +1 -0
  155. package/package.json +83 -0
  156. package/src/config/constitution.md +16 -0
  157. package/src/config/generated/compiled-policy.json +236 -0
  158. package/src/config/generated/test-scenarios.json +765 -0
  159. package/src/config/generated/tool-annotations.json +955 -0
  160. package/src/config/mcp-servers.json +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-verifier.js","sourceRoot":"","sources":["../../src/pipeline/policy-verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Scenario Generator -- LLM-driven test scenario generation.
3
+ *
4
+ * Generates concrete test scenarios (tool call + expected decision) from
5
+ * the constitution and tool annotations. Always includes mandatory
6
+ * handwritten scenarios alongside LLM-generated ones.
7
+ */
8
+ import type { LanguageModel } from 'ai';
9
+ import type { ToolAnnotation, TestScenario } from './types.js';
10
+ export declare function buildGeneratorPrompt(constitutionText: string, annotations: ToolAnnotation[], sandboxDirectory: string, protectedPaths: string[], permittedDirectories?: string[]): string;
11
+ export declare function generateScenarios(constitutionText: string, annotations: ToolAnnotation[], handwrittenScenarios: TestScenario[], sandboxDirectory: string, protectedPaths: string[], llm: LanguageModel, permittedDirectories?: string[], onProgress?: (message: string) => void): Promise<TestScenario[]>;
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Scenario Generator -- LLM-driven test scenario generation.
3
+ *
4
+ * Generates concrete test scenarios (tool call + expected decision) from
5
+ * the constitution and tool annotations. Always includes mandatory
6
+ * handwritten scenarios alongside LLM-generated ones.
7
+ */
8
+ import { z } from 'zod';
9
+ import { generateObjectWithRepair } from './generate-with-repair.js';
10
+ function buildGeneratorResponseSchema(serverNames, toolNames) {
11
+ const scenarioSchema = z.object({
12
+ description: z.string(),
13
+ request: z.object({
14
+ serverName: z.enum(serverNames),
15
+ toolName: z.enum(toolNames),
16
+ arguments: z.record(z.string(), z.unknown()),
17
+ }),
18
+ expectedDecision: z.enum(['allow', 'deny', 'escalate']),
19
+ reasoning: z.string(),
20
+ });
21
+ return z.object({
22
+ scenarios: z.array(scenarioSchema),
23
+ });
24
+ }
25
+ export function buildGeneratorPrompt(constitutionText, annotations, sandboxDirectory, protectedPaths, permittedDirectories) {
26
+ const annotationsSummary = annotations.map(a => {
27
+ const argsDesc = Object.entries(a.args)
28
+ .map(([name, roles]) => `${name}: [${roles.join(', ')}]`)
29
+ .join(', ');
30
+ return ` ${a.serverName}/${a.toolName}: ${a.comment}, sideEffects=${a.sideEffects}, args={${argsDesc || 'none'}}`;
31
+ }).join('\n');
32
+ return `You are generating test scenarios for a security policy engine. Each scenario is a concrete tool call with an expected policy decision.
33
+
34
+ ## Constitution
35
+
36
+ ${constitutionText}
37
+
38
+ ## Tool Annotations
39
+
40
+ ${annotationsSummary}
41
+
42
+ ## System Configuration
43
+
44
+ - Sandbox directory: ${sandboxDirectory}
45
+ ${permittedDirectories && permittedDirectories.length > 0 ? `
46
+ ## Permitted Directories (from compiled policy rules)
47
+
48
+ The compiled rules reference these specific directories. Use these EXACT paths in your scenarios:
49
+
50
+ ${permittedDirectories.map(p => `- ${p}`).join('\n')}
51
+ ` : ''}
52
+ ## Protected Paths (Structural Invariants)
53
+
54
+ The following paths are protected by hardcoded structural invariants in the engine. These checks run BEFORE any compiled rules and always result in \`deny\` for any write or delete operation targeting them:
55
+
56
+ ${protectedPaths.map(p => `- ${p}`).join('\n')}
57
+
58
+ IMPORTANT:
59
+ - These specific absolute paths are the ONLY protected paths. A file with a similar name inside the sandbox (e.g., "${sandboxDirectory}/constitution.md") is NOT protected -- it is a regular file governed by normal policy rules.
60
+ - Scenarios testing protected path access should use the REAL paths listed above and expect \`deny\`.
61
+ - Do NOT generate scenarios that assume files inside the sandbox are protected just because they share a name with a protected file.
62
+
63
+ ## Instructions
64
+
65
+ Generate diverse test scenarios covering:
66
+ 1. **Positive cases**: operations that SHOULD be allowed (within sandbox or permitted directories per constitution)
67
+ 2. **Negative cases**: operations that SHOULD be denied (categorically forbidden by the constitution, e.g., deletes outside sandbox)
68
+ 3. **Escalation cases**: operations outside the sandbox and permitted directories that are NOT categorically forbidden — these require human approval
69
+ 4. **Edge cases**: path traversal attacks, boundary conditions
70
+ 5. **Side-effect-free tools**: tools with no path arguments (should be allowed)
71
+ 6. **Move operations**: all moves involve a delete-path role on the source argument
72
+ 7. **Domain-based operations**: if any tools have URL roles (fetch-url, git-remote-url), generate scenarios for allowed domains, disallowed domains, and named remote resolution
73
+
74
+ The three possible decisions are:
75
+ - "allow" — explicitly permitted by the constitution
76
+ - "deny" — categorically forbidden by the constitution
77
+ - "escalate" — not explicitly permitted and not forbidden; requires human approval
78
+
79
+ For each scenario provide:
80
+ - description: what the test checks
81
+ - request: { serverName, toolName, arguments } with concrete paths
82
+ - expectedDecision: "allow", "deny", or "escalate"
83
+ - reasoning: why this decision follows from the constitution
84
+
85
+ IMPORTANT:
86
+ - Use the EXACT permitted directory paths listed above (not generic paths like "/home/user/Downloads").
87
+ - Use concrete paths based on the sandbox directory "${sandboxDirectory}".
88
+ - For paths outside all permitted areas, use paths like "/etc/passwd", "/var/log/syslog", etc.
89
+ - Structural invariants (protected paths, unknown tools) are handled separately. Focus on the constitution's content rules.
90
+ - Generate at least 10 scenarios with good coverage across all three decision types (allow, deny, escalate).
91
+
92
+ Be concise in descriptions and reasoning -- one sentence each.`;
93
+ }
94
+ /**
95
+ * Checks if two scenarios are substantially similar (same tool + same arguments).
96
+ */
97
+ function areSimilar(a, b) {
98
+ if (a.request.toolName !== b.request.toolName)
99
+ return false;
100
+ if (a.request.serverName !== b.request.serverName)
101
+ return false;
102
+ const aArgs = JSON.stringify(a.request.arguments);
103
+ const bArgs = JSON.stringify(b.request.arguments);
104
+ return aArgs === bArgs;
105
+ }
106
+ export async function generateScenarios(constitutionText, annotations, handwrittenScenarios, sandboxDirectory, protectedPaths, llm, permittedDirectories, onProgress) {
107
+ const serverNames = [...new Set(annotations.map(a => a.serverName))];
108
+ const toolNames = [...new Set(annotations.map(a => a.toolName))];
109
+ const schema = buildGeneratorResponseSchema(serverNames, toolNames);
110
+ const prompt = buildGeneratorPrompt(constitutionText, annotations, sandboxDirectory, protectedPaths, permittedDirectories);
111
+ const { output } = await generateObjectWithRepair({
112
+ model: llm,
113
+ schema,
114
+ prompt,
115
+ onProgress,
116
+ });
117
+ // Mark all LLM-generated scenarios with source: 'generated'
118
+ const generated = output.scenarios.map(s => ({
119
+ ...s,
120
+ source: 'generated',
121
+ }));
122
+ // Deduplicate: remove generated scenarios that are substantially
123
+ // similar to handwritten ones
124
+ const unique = generated.filter(g => !handwrittenScenarios.some(h => areSimilar(g, h)));
125
+ // Handwritten first, then generated
126
+ return [...handwrittenScenarios, ...unique];
127
+ }
128
+ //# sourceMappingURL=scenario-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-generator.js","sourceRoot":"","sources":["../../src/pipeline/scenario-generator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAGrE,SAAS,4BAA4B,CACnC,WAAkC,EAClC,SAAgC;IAEhC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;QAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;YAChB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;YAC/B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;YAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SAC7C,CAAC;QACF,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACvD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;KACtB,CAAC,CAAC;IAEH,OAAO,CAAC,CAAC,MAAM,CAAC;QACd,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;KACnC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,gBAAwB,EACxB,WAA6B,EAC7B,gBAAwB,EACxB,cAAwB,EACxB,oBAA+B;IAE/B,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;aACxD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,KAAK,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,iBAAiB,CAAC,CAAC,WAAW,WAAW,QAAQ,IAAI,MAAM,GAAG,CAAC;IACrH,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;EAIP,gBAAgB;;;;EAIhB,kBAAkB;;;;uBAIG,gBAAgB;EACrC,oBAAoB,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;;;;;EAK1D,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CACnD,CAAC,CAAC,CAAC,EAAE;;;;;EAKJ,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;sHAGwE,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;uDA4B/E,gBAAgB;;;;;+DAKR,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,CAAe,EAAE,CAAe;IAClD,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAEhE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClD,OAAO,KAAK,KAAK,KAAK,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,gBAAwB,EACxB,WAA6B,EAC7B,oBAAoC,EACpC,gBAAwB,EACxB,cAAwB,EACxB,GAAkB,EAClB,oBAA+B,EAC/B,UAAsC;IAEtC,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAA0B,CAAC;IAC9F,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAA0B,CAAC;IAC1F,MAAM,MAAM,GAAG,4BAA4B,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,oBAAoB,CAAC,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,oBAAoB,CAAC,CAAC;IAE3H,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,wBAAwB,CAAC;QAChD,KAAK,EAAE,GAAG;QACV,MAAM;QACN,MAAM;QACN,UAAU;KACX,CAAC,CAAC;IAEH,4DAA4D;IAC5D,MAAM,SAAS,GAAmB,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC;QACJ,MAAM,EAAE,WAAoB;KAC7B,CAAC,CAAC,CAAC;IAEJ,iEAAiE;IACjE,8BAA8B;IAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACvD,CAAC;IAEF,oCAAoC;IACpC,OAAO,CAAC,GAAG,oBAAoB,EAAE,GAAG,MAAM,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Tool Annotator -- LLM-driven classification of MCP tool capabilities.
3
+ *
4
+ * Given a set of MCP tool schemas from a server, the annotator uses an LLM
5
+ * to classify each tool's effect, side effects, and argument roles. A
6
+ * compile-time heuristic validator catches annotation gaps before they
7
+ * reach runtime.
8
+ */
9
+ import type { LanguageModel } from 'ai';
10
+ import type { ToolAnnotation } from './types.js';
11
+ export interface MCPToolSchema {
12
+ name: string;
13
+ description?: string;
14
+ inputSchema: Record<string, unknown>;
15
+ }
16
+ /** Builds role description lines dynamically from the registry for the LLM prompt. */
17
+ export declare function buildRoleDescriptions(serverName?: string): string;
18
+ export declare function buildAnnotationPrompt(serverName: string, tools: MCPToolSchema[]): string;
19
+ export declare function annotateTools(serverName: string, tools: MCPToolSchema[], llm: LanguageModel, onProgress?: (message: string) => void): Promise<ToolAnnotation[]>;
20
+ export interface HeuristicValidationResult {
21
+ valid: boolean;
22
+ warnings: string[];
23
+ }
24
+ export declare function validateAnnotationsHeuristic(tools: MCPToolSchema[], annotations: ToolAnnotation[]): HeuristicValidationResult;
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Tool Annotator -- LLM-driven classification of MCP tool capabilities.
3
+ *
4
+ * Given a set of MCP tool schemas from a server, the annotator uses an LLM
5
+ * to classify each tool's effect, side effects, and argument roles. A
6
+ * compile-time heuristic validator catches annotation gaps before they
7
+ * reach runtime.
8
+ */
9
+ import { z } from 'zod';
10
+ import { ARGUMENT_ROLE_REGISTRY, getRoleDefinition, getRolesForServer, } from '../types/argument-roles.js';
11
+ import { generateObjectWithRepair } from './generate-with-repair.js';
12
+ function buildAnnotationsResponseSchema(serverName, tools) {
13
+ const toolNames = tools.map(t => t.name);
14
+ // Build a per-server role enum so the schema rejects irrelevant roles
15
+ const roleValues = getRolesForServer(serverName).map(([role]) => role);
16
+ const argumentRoleSchema = z.enum(roleValues);
17
+ // LLMs sometimes return a bare string instead of a single-element array.
18
+ // Accept both formats and normalize to an array.
19
+ const rolesArraySchema = z.union([
20
+ z.array(argumentRoleSchema),
21
+ argumentRoleSchema.transform(r => [r]),
22
+ ]);
23
+ // Map tool name → expected argument names from input schemas
24
+ const toolArgNames = new Map();
25
+ for (const t of tools) {
26
+ const props = (t.inputSchema['properties'] ?? {});
27
+ toolArgNames.set(t.name, Object.keys(props));
28
+ }
29
+ const toolAnnotationSchema = z.object({
30
+ toolName: z.enum(toolNames),
31
+ comment: z.string(),
32
+ sideEffects: z.boolean(),
33
+ args: z.record(z.string(), rolesArraySchema),
34
+ });
35
+ return z.object({
36
+ annotations: z.array(toolAnnotationSchema).superRefine((annotations, ctx) => {
37
+ for (let i = 0; i < annotations.length; i++) {
38
+ const a = annotations[i];
39
+ const expectedArgs = toolArgNames.get(a.toolName) ?? [];
40
+ const missingArgs = expectedArgs.filter(name => !(name in a.args));
41
+ if (missingArgs.length > 0) {
42
+ ctx.addIssue({
43
+ code: z.ZodIssueCode.custom,
44
+ path: [i, 'args'],
45
+ message: `Tool "${a.toolName}" is missing role annotations for arguments: ${missingArgs.join(', ')}. Each argument must have a role array (e.g. ["read-path"] or ["none"]).`,
46
+ });
47
+ }
48
+ }
49
+ }),
50
+ });
51
+ }
52
+ /** Builds role description lines dynamically from the registry for the LLM prompt. */
53
+ export function buildRoleDescriptions(serverName) {
54
+ const entries = serverName
55
+ ? getRolesForServer(serverName)
56
+ : [...ARGUMENT_ROLE_REGISTRY.entries()];
57
+ const lines = [];
58
+ for (const [role, def] of entries) {
59
+ lines.push(` - "${role}" -- ${def.description}. ${def.annotationGuidance}`);
60
+ }
61
+ return lines.join('\n');
62
+ }
63
+ export function buildAnnotationPrompt(serverName, tools) {
64
+ const toolDescriptions = tools.map(t => {
65
+ return [
66
+ `Tool: ${t.name}`,
67
+ t.description ? `Description: ${t.description}` : '',
68
+ `Input Schema: ${JSON.stringify(t.inputSchema, null, 2)}`,
69
+ ].filter(Boolean).join('\n');
70
+ }).join('\n\n---\n\n');
71
+ return `You are annotating MCP tools for a security policy engine. For each tool on the "${serverName}" server, classify:
72
+
73
+ 1. **comment**: A brief one-sentence description of what the tool does.
74
+
75
+ 2. **sideEffects**: Whether the tool has security-relevant side effects.
76
+ - true if the tool modifies state OR can disclose information from resource paths (information disclosure is a security-relevant side effect)
77
+ - false ONLY if the tool has NO path arguments AND makes no state changes (e.g., a pure configuration query tool)
78
+ - When in doubt, mark as true (conservative)
79
+
80
+ 3. **args**: For each argument in the tool's input schema, assign an ARRAY of one or more roles:
81
+ ${buildRoleDescriptions(serverName)}
82
+
83
+ IMPORTANT: Each value in the args object MUST be an ARRAY of roles, even for single roles.
84
+ Example: { "path": ["read-path"], "content": ["none"] }
85
+ NOT: { "path": "read-path", "content": "none" }
86
+
87
+ An argument can have MULTIPLE roles. For example, the "source" argument of a move operation has both "read-path" and "delete-path" roles because the source is read and then deleted.
88
+
89
+ Only include arguments that appear in the tool's input schema. If the tool has no arguments, use an empty object.
90
+
91
+ Here is a complete example annotation for a move_file tool that shows multi-role arguments:
92
+
93
+ {
94
+ "toolName": "move_file",
95
+ "comment": "Moves or renames a file or directory from a source path to a destination path in a single operation.",
96
+ "sideEffects": true,
97
+ "args": {
98
+ "source": ["read-path", "delete-path"],
99
+ "destination": ["write-path"]
100
+ }
101
+ }
102
+
103
+ Here are the tools to annotate:
104
+
105
+ ${toolDescriptions}
106
+
107
+ Return annotations for ALL ${tools.length} tools. Use the exact tool names as provided.`;
108
+ }
109
+ export async function annotateTools(serverName, tools, llm, onProgress) {
110
+ if (tools.length === 0)
111
+ return [];
112
+ const schema = buildAnnotationsResponseSchema(serverName, tools);
113
+ const prompt = buildAnnotationPrompt(serverName, tools);
114
+ const { output } = await generateObjectWithRepair({
115
+ model: llm,
116
+ schema,
117
+ prompt,
118
+ onProgress,
119
+ });
120
+ const annotations = output.annotations.map(a => ({
121
+ ...a,
122
+ serverName,
123
+ }));
124
+ // Validate all input tools are represented in the output
125
+ const annotatedNames = new Set(annotations.map(a => a.toolName));
126
+ const missingTools = tools.filter(t => !annotatedNames.has(t.name));
127
+ if (missingTools.length > 0) {
128
+ const names = missingTools.map(t => t.name).join(', ');
129
+ throw new Error(`Annotation incomplete: missing tools: ${names}`);
130
+ }
131
+ return annotations;
132
+ }
133
+ // -----------------------------------------------------------------------
134
+ // Compile-time heuristic validation
135
+ // -----------------------------------------------------------------------
136
+ /** Argument names that strongly suggest filesystem path arguments. */
137
+ const PATH_INDICATOR_NAMES = ['path', 'file', 'dir', 'directory', 'source', 'destination'];
138
+ function looksLikePathArgument(argName) {
139
+ const lower = argName.toLowerCase();
140
+ return PATH_INDICATOR_NAMES.some(indicator => lower.includes(indicator));
141
+ }
142
+ function hasPathLikeValues(schema) {
143
+ const properties = schema['properties'];
144
+ if (!properties)
145
+ return false;
146
+ for (const prop of Object.values(properties)) {
147
+ const defaultVal = prop['default'];
148
+ if (typeof defaultVal === 'string' && (defaultVal.startsWith('/') || defaultVal.startsWith('.'))) {
149
+ return true;
150
+ }
151
+ const examples = prop['examples'];
152
+ if (Array.isArray(examples)) {
153
+ for (const ex of examples) {
154
+ if (typeof ex === 'string' && (ex.startsWith('/') || ex.startsWith('.'))) {
155
+ return true;
156
+ }
157
+ }
158
+ }
159
+ }
160
+ return false;
161
+ }
162
+ export function validateAnnotationsHeuristic(tools, annotations) {
163
+ const annotationsByName = new Map();
164
+ for (const a of annotations) {
165
+ annotationsByName.set(a.toolName, a);
166
+ }
167
+ const warnings = [];
168
+ for (const tool of tools) {
169
+ const annotation = annotationsByName.get(tool.name);
170
+ if (!annotation) {
171
+ warnings.push(`Tool "${tool.name}" has no annotation`);
172
+ continue;
173
+ }
174
+ const properties = (tool.inputSchema['properties'] ?? {});
175
+ for (const [argName, argSchema] of Object.entries(properties)) {
176
+ if (!looksLikePathArgument(argName))
177
+ continue;
178
+ // Skip non-string arguments (booleans, enums, numbers named "directories" etc.)
179
+ const argType = argSchema?.['type'];
180
+ if (argType === 'boolean' || argType === 'number' || argType === 'integer')
181
+ continue;
182
+ const roles = annotation.args[argName];
183
+ const hasPathRole = roles && roles.some(r => getRoleDefinition(r).isResourceIdentifier);
184
+ if (!hasPathRole) {
185
+ warnings.push(`Tool "${tool.name}" argument "${argName}" looks like a path but has no path role in annotation`);
186
+ }
187
+ }
188
+ // Check for path-like default values or examples
189
+ if (hasPathLikeValues(tool.inputSchema)) {
190
+ const hasAnyPathRole = Object.values(annotation.args).some(roles => roles.some(r => getRoleDefinition(r).isResourceIdentifier));
191
+ if (!hasAnyPathRole) {
192
+ warnings.push(`Tool "${tool.name}" schema has path-like defaults/examples but no path roles in annotation`);
193
+ }
194
+ }
195
+ }
196
+ return {
197
+ valid: warnings.length === 0,
198
+ warnings,
199
+ };
200
+ }
201
+ //# sourceMappingURL=tool-annotator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-annotator.js","sourceRoot":"","sources":["../../src/pipeline/tool-annotator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Shared types for the policy compilation pipeline.
3
+ *
4
+ * These types define the structure of the three persistent artifacts
5
+ * produced by `compile-policy`: tool annotations, compiled policy rules,
6
+ * and test scenarios. They are also used by the refactored PolicyEngine
7
+ * at runtime.
8
+ */
9
+ import type { ArgumentRole } from '../types/argument-roles.js';
10
+ export type { ArgumentRole };
11
+ export { isArgumentRole, getArgumentRoleValues } from '../types/argument-roles.js';
12
+ import type { PolicyDecisionStatus } from '../types/mcp.js';
13
+ export type Decision = PolicyDecisionStatus;
14
+ export interface ToolAnnotation {
15
+ toolName: string;
16
+ serverName: string;
17
+ comment: string;
18
+ sideEffects: boolean;
19
+ args: Record<string, ArgumentRole[]>;
20
+ }
21
+ export interface ToolAnnotationsFile {
22
+ generatedAt: string;
23
+ servers: Record<string, {
24
+ inputHash: string;
25
+ tools: ToolAnnotation[];
26
+ }>;
27
+ }
28
+ export interface PathCondition {
29
+ roles: ArgumentRole[];
30
+ within: string;
31
+ }
32
+ export interface DomainCondition {
33
+ roles: ArgumentRole[];
34
+ allowed: string[];
35
+ }
36
+ export interface CompiledRuleCondition {
37
+ roles?: ArgumentRole[];
38
+ server?: string[];
39
+ tool?: string[];
40
+ sideEffects?: boolean;
41
+ paths?: PathCondition;
42
+ domains?: DomainCondition;
43
+ }
44
+ export interface CompiledRule {
45
+ name: string;
46
+ description: string;
47
+ principle: string;
48
+ if: CompiledRuleCondition;
49
+ then: Decision;
50
+ reason: string;
51
+ }
52
+ export interface CompiledPolicyFile {
53
+ generatedAt: string;
54
+ constitutionHash: string;
55
+ inputHash: string;
56
+ rules: CompiledRule[];
57
+ }
58
+ export interface TestScenario {
59
+ description: string;
60
+ request: {
61
+ serverName: string;
62
+ toolName: string;
63
+ arguments: Record<string, unknown>;
64
+ };
65
+ expectedDecision: Decision;
66
+ reasoning: string;
67
+ source: 'generated' | 'handwritten';
68
+ }
69
+ export interface TestScenariosFile {
70
+ generatedAt: string;
71
+ constitutionHash: string;
72
+ inputHash: string;
73
+ scenarios: TestScenario[];
74
+ }
75
+ export interface ExecutionResult {
76
+ scenario: TestScenario;
77
+ actualDecision: Decision;
78
+ matchingRule: string;
79
+ pass: boolean;
80
+ }
81
+ export interface VerifierRound {
82
+ round: number;
83
+ executionResults: ExecutionResult[];
84
+ llmAnalysis: string;
85
+ newScenarios: TestScenario[];
86
+ attributedFailures?: AttributedFailure[];
87
+ }
88
+ export interface VerificationResult {
89
+ pass: boolean;
90
+ rounds: VerifierRound[];
91
+ summary: string;
92
+ failedScenarios: ExecutionResult[];
93
+ }
94
+ export type FailureBlame = {
95
+ kind: 'rule';
96
+ reasoning: string;
97
+ } | {
98
+ kind: 'scenario';
99
+ reasoning: string;
100
+ correctedDecision: Decision;
101
+ correctedReasoning: string;
102
+ } | {
103
+ kind: 'both';
104
+ reasoning: string;
105
+ correctedDecision: Decision;
106
+ correctedReasoning: string;
107
+ };
108
+ export interface AttributedFailure {
109
+ scenarioDescription: string;
110
+ blame: FailureBlame;
111
+ }
112
+ export interface ScenarioCorrection {
113
+ scenarioDescription: string;
114
+ correctedDecision: Decision;
115
+ correctedReasoning: string;
116
+ }
117
+ export interface RepairContext {
118
+ previousRules: CompiledRule[];
119
+ failedScenarios: ExecutionResult[];
120
+ judgeAnalysis: string;
121
+ attemptNumber: number;
122
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared types for the policy compilation pipeline.
3
+ *
4
+ * These types define the structure of the three persistent artifacts
5
+ * produced by `compile-policy`: tool annotations, compiled policy rules,
6
+ * and test scenarios. They are also used by the refactored PolicyEngine
7
+ * at runtime.
8
+ */
9
+ export { isArgumentRole, getArgumentRoleValues } from '../types/argument-roles.js';
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/pipeline/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Sandbox -- Sets up UTCP Code Mode with the MCP proxy server.
3
+ *
4
+ * Code Mode creates a sandboxed TypeScript execution environment where
5
+ * LLM-generated code runs with no direct access to the network, filesystem,
6
+ * or credentials. Instead of connecting to real MCP servers, it connects
7
+ * to our MCP proxy server which evaluates policy on every tool call.
8
+ */
9
+ import '@utcp/mcp';
10
+ import type { IronCurtainConfig } from '../config/types.js';
11
+ /**
12
+ * Transforms a UTCP tool name (dotted) into the actual callable function name
13
+ * in the sandbox. Mirrors UTCP Code Mode's sanitizeIdentifier() behavior:
14
+ * split on first dot (manual name), join remaining parts with underscores.
15
+ *
16
+ * Example: "filesystem.filesystem.list_directory" → "filesystem.filesystem_list_directory"
17
+ */
18
+ export declare function toCallableName(toolName: string): string;
19
+ export interface CodeExecutionResult {
20
+ result: unknown;
21
+ logs: string[];
22
+ }
23
+ export declare class Sandbox {
24
+ private client;
25
+ private toolCatalog;
26
+ private interfacePatchSnippet;
27
+ initialize(config: IronCurtainConfig): Promise<void>;
28
+ /**
29
+ * Builds the tool catalog and the __getToolInterface patch in one pass.
30
+ *
31
+ * The catalog is a compact one-line-per-tool listing using callable names.
32
+ * The patch snippet maps callable names back to raw UTCP names so that
33
+ * __getToolInterface works with either naming convention.
34
+ */
35
+ private buildToolCatalogAndPatch;
36
+ getToolInterfaces(): string;
37
+ executeCode(code: string, timeoutMs?: number): Promise<CodeExecutionResult>;
38
+ shutdown(): Promise<void>;
39
+ }