@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.
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 +9 -0
  45. package/dist/commands/takeover/_utils/import-codex-desktop-thread.js +143 -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 +94 -0
  69. package/dist/commands/takeover/_utils/write-codex-desktop-session.js +233 -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,94 @@
1
+ import { archiveCodexDesktopThread } from "./archive-codex-desktop-thread.js";
2
+ import { codexDesktopRecovery } from "./codex-desktop-recovery.js";
3
+ import { importCodexDesktopThread } from "./import-codex-desktop-thread.js";
4
+ import { launchDesktopUrl } from "./launch-desktop-url.js";
5
+ import { provenanceContext } from "./provenance-context.js";
6
+ declare const writeCodexDesktopSession: (payload: {
7
+ readonly takeoverId: string;
8
+ readonly canonicalDigest: string;
9
+ readonly destinationSessionId: string;
10
+ readonly messages: readonly {
11
+ role: "user" | "assistant";
12
+ content: string;
13
+ }[];
14
+ readonly provenance: Parameters<typeof provenanceContext>[0];
15
+ }, workspace: string, options?: {
16
+ readonly binary?: string;
17
+ readonly importThread?: typeof importCodexDesktopThread;
18
+ readonly launchUrl?: typeof launchDesktopUrl;
19
+ readonly recovery?: typeof codexDesktopRecovery;
20
+ readonly archiveThread?: typeof archiveCodexDesktopThread;
21
+ }) => {
22
+ probe: () => Promise<import("../../../_utils/result.js").Result<{
23
+ binary: string;
24
+ model: string;
25
+ version: string;
26
+ contextWindowTokens: number;
27
+ startupReserveTokens: number;
28
+ responseReserveTokens: number;
29
+ }, import("../../../_utils/cli-error.js").CliError>>;
30
+ stage: () => Promise<{
31
+ readonly ok: false;
32
+ readonly error: import("../../../_utils/cli-error.js").CliError;
33
+ } | {
34
+ readonly ok: true;
35
+ readonly value: {
36
+ recoveryCommand: string;
37
+ path: string;
38
+ };
39
+ }>;
40
+ parse: (staged: {
41
+ path: string;
42
+ }) => Promise<{
43
+ readonly ok: false;
44
+ readonly error: import("../../../_utils/cli-error.js").CliError;
45
+ } | {
46
+ readonly ok: true;
47
+ readonly value: {
48
+ role: string;
49
+ content: string;
50
+ }[];
51
+ }>;
52
+ install: (staged: {
53
+ path: string;
54
+ }) => Promise<{
55
+ readonly ok: false;
56
+ readonly error: import("../../../_utils/cli-error.js").CliError;
57
+ } | {
58
+ readonly ok: true;
59
+ readonly value: {
60
+ destinationSessionId: string;
61
+ recoveryCommand: string;
62
+ };
63
+ }>;
64
+ recover: () => Promise<{
65
+ readonly ok: false;
66
+ readonly error: import("../../../_utils/cli-error.js").CliError;
67
+ } | {
68
+ readonly ok: true;
69
+ readonly value: null;
70
+ } | {
71
+ readonly ok: true;
72
+ readonly value: {
73
+ destinationSessionId: string;
74
+ recoveryCommand: string;
75
+ };
76
+ }>;
77
+ settleRecovery: (destinationSessionId: string) => Promise<{
78
+ readonly ok: false;
79
+ readonly error: import("../../../_utils/cli-error.js").CliError;
80
+ } | {
81
+ readonly ok: true;
82
+ readonly value: undefined;
83
+ }>;
84
+ rollback: (installed: {
85
+ destinationSessionId?: string;
86
+ }) => Promise<import("../../../_utils/result.js").Result<void, import("../../../_utils/cli-error.js").CliError>>;
87
+ launch: (installed: {
88
+ destinationSessionId?: string;
89
+ }) => Promise<import("../../../_utils/result.js").Result<void, import("../../../_utils/cli-error.js").CliError>>;
90
+ cleanup: (staged: {
91
+ path: string;
92
+ }) => Promise<void>;
93
+ };
94
+ export { writeCodexDesktopSession };
@@ -0,0 +1,233 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { cliErr } from "../../../_utils/cli-error.js";
3
+ import { findBin, isExecutable } from "../../../_utils/find-bin.js";
4
+ import { err, fromPromise, ok } from "../../../_utils/result.js";
5
+ import { archiveCodexDesktopThread } from "./archive-codex-desktop-thread.js";
6
+ import { codexDesktopRecovery } from "./codex-desktop-recovery.js";
7
+ import { importCodexDesktopThread } from "./import-codex-desktop-thread.js";
8
+ import { launchDesktopUrl } from "./launch-desktop-url.js";
9
+ import { nativeFile } from "./native-file.js";
10
+ import { probeAgent } from "./probe-agent.js";
11
+ import { provenanceContext } from "./provenance-context.js";
12
+ const bundledCodexPath = "/Applications/ChatGPT.app/Contents/Resources/codex";
13
+ const writeCodexDesktopSession = (payload, workspace, options = {}) => {
14
+ const recovery = options.recovery ?? codexDesktopRecovery;
15
+ const archiveThread = options.archiveThread ?? archiveCodexDesktopThread;
16
+ const resolveBinary = () => options.binary ??
17
+ process.env.GLEN_CODEX_DESKTOP_BIN ??
18
+ (process.platform === "darwin" && isExecutable(bundledCodexPath)
19
+ ? bundledCodexPath
20
+ : findBin("codex"));
21
+ const items = [
22
+ {
23
+ type: "message",
24
+ role: "developer",
25
+ content: [
26
+ {
27
+ type: "input_text",
28
+ text: `<glen_takeover_provenance>${provenanceContext(payload.provenance)}</glen_takeover_provenance>`,
29
+ },
30
+ ],
31
+ },
32
+ ...payload.messages.map((message) => ({
33
+ type: "message",
34
+ role: message.role,
35
+ content: [
36
+ {
37
+ type: message.role === "user" ? "input_text" : "output_text",
38
+ text: message.content,
39
+ },
40
+ ],
41
+ })),
42
+ ];
43
+ const parseItems = async (path) => {
44
+ const raw = await fromPromise(readFile(path, "utf8"));
45
+ if (!raw.ok)
46
+ return err(cliErr({
47
+ what: "could not re-read the staged Codex Desktop transcript",
48
+ remedy: "retry the takeover command",
49
+ }));
50
+ const parsed = raw.value
51
+ .split(/\r?\n/)
52
+ .filter(Boolean)
53
+ .map((line) => {
54
+ try {
55
+ return JSON.parse(line);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ });
61
+ if (parsed.some((item) => item === null))
62
+ return err(cliErr({
63
+ what: "Codex Desktop could not parse the staged transcript",
64
+ path,
65
+ remedy: "update Glen and Codex Desktop, then retry",
66
+ }));
67
+ return ok(parsed);
68
+ };
69
+ const installedFromId = (destinationSessionId) => {
70
+ const url = `codex://threads/${encodeURIComponent(destinationSessionId)}`;
71
+ return {
72
+ destinationSessionId,
73
+ recoveryCommand: `open ${JSON.stringify(url)}`,
74
+ };
75
+ };
76
+ const archiveAndClear = async (destinationSessionId) => {
77
+ const binary = resolveBinary();
78
+ if (!binary)
79
+ return err(cliErr({
80
+ what: "could not archive the superseded Codex Desktop task",
81
+ remedy: `open Codex Desktop and archive task ${destinationSessionId}`,
82
+ }));
83
+ const archived = await archiveThread({
84
+ binary,
85
+ threadId: destinationSessionId,
86
+ });
87
+ if (!archived)
88
+ return err(cliErr({
89
+ what: "the superseded Codex Desktop task could not be archived",
90
+ remedy: `archive task ${destinationSessionId} in Codex Desktop, then retry the takeover`,
91
+ }));
92
+ return recovery.clear(payload.takeoverId, destinationSessionId);
93
+ };
94
+ return {
95
+ probe: async () => {
96
+ const binary = resolveBinary();
97
+ return probeAgent({
98
+ displayName: "Codex Desktop",
99
+ binName: "codex",
100
+ ...(binary ? { binaryOverride: binary } : {}),
101
+ // app-server gained the required persisted-thread APIs in 0.144;
102
+ // each protocol call still fails closed if a later build changes them.
103
+ versionPattern: /^codex-cli (?:0\.(?:14[4-9]|1[5-9]\d|[2-9]\d{2,})|[1-9]\d*\.\d+)\./,
104
+ model: "gpt-5.4",
105
+ contextWindowTokens: 128_000,
106
+ startupReserveTokens: 16_384,
107
+ responseReserveTokens: 32_768,
108
+ });
109
+ },
110
+ stage: async () => {
111
+ const staged = await nativeFile.stage("glen-codex-desktop-takeover-", items);
112
+ return staged.ok
113
+ ? ok({ ...staged.value, recoveryCommand: "open Codex Desktop" })
114
+ : staged;
115
+ },
116
+ parse: async (staged) => {
117
+ const parsed = await parseItems(staged.path);
118
+ if (!parsed.ok)
119
+ return parsed;
120
+ const messages = parsed.value.flatMap((item) => {
121
+ if (item.role !== "user" && item.role !== "assistant")
122
+ return [];
123
+ const content = Array.isArray(item.content) ? item.content : [];
124
+ const text = content
125
+ .map((part) => part && typeof part === "object" && "text" in part
126
+ ? part.text
127
+ : null)
128
+ .filter((part) => typeof part === "string")
129
+ .join("");
130
+ return [{ role: item.role, content: text }];
131
+ });
132
+ return ok(messages);
133
+ },
134
+ install: async (staged) => {
135
+ const binary = resolveBinary();
136
+ if (!binary)
137
+ return err(cliErr({
138
+ what: "Codex Desktop is not installed or discoverable",
139
+ remedy: "install or update Codex Desktop, then retry",
140
+ }));
141
+ const parsed = await parseItems(staged.path);
142
+ if (!parsed.ok)
143
+ return parsed;
144
+ const imported = await (options.importThread ?? importCodexDesktopThread)({
145
+ binary,
146
+ workspace,
147
+ name: payload.provenance.sourceTitle,
148
+ items: parsed.value,
149
+ });
150
+ if (!imported.ok)
151
+ return imported;
152
+ const saved = await recovery.save({
153
+ takeoverId: payload.takeoverId,
154
+ canonicalDigest: payload.canonicalDigest,
155
+ destinationSessionId: imported.value,
156
+ });
157
+ if (!saved.ok) {
158
+ const archived = await archiveThread({
159
+ binary,
160
+ threadId: imported.value,
161
+ });
162
+ return archived
163
+ ? saved
164
+ : err(cliErr({
165
+ what: "Codex Desktop imported a task but recovery could not be saved",
166
+ why: saved.error.why ?? saved.error.what,
167
+ remedy: `archive task ${imported.value} in Codex Desktop, then retry`,
168
+ }));
169
+ }
170
+ if (saved.value.destinationSessionId !== imported.value) {
171
+ const archived = await archiveThread({
172
+ binary,
173
+ threadId: imported.value,
174
+ });
175
+ if (!archived)
176
+ return err(cliErr({
177
+ what: "a concurrent Codex Desktop takeover created an extra task",
178
+ remedy: `archive task ${imported.value} in Codex Desktop, then retry`,
179
+ }));
180
+ }
181
+ return ok(installedFromId(saved.value.destinationSessionId));
182
+ },
183
+ recover: async () => {
184
+ const recovered = await recovery.load(payload.takeoverId);
185
+ if (!recovered.ok)
186
+ return recovered;
187
+ if (!recovered.value)
188
+ return ok(null);
189
+ if (recovered.value.canonicalDigest !== payload.canonicalDigest) {
190
+ const cleared = await archiveAndClear(recovered.value.destinationSessionId);
191
+ return cleared.ok ? ok(null) : cleared;
192
+ }
193
+ return ok(installedFromId(recovered.value.destinationSessionId));
194
+ },
195
+ settleRecovery: async (destinationSessionId) => {
196
+ const recovered = await recovery.load(payload.takeoverId);
197
+ if (!recovered.ok)
198
+ return recovered;
199
+ if (recovered.value?.destinationSessionId === destinationSessionId)
200
+ return ok(undefined);
201
+ if (recovered.value) {
202
+ const cleared = await archiveAndClear(recovered.value.destinationSessionId);
203
+ if (!cleared.ok)
204
+ return cleared;
205
+ }
206
+ const saved = await recovery.save({
207
+ takeoverId: payload.takeoverId,
208
+ canonicalDigest: payload.canonicalDigest,
209
+ destinationSessionId,
210
+ });
211
+ return saved.ok ? ok(undefined) : saved;
212
+ },
213
+ rollback: async (installed) => {
214
+ if (!installed.destinationSessionId)
215
+ return err(cliErr({
216
+ what: "could not archive the rejected Codex Desktop task",
217
+ remedy: "open Codex Desktop and archive the task from the failed takeover",
218
+ }));
219
+ return archiveAndClear(installed.destinationSessionId);
220
+ },
221
+ launch: async (installed) => {
222
+ if (!installed.destinationSessionId)
223
+ return err(cliErr({
224
+ what: "Codex Desktop returned no task ID",
225
+ remedy: "update Glen and Codex Desktop, then retry",
226
+ }));
227
+ return (options.launchUrl ?? launchDesktopUrl)(`codex://threads/${encodeURIComponent(installed.destinationSessionId)}`);
228
+ },
229
+ cleanup: (staged) => nativeFile.cleanup(staged.path),
230
+ };
231
+ };
232
+ export { writeCodexDesktopSession };
233
+ //# 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,gBAAgB,GAAG,oDAAoD,CAAC;AAE9E,MAAM,wBAAwB,GAAG,CAC/B,OASC,EACD,SAAiB,EACjB,UAMI,EAAE,EACN,EAAE;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,oBAAoB,CAAC;IAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,yBAAyB,CAAC;IACzE,MAAM,aAAa,GAAG,GAAG,EAAE,CACzB,OAAO,CAAC,MAAM;QACd,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAClC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,YAAY,CAAC,gBAAgB,CAAC;YAC9D,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACxB,MAAM,KAAK,GAAuC;QAChD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,6BAA6B,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,6BAA6B;iBACtG;aACF;SACF;QACD,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACpC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;oBAC5D,IAAI,EAAE,OAAO,CAAC,OAAO;iBACtB;aACF;SACF,CAAC,CAAC;KACJ,CAAC;IACF,MAAM,UAAU,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,EAAE;YACT,OAAO,GAAG,CACR,MAAM,CAAC;gBACL,IAAI,EAAE,uDAAuD;gBAC7D,MAAM,EAAE,4BAA4B;aACrC,CAAC,CACH,CAAC;QACJ,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK;aACrB,KAAK,CAAC,OAAO,CAAC;aACd,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QACL,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;YACtC,OAAO,GAAG,CACR,MAAM,CAAC;gBACL,IAAI,EAAE,qDAAqD;gBAC3D,IAAI;gBACJ,MAAM,EAAE,2CAA2C;aACpD,CAAC,CACH,CAAC;QACJ,OAAO,EAAE,CAAC,MAAmC,CAAC,CAAC;IACjD,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,CAAC,oBAA4B,EAAE,EAAE;QACvD,MAAM,GAAG,GAAG,mBAAmB,kBAAkB,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC1E,OAAO;YACL,oBAAoB;YACpB,eAAe,EAAE,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;SAC/C,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,KAAK,EAAE,oBAA4B,EAAE,EAAE;QAC7D,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM;YACT,OAAO,GAAG,CACR,MAAM,CAAC;gBACL,IAAI,EAAE,qDAAqD;gBAC3D,MAAM,EAAE,uCAAuC,oBAAoB,EAAE;aACtE,CAAC,CACH,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC;YACnC,MAAM;YACN,QAAQ,EAAE,oBAAoB;SAC/B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ;YACX,OAAO,GAAG,CACR,MAAM,CAAC;gBACL,IAAI,EAAE,yDAAyD;gBAC/D,MAAM,EAAE,gBAAgB,oBAAoB,4CAA4C;aACzF,CAAC,CACH,CAAC;QACJ,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;IAClE,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;YAC/B,OAAO,UAAU,CAAC;gBAChB,WAAW,EAAE,eAAe;gBAC5B,OAAO,EAAE,OAAO;gBAChB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,iEAAiE;gBACjE,uEAAuE;gBACvE,cAAc,EACZ,oEAAoE;gBACtE,KAAK,EAAE,SAAS;gBAChB,mBAAmB,EAAE,OAAO;gBAC5B,oBAAoB,EAAE,MAAM;gBAC5B,qBAAqB,EAAE,MAAM;aAC9B,CAAC,CAAC;QACL,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CACnC,8BAA8B,EAC9B,KAAK,CACN,CAAC;YACF,OAAO,MAAM,CAAC,EAAE;gBACd,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,CAAC;gBAChE,CAAC,CAAC,MAAM,CAAC;QACb,CAAC;QACD,KAAK,EAAE,KAAK,EAAE,MAAwB,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,MAAM,CAAC;YAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;oBAAE,OAAO,EAAE,CAAC;gBACjE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,MAAM,IAAI,GAAG,OAAO;qBACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACZ,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI;oBAChD,CAAC,CAAE,IAA2B,CAAC,IAAI;oBACnC,CAAC,CAAC,IAAI,CACT;qBACA,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;qBAC1D,IAAI,CAAC,EAAE,CAAC,CAAC;gBACZ,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAwB,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM;gBACT,OAAO,GAAG,CACR,MAAM,CAAC;oBACL,IAAI,EAAE,gDAAgD;oBACtD,MAAM,EAAE,6CAA6C;iBACtD,CAAC,CACH,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,EAAE;gBAAE,OAAO,MAAM,CAAC;YAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,IAAI,wBAAwB,CAAC,CACvE;gBACE,MAAM;gBACN,SAAS;gBACT,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW;gBACpC,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CACF,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,QAAQ,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;gBAChC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,oBAAoB,EAAE,QAAQ,CAAC,KAAK;aACrC,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACd,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC;oBACnC,MAAM;oBACN,QAAQ,EAAE,QAAQ,CAAC,KAAK;iBACzB,CAAC,CAAC;gBACH,OAAO,QAAQ;oBACb,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,GAAG,CACD,MAAM,CAAC;wBACL,IAAI,EAAE,+DAA+D;wBACrE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI;wBACxC,MAAM,EAAE,gBAAgB,QAAQ,CAAC,KAAK,+BAA+B;qBACtE,CAAC,CACH,CAAC;YACR,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,CAAC,oBAAoB,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACxD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC;oBACnC,MAAM;oBACN,QAAQ,EAAE,QAAQ,CAAC,KAAK;iBACzB,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ;oBACX,OAAO,GAAG,CACR,MAAM,CAAC;wBACL,IAAI,EAAE,2DAA2D;wBACjE,MAAM,EAAE,gBAAgB,QAAQ,CAAC,KAAK,+BAA+B;qBACtE,CAAC,CACH,CAAC;YACN,CAAC;YACD,OAAO,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC1D,IAAI,CAAC,SAAS,CAAC,EAAE;gBAAE,OAAO,SAAS,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC,KAAK;gBAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,SAAS,CAAC,KAAK,CAAC,eAAe,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC;gBAChE,MAAM,OAAO,GAAG,MAAM,eAAe,CACnC,SAAS,CAAC,KAAK,CAAC,oBAAoB,CACrC,CAAC;gBACF,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACzC,CAAC;YACD,OAAO,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,oBAA4B,EAAE,EAAE;YACrD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC1D,IAAI,CAAC,SAAS,CAAC,EAAE;gBAAE,OAAO,SAAS,CAAC;YACpC,IAAI,SAAS,CAAC,KAAK,EAAE,oBAAoB,KAAK,oBAAoB;gBAChE,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;YACvB,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,MAAM,OAAO,GAAG,MAAM,eAAe,CACnC,SAAS,CAAC,KAAK,CAAC,oBAAoB,CACrC,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,EAAE;oBAAE,OAAO,OAAO,CAAC;YAClC,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;gBAChC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,oBAAoB;aACrB,CAAC,CAAC;YACH,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1C,CAAC;QACD,QAAQ,EAAE,KAAK,EAAE,SAA4C,EAAE,EAAE;YAC/D,IAAI,CAAC,SAAS,CAAC,oBAAoB;gBACjC,OAAO,GAAG,CACR,MAAM,CAAC;oBACL,IAAI,EAAE,mDAAmD;oBACzD,MAAM,EACJ,kEAAkE;iBACrE,CAAC,CACH,CAAC;YACJ,OAAO,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,SAA4C,EAAE,EAAE;YAC7D,IAAI,CAAC,SAAS,CAAC,oBAAoB;gBACjC,OAAO,GAAG,CACR,MAAM,CAAC;oBACL,IAAI,EAAE,mCAAmC;oBACzC,MAAM,EAAE,2CAA2C;iBACpD,CAAC,CACH,CAAC;YACJ,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC,CAC5C,mBAAmB,kBAAkB,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,CACxE,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC,MAAwB,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;KACvE,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAiB,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,iBAAiB,GAAG,CACxB,OAOC,EACD,SAAiB,EACjB,EAAE;IACF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE,CACvB,UAAU,CAAC;QACT,WAAW,EAAE,WAAW;QACxB,OAAO,EAAE,OAAO;QAChB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;YAC5B,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE;YAChD,CAAC,CAAC,EAAE,CAAC;QACP,cAAc,EAAE,2BAA2B;QAC3C,KAAK,EAAE,SAAS;QAChB,uEAAuE;QACvE,oEAAoE;QACpE,mBAAmB,EAAE,OAAO;QAC5B,oBAAoB,EAAE,MAAM;QAC5B,qBAAqB,EAAE,MAAM;KAC9B,CAAC,CAAC;IAEL,MAAM,QAAQ,GAAG,CACf,IAAY,EACZ,YAAqC,EACrC,MAAc,EACd,EAAE,CAAC,CAAC;QACJ,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE;QAC/D,IAAI;QACJ,OAAO,EAAE,YAAY;KACtB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACvB,MAAM,KAAK,GAA8B;YACvC,QAAQ,CACN,cAAc,EACd;gBACE,EAAE,EAAE,OAAO,CAAC,oBAAoB;gBAChC,UAAU,EAAE,OAAO,CAAC,oBAAoB;gBACxC,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE;gBAClC,GAAG,EAAE,SAAS;gBACd,UAAU,EAAE,cAAc;gBAC1B,WAAW,EAAE,SAAS;gBACtB,MAAM,EAAE,KAAK;gBACb,cAAc,EAAE,QAAQ;gBACxB,cAAc,EAAE,OAAO;aACxB,EACD,CAAC,CACF;YACD,QAAQ,CACN,cAAc,EACd;gBACE,OAAO,EAAE,UAAU,EAAE;gBACrB,GAAG,EAAE,SAAS;gBACd,YAAY,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAClD,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ;gBAC1D,eAAe,EAAE,YAAY;gBAC7B,cAAc,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;gBAC3C,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,QAAQ;aACjB,EACD,CAAC,CACF;YACD,QAAQ,CACN,eAAe,EACf;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,YAAY;wBAClB,IAAI,EAAE,6BAA6B,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,6BAA6B;qBACtG;iBACF;aACF,EACD,CAAC,CACF;YACD,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CACzC,QAAQ,CACN,eAAe,EACf;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;wBAC5D,IAAI,EAAE,OAAO,CAAC,OAAO;qBACtB;iBACF;aACF,EACD,KAAK,GAAG,CAAC,CACV,CACF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC,EAAE;YACd,CAAC,CAAC,EAAE,CAAC;gBACD,GAAG,MAAM,CAAC,KAAK;gBACf,eAAe,EAAE,gBAAgB,OAAO,CAAC,oBAAoB,EAAE;aAChE,CAAC;YACJ,CAAC,CAAC,MAAM,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,EAAE,MAAwB,EAAE,EAAE;QAC/C,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG,CAAC,EAAE;YACT,OAAO,GAAG,CACR,MAAM,CAAC;gBACL,IAAI,EAAE,4CAA4C;gBAClD,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,4BAA4B;aACrC,CAAC,CACH,CAAC;QACJ,MAAM,MAAM,GAAG,oBAAoB,CACjC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EACxC,OAAO,CAAC,oBAAoB,CAC7B,CAAC;QACF,IAAI,CAAC,MAAM;YACT,OAAO,GAAG,CACR,MAAM,CAAC;gBACL,IAAI,EAAE,6CAA6C;gBACnD,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,mCAAmC;aAC5C,CAAC,CACH,CAAC;QACJ,OAAO,EAAE,CACP,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CACnE,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,OAAO,EAAE,CAAC,MAAiD,EAAE,EAAE,CAC7D,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,eAAe,CAAC;QACrE,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,MAAM,OAAO,GAAG,MAAM,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,EAAE;gBAAE,OAAO,OAAO,CAAC;YAChC,OAAO,UAAU,CAAC,MAAM,CACtB,OAAO,CAAC,KAAK,CAAC,MAAM,EACpB,CAAC,QAAQ,EAAE,OAAO,CAAC,oBAAoB,CAAC,EACxC,SAAS,CACV,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC,MAAwB,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;KACvE,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -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 };