@provos/ironcurtain 0.4.1 → 0.5.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 (146) hide show
  1. package/README.md +219 -248
  2. package/dist/cli.js +10 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/config-command.js +144 -6
  5. package/dist/config/config-command.js.map +1 -1
  6. package/dist/config/constitution-user-base.md +2 -0
  7. package/dist/config/first-start.js +77 -12
  8. package/dist/config/first-start.js.map +1 -1
  9. package/dist/config/generated/compiled-policy.json +199 -72
  10. package/dist/config/generated/tool-annotations.json +1018 -36
  11. package/dist/config/mcp-servers.json +10 -0
  12. package/dist/config/paths.d.ts +31 -0
  13. package/dist/config/paths.js +52 -2
  14. package/dist/config/paths.js.map +1 -1
  15. package/dist/config/types.d.ts +8 -0
  16. package/dist/config/user-config.d.ts +21 -3
  17. package/dist/config/user-config.js +34 -3
  18. package/dist/config/user-config.js.map +1 -1
  19. package/dist/docker/adapters/claude-code.js +104 -23
  20. package/dist/docker/adapters/claude-code.js.map +1 -1
  21. package/dist/docker/agent-adapter.d.ts +24 -1
  22. package/dist/docker/agent-adapter.js +6 -1
  23. package/dist/docker/agent-adapter.js.map +1 -1
  24. package/dist/docker/docker-agent-session.d.ts +16 -9
  25. package/dist/docker/docker-agent-session.js +64 -90
  26. package/dist/docker/docker-agent-session.js.map +1 -1
  27. package/dist/docker/docker-infrastructure.d.ts +51 -0
  28. package/dist/docker/docker-infrastructure.js +261 -0
  29. package/dist/docker/docker-infrastructure.js.map +1 -0
  30. package/dist/docker/docker-manager.js +3 -0
  31. package/dist/docker/docker-manager.js.map +1 -1
  32. package/dist/docker/mitm-proxy.js +4 -0
  33. package/dist/docker/mitm-proxy.js.map +1 -1
  34. package/dist/docker/oauth-credentials.d.ts +81 -0
  35. package/dist/docker/oauth-credentials.js +178 -0
  36. package/dist/docker/oauth-credentials.js.map +1 -0
  37. package/dist/docker/orientation.d.ts +1 -1
  38. package/dist/docker/orientation.js +3 -2
  39. package/dist/docker/orientation.js.map +1 -1
  40. package/dist/docker/provider-config.d.ts +3 -0
  41. package/dist/docker/provider-config.js +28 -0
  42. package/dist/docker/provider-config.js.map +1 -1
  43. package/dist/docker/pty-session.d.ts +27 -0
  44. package/dist/docker/pty-session.js +510 -0
  45. package/dist/docker/pty-session.js.map +1 -0
  46. package/dist/docker/pty-types.d.ts +24 -0
  47. package/dist/docker/pty-types.js +12 -0
  48. package/dist/docker/pty-types.js.map +1 -0
  49. package/dist/docker/types.d.ts +6 -0
  50. package/dist/escalation/escalation-watcher.d.ts +44 -0
  51. package/dist/escalation/escalation-watcher.js +92 -0
  52. package/dist/escalation/escalation-watcher.js.map +1 -0
  53. package/dist/escalation/listener-command.d.ts +10 -0
  54. package/dist/escalation/listener-command.js +407 -0
  55. package/dist/escalation/listener-command.js.map +1 -0
  56. package/dist/escalation/listener-state.d.ts +49 -0
  57. package/dist/escalation/listener-state.js +104 -0
  58. package/dist/escalation/listener-state.js.map +1 -0
  59. package/dist/escalation/session-registry.d.ts +17 -0
  60. package/dist/escalation/session-registry.js +98 -0
  61. package/dist/escalation/session-registry.js.map +1 -0
  62. package/dist/index.js +15 -0
  63. package/dist/index.js.map +1 -1
  64. package/dist/logger.js +2 -3
  65. package/dist/logger.js.map +1 -1
  66. package/dist/pipeline/annotate.js +35 -15
  67. package/dist/pipeline/annotate.js.map +1 -1
  68. package/dist/pipeline/constitution-customizer.d.ts +2 -1
  69. package/dist/pipeline/constitution-customizer.js +36 -3
  70. package/dist/pipeline/constitution-customizer.js.map +1 -1
  71. package/dist/pipeline/github-identity.d.ts +38 -0
  72. package/dist/pipeline/github-identity.js +64 -0
  73. package/dist/pipeline/github-identity.js.map +1 -0
  74. package/dist/pipeline/handwritten-scenarios.js +34 -0
  75. package/dist/pipeline/handwritten-scenarios.js.map +1 -1
  76. package/dist/sandbox/index.js +14 -3
  77. package/dist/sandbox/index.js.map +1 -1
  78. package/dist/servers/fetch-server.js +2 -2
  79. package/dist/session/base-transport.d.ts +19 -0
  80. package/dist/session/base-transport.js +36 -0
  81. package/dist/session/base-transport.js.map +1 -0
  82. package/dist/session/cli-transport.d.ts +3 -3
  83. package/dist/session/cli-transport.js +7 -4
  84. package/dist/session/cli-transport.js.map +1 -1
  85. package/dist/session/index.js +24 -78
  86. package/dist/session/index.js.map +1 -1
  87. package/dist/session/interaction-log.d.ts +13 -0
  88. package/dist/session/interaction-log.js +28 -0
  89. package/dist/session/interaction-log.js.map +1 -0
  90. package/dist/session/preflight.d.ts +3 -0
  91. package/dist/session/preflight.js +39 -18
  92. package/dist/session/preflight.js.map +1 -1
  93. package/dist/session/types.d.ts +2 -0
  94. package/dist/signal/bot-command.js +5 -0
  95. package/dist/signal/bot-command.js.map +1 -1
  96. package/dist/signal/format.d.ts +21 -1
  97. package/dist/signal/format.js +41 -3
  98. package/dist/signal/format.js.map +1 -1
  99. package/dist/signal/signal-bot-daemon.d.ts +53 -18
  100. package/dist/signal/signal-bot-daemon.js +344 -106
  101. package/dist/signal/signal-bot-daemon.js.map +1 -1
  102. package/dist/signal/signal-config.d.ts +4 -0
  103. package/dist/signal/signal-config.js +2 -0
  104. package/dist/signal/signal-config.js.map +1 -1
  105. package/dist/signal/signal-transport.d.ts +13 -7
  106. package/dist/signal/signal-transport.js +36 -12
  107. package/dist/signal/signal-transport.js.map +1 -1
  108. package/dist/trusted-process/audit-log.d.ts +6 -1
  109. package/dist/trusted-process/audit-log.js +22 -2
  110. package/dist/trusted-process/audit-log.js.map +1 -1
  111. package/dist/trusted-process/audit-redactor.d.ts +25 -0
  112. package/dist/trusted-process/audit-redactor.js +121 -0
  113. package/dist/trusted-process/audit-redactor.js.map +1 -0
  114. package/dist/trusted-process/escalation.d.ts +1 -1
  115. package/dist/trusted-process/escalation.js +6 -1
  116. package/dist/trusted-process/escalation.js.map +1 -1
  117. package/dist/trusted-process/index.d.ts +2 -1
  118. package/dist/trusted-process/index.js +47 -6
  119. package/dist/trusted-process/index.js.map +1 -1
  120. package/dist/trusted-process/mcp-client-manager.js +14 -2
  121. package/dist/trusted-process/mcp-client-manager.js.map +1 -1
  122. package/dist/trusted-process/mcp-error-utils.d.ts +11 -0
  123. package/dist/trusted-process/mcp-error-utils.js +50 -0
  124. package/dist/trusted-process/mcp-error-utils.js.map +1 -0
  125. package/dist/trusted-process/mcp-proxy-server.d.ts +4 -2
  126. package/dist/trusted-process/mcp-proxy-server.js +56 -13
  127. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  128. package/dist/trusted-process/path-utils.d.ts +15 -0
  129. package/dist/trusted-process/path-utils.js +38 -0
  130. package/dist/trusted-process/path-utils.js.map +1 -1
  131. package/dist/trusted-process/sandbox-integration.d.ts +5 -0
  132. package/dist/trusted-process/sandbox-integration.js +1 -1
  133. package/dist/trusted-process/sandbox-integration.js.map +1 -1
  134. package/dist/trusted-process/server-context.d.ts +21 -0
  135. package/dist/trusted-process/server-context.js +42 -0
  136. package/dist/trusted-process/server-context.js.map +1 -0
  137. package/dist/types/argument-roles.d.ts +5 -2
  138. package/dist/types/argument-roles.js +25 -2
  139. package/dist/types/argument-roles.js.map +1 -1
  140. package/docker/Dockerfile.claude-code +8 -3
  141. package/docker/entrypoint-claude-code.sh +64 -4
  142. package/package.json +16 -8
  143. package/src/config/constitution-user-base.md +2 -0
  144. package/src/config/generated/compiled-policy.json +199 -72
  145. package/src/config/generated/tool-annotations.json +1018 -36
  146. package/src/config/mcp-servers.json +10 -0
@@ -0,0 +1,178 @@
1
+ /**
2
+ * OAuth credential detection for Docker agent sessions.
3
+ *
4
+ * Detects whether the host user has OAuth credentials from Claude Code
5
+ * and provides them for the fake-key-swap pattern. Real credentials
6
+ * never enter the container -- the MITM proxy swaps fake tokens for
7
+ * real ones on the host side.
8
+ *
9
+ * Detection order (prefer OAuth):
10
+ * 1. ~/.claude/.credentials.json (claudeAiOauth)
11
+ * 2. macOS Keychain (if credentials file missing)
12
+ * 3. Fall back to API key from config
13
+ */
14
+ import { existsSync, readFileSync } from 'node:fs';
15
+ import { homedir, platform, userInfo } from 'node:os';
16
+ import { resolve } from 'node:path';
17
+ import { execFileSync } from 'node:child_process';
18
+ import * as logger from '../logger.js';
19
+ /** Minimum remaining token lifetime (5 minutes) to consider a token usable. */
20
+ const TOKEN_EXPIRY_BUFFER_MS = 5 * 60 * 1000;
21
+ /** Service names used by Claude Code in macOS Keychain. */
22
+ const KEYCHAIN_SERVICE_NAMES = ['Claude Code-credentials', 'Claude Code'];
23
+ /**
24
+ * Returns the path to Claude Code's credentials file.
25
+ * Exposed for testing.
26
+ */
27
+ export function getCredentialsFilePath() {
28
+ return resolve(homedir(), '.claude', '.credentials.json');
29
+ }
30
+ /**
31
+ * Checks whether an OAuth token is expired or too close to expiry.
32
+ * Returns true if the token has fewer than 5 minutes of validity remaining.
33
+ */
34
+ export function isTokenExpired(credentials) {
35
+ return Date.now() + TOKEN_EXPIRY_BUFFER_MS >= credentials.expiresAt;
36
+ }
37
+ /**
38
+ * Loads OAuth credentials from ~/.claude/.credentials.json.
39
+ * Returns null if the file is missing, unreadable, or lacks valid credentials.
40
+ */
41
+ export function loadOAuthCredentials() {
42
+ const credPath = getCredentialsFilePath();
43
+ return loadCredentialsFromFile(credPath);
44
+ }
45
+ /**
46
+ * Parses credentials from a file path. Extracted for testability.
47
+ */
48
+ export function loadCredentialsFromFile(filePath) {
49
+ if (!existsSync(filePath))
50
+ return null;
51
+ try {
52
+ const raw = readFileSync(filePath, 'utf-8');
53
+ return parseCredentialsJson(raw);
54
+ }
55
+ catch {
56
+ logger.warn(`Failed to read OAuth credentials from ${filePath}`);
57
+ return null;
58
+ }
59
+ }
60
+ /**
61
+ * Parses the claudeAiOauth section from a credentials JSON string.
62
+ * Returns null if parsing fails or required fields are missing.
63
+ */
64
+ export function parseCredentialsJson(json) {
65
+ try {
66
+ const parsed = JSON.parse(json);
67
+ if (typeof parsed !== 'object' || parsed === null)
68
+ return null;
69
+ const obj = parsed;
70
+ const oauth = obj.claudeAiOauth;
71
+ if (typeof oauth !== 'object' || oauth === null)
72
+ return null;
73
+ const creds = oauth;
74
+ if (typeof creds.accessToken !== 'string' || !creds.accessToken)
75
+ return null;
76
+ if (typeof creds.refreshToken !== 'string' || !creds.refreshToken)
77
+ return null;
78
+ if (typeof creds.expiresAt !== 'number' || !Number.isFinite(creds.expiresAt) || creds.expiresAt <= 0)
79
+ return null;
80
+ return {
81
+ accessToken: creds.accessToken,
82
+ refreshToken: creds.refreshToken,
83
+ expiresAt: creds.expiresAt,
84
+ };
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ /**
91
+ * Attempts to extract OAuth credentials from the macOS Keychain.
92
+ * Returns null on non-macOS platforms, Keychain access failure, or
93
+ * when no valid credentials are found.
94
+ *
95
+ * Tries both service names because Claude Code has a known bug where
96
+ * the write and read service names differ.
97
+ */
98
+ export function extractFromKeychain() {
99
+ if (platform() !== 'darwin')
100
+ return null;
101
+ const account = userInfo().username;
102
+ for (const service of KEYCHAIN_SERVICE_NAMES) {
103
+ try {
104
+ const result = execFileSync('security', ['find-generic-password', '-s', service, '-a', account, '-w'], {
105
+ encoding: 'utf8',
106
+ stdio: ['pipe', 'pipe', 'pipe'],
107
+ timeout: 10_000,
108
+ });
109
+ const credentials = parseCredentialsJson(result.trim());
110
+ if (credentials) {
111
+ logger.info(`Found OAuth credentials in macOS Keychain (service: "${service}")`);
112
+ return credentials;
113
+ }
114
+ }
115
+ catch {
116
+ // Not found or keychain locked -- try next service name
117
+ continue;
118
+ }
119
+ }
120
+ return null;
121
+ }
122
+ const defaultSources = {
123
+ loadFromFile: loadOAuthCredentials,
124
+ loadFromKeychain: extractFromKeychain,
125
+ };
126
+ /**
127
+ * Detects the best authentication method available on the host.
128
+ *
129
+ * Priority:
130
+ * 1. IRONCURTAIN_DOCKER_AUTH=apikey env var forces API key mode
131
+ * 2. OAuth credentials from ~/.claude/.credentials.json (if not expired)
132
+ * 3. OAuth credentials from macOS Keychain (if credentials file missing)
133
+ * 4. API key from config
134
+ * 5. None
135
+ *
136
+ * @param sources - Injectable credential loaders (for testing)
137
+ */
138
+ export function detectAuthMethod(config, sources) {
139
+ const { loadFromFile, loadFromKeychain } = sources ?? defaultSources;
140
+ // Allow explicit override to force API key mode
141
+ if (process.env.IRONCURTAIN_DOCKER_AUTH === 'apikey') {
142
+ logger.info('Docker auth override: forced API key mode via IRONCURTAIN_DOCKER_AUTH');
143
+ return resolveApiKeyAuth(config);
144
+ }
145
+ // Try OAuth from credentials file
146
+ const fileCreds = loadFromFile();
147
+ if (fileCreds) {
148
+ if (!isTokenExpired(fileCreds)) {
149
+ logger.info('Detected OAuth credentials from ~/.claude/.credentials.json');
150
+ return { kind: 'oauth', credentials: fileCreds };
151
+ }
152
+ logger.warn('OAuth token from credentials file is expired');
153
+ }
154
+ // Try macOS Keychain if credentials file was not found
155
+ if (!fileCreds) {
156
+ const keychainCreds = loadFromKeychain();
157
+ if (keychainCreds) {
158
+ if (!isTokenExpired(keychainCreds)) {
159
+ return { kind: 'oauth', credentials: keychainCreds };
160
+ }
161
+ logger.warn('OAuth token from macOS Keychain is expired');
162
+ }
163
+ }
164
+ // Fall back to API key
165
+ return resolveApiKeyAuth(config);
166
+ }
167
+ /**
168
+ * Resolves API key authentication from config.
169
+ */
170
+ function resolveApiKeyAuth(config) {
171
+ const key = config.userConfig.anthropicApiKey;
172
+ if (key) {
173
+ logger.info('Using API key authentication for Docker session');
174
+ return { kind: 'apikey', key };
175
+ }
176
+ return { kind: 'none' };
177
+ }
178
+ //# sourceMappingURL=oauth-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-credentials.js","sourceRoot":"","sources":["../../src/docker/oauth-credentials.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  * agent container. Written to the orientation directory which is
6
6
  * bind-mounted read-only into the container.
7
7
  */
8
- import type { AgentAdapter } from './agent-adapter.js';
8
+ import { type AgentAdapter } from './agent-adapter.js';
9
9
  import type { IronCurtainConfig } from '../config/types.js';
10
10
  import type { ServerListing } from '../session/prompts.js';
11
11
  /**
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import { mkdirSync, writeFileSync } from 'node:fs';
9
9
  import { resolve, dirname } from 'node:path';
10
+ import { CONTAINER_WORKSPACE_DIR, } from './agent-adapter.js';
10
11
  /**
11
12
  * Extracts allowed domains from MCP server configurations.
12
13
  * Used to inform the agent about which domains it can access via MCP tools.
@@ -34,7 +35,7 @@ function writeConfigFiles(baseDir, files) {
34
35
  for (const file of files) {
35
36
  const targetPath = resolve(baseDir, file.path);
36
37
  mkdirSync(dirname(targetPath), { recursive: true });
37
- writeFileSync(targetPath, file.content);
38
+ writeFileSync(targetPath, file.content, { mode: file.mode });
38
39
  }
39
40
  }
40
41
  /**
@@ -47,7 +48,7 @@ export function prepareSession(adapter, serverListings, sessionDir, config, host
47
48
  const orientationDir = resolve(sessionDir, 'orientation');
48
49
  mkdirSync(orientationDir, { recursive: true });
49
50
  const context = {
50
- workspaceDir: '/workspace',
51
+ workspaceDir: CONTAINER_WORKSPACE_DIR,
51
52
  hostSandboxDir,
52
53
  serverListings,
53
54
  allowedDomains: extractAllowedDomains(config),
@@ -1 +1 @@
1
- {"version":3,"file":"orientation.js","sourceRoot":"","sources":["../../src/docker/orientation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAK7C;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAyB;IAC7D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;QACrC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QACtD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAE,KAAwB;IACjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAqB,EACrB,cAA+B,EAC/B,UAAkB,EAClB,MAAyB,EACzB,cAAsB,EACtB,YAAqB;IAErB,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC1D,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAuB;QAClC,YAAY,EAAE,YAAY;QAC1B,cAAc;QACd,cAAc;QACd,cAAc,EAAE,qBAAqB,CAAC,MAAM,CAAC;QAC7C,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;KAC9C,CAAC;IAEF,qFAAqF;IACrF,MAAM,OAAO,GAAG,YAAY,IAAI,6BAA6B,CAAC;IAC9D,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5E,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxD,OAAO,EAAE,YAAY,EAAE,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"orientation.js","sourceRoot":"","sources":["../../src/docker/orientation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EACL,uBAAuB,GAIxB,MAAM,oBAAoB,CAAC;AAI5B;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAyB;IAC7D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;QACrC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,SAAS;QACtD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,OAAe,EAAE,KAAwB;IACjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAqB,EACrB,cAA+B,EAC/B,UAAkB,EAClB,MAAyB,EACzB,cAAsB,EACtB,YAAqB;IAErB,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC1D,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAuB;QAClC,YAAY,EAAE,uBAAuB;QACrC,cAAc;QACd,cAAc;QACd,cAAc,EAAE,qBAAqB,CAAC,MAAM,CAAC;QAC7C,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;KAC9C,CAAC;IAEF,qFAAqF;IACrF,MAAM,OAAO,GAAG,YAAY,IAAI,6BAA6B,CAAC;IAC9D,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5E,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxD,OAAO,EAAE,YAAY,EAAE,CAAC;AAC1B,CAAC"}
@@ -93,5 +93,8 @@ export declare function stripServerSideTools(body: Record<string, unknown>): Rew
93
93
  */
94
94
  export declare function shouldRewriteBody(config: ProviderConfig, method: string | undefined, path: string | undefined): boolean;
95
95
  export declare const anthropicProvider: ProviderConfig;
96
+ export declare const claudePlatformProvider: ProviderConfig;
96
97
  export declare const openaiProvider: ProviderConfig;
98
+ export declare const anthropicOAuthProvider: ProviderConfig;
99
+ export declare const claudePlatformOAuthProvider: ProviderConfig;
97
100
  export declare const googleProvider: ProviderConfig;
@@ -96,6 +96,7 @@ export const anthropicProvider = {
96
96
  { method: 'POST', path: '/v1/messages' },
97
97
  { method: 'POST', path: '/v1/messages/count_tokens' },
98
98
  // Claude Code internal endpoints
99
+ { method: 'GET', path: '/api/hello' },
99
100
  { method: 'GET', path: '/api/claude_code/settings' },
100
101
  { method: 'GET', path: '/api/claude_code/policy_limits' },
101
102
  { method: 'GET', path: '/api/claude_code/organizations/metrics_enabled' },
@@ -109,6 +110,13 @@ export const anthropicProvider = {
109
110
  requestRewriter: stripServerSideTools,
110
111
  rewriteEndpoints: ['/v1/messages'],
111
112
  };
113
+ export const claudePlatformProvider = {
114
+ host: 'platform.claude.com',
115
+ displayName: 'Claude Platform',
116
+ allowedEndpoints: [{ method: 'GET', path: '/v1/oauth/hello' }],
117
+ keyInjection: { type: 'header', headerName: 'x-api-key' },
118
+ fakeKeyPrefix: 'sk-ant-api03-ironcurtain-',
119
+ };
112
120
  export const openaiProvider = {
113
121
  host: 'api.openai.com',
114
122
  displayName: 'OpenAI',
@@ -119,6 +127,26 @@ export const openaiProvider = {
119
127
  keyInjection: { type: 'bearer' },
120
128
  fakeKeyPrefix: 'sk-ironcurtain-',
121
129
  };
130
+ export const anthropicOAuthProvider = {
131
+ host: 'api.anthropic.com',
132
+ displayName: 'Anthropic (OAuth)',
133
+ allowedEndpoints: [
134
+ ...anthropicProvider.allowedEndpoints,
135
+ // OAuth-only: usage data requires an OAuth session
136
+ { method: 'GET', path: '/api/oauth/usage' },
137
+ ],
138
+ keyInjection: { type: 'bearer' },
139
+ fakeKeyPrefix: 'sk-ant-oat01-ironcurtain-',
140
+ requestRewriter: stripServerSideTools,
141
+ rewriteEndpoints: ['/v1/messages'],
142
+ };
143
+ export const claudePlatformOAuthProvider = {
144
+ host: 'platform.claude.com',
145
+ displayName: 'Claude Platform (OAuth)',
146
+ allowedEndpoints: claudePlatformProvider.allowedEndpoints,
147
+ keyInjection: { type: 'bearer' },
148
+ fakeKeyPrefix: 'sk-ant-oat01-ironcurtain-',
149
+ };
122
150
  export const googleProvider = {
123
151
  host: 'generativelanguage.googleapis.com',
124
152
  displayName: 'Google',
@@ -1 +1 @@
1
- {"version":3,"file":"provider-config.js","sourceRoot":"","sources":["../../src/docker/provider-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-config.js","sourceRoot":"","sources":["../../src/docker/provider-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8EH;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAsB,EACtB,MAA0B,EAC1B,IAAwB;IAExB,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB;IAE3D,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;QACzC,IAAI,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,WAAW,EAAE;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,iEAAiE;YACjE,oDAAoD;YACpD,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI;iBACpB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;iBAC1D,IAAI,CAAC,OAAO,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC,CAAC;YAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,SAAS,KAAK,EAAE,CAAC,IAAI,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iCAAiC;AAEjC;;;;;;GAMG;AACH,SAAS,qBAAqB,CAAC,IAAa;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAChF,MAAM,EAAE,IAAI,EAAE,GAAG,IAA+B,CAAC;IACjD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAA6B;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAc,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,OAAO;QACL,QAAQ,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QAClC,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAsB,EACtB,MAA0B,EAC1B,IAAwB;IAExB,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,gBAAgB;QAAE,OAAO,KAAK,CAAC;IACtE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,6BAA6B;AAE7B,MAAM,CAAC,MAAM,iBAAiB,GAAmB;IAC/C,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,WAAW;IACxB,gBAAgB,EAAE;QAChB,WAAW;QACX,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE;QACxC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE;QACrD,iCAAiC;QACjC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;QACrC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,2BAA2B,EAAE;QACpD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gCAAgC,EAAE;QACzD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,gDAAgD,EAAE;QACzE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,+BAA+B,EAAE;QACxD,YAAY;QACZ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE;QACpD,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;KACxC;IACD,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE;IACzD,aAAa,EAAE,2BAA2B;IAC1C,eAAe,EAAE,oBAAoB;IACrC,gBAAgB,EAAE,CAAC,cAAc,CAAC;CACnC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAmB;IACpD,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,iBAAiB;IAC9B,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC9D,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE;IACzD,aAAa,EAAE,2BAA2B;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,QAAQ;IACrB,gBAAgB,EAAE;QAChB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE;QAChD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE;KACtC;IACD,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAChC,aAAa,EAAE,iBAAiB;CACjC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAmB;IACpD,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,mBAAmB;IAChC,gBAAgB,EAAE;QAChB,GAAG,iBAAiB,CAAC,gBAAgB;QACrC,mDAAmD;QACnD,EAAE,MAAM,EAAE,KAAc,EAAE,IAAI,EAAE,kBAAkB,EAAE;KACrD;IACD,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAChC,aAAa,EAAE,2BAA2B;IAC1C,eAAe,EAAE,oBAAoB;IACrC,gBAAgB,EAAE,CAAC,cAAc,CAAC;CACnC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAmB;IACzD,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,yBAAyB;IACtC,gBAAgB,EAAE,sBAAsB,CAAC,gBAAgB;IACzD,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAChC,aAAa,EAAE,2BAA2B;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,IAAI,EAAE,mCAAmC;IACzC,WAAW,EAAE,QAAQ;IACrB,gBAAgB,EAAE;QAChB,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,kCAAkC,EAAE;QAC5D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,wCAAwC,EAAE;KACnE;IACD,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE;IAC9D,aAAa,EAAE,qBAAqB;CACrC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * PTY session module -- orchestrates a Docker session where the user's
3
+ * terminal is attached directly to Claude Code's PTY inside the container.
4
+ *
5
+ * Instead of the batch-oriented DockerAgentSession (docker exec per turn),
6
+ * this module provides a native interactive experience by bridging the
7
+ * terminal via a Node.js PTY proxy to a socat-managed PTY inside the container.
8
+ *
9
+ * Architecture:
10
+ * User terminal -> Node.js PTY proxy -> UDS/TCP -> socat (container)
11
+ * -> Claude Code (interactive, with PTY)
12
+ * -> Code Mode Proxy (MCP)
13
+ * -> mcp-proxy-server (PolicyEngine + Audit)
14
+ */
15
+ import type { IronCurtainConfig } from '../config/types.js';
16
+ import type { SessionMode } from '../session/types.js';
17
+ export interface PtySessionOptions {
18
+ readonly config: IronCurtainConfig;
19
+ readonly mode: SessionMode & {
20
+ kind: 'docker';
21
+ };
22
+ }
23
+ /**
24
+ * Runs a PTY session: starts proxies, launches container with PTY-enabled
25
+ * Claude Code, attaches the terminal, and blocks until the session ends.
26
+ */
27
+ export declare function runPtySession(options: PtySessionOptions): Promise<void>;