@tryglen/cli 0.24.10 → 0.26.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.
- package/README.md +55 -28
- package/dist/_utils/cli-error.d.ts +1 -0
- package/dist/_utils/cli-error.js.map +1 -1
- package/dist/_utils/config.d.ts +7 -0
- package/dist/_utils/config.js +7 -0
- package/dist/_utils/config.js.map +1 -1
- package/dist/_utils/parse-cursor-db.js +2 -0
- package/dist/_utils/parse-cursor-db.js.map +1 -1
- package/dist/_utils/refresh-control-state.d.ts +3 -0
- package/dist/_utils/refresh-control-state.js +24 -0
- package/dist/_utils/refresh-control-state.js.map +1 -0
- package/dist/_utils/sync-mode-from-server.d.ts +1 -2
- package/dist/_utils/sync-mode-from-server.js +28 -13
- package/dist/_utils/sync-mode-from-server.js.map +1 -1
- package/dist/bin.js +10 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/ingest.js +8 -4
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/org.js +51 -4
- package/dist/commands/org.js.map +1 -1
- package/dist/commands/session-start.js +5 -1
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/set-mode.d.ts +3 -4
- package/dist/commands/set-mode.js +20 -15
- package/dist/commands/set-mode.js.map +1 -1
- package/dist/commands/takeover/_utils/agent-paths.d.ts +6 -0
- package/dist/commands/takeover/_utils/agent-paths.js +23 -0
- package/dist/commands/takeover/_utils/agent-paths.js.map +1 -0
- package/dist/commands/takeover/_utils/archive-codex-desktop-thread.d.ts +5 -0
- package/dist/commands/takeover/_utils/archive-codex-desktop-thread.js +63 -0
- package/dist/commands/takeover/_utils/archive-codex-desktop-thread.js.map +1 -0
- package/dist/commands/takeover/_utils/canonical-digest.d.ts +5 -0
- package/dist/commands/takeover/_utils/canonical-digest.js +4 -0
- package/dist/commands/takeover/_utils/canonical-digest.js.map +1 -0
- package/dist/commands/takeover/_utils/codex-desktop-recovery.d.ts +16 -0
- package/dist/commands/takeover/_utils/codex-desktop-recovery.js +102 -0
- package/dist/commands/takeover/_utils/codex-desktop-recovery.js.map +1 -0
- package/dist/commands/takeover/_utils/context-fit.d.ts +18 -0
- package/dist/commands/takeover/_utils/context-fit.js +30 -0
- package/dist/commands/takeover/_utils/context-fit.js.map +1 -0
- package/dist/commands/takeover/_utils/cursor-store.d.ts +49 -0
- package/dist/commands/takeover/_utils/cursor-store.js +359 -0
- package/dist/commands/takeover/_utils/cursor-store.js.map +1 -0
- package/dist/commands/takeover/_utils/import-codex-desktop-thread.d.ts +9 -0
- package/dist/commands/takeover/_utils/import-codex-desktop-thread.js +143 -0
- package/dist/commands/takeover/_utils/import-codex-desktop-thread.js.map +1 -0
- package/dist/commands/takeover/_utils/launch-desktop-url.d.ts +4 -0
- package/dist/commands/takeover/_utils/launch-desktop-url.js +40 -0
- package/dist/commands/takeover/_utils/launch-desktop-url.js.map +1 -0
- package/dist/commands/takeover/_utils/native-file.d.ts +14 -0
- package/dist/commands/takeover/_utils/native-file.js +105 -0
- package/dist/commands/takeover/_utils/native-file.js.map +1 -0
- package/dist/commands/takeover/_utils/probe-agent.d.ts +20 -0
- package/dist/commands/takeover/_utils/probe-agent.js +37 -0
- package/dist/commands/takeover/_utils/probe-agent.js.map +1 -0
- package/dist/commands/takeover/_utils/provenance-context.d.ts +7 -0
- package/dist/commands/takeover/_utils/provenance-context.js +12 -0
- package/dist/commands/takeover/_utils/provenance-context.js.map +1 -0
- package/dist/commands/takeover/_utils/staged-session.d.ts +64 -0
- package/dist/commands/takeover/_utils/staged-session.js +30 -0
- package/dist/commands/takeover/_utils/staged-session.js.map +1 -0
- package/dist/commands/takeover/_utils/write-claude-desktop-session.d.ts +47 -0
- package/dist/commands/takeover/_utils/write-claude-desktop-session.js +24 -0
- package/dist/commands/takeover/_utils/write-claude-desktop-session.js.map +1 -0
- package/dist/commands/takeover/_utils/write-claude-session.d.ts +53 -0
- package/dist/commands/takeover/_utils/write-claude-session.js +132 -0
- package/dist/commands/takeover/_utils/write-claude-session.js.map +1 -0
- package/dist/commands/takeover/_utils/write-codex-desktop-session.d.ts +94 -0
- package/dist/commands/takeover/_utils/write-codex-desktop-session.js +233 -0
- package/dist/commands/takeover/_utils/write-codex-desktop-session.js.map +1 -0
- package/dist/commands/takeover/_utils/write-codex-session.d.ts +52 -0
- package/dist/commands/takeover/_utils/write-codex-session.js +117 -0
- package/dist/commands/takeover/_utils/write-codex-session.js.map +1 -0
- package/dist/commands/takeover/_utils/write-cursor-session.d.ts +57 -0
- package/dist/commands/takeover/_utils/write-cursor-session.js +174 -0
- package/dist/commands/takeover/_utils/write-cursor-session.js.map +1 -0
- package/dist/commands/takeover/_utils/write-pi-session.d.ts +52 -0
- package/dist/commands/takeover/_utils/write-pi-session.js +173 -0
- package/dist/commands/takeover/_utils/write-pi-session.js.map +1 -0
- package/dist/commands/takeover/index.d.ts +21 -0
- package/dist/commands/takeover/index.js +201 -0
- package/dist/commands/takeover/index.js.map +1 -0
- package/dist/commands/takeover/takeover.schema.d.ts +24 -0
- package/dist/commands/takeover/takeover.schema.js +66 -0
- package/dist/commands/takeover/takeover.schema.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { copyFile, mkdtemp, readFile, readdir, rm, } from "node:fs/promises";
|
|
3
|
+
import { homedir, tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
import { causeOf, cliErr } from "../../../_utils/cli-error.js";
|
|
7
|
+
import { err, fromPromise, ok } from "../../../_utils/result.js";
|
|
8
|
+
import { runBin } from "../../../_utils/run-bin.js";
|
|
9
|
+
const loadSqlite = async () => {
|
|
10
|
+
try {
|
|
11
|
+
const specifier = "node:sqlite";
|
|
12
|
+
const sqlite = (await import(specifier));
|
|
13
|
+
return sqlite.DatabaseSync ?? null;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const cursorRoot = () => process.env.GLEN_CURSOR_USER_DATA ??
|
|
20
|
+
(process.platform === "darwin"
|
|
21
|
+
? join(homedir(), "Library", "Application Support", "Cursor")
|
|
22
|
+
: process.platform === "win32"
|
|
23
|
+
? join(process.env.APPDATA ?? "", "Cursor")
|
|
24
|
+
: join(homedir(), ".config", "Cursor"));
|
|
25
|
+
const databaseFiles = (path) => ["", "-wal", "-shm"]
|
|
26
|
+
.map((suffix) => ({ path: `${path}${suffix}`, suffix }))
|
|
27
|
+
.filter((file) => existsSync(file.path));
|
|
28
|
+
const copyDatabaseFiles = (source, destination) => Promise.all(databaseFiles(source).map((file) => copyFile(file.path, `${destination}${file.suffix}`)));
|
|
29
|
+
const workspaceDb = async (workspace) => {
|
|
30
|
+
if (process.env.GLEN_CURSOR_WORKSPACE_DB)
|
|
31
|
+
return process.env.GLEN_CURSOR_WORKSPACE_DB;
|
|
32
|
+
const root = join(cursorRoot(), "User", "workspaceStorage");
|
|
33
|
+
const directories = await fromPromise(readdir(root, { withFileTypes: true }));
|
|
34
|
+
if (!directories.ok)
|
|
35
|
+
return null;
|
|
36
|
+
const expected = pathToFileURL(workspace).href.replace(/\/$/, "");
|
|
37
|
+
const matches = await Promise.all(directories.value
|
|
38
|
+
.filter((entry) => entry.isDirectory())
|
|
39
|
+
.map(async (entry) => {
|
|
40
|
+
const directory = join(root, entry.name);
|
|
41
|
+
const raw = await fromPromise(readFile(join(directory, "workspace.json"), "utf8"));
|
|
42
|
+
if (!raw.ok)
|
|
43
|
+
return null;
|
|
44
|
+
try {
|
|
45
|
+
const parsed = JSON.parse(raw.value);
|
|
46
|
+
return typeof parsed.folder === "string" &&
|
|
47
|
+
parsed.folder.replace(/\/$/, "") === expected
|
|
48
|
+
? join(directory, "state.vscdb")
|
|
49
|
+
: null;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}));
|
|
55
|
+
return matches.find((match) => match !== null) ?? null;
|
|
56
|
+
};
|
|
57
|
+
const cursorIsRunning = () => {
|
|
58
|
+
if (process.env.GLEN_CURSOR_TEST_CLOSED === "1")
|
|
59
|
+
return false;
|
|
60
|
+
if (process.platform === "win32") {
|
|
61
|
+
const listed = runBin("tasklist", ["/FI", "IMAGENAME eq Cursor.exe"], {
|
|
62
|
+
timeoutMs: 3000,
|
|
63
|
+
});
|
|
64
|
+
return listed.ok && /Cursor\.exe/i.test(listed.value.stdout);
|
|
65
|
+
}
|
|
66
|
+
return runBin("pgrep", ["-f", "Cursor(.app/Contents/MacOS/Cursor)?"], {
|
|
67
|
+
timeoutMs: 3000,
|
|
68
|
+
}).ok;
|
|
69
|
+
};
|
|
70
|
+
const schemaSupported = (db) => {
|
|
71
|
+
const tables = new Set(db
|
|
72
|
+
.prepare("SELECT name FROM sqlite_master WHERE type = 'table'")
|
|
73
|
+
.all()
|
|
74
|
+
.map((row) => row.name)
|
|
75
|
+
.filter((name) => typeof name === "string"));
|
|
76
|
+
if (!tables.has("cursorDiskKV") || !tables.has("composerHeaders"))
|
|
77
|
+
return false;
|
|
78
|
+
const headerColumns = new Set(db
|
|
79
|
+
.prepare("PRAGMA table_info(composerHeaders)")
|
|
80
|
+
.all()
|
|
81
|
+
.map((row) => row.name)
|
|
82
|
+
.filter((name) => typeof name === "string"));
|
|
83
|
+
return [
|
|
84
|
+
"composerId",
|
|
85
|
+
"workspaceId",
|
|
86
|
+
"createdAt",
|
|
87
|
+
"lastUpdatedAt",
|
|
88
|
+
"isArchived",
|
|
89
|
+
"isSubagent",
|
|
90
|
+
"recency",
|
|
91
|
+
"checkpointAt",
|
|
92
|
+
"value",
|
|
93
|
+
].every((column) => headerColumns.has(column));
|
|
94
|
+
};
|
|
95
|
+
const mutate = (db, input) => {
|
|
96
|
+
db.prepare("INSERT INTO cursorDiskKV(key, value) VALUES (?, ?)").run(`composerData:${input.sessionId}`, input.composer);
|
|
97
|
+
const insertBubble = db.prepare("INSERT INTO cursorDiskKV(key, value) VALUES (?, ?)");
|
|
98
|
+
for (const bubble of input.bubbles)
|
|
99
|
+
insertBubble.run(bubble.key, bubble.value);
|
|
100
|
+
db.prepare("INSERT INTO composerHeaders(composerId, workspaceId, createdAt, lastUpdatedAt, isArchived, isSubagent, recency, checkpointAt, value) VALUES (?, ?, ?, ?, 0, 0, ?, NULL, ?)").run(input.sessionId, input.workspaceId, input.now, input.now, input.now, input.header);
|
|
101
|
+
db.prepare("INSERT OR REPLACE INTO workspace_db.ItemTable(key, value) VALUES (?, ?)").run("composer.composerData", input.workspaceIndex);
|
|
102
|
+
};
|
|
103
|
+
const attach = (db, path) => db.exec(`ATTACH DATABASE '${path.replaceAll("'", "''")}' AS workspace_db`);
|
|
104
|
+
const cursorStore = {
|
|
105
|
+
async locate(workspace) {
|
|
106
|
+
const globalDb = process.env.GLEN_CURSOR_GLOBAL_DB ??
|
|
107
|
+
join(cursorRoot(), "User", "globalStorage", "state.vscdb");
|
|
108
|
+
const matched = await workspaceDb(workspace);
|
|
109
|
+
if (!existsSync(globalDb) || !matched || !existsSync(matched))
|
|
110
|
+
return err(cliErr({
|
|
111
|
+
what: "Cursor has not initialized this workspace for local chat history",
|
|
112
|
+
path: matched ?? globalDb,
|
|
113
|
+
remedy: "open this folder in Cursor once, close Cursor completely, then retry the takeover",
|
|
114
|
+
}));
|
|
115
|
+
return ok({
|
|
116
|
+
globalDb,
|
|
117
|
+
workspaceDb: matched,
|
|
118
|
+
workspaceId: matched.split(/[\\/]/).at(-2) ?? "",
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
async probe(paths) {
|
|
122
|
+
if ((Number(process.versions.node.split(".")[0]) || 0) < 22)
|
|
123
|
+
return err(cliErr({
|
|
124
|
+
what: "Cursor takeover needs Node.js 22.5 or newer",
|
|
125
|
+
remedy: "run the takeover with Node.js 22.5+; no database was changed",
|
|
126
|
+
}));
|
|
127
|
+
if (cursorIsRunning())
|
|
128
|
+
return err(cliErr({
|
|
129
|
+
what: "Cursor is still running",
|
|
130
|
+
remedy: "quit every Cursor window and wait a moment, then retry; no database was changed",
|
|
131
|
+
}));
|
|
132
|
+
const DatabaseSync = await loadSqlite();
|
|
133
|
+
if (!DatabaseSync)
|
|
134
|
+
return err(cliErr({
|
|
135
|
+
what: "this Node.js runtime does not provide node:sqlite",
|
|
136
|
+
remedy: "run the takeover with Node.js 22.5+",
|
|
137
|
+
}));
|
|
138
|
+
const checked = (() => {
|
|
139
|
+
try {
|
|
140
|
+
const global = new DatabaseSync(paths.globalDb, { readOnly: true });
|
|
141
|
+
const workspace = new DatabaseSync(paths.workspaceDb, {
|
|
142
|
+
readOnly: true,
|
|
143
|
+
});
|
|
144
|
+
const supported = schemaSupported(global) &&
|
|
145
|
+
workspace
|
|
146
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='ItemTable'")
|
|
147
|
+
.get() !== undefined;
|
|
148
|
+
global.close();
|
|
149
|
+
workspace.close();
|
|
150
|
+
return supported;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
})();
|
|
156
|
+
return checked
|
|
157
|
+
? ok(undefined)
|
|
158
|
+
: err(cliErr({
|
|
159
|
+
what: "this Cursor local-history schema is not supported",
|
|
160
|
+
remedy: "update Glen and Cursor, then retry; no database was changed",
|
|
161
|
+
}));
|
|
162
|
+
},
|
|
163
|
+
async stage(paths, input) {
|
|
164
|
+
const safe = await this.probe(paths);
|
|
165
|
+
if (!safe.ok)
|
|
166
|
+
return safe;
|
|
167
|
+
const directory = await fromPromise(mkdtemp(join(tmpdir(), "glen-cursor-takeover-")));
|
|
168
|
+
if (!directory.ok)
|
|
169
|
+
return err(cliErr({
|
|
170
|
+
what: "could not create Cursor takeover staging",
|
|
171
|
+
why: causeOf(directory.error),
|
|
172
|
+
remedy: "check temporary-directory permissions, then retry",
|
|
173
|
+
}));
|
|
174
|
+
const globalCopy = join(directory.value, "global.vscdb");
|
|
175
|
+
const workspaceCopy = join(directory.value, "workspace.vscdb");
|
|
176
|
+
const copied = await fromPromise(Promise.all([
|
|
177
|
+
copyDatabaseFiles(paths.globalDb, globalCopy),
|
|
178
|
+
copyDatabaseFiles(paths.workspaceDb, workspaceCopy),
|
|
179
|
+
]));
|
|
180
|
+
if (!copied.ok) {
|
|
181
|
+
await rm(directory.value, { recursive: true, force: true });
|
|
182
|
+
return err(cliErr({
|
|
183
|
+
what: "could not copy the Cursor databases for staging",
|
|
184
|
+
why: causeOf(copied.error),
|
|
185
|
+
remedy: "confirm Cursor is closed and the databases are readable",
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
const DatabaseSync = await loadSqlite();
|
|
189
|
+
if (!DatabaseSync) {
|
|
190
|
+
await rm(directory.value, { recursive: true, force: true });
|
|
191
|
+
return err(cliErr({
|
|
192
|
+
what: "node:sqlite became unavailable",
|
|
193
|
+
remedy: "retry with Node.js 22.5+",
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
const written = (() => {
|
|
197
|
+
try {
|
|
198
|
+
const global = new DatabaseSync(globalCopy);
|
|
199
|
+
attach(global, workspaceCopy);
|
|
200
|
+
global.exec("BEGIN IMMEDIATE");
|
|
201
|
+
const storedIndex = global
|
|
202
|
+
.prepare("SELECT value FROM workspace_db.ItemTable WHERE key = 'composer.composerData'")
|
|
203
|
+
.get()?.value;
|
|
204
|
+
const parsedIndex = (() => {
|
|
205
|
+
try {
|
|
206
|
+
const value = typeof storedIndex === "string"
|
|
207
|
+
? JSON.parse(storedIndex)
|
|
208
|
+
: null;
|
|
209
|
+
return value !== null && typeof value === "object"
|
|
210
|
+
? value
|
|
211
|
+
: {};
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return {};
|
|
215
|
+
}
|
|
216
|
+
})();
|
|
217
|
+
mutate(global, {
|
|
218
|
+
...input,
|
|
219
|
+
workspaceIndex: JSON.stringify({
|
|
220
|
+
...parsedIndex,
|
|
221
|
+
selectedComposerIds: [input.sessionId],
|
|
222
|
+
lastFocusedComposerIds: [input.sessionId],
|
|
223
|
+
hasMigratedComposerData: true,
|
|
224
|
+
hasMigratedMultipleComposers: true,
|
|
225
|
+
}),
|
|
226
|
+
});
|
|
227
|
+
global.exec("COMMIT");
|
|
228
|
+
global.close();
|
|
229
|
+
return ok(undefined);
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
return err(error);
|
|
233
|
+
}
|
|
234
|
+
})();
|
|
235
|
+
if (!written.ok) {
|
|
236
|
+
await rm(directory.value, { recursive: true, force: true });
|
|
237
|
+
return err(cliErr({
|
|
238
|
+
what: "could not stage the Cursor conversation",
|
|
239
|
+
why: causeOf(written.error),
|
|
240
|
+
remedy: "update Glen and Cursor, then retry",
|
|
241
|
+
}));
|
|
242
|
+
}
|
|
243
|
+
return ok({ path: directory.value });
|
|
244
|
+
},
|
|
245
|
+
async install(paths, stagedDirectory, sessionId) {
|
|
246
|
+
const safe = await this.probe(paths);
|
|
247
|
+
if (!safe.ok)
|
|
248
|
+
return safe;
|
|
249
|
+
const suffix = new Date().toISOString().replace(/[:.]/g, "-");
|
|
250
|
+
const backupSets = [paths.globalDb, paths.workspaceDb].map((source) => ({
|
|
251
|
+
source,
|
|
252
|
+
destination: `${source}.glen-takeover-${suffix}.bak`,
|
|
253
|
+
}));
|
|
254
|
+
const backups = backupSets.flatMap(({ source, destination }) => databaseFiles(source).map((file) => `${destination}${file.suffix}`));
|
|
255
|
+
const backedUp = await fromPromise(Promise.all(backupSets.map(({ source, destination }) => copyDatabaseFiles(source, destination))));
|
|
256
|
+
if (!backedUp.ok)
|
|
257
|
+
return err(cliErr({
|
|
258
|
+
what: "could not back up Cursor before takeover",
|
|
259
|
+
why: causeOf(backedUp.error),
|
|
260
|
+
remedy: "check disk space and database permissions, then retry",
|
|
261
|
+
}));
|
|
262
|
+
const DatabaseSync = await loadSqlite();
|
|
263
|
+
if (!DatabaseSync)
|
|
264
|
+
return err(cliErr({
|
|
265
|
+
what: "node:sqlite became unavailable",
|
|
266
|
+
remedy: "retry with Node.js 22.5+",
|
|
267
|
+
}));
|
|
268
|
+
const applied = (() => {
|
|
269
|
+
try {
|
|
270
|
+
const stagedGlobal = new DatabaseSync(join(stagedDirectory, "global.vscdb"), { readOnly: true });
|
|
271
|
+
const stagedWorkspace = new DatabaseSync(join(stagedDirectory, "workspace.vscdb"), { readOnly: true });
|
|
272
|
+
const composer = stagedGlobal
|
|
273
|
+
.prepare("SELECT value FROM cursorDiskKV WHERE key = ?")
|
|
274
|
+
.get(`composerData:${sessionId}`)?.value;
|
|
275
|
+
const bubbles = stagedGlobal
|
|
276
|
+
.prepare("SELECT key, value FROM cursorDiskKV WHERE key LIKE ?")
|
|
277
|
+
.all(`bubbleId:${sessionId}:%`);
|
|
278
|
+
const header = stagedGlobal
|
|
279
|
+
.prepare("SELECT * FROM composerHeaders WHERE composerId = ?")
|
|
280
|
+
.get(sessionId);
|
|
281
|
+
const workspaceIndex = stagedWorkspace
|
|
282
|
+
.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'")
|
|
283
|
+
.get()?.value;
|
|
284
|
+
stagedGlobal.close();
|
|
285
|
+
stagedWorkspace.close();
|
|
286
|
+
if (typeof composer !== "string" ||
|
|
287
|
+
!header ||
|
|
288
|
+
typeof workspaceIndex !== "string")
|
|
289
|
+
return err(new Error("staged Cursor rows are incomplete"));
|
|
290
|
+
const global = new DatabaseSync(paths.globalDb);
|
|
291
|
+
try {
|
|
292
|
+
attach(global, paths.workspaceDb);
|
|
293
|
+
global.exec("BEGIN IMMEDIATE");
|
|
294
|
+
const existing = global
|
|
295
|
+
.prepare("SELECT value FROM cursorDiskKV WHERE key = ?")
|
|
296
|
+
.get(`composerData:${sessionId}`)?.value;
|
|
297
|
+
const existingHeader = global
|
|
298
|
+
.prepare("SELECT value FROM composerHeaders WHERE composerId = ?")
|
|
299
|
+
.get(sessionId)?.value;
|
|
300
|
+
const existingBubbles = global
|
|
301
|
+
.prepare("SELECT key, value FROM cursorDiskKV WHERE key LIKE ? ORDER BY key")
|
|
302
|
+
.all(`bubbleId:${sessionId}:%`);
|
|
303
|
+
const expectedBubbles = [...bubbles].sort((first, second) => String(first.key).localeCompare(String(second.key)));
|
|
304
|
+
const existingMatches = existing === composer &&
|
|
305
|
+
existingHeader === header.value &&
|
|
306
|
+
JSON.stringify(existingBubbles) === JSON.stringify(expectedBubbles);
|
|
307
|
+
if (existing !== undefined && !existingMatches) {
|
|
308
|
+
global.exec("ROLLBACK");
|
|
309
|
+
global.close();
|
|
310
|
+
return err(new Error("destination composer already exists with different content"));
|
|
311
|
+
}
|
|
312
|
+
if (existing === undefined) {
|
|
313
|
+
global
|
|
314
|
+
.prepare("INSERT INTO cursorDiskKV(key, value) VALUES (?, ?)")
|
|
315
|
+
.run(`composerData:${sessionId}`, composer);
|
|
316
|
+
const insertBubble = global.prepare("INSERT INTO cursorDiskKV(key, value) VALUES (?, ?)");
|
|
317
|
+
for (const bubble of bubbles)
|
|
318
|
+
insertBubble.run(bubble.key, bubble.value);
|
|
319
|
+
global
|
|
320
|
+
.prepare("INSERT INTO composerHeaders(composerId, workspaceId, createdAt, lastUpdatedAt, isArchived, isSubagent, recency, checkpointAt, value) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)")
|
|
321
|
+
.run(header.composerId, header.workspaceId, header.createdAt, header.lastUpdatedAt, header.isArchived, header.isSubagent, header.recency, header.checkpointAt ?? null, header.value);
|
|
322
|
+
}
|
|
323
|
+
global
|
|
324
|
+
.prepare("INSERT OR REPLACE INTO workspace_db.ItemTable(key, value) VALUES ('composer.composerData', ?)")
|
|
325
|
+
.run(workspaceIndex);
|
|
326
|
+
global.exec("COMMIT");
|
|
327
|
+
global.close();
|
|
328
|
+
return ok(undefined);
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
try {
|
|
332
|
+
global.exec("ROLLBACK");
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
// A failed BEGIN or an auto-rolled-back SQLite error has no active transaction.
|
|
336
|
+
}
|
|
337
|
+
global.close();
|
|
338
|
+
return err(error);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
catch (error) {
|
|
342
|
+
return err(error);
|
|
343
|
+
}
|
|
344
|
+
})();
|
|
345
|
+
return applied.ok
|
|
346
|
+
? ok({ backups })
|
|
347
|
+
: err(cliErr({
|
|
348
|
+
what: "Cursor takeover rolled back before completion",
|
|
349
|
+
why: causeOf(applied.error),
|
|
350
|
+
path: backups.join(" and "),
|
|
351
|
+
remedy: "keep the backups, confirm Cursor is closed, and retry; no existing conversation was overwritten",
|
|
352
|
+
}));
|
|
353
|
+
},
|
|
354
|
+
async cleanup(path) {
|
|
355
|
+
await rm(path, { recursive: true, force: true });
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
export { cursorStore };
|
|
359
|
+
//# sourceMappingURL=cursor-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-store.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/cursor-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type CliError } from "../../../_utils/cli-error.js";
|
|
2
|
+
import { type Result } from "../../../_utils/result.js";
|
|
3
|
+
declare const importCodexDesktopThread: (input: {
|
|
4
|
+
readonly binary: string;
|
|
5
|
+
readonly workspace: string;
|
|
6
|
+
readonly name: string | null;
|
|
7
|
+
readonly items: readonly Record<string, unknown>[];
|
|
8
|
+
}) => Promise<Result<string, CliError>>;
|
|
9
|
+
export { importCodexDesktopThread };
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { cliErr } from "../../../_utils/cli-error.js";
|
|
3
|
+
import { err, ok } from "../../../_utils/result.js";
|
|
4
|
+
import { cliVersion } from "../../../_utils/version.js";
|
|
5
|
+
import { archiveCodexDesktopThread } from "./archive-codex-desktop-thread.js";
|
|
6
|
+
const TIMEOUT_MS = 15_000;
|
|
7
|
+
const importCodexDesktopThread = (input) => new Promise((resolve) => {
|
|
8
|
+
const child = spawn(input.binary, ["app-server"], {
|
|
9
|
+
stdio: ["pipe", "pipe", "ignore"],
|
|
10
|
+
});
|
|
11
|
+
const state = {
|
|
12
|
+
buffer: "",
|
|
13
|
+
threadId: null,
|
|
14
|
+
pendingError: null,
|
|
15
|
+
finished: false,
|
|
16
|
+
};
|
|
17
|
+
const finish = (result, cleanupPartialThread = false) => {
|
|
18
|
+
if (state.finished)
|
|
19
|
+
return;
|
|
20
|
+
state.finished = true;
|
|
21
|
+
clearTimeout(timer);
|
|
22
|
+
child.kill();
|
|
23
|
+
const cleanup = cleanupPartialThread && state.threadId
|
|
24
|
+
? archiveCodexDesktopThread({
|
|
25
|
+
binary: input.binary,
|
|
26
|
+
threadId: state.threadId,
|
|
27
|
+
})
|
|
28
|
+
: Promise.resolve();
|
|
29
|
+
void cleanup.then(() => resolve(result));
|
|
30
|
+
};
|
|
31
|
+
const failure = (why) => cliErr({
|
|
32
|
+
what: "Codex Desktop could not import the verified transcript",
|
|
33
|
+
why,
|
|
34
|
+
remedy: "update Glen and Codex Desktop, then retry; no takeover was completed",
|
|
35
|
+
});
|
|
36
|
+
const write = (message) => {
|
|
37
|
+
if (state.finished)
|
|
38
|
+
return;
|
|
39
|
+
child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", ...message })}\n`);
|
|
40
|
+
};
|
|
41
|
+
const timer = setTimeout(() => finish(err(failure("codex app-server timed out")), true), TIMEOUT_MS);
|
|
42
|
+
child.on("error", () => finish(err(failure("could not start codex app-server"))));
|
|
43
|
+
child.on("close", () => finish(err(failure("codex app-server exited before import completed")), true));
|
|
44
|
+
child.stdin.on("error", () => finish(err(failure("codex app-server input closed unexpectedly")), true));
|
|
45
|
+
child.stdout.on("data", (chunk) => {
|
|
46
|
+
state.buffer += chunk.toString();
|
|
47
|
+
const lines = state.buffer.split("\n");
|
|
48
|
+
state.buffer = lines.pop() ?? "";
|
|
49
|
+
for (const line of lines) {
|
|
50
|
+
if (!line.trim())
|
|
51
|
+
continue;
|
|
52
|
+
const message = (() => {
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(line);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
})();
|
|
60
|
+
if (!message || typeof message.id !== "number")
|
|
61
|
+
continue;
|
|
62
|
+
const rpcError = message.error;
|
|
63
|
+
if (rpcError) {
|
|
64
|
+
const reported = typeof rpcError.message === "string"
|
|
65
|
+
? rpcError.message
|
|
66
|
+
: "unknown app-server error";
|
|
67
|
+
const importedError = failure(reported);
|
|
68
|
+
if ((message.id === 3 || message.id === 4) && state.threadId) {
|
|
69
|
+
state.pendingError = importedError;
|
|
70
|
+
write({
|
|
71
|
+
id: 5,
|
|
72
|
+
method: "thread/archive",
|
|
73
|
+
params: { threadId: state.threadId },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else if (message.id === 5 && state.pendingError) {
|
|
77
|
+
finish(err(state.pendingError), true);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
finish(err(importedError), Boolean(state.threadId));
|
|
81
|
+
}
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (message.id === 1) {
|
|
85
|
+
write({ method: "initialized", params: {} });
|
|
86
|
+
write({
|
|
87
|
+
id: 2,
|
|
88
|
+
method: "thread/start",
|
|
89
|
+
params: {
|
|
90
|
+
cwd: input.workspace,
|
|
91
|
+
ephemeral: false,
|
|
92
|
+
sessionStartSource: "startup",
|
|
93
|
+
threadSource: "vscode",
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (message.id === 2) {
|
|
99
|
+
const threadId = message.result?.thread?.id;
|
|
100
|
+
if (typeof threadId !== "string" || !threadId) {
|
|
101
|
+
finish(err(failure("thread/start returned no thread ID")));
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
state.threadId = threadId;
|
|
105
|
+
write({
|
|
106
|
+
id: 3,
|
|
107
|
+
method: "thread/inject_items",
|
|
108
|
+
params: { threadId, items: input.items },
|
|
109
|
+
});
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (message.id === 3 && state.threadId) {
|
|
113
|
+
if (input.name) {
|
|
114
|
+
write({
|
|
115
|
+
id: 4,
|
|
116
|
+
method: "thread/name/set",
|
|
117
|
+
params: { threadId: state.threadId, name: input.name },
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
finish(ok(state.threadId));
|
|
122
|
+
}
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (message.id === 4 && state.threadId)
|
|
126
|
+
finish(ok(state.threadId));
|
|
127
|
+
if (message.id === 5 && state.pendingError)
|
|
128
|
+
finish(err(state.pendingError));
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
queueMicrotask(() => {
|
|
132
|
+
write({
|
|
133
|
+
id: 1,
|
|
134
|
+
method: "initialize",
|
|
135
|
+
params: {
|
|
136
|
+
clientInfo: { name: "glen", title: "Glen CLI", version: cliVersion },
|
|
137
|
+
capabilities: { experimentalApi: true },
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
export { importCodexDesktopThread };
|
|
143
|
+
//# sourceMappingURL=import-codex-desktop-thread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-codex-desktop-thread.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/import-codex-desktop-thread.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { causeOf, cliErr } from "../../../_utils/cli-error.js";
|
|
3
|
+
import { err, ok } from "../../../_utils/result.js";
|
|
4
|
+
const launchDesktopUrl = (url, platform = process.platform) => {
|
|
5
|
+
const parsed = (() => {
|
|
6
|
+
try {
|
|
7
|
+
return new URL(url);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
})();
|
|
13
|
+
if (!parsed ||
|
|
14
|
+
(parsed.protocol !== "claude:" && parsed.protocol !== "codex:"))
|
|
15
|
+
return err(cliErr({
|
|
16
|
+
what: "refused to open an unsupported desktop URL",
|
|
17
|
+
why: url,
|
|
18
|
+
remedy: "update Glen, then retry the takeover",
|
|
19
|
+
}));
|
|
20
|
+
const command = platform === "darwin"
|
|
21
|
+
? { binary: "open", args: [url] }
|
|
22
|
+
: platform === "win32"
|
|
23
|
+
? {
|
|
24
|
+
binary: "cmd.exe",
|
|
25
|
+
args: ["/d", "/s", "/c", "start", "", url],
|
|
26
|
+
}
|
|
27
|
+
: { binary: "xdg-open", args: [url] };
|
|
28
|
+
const launched = spawnSync(command.binary, command.args, { stdio: "ignore" });
|
|
29
|
+
if (launched.error || launched.status !== 0)
|
|
30
|
+
return err(cliErr({
|
|
31
|
+
what: "the Desktop session was created but its app did not open",
|
|
32
|
+
why: launched.error
|
|
33
|
+
? causeOf(launched.error)
|
|
34
|
+
: `exit status ${launched.status ?? "unknown"}`,
|
|
35
|
+
remedy: `open this URL manually: ${url}`,
|
|
36
|
+
}));
|
|
37
|
+
return ok(undefined);
|
|
38
|
+
};
|
|
39
|
+
export { launchDesktopUrl };
|
|
40
|
+
//# sourceMappingURL=launch-desktop-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch-desktop-url.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/launch-desktop-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAe,GAAG,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,gBAAgB,GAAG,CACvB,GAAW,EACX,WAA4B,OAAO,CAAC,QAAQ,EACH,EAAE;IAC3C,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC;YACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,IACE,CAAC,MAAM;QACP,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;QAE/D,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,4CAA4C;YAClD,GAAG,EAAE,GAAG;YACR,MAAM,EAAE,sCAAsC;SAC/C,CAAC,CACH,CAAC;IAEJ,MAAM,OAAO,GACX,QAAQ,KAAK,QAAQ;QACnB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;QACjC,CAAC,CAAC,QAAQ,KAAK,OAAO;YACpB,CAAC,CAAC;gBACE,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC;aAC3C;YACH,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9E,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QACzC,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,0DAA0D;YAChE,GAAG,EAAE,QAAQ,CAAC,KAAK;gBACjB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACzB,CAAC,CAAC,eAAe,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE;YACjD,MAAM,EAAE,2BAA2B,GAAG,EAAE;SACzC,CAAC,CACH,CAAC;IACJ,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type CliError } from "../../../_utils/cli-error.js";
|
|
2
|
+
import { type Result } from "../../../_utils/result.js";
|
|
3
|
+
declare const nativeFile: {
|
|
4
|
+
stage(prefix: string, lines: readonly Record<string, unknown>[]): Promise<Result<{
|
|
5
|
+
path: string;
|
|
6
|
+
recoveryCommand: string;
|
|
7
|
+
}, CliError>>;
|
|
8
|
+
install(stagedPath: string, targetPath: string, recoveryCommand: string): Promise<Result<{
|
|
9
|
+
recoveryCommand: string;
|
|
10
|
+
}, CliError>>;
|
|
11
|
+
cleanup(stagedPath: string): Promise<void>;
|
|
12
|
+
launch(binary: string, args: readonly string[], workspace: string): Result<void, CliError>;
|
|
13
|
+
};
|
|
14
|
+
export { nativeFile };
|