@viraatdas/rudder 3.0.3 → 3.1.3
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.
- package/README.md +14 -6
- package/dist/cloud.d.ts +19 -0
- package/dist/cloud.js +346 -12
- package/dist/cloud.js.map +1 -1
- package/dist/jj.d.ts +17 -0
- package/dist/jj.js +2 -2
- package/dist/jj.js.map +1 -1
- package/dist/main.js +41 -2
- package/dist/main.js.map +1 -1
- package/dist/move-home.d.ts +80 -0
- package/dist/move-home.js +418 -0
- package/dist/move-home.js.map +1 -0
- package/dist/native/darwin-arm64/rudder-native +0 -0
- package/dist/native/darwin-x64/rudder-native +0 -0
- package/dist/native/linux-x64/rudder-native +0 -0
- package/package.json +1 -1
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
// Moving live agents from this laptop to the home machine.
|
|
2
|
+
//
|
|
3
|
+
// The home machine clones every repo from GitHub, so it already has whatever
|
|
4
|
+
// is pushed. What it does not have is an agent's IN-PROGRESS work: the jj
|
|
5
|
+
// change in its isolated workspace (often on top of local-only integration
|
|
6
|
+
// changes) and its conversation. A move carries exactly those, and nothing is
|
|
7
|
+
// pushed to GitHub to do it:
|
|
8
|
+
//
|
|
9
|
+
// laptop buildMoveBundle: one git bundle holding every moving agent's @
|
|
10
|
+
// commit (minus what origin's default branch already has), each
|
|
11
|
+
// agent's run.json, and its Claude transcript or Codex rollout.
|
|
12
|
+
// home adoptMovedAgents: fetch the bundle into the project's clone, give
|
|
13
|
+
// each agent a jj workspace whose @ IS the moved commit (so `jj diff`
|
|
14
|
+
// there shows the same work), place the session where `claude
|
|
15
|
+
// --resume` / `codex resume` look for it, and write a paused run.json
|
|
16
|
+
// the dashboard resumes when it is told to adopt it.
|
|
17
|
+
//
|
|
18
|
+
// The dashboard on the laptop decides nothing about success: a row is moved
|
|
19
|
+
// when the CLI has written `migrated` into its run.json, which happens only
|
|
20
|
+
// after the home machine reported the agent staged.
|
|
21
|
+
import fsp from "node:fs/promises";
|
|
22
|
+
import os from "node:os";
|
|
23
|
+
import path from "node:path";
|
|
24
|
+
import { currentJjChangeId, currentJjCommitId, ensureColocated, jjWriteWithStaleRecovery, workspaceNameFor, } from "./jj.js";
|
|
25
|
+
import { buildFreshHandoffPrompt, encodeClaudeProjectsCwd } from "./migration.js";
|
|
26
|
+
import { adoptLegacyWorkspaceKey, AGENT_WORKSPACES_DIR, LEGACY_AGENT_WORKSPACES_DIR, workspacePath } from "./state.js";
|
|
27
|
+
import { ensureDir, nowIso, pathExists, readJson, runCommand, shortHash, writeJson } from "./util.js";
|
|
28
|
+
export const MOVE_BUNDLE_VERSION = 1;
|
|
29
|
+
const MOVE_REF_PREFIX = "refs/rudder-move/";
|
|
30
|
+
/** Statuses a run can be in and still be worth moving: work not yet finished. */
|
|
31
|
+
const MOVABLE_STATUSES = new Set(["running", "created", "steering", "verifying", "paused", "orphaned"]);
|
|
32
|
+
/**
|
|
33
|
+
* Local agents that can move: unfinished runs with an isolated workspace that
|
|
34
|
+
* still exists. Main-checkout rows, planners and cloud-command rows point at
|
|
35
|
+
* the repo root rather than a workspace of their own, so they never qualify.
|
|
36
|
+
* With `runIds`, only those (a named run that does not qualify is an error the
|
|
37
|
+
* caller reports, not something to drop silently).
|
|
38
|
+
*/
|
|
39
|
+
export async function findMoveCandidates(repoRoot, runIds) {
|
|
40
|
+
const runsDir = path.join(repoRoot, ".rudder", "runs");
|
|
41
|
+
const names = runIds && runIds.length > 0
|
|
42
|
+
? runIds
|
|
43
|
+
: (await fsp.readdir(runsDir, { withFileTypes: true }).catch(() => []))
|
|
44
|
+
.filter((entry) => entry.isDirectory())
|
|
45
|
+
.map((entry) => entry.name);
|
|
46
|
+
const out = [];
|
|
47
|
+
for (const name of names) {
|
|
48
|
+
if (!/^[A-Za-z0-9._-]+$/.test(name)) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const record = await readJson(path.join(runsDir, name, "run.json"));
|
|
52
|
+
if (!record || record.id !== name) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
adoptLegacyWorkspaceKey(record);
|
|
56
|
+
const status = String(record.status ?? "");
|
|
57
|
+
const workspace = (record.workspace ?? {});
|
|
58
|
+
const workspaceDir = typeof workspace.path === "string" ? workspace.path : "";
|
|
59
|
+
if (!MOVABLE_STATUSES.has(status) || workspace.enabled !== true || !workspaceDir) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (path.resolve(workspaceDir) === path.resolve(repoRoot) || !(await pathExists(workspaceDir))) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const session = (record.session ?? {});
|
|
66
|
+
out.push({
|
|
67
|
+
runId: name,
|
|
68
|
+
task: String(record.task ?? ""),
|
|
69
|
+
taskSummary: typeof record.taskSummary === "string" ? record.taskSummary : undefined,
|
|
70
|
+
backend: String(record.backend ?? "claude"),
|
|
71
|
+
status,
|
|
72
|
+
workspacePath: workspaceDir,
|
|
73
|
+
workspaceName: typeof workspace.workspaceName === "string" ? workspace.workspaceName : undefined,
|
|
74
|
+
sessionId: typeof session.nativeSessionId === "string" && session.nativeSessionId.trim()
|
|
75
|
+
? session.nativeSessionId.trim()
|
|
76
|
+
: undefined,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
/** Where `codex resume` finds a session: ~/.codex/sessions/<y>/<m>/<d>/rollout-…-<id>.jsonl. */
|
|
82
|
+
export function codexSessionsDir() {
|
|
83
|
+
const codexHome = process.env.CODEX_HOME?.trim() || path.join(os.homedir(), ".codex");
|
|
84
|
+
return path.join(codexHome, "sessions");
|
|
85
|
+
}
|
|
86
|
+
export async function findCodexRollout(sessionId, root = codexSessionsDir()) {
|
|
87
|
+
if (!/^[A-Za-z0-9-]+$/.test(sessionId)) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
// Newest directories first: a live agent's rollout is recent.
|
|
91
|
+
async function walk(dir, depth) {
|
|
92
|
+
const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);
|
|
93
|
+
const sorted = entries.sort((a, b) => b.name.localeCompare(a.name));
|
|
94
|
+
for (const entry of sorted) {
|
|
95
|
+
const full = path.join(dir, entry.name);
|
|
96
|
+
if (entry.isDirectory() && depth < 4) {
|
|
97
|
+
const found = await walk(full, depth + 1);
|
|
98
|
+
if (found) {
|
|
99
|
+
return found;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (entry.isFile() && entry.name.startsWith("rollout-") && entry.name.endsWith(`${sessionId}.jsonl`)) {
|
|
103
|
+
return full;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
return await walk(root, 0);
|
|
109
|
+
}
|
|
110
|
+
/** The ref that should not travel in the bundle: what origin's default branch already has. */
|
|
111
|
+
async function originDefaultRef(repoRoot) {
|
|
112
|
+
const head = await runCommand("git", ["symbolic-ref", "-q", "refs/remotes/origin/HEAD"], { cwd: repoRoot, allowFailure: true });
|
|
113
|
+
const candidates = [head.stdout.trim(), "refs/remotes/origin/main", "refs/remotes/origin/master"].filter(Boolean);
|
|
114
|
+
for (const ref of candidates) {
|
|
115
|
+
const exists = await runCommand("git", ["rev-parse", "--verify", "-q", ref], { cwd: repoRoot, allowFailure: true });
|
|
116
|
+
if (exists.code === 0) {
|
|
117
|
+
return ref;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
function isInside(parent, child) {
|
|
123
|
+
const relative = path.relative(path.resolve(parent), path.resolve(child));
|
|
124
|
+
return relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative));
|
|
125
|
+
}
|
|
126
|
+
function moveRefFor(runId) {
|
|
127
|
+
return `${MOVE_REF_PREFIX}${runId.replace(/[^A-Za-z0-9._-]/g, "-")}`;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Stage everything the home machine needs to continue `candidates` into
|
|
131
|
+
* `stageDir` (the caller tars it). The agents must already be quiesced: the
|
|
132
|
+
* commit captured here is what moves, and edits made after it stay behind.
|
|
133
|
+
*/
|
|
134
|
+
export async function buildMoveBundle(repoRoot, candidates, stageDir) {
|
|
135
|
+
if (candidates.length === 0) {
|
|
136
|
+
throw new Error("no agents to move");
|
|
137
|
+
}
|
|
138
|
+
await ensureDir(path.join(stageDir, "runs"));
|
|
139
|
+
await ensureDir(path.join(stageDir, "sessions"));
|
|
140
|
+
const agents = [];
|
|
141
|
+
const refs = [];
|
|
142
|
+
try {
|
|
143
|
+
for (const candidate of candidates) {
|
|
144
|
+
// Reading @ snapshots the workspace, so the commit includes every edit
|
|
145
|
+
// the agent made before it was paused.
|
|
146
|
+
const commit = await currentJjCommitId(candidate.workspacePath);
|
|
147
|
+
if (!/^[0-9a-f]{40}$/.test(commit)) {
|
|
148
|
+
throw new Error(`could not read the jj change in ${candidate.workspacePath}`);
|
|
149
|
+
}
|
|
150
|
+
const ref = moveRefFor(candidate.runId);
|
|
151
|
+
await runCommand("git", ["update-ref", ref, commit], { cwd: repoRoot });
|
|
152
|
+
refs.push(ref);
|
|
153
|
+
const runJsonSource = path.join(repoRoot, ".rudder", "runs", candidate.runId, "run.json");
|
|
154
|
+
await fsp.cp(runJsonSource, path.join(stageDir, "runs", `${candidate.runId}.json`));
|
|
155
|
+
let sessionFile;
|
|
156
|
+
let codexRolloutPath;
|
|
157
|
+
if (candidate.sessionId && candidate.backend === "claude") {
|
|
158
|
+
const jsonl = path.join(os.homedir(), ".claude", "projects", encodeClaudeProjectsCwd(path.resolve(candidate.workspacePath)), `${candidate.sessionId}.jsonl`);
|
|
159
|
+
if (await pathExists(jsonl)) {
|
|
160
|
+
sessionFile = path.posix.join("sessions", `${candidate.runId}.jsonl`);
|
|
161
|
+
await fsp.cp(jsonl, path.join(stageDir, sessionFile));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (candidate.sessionId && candidate.backend === "codex") {
|
|
165
|
+
const rollout = await findCodexRollout(candidate.sessionId);
|
|
166
|
+
if (rollout) {
|
|
167
|
+
sessionFile = path.posix.join("sessions", `${candidate.runId}.jsonl`);
|
|
168
|
+
codexRolloutPath = path.relative(codexSessionsDir(), rollout).split(path.sep).join("/");
|
|
169
|
+
await fsp.cp(rollout, path.join(stageDir, sessionFile));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
let freshPrompt;
|
|
173
|
+
if (!sessionFile) {
|
|
174
|
+
const record = await readJson(runJsonSource);
|
|
175
|
+
const asCandidate = {
|
|
176
|
+
runId: candidate.runId,
|
|
177
|
+
task: candidate.task,
|
|
178
|
+
taskSummary: candidate.taskSummary,
|
|
179
|
+
backend: candidate.backend,
|
|
180
|
+
};
|
|
181
|
+
freshPrompt = buildFreshHandoffPrompt(asCandidate, Array.isArray(record?.turns) ? record.turns : [])
|
|
182
|
+
.replace("The earlier conversation transcript is not available. Re-establish context from the repo state and continue.", "The earlier conversation transcript is not available, but your work so far is in this workspace: run `jj diff` to see it, then continue.");
|
|
183
|
+
}
|
|
184
|
+
const relative = path.relative(repoRoot, candidate.workspacePath);
|
|
185
|
+
agents.push({
|
|
186
|
+
runId: candidate.runId,
|
|
187
|
+
ref,
|
|
188
|
+
commit,
|
|
189
|
+
backend: candidate.backend,
|
|
190
|
+
task: candidate.task,
|
|
191
|
+
taskSummary: candidate.taskSummary,
|
|
192
|
+
sessionId: sessionFile ? candidate.sessionId ?? "" : "",
|
|
193
|
+
sessionFile,
|
|
194
|
+
codexRolloutPath,
|
|
195
|
+
relativeWorkspacePath: relative && !relative.startsWith("..") && !path.isAbsolute(relative)
|
|
196
|
+
? relative.split(path.sep).join("/")
|
|
197
|
+
: undefined,
|
|
198
|
+
workspaceName: candidate.workspaceName,
|
|
199
|
+
freshPrompt,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
const exclude = await originDefaultRef(repoRoot);
|
|
203
|
+
const bundleArgs = ["bundle", "create", path.join(stageDir, "repo.bundle"), ...refs];
|
|
204
|
+
if (exclude) {
|
|
205
|
+
bundleArgs.push("--not", exclude);
|
|
206
|
+
}
|
|
207
|
+
const bundled = await runCommand("git", bundleArgs, { cwd: repoRoot, allowFailure: true });
|
|
208
|
+
if (bundled.code !== 0) {
|
|
209
|
+
throw new Error(`git bundle failed: ${bundled.stderr.trim() || bundled.stdout.trim()}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
for (const ref of refs) {
|
|
214
|
+
await runCommand("git", ["update-ref", "-d", ref], { cwd: repoRoot, allowFailure: true });
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
const manifest = {
|
|
218
|
+
version: MOVE_BUNDLE_VERSION,
|
|
219
|
+
kind: "rudder-move",
|
|
220
|
+
createdAt: nowIso(),
|
|
221
|
+
agents,
|
|
222
|
+
};
|
|
223
|
+
await writeJson(path.join(stageDir, "manifest.json"), manifest);
|
|
224
|
+
return manifest;
|
|
225
|
+
}
|
|
226
|
+
/** Where an adopted agent's workspace goes in the home machine's clone. */
|
|
227
|
+
export function adoptedWorkspacePath(repoRoot, agent) {
|
|
228
|
+
const relative = agent.relativeWorkspacePath ?? "";
|
|
229
|
+
const parts = relative.split("/");
|
|
230
|
+
const underWorkspaces = parts.length >= 2
|
|
231
|
+
&& (parts[0] === AGENT_WORKSPACES_DIR || parts[0] === LEGACY_AGENT_WORKSPACES_DIR)
|
|
232
|
+
&& parts.every((part) => part && part !== "." && part !== "..");
|
|
233
|
+
if (underWorkspaces) {
|
|
234
|
+
// Same place below the root as on the laptop, under the current spelling
|
|
235
|
+
// of the directory; the dashboard's path healing keys off that marker.
|
|
236
|
+
const target = path.join(repoRoot, AGENT_WORKSPACES_DIR, ...parts.slice(1));
|
|
237
|
+
if (isInside(repoRoot, target)) {
|
|
238
|
+
return target;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return workspacePath(repoRoot, agent.runId, agent.task);
|
|
242
|
+
}
|
|
243
|
+
async function jjWorkspaceNames(repoRoot) {
|
|
244
|
+
const result = await runCommand("jj", ["workspace", "list", "-T", "name ++ \"\\n\""], { cwd: repoRoot, allowFailure: true });
|
|
245
|
+
return new Set(result.stdout.split("\n").map((line) => line.trim()).filter(Boolean));
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Home side: continue the agents in an extracted move bundle inside the clone
|
|
249
|
+
* at `repoRoot`. Idempotent per run: an agent this clone already adopted from
|
|
250
|
+
* the same commit is reported again rather than staged twice, so a retried
|
|
251
|
+
* move never forks a conversation.
|
|
252
|
+
*/
|
|
253
|
+
export async function adoptMovedAgents(repoRoot, bundleDir, homeDir = os.homedir()) {
|
|
254
|
+
const manifest = await readJson(path.join(bundleDir, "manifest.json"));
|
|
255
|
+
if (!manifest || manifest.kind !== "rudder-move" || !Array.isArray(manifest.agents)) {
|
|
256
|
+
throw new Error("not a Rudder move bundle");
|
|
257
|
+
}
|
|
258
|
+
if (manifest.version > MOVE_BUNDLE_VERSION) {
|
|
259
|
+
throw new Error(`move bundle version ${manifest.version} is newer than this machine's Rudder; update the worker image`);
|
|
260
|
+
}
|
|
261
|
+
const result = { adopted: [], failed: [] };
|
|
262
|
+
await ensureColocated(repoRoot);
|
|
263
|
+
// The bundle's prerequisites are on origin; a clone that has not fetched
|
|
264
|
+
// since they were pushed needs them first.
|
|
265
|
+
const bundlePath = path.join(bundleDir, "repo.bundle");
|
|
266
|
+
const fetchArgs = ["fetch", "-q", bundlePath, `${MOVE_REF_PREFIX}*:refs/heads/rudder-move/*`];
|
|
267
|
+
let fetched = await runCommand("git", fetchArgs, { cwd: repoRoot, allowFailure: true });
|
|
268
|
+
if (fetched.code !== 0) {
|
|
269
|
+
await runCommand("git", ["fetch", "-q", "origin"], { cwd: repoRoot, allowFailure: true });
|
|
270
|
+
fetched = await runCommand("git", fetchArgs, { cwd: repoRoot, allowFailure: true });
|
|
271
|
+
}
|
|
272
|
+
if (fetched.code !== 0) {
|
|
273
|
+
const error = `could not read the moved work: ${(fetched.stderr || fetched.stdout).trim().split("\n")[0]}`;
|
|
274
|
+
return { adopted: [], failed: manifest.agents.map((agent) => ({ runId: agent.runId, error })) };
|
|
275
|
+
}
|
|
276
|
+
// Make jj see the fetched heads before workspaces are pointed at them.
|
|
277
|
+
await runCommand("jj", ["git", "import"], { cwd: repoRoot, allowFailure: true });
|
|
278
|
+
const workspaceNames = await jjWorkspaceNames(repoRoot);
|
|
279
|
+
for (const agent of manifest.agents) {
|
|
280
|
+
if (!/^[A-Za-z0-9._-]+$/.test(agent.runId) || !/^[0-9a-f]{40}$/.test(agent.commit)) {
|
|
281
|
+
result.failed.push({ runId: String(agent.runId), error: "malformed entry" });
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const bookmark = `rudder-move/${agent.ref.slice(MOVE_REF_PREFIX.length)}`;
|
|
285
|
+
try {
|
|
286
|
+
const adopted = await adoptOne(repoRoot, bundleDir, agent, workspaceNames, homeDir);
|
|
287
|
+
result.adopted.push(adopted);
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
result.failed.push({ runId: agent.runId, error: error instanceof Error ? error.message : String(error) });
|
|
291
|
+
}
|
|
292
|
+
finally {
|
|
293
|
+
// The commit stays visible as the workspace's @; the bookmark was only
|
|
294
|
+
// the way in, and a leftover would show up in `jj log` and on push.
|
|
295
|
+
await runCommand("jj", ["bookmark", "delete", bookmark], { cwd: repoRoot, allowFailure: true });
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return result;
|
|
299
|
+
}
|
|
300
|
+
async function adoptOne(repoRoot, bundleDir, agent, workspaceNames, homeDir) {
|
|
301
|
+
const runDir = path.join(repoRoot, ".rudder", "runs", agent.runId);
|
|
302
|
+
const runJsonPath = path.join(runDir, "run.json");
|
|
303
|
+
const existing = await readJson(runJsonPath);
|
|
304
|
+
const existingMigration = (existing?.migration ?? {});
|
|
305
|
+
const existingWorkspace = (existing?.workspace ?? {});
|
|
306
|
+
if (existing && existingMigration.fromCommit === agent.commit && typeof existingWorkspace.path === "string"
|
|
307
|
+
&& (await pathExists(existingWorkspace.path))) {
|
|
308
|
+
return {
|
|
309
|
+
runId: agent.runId,
|
|
310
|
+
workspacePath: existingWorkspace.path,
|
|
311
|
+
workspaceName: String(existingWorkspace.workspaceName ?? ""),
|
|
312
|
+
jjChangeId: String(existingWorkspace.jjChangeId ?? ""),
|
|
313
|
+
sessionId: String(existingMigration.sessionId ?? ""),
|
|
314
|
+
resumable: Boolean(existingMigration.sessionId),
|
|
315
|
+
alreadyAdopted: true,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
const record = await readJson(path.join(bundleDir, "runs", `${agent.runId}.json`));
|
|
319
|
+
if (!record) {
|
|
320
|
+
throw new Error("run record missing from the bundle");
|
|
321
|
+
}
|
|
322
|
+
adoptLegacyWorkspaceKey(record);
|
|
323
|
+
const target = adoptedWorkspacePath(repoRoot, agent);
|
|
324
|
+
if (await pathExists(target)) {
|
|
325
|
+
throw new Error(`${path.relative(repoRoot, target)} already exists on the home machine`);
|
|
326
|
+
}
|
|
327
|
+
let name = agent.workspaceName && /^[A-Za-z0-9._-]+$/.test(agent.workspaceName)
|
|
328
|
+
? agent.workspaceName
|
|
329
|
+
: workspaceNameFor(agent.runId);
|
|
330
|
+
if (workspaceNames.has(name)) {
|
|
331
|
+
name = `${name}-${shortHash(`${agent.runId}:${agent.commit}`).slice(0, 4)}`;
|
|
332
|
+
}
|
|
333
|
+
await ensureDir(path.dirname(target));
|
|
334
|
+
// By commit id: the imported bookmark keeps the commit visible, and a name
|
|
335
|
+
// like rudder-move/<id> is not a safe revset symbol (`-` is an operator).
|
|
336
|
+
const added = await jjWriteWithStaleRecovery(repoRoot, ["workspace", "add", target, "--name", name, "-r", agent.commit]);
|
|
337
|
+
if (added.code !== 0) {
|
|
338
|
+
throw new Error(`jj workspace add failed: ${(added.stderr || added.stdout).trim().split("\n")[0]}`);
|
|
339
|
+
}
|
|
340
|
+
workspaceNames.add(name);
|
|
341
|
+
// `workspace add` puts a fresh empty change on top; the agent's work is the
|
|
342
|
+
// moved commit itself, so make THAT the working copy (jj drops the empty one).
|
|
343
|
+
const edited = await runCommand("jj", ["edit", agent.commit], { cwd: target, allowFailure: true });
|
|
344
|
+
if (edited.code !== 0) {
|
|
345
|
+
throw new Error(`jj edit failed: ${(edited.stderr || edited.stdout).trim().split("\n")[0]}`);
|
|
346
|
+
}
|
|
347
|
+
const jjChangeId = await currentJjChangeId(target);
|
|
348
|
+
let sessionId = "";
|
|
349
|
+
if (agent.sessionFile && agent.sessionId && /^[A-Za-z0-9-]+$/.test(agent.sessionId)) {
|
|
350
|
+
const staged = path.join(bundleDir, agent.sessionFile);
|
|
351
|
+
if (isInside(bundleDir, staged) && (await pathExists(staged))) {
|
|
352
|
+
let dest = null;
|
|
353
|
+
if (agent.backend === "claude") {
|
|
354
|
+
dest = path.join(homeDir, ".claude", "projects", encodeClaudeProjectsCwd(target), `${agent.sessionId}.jsonl`);
|
|
355
|
+
}
|
|
356
|
+
else if (agent.backend === "codex" && agent.codexRolloutPath) {
|
|
357
|
+
const sessionsRoot = process.env.CODEX_HOME?.trim()
|
|
358
|
+
? path.join(process.env.CODEX_HOME.trim(), "sessions")
|
|
359
|
+
: path.join(homeDir, ".codex", "sessions");
|
|
360
|
+
const candidate = path.join(sessionsRoot, ...agent.codexRolloutPath.split("/"));
|
|
361
|
+
dest = isInside(sessionsRoot, candidate) ? candidate : null;
|
|
362
|
+
}
|
|
363
|
+
if (dest) {
|
|
364
|
+
await ensureDir(path.dirname(dest));
|
|
365
|
+
await fsp.cp(staged, dest, { force: true });
|
|
366
|
+
sessionId = agent.sessionId;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
const workspace = (record.workspace ?? {});
|
|
371
|
+
record.repoRoot = repoRoot;
|
|
372
|
+
record.workspace = {
|
|
373
|
+
...workspace,
|
|
374
|
+
enabled: true,
|
|
375
|
+
path: target,
|
|
376
|
+
workspaceName: name,
|
|
377
|
+
...(jjChangeId ? { jjChangeId } : {}),
|
|
378
|
+
};
|
|
379
|
+
record.vcs = "jj";
|
|
380
|
+
// Nothing runs it yet: the dashboard resumes it when told to adopt it, and a
|
|
381
|
+
// record claiming "running" with no process would read as orphaned first.
|
|
382
|
+
record.status = "paused";
|
|
383
|
+
record.lifecyclePhase = "working";
|
|
384
|
+
delete record.process;
|
|
385
|
+
delete record.attention;
|
|
386
|
+
record.session = { ...(record.session ?? {}), nativeSessionId: sessionId || null };
|
|
387
|
+
record.migration = {
|
|
388
|
+
origin: "laptop",
|
|
389
|
+
fromCommit: agent.commit,
|
|
390
|
+
sessionId: sessionId || null,
|
|
391
|
+
backend: agent.backend,
|
|
392
|
+
pendingResume: Boolean(sessionId),
|
|
393
|
+
pendingFresh: !sessionId,
|
|
394
|
+
freshPrompt: sessionId ? null : agent.freshPrompt ?? null,
|
|
395
|
+
movedAt: nowIso(),
|
|
396
|
+
};
|
|
397
|
+
record.updatedAt = String(Date.now());
|
|
398
|
+
await ensureDir(runDir);
|
|
399
|
+
await writeJson(runJsonPath, record);
|
|
400
|
+
return { runId: agent.runId, workspacePath: target, workspaceName: name, jjChangeId, sessionId, resumable: Boolean(sessionId) };
|
|
401
|
+
}
|
|
402
|
+
/** After the home machine staged them: the laptop's records hand ownership over. */
|
|
403
|
+
export async function markRunsMovedHome(repoRoot, runIds, repoSlug) {
|
|
404
|
+
for (const runId of runIds) {
|
|
405
|
+
const recordPath = path.join(repoRoot, ".rudder", "runs", runId, "run.json");
|
|
406
|
+
const record = await readJson(recordPath);
|
|
407
|
+
if (!record || record.id !== runId) {
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
record.status = "migrated";
|
|
411
|
+
record.lifecyclePhase = "cloud-owned";
|
|
412
|
+
record.movedTo = { kind: "home", repo: repoSlug, at: nowIso() };
|
|
413
|
+
delete record.process;
|
|
414
|
+
record.updatedAt = String(Date.now());
|
|
415
|
+
await writeJson(recordPath, record);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=move-home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move-home.js","sourceRoot":"","sources":["../src/move-home.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED