@sentropic/h2a-runtime 0.81.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/dist/account-pool.d.ts +168 -0
  2. package/dist/account-pool.d.ts.map +1 -0
  3. package/dist/account-pool.js +385 -0
  4. package/dist/account-pool.js.map +1 -0
  5. package/dist/agents-projection.d.ts +56 -0
  6. package/dist/agents-projection.d.ts.map +1 -0
  7. package/dist/agents-projection.js +82 -0
  8. package/dist/agents-projection.js.map +1 -0
  9. package/dist/attach.d.ts +75 -0
  10. package/dist/attach.d.ts.map +1 -0
  11. package/dist/attach.js +432 -0
  12. package/dist/attach.js.map +1 -0
  13. package/dist/auth-bundle.d.ts +21 -0
  14. package/dist/auth-bundle.d.ts.map +1 -0
  15. package/dist/auth-bundle.js +112 -0
  16. package/dist/auth-bundle.js.map +1 -0
  17. package/dist/auth-diagnostics.d.ts +18 -0
  18. package/dist/auth-diagnostics.d.ts.map +1 -0
  19. package/dist/auth-diagnostics.js +23 -0
  20. package/dist/auth-diagnostics.js.map +1 -0
  21. package/dist/auth-login.d.ts +9 -0
  22. package/dist/auth-login.d.ts.map +1 -0
  23. package/dist/auth-login.js +21 -0
  24. package/dist/auth-login.js.map +1 -0
  25. package/dist/auth-refresh.d.ts +32 -0
  26. package/dist/auth-refresh.d.ts.map +1 -0
  27. package/dist/auth-refresh.js +83 -0
  28. package/dist/auth-refresh.js.map +1 -0
  29. package/dist/auth-tools.d.ts +55 -0
  30. package/dist/auth-tools.d.ts.map +1 -0
  31. package/dist/auth-tools.js +163 -0
  32. package/dist/auth-tools.js.map +1 -0
  33. package/dist/browser-bridge-local.d.ts +27 -0
  34. package/dist/browser-bridge-local.d.ts.map +1 -0
  35. package/dist/browser-bridge-local.js +51 -0
  36. package/dist/browser-bridge-local.js.map +1 -0
  37. package/dist/browser.d.ts +53 -0
  38. package/dist/browser.d.ts.map +1 -0
  39. package/dist/browser.js +61 -0
  40. package/dist/browser.js.map +1 -0
  41. package/dist/conductor-launch.d.ts +179 -0
  42. package/dist/conductor-launch.d.ts.map +1 -0
  43. package/dist/conductor-launch.js +414 -0
  44. package/dist/conductor-launch.js.map +1 -0
  45. package/dist/config.d.ts +182 -0
  46. package/dist/config.d.ts.map +1 -0
  47. package/dist/config.js +334 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/conv-guard.d.ts +76 -0
  50. package/dist/conv-guard.d.ts.map +1 -0
  51. package/dist/conv-guard.js +131 -0
  52. package/dist/conv-guard.js.map +1 -0
  53. package/dist/convsync.d.ts +24 -0
  54. package/dist/convsync.d.ts.map +1 -0
  55. package/dist/convsync.js +108 -0
  56. package/dist/convsync.js.map +1 -0
  57. package/dist/cred-health.d.ts +96 -0
  58. package/dist/cred-health.d.ts.map +1 -0
  59. package/dist/cred-health.js +170 -0
  60. package/dist/cred-health.js.map +1 -0
  61. package/dist/delegate.d.ts +406 -0
  62. package/dist/delegate.d.ts.map +1 -0
  63. package/dist/delegate.js +739 -0
  64. package/dist/delegate.js.map +1 -0
  65. package/dist/enroll.d.ts +91 -0
  66. package/dist/enroll.d.ts.map +1 -0
  67. package/dist/enroll.js +248 -0
  68. package/dist/enroll.js.map +1 -0
  69. package/dist/fanout.d.ts +63 -0
  70. package/dist/fanout.d.ts.map +1 -0
  71. package/dist/fanout.js +115 -0
  72. package/dist/fanout.js.map +1 -0
  73. package/dist/forward.d.ts +66 -0
  74. package/dist/forward.d.ts.map +1 -0
  75. package/dist/forward.js +141 -0
  76. package/dist/forward.js.map +1 -0
  77. package/dist/gitdiff.d.ts +31 -0
  78. package/dist/gitdiff.d.ts.map +1 -0
  79. package/dist/gitdiff.js +133 -0
  80. package/dist/gitdiff.js.map +1 -0
  81. package/dist/h2a-bridge.d.ts +102 -0
  82. package/dist/h2a-bridge.d.ts.map +1 -0
  83. package/dist/h2a-bridge.js +333 -0
  84. package/dist/h2a-bridge.js.map +1 -0
  85. package/dist/h2a-jobs.d.ts +235 -0
  86. package/dist/h2a-jobs.d.ts.map +1 -0
  87. package/dist/h2a-jobs.js +388 -0
  88. package/dist/h2a-jobs.js.map +1 -0
  89. package/dist/h2a-ping.d.ts +38 -0
  90. package/dist/h2a-ping.d.ts.map +1 -0
  91. package/dist/h2a-ping.js +58 -0
  92. package/dist/h2a-ping.js.map +1 -0
  93. package/dist/index.d.ts +98 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +5887 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/interactive-throttle.d.ts +164 -0
  98. package/dist/interactive-throttle.d.ts.map +1 -0
  99. package/dist/interactive-throttle.js +194 -0
  100. package/dist/interactive-throttle.js.map +1 -0
  101. package/dist/lineage-client.d.ts +77 -0
  102. package/dist/lineage-client.d.ts.map +1 -0
  103. package/dist/lineage-client.js +117 -0
  104. package/dist/lineage-client.js.map +1 -0
  105. package/dist/lineage-lease.d.ts +152 -0
  106. package/dist/lineage-lease.d.ts.map +1 -0
  107. package/dist/lineage-lease.js +303 -0
  108. package/dist/lineage-lease.js.map +1 -0
  109. package/dist/llm-gateway-runtime/accounts.d.ts +48 -0
  110. package/dist/llm-gateway-runtime/accounts.d.ts.map +1 -0
  111. package/dist/llm-gateway-runtime/accounts.js +226 -0
  112. package/dist/llm-gateway-runtime/accounts.js.map +1 -0
  113. package/dist/llm-gateway-runtime/index.d.ts +4 -0
  114. package/dist/llm-gateway-runtime/index.d.ts.map +1 -0
  115. package/dist/llm-gateway-runtime/index.js +58 -0
  116. package/dist/llm-gateway-runtime/index.js.map +1 -0
  117. package/dist/llm-gateway-runtime/model-catalog.d.ts +36 -0
  118. package/dist/llm-gateway-runtime/model-catalog.d.ts.map +1 -0
  119. package/dist/llm-gateway-runtime/model-catalog.js +146 -0
  120. package/dist/llm-gateway-runtime/model-catalog.js.map +1 -0
  121. package/dist/llm-gateway-runtime/proxy-anthropic.d.ts +3 -0
  122. package/dist/llm-gateway-runtime/proxy-anthropic.d.ts.map +1 -0
  123. package/dist/llm-gateway-runtime/proxy-anthropic.js +139 -0
  124. package/dist/llm-gateway-runtime/proxy-anthropic.js.map +1 -0
  125. package/dist/llm-gateway-runtime/proxy-openai.d.ts +117 -0
  126. package/dist/llm-gateway-runtime/proxy-openai.d.ts.map +1 -0
  127. package/dist/llm-gateway-runtime/proxy-openai.js +1132 -0
  128. package/dist/llm-gateway-runtime/proxy-openai.js.map +1 -0
  129. package/dist/llm-gateway-runtime/session-ledger.d.ts +32 -0
  130. package/dist/llm-gateway-runtime/session-ledger.d.ts.map +1 -0
  131. package/dist/llm-gateway-runtime/session-ledger.js +62 -0
  132. package/dist/llm-gateway-runtime/session-ledger.js.map +1 -0
  133. package/dist/llm-gateway-runtime/sticky.d.ts +40 -0
  134. package/dist/llm-gateway-runtime/sticky.d.ts.map +1 -0
  135. package/dist/llm-gateway-runtime/sticky.js +254 -0
  136. package/dist/llm-gateway-runtime/sticky.js.map +1 -0
  137. package/dist/llm-mesh.d.ts +102 -0
  138. package/dist/llm-mesh.d.ts.map +1 -0
  139. package/dist/llm-mesh.js +433 -0
  140. package/dist/llm-mesh.js.map +1 -0
  141. package/dist/migrate-candidates.d.ts +35 -0
  142. package/dist/migrate-candidates.d.ts.map +1 -0
  143. package/dist/migrate-candidates.js +128 -0
  144. package/dist/migrate-candidates.js.map +1 -0
  145. package/dist/migrate.d.ts +125 -0
  146. package/dist/migrate.d.ts.map +1 -0
  147. package/dist/migrate.js +561 -0
  148. package/dist/migrate.js.map +1 -0
  149. package/dist/plugin-manifest.d.ts +143 -0
  150. package/dist/plugin-manifest.d.ts.map +1 -0
  151. package/dist/plugin-manifest.js +233 -0
  152. package/dist/plugin-manifest.js.map +1 -0
  153. package/dist/plugin.d.ts +274 -0
  154. package/dist/plugin.d.ts.map +1 -0
  155. package/dist/plugin.js +919 -0
  156. package/dist/plugin.js.map +1 -0
  157. package/dist/pod-liveness.d.ts +51 -0
  158. package/dist/pod-liveness.d.ts.map +1 -0
  159. package/dist/pod-liveness.js +80 -0
  160. package/dist/pod-liveness.js.map +1 -0
  161. package/dist/profile-menu.d.ts +7 -0
  162. package/dist/profile-menu.d.ts.map +1 -0
  163. package/dist/profile-menu.js +52 -0
  164. package/dist/profile-menu.js.map +1 -0
  165. package/dist/profiles.d.ts +23 -0
  166. package/dist/profiles.d.ts.map +1 -0
  167. package/dist/profiles.js +66 -0
  168. package/dist/profiles.js.map +1 -0
  169. package/dist/protocol-local.d.ts +27 -0
  170. package/dist/protocol-local.d.ts.map +1 -0
  171. package/dist/protocol-local.js +12 -0
  172. package/dist/protocol-local.js.map +1 -0
  173. package/dist/pty.d.ts +26 -0
  174. package/dist/pty.d.ts.map +1 -0
  175. package/dist/pty.js +45 -0
  176. package/dist/pty.js.map +1 -0
  177. package/dist/readiness.d.ts +38 -0
  178. package/dist/readiness.d.ts.map +1 -0
  179. package/dist/readiness.js +169 -0
  180. package/dist/readiness.js.map +1 -0
  181. package/dist/registry.d.ts +258 -0
  182. package/dist/registry.d.ts.map +1 -0
  183. package/dist/registry.js +570 -0
  184. package/dist/registry.js.map +1 -0
  185. package/dist/relaunch.d.ts +52 -0
  186. package/dist/relaunch.d.ts.map +1 -0
  187. package/dist/relaunch.js +76 -0
  188. package/dist/relaunch.js.map +1 -0
  189. package/dist/restore.d.ts +165 -0
  190. package/dist/restore.d.ts.map +1 -0
  191. package/dist/restore.js +530 -0
  192. package/dist/restore.js.map +1 -0
  193. package/dist/run.d.ts +29 -0
  194. package/dist/run.d.ts.map +1 -0
  195. package/dist/run.js +206 -0
  196. package/dist/run.js.map +1 -0
  197. package/dist/secrets.d.ts +25 -0
  198. package/dist/secrets.d.ts.map +1 -0
  199. package/dist/secrets.js +98 -0
  200. package/dist/secrets.js.map +1 -0
  201. package/dist/session-restore.d.ts +26 -0
  202. package/dist/session-restore.d.ts.map +1 -0
  203. package/dist/session-restore.js +122 -0
  204. package/dist/session-restore.js.map +1 -0
  205. package/dist/skills-sync.d.ts +126 -0
  206. package/dist/skills-sync.d.ts.map +1 -0
  207. package/dist/skills-sync.js +255 -0
  208. package/dist/skills-sync.js.map +1 -0
  209. package/dist/smoke.d.ts +23 -0
  210. package/dist/smoke.d.ts.map +1 -0
  211. package/dist/smoke.js +138 -0
  212. package/dist/smoke.js.map +1 -0
  213. package/dist/soft-refresh.d.ts +107 -0
  214. package/dist/soft-refresh.d.ts.map +1 -0
  215. package/dist/soft-refresh.js +426 -0
  216. package/dist/soft-refresh.js.map +1 -0
  217. package/dist/sync-status.d.ts +22 -0
  218. package/dist/sync-status.d.ts.map +1 -0
  219. package/dist/sync-status.js +41 -0
  220. package/dist/sync-status.js.map +1 -0
  221. package/dist/sync.d.ts +77 -0
  222. package/dist/sync.d.ts.map +1 -0
  223. package/dist/sync.js +302 -0
  224. package/dist/sync.js.map +1 -0
  225. package/dist/throttle-signatures.d.ts +43 -0
  226. package/dist/throttle-signatures.d.ts.map +1 -0
  227. package/dist/throttle-signatures.js +116 -0
  228. package/dist/throttle-signatures.js.map +1 -0
  229. package/dist/tmux.d.ts +286 -0
  230. package/dist/tmux.d.ts.map +1 -0
  231. package/dist/tmux.js +970 -0
  232. package/dist/tmux.js.map +1 -0
  233. package/dist/tunnel.d.ts +25 -0
  234. package/dist/tunnel.d.ts.map +1 -0
  235. package/dist/tunnel.js +127 -0
  236. package/dist/tunnel.js.map +1 -0
  237. package/dist/workspace-merge.d.ts +17 -0
  238. package/dist/workspace-merge.d.ts.map +1 -0
  239. package/dist/workspace-merge.js +153 -0
  240. package/dist/workspace-merge.js.map +1 -0
  241. package/dist/workspace-sync-incremental.d.ts +64 -0
  242. package/dist/workspace-sync-incremental.d.ts.map +1 -0
  243. package/dist/workspace-sync-incremental.js +199 -0
  244. package/dist/workspace-sync-incremental.js.map +1 -0
  245. package/dist/workspace-sync.d.ts +3 -0
  246. package/dist/workspace-sync.d.ts.map +1 -0
  247. package/dist/workspace-sync.js +187 -0
  248. package/dist/workspace-sync.js.map +1 -0
  249. package/dist/workspace.d.ts +70 -0
  250. package/dist/workspace.d.ts.map +1 -0
  251. package/dist/workspace.js +173 -0
  252. package/dist/workspace.js.map +1 -0
  253. package/package.json +44 -0
@@ -0,0 +1,199 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync, statSync } from "node:fs";
3
+ import { spawnSync } from "node:child_process";
4
+ import { join } from "node:path";
5
+ const FILE_SIZE_LIMIT = 10_000_000; // 10 MB per file
6
+ // ---------------------------------------------------------------------------
7
+ // Hashing helpers
8
+ // ---------------------------------------------------------------------------
9
+ export function sha256Buf(buf) {
10
+ return createHash("sha256").update(buf).digest("hex");
11
+ }
12
+ export function sha256File(path) {
13
+ return sha256Buf(readFileSync(path));
14
+ }
15
+ // ---------------------------------------------------------------------------
16
+ // Git introspection
17
+ // ---------------------------------------------------------------------------
18
+ export function isGitRepo(cwd) {
19
+ return (spawnSync("git", ["rev-parse", "--git-dir"], { cwd, encoding: "utf8" })
20
+ .status === 0);
21
+ }
22
+ export function getHeadSha(cwd) {
23
+ const r = spawnSync("git", ["rev-parse", "HEAD"], {
24
+ cwd,
25
+ encoding: "utf8",
26
+ });
27
+ return r.status === 0 ? r.stdout.trim() : undefined;
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // Bootstrap: full git bundle
31
+ // ---------------------------------------------------------------------------
32
+ /**
33
+ * Create a git bundle of all local refs (HEAD + all branches).
34
+ * Used for the first-time push when no base commit is known on the CP side.
35
+ */
36
+ export function buildGitBundle(cwd) {
37
+ const r = spawnSync("git", ["bundle", "create", "-", "--all"], {
38
+ cwd,
39
+ maxBuffer: 512 * 1024 * 1024,
40
+ });
41
+ if (r.status !== 0) {
42
+ throw new Error(`git bundle failed: ${r.stderr?.toString()?.slice(0, 200) ?? "unknown error"}`);
43
+ }
44
+ return r.stdout;
45
+ }
46
+ // ---------------------------------------------------------------------------
47
+ // Incremental: tracked diff (committed + staged changes since baseSha)
48
+ // ---------------------------------------------------------------------------
49
+ /**
50
+ * Build a binary git diff between baseSha and HEAD (committed changes) plus
51
+ * staged index changes, combined and base64-encoded for transport.
52
+ */
53
+ export function buildTrackedDiff(cwd, baseSha) {
54
+ const opts = {
55
+ cwd,
56
+ maxBuffer: 256 * 1024 * 1024,
57
+ };
58
+ // Committed changes between baseSha and HEAD
59
+ const rCommitted = spawnSync("git", ["diff", "--binary", baseSha, "HEAD"], opts);
60
+ // Staged (index) changes not yet committed
61
+ const rStaged = spawnSync("git", ["diff", "--binary", "--cached", "HEAD"], opts);
62
+ const combined = Buffer.concat([
63
+ rCommitted.stdout ?? Buffer.alloc(0),
64
+ rStaged.stdout ?? Buffer.alloc(0),
65
+ ]);
66
+ return combined.toString("base64");
67
+ }
68
+ /**
69
+ * Build the full incremental manifest: tracked diff + untracked file list.
70
+ * Does NOT build the tarball (caller calls buildUntrackedTarball separately).
71
+ */
72
+ export function buildIncrementalManifest(cwd, baseSha) {
73
+ const tracked = buildTrackedDiff(cwd, baseSha);
74
+ // List untracked files not excluded by .gitignore
75
+ const utR = spawnSync("git", ["ls-files", "-o", "--exclude-standard", "-z"], {
76
+ cwd,
77
+ encoding: "buffer",
78
+ });
79
+ const untrackedPaths = utR.stdout
80
+ .toString("utf8")
81
+ .split("\0")
82
+ .map((p) => p.trim())
83
+ .filter(Boolean);
84
+ const untrackedManifest = untrackedPaths.map((p) => {
85
+ const abs = join(cwd, p);
86
+ return { path: p, sha256: sha256File(abs), size: statSync(abs).size };
87
+ });
88
+ return {
89
+ base: baseSha,
90
+ tracked,
91
+ untrackedManifest,
92
+ deleted: [],
93
+ renames: [],
94
+ modes: [],
95
+ };
96
+ }
97
+ /**
98
+ * Build a gzip tarball of the specified untracked file paths relative to cwd.
99
+ * Returns an empty Buffer if paths is empty.
100
+ */
101
+ export function buildUntrackedTarball(cwd, paths) {
102
+ if (paths.length === 0)
103
+ return Buffer.alloc(0);
104
+ const input = paths.join("\0");
105
+ // Note: -C must precede -T on GNU tar (positional option ordering).
106
+ const r = spawnSync("tar", ["-czf", "-", "-C", cwd, "--null", "-T", "-"], {
107
+ input: Buffer.from(input),
108
+ maxBuffer: 256 * 1024 * 1024,
109
+ });
110
+ if (r.status !== 0) {
111
+ throw new Error(`tar untracked failed: ${r.stderr?.toString()?.slice(0, 200) ?? "unknown error"}`);
112
+ }
113
+ return r.stdout;
114
+ }
115
+ /**
116
+ * Classifies the working set into hot/cold.
117
+ *
118
+ * Hot = git-tracked modified files (git diff --name-only HEAD)
119
+ * ∪ untracked recent files (mtime < hotSetMtimeSec seconds ago)
120
+ * where size ≤ 10 MB each.
121
+ * Cap: total hot-set bytes ≤ hotSetMaxBytes (default 50 MB).
122
+ * Files exceeding the size limit or pushed beyond the cap go to cold.
123
+ * Within the cap, candidates are sorted by mtime descending (newest first).
124
+ */
125
+ export async function classifyWorkingSet(args) {
126
+ const { cwd } = args;
127
+ const hotSetMaxBytes = args.hotSetMaxBytes ?? 50_000_000;
128
+ const hotSetMtimeSec = args.hotSetMtimeSec ?? 86_400;
129
+ const nowMs = Date.now();
130
+ const mtimeCutoffMs = nowMs - hotSetMtimeSec * 1000;
131
+ // Tracked modified files (git diff --name-only HEAD)
132
+ const diffR = spawnSync("git", ["diff", "--name-only", "HEAD"], {
133
+ cwd,
134
+ encoding: "utf8",
135
+ maxBuffer: 8 * 1024 * 1024,
136
+ });
137
+ const trackedModified = diffR.status === 0
138
+ ? diffR.stdout
139
+ .split("\n")
140
+ .map((p) => p.trim())
141
+ .filter(Boolean)
142
+ : [];
143
+ // Untracked files (not ignored by .gitignore)
144
+ const utR = spawnSync("git", ["ls-files", "-o", "--exclude-standard", "-z"], { cwd, encoding: "buffer", maxBuffer: 8 * 1024 * 1024 });
145
+ const untracked = utR.status === 0
146
+ ? utR.stdout
147
+ .toString("utf8")
148
+ .split("\0")
149
+ .map((p) => p.trim())
150
+ .filter(Boolean)
151
+ : [];
152
+ // Filter untracked by mtime recency
153
+ const recentUntracked = untracked.filter((p) => {
154
+ try {
155
+ return statSync(join(cwd, p)).mtimeMs >= mtimeCutoffMs;
156
+ }
157
+ catch {
158
+ return false;
159
+ }
160
+ });
161
+ // Union: tracked modified + recent untracked, deduplicated
162
+ const candidateSet = new Set([...trackedModified, ...recentUntracked]);
163
+ const candidates = Array.from(candidateSet);
164
+ const entries = [];
165
+ const coldFromSize = [];
166
+ for (const p of candidates) {
167
+ let st;
168
+ try {
169
+ st = statSync(join(cwd, p));
170
+ }
171
+ catch {
172
+ continue; // file disappeared — skip
173
+ }
174
+ if (st.size > FILE_SIZE_LIMIT) {
175
+ coldFromSize.push(p);
176
+ }
177
+ else {
178
+ entries.push({ path: p, size: st.size, mtimeMs: st.mtimeMs });
179
+ }
180
+ }
181
+ // Sort by mtime descending (newest first) to prioritize recent files within cap
182
+ entries.sort((a, b) => b.mtimeMs - a.mtimeMs);
183
+ // Apply cap: fill hot up to hotSetMaxBytes, overflow → cold
184
+ const hot = [];
185
+ const coldFromCap = [];
186
+ let hotBytes = 0;
187
+ for (const e of entries) {
188
+ if (hotBytes + e.size <= hotSetMaxBytes) {
189
+ hot.push(e.path);
190
+ hotBytes += e.size;
191
+ }
192
+ else {
193
+ coldFromCap.push(e.path);
194
+ }
195
+ }
196
+ const cold = [...coldFromSize, ...coldFromCap];
197
+ return { hot, cold, estimatedHotBytes: hotBytes };
198
+ }
199
+ //# sourceMappingURL=workspace-sync-incremental.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-sync-incremental.js","sourceRoot":"","sources":["../src/workspace-sync-incremental.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function buildWorkspaceArchive(cwd: string): Promise<Buffer>;
2
+ export declare function uploadWorkspaceArchive(baseUrl: string, sessionId: string, archive: Buffer, fetchImpl?: typeof fetch, extraHeaders?: Record<string, string>): Promise<void>;
3
+ //# sourceMappingURL=workspace-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-sync.d.ts","sourceRoot":"","sources":["../src/workspace-sync.ts"],"names":[],"mappings":"AA8FA,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8FxE;AA6BD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,OAAO,KAAa,EAC/B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -0,0 +1,187 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { authHeaders } from "./config.js";
5
+ // Largest .git we ship in the workspace archive. Over this, the repo history is
6
+ // not transferred (the user restores it in-Pod via git fetch/clone).
7
+ const MAX_GIT_BYTES = 128 * 1024 * 1024; // 128 MiB
8
+ /** Best-effort directory size in bytes via `du -sk`. Infinity on failure (so we skip). */
9
+ async function dirSizeBytes(absPath) {
10
+ const r = await run("du", ["-sk", absPath], dirname(absPath));
11
+ if (r.status !== 0)
12
+ return Number.POSITIVE_INFINITY;
13
+ const kb = parseInt(r.stdout.toString("utf8").trim().split(/\s+/)[0] ?? "", 10);
14
+ return Number.isFinite(kb) ? kb * 1024 : Number.POSITIVE_INFINITY;
15
+ }
16
+ // Safety cap against accidentally pushing huge directories. Generous because a
17
+ // legitimate migrated conversation (.remote/sessions) can be large — claude
18
+ // transcripts embed base64 images that do not compress.
19
+ const MAX_ARCHIVE_BYTES = 256 * 1024 * 1024; // 256 MiB
20
+ function run(command, args, cwd) {
21
+ return new Promise((resolve) => {
22
+ const child = spawn(command, [...args], { cwd });
23
+ const stdout = [];
24
+ const stderr = [];
25
+ child.stdout.on("data", (c) => stdout.push(c));
26
+ child.stderr.on("data", (c) => stderr.push(c));
27
+ child.on("error", () => resolve({ status: 127, stdout: Buffer.concat(stdout), stderr: "spawn error" }));
28
+ child.on("close", (code) => resolve({
29
+ status: code ?? 1,
30
+ stdout: Buffer.concat(stdout),
31
+ stderr: Buffer.concat(stderr).toString("utf8"),
32
+ }));
33
+ });
34
+ }
35
+ async function isGitRepo(cwd) {
36
+ const result = await run("git", ["rev-parse", "--is-inside-work-tree"], cwd);
37
+ return result.status === 0 && result.stdout.toString("utf8").trim() === "true";
38
+ }
39
+ /**
40
+ * Build a gzip tarball of the working directory to seed a remote /workspace.
41
+ *
42
+ * In a git repo, uses `git ls-files -co --exclude-standard` so the archive
43
+ * honors .gitignore precisely AND includes uncommitted working-tree files.
44
+ * Outside a git repo, falls back to tar with a coarse exclude list.
45
+ */
46
+ /**
47
+ * Approximate .gitignore in the non-git tar fallback: each plain pattern of
48
+ * the ROOT .gitignore becomes a tar --exclude. Comments and `!` negations are
49
+ * skipped; a trailing `/` is dropped (tar excludes match path components at
50
+ * any depth, like unanchored gitignore dir patterns); a leading `/` anchors
51
+ * the pattern to the archive root (`./`). Patterns that would drop migrated
52
+ * session state (`.remote`, `.claude`) are ignored — the conversation under
53
+ * .remote/sessions must always travel with the workspace.
54
+ */
55
+ function rootGitignoreExcludes(cwd) {
56
+ let raw;
57
+ try {
58
+ raw = readFileSync(join(cwd, ".gitignore"), "utf8");
59
+ }
60
+ catch {
61
+ return [];
62
+ }
63
+ const excludes = [];
64
+ for (const line of raw.split("\n")) {
65
+ const pattern = line.trim();
66
+ if (!pattern || pattern.startsWith("#") || pattern.startsWith("!"))
67
+ continue;
68
+ const cleaned = pattern.replace(/\/+$/, "");
69
+ if (!cleaned)
70
+ continue;
71
+ const bare = cleaned.replace(/^\/+/, "");
72
+ if (bare === ".remote" || bare === ".claude")
73
+ continue;
74
+ excludes.push(`--exclude=${cleaned.startsWith("/") ? `./${bare}` : cleaned}`);
75
+ }
76
+ return excludes;
77
+ }
78
+ export async function buildWorkspaceArchive(cwd) {
79
+ const git = await isGitRepo(cwd);
80
+ let archive;
81
+ if (git) {
82
+ const list = await run("git", ["ls-files", "-co", "--exclude-standard", "-z"], cwd);
83
+ if (list.status !== 0) {
84
+ throw new Error(`git ls-files failed: ${list.stderr}`);
85
+ }
86
+ if (list.stdout.byteLength === 0) {
87
+ throw new Error("no files to sync (git ls-files returned nothing)");
88
+ }
89
+ // Force-include persisted conversation state under .remote/sessions even
90
+ // though .gitignore typically excludes it (the nested `.claude/` path
91
+ // segment trips a `.claude/` ignore rule). This is how a migrated session
92
+ // carries its in-progress conversation onto the remote workspace PVC, where
93
+ // the session-agent restores it into HOME before the CLI starts.
94
+ //
95
+ // SECURITY: .claude/settings.local.json is intentionally excluded — it
96
+ // contains machine-local API keys and MCP secrets that must not transit the
97
+ // control-plane. The remote session sources credentials via `remote
98
+ // push-creds` instead.
99
+ const sessionState = await run("git", [
100
+ "ls-files",
101
+ "-o",
102
+ "-z",
103
+ "--",
104
+ ".remote/sessions",
105
+ ".remote/git.json",
106
+ ".claude/settings.json",
107
+ ], cwd);
108
+ // Force-include the .git directory (git ls-files never lists it) so the
109
+ // remote workspace is a real git repo — commit/push works in the Pod and
110
+ // the remote/branch config travels. Size-gated: huge histories blow the
111
+ // archive cap and the tunnel, so over MAX_GIT_BYTES we skip the objects and
112
+ // let the user restore git in-Pod (git fetch/clone — gh auth is bundled).
113
+ let gitDir = Buffer.alloc(0);
114
+ if (existsSync(join(cwd, ".git"))) {
115
+ const gitBytes = await dirSizeBytes(join(cwd, ".git"));
116
+ if (gitBytes <= MAX_GIT_BYTES) {
117
+ gitDir = Buffer.from(".git\0", "utf8");
118
+ }
119
+ else {
120
+ process.stderr.write(`[remote] .git is ${(gitBytes / 1024 / 1024).toFixed(0)} MiB (> ${MAX_GIT_BYTES / 1024 / 1024} MiB) — not shipped; ` +
121
+ `restore git in the Pod with 'git fetch'/'git clone' (gh auth is bundled if you pass --with gh)\n`);
122
+ }
123
+ }
124
+ const fileList = Buffer.concat([
125
+ list.stdout,
126
+ sessionState.status === 0 ? sessionState.stdout : Buffer.alloc(0),
127
+ gitDir,
128
+ ]);
129
+ // SECURITY: exclude machine-local secrets even if they slip through
130
+ // git ls-files (e.g. when not in .gitignore). Belt-and-suspenders guard.
131
+ const tar = await runWithStdin("tar", ["-czf", "-", "--exclude=./.claude/settings.local.json", "--null", "-T", "-"], cwd, fileList);
132
+ if (tar.status !== 0)
133
+ throw new Error(`tar failed: ${tar.stderr}`);
134
+ archive = tar.stdout;
135
+ }
136
+ else {
137
+ const tar = await run("tar", [
138
+ "-czf",
139
+ "-",
140
+ "--exclude=./.git",
141
+ "--exclude=./node_modules",
142
+ // SECURITY: exclude machine-local secrets regardless of .gitignore state
143
+ "--exclude=./.claude/settings.local.json",
144
+ ...rootGitignoreExcludes(cwd),
145
+ ".",
146
+ ], cwd);
147
+ if (tar.status !== 0)
148
+ throw new Error(`tar failed: ${tar.stderr}`);
149
+ archive = tar.stdout;
150
+ }
151
+ if (archive.byteLength > MAX_ARCHIVE_BYTES) {
152
+ throw new Error(`workspace archive is ${(archive.byteLength / 1024 / 1024).toFixed(1)} MiB, over the ${MAX_ARCHIVE_BYTES / 1024 / 1024} MiB cap; add large paths to .gitignore`);
153
+ }
154
+ return archive;
155
+ }
156
+ function runWithStdin(command, args, cwd, input) {
157
+ return new Promise((resolve) => {
158
+ const child = spawn(command, [...args], { cwd });
159
+ const stdout = [];
160
+ const stderr = [];
161
+ child.stdout.on("data", (c) => stdout.push(c));
162
+ child.stderr.on("data", (c) => stderr.push(c));
163
+ child.on("error", () => resolve({ status: 127, stdout: Buffer.concat(stdout), stderr: "spawn error" }));
164
+ child.on("close", (code) => resolve({
165
+ status: code ?? 1,
166
+ stdout: Buffer.concat(stdout),
167
+ stderr: Buffer.concat(stderr).toString("utf8"),
168
+ }));
169
+ child.stdin.write(input);
170
+ child.stdin.end();
171
+ });
172
+ }
173
+ export async function uploadWorkspaceArchive(baseUrl, sessionId, archive, fetchImpl = fetch, extraHeaders) {
174
+ const response = await fetchImpl(`${baseUrl.replace(/\/$/, "")}/sessions/${sessionId}/workspace`, {
175
+ method: "POST",
176
+ headers: {
177
+ "content-type": "application/gzip",
178
+ ...authHeaders(),
179
+ ...(extraHeaders ?? {}),
180
+ },
181
+ body: archive,
182
+ });
183
+ if (!response.ok) {
184
+ throw new Error(`workspace upload failed: ${response.status} ${response.statusText}`);
185
+ }
186
+ }
187
+ //# sourceMappingURL=workspace-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-sync.js","sourceRoot":"","sources":["../src/workspace-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ export declare function baseSnapshotPath(cwd: string): string;
2
+ export declare function readBaseSnapshot(cwd: string): Buffer | null;
3
+ export declare function writeBaseSnapshot(cwd: string, archive: Buffer): void;
4
+ export type WorkspaceMarker = {
5
+ readonly remote: string;
6
+ readonly workspaceId: string;
7
+ /**
8
+ * Environment parity (the "feel at home" config): the absolute path the
9
+ * project lives at locally, reproduced as the workspace mount path inside the
10
+ * remote Pod, and the local HOME to reproduce. Captured at link/migrate time
11
+ * so every session bound to this workspace resumes with identical paths.
12
+ */
13
+ readonly path?: string;
14
+ readonly home?: string;
15
+ };
16
+ export declare function markerPath(cwd: string): string;
17
+ export declare function readWorkspaceMarker(cwd: string): WorkspaceMarker | undefined;
18
+ export declare function writeWorkspaceMarker(cwd: string, marker: WorkspaceMarker): void;
19
+ export type LineageRecord = {
20
+ readonly lineageId: string;
21
+ readonly remoteSessionId?: string;
22
+ };
23
+ export declare function readLineageRecord(cwd: string, workspaceId: string): LineageRecord | undefined;
24
+ export declare function writeLineageRecord(cwd: string, workspaceId: string, record: LineageRecord): void;
25
+ type WorkspaceDescriptor = {
26
+ id: string;
27
+ createdAt: string;
28
+ displayName?: string;
29
+ };
30
+ export declare function createWorkspace(baseUrl: string, body?: {
31
+ displayName?: string;
32
+ }, fetchImpl?: typeof fetch): Promise<WorkspaceDescriptor>;
33
+ export declare function listWorkspaces(baseUrl: string, fetchImpl?: typeof fetch): Promise<ReadonlyArray<WorkspaceDescriptor>>;
34
+ export declare function deleteWorkspace(baseUrl: string, workspaceId: string, fetchImpl?: typeof fetch): Promise<boolean>;
35
+ export declare function downloadWorkspaceExport(baseUrl: string, sessionId: string, fetchImpl?: typeof fetch): Promise<Buffer | null>;
36
+ export type LockResult = {
37
+ readonly acquired: true;
38
+ } | {
39
+ readonly acquired: false;
40
+ readonly holder: string;
41
+ readonly since: string;
42
+ };
43
+ export declare function acquireWorkspaceLock(baseUrl: string, workspaceId: string, holder: string, ttlSeconds?: number, fetchImpl?: typeof fetch): Promise<LockResult>;
44
+ export declare function releaseWorkspaceLock(baseUrl: string, workspaceId: string, fetchImpl?: typeof fetch): Promise<void>;
45
+ export declare function lockHolderId(): string;
46
+ export type WorkspaceGcCandidate = {
47
+ readonly id: string;
48
+ readonly sizeH: string;
49
+ readonly lastModified: string;
50
+ readonly archivedTo?: string;
51
+ };
52
+ export type WorkspaceGcReport = {
53
+ readonly candidates: ReadonlyArray<WorkspaceGcCandidate>;
54
+ readonly applied: boolean;
55
+ readonly failed?: ReadonlyArray<{
56
+ readonly id: string;
57
+ readonly reason: string;
58
+ }>;
59
+ };
60
+ /**
61
+ * POST /workspaces/gc. Without `apply` this is a PURE dry-run on the server
62
+ * (the janitor only lists + sizes candidates); with `apply: true` candidates
63
+ * are archived to the volume's own .trash/ before being removed.
64
+ */
65
+ export declare function requestWorkspaceGc(baseUrl: string, body: {
66
+ olderThanDays?: number;
67
+ apply?: boolean;
68
+ }, fetchImpl?: typeof fetch): Promise<WorkspaceGcReport>;
69
+ export {};
70
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}