@sentropic/h2a-runtime 0.98.6 → 0.98.7-rc.10

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 (236) hide show
  1. package/dist/agent-launch-args.d.ts.map +1 -1
  2. package/dist/agent-launch-args.js +5 -5
  3. package/dist/agent-launch-args.js.map +1 -1
  4. package/dist/agy-claude.d.ts +42 -0
  5. package/dist/agy-claude.d.ts.map +1 -0
  6. package/dist/agy-claude.js +148 -0
  7. package/dist/agy-claude.js.map +1 -0
  8. package/dist/agy-headless.d.ts +11 -0
  9. package/dist/agy-headless.d.ts.map +1 -0
  10. package/dist/agy-headless.js +104 -0
  11. package/dist/agy-headless.js.map +1 -0
  12. package/dist/attach.d.ts +5 -0
  13. package/dist/attach.d.ts.map +1 -1
  14. package/dist/attach.js +75 -6
  15. package/dist/attach.js.map +1 -1
  16. package/dist/auth-login.d.ts +24 -1
  17. package/dist/auth-login.d.ts.map +1 -1
  18. package/dist/auth-login.js +132 -4
  19. package/dist/auth-login.js.map +1 -1
  20. package/dist/central-mcp.d.ts +34 -0
  21. package/dist/central-mcp.d.ts.map +1 -1
  22. package/dist/central-mcp.js +275 -71
  23. package/dist/central-mcp.js.map +1 -1
  24. package/dist/claude-code-cli-isolation.d.ts +53 -0
  25. package/dist/claude-code-cli-isolation.d.ts.map +1 -0
  26. package/dist/claude-code-cli-isolation.js +277 -0
  27. package/dist/claude-code-cli-isolation.js.map +1 -0
  28. package/dist/claude-code-cli-lifecycle.d.ts +80 -0
  29. package/dist/claude-code-cli-lifecycle.d.ts.map +1 -0
  30. package/dist/claude-code-cli-lifecycle.js +402 -0
  31. package/dist/claude-code-cli-lifecycle.js.map +1 -0
  32. package/dist/claude-code-cli-runner.d.ts +89 -0
  33. package/dist/claude-code-cli-runner.d.ts.map +1 -0
  34. package/dist/claude-code-cli-runner.js +659 -0
  35. package/dist/claude-code-cli-runner.js.map +1 -0
  36. package/dist/claude-seat-input.d.ts +47 -0
  37. package/dist/claude-seat-input.d.ts.map +1 -0
  38. package/dist/claude-seat-input.js +272 -0
  39. package/dist/claude-seat-input.js.map +1 -0
  40. package/dist/claude-seat-mesh-contract.d.ts +88 -0
  41. package/dist/claude-seat-mesh-contract.d.ts.map +1 -0
  42. package/dist/claude-seat-mesh-contract.js +13 -0
  43. package/dist/claude-seat-mesh-contract.js.map +1 -0
  44. package/dist/cli-help-groups.js +1 -1
  45. package/dist/cli-help-groups.js.map +1 -1
  46. package/dist/cli-seat-codecs.d.ts +86 -0
  47. package/dist/cli-seat-codecs.d.ts.map +1 -0
  48. package/dist/cli-seat-codecs.js +255 -0
  49. package/dist/cli-seat-codecs.js.map +1 -0
  50. package/dist/cli-seat-fixtures.d.ts +86 -0
  51. package/dist/cli-seat-fixtures.d.ts.map +1 -0
  52. package/dist/cli-seat-fixtures.js +114 -0
  53. package/dist/cli-seat-fixtures.js.map +1 -0
  54. package/dist/cli-seat-materialization.d.ts +245 -0
  55. package/dist/cli-seat-materialization.d.ts.map +1 -0
  56. package/dist/cli-seat-materialization.js +646 -0
  57. package/dist/cli-seat-materialization.js.map +1 -0
  58. package/dist/conv-guard.d.ts.map +1 -1
  59. package/dist/conv-guard.js +6 -2
  60. package/dist/conv-guard.js.map +1 -1
  61. package/dist/crash-log.d.ts +112 -0
  62. package/dist/crash-log.d.ts.map +1 -0
  63. package/dist/crash-log.js +560 -0
  64. package/dist/crash-log.js.map +1 -0
  65. package/dist/delegate.d.ts +10 -0
  66. package/dist/delegate.d.ts.map +1 -1
  67. package/dist/delegate.js +29 -0
  68. package/dist/delegate.js.map +1 -1
  69. package/dist/file-lock.d.ts +4 -2
  70. package/dist/file-lock.d.ts.map +1 -1
  71. package/dist/file-lock.js +24 -10
  72. package/dist/file-lock.js.map +1 -1
  73. package/dist/gateway-host/claude-seat-client.d.ts +32 -0
  74. package/dist/gateway-host/claude-seat-client.d.ts.map +1 -0
  75. package/dist/gateway-host/claude-seat-client.js +38 -0
  76. package/dist/gateway-host/claude-seat-client.js.map +1 -0
  77. package/dist/gateway-host/config-file.d.ts +2 -0
  78. package/dist/gateway-host/config-file.d.ts.map +1 -1
  79. package/dist/gateway-host/config-file.js +5 -1
  80. package/dist/gateway-host/config-file.js.map +1 -1
  81. package/dist/gateway-host/daemon.d.ts.map +1 -1
  82. package/dist/gateway-host/daemon.js +1 -2
  83. package/dist/gateway-host/daemon.js.map +1 -1
  84. package/dist/gateway-host/host.d.ts +6 -0
  85. package/dist/gateway-host/host.d.ts.map +1 -1
  86. package/dist/gateway-host/host.js +24 -3
  87. package/dist/gateway-host/host.js.map +1 -1
  88. package/dist/gateway-host/live-auth.d.ts +62 -0
  89. package/dist/gateway-host/live-auth.d.ts.map +1 -0
  90. package/dist/gateway-host/live-auth.js +87 -0
  91. package/dist/gateway-host/live-auth.js.map +1 -0
  92. package/dist/gateway-host/live-declarations.d.ts +58 -0
  93. package/dist/gateway-host/live-declarations.d.ts.map +1 -0
  94. package/dist/gateway-host/live-declarations.js +429 -0
  95. package/dist/gateway-host/live-declarations.js.map +1 -0
  96. package/dist/gateway-host/live-disclosure.d.ts +124 -0
  97. package/dist/gateway-host/live-disclosure.d.ts.map +1 -0
  98. package/dist/gateway-host/live-disclosure.js +347 -0
  99. package/dist/gateway-host/live-disclosure.js.map +1 -0
  100. package/dist/gateway-host/live-github.d.ts +11 -0
  101. package/dist/gateway-host/live-github.d.ts.map +1 -0
  102. package/dist/gateway-host/live-github.js +374 -0
  103. package/dist/gateway-host/live-github.js.map +1 -0
  104. package/dist/gateway-host/live-host.d.ts +20 -0
  105. package/dist/gateway-host/live-host.d.ts.map +1 -0
  106. package/dist/gateway-host/live-host.js +14 -0
  107. package/dist/gateway-host/live-host.js.map +1 -0
  108. package/dist/gateway-host/live-object-store.d.ts +35 -0
  109. package/dist/gateway-host/live-object-store.d.ts.map +1 -0
  110. package/dist/gateway-host/live-object-store.js +447 -0
  111. package/dist/gateway-host/live-object-store.js.map +1 -0
  112. package/dist/gateway-host/live-registration.d.ts +162 -0
  113. package/dist/gateway-host/live-registration.d.ts.map +1 -0
  114. package/dist/gateway-host/live-registration.js +455 -0
  115. package/dist/gateway-host/live-registration.js.map +1 -0
  116. package/dist/gateway-model-catalog/model-catalog.d.ts +38 -0
  117. package/dist/gateway-model-catalog/model-catalog.d.ts.map +1 -0
  118. package/dist/gateway-model-catalog/model-catalog.js +167 -0
  119. package/dist/gateway-model-catalog/model-catalog.js.map +1 -0
  120. package/dist/identity-cull/cull.js +1 -1
  121. package/dist/identity-cull/cull.js.map +1 -1
  122. package/dist/identity-cull/identity-fence.d.ts +48 -0
  123. package/dist/identity-cull/identity-fence.d.ts.map +1 -0
  124. package/dist/identity-cull/identity-fence.js +221 -0
  125. package/dist/identity-cull/identity-fence.js.map +1 -0
  126. package/dist/identity-operator-break.d.ts +43 -0
  127. package/dist/identity-operator-break.d.ts.map +1 -0
  128. package/dist/identity-operator-break.js +85 -0
  129. package/dist/identity-operator-break.js.map +1 -0
  130. package/dist/index.d.ts +8 -1
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +525 -132
  133. package/dist/index.js.map +1 -1
  134. package/dist/launch-layout.d.ts.map +1 -1
  135. package/dist/launch-layout.js +10 -2
  136. package/dist/launch-layout.js.map +1 -1
  137. package/dist/llm-mesh-accounts.d.ts +128 -6
  138. package/dist/llm-mesh-accounts.d.ts.map +1 -1
  139. package/dist/llm-mesh-accounts.js +370 -14
  140. package/dist/llm-mesh-accounts.js.map +1 -1
  141. package/dist/native-host.d.ts +25 -1
  142. package/dist/native-host.d.ts.map +1 -1
  143. package/dist/native-host.js +211 -28
  144. package/dist/native-host.js.map +1 -1
  145. package/dist/native-restart.d.ts +2 -0
  146. package/dist/native-restart.d.ts.map +1 -1
  147. package/dist/native-restart.js +7 -0
  148. package/dist/native-restart.js.map +1 -1
  149. package/dist/native-terminal/fleet.d.ts +11 -0
  150. package/dist/native-terminal/fleet.d.ts.map +1 -1
  151. package/dist/native-terminal/fleet.js +58 -1
  152. package/dist/native-terminal/fleet.js.map +1 -1
  153. package/dist/native-terminal/host-scope.d.ts +18 -0
  154. package/dist/native-terminal/host-scope.d.ts.map +1 -0
  155. package/dist/native-terminal/host-scope.js +65 -0
  156. package/dist/native-terminal/host-scope.js.map +1 -0
  157. package/dist/native-terminal/host.d.ts +7 -1
  158. package/dist/native-terminal/host.d.ts.map +1 -1
  159. package/dist/native-terminal/host.js +10 -26
  160. package/dist/native-terminal/host.js.map +1 -1
  161. package/dist/native-terminal/journal.d.ts +5 -0
  162. package/dist/native-terminal/journal.d.ts.map +1 -1
  163. package/dist/native-terminal/journal.js +28 -16
  164. package/dist/native-terminal/journal.js.map +1 -1
  165. package/dist/native-terminal/op.d.ts +49 -1
  166. package/dist/native-terminal/op.d.ts.map +1 -1
  167. package/dist/native-terminal/op.js +254 -38
  168. package/dist/native-terminal/op.js.map +1 -1
  169. package/dist/native-terminal/process.d.ts.map +1 -1
  170. package/dist/native-terminal/process.js +10 -1
  171. package/dist/native-terminal/process.js.map +1 -1
  172. package/dist/native-terminal/screen.d.ts.map +1 -1
  173. package/dist/native-terminal/screen.js +1 -1
  174. package/dist/native-terminal/screen.js.map +1 -1
  175. package/dist/native-terminal/server.d.ts +12 -2
  176. package/dist/native-terminal/server.d.ts.map +1 -1
  177. package/dist/native-terminal/server.js +143 -42
  178. package/dist/native-terminal/server.js.map +1 -1
  179. package/dist/native-terminal/session-scope.d.ts +2 -0
  180. package/dist/native-terminal/session-scope.d.ts.map +1 -0
  181. package/dist/native-terminal/session-scope.js +32 -0
  182. package/dist/native-terminal/session-scope.js.map +1 -0
  183. package/dist/proc-identity.d.ts +31 -0
  184. package/dist/proc-identity.d.ts.map +1 -1
  185. package/dist/proc-identity.js +54 -0
  186. package/dist/proc-identity.js.map +1 -1
  187. package/dist/prompt-delivery.d.ts +3 -0
  188. package/dist/prompt-delivery.d.ts.map +1 -1
  189. package/dist/prompt-delivery.js +8 -3
  190. package/dist/prompt-delivery.js.map +1 -1
  191. package/dist/protocol-local.d.ts +16 -0
  192. package/dist/protocol-local.d.ts.map +1 -1
  193. package/dist/protocol-local.js +14 -0
  194. package/dist/protocol-local.js.map +1 -1
  195. package/dist/registry.d.ts +16 -12
  196. package/dist/registry.d.ts.map +1 -1
  197. package/dist/registry.js +39 -5
  198. package/dist/registry.js.map +1 -1
  199. package/dist/relaunch.d.ts +16 -0
  200. package/dist/relaunch.d.ts.map +1 -1
  201. package/dist/relaunch.js +42 -1
  202. package/dist/relaunch.js.map +1 -1
  203. package/dist/restore.d.ts +4 -0
  204. package/dist/restore.d.ts.map +1 -1
  205. package/dist/restore.js +9 -37
  206. package/dist/restore.js.map +1 -1
  207. package/dist/resume-launch-options.d.ts +3 -3
  208. package/dist/resume-launch-options.d.ts.map +1 -1
  209. package/dist/resume-launch-options.js +7 -4
  210. package/dist/resume-launch-options.js.map +1 -1
  211. package/dist/run.d.ts +2 -0
  212. package/dist/run.d.ts.map +1 -1
  213. package/dist/run.js +88 -20
  214. package/dist/run.js.map +1 -1
  215. package/dist/soft-refresh.d.ts.map +1 -1
  216. package/dist/soft-refresh.js +6 -0
  217. package/dist/soft-refresh.js.map +1 -1
  218. package/dist/terminal-reset.d.ts +104 -0
  219. package/dist/terminal-reset.d.ts.map +1 -0
  220. package/dist/terminal-reset.js +229 -0
  221. package/dist/terminal-reset.js.map +1 -0
  222. package/dist/tmux.d.ts +54 -8
  223. package/dist/tmux.d.ts.map +1 -1
  224. package/dist/tmux.js +143 -36
  225. package/dist/tmux.js.map +1 -1
  226. package/dist/vendor/engram-live/contracts.d.ts +825 -0
  227. package/dist/vendor/engram-live/contracts.js +1734 -0
  228. package/dist/vendor/engram-live/integration.d.ts +113 -0
  229. package/dist/vendor/engram-live/integration.js +254 -0
  230. package/dist/vendor/engram-live/pr-sync.d.ts +144 -0
  231. package/dist/vendor/engram-live/pr-sync.js +411 -0
  232. package/dist/vendor/engram-live/registration.d.ts +138 -0
  233. package/dist/vendor/engram-live/registration.js +358 -0
  234. package/dist/vendor/engram-live/retention.d.ts +56 -0
  235. package/dist/vendor/engram-live/retention.js +179 -0
  236. package/package.json +6 -6
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Claude Code CLI isolation: private filesystem root, clean environment,
3
+ * and exclusive credential creation.
4
+ */
5
+ import { chmodSync, closeSync, constants, existsSync, lstatSync, mkdirSync, openSync, readFileSync, rmSync, statSync, writeFileSync, } from "node:fs";
6
+ import { randomUUID } from "node:crypto";
7
+ import { dirname, isAbsolute, join } from "node:path";
8
+ import { readBootId, readPidNamespaceId, readProcessStartTime } from "./proc-identity.js";
9
+ export const ALLOWED_ENV_VARS = [
10
+ "PATH",
11
+ "LANG",
12
+ "LC_ALL",
13
+ "HOME",
14
+ "TMPDIR",
15
+ "XDG_CONFIG_HOME",
16
+ "CLAUDE_CONFIG_DIR",
17
+ ];
18
+ /**
19
+ * Verify a private directory: never a symlink, always a directory owned by
20
+ * this user, always mode 0700. Pre-existing paths are tightened, never
21
+ * trusted as found. Throws a static error on any refusal.
22
+ */
23
+ function ensurePrivateDir(dir) {
24
+ let current;
25
+ try {
26
+ current = lstatSync(dir);
27
+ }
28
+ catch (err) {
29
+ if (err.code !== "ENOENT") {
30
+ throw new Error("Claude private runtime root refused");
31
+ }
32
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
33
+ current = lstatSync(dir);
34
+ }
35
+ if (current.isSymbolicLink()) {
36
+ throw new Error("Claude private runtime root refused: symbolic link");
37
+ }
38
+ if (!current.isDirectory()) {
39
+ throw new Error("Claude private runtime root refused: not a directory");
40
+ }
41
+ const euid = process.geteuid?.();
42
+ if (typeof euid === "number" && current.uid !== euid) {
43
+ throw new Error("Claude private runtime root refused: foreign owner");
44
+ }
45
+ try {
46
+ chmodSync(dir, 0o700);
47
+ }
48
+ catch {
49
+ throw new Error("Claude private runtime root refused");
50
+ }
51
+ const verified = lstatSync(dir);
52
+ if (verified.isSymbolicLink() || !verified.isDirectory()) {
53
+ throw new Error("Claude private runtime root refused");
54
+ }
55
+ if ((verified.mode & 0o777) !== 0o700) {
56
+ throw new Error("Claude private runtime root refused: permissions");
57
+ }
58
+ if (typeof euid === "number" && verified.uid !== euid) {
59
+ throw new Error("Claude private runtime root refused: foreign owner");
60
+ }
61
+ return dir;
62
+ }
63
+ function verifyUserBaseDir(dir) {
64
+ let current;
65
+ try {
66
+ current = lstatSync(dir);
67
+ }
68
+ catch {
69
+ throw new Error("Claude private runtime root refused");
70
+ }
71
+ if (current.isSymbolicLink() || !current.isDirectory()) {
72
+ throw new Error("Claude private runtime root refused");
73
+ }
74
+ const euid = process.geteuid?.();
75
+ if (typeof euid === "number" && current.uid !== euid) {
76
+ throw new Error("Claude private runtime root refused: foreign owner");
77
+ }
78
+ }
79
+ /**
80
+ * Resolve the dedicated private runtime root outside workspaces and backups.
81
+ * Only per-user bases are candidates (XDG_RUNTIME_DIR, then /run/user/<euid>
82
+ * on Linux). Shared temporary roots (/dev/shm, tmpdir()) are never used;
83
+ * when no per-user base is available resolution fails closed.
84
+ */
85
+ export function resolvePrivateRuntimeRoot(customRoot) {
86
+ if (customRoot) {
87
+ return ensurePrivateDir(customRoot);
88
+ }
89
+ const xdgBase = process.env.XDG_RUNTIME_DIR;
90
+ if (xdgBase) {
91
+ try {
92
+ verifyUserBaseDir(xdgBase);
93
+ return ensurePrivateDir(join(xdgBase, "h2a-claude-runtime"));
94
+ }
95
+ catch {
96
+ // Fall through to the next per-user candidate.
97
+ }
98
+ }
99
+ if (process.platform === "linux") {
100
+ const euid = process.geteuid?.();
101
+ if (typeof euid === "number") {
102
+ try {
103
+ const userBase = `/run/user/${euid}`;
104
+ verifyUserBaseDir(userBase);
105
+ return ensurePrivateDir(join(userBase, "h2a-claude-runtime"));
106
+ }
107
+ catch {
108
+ // Fall through to fail-closed.
109
+ }
110
+ }
111
+ }
112
+ throw new Error("Claude private runtime root unavailable: no per-user runtime directory");
113
+ }
114
+ /**
115
+ * Creates isolated 0700 run/config/home/cwd directories and an exclusive 0600 .credentials.json.
116
+ * Writes access token only; real provider expiry preserved; NO refresh token.
117
+ */
118
+ export function createClaudeRunSandbox(options) {
119
+ const runId = options.runId ?? `run_${randomUUID().replace(/-/g, "")}`;
120
+ const root = resolvePrivateRuntimeRoot(options.rootDir);
121
+ const runDir = join(root, runId);
122
+ // 0700 private run directory
123
+ mkdirSync(runDir, { recursive: true, mode: 0o700 });
124
+ const homeDir = join(runDir, "home");
125
+ const configDir = join(runDir, "config");
126
+ const cwdDir = join(runDir, "cwd");
127
+ const tmpDir = join(runDir, "tmp");
128
+ mkdirSync(homeDir, { recursive: true, mode: 0o700 });
129
+ mkdirSync(configDir, { recursive: true, mode: 0o700 });
130
+ mkdirSync(cwdDir, { recursive: true, mode: 0o700 });
131
+ mkdirSync(tmpDir, { recursive: true, mode: 0o700 });
132
+ // Identity-anchored run metadata for orphan sweeps: pid plus start-time
133
+ // and boot discriminants, so a later sweep can prove death instead of
134
+ // guessing from pid presence or directory age.
135
+ const runMeta = {
136
+ pid: process.pid,
137
+ startTime: readProcessStartTime(process.pid) ?? null,
138
+ bootId: readBootId() ?? null,
139
+ pidNamespace: readPidNamespaceId() ?? null,
140
+ createdAt: Date.now(),
141
+ };
142
+ writeFileSync(join(runDir, "run-meta.json"), JSON.stringify(runMeta), { mode: 0o600 });
143
+ const settingsPath = join(configDir, "settings.json");
144
+ const mcpConfigPath = join(configDir, "mcp-config.json");
145
+ writeFileSync(settingsPath, JSON.stringify({}), { mode: 0o600 });
146
+ writeFileSync(mcpConfigPath, JSON.stringify({ mcpServers: {} }), { mode: 0o600 });
147
+ const credentialPath = join(configDir, ".credentials.json");
148
+ // Exclusive, no-follow creation (O_CREAT | O_EXCL | O_WRONLY | O_NOFOLLOW)
149
+ const openFlags = constants.O_CREAT |
150
+ constants.O_EXCL |
151
+ constants.O_WRONLY |
152
+ (constants.O_NOFOLLOW ?? 0);
153
+ const fd = openSync(credentialPath, openFlags, 0o600);
154
+ try {
155
+ const credentialPayload = JSON.stringify({
156
+ claudeAiOauth: {
157
+ accessToken: options.access.accessToken,
158
+ expiresAt: options.access.expiresAt,
159
+ scopes: [...options.access.scopes],
160
+ },
161
+ });
162
+ writeFileSync(fd, credentialPayload, { encoding: "utf8" });
163
+ }
164
+ finally {
165
+ closeSync(fd);
166
+ }
167
+ // Verify ownership and permissions: must not be a symlink
168
+ const lstat = lstatSync(credentialPath);
169
+ if (lstat.isSymbolicLink()) {
170
+ rmSync(runDir, { recursive: true, force: true });
171
+ throw new Error("Credential file must not be a symbolic link");
172
+ }
173
+ return {
174
+ runId,
175
+ runDir,
176
+ homeDir,
177
+ configDir,
178
+ cwdDir,
179
+ tmpDir,
180
+ credentialPath,
181
+ settingsPath,
182
+ mcpConfigPath,
183
+ };
184
+ }
185
+ /**
186
+ * Record child PID and start time in the run's run-meta.json so orphan sweeps
187
+ * can identify and reap detached child process trees.
188
+ */
189
+ export function recordChildPidInSandbox(sandbox, childPid) {
190
+ const metaPath = join(sandbox.runDir, "run-meta.json");
191
+ try {
192
+ const existing = JSON.parse(readFileSync(metaPath, "utf8"));
193
+ const updated = {
194
+ ...existing,
195
+ childPid,
196
+ childStartTime: readProcessStartTime(childPid) ?? null,
197
+ childBootId: readBootId() ?? null,
198
+ childPidNamespace: readPidNamespaceId() ?? null,
199
+ childCwd: sandbox.cwdDir,
200
+ runId: sandbox.runId,
201
+ };
202
+ writeFileSync(metaPath, JSON.stringify(updated), { mode: 0o600 });
203
+ }
204
+ catch {
205
+ // Best effort
206
+ }
207
+ }
208
+ /**
209
+ * Construct an environment allowlist; strips all ambient auth, proxies, traces, and overrides.
210
+ * PATH is never inherited: a fixed minimal value (plus the binary directory
211
+ * when known) replaces whatever the parent carried.
212
+ */
213
+ export function buildIsolatedEnvironment(sandbox, baseEnv = process.env, options = {}) {
214
+ const fixedPath = options.binaryPath && isAbsolute(options.binaryPath)
215
+ ? `${dirname(options.binaryPath)}:/usr/local/bin:/usr/bin:/bin`
216
+ : "/usr/local/bin:/usr/bin:/bin";
217
+ const safeEnv = {
218
+ PATH: fixedPath,
219
+ LANG: baseEnv.LANG ?? "C.UTF-8",
220
+ LC_ALL: baseEnv.LC_ALL ?? "C.UTF-8",
221
+ HOME: sandbox.homeDir,
222
+ TMPDIR: sandbox.tmpDir,
223
+ XDG_CONFIG_HOME: sandbox.configDir,
224
+ CLAUDE_CONFIG_DIR: sandbox.configDir,
225
+ };
226
+ return safeEnv;
227
+ }
228
+ /**
229
+ * Verify that the child process did not rewrite credentials, change auth, or write back a refresh token.
230
+ */
231
+ export function verifyCredentialNotRewritten(sandbox, expectedAccess) {
232
+ if (!existsSync(sandbox.credentialPath)) {
233
+ return false;
234
+ }
235
+ const lstat = lstatSync(sandbox.credentialPath);
236
+ if (lstat.isSymbolicLink()) {
237
+ return false;
238
+ }
239
+ try {
240
+ const raw = readFileSync(sandbox.credentialPath, "utf8");
241
+ const parsed = JSON.parse(raw);
242
+ const oauth = parsed?.claudeAiOauth;
243
+ if (!oauth || typeof oauth !== "object")
244
+ return false;
245
+ // No refresh token allowed
246
+ if ("refreshToken" in oauth || "refresh_token" in oauth)
247
+ return false;
248
+ // Must match expected access material
249
+ if (oauth.accessToken !== expectedAccess.accessToken)
250
+ return false;
251
+ if (oauth.expiresAt !== expectedAccess.expiresAt)
252
+ return false;
253
+ return true;
254
+ }
255
+ catch {
256
+ return false;
257
+ }
258
+ }
259
+ /**
260
+ * Content-blind cleanup of the dedicated sandbox directory without following symlinks.
261
+ * Throws a static error when the run directory persists: callers must block
262
+ * any success terminal on cleanup failure (no success without custody release).
263
+ */
264
+ export function cleanClaudeRunSandbox(sandbox) {
265
+ try {
266
+ if (existsSync(sandbox.runDir)) {
267
+ rmSync(sandbox.runDir, { recursive: true, force: true });
268
+ }
269
+ }
270
+ catch {
271
+ throw new Error("Claude run sandbox cleanup failed");
272
+ }
273
+ if (existsSync(sandbox.runDir)) {
274
+ throw new Error("Claude run sandbox cleanup failed");
275
+ }
276
+ }
277
+ //# sourceMappingURL=claude-code-cli-isolation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-cli-isolation.js","sourceRoot":"","sources":["../src/claude-code-cli-isolation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ export declare const DEFAULT_ORPHAN_STALE_AFTER_MS: number;
2
+ export declare const DEFAULT_MIN_REMAINING_TTL_MS = 60000;
3
+ export declare const DEFAULT_MAX_REMAINING_TTL_MS = 86400000;
4
+ /**
5
+ * Account locking lives in the mesh account directory, like every other
6
+ * seat: h2a holds no per-account lease here. The holder record below only
7
+ * describes sweep/identity metadata (run-meta.json and the sweep lock),
8
+ * never a lock claim.
9
+ */
10
+ export interface ClaudeSweepHolderRecord {
11
+ readonly pid?: unknown;
12
+ readonly startTime?: unknown;
13
+ readonly bootId?: unknown;
14
+ readonly pidNamespace?: unknown;
15
+ readonly machineId?: unknown;
16
+ readonly token?: unknown;
17
+ }
18
+ /**
19
+ * Positively prove that a live child process is the exact process spawned by this sandbox.
20
+ * Fails closed: never signals on PID presence alone, across reboot, across PID namespace
21
+ * boundary, across PID reuse, or when start-time was unrecorded or mismatched.
22
+ */
23
+ export declare function isRecordedChildProvenTarget(childPid: number, rawMeta: {
24
+ readonly childStartTime?: unknown;
25
+ readonly childBootId?: unknown;
26
+ readonly childPidNamespace?: unknown;
27
+ readonly childCwd?: unknown;
28
+ readonly runId?: unknown;
29
+ }, parentMeta: ClaudeSweepHolderRecord, runDir: string): {
30
+ proven: boolean;
31
+ reason?: string;
32
+ };
33
+ /**
34
+ * Account locking lives in the mesh account directory for every seat
35
+ * (owner decision 2026-10-13, realign on the common seat model): h2a holds
36
+ * no per-account lease. `acquireClaudeAccountLease` and
37
+ * `reclaimDeadAccountLock` were removed without replacement — the mesh route
38
+ * planner serializes acquisition and refresh. What follows is TTL admission,
39
+ * process reaping, and the orphan sweep (proven-dead sandboxes only).
40
+ */
41
+ /**
42
+ * Validate token remaining TTL against admission boundaries.
43
+ * Preserves real provider expiry without rewriting or fabricating timestamps.
44
+ */
45
+ export declare function checkTokenTtlAdmission(expiresAt: number, now?: number, minTtlMs?: number, maxTtlMs?: number): {
46
+ admitted: boolean;
47
+ reason?: string;
48
+ };
49
+ /**
50
+ * Supervise process tree and guarantee reaping of child and all descendants.
51
+ */
52
+ export declare function reapProcessTree(pid: number, signal?: NodeJS.Signals, gracePeriodMs?: number): Promise<void>;
53
+ export interface SweepResult {
54
+ readonly swept: number;
55
+ readonly retained: number;
56
+ readonly skippedAlive: number;
57
+ readonly skippedUnprovenChild?: number;
58
+ }
59
+ export interface SweepOrphanSandboxesOptions {
60
+ readonly maxAgeMs?: number;
61
+ readonly now?: () => number;
62
+ readonly reapProcessTreeFn?: (pid: number, signal?: NodeJS.Signals, gracePeriodMs?: number) => Promise<void>;
63
+ readonly onUnprovenChild?: (info: {
64
+ runDir: string;
65
+ childPid: number;
66
+ reason: string;
67
+ }) => void;
68
+ }
69
+ /** Sweep mutual-exclusion file inside the runtime root. */
70
+ export declare const CLAUDE_SWEEP_LOCK_FILENAME = ".sweep.lock";
71
+ /**
72
+ * Content-blind orphan sweep at host boot and runner start.
73
+ * A run is swept only when its run-meta.json carries a valid pid plus
74
+ * createdAt AND the holder is proven dead by pid/start-time/boot identity
75
+ * AND its age exceeds the stale threshold. Runs without valid metadata are
76
+ * always retained (never deleted blindly); live holders are skipped; a
77
+ * concurrent active sweeper makes this call a no-op.
78
+ */
79
+ export declare function sweepOrphanSandboxes(rootDir?: string, options?: SweepOrphanSandboxesOptions): Promise<SweepResult>;
80
+ //# sourceMappingURL=claude-code-cli-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-cli-lifecycle.d.ts","sourceRoot":"","sources":["../src/claude-code-cli-lifecycle.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,6BAA6B,QAAgB,CAAC;AAC3D,eAAO,MAAM,4BAA4B,QAAS,CAAC;AACnD,eAAO,MAAM,4BAA4B,WAAa,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAyDD;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IACP,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,EACD,UAAU,EAAE,uBAAuB,EACnC,MAAM,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAoFtC;AAED;;;;;;;GAOG;AAEH;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,GAAG,SAAa,EAChB,QAAQ,SAA+B,EACvC,QAAQ,SAA+B,GACtC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAYxC;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAM,CAAC,OAAmB,EAClC,aAAa,SAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7G,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACjG;AAED,2DAA2D;AAC3D,eAAO,MAAM,0BAA0B,gBAAgB,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,WAAW,CAAC,CA2MtB"}