@tryglen/cli 0.24.10 → 0.26.1

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 (86) hide show
  1. package/README.md +55 -28
  2. package/dist/_utils/cli-error.d.ts +1 -0
  3. package/dist/_utils/cli-error.js.map +1 -1
  4. package/dist/_utils/config.d.ts +7 -0
  5. package/dist/_utils/config.js +7 -0
  6. package/dist/_utils/config.js.map +1 -1
  7. package/dist/_utils/parse-cursor-db.js +2 -0
  8. package/dist/_utils/parse-cursor-db.js.map +1 -1
  9. package/dist/_utils/refresh-control-state.d.ts +3 -0
  10. package/dist/_utils/refresh-control-state.js +24 -0
  11. package/dist/_utils/refresh-control-state.js.map +1 -0
  12. package/dist/_utils/sync-mode-from-server.d.ts +1 -2
  13. package/dist/_utils/sync-mode-from-server.js +28 -13
  14. package/dist/_utils/sync-mode-from-server.js.map +1 -1
  15. package/dist/bin.js +10 -0
  16. package/dist/bin.js.map +1 -1
  17. package/dist/commands/ingest.js +8 -4
  18. package/dist/commands/ingest.js.map +1 -1
  19. package/dist/commands/org.js +51 -4
  20. package/dist/commands/org.js.map +1 -1
  21. package/dist/commands/session-start.js +5 -1
  22. package/dist/commands/session-start.js.map +1 -1
  23. package/dist/commands/set-mode.d.ts +3 -4
  24. package/dist/commands/set-mode.js +20 -15
  25. package/dist/commands/set-mode.js.map +1 -1
  26. package/dist/commands/takeover/_utils/agent-paths.d.ts +6 -0
  27. package/dist/commands/takeover/_utils/agent-paths.js +23 -0
  28. package/dist/commands/takeover/_utils/agent-paths.js.map +1 -0
  29. package/dist/commands/takeover/_utils/archive-codex-desktop-thread.d.ts +5 -0
  30. package/dist/commands/takeover/_utils/archive-codex-desktop-thread.js +63 -0
  31. package/dist/commands/takeover/_utils/archive-codex-desktop-thread.js.map +1 -0
  32. package/dist/commands/takeover/_utils/canonical-digest.d.ts +5 -0
  33. package/dist/commands/takeover/_utils/canonical-digest.js +4 -0
  34. package/dist/commands/takeover/_utils/canonical-digest.js.map +1 -0
  35. package/dist/commands/takeover/_utils/codex-desktop-recovery.d.ts +16 -0
  36. package/dist/commands/takeover/_utils/codex-desktop-recovery.js +102 -0
  37. package/dist/commands/takeover/_utils/codex-desktop-recovery.js.map +1 -0
  38. package/dist/commands/takeover/_utils/context-fit.d.ts +18 -0
  39. package/dist/commands/takeover/_utils/context-fit.js +30 -0
  40. package/dist/commands/takeover/_utils/context-fit.js.map +1 -0
  41. package/dist/commands/takeover/_utils/cursor-store.d.ts +49 -0
  42. package/dist/commands/takeover/_utils/cursor-store.js +359 -0
  43. package/dist/commands/takeover/_utils/cursor-store.js.map +1 -0
  44. package/dist/commands/takeover/_utils/import-codex-desktop-thread.d.ts +14 -0
  45. package/dist/commands/takeover/_utils/import-codex-desktop-thread.js +293 -0
  46. package/dist/commands/takeover/_utils/import-codex-desktop-thread.js.map +1 -0
  47. package/dist/commands/takeover/_utils/launch-desktop-url.d.ts +4 -0
  48. package/dist/commands/takeover/_utils/launch-desktop-url.js +40 -0
  49. package/dist/commands/takeover/_utils/launch-desktop-url.js.map +1 -0
  50. package/dist/commands/takeover/_utils/native-file.d.ts +14 -0
  51. package/dist/commands/takeover/_utils/native-file.js +105 -0
  52. package/dist/commands/takeover/_utils/native-file.js.map +1 -0
  53. package/dist/commands/takeover/_utils/probe-agent.d.ts +20 -0
  54. package/dist/commands/takeover/_utils/probe-agent.js +37 -0
  55. package/dist/commands/takeover/_utils/probe-agent.js.map +1 -0
  56. package/dist/commands/takeover/_utils/provenance-context.d.ts +7 -0
  57. package/dist/commands/takeover/_utils/provenance-context.js +12 -0
  58. package/dist/commands/takeover/_utils/provenance-context.js.map +1 -0
  59. package/dist/commands/takeover/_utils/staged-session.d.ts +64 -0
  60. package/dist/commands/takeover/_utils/staged-session.js +30 -0
  61. package/dist/commands/takeover/_utils/staged-session.js.map +1 -0
  62. package/dist/commands/takeover/_utils/write-claude-desktop-session.d.ts +47 -0
  63. package/dist/commands/takeover/_utils/write-claude-desktop-session.js +24 -0
  64. package/dist/commands/takeover/_utils/write-claude-desktop-session.js.map +1 -0
  65. package/dist/commands/takeover/_utils/write-claude-session.d.ts +53 -0
  66. package/dist/commands/takeover/_utils/write-claude-session.js +132 -0
  67. package/dist/commands/takeover/_utils/write-claude-session.js.map +1 -0
  68. package/dist/commands/takeover/_utils/write-codex-desktop-session.d.ts +96 -0
  69. package/dist/commands/takeover/_utils/write-codex-desktop-session.js +272 -0
  70. package/dist/commands/takeover/_utils/write-codex-desktop-session.js.map +1 -0
  71. package/dist/commands/takeover/_utils/write-codex-session.d.ts +52 -0
  72. package/dist/commands/takeover/_utils/write-codex-session.js +117 -0
  73. package/dist/commands/takeover/_utils/write-codex-session.js.map +1 -0
  74. package/dist/commands/takeover/_utils/write-cursor-session.d.ts +57 -0
  75. package/dist/commands/takeover/_utils/write-cursor-session.js +174 -0
  76. package/dist/commands/takeover/_utils/write-cursor-session.js.map +1 -0
  77. package/dist/commands/takeover/_utils/write-pi-session.d.ts +52 -0
  78. package/dist/commands/takeover/_utils/write-pi-session.js +173 -0
  79. package/dist/commands/takeover/_utils/write-pi-session.js.map +1 -0
  80. package/dist/commands/takeover/index.d.ts +21 -0
  81. package/dist/commands/takeover/index.js +201 -0
  82. package/dist/commands/takeover/index.js.map +1 -0
  83. package/dist/commands/takeover/takeover.schema.d.ts +24 -0
  84. package/dist/commands/takeover/takeover.schema.js +66 -0
  85. package/dist/commands/takeover/takeover.schema.js.map +1 -0
  86. package/package.json +1 -1
@@ -0,0 +1,272 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { readFile } from "node:fs/promises";
3
+ import { rm } from "node:fs/promises";
4
+ import { cliErr } from "../../../_utils/cli-error.js";
5
+ import { findBin, isExecutable } from "../../../_utils/find-bin.js";
6
+ import { err, fromPromise, ok } from "../../../_utils/result.js";
7
+ import { agentPaths } from "./agent-paths.js";
8
+ import { archiveCodexDesktopThread } from "./archive-codex-desktop-thread.js";
9
+ import { codexDesktopRecovery } from "./codex-desktop-recovery.js";
10
+ import { importCodexDesktopThread } from "./import-codex-desktop-thread.js";
11
+ import { launchDesktopUrl } from "./launch-desktop-url.js";
12
+ import { nativeFile } from "./native-file.js";
13
+ import { probeAgent } from "./probe-agent.js";
14
+ import { provenanceContext } from "./provenance-context.js";
15
+ const bundledCodexPath = "/Applications/ChatGPT.app/Contents/Resources/codex";
16
+ const transcriptMessage = (role, content) => ({
17
+ role,
18
+ content,
19
+ });
20
+ const removeCodexDesktopSource = (path) => fromPromise(rm(path, { force: true }));
21
+ const writeCodexDesktopSession = (payload, workspace, options = {}) => {
22
+ const recovery = options.recovery ?? codexDesktopRecovery;
23
+ const archiveThread = options.archiveThread ?? archiveCodexDesktopThread;
24
+ const removeSource = options.removeSource ?? removeCodexDesktopSource;
25
+ const resolveBinary = () => options.binary ??
26
+ process.env.GLEN_CODEX_DESKTOP_BIN ??
27
+ (process.platform === "darwin" && isExecutable(bundledCodexPath)
28
+ ? bundledCodexPath
29
+ : findBin("codex"));
30
+ const timestamp = new Date().toISOString();
31
+ const records = [
32
+ ...payload.messages.map((message) => ({
33
+ type: message.role,
34
+ cwd: workspace,
35
+ timestamp,
36
+ message: { content: message.content },
37
+ })),
38
+ ...(payload.provenance.sourceTitle
39
+ ? [
40
+ {
41
+ type: "custom-title",
42
+ customTitle: payload.provenance.sourceTitle,
43
+ },
44
+ ]
45
+ : []),
46
+ ];
47
+ const provenanceItem = {
48
+ type: "message",
49
+ role: "developer",
50
+ content: [
51
+ {
52
+ type: "input_text",
53
+ text: `<glen_takeover_provenance>${provenanceContext(payload.provenance)}</glen_takeover_provenance>`,
54
+ },
55
+ ],
56
+ };
57
+ const parseRecords = async (path) => {
58
+ const raw = await fromPromise(readFile(path, "utf8"));
59
+ if (!raw.ok)
60
+ return err(cliErr({
61
+ what: "could not re-read the staged Codex Desktop transcript",
62
+ remedy: "retry the takeover command",
63
+ }));
64
+ const parsed = raw.value
65
+ .split(/\r?\n/)
66
+ .filter(Boolean)
67
+ .map((line) => {
68
+ try {
69
+ return JSON.parse(line);
70
+ }
71
+ catch {
72
+ return null;
73
+ }
74
+ });
75
+ if (parsed.some((item) => item === null))
76
+ return err(cliErr({
77
+ what: "Codex Desktop could not parse the staged transcript",
78
+ path,
79
+ remedy: "update Glen and Codex Desktop, then retry",
80
+ }));
81
+ return ok(parsed);
82
+ };
83
+ const messagesFromRecords = (parsed) => parsed.flatMap((record) => {
84
+ if (record.type !== "user" && record.type !== "assistant")
85
+ return [];
86
+ const message = record.message && typeof record.message === "object"
87
+ ? record.message
88
+ : null;
89
+ return typeof message?.content === "string"
90
+ ? [transcriptMessage(record.type, message.content)]
91
+ : [];
92
+ });
93
+ const installedFromId = (destinationSessionId) => {
94
+ const url = `codex://threads/${encodeURIComponent(destinationSessionId)}`;
95
+ return {
96
+ destinationSessionId,
97
+ recoveryCommand: `open ${JSON.stringify(url)}`,
98
+ };
99
+ };
100
+ const archiveAndClear = async (destinationSessionId) => {
101
+ const binary = resolveBinary();
102
+ if (!binary)
103
+ return err(cliErr({
104
+ what: "could not archive the superseded Codex Desktop task",
105
+ remedy: `open Codex Desktop and archive task ${destinationSessionId}`,
106
+ }));
107
+ const archived = await archiveThread({
108
+ binary,
109
+ threadId: destinationSessionId,
110
+ });
111
+ if (!archived)
112
+ return err(cliErr({
113
+ what: "the superseded Codex Desktop task could not be archived",
114
+ remedy: `archive task ${destinationSessionId} in Codex Desktop, then retry the takeover`,
115
+ }));
116
+ return recovery.clear(payload.takeoverId, destinationSessionId);
117
+ };
118
+ return {
119
+ probe: async () => {
120
+ const binary = resolveBinary();
121
+ return probeAgent({
122
+ displayName: "Codex Desktop",
123
+ binName: "codex",
124
+ ...(binary ? { binaryOverride: binary } : {}),
125
+ // app-server gained the required persisted-thread APIs in 0.144;
126
+ // each protocol call still fails closed if a later build changes them.
127
+ versionPattern: /^codex-cli (?:0\.(?:14[4-9]|1[5-9]\d|[2-9]\d{2,})|[1-9]\d*\.\d+)\./,
128
+ model: "gpt-5.4",
129
+ contextWindowTokens: 128_000,
130
+ startupReserveTokens: 16_384,
131
+ responseReserveTokens: 32_768,
132
+ });
133
+ },
134
+ stage: async () => {
135
+ const staged = await nativeFile.stage("glen-codex-desktop-takeover-", records);
136
+ return staged.ok
137
+ ? ok({ ...staged.value, recoveryCommand: "open Codex Desktop" })
138
+ : staged;
139
+ },
140
+ parse: async (staged) => {
141
+ const parsed = await parseRecords(staged.path);
142
+ if (!parsed.ok)
143
+ return parsed;
144
+ return ok(messagesFromRecords(parsed.value));
145
+ },
146
+ install: async (staged) => {
147
+ const binary = resolveBinary();
148
+ if (!binary)
149
+ return err(cliErr({
150
+ what: "Codex Desktop is not installed or discoverable",
151
+ remedy: "install or update Codex Desktop, then retry",
152
+ }));
153
+ const parsed = await parseRecords(staged.path);
154
+ if (!parsed.ok)
155
+ return parsed;
156
+ const messages = messagesFromRecords(parsed.value);
157
+ const sourcePath = agentPaths.claude(workspace, `.glen-takeover-${randomUUID()}`);
158
+ const sourceInstalled = await nativeFile.install(staged.path, sourcePath, "");
159
+ if (!sourceInstalled.ok)
160
+ return sourceInstalled;
161
+ const imported = await (options.importThread ?? importCodexDesktopThread)({
162
+ binary,
163
+ workspace,
164
+ name: payload.provenance.sourceTitle,
165
+ sessionPath: sourcePath,
166
+ messages,
167
+ provenanceItem,
168
+ });
169
+ const sourceRemoved = await removeSource(sourcePath);
170
+ if (!sourceRemoved.ok) {
171
+ if (imported.ok) {
172
+ const archived = await archiveThread({
173
+ binary,
174
+ threadId: imported.value,
175
+ });
176
+ if (!archived)
177
+ return err(cliErr({
178
+ what: "temporary Codex import cleanup failed and the imported task remains",
179
+ path: sourcePath,
180
+ remedy: `archive task ${imported.value} in Codex Desktop, remove the reported temporary session, then retry`,
181
+ }));
182
+ }
183
+ return err(cliErr({
184
+ what: "could not remove the temporary Codex import source",
185
+ path: sourcePath,
186
+ remedy: "remove the reported temporary session, then retry the takeover",
187
+ }));
188
+ }
189
+ if (!imported.ok)
190
+ return imported;
191
+ const saved = await recovery.save({
192
+ takeoverId: payload.takeoverId,
193
+ canonicalDigest: payload.canonicalDigest,
194
+ destinationSessionId: imported.value,
195
+ });
196
+ if (!saved.ok) {
197
+ const archived = await archiveThread({
198
+ binary,
199
+ threadId: imported.value,
200
+ });
201
+ return archived
202
+ ? saved
203
+ : err(cliErr({
204
+ what: "Codex Desktop imported a task but recovery could not be saved",
205
+ why: saved.error.why ?? saved.error.what,
206
+ remedy: `archive task ${imported.value} in Codex Desktop, then retry`,
207
+ }));
208
+ }
209
+ if (saved.value.destinationSessionId !== imported.value) {
210
+ const archived = await archiveThread({
211
+ binary,
212
+ threadId: imported.value,
213
+ });
214
+ if (!archived)
215
+ return err(cliErr({
216
+ what: "a concurrent Codex Desktop takeover created an extra task",
217
+ remedy: `archive task ${imported.value} in Codex Desktop, then retry`,
218
+ }));
219
+ }
220
+ return ok(installedFromId(saved.value.destinationSessionId));
221
+ },
222
+ recover: async () => {
223
+ const recovered = await recovery.load(payload.takeoverId);
224
+ if (!recovered.ok)
225
+ return recovered;
226
+ if (!recovered.value)
227
+ return ok(null);
228
+ if (recovered.value.canonicalDigest !== payload.canonicalDigest) {
229
+ const cleared = await archiveAndClear(recovered.value.destinationSessionId);
230
+ return cleared.ok ? ok(null) : cleared;
231
+ }
232
+ return ok(installedFromId(recovered.value.destinationSessionId));
233
+ },
234
+ settleRecovery: async (destinationSessionId) => {
235
+ const recovered = await recovery.load(payload.takeoverId);
236
+ if (!recovered.ok)
237
+ return recovered;
238
+ if (recovered.value?.destinationSessionId === destinationSessionId)
239
+ return ok(undefined);
240
+ if (recovered.value) {
241
+ const cleared = await archiveAndClear(recovered.value.destinationSessionId);
242
+ if (!cleared.ok)
243
+ return cleared;
244
+ }
245
+ const saved = await recovery.save({
246
+ takeoverId: payload.takeoverId,
247
+ canonicalDigest: payload.canonicalDigest,
248
+ destinationSessionId,
249
+ });
250
+ return saved.ok ? ok(undefined) : saved;
251
+ },
252
+ rollback: async (installed) => {
253
+ if (!installed.destinationSessionId)
254
+ return err(cliErr({
255
+ what: "could not archive the rejected Codex Desktop task",
256
+ remedy: "open Codex Desktop and archive the task from the failed takeover",
257
+ }));
258
+ return archiveAndClear(installed.destinationSessionId);
259
+ },
260
+ launch: async (installed) => {
261
+ if (!installed.destinationSessionId)
262
+ return err(cliErr({
263
+ what: "Codex Desktop returned no task ID",
264
+ remedy: "update Glen and Codex Desktop, then retry",
265
+ }));
266
+ return (options.launchUrl ?? launchDesktopUrl)(`codex://threads/${encodeURIComponent(installed.destinationSessionId)}`);
267
+ },
268
+ cleanup: (staged) => nativeFile.cleanup(staged.path),
269
+ };
270
+ };
271
+ export { writeCodexDesktopSession };
272
+ //# sourceMappingURL=write-codex-desktop-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-codex-desktop-session.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/write-codex-desktop-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type CliError } from "../../../_utils/cli-error.js";
2
+ import { provenanceContext } from "./provenance-context.js";
3
+ declare const writeCodexSession: (payload: {
4
+ readonly destinationSessionId: string;
5
+ readonly messages: readonly {
6
+ role: "user" | "assistant";
7
+ content: string;
8
+ }[];
9
+ readonly provenance: Parameters<typeof provenanceContext>[0];
10
+ }, workspace: string) => {
11
+ probe: () => Promise<import("../../../_utils/result.js").Result<{
12
+ binary: string;
13
+ model: string;
14
+ version: string;
15
+ contextWindowTokens: number;
16
+ startupReserveTokens: number;
17
+ responseReserveTokens: number;
18
+ }, CliError>>;
19
+ stage: () => Promise<{
20
+ readonly ok: false;
21
+ readonly error: CliError;
22
+ } | {
23
+ readonly ok: true;
24
+ readonly value: {
25
+ recoveryCommand: string;
26
+ path: string;
27
+ };
28
+ }>;
29
+ parse: (staged: {
30
+ path: string;
31
+ }) => Promise<{
32
+ readonly ok: false;
33
+ readonly error: CliError;
34
+ } | {
35
+ readonly ok: true;
36
+ readonly value: {
37
+ role: "user" | "assistant";
38
+ content: string;
39
+ }[];
40
+ }>;
41
+ install: (staged: {
42
+ path: string;
43
+ recoveryCommand: string;
44
+ }) => Promise<import("../../../_utils/result.js").Result<{
45
+ recoveryCommand: string;
46
+ }, CliError>>;
47
+ launch: () => Promise<import("../../../_utils/result.js").Result<void, CliError>>;
48
+ cleanup: (staged: {
49
+ path: string;
50
+ }) => Promise<void>;
51
+ };
52
+ export { writeCodexSession };
@@ -0,0 +1,117 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { readFile } from "node:fs/promises";
3
+ import { causeOf, cliErr } from "../../../_utils/cli-error.js";
4
+ import { parseCodexTranscript } from "../../../_utils/parse-codex-transcript.js";
5
+ import { err, fromPromise, ok } from "../../../_utils/result.js";
6
+ import { agentPaths } from "./agent-paths.js";
7
+ import { nativeFile } from "./native-file.js";
8
+ import { probeAgent } from "./probe-agent.js";
9
+ import { provenanceContext } from "./provenance-context.js";
10
+ const writeCodexSession = (payload, workspace) => {
11
+ const createdAt = new Date();
12
+ const targetPath = agentPaths.codex(payload.destinationSessionId, createdAt);
13
+ const probe = async () => probeAgent({
14
+ displayName: "Codex CLI",
15
+ binName: "codex",
16
+ ...(process.env.GLEN_CODEX_BIN
17
+ ? { binaryOverride: process.env.GLEN_CODEX_BIN }
18
+ : {}),
19
+ versionPattern: /^codex-cli 0\.(143|144)\./,
20
+ model: "gpt-5.4",
21
+ // Lower than the 258,400-token window reported by the verified format,
22
+ // so config-selected compatible models cannot accidentally overfit.
23
+ contextWindowTokens: 128_000,
24
+ startupReserveTokens: 16_384,
25
+ responseReserveTokens: 32_768,
26
+ });
27
+ const envelope = (type, payloadValue, offset) => ({
28
+ timestamp: new Date(createdAt.getTime() + offset).toISOString(),
29
+ type,
30
+ payload: payloadValue,
31
+ });
32
+ const stage = async () => {
33
+ const lines = [
34
+ envelope("session_meta", {
35
+ id: payload.destinationSessionId,
36
+ session_id: payload.destinationSessionId,
37
+ timestamp: createdAt.toISOString(),
38
+ cwd: workspace,
39
+ originator: "codex_cli_rs",
40
+ cli_version: "0.143.0",
41
+ source: "cli",
42
+ model_provider: "openai",
43
+ context_window: 128_000,
44
+ }, 0),
45
+ envelope("turn_context", {
46
+ turn_id: randomUUID(),
47
+ cwd: workspace,
48
+ current_date: createdAt.toISOString().slice(0, 10),
49
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
50
+ approval_policy: "on-request",
51
+ sandbox_policy: { type: "workspace-write" },
52
+ model: "gpt-5.4",
53
+ effort: "medium",
54
+ }, 1),
55
+ envelope("response_item", {
56
+ type: "message",
57
+ role: "developer",
58
+ content: [
59
+ {
60
+ type: "input_text",
61
+ text: `<glen_takeover_provenance>${provenanceContext(payload.provenance)}</glen_takeover_provenance>`,
62
+ },
63
+ ],
64
+ }, 2),
65
+ ...payload.messages.map((message, index) => envelope("response_item", {
66
+ type: "message",
67
+ role: message.role,
68
+ content: [
69
+ {
70
+ type: message.role === "user" ? "input_text" : "output_text",
71
+ text: message.content,
72
+ },
73
+ ],
74
+ }, index + 3)),
75
+ ];
76
+ const staged = await nativeFile.stage("glen-codex-takeover-", lines);
77
+ return staged.ok
78
+ ? ok({
79
+ ...staged.value,
80
+ recoveryCommand: `codex resume ${payload.destinationSessionId}`,
81
+ })
82
+ : staged;
83
+ };
84
+ const parse = async (staged) => {
85
+ const raw = await fromPromise(readFile(staged.path, "utf8"));
86
+ if (!raw.ok)
87
+ return err(cliErr({
88
+ what: "could not re-read the staged Codex session",
89
+ why: causeOf(raw.error),
90
+ path: staged.path,
91
+ remedy: "retry the takeover command",
92
+ }));
93
+ const parsed = parseCodexTranscript(raw.value.split(/\r?\n/).filter(Boolean), payload.destinationSessionId);
94
+ if (!parsed)
95
+ return err(cliErr({
96
+ what: "Codex could not parse the staged transcript",
97
+ path: staged.path,
98
+ remedy: "update Glen and Codex, then retry",
99
+ }));
100
+ return ok(parsed.messages.map(({ role, text }) => ({ role, content: text })));
101
+ };
102
+ return {
103
+ probe,
104
+ stage,
105
+ parse,
106
+ install: (staged) => nativeFile.install(staged.path, targetPath, staged.recoveryCommand),
107
+ launch: async () => {
108
+ const checked = await probe();
109
+ if (!checked.ok)
110
+ return checked;
111
+ return nativeFile.launch(checked.value.binary, ["resume", payload.destinationSessionId], workspace);
112
+ },
113
+ cleanup: (staged) => nativeFile.cleanup(staged.path),
114
+ };
115
+ };
116
+ export { writeCodexSession };
117
+ //# sourceMappingURL=write-codex-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-codex-session.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/write-codex-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { provenanceContext } from "./provenance-context.js";
2
+ declare const writeCursorSession: (payload: {
3
+ readonly destinationSessionId: string;
4
+ readonly messages: readonly {
5
+ role: "user" | "assistant";
6
+ content: string;
7
+ }[];
8
+ readonly provenance: Parameters<typeof provenanceContext>[0];
9
+ }, workspace: string) => {
10
+ probe: () => Promise<import("../../../_utils/result.js").Result<{
11
+ binary: string;
12
+ model: string;
13
+ version: string;
14
+ contextWindowTokens: number;
15
+ startupReserveTokens: number;
16
+ responseReserveTokens: number;
17
+ }, import("../../../_utils/cli-error.js").CliError>>;
18
+ stage: () => Promise<{
19
+ readonly ok: false;
20
+ readonly error: import("../../../_utils/cli-error.js").CliError;
21
+ } | {
22
+ readonly ok: true;
23
+ readonly value: {
24
+ path: string;
25
+ recoveryCommand: string;
26
+ };
27
+ }>;
28
+ parse: (staged: {
29
+ path: string;
30
+ }) => Promise<{
31
+ readonly ok: false;
32
+ readonly error: import("../../../_utils/cli-error.js").CliError;
33
+ } | {
34
+ readonly ok: true;
35
+ readonly value: {
36
+ role: "user" | "assistant";
37
+ content: string;
38
+ }[];
39
+ }>;
40
+ install: (staged: {
41
+ path: string;
42
+ recoveryCommand: string;
43
+ }) => Promise<{
44
+ readonly ok: false;
45
+ readonly error: import("../../../_utils/cli-error.js").CliError;
46
+ } | {
47
+ readonly ok: true;
48
+ readonly value: {
49
+ recoveryCommand: string;
50
+ };
51
+ }>;
52
+ launch: () => Promise<import("../../../_utils/result.js").Result<void, import("../../../_utils/cli-error.js").CliError>>;
53
+ cleanup: (staged: {
54
+ path: string;
55
+ }) => Promise<void>;
56
+ };
57
+ export { writeCursorSession };