@provos/ironcurtain 0.8.0 → 0.9.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 (216) hide show
  1. package/README.md +11 -10
  2. package/dist/auth/auth-command.d.ts +15 -0
  3. package/dist/auth/auth-command.js +424 -0
  4. package/dist/auth/auth-command.js.map +1 -0
  5. package/dist/auth/oauth-flow.d.ts +46 -0
  6. package/dist/auth/oauth-flow.js +279 -0
  7. package/dist/auth/oauth-flow.js.map +1 -0
  8. package/dist/auth/oauth-provider.d.ts +55 -0
  9. package/dist/auth/oauth-provider.js +73 -0
  10. package/dist/auth/oauth-provider.js.map +1 -0
  11. package/dist/auth/oauth-registry.d.ts +34 -0
  12. package/dist/auth/oauth-registry.js +69 -0
  13. package/dist/auth/oauth-registry.js.map +1 -0
  14. package/dist/auth/oauth-token-provider.d.ts +52 -0
  15. package/dist/auth/oauth-token-provider.js +159 -0
  16. package/dist/auth/oauth-token-provider.js.map +1 -0
  17. package/dist/auth/oauth-token-store.d.ts +30 -0
  18. package/dist/auth/oauth-token-store.js +93 -0
  19. package/dist/auth/oauth-token-store.js.map +1 -0
  20. package/dist/auth/providers/google-scopes.d.ts +35 -0
  21. package/dist/auth/providers/google-scopes.js +183 -0
  22. package/dist/auth/providers/google-scopes.js.map +1 -0
  23. package/dist/auth/providers/google.d.ts +2 -0
  24. package/dist/auth/providers/google.js +28 -0
  25. package/dist/auth/providers/google.js.map +1 -0
  26. package/dist/cli.js +6 -0
  27. package/dist/cli.js.map +1 -1
  28. package/dist/config/config-command.js +39 -1
  29. package/dist/config/config-command.js.map +1 -1
  30. package/dist/config/constitution-readonly.md +14 -11
  31. package/dist/config/constitution-user-base.md +15 -0
  32. package/dist/config/generated/test-scenarios.json +1 -1
  33. package/dist/config/generated/tool-annotations.json +10617 -296
  34. package/dist/config/generated-readonly/compiled-policy.json +787 -244
  35. package/dist/config/index.d.ts +2 -2
  36. package/dist/config/index.js +8 -0
  37. package/dist/config/index.js.map +1 -1
  38. package/dist/config/mcp-servers.json +23 -0
  39. package/dist/config/paths.d.ts +15 -0
  40. package/dist/config/paths.js +35 -0
  41. package/dist/config/paths.js.map +1 -1
  42. package/dist/config/types.d.ts +8 -0
  43. package/dist/config/user-config.d.ts +2 -0
  44. package/dist/config/user-config.js +2 -0
  45. package/dist/config/user-config.js.map +1 -1
  46. package/dist/cron/headless-transport.d.ts +4 -0
  47. package/dist/cron/headless-transport.js +1 -1
  48. package/dist/cron/headless-transport.js.map +1 -1
  49. package/dist/daemon/ironcurtain-daemon.js +6 -1
  50. package/dist/daemon/ironcurtain-daemon.js.map +1 -1
  51. package/dist/docker/docker-agent-session.d.ts +3 -1
  52. package/dist/docker/docker-agent-session.js +49 -28
  53. package/dist/docker/docker-agent-session.js.map +1 -1
  54. package/dist/docker/docker-infrastructure.js +39 -11
  55. package/dist/docker/docker-infrastructure.js.map +1 -1
  56. package/dist/docker/docker-manager.d.ts +2 -0
  57. package/dist/docker/docker-manager.js +9 -1
  58. package/dist/docker/docker-manager.js.map +1 -1
  59. package/dist/docker/mitm-proxy.d.ts +50 -0
  60. package/dist/docker/mitm-proxy.js +220 -31
  61. package/dist/docker/mitm-proxy.js.map +1 -1
  62. package/dist/docker/oauth-credentials.d.ts +45 -6
  63. package/dist/docker/oauth-credentials.js +151 -24
  64. package/dist/docker/oauth-credentials.js.map +1 -1
  65. package/dist/docker/oauth-token-manager.d.ts +15 -16
  66. package/dist/docker/oauth-token-manager.js +23 -17
  67. package/dist/docker/oauth-token-manager.js.map +1 -1
  68. package/dist/docker/platform.d.ts +6 -6
  69. package/dist/docker/platform.js +8 -6
  70. package/dist/docker/platform.js.map +1 -1
  71. package/dist/docker/proxy-tools.d.ts +80 -0
  72. package/dist/docker/proxy-tools.js +248 -0
  73. package/dist/docker/proxy-tools.js.map +1 -0
  74. package/dist/docker/pty-session.js +48 -29
  75. package/dist/docker/pty-session.js.map +1 -1
  76. package/dist/docker/pty-types.d.ts +4 -0
  77. package/dist/docker/pty-types.js.map +1 -1
  78. package/dist/escalation/escalation-watcher.d.ts +3 -1
  79. package/dist/escalation/escalation-watcher.js +6 -2
  80. package/dist/escalation/escalation-watcher.js.map +1 -1
  81. package/dist/escalation/listener-command.js +24 -10
  82. package/dist/escalation/listener-command.js.map +1 -1
  83. package/dist/escalation/listener-lock.d.ts +5 -0
  84. package/dist/escalation/listener-lock.js +14 -0
  85. package/dist/escalation/listener-lock.js.map +1 -1
  86. package/dist/index.js +6 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/memory/auto-save.d.ts +25 -0
  89. package/dist/memory/auto-save.js +89 -0
  90. package/dist/memory/auto-save.js.map +1 -0
  91. package/dist/mux/mux-app.d.ts +4 -0
  92. package/dist/mux/mux-app.js +186 -21
  93. package/dist/mux/mux-app.js.map +1 -1
  94. package/dist/mux/mux-command.d.ts +2 -2
  95. package/dist/mux/mux-command.js +14 -22
  96. package/dist/mux/mux-command.js.map +1 -1
  97. package/dist/mux/mux-escalation-manager.d.ts +9 -3
  98. package/dist/mux/mux-escalation-manager.js +69 -19
  99. package/dist/mux/mux-escalation-manager.js.map +1 -1
  100. package/dist/mux/mux-input-handler.d.ts +33 -1
  101. package/dist/mux/mux-input-handler.js +112 -29
  102. package/dist/mux/mux-input-handler.js.map +1 -1
  103. package/dist/mux/mux-renderer.d.ts +17 -1
  104. package/dist/mux/mux-renderer.js +288 -7
  105. package/dist/mux/mux-renderer.js.map +1 -1
  106. package/dist/mux/pty-bridge.d.ts +4 -0
  107. package/dist/mux/pty-bridge.js +13 -1
  108. package/dist/mux/pty-bridge.js.map +1 -1
  109. package/dist/mux/types.d.ts +24 -1
  110. package/dist/mux/types.js +10 -1
  111. package/dist/mux/types.js.map +1 -1
  112. package/dist/persona/persona-command.js +0 -5
  113. package/dist/persona/persona-command.js.map +1 -1
  114. package/dist/pipeline/annotate.js +1 -7
  115. package/dist/pipeline/annotate.js.map +1 -1
  116. package/dist/pipeline/compile.d.ts +5 -2
  117. package/dist/pipeline/compile.js +23 -11
  118. package/dist/pipeline/compile.js.map +1 -1
  119. package/dist/pipeline/constitution-compiler.d.ts +302 -3
  120. package/dist/pipeline/constitution-compiler.js +285 -23
  121. package/dist/pipeline/constitution-compiler.js.map +1 -1
  122. package/dist/pipeline/generate-with-repair.d.ts +2 -2
  123. package/dist/pipeline/generate-with-repair.js +2 -2
  124. package/dist/pipeline/handwritten-scenarios.d.ts +20 -7
  125. package/dist/pipeline/handwritten-scenarios.js +20 -41
  126. package/dist/pipeline/handwritten-scenarios.js.map +1 -1
  127. package/dist/pipeline/list-resolver.d.ts +18 -20
  128. package/dist/pipeline/list-resolver.js +28 -36
  129. package/dist/pipeline/list-resolver.js.map +1 -1
  130. package/dist/pipeline/pipeline-runner.d.ts +102 -13
  131. package/dist/pipeline/pipeline-runner.js +497 -237
  132. package/dist/pipeline/pipeline-runner.js.map +1 -1
  133. package/dist/pipeline/pipeline-shared.d.ts +7 -9
  134. package/dist/pipeline/pipeline-shared.js +8 -18
  135. package/dist/pipeline/pipeline-shared.js.map +1 -1
  136. package/dist/pipeline/policy-verifier.d.ts +32 -5
  137. package/dist/pipeline/policy-verifier.js +137 -8
  138. package/dist/pipeline/policy-verifier.js.map +1 -1
  139. package/dist/pipeline/proxy-mcp-connections.d.ts +25 -0
  140. package/dist/pipeline/proxy-mcp-connections.js +121 -0
  141. package/dist/pipeline/proxy-mcp-connections.js.map +1 -0
  142. package/dist/pipeline/refresh-lists.js +21 -13
  143. package/dist/pipeline/refresh-lists.js.map +1 -1
  144. package/dist/pipeline/scenario-generator.d.ts +29 -49
  145. package/dist/pipeline/scenario-generator.js +180 -143
  146. package/dist/pipeline/scenario-generator.js.map +1 -1
  147. package/dist/pipeline/scenario-schema-validator.d.ts +51 -0
  148. package/dist/pipeline/scenario-schema-validator.js +132 -0
  149. package/dist/pipeline/scenario-schema-validator.js.map +1 -0
  150. package/dist/pipeline/tool-annotator.d.ts +9 -8
  151. package/dist/pipeline/tool-annotator.js +48 -95
  152. package/dist/pipeline/tool-annotator.js.map +1 -1
  153. package/dist/pipeline/types.d.ts +31 -24
  154. package/dist/sandbox/index.js +20 -0
  155. package/dist/sandbox/index.js.map +1 -1
  156. package/dist/servers/fetch-server.js +10 -5
  157. package/dist/servers/fetch-server.js.map +1 -1
  158. package/dist/session/agent-session.d.ts +6 -19
  159. package/dist/session/agent-session.js +18 -69
  160. package/dist/session/agent-session.js.map +1 -1
  161. package/dist/session/base-transport.d.ts +17 -1
  162. package/dist/session/base-transport.js +25 -1
  163. package/dist/session/base-transport.js.map +1 -1
  164. package/dist/session/cli-transport.d.ts +5 -0
  165. package/dist/session/cli-transport.js +48 -25
  166. package/dist/session/cli-transport.js.map +1 -1
  167. package/dist/session/preflight.js +15 -16
  168. package/dist/session/preflight.js.map +1 -1
  169. package/dist/session/prompts.js +0 -1
  170. package/dist/session/prompts.js.map +1 -1
  171. package/dist/session/session-manager.d.ts +6 -0
  172. package/dist/session/session-manager.js +12 -0
  173. package/dist/session/session-manager.js.map +1 -1
  174. package/dist/session/types.d.ts +6 -1
  175. package/dist/session/types.js.map +1 -1
  176. package/dist/signal/signal-bot-daemon.js +24 -8
  177. package/dist/signal/signal-bot-daemon.js.map +1 -1
  178. package/dist/signal/signal-transport.d.ts +5 -2
  179. package/dist/signal/signal-transport.js +3 -3
  180. package/dist/signal/signal-transport.js.map +1 -1
  181. package/dist/trusted-process/approval-whitelist.d.ts +117 -0
  182. package/dist/trusted-process/approval-whitelist.js +237 -0
  183. package/dist/trusted-process/approval-whitelist.js.map +1 -0
  184. package/dist/trusted-process/gworkspace-credentials.d.ts +40 -0
  185. package/dist/trusted-process/gworkspace-credentials.js +45 -0
  186. package/dist/trusted-process/gworkspace-credentials.js.map +1 -0
  187. package/dist/trusted-process/index.d.ts +11 -1
  188. package/dist/trusted-process/index.js +63 -27
  189. package/dist/trusted-process/index.js.map +1 -1
  190. package/dist/trusted-process/mcp-proxy-server.d.ts +14 -0
  191. package/dist/trusted-process/mcp-proxy-server.js +325 -64
  192. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  193. package/dist/trusted-process/policy-engine.d.ts +8 -2
  194. package/dist/trusted-process/policy-engine.js +18 -22
  195. package/dist/trusted-process/policy-engine.js.map +1 -1
  196. package/dist/trusted-process/policy-types.d.ts +17 -0
  197. package/dist/trusted-process/sandbox-integration.d.ts +23 -0
  198. package/dist/trusted-process/sandbox-integration.js +115 -3
  199. package/dist/trusted-process/sandbox-integration.js.map +1 -1
  200. package/dist/trusted-process/token-file-refresher.d.ts +69 -0
  201. package/dist/trusted-process/token-file-refresher.js +120 -0
  202. package/dist/trusted-process/token-file-refresher.js.map +1 -0
  203. package/dist/types/argument-roles.d.ts +7 -1
  204. package/dist/types/argument-roles.js +50 -0
  205. package/dist/types/argument-roles.js.map +1 -1
  206. package/dist/types/audit.d.ts +11 -0
  207. package/docker/Dockerfile.claude-code +2 -2
  208. package/docker/entrypoint-claude-code.sh +15 -5
  209. package/package.json +3 -2
  210. package/src/config/constitution-user-base.md +15 -0
  211. package/src/config/generated/test-scenarios.json +1 -1
  212. package/src/config/generated/tool-annotations.json +10617 -296
  213. package/src/config/mcp-servers.json +23 -0
  214. package/dist/pipeline/mcp-connections.d.ts +0 -16
  215. package/dist/pipeline/mcp-connections.js +0 -61
  216. package/dist/pipeline/mcp-connections.js.map +0 -1
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Ephemeral approval whitelist -- session-scoped in-memory store
3
+ * of approval patterns extracted from user-approved escalations.
4
+ *
5
+ * Security invariant: only converts escalate -> allow, never overrides deny.
6
+ * Entries are never persisted to disk.
7
+ */
8
+ import { dirname } from 'node:path';
9
+ import { v4 as uuidv4 } from 'uuid';
10
+ import { resolveRealPath, getRoleDefinition, isWithinDirectory } from '../types/argument-roles.js';
11
+ import { extractDomainForRole } from './domain-utils.js';
12
+ import { extractAnnotatedPaths, collectDistinctRoles } from './policy-engine.js';
13
+ /** Default whitelist options: select the first (and currently only) candidate. */
14
+ export const DEFAULT_WHITELIST_OPTIONS = { whitelistSelection: 0 };
15
+ // ---------------------------------------------------------------------------
16
+ // History-rewriting roles excluded from directory generalization
17
+ // ---------------------------------------------------------------------------
18
+ const HISTORY_REWRITING_ROLES = new Set(['write-history', 'delete-history']);
19
+ // ---------------------------------------------------------------------------
20
+ // Constraint matching
21
+ // ---------------------------------------------------------------------------
22
+ /**
23
+ * Checks whether a single constraint is satisfied by the tool call's arguments.
24
+ */
25
+ function constraintMatches(constraint, args, annotation) {
26
+ // Find all argument values for the constraint's role
27
+ const values = extractAnnotatedPaths(args, annotation, [constraint.role]);
28
+ if (values.length === 0)
29
+ return false;
30
+ switch (constraint.kind) {
31
+ case 'directory':
32
+ return values.every((v) => {
33
+ try {
34
+ return isWithinDirectory(v, constraint.directory);
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ });
40
+ case 'domain': {
41
+ const roleDef = getRoleDefinition(constraint.role);
42
+ return values.every((v) => {
43
+ try {
44
+ const normalized = roleDef.canonicalize(v);
45
+ const domain = extractDomainForRole(normalized, constraint.role);
46
+ return domain.toLowerCase() === constraint.domain.toLowerCase();
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ });
52
+ }
53
+ case 'exact':
54
+ return values.every((v) => v.toLowerCase() === constraint.value.toLowerCase());
55
+ }
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // Pattern extraction
59
+ // ---------------------------------------------------------------------------
60
+ /**
61
+ * Extracts whitelist candidate patterns from an escalated tool call.
62
+ *
63
+ * Only generates constraints for the role(s) that caused the escalation,
64
+ * as identified by `escalatedRoles` on the EvaluationResult.
65
+ *
66
+ * Falls back to all resource-identifier roles when `escalatedRoles` is
67
+ * undefined (defensive robustness for future structural escalation paths).
68
+ *
69
+ * Returns both:
70
+ * - WhitelistPattern[] (full patterns, stored in proxy memory -- without id, added on whitelist.add())
71
+ * - WhitelistCandidateIpc[] (descriptions, serialized into IPC file)
72
+ */
73
+ export function extractWhitelistCandidates(serverName, toolName, args, annotation, escalatedRoles, escalationId, escalationReason) {
74
+ // Determine which roles to extract constraints for
75
+ const rolesToExtract = escalatedRoles ?? collectDistinctRoles(annotation);
76
+ const constraints = buildConstraints(rolesToExtract, args, annotation);
77
+ const description = buildDescription(serverName, toolName, constraints);
78
+ const warning = buildWarning(constraints);
79
+ const pattern = {
80
+ serverName,
81
+ toolName,
82
+ constraints,
83
+ createdAt: new Date().toISOString(),
84
+ sourceEscalationId: escalationId,
85
+ originalReason: escalationReason,
86
+ description,
87
+ };
88
+ const ipc = {
89
+ description,
90
+ ...(warning ? { warning } : {}),
91
+ };
92
+ // Phase 1: returns a single candidate pattern. The array-based return type and
93
+ // whitelistSelection index in the IPC protocol are designed to support future
94
+ // multi-candidate expansion (e.g., "allow this directory" vs "allow this exact file").
95
+ return { patterns: [pattern], ipcs: [ipc] };
96
+ }
97
+ /**
98
+ * Builds constraints from escalated roles and argument values.
99
+ */
100
+ function buildConstraints(roles, args, annotation) {
101
+ const constraints = [];
102
+ const seen = new Set();
103
+ for (const role of roles) {
104
+ const roleDef = getRoleDefinition(role);
105
+ const values = extractAnnotatedPaths(args, annotation, [role]);
106
+ for (const value of values) {
107
+ const constraint = buildConstraintForRole(role, roleDef.category, value);
108
+ if (!constraint)
109
+ continue;
110
+ // Deduplicate constraints with identical kind/role/value
111
+ const key = constraintKey(constraint);
112
+ if (seen.has(key))
113
+ continue;
114
+ seen.add(key);
115
+ constraints.push(constraint);
116
+ }
117
+ }
118
+ return constraints;
119
+ }
120
+ /** Returns a stable string key for deduplication. */
121
+ function constraintKey(c) {
122
+ switch (c.kind) {
123
+ case 'directory':
124
+ return `dir:${c.role}:${c.directory}`;
125
+ case 'domain':
126
+ return `dom:${c.role}:${c.domain}`;
127
+ case 'exact':
128
+ return `exact:${c.role}:${c.value}`;
129
+ }
130
+ }
131
+ /**
132
+ * Builds a single constraint for a role and value, applying the
133
+ * appropriate generalization for the role's category.
134
+ */
135
+ function buildConstraintForRole(role, category, value) {
136
+ switch (category) {
137
+ case 'path': {
138
+ // History-rewriting roles are excluded from directory generalization
139
+ if (HISTORY_REWRITING_ROLES.has(role))
140
+ return undefined;
141
+ try {
142
+ // Note: resolveRealPath uses realpath for existing paths and path.resolve
143
+ // for non-existent ones. If a file is created after whitelisting, the resolved
144
+ // real path at match time may differ (e.g., through new symlinks). This is
145
+ // acceptable for phase 1 -- the constraint still provides meaningful scoping.
146
+ const resolvedPath = resolveRealPath(value);
147
+ const dir = dirname(resolvedPath);
148
+ return { kind: 'directory', role, directory: dir };
149
+ }
150
+ catch {
151
+ return undefined;
152
+ }
153
+ }
154
+ case 'url': {
155
+ try {
156
+ const roleDef = getRoleDefinition(role);
157
+ const normalized = roleDef.canonicalize(value);
158
+ const domain = extractDomainForRole(normalized, role);
159
+ return { kind: 'domain', role, domain };
160
+ }
161
+ catch {
162
+ return undefined;
163
+ }
164
+ }
165
+ case 'identifier':
166
+ return { kind: 'exact', role, value: value.toLowerCase() };
167
+ default:
168
+ return undefined;
169
+ }
170
+ }
171
+ /**
172
+ * Builds a human-readable description from constraints.
173
+ */
174
+ function buildDescription(serverName, toolName, constraints) {
175
+ if (constraints.length === 0) {
176
+ return `Allow ${serverName}/${toolName} (exact tool match only)`;
177
+ }
178
+ const parts = constraints.map((c) => {
179
+ switch (c.kind) {
180
+ case 'directory':
181
+ return `${c.role} within ${c.directory}`;
182
+ case 'domain':
183
+ return `${c.role} domain ${c.domain}`;
184
+ case 'exact':
185
+ return `${c.role}=${c.value}`;
186
+ }
187
+ });
188
+ return `Allow ${serverName}/${toolName} ${parts.join(', ')}`;
189
+ }
190
+ /**
191
+ * Generates a warning for zero-constraint tools.
192
+ */
193
+ function buildWarning(constraints) {
194
+ if (constraints.length === 0) {
195
+ return 'Whitelisting will auto-approve ALL future calls to this tool for this session.';
196
+ }
197
+ return undefined;
198
+ }
199
+ // ---------------------------------------------------------------------------
200
+ // Factory
201
+ // ---------------------------------------------------------------------------
202
+ /**
203
+ * Creates an in-memory approval whitelist.
204
+ */
205
+ export function createApprovalWhitelist() {
206
+ const patterns = [];
207
+ return {
208
+ add(patternData) {
209
+ const id = uuidv4();
210
+ const pattern = { ...patternData, id };
211
+ patterns.push(pattern);
212
+ return id;
213
+ },
214
+ match(serverName, toolName, resolvedArgs, annotation) {
215
+ for (const pattern of patterns) {
216
+ if (pattern.serverName !== serverName)
217
+ continue;
218
+ if (pattern.toolName !== toolName)
219
+ continue;
220
+ // All constraints must match (AND semantics)
221
+ const allMatch = pattern.constraints.length === 0 ||
222
+ pattern.constraints.every((c) => constraintMatches(c, resolvedArgs, annotation));
223
+ if (allMatch) {
224
+ return { matched: true, patternId: pattern.id, pattern };
225
+ }
226
+ }
227
+ return { matched: false };
228
+ },
229
+ entries() {
230
+ return patterns;
231
+ },
232
+ get size() {
233
+ return patterns.length;
234
+ },
235
+ };
236
+ }
237
+ //# sourceMappingURL=approval-whitelist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-whitelist.js","sourceRoot":"","sources":["../../src/trusted-process/approval-whitelist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Google Workspace credential file management.
3
+ *
4
+ * Writes credential files in the format expected by
5
+ * @alanse/mcp-server-google-workspace's auth.ts.
6
+ *
7
+ * SECURITY: The refresh_token field is intentionally omitted.
8
+ * This prevents the MCP server from independently refreshing tokens,
9
+ * which would cause refresh token rotation races in multi-session
10
+ * environments. IronCurtain's OAuthTokenProvider is the sole token
11
+ * authority.
12
+ *
13
+ * The file is written atomically (write to .tmp, rename) to prevent
14
+ * the MCP server from reading a partial file during a refresh cycle.
15
+ */
16
+ /** The filename the MCP server expects in its GWORKSPACE_CREDS_DIR. */
17
+ export declare const GWORKSPACE_CREDENTIAL_FILENAME = ".gworkspace-credentials.json";
18
+ /**
19
+ * Shape of the credential file read by the MCP server's auth.ts.
20
+ * Mirrors the subset of Google OAuth2 token response that the server needs.
21
+ */
22
+ export interface GWorkspaceCredentialFile {
23
+ readonly access_token: string;
24
+ readonly expiry_date: number;
25
+ readonly token_type: 'Bearer';
26
+ readonly scope: string;
27
+ }
28
+ /**
29
+ * Writes a Google Workspace credential file for the MCP server.
30
+ *
31
+ * Creates the directory if it does not exist. Writes atomically via
32
+ * a temporary file + rename to prevent the MCP server from reading
33
+ * a partial file. File permissions are set to 0o600 (owner-only).
34
+ *
35
+ * @param credsDir - Directory to write the credential file into
36
+ * @param accessToken - OAuth2 access token (short-lived)
37
+ * @param expiresAt - Token expiry timestamp in milliseconds since epoch
38
+ * @param scopes - OAuth2 scopes granted to this token
39
+ */
40
+ export declare function writeGWorkspaceCredentialFile(credsDir: string, accessToken: string, expiresAt: number, scopes: readonly string[]): void;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Google Workspace credential file management.
3
+ *
4
+ * Writes credential files in the format expected by
5
+ * @alanse/mcp-server-google-workspace's auth.ts.
6
+ *
7
+ * SECURITY: The refresh_token field is intentionally omitted.
8
+ * This prevents the MCP server from independently refreshing tokens,
9
+ * which would cause refresh token rotation races in multi-session
10
+ * environments. IronCurtain's OAuthTokenProvider is the sole token
11
+ * authority.
12
+ *
13
+ * The file is written atomically (write to .tmp, rename) to prevent
14
+ * the MCP server from reading a partial file during a refresh cycle.
15
+ */
16
+ import { mkdirSync, renameSync, writeFileSync } from 'node:fs';
17
+ import { join } from 'node:path';
18
+ /** The filename the MCP server expects in its GWORKSPACE_CREDS_DIR. */
19
+ export const GWORKSPACE_CREDENTIAL_FILENAME = '.gworkspace-credentials.json';
20
+ /**
21
+ * Writes a Google Workspace credential file for the MCP server.
22
+ *
23
+ * Creates the directory if it does not exist. Writes atomically via
24
+ * a temporary file + rename to prevent the MCP server from reading
25
+ * a partial file. File permissions are set to 0o600 (owner-only).
26
+ *
27
+ * @param credsDir - Directory to write the credential file into
28
+ * @param accessToken - OAuth2 access token (short-lived)
29
+ * @param expiresAt - Token expiry timestamp in milliseconds since epoch
30
+ * @param scopes - OAuth2 scopes granted to this token
31
+ */
32
+ export function writeGWorkspaceCredentialFile(credsDir, accessToken, expiresAt, scopes) {
33
+ mkdirSync(credsDir, { recursive: true });
34
+ const credential = {
35
+ access_token: accessToken,
36
+ expiry_date: expiresAt,
37
+ token_type: 'Bearer',
38
+ scope: scopes.join(' '),
39
+ };
40
+ const filePath = join(credsDir, GWORKSPACE_CREDENTIAL_FILENAME);
41
+ const tmpPath = filePath + '.tmp';
42
+ writeFileSync(tmpPath, JSON.stringify(credential, null, 2), { mode: 0o600 });
43
+ renameSync(tmpPath, filePath);
44
+ }
45
+ //# sourceMappingURL=gworkspace-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gworkspace-credentials.js","sourceRoot":"","sources":["../../src/trusted-process/gworkspace-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,uEAAuE;AACvE,MAAM,CAAC,MAAM,8BAA8B,GAAG,8BAA8B,CAAC;AAe7E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,6BAA6B,CAC3C,QAAgB,EAChB,WAAmB,EACnB,SAAiB,EACjB,MAAyB;IAEzB,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,MAAM,UAAU,GAA6B;QAC3C,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,SAAS;QACtB,UAAU,EAAE,QAAQ;QACpB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;KACxB,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,8BAA8B,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAElC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC"}
@@ -1,6 +1,15 @@
1
1
  import type { IronCurtainConfig } from '../config/types.js';
2
2
  import type { ToolCallRequest, ToolCallResult } from '../types/mcp.js';
3
- export type EscalationPromptFn = (request: ToolCallRequest, reason: string, context?: Readonly<Record<string, string>>) => Promise<'approved' | 'denied'>;
3
+ import { type WhitelistCandidateIpc } from './approval-whitelist.js';
4
+ /** Result from an escalation callback, optionally including whitelist selection. */
5
+ export interface EscalationResult {
6
+ readonly decision: 'approved' | 'denied';
7
+ /** Index into whitelistCandidates to whitelist. Absent = no whitelisting. */
8
+ readonly whitelistSelection?: number;
9
+ }
10
+ export type EscalationPromptFn = (request: ToolCallRequest, reason: string, context?: Readonly<Record<string, string>>,
11
+ /** Whitelist candidates for display to the user. */
12
+ whitelistCandidates?: readonly WhitelistCandidateIpc[]) => Promise<EscalationResult>;
4
13
  export interface TrustedProcessOptions {
5
14
  onEscalation?: EscalationPromptFn;
6
15
  }
@@ -12,6 +21,7 @@ export declare class TrustedProcess {
12
21
  private auditLog;
13
22
  private escalation;
14
23
  private onEscalation?;
24
+ private readonly whitelist;
15
25
  private autoApproveModel;
16
26
  private lastUserMessage;
17
27
  private serverContextMap;
@@ -13,6 +13,7 @@ import { extractMcpErrorMessage } from './mcp-error-utils.js';
13
13
  import { extractTextFromContent, buildAuditEntry } from './mcp-proxy-server.js';
14
14
  import { updateServerContext, formatServerContext } from './server-context.js';
15
15
  import { buildTrustedServerSet } from '../memory/memory-annotations.js';
16
+ import { createApprovalWhitelist, extractWhitelistCandidates, } from './approval-whitelist.js';
16
17
  /**
17
18
  * Detects Docker-style `-e VAR_NAME` args (no `=`) where the env var is unset.
18
19
  */
@@ -37,6 +38,7 @@ export class TrustedProcess {
37
38
  auditLog;
38
39
  escalation;
39
40
  onEscalation;
41
+ whitelist;
40
42
  autoApproveModel = null;
41
43
  lastUserMessage = null;
42
44
  serverContextMap = new Map();
@@ -59,6 +61,7 @@ export class TrustedProcess {
59
61
  });
60
62
  this.escalation = new EscalationHandler();
61
63
  this.onEscalation = options?.onEscalation;
64
+ this.whitelist = createApprovalWhitelist();
62
65
  }
63
66
  /**
64
67
  * Sets the most recent user message for auto-approval context.
@@ -150,39 +153,67 @@ export class TrustedProcess {
150
153
  };
151
154
  let escalationResult;
152
155
  let autoApproved = false;
156
+ let whitelistApproved = false;
157
+ let whitelistPatternId;
153
158
  let resultContent;
154
159
  let resultStatus;
155
160
  let resultError;
156
161
  try {
157
- // Step 2: Handle escalation -- try auto-approve first, then human
162
+ // Step 2: Handle escalation -- whitelist check, auto-approve, then human
158
163
  if (evaluation.decision === 'escalate') {
159
- // Try auto-approve before prompting the human
160
- if (this.autoApproveModel && this.lastUserMessage) {
161
- const autoResult = await autoApprove({
162
- userMessage: this.lastUserMessage,
163
- toolName: `${request.serverName}/${request.toolName}`,
164
- escalationReason: evaluation.reason,
165
- }, this.autoApproveModel);
166
- if (autoResult.decision === 'approve') {
167
- autoApproved = true;
168
- escalationResult = 'approved';
169
- policyDecision.status = 'allow';
170
- policyDecision.reason = `Auto-approved: ${autoResult.reasoning}`;
171
- }
164
+ // Annotation is guaranteed non-null here: trusted servers always allow (never escalate),
165
+ // and missing-annotation returns early above. Narrow the type for TypeScript.
166
+ const resolvedAnnotation = annotation;
167
+ const whitelistMatch = this.whitelist.match(request.serverName, request.toolName, argsForPolicy, resolvedAnnotation);
168
+ if (whitelistMatch.matched) {
169
+ whitelistApproved = true;
170
+ whitelistPatternId = whitelistMatch.patternId;
171
+ escalationResult = 'approved';
172
+ policyDecision.status = 'allow';
173
+ policyDecision.reason = `Whitelist-approved: ${whitelistMatch.pattern.description}`;
172
174
  }
173
- // Fall through to human escalation if not auto-approved
174
- if (!autoApproved) {
175
- const escalationContext = formatServerContext(this.serverContextMap, transportRequest.serverName);
176
- escalationResult = this.onEscalation
177
- ? await this.onEscalation(transportRequest, evaluation.reason, escalationContext)
178
- : await this.escalation.prompt(transportRequest, evaluation.reason, escalationContext);
179
- if (escalationResult === 'approved') {
180
- policyDecision.status = 'allow';
181
- policyDecision.reason = 'Approved by human during escalation';
175
+ if (!whitelistApproved) {
176
+ // Try auto-approve before prompting the human
177
+ if (this.autoApproveModel && this.lastUserMessage) {
178
+ const autoResult = await autoApprove({
179
+ userMessage: this.lastUserMessage,
180
+ toolName: `${request.serverName}/${request.toolName}`,
181
+ escalationReason: evaluation.reason,
182
+ }, this.autoApproveModel);
183
+ if (autoResult.decision === 'approve') {
184
+ autoApproved = true;
185
+ escalationResult = 'approved';
186
+ policyDecision.status = 'allow';
187
+ policyDecision.reason = `Auto-approved: ${autoResult.reasoning}`;
188
+ }
182
189
  }
183
- else {
184
- policyDecision.status = 'deny';
185
- policyDecision.reason = 'Denied by human during escalation';
190
+ // Fall through to human escalation if not auto-approved
191
+ if (!autoApproved) {
192
+ // Extract whitelist candidates for display
193
+ const escalationId = `inprocess-${Date.now()}`;
194
+ const candidates = extractWhitelistCandidates(request.serverName, request.toolName, argsForPolicy, resolvedAnnotation, evaluation.escalatedRoles, escalationId, evaluation.reason);
195
+ const candidatePatterns = candidates.patterns;
196
+ const candidateIpcs = candidates.ipcs.length > 0 ? candidates.ipcs : undefined;
197
+ const escalationContext = formatServerContext(this.serverContextMap, transportRequest.serverName);
198
+ const escalationResponse = this.onEscalation
199
+ ? await this.onEscalation(transportRequest, evaluation.reason, escalationContext, candidateIpcs)
200
+ : { decision: await this.escalation.prompt(transportRequest, evaluation.reason, escalationContext) };
201
+ escalationResult = escalationResponse.decision;
202
+ if (escalationResponse.decision === 'approved') {
203
+ policyDecision.status = 'allow';
204
+ policyDecision.reason = 'Approved by human during escalation';
205
+ // Handle whitelist selection
206
+ if (escalationResponse.whitelistSelection !== undefined &&
207
+ escalationResponse.whitelistSelection >= 0 &&
208
+ escalationResponse.whitelistSelection < candidatePatterns.length) {
209
+ const selectedPattern = candidatePatterns[escalationResponse.whitelistSelection];
210
+ this.whitelist.add(selectedPattern);
211
+ }
212
+ }
213
+ else {
214
+ policyDecision.status = 'deny';
215
+ policyDecision.reason = 'Denied by human during escalation';
216
+ }
186
217
  }
187
218
  }
188
219
  // Expand roots to include target directories so the filesystem
@@ -227,7 +258,12 @@ export class TrustedProcess {
227
258
  status: resultStatus,
228
259
  content: resultStatus === 'success' ? resultContent : undefined,
229
260
  error: resultError,
230
- }, durationMs, { escalationResult, autoApproved: autoApproved || undefined }));
261
+ }, durationMs, {
262
+ escalationResult,
263
+ autoApproved: autoApproved || undefined,
264
+ whitelistApproved: whitelistApproved || undefined,
265
+ whitelistPatternId,
266
+ }));
231
267
  // Step 5: Return result to caller
232
268
  return {
233
269
  requestId: transportRequest.requestId,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trusted-process/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/trusted-process/index.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,8 @@ import { type UserContext } from './auto-approver.js';
38
38
  import { type ServerContextMap } from './server-context.js';
39
39
  import type { LanguageModelV3 } from '@ai-sdk/provider';
40
40
  import type { MCPServerConfig, SandboxAvailabilityPolicy } from '../config/types.js';
41
+ import { type ApprovalWhitelist } from './approval-whitelist.js';
42
+ import { type ControlApiClient } from '../docker/proxy-tools.js';
41
43
  export interface ProxiedTool {
42
44
  serverName: string;
43
45
  name: string;
@@ -113,6 +115,10 @@ export interface CallToolDeps {
113
115
  escalationDir: string | undefined;
114
116
  autoApproveModel: LanguageModelV3 | null;
115
117
  serverContextMap: ServerContextMap;
118
+ /** Ephemeral approval whitelist for this session. */
119
+ whitelist: ApprovalWhitelist;
120
+ /** Control API client for virtual proxy tools. Only set in virtual-only mode. */
121
+ controlApiClient?: ControlApiClient | null;
116
122
  }
117
123
  /**
118
124
  * Reads and validates proxy environment variables.
@@ -135,6 +141,12 @@ export declare function resolveServerSandboxConfigs(serversConfig: Record<string
135
141
  settingsDir: string;
136
142
  serverCwdPaths: Map<string, string>;
137
143
  };
144
+ /**
145
+ * Validates that all argument keys exist in the tool's inputSchema.
146
+ * Returns null if valid, or an error message listing unknown and valid keys.
147
+ * Skips validation when the schema has no properties or allows additional properties.
148
+ */
149
+ export declare function validateToolArguments(args: Record<string, unknown>, inputSchema: Record<string, unknown>): string | null;
138
150
  /** Builds a lookup map from tool name to ProxiedTool for routing. */
139
151
  export declare function buildToolMap(allTools: ProxiedTool[]): Map<string, ProxiedTool>;
140
152
  /**
@@ -145,6 +157,8 @@ export declare function buildAuditEntry(request: ToolCallRequest, argsForTranspo
145
157
  escalationResult?: 'approved' | 'denied';
146
158
  sandboxed?: boolean;
147
159
  autoApproved?: boolean;
160
+ whitelistApproved?: boolean;
161
+ whitelistPatternId?: string;
148
162
  }): AuditEntry;
149
163
  /**
150
164
  * Handles a single tool call request: policy evaluation, escalation,