@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,561 @@
1
+ /**
2
+ * remote migrate — convenience wrapper for round-tripping a local CLI session
3
+ * to a remote (SCW k8s) session and back.
4
+ *
5
+ * Forward (local → remote):
6
+ * 1. Resolve remote URL.
7
+ * 2. Ensure the cwd is linked to a workspace (reads .remote/workspace.json).
8
+ * 3. Push the workspace archive (project files, honours .gitignore).
9
+ * 4. Create a remote session for <profile> bound to that workspace.
10
+ * 5. Hand off the current terminal to the remote session via `attach`.
11
+ * The attach call blocks until the session ends or the user detaches
12
+ * (Ctrl+P Ctrl+Q). There is no separate process to kill — `migrate`
13
+ * itself IS the process holding the terminal, and attach takes it over.
14
+ *
15
+ * Back (remote → local):
16
+ * 1. Resolve URL + workspace.
17
+ * 2. Pull the workspace + conversation state (3-way merge).
18
+ * 3. Restore conversation state to the local HOME.
19
+ * 4. Stop the remote session.
20
+ * 5. Print the exact local CLI command to resume from the restored state.
21
+ * We do NOT spawn the CLI — we print the command so the user can run it.
22
+ */
23
+ import { cpSync, existsSync, mkdirSync, readdirSync, rmSync, statSync, writeFileSync, } from "node:fs";
24
+ import { spawnSync } from "node:child_process";
25
+ import { randomUUID } from "node:crypto";
26
+ import { homedir } from "node:os";
27
+ import { join } from "node:path";
28
+ import { attach, createRemoteSession, stopRemoteSession } from "./attach.js";
29
+ import { coerceCliProfileName, resolveProfile, resumeArgsFor, } from "./profiles.js";
30
+ import { collectProfileAuth } from "./auth-bundle.js";
31
+ import { collectToolAuth } from "./auth-tools.js";
32
+ import { acquireWorkspaceLock, createWorkspace, downloadWorkspaceExport, lockHolderId, readBaseSnapshot, readLineageRecord, readWorkspaceMarker, releaseWorkspaceLock, writeBaseSnapshot, writeLineageRecord, writeWorkspaceMarker, } from "./workspace.js";
33
+ import { buildWorkspaceArchive, uploadWorkspaceArchive, } from "./workspace-sync.js";
34
+ import { mergeWorkspaceArchive } from "./workspace-merge.js";
35
+ import { restoreSessionsToLocal } from "./session-restore.js";
36
+ import { acquireLineageLease, leaseHeaders, releaseLineageLease, } from "./lineage-client.js";
37
+ import { CLI_PROFILES } from "./protocol-local.js";
38
+ // ---------------------------------------------------------------------------
39
+ // Helpers
40
+ // ---------------------------------------------------------------------------
41
+ /**
42
+ * Resolve (or create + link) a workspace for the given cwd.
43
+ * Priority: explicit workspaceId arg > .remote/workspace.json > create new.
44
+ */
45
+ async function resolveOrCreateWorkspace(cwd, remoteUrl, workspaceIdOverride, fetchImpl, stderr) {
46
+ if (workspaceIdOverride) {
47
+ // Honour the override; persist a marker if one doesn't already exist.
48
+ const existing = readWorkspaceMarker(cwd);
49
+ if (existing && existing.workspaceId === workspaceIdOverride) {
50
+ return existing;
51
+ }
52
+ const marker = {
53
+ remote: remoteUrl,
54
+ workspaceId: workspaceIdOverride,
55
+ };
56
+ writeWorkspaceMarker(cwd, marker);
57
+ stderr.write(`[remote] using workspace ${workspaceIdOverride} (from --workspace flag)\n`);
58
+ return marker;
59
+ }
60
+ const existing = readWorkspaceMarker(cwd);
61
+ if (existing) {
62
+ stderr.write(`[remote] cwd mapped to ${existing.workspaceId} (reusing workspace)\n`);
63
+ return existing;
64
+ }
65
+ // Create and link a new workspace.
66
+ const ws = await createWorkspace(remoteUrl, {}, fetchImpl);
67
+ const marker = { remote: remoteUrl, workspaceId: ws.id };
68
+ writeWorkspaceMarker(cwd, marker);
69
+ stderr.write(`[remote] created workspace ${ws.id} and linked to ${cwd}\n`);
70
+ return marker;
71
+ }
72
+ /**
73
+ * Build the resume startupArgs for a profile, given a session id (or true for
74
+ * the most-recent session).
75
+ */
76
+ function buildResumeStartupArgs(profileName, resume) {
77
+ const config = resolveProfile(profileName);
78
+ return resumeArgsFor(config, resume);
79
+ }
80
+ /**
81
+ * Profile conversation dirs (HOME-relative), mirrored from the session-agent's
82
+ * restore mapping (`<workspace>/.remote/sessions/<profile>/<relDir>` →
83
+ * `<home>/<relDir>`).
84
+ */
85
+ const PROFILE_STATE_DIRS = {
86
+ claude: ".claude/projects",
87
+ };
88
+ const STATE_SUBDIR = ".remote/sessions";
89
+ /**
90
+ * Stage the live (most-recent) local conversation for `cwd` into the workspace
91
+ * under `.remote/sessions/<profile>/<relDir>/<projectDir>` so it rides the
92
+ * pushed archive and the session-agent restores it into the Pod's HOME — so the
93
+ * remote CLI `--resume` picks up exactly where the local session left off.
94
+ *
95
+ * Uses claude's cwd→dir encoding (slashes → dashes). With path parity (the
96
+ * Pod's cwd equals `cwd`) the remote CLI derives the identical project dir name,
97
+ * so the staged conversation is found on resume. Returns the staged conversation
98
+ * id (filename stem), or undefined if nothing was captured.
99
+ */
100
+ /**
101
+ * Most-recent local conversation id for `cwd` (the active session), or
102
+ * undefined. Used to pass the exact id to the remote CLI's `--resume <id>` so it
103
+ * resumes directly instead of showing the interactive picker.
104
+ */
105
+ function newestLocalConvId(cwd, profile, home) {
106
+ const relDir = PROFILE_STATE_DIRS[profile];
107
+ if (!relDir)
108
+ return undefined;
109
+ const src = join(home, relDir, cwd.replace(/\//g, "-"));
110
+ if (!existsSync(src))
111
+ return undefined;
112
+ let newest;
113
+ for (const e of readdirSync(src, { withFileTypes: true })) {
114
+ if (e.isFile() && e.name.endsWith(".jsonl")) {
115
+ const m = statSync(join(src, e.name)).mtimeMs;
116
+ if (!newest || m > newest.mtime)
117
+ newest = { name: e.name, mtime: m };
118
+ }
119
+ }
120
+ return newest?.name.replace(/\.jsonl$/, "");
121
+ }
122
+ function captureLiveConversation(cwd, profile, home, stderr) {
123
+ const relDir = PROFILE_STATE_DIRS[profile];
124
+ if (!relDir)
125
+ return undefined; // only claude's path-encoded projects for now
126
+ const projectDir = cwd.replace(/\//g, "-");
127
+ const src = join(home, relDir, projectDir);
128
+ if (!existsSync(src))
129
+ return undefined;
130
+ let newest;
131
+ for (const e of readdirSync(src, { withFileTypes: true })) {
132
+ if (e.isFile() && e.name.endsWith(".jsonl")) {
133
+ const m = statSync(join(src, e.name)).mtimeMs;
134
+ if (!newest || m > newest.mtime)
135
+ newest = { name: e.name, mtime: m };
136
+ }
137
+ }
138
+ if (!newest)
139
+ return undefined;
140
+ const dstDir = join(cwd, STATE_SUBDIR, profile, relDir, projectDir);
141
+ rmSync(join(cwd, STATE_SUBDIR, profile), { recursive: true, force: true });
142
+ mkdirSync(dstDir, { recursive: true });
143
+ // Stage only the main conversation .jsonl — it holds the full conversation.
144
+ // The companion `<convId>/` dir (subagent transcripts) is auxiliary, only used
145
+ // to expand subagent detail, and can be huge; skip it to stay lean (the remote
146
+ // archive has a size cap and rides a fragile port-forward).
147
+ cpSync(join(src, newest.name), join(dstDir, newest.name));
148
+ const convId = newest.name.replace(/\.jsonl$/, "");
149
+ stderr.write(`[remote] captured live ${profile} conversation ${convId} for resume\n`);
150
+ return convId;
151
+ }
152
+ /**
153
+ * Record the repo's origin/branch/HEAD into `<cwd>/.remote/git.json` so the
154
+ * session-agent can bootstrap git in the Pod (clone-on-start) when the full
155
+ * `.git` was too big to ship — the Pod fetches history from origin (gh auth is
156
+ * bundled) instead of transferring it. No-op outside a git repo / without an
157
+ * origin remote.
158
+ */
159
+ function writeGitMetadata(cwd, stderr) {
160
+ const git = (args) => {
161
+ const r = spawnSync("git", args, { cwd, encoding: "utf8" });
162
+ return r.status === 0 ? r.stdout.trim() : "";
163
+ };
164
+ const origin = git(["remote", "get-url", "origin"]);
165
+ if (!origin)
166
+ return;
167
+ const branch = git(["rev-parse", "--abbrev-ref", "HEAD"]);
168
+ const head = git(["rev-parse", "HEAD"]);
169
+ try {
170
+ mkdirSync(join(cwd, ".remote"), { recursive: true });
171
+ writeFileSync(join(cwd, ".remote", "git.json"), JSON.stringify({ origin, branch, head }, null, 2), "utf8");
172
+ stderr.write(`[remote] recorded git origin for clone-on-start: ${origin} (${branch || "HEAD"})\n`);
173
+ }
174
+ catch {
175
+ // best-effort
176
+ }
177
+ }
178
+ /**
179
+ * Friendly project name for display in `remote ls`/`status`/`secrets`: the short
180
+ * GitHub repo name (last segment of origin) if it's a git repo, else the source
181
+ * directory basename.
182
+ */
183
+ function friendlyName(cwd) {
184
+ const r = spawnSync("git", ["remote", "get-url", "origin"], {
185
+ cwd,
186
+ encoding: "utf8",
187
+ });
188
+ const origin = r.status === 0 ? r.stdout.trim() : "";
189
+ const m = origin ? /([^/:]+?)(?:\.git)?$/.exec(origin) : null;
190
+ if (m && m[1])
191
+ return m[1];
192
+ return cwd.replace(/\/+$/, "").split("/").pop() ?? cwd;
193
+ }
194
+ /**
195
+ * Push workspace project files to the remote, reusing the same pattern as
196
+ * `workspace push` in index.ts.
197
+ */
198
+ async function pushWorkspace(cwd, remoteUrl, workspaceId, fetchImpl, stderr, leaseHdrs) {
199
+ await acquireWorkspaceLock(remoteUrl, workspaceId, lockHolderId(), 300, fetchImpl);
200
+ try {
201
+ stderr.write(`[remote] packing ${cwd} (respecting .gitignore)\n`);
202
+ const archive = await buildWorkspaceArchive(cwd);
203
+ stderr.write(`[remote] archive: ${(archive.byteLength / 1024).toFixed(0)} KiB -> ${workspaceId}\n`);
204
+ // Use a throwaway shell session to seed the PVC.
205
+ const session = await createRemoteSession(remoteUrl, {
206
+ profile: "shell",
207
+ workspaceId,
208
+ workspaceSync: true,
209
+ startupArgs: ["-c", "exit 0"],
210
+ }, fetchImpl);
211
+ await uploadWorkspaceArchive(remoteUrl, session.id, archive, fetchImpl, leaseHdrs);
212
+ const attached = await attach({
213
+ baseUrl: remoteUrl,
214
+ sessionId: session.id,
215
+ fetchImpl,
216
+ });
217
+ await attached.finished;
218
+ writeBaseSnapshot(cwd, archive);
219
+ stderr.write(`[remote] pushed ${cwd} to ${workspaceId}\n`);
220
+ return archive;
221
+ }
222
+ finally {
223
+ await releaseWorkspaceLock(remoteUrl, workspaceId, fetchImpl);
224
+ }
225
+ }
226
+ /**
227
+ * Pull workspace project files + session state from the remote, using the same
228
+ * pattern as `workspace pull --restore-sessions` in index.ts.
229
+ */
230
+ async function pullWorkspace(cwd, home, remoteUrl, workspaceId, onConflict, fetchImpl, stderr) {
231
+ await acquireWorkspaceLock(remoteUrl, workspaceId, lockHolderId(), 300, fetchImpl);
232
+ try {
233
+ const session = await createRemoteSession(remoteUrl, {
234
+ profile: "shell",
235
+ workspaceId,
236
+ workspaceExport: true,
237
+ startupArgs: ["-c", "sleep 120"],
238
+ }, fetchImpl);
239
+ let remoteArchive = null;
240
+ try {
241
+ for (let attempt = 0; attempt < 60; attempt++) {
242
+ remoteArchive = await downloadWorkspaceExport(remoteUrl, session.id, fetchImpl);
243
+ if (remoteArchive)
244
+ break;
245
+ await new Promise((r) => setTimeout(r, 1000));
246
+ }
247
+ }
248
+ finally {
249
+ await stopRemoteSession(remoteUrl, session.id, "pull-complete", fetchImpl);
250
+ }
251
+ if (!remoteArchive) {
252
+ stderr.write(`[remote] nothing to pull (workspace ${workspaceId} produced no export)\n`);
253
+ return { remoteArchive: null, hasConflicts: false };
254
+ }
255
+ const mergeResult = mergeWorkspaceArchive({
256
+ cwd,
257
+ remoteArchive,
258
+ baseArchive: readBaseSnapshot(cwd),
259
+ });
260
+ stderr.write(`[remote] pull: ${mergeResult.tookRemote.length} from remote, ${mergeResult.keptLocal.length} kept local, ${mergeResult.merged.length} merged\n`);
261
+ let hasConflicts = false;
262
+ if (mergeResult.conflicts.length > 0) {
263
+ stderr.write(`[remote] ${mergeResult.conflicts.length} conflict(s) (left with markers, resolve then re-run):\n`);
264
+ for (const f of mergeResult.conflicts)
265
+ stderr.write(` ${f}\n`);
266
+ hasConflicts = true;
267
+ }
268
+ else {
269
+ writeBaseSnapshot(cwd, remoteArchive);
270
+ stderr.write(`[remote] pulled ${workspaceId} into ${cwd}\n`);
271
+ }
272
+ // Restore conversation state.
273
+ let anySessionConflict = false;
274
+ for (const profile of CLI_PROFILES) {
275
+ const r = restoreSessionsToLocal({
276
+ home,
277
+ profile,
278
+ remoteArchive,
279
+ onConflict,
280
+ });
281
+ const touched = r.restored.length + r.backedUp.length + r.conflicts.length;
282
+ if (touched === 0 && r.keptLocal.length === 0)
283
+ continue;
284
+ stderr.write(`[remote] sessions(${profile}): ${r.restored.length} restored, ${r.backedUp.length} backed-up, ${r.keptLocal.length} kept, ${r.conflicts.length} conflict\n`);
285
+ for (const b of r.backedUp)
286
+ stderr.write(` backup ${b}\n`);
287
+ if (r.conflicts.length > 0) {
288
+ anySessionConflict = true;
289
+ for (const c of r.conflicts)
290
+ stderr.write(` conflict ${c}\n`);
291
+ }
292
+ }
293
+ if (anySessionConflict) {
294
+ stderr.write(`[remote] diverged conversations left untouched. Re-run with --on-conflict backup or keep-local.\n`);
295
+ hasConflicts = true;
296
+ }
297
+ return { remoteArchive, hasConflicts };
298
+ }
299
+ finally {
300
+ await releaseWorkspaceLock(remoteUrl, workspaceId, fetchImpl);
301
+ }
302
+ }
303
+ // ---------------------------------------------------------------------------
304
+ // Public API
305
+ // ---------------------------------------------------------------------------
306
+ /**
307
+ * Forward: migrate the current local session to a remote k8s session.
308
+ *
309
+ * Steps: link workspace → push files → create remote session → attach terminal.
310
+ *
311
+ * Terminal handoff: `migrateForward` calls `attach`, which hijacks the current
312
+ * process's stdin/stdout in raw mode and blocks until the remote session ends
313
+ * or the user presses Ctrl+P Ctrl+Q to detach. There is no separate process
314
+ * involved — this function IS the process holding the terminal.
315
+ */
316
+ export async function migrateForward(options) {
317
+ const { profile: profileName, remoteUrl, resume, fetchImpl = fetch, cwd = process.cwd(), stderr = process.stderr, } = options;
318
+ const profile = coerceCliProfileName(profileName);
319
+ if (!profile) {
320
+ throw new Error(`Unknown profile "${profileName}". Known: codex, claude, agy, gemini, mistral, opencode, shell`);
321
+ }
322
+ // Step 1: ensure workspace is linked.
323
+ const marker = await resolveOrCreateWorkspace(cwd, remoteUrl, options.workspaceId, fetchImpl, stderr);
324
+ // Environment parity ("feel at home"): the project mounts at its real local
325
+ // path inside the Pod and HOME is reproduced, so the resumed conversation's
326
+ // absolute paths (cwd, file refs) resolve identically. Persisted on the
327
+ // workspace marker so every session bound to it is path-identical.
328
+ const home = marker.home ?? homedir();
329
+ const workspacePath = marker.path ?? cwd;
330
+ if (marker.path === undefined || marker.home === undefined) {
331
+ writeWorkspaceMarker(cwd, { ...marker, path: workspacePath, home });
332
+ }
333
+ // Resume the EXACT conversation by id so the remote CLI loads it directly
334
+ // instead of showing its interactive picker. `resume === true` ("most recent")
335
+ // is resolved to the local conversation id — which matches what the agent
336
+ // restores in the Pod thanks to path parity (same project-dir encoding).
337
+ let resolvedResume = resume;
338
+ if (resume === true) {
339
+ const cid = newestLocalConvId(cwd, profile, home);
340
+ if (cid)
341
+ resolvedResume = cid;
342
+ }
343
+ if (options.reconnect) {
344
+ // Revive on the existing PVC: no capture, no push — the conversation and any
345
+ // work done remotely are already on the retained workspace volume.
346
+ stderr.write(`[remote] reconnect: reusing workspace ${marker.workspaceId} as-is (no push)\n`);
347
+ }
348
+ else {
349
+ // Record git origin so the Pod can clone-on-start when .git is too big to
350
+ // ship (the size-gate in buildWorkspaceArchive skips large histories).
351
+ writeGitMetadata(cwd, stderr);
352
+ // When resuming, stage the live conversation so it rides the pushed archive
353
+ // and the session-agent restores it into HOME — the remote CLI then resumes
354
+ // exactly where the local session left off (path parity makes the project
355
+ // dir encoding match on both sides).
356
+ if (resume !== undefined) {
357
+ captureLiveConversation(cwd, profile, home, stderr);
358
+ }
359
+ // Step 2 & 3: push workspace, protected by a lineage lease (A0c fencing).
360
+ // Phase A: read or create a persistent lineageId in .remote/lineages/ so
361
+ // the same id is reused across forward/back cycles for this workspace.
362
+ let lineageRec = readLineageRecord(cwd, marker.workspaceId) ??
363
+ { lineageId: `lin_${randomUUID().replace(/-/g, "").slice(0, 24)}` };
364
+ writeLineageRecord(cwd, marker.workspaceId, lineageRec);
365
+ const lineageId = lineageRec.lineageId;
366
+ const holder = lockHolderId();
367
+ const incarnationId = `${holder}:${process.pid}`;
368
+ let activeLease;
369
+ try {
370
+ const result = await acquireLineageLease(remoteUrl, { lineageId, holder, incarnationId, location: "local", ttlMs: 300_000 }, fetchImpl);
371
+ if ("error" in result) {
372
+ throw new Error(`[remote] workspace is already being migrated (concurrent push detected).\n` +
373
+ ` Current holder: ${result.current.holder}\n` +
374
+ ` Wait for the other migration to complete, or release the lease manually.`);
375
+ }
376
+ activeLease = result;
377
+ }
378
+ catch (err) {
379
+ const msg = err.message;
380
+ // Graceful fallback: if the CP doesn't have the lineage-leases route yet
381
+ // (404) or is unreachable, skip enforcement (backward compat).
382
+ if (msg.includes("acquireLineageLease: 404") || msg.includes("ECONNREFUSED") || msg.includes("ENOTFOUND")) {
383
+ stderr.write(`[remote] lineage lease skipped (CP missing route or unreachable)\n`);
384
+ }
385
+ else {
386
+ throw err;
387
+ }
388
+ }
389
+ try {
390
+ await pushWorkspace(cwd, remoteUrl, marker.workspaceId, fetchImpl, stderr, activeLease ? leaseHeaders(activeLease) : undefined);
391
+ }
392
+ finally {
393
+ if (activeLease) {
394
+ // Release the lease now that the push is complete. The remote session
395
+ // will acquire its own lease when it starts writing (Phase A wires this
396
+ // into the session-agent). Idempotent — errors are swallowed.
397
+ await releaseLineageLease(remoteUrl, activeLease.lineageId, { holder, expectedEpoch: activeLease.epoch }, fetchImpl).catch(() => undefined);
398
+ }
399
+ }
400
+ }
401
+ // Step 4: create remote session. Bundle the profile's local credentials so
402
+ // the migrated CLI is authenticated in-pod, mirroring the `remote <profile>`
403
+ // run path. Missing creds are tolerated (the session still starts; shell /
404
+ // opencode need none) — we warn rather than hard-fail.
405
+ const authFiles = {
406
+ ...(await collectProfileAuth(profile)),
407
+ };
408
+ // Also bundle the auth of selected tool CLIs (scw, gh, aws, gcloud, az) so
409
+ // they work inside the Pod — opt-in via `tools`.
410
+ let bundledTools = [];
411
+ if (options.tools && options.tools.length > 0) {
412
+ const { bundle: toolBundle, bundled } = await collectToolAuth(options.tools);
413
+ Object.assign(authFiles, toolBundle);
414
+ bundledTools = bundled;
415
+ }
416
+ const credentials = Object.keys(authFiles).length > 0 ? authFiles : undefined;
417
+ const resumeArgs = resolvedResume !== undefined
418
+ ? buildResumeStartupArgs(profile, resolvedResume)
419
+ : [];
420
+ const session = await createRemoteSession(remoteUrl, {
421
+ profile,
422
+ workspaceId: marker.workspaceId,
423
+ workspacePath,
424
+ home,
425
+ displayName: friendlyName(cwd),
426
+ workspaceSync: true,
427
+ ...(credentials ? { credentials } : {}),
428
+ ...(resumeArgs.length > 0 ? { startupArgs: resumeArgs } : {}),
429
+ }, fetchImpl);
430
+ stderr.write(credentials
431
+ ? `[remote] bundled ${profile} creds: ${Object.keys(credentials).join(", ")}\n`
432
+ : `[remote] no ${profile} creds found locally — session starts unauthenticated\n`);
433
+ if (bundledTools.length > 0) {
434
+ stderr.write(`[remote] bundled tool auth: ${bundledTools.join(", ")}\n`);
435
+ }
436
+ stderr.write(`[remote] migrated to remote session ${session.id} on ${remoteUrl} (workspace ${marker.workspaceId})\n`);
437
+ // Phase A: record the active remote session so migrateBack can target it
438
+ // directly without a list-sessions round-trip.
439
+ if (!options.reconnect) {
440
+ // lineageRec may be undefined if the push was skipped (reconnect path) or
441
+ // if the lease acquisition fell back (old CP). Read fresh to avoid closure issues.
442
+ const rec = readLineageRecord(cwd, marker.workspaceId);
443
+ if (rec) {
444
+ writeLineageRecord(cwd, marker.workspaceId, {
445
+ ...rec,
446
+ remoteSessionId: session.id,
447
+ });
448
+ }
449
+ }
450
+ // Step 5: hand off terminal — unless --no-attach (bulk / reconnect-yourself).
451
+ if (options.noAttach) {
452
+ stderr.write(`[remote] session ready (not attached). Reconnect your terminal with:\n` +
453
+ ` remote attach ${remoteUrl} ${session.id}\n`);
454
+ return { workspaceId: marker.workspaceId, sessionId: session.id };
455
+ }
456
+ stderr.write(`[remote] terminal is now REMOTE — press Ctrl+P Ctrl+Q to detach without stopping the session\n`);
457
+ const attached = await attach({
458
+ baseUrl: remoteUrl,
459
+ sessionId: session.id,
460
+ fetchImpl,
461
+ });
462
+ await attached.finished;
463
+ return { workspaceId: marker.workspaceId, sessionId: session.id };
464
+ }
465
+ /**
466
+ * Back: pull the remote session back to local.
467
+ *
468
+ * Steps: pull workspace + conversation state → stop remote session → print
469
+ * resume command.
470
+ *
471
+ * We do NOT spawn the local CLI — we print the resume command so the user
472
+ * retains control of when and how they restart.
473
+ */
474
+ export async function migrateBack(options) {
475
+ const { remoteUrl, onConflict = "block", fetchImpl = fetch, cwd = process.cwd(), home = process.env.HOME ?? "", stderr = process.stderr, stdout = process.stdout, } = options;
476
+ // Step 1: resolve workspace.
477
+ const existing = readWorkspaceMarker(cwd);
478
+ const workspaceId = options.workspaceId ?? existing?.workspaceId;
479
+ if (!workspaceId) {
480
+ throw new Error("No workspace mapped for this directory and no --workspace given. Run `remote workspace link` first or pass --workspace <id>.");
481
+ }
482
+ // Step 2: pull workspace + conversation state.
483
+ const { remoteArchive, hasConflicts } = await pullWorkspace(cwd, home, remoteUrl, workspaceId, onConflict, fetchImpl, stderr);
484
+ // Phase A: read the lineage record so we can target the exact session that
485
+ // was created by migrateForward, skipping the list-sessions round-trip.
486
+ const lineageRec = readLineageRecord(cwd, workspaceId);
487
+ // Step 3: stop the remote session for this workspace.
488
+ let stoppedSessionId;
489
+ try {
490
+ const { listRemoteSessions } = await import("./attach.js");
491
+ // Priority: explicit sessionId arg > lineage record > list-sessions heuristic.
492
+ let target;
493
+ if (options.sessionId) {
494
+ target = { id: options.sessionId };
495
+ }
496
+ else if (lineageRec?.remoteSessionId) {
497
+ target = { id: lineageRec.remoteSessionId };
498
+ stderr.write(`[remote] targeting session ${target.id} from lineage record\n`);
499
+ }
500
+ else {
501
+ const sessions = await listRemoteSessions(remoteUrl, fetchImpl);
502
+ if (sessions.length > 0) {
503
+ const sorted = [...sessions].sort((a, b) => b.createdAt.localeCompare(a.createdAt));
504
+ target =
505
+ sorted.find((s) => s.workspaceId === workspaceId) ?? sorted[0];
506
+ }
507
+ }
508
+ if (target !== undefined) {
509
+ await stopRemoteSession(remoteUrl, target.id, "migrate-back", fetchImpl);
510
+ stoppedSessionId = target.id;
511
+ stderr.write(`[remote] stopped remote session ${target.id}\n`);
512
+ // Clear the active session from the lineage record — the migration is done.
513
+ if (lineageRec) {
514
+ writeLineageRecord(cwd, workspaceId, { lineageId: lineageRec.lineageId });
515
+ }
516
+ }
517
+ }
518
+ catch (err) {
519
+ stderr.write(`[remote] warning: could not stop remote session: ${String(err)}\n`);
520
+ }
521
+ // Step 4: derive and print resume command.
522
+ // Pick a profile from the restored archive — use the first CLI profile that
523
+ // has session state in the archive; fall back to the session's profile if
524
+ // available.
525
+ let resumeProfile;
526
+ let resumeConvId;
527
+ if (remoteArchive) {
528
+ // Peek at which profiles have session state in the archive.
529
+ // (restoreSessionsToLocal already ran — we just need to know the profile.)
530
+ for (const p of CLI_PROFILES) {
531
+ const r = restoreSessionsToLocal({
532
+ home,
533
+ profile: p,
534
+ remoteArchive,
535
+ onConflict: "keep-local", // dry-run: don't overwrite again
536
+ });
537
+ // Pick profile that has the most restored/kept items.
538
+ if (r.restored.length + r.keptLocal.length > 0) {
539
+ resumeProfile = p;
540
+ // The restored conversation id is not trivially extractable here;
541
+ // we fall back to the generic --resume / --continue flag without an id.
542
+ break;
543
+ }
544
+ }
545
+ }
546
+ const finalProfile = resumeProfile ?? "claude";
547
+ // Advice string: the ACTUAL CLI command shape (remote run … -r <id>), not a
548
+ // raw profile flag — codex's resume is a subcommand, claude's differs by id.
549
+ const resumeCommand = resumeConvId
550
+ ? `remote run ${finalProfile} -r ${resumeConvId}`
551
+ : `remote run ${finalProfile}`;
552
+ stdout.write(`\n[remote] local state restored from workspace ${workspaceId}\n`);
553
+ stdout.write(`[remote] resume your session with:\n\n ${resumeCommand}\n\n`);
554
+ return {
555
+ workspaceId,
556
+ ...(stoppedSessionId !== undefined ? { stoppedSessionId } : {}),
557
+ resumeCommand,
558
+ hasConflicts,
559
+ };
560
+ }
561
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}