@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,174 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { join } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { cliErr } from "../../../_utils/cli-error.js";
5
+ import { findBin, isExecutable } from "../../../_utils/find-bin.js";
6
+ import { parseCursorDb } from "../../../_utils/parse-cursor-db.js";
7
+ import { err, ok } from "../../../_utils/result.js";
8
+ import { cursorStore } from "./cursor-store.js";
9
+ import { nativeFile } from "./native-file.js";
10
+ import { probeAgent } from "./probe-agent.js";
11
+ import { provenanceContext } from "./provenance-context.js";
12
+ const cursorBinary = () => {
13
+ if (process.env.GLEN_CURSOR_BIN)
14
+ return process.env.GLEN_CURSOR_BIN;
15
+ const found = findBin("cursor");
16
+ if (found)
17
+ return found;
18
+ const mac = "/Applications/Cursor.app/Contents/Resources/app/bin/cursor";
19
+ return isExecutable(mac) ? mac : undefined;
20
+ };
21
+ const writeCursorSession = (payload, workspace) => {
22
+ const locate = () => cursorStore.locate(workspace);
23
+ const probe = async () => {
24
+ const paths = await locate();
25
+ if (!paths.ok)
26
+ return paths;
27
+ const store = await cursorStore.probe(paths.value);
28
+ if (!store.ok)
29
+ return store;
30
+ const binary = cursorBinary();
31
+ return probeAgent({
32
+ displayName: "Cursor",
33
+ binName: "cursor",
34
+ ...(binary ? { binaryOverride: binary } : {}),
35
+ versionPattern: /^3\.9\./,
36
+ model: "cursor-auto",
37
+ contextWindowTokens: 128_000,
38
+ startupReserveTokens: 16_384,
39
+ responseReserveTokens: 32_768,
40
+ });
41
+ };
42
+ const stage = async () => {
43
+ const paths = await locate();
44
+ if (!paths.ok)
45
+ return paths;
46
+ const now = Date.now();
47
+ const bubbles = [
48
+ {
49
+ bubbleId: randomUUID(),
50
+ type: 2,
51
+ text: provenanceContext(payload.provenance),
52
+ createdAt: now,
53
+ glenTakeoverProvenance: true,
54
+ },
55
+ ...payload.messages.map((message, index) => ({
56
+ bubbleId: randomUUID(),
57
+ type: message.role === "user" ? 1 : 2,
58
+ text: message.content,
59
+ createdAt: now + index + 1,
60
+ })),
61
+ ];
62
+ const headers = bubbles.map(({ bubbleId, type }) => ({ bubbleId, type }));
63
+ const workspaceIdentifier = {
64
+ id: paths.value.workspaceId,
65
+ uri: {
66
+ $mid: 1,
67
+ fsPath: workspace,
68
+ external: pathToFileURL(workspace).href,
69
+ path: workspace,
70
+ scheme: "file",
71
+ },
72
+ };
73
+ const composer = JSON.stringify({
74
+ _v: 1,
75
+ composerId: payload.destinationSessionId,
76
+ createdAt: now,
77
+ status: "completed",
78
+ conversationState: "completed",
79
+ unifiedMode: "agent",
80
+ forceMode: "edit",
81
+ isAgentic: true,
82
+ isDraft: false,
83
+ hasLoaded: true,
84
+ fullConversationHeadersOnly: headers,
85
+ context: {},
86
+ modelConfig: { modelName: "auto" },
87
+ text: "",
88
+ richText: "",
89
+ queueItems: [],
90
+ todos: [],
91
+ glenTakeover: { sourceEntityId: payload.provenance.sourceEntityId },
92
+ });
93
+ const header = JSON.stringify({
94
+ composerId: payload.destinationSessionId,
95
+ createdAt: now,
96
+ lastUpdatedAt: now,
97
+ type: "head",
98
+ unifiedMode: "agent",
99
+ forceMode: "edit",
100
+ isArchived: false,
101
+ isDraft: false,
102
+ isProject: false,
103
+ isSpec: false,
104
+ isWorktree: false,
105
+ isBestOfNSubcomposer: false,
106
+ hasUnreadMessages: false,
107
+ hasBeenInSidebar: true,
108
+ numSubComposers: 0,
109
+ totalLinesAdded: 0,
110
+ totalLinesRemoved: 0,
111
+ workspaceIdentifier,
112
+ trackedGitRepos: [],
113
+ referencedPlans: [],
114
+ worktreeStartedReadOnly: false,
115
+ });
116
+ const staged = await cursorStore.stage(paths.value, {
117
+ sessionId: payload.destinationSessionId,
118
+ workspaceId: paths.value.workspaceId,
119
+ composer,
120
+ header,
121
+ bubbles: bubbles.map((bubble) => ({
122
+ key: `bubbleId:${payload.destinationSessionId}:${bubble.bubbleId}`,
123
+ value: JSON.stringify(bubble),
124
+ })),
125
+ workspaceIndex: "",
126
+ now,
127
+ });
128
+ return staged.ok
129
+ ? ok({
130
+ path: staged.value.path,
131
+ recoveryCommand: `cursor ${JSON.stringify(workspace)}`,
132
+ })
133
+ : staged;
134
+ };
135
+ const parse = async (staged) => {
136
+ const parsed = await parseCursorDb(join(staged.path, "global.vscdb"));
137
+ if (!parsed.ok)
138
+ return parsed;
139
+ const transcript = parsed.value.find((candidate) => candidate.sessionId === payload.destinationSessionId);
140
+ return transcript
141
+ ? ok(transcript.messages.map(({ role, text }) => ({
142
+ role,
143
+ content: text,
144
+ })))
145
+ : err(cliErr({
146
+ what: "Cursor could not parse the staged takeover conversation",
147
+ path: staged.path,
148
+ remedy: "update Glen and Cursor, then retry",
149
+ }));
150
+ };
151
+ return {
152
+ probe,
153
+ stage,
154
+ parse,
155
+ install: async (staged) => {
156
+ const paths = await locate();
157
+ if (!paths.ok)
158
+ return paths;
159
+ const installed = await cursorStore.install(paths.value, staged.path, payload.destinationSessionId);
160
+ return installed.ok
161
+ ? ok({ recoveryCommand: staged.recoveryCommand })
162
+ : installed;
163
+ },
164
+ launch: async () => {
165
+ const checked = await probe();
166
+ if (!checked.ok)
167
+ return checked;
168
+ return nativeFile.launch(checked.value.binary, [workspace], workspace);
169
+ },
170
+ cleanup: (staged) => cursorStore.cleanup(staged.path),
171
+ };
172
+ };
173
+ export { writeCursorSession };
174
+ //# sourceMappingURL=write-cursor-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-cursor-session.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/write-cursor-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 writePiSession: (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 { writePiSession };
@@ -0,0 +1,173 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { readFile } from "node:fs/promises";
4
+ import { homedir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { causeOf, cliErr } from "../../../_utils/cli-error.js";
7
+ import { parsePiTranscript } from "../../../_utils/parse-pi-transcript.js";
8
+ import { err, fromPromise, ok } from "../../../_utils/result.js";
9
+ import { agentPaths } from "./agent-paths.js";
10
+ import { nativeFile } from "./native-file.js";
11
+ import { probeAgent } from "./probe-agent.js";
12
+ import { provenanceContext } from "./provenance-context.js";
13
+ const readSettings = (path) => {
14
+ try {
15
+ const value = JSON.parse(readFileSync(path, "utf8"));
16
+ return value !== null && typeof value === "object" && !Array.isArray(value)
17
+ ? value
18
+ : {};
19
+ }
20
+ catch {
21
+ return {};
22
+ }
23
+ };
24
+ const piModel = (workspace) => {
25
+ const agentDirectory = process.env.PI_CODING_AGENT_DIR ?? join(homedir(), ".pi", "agent");
26
+ const global = readSettings(join(agentDirectory, "settings.json"));
27
+ const project = readSettings(join(workspace, ".pi", "settings.json"));
28
+ const provider = typeof project.defaultProvider === "string"
29
+ ? project.defaultProvider
30
+ : typeof global.defaultProvider === "string"
31
+ ? global.defaultProvider
32
+ : "";
33
+ const model = typeof project.defaultModel === "string"
34
+ ? project.defaultModel
35
+ : typeof global.defaultModel === "string"
36
+ ? global.defaultModel
37
+ : "";
38
+ const normalized = `${provider}/${model}`;
39
+ const contextWindowTokens = /claude/i.test(model)
40
+ ? 200_000
41
+ : /gpt-5|gpt-4\.1|gpt-4o|gemini-(2\.5|3)/i.test(model)
42
+ ? 128_000
43
+ : 0;
44
+ const api = provider === "anthropic"
45
+ ? "anthropic-messages"
46
+ : provider === "openai"
47
+ ? "openai-responses"
48
+ : provider === "google"
49
+ ? "google-generative-ai"
50
+ : provider;
51
+ return { provider, model, normalized, contextWindowTokens, api };
52
+ };
53
+ const writePiSession = (payload, workspace) => {
54
+ const createdAt = new Date();
55
+ const targetPath = agentPaths.pi(workspace, payload.destinationSessionId, createdAt);
56
+ const model = piModel(workspace);
57
+ const probe = async () => probeAgent({
58
+ displayName: "Pi",
59
+ binName: "pi",
60
+ ...(process.env.GLEN_PI_BIN
61
+ ? { binaryOverride: process.env.GLEN_PI_BIN }
62
+ : {}),
63
+ versionPattern: /\d+\.\d+\.\d+/,
64
+ model: model.normalized,
65
+ contextWindowTokens: model.contextWindowTokens,
66
+ startupReserveTokens: 16_384,
67
+ responseReserveTokens: 32_768,
68
+ });
69
+ const stage = async () => {
70
+ const entryId = () => randomBytes(4).toString("hex");
71
+ const provenanceId = entryId();
72
+ const initial = [
73
+ {
74
+ type: "session",
75
+ version: 3,
76
+ id: payload.destinationSessionId,
77
+ timestamp: createdAt.toISOString(),
78
+ cwd: workspace,
79
+ },
80
+ {
81
+ type: "custom_message",
82
+ id: provenanceId,
83
+ parentId: null,
84
+ timestamp: new Date(createdAt.getTime() + 1).toISOString(),
85
+ customType: "glen-takeover",
86
+ content: provenanceContext(payload.provenance),
87
+ display: true,
88
+ },
89
+ ];
90
+ const lines = payload.messages.reduce((state, message, index) => {
91
+ const id = entryId();
92
+ const timestamp = createdAt.getTime() + index + 2;
93
+ const body = message.role === "user"
94
+ ? { role: "user", content: message.content, timestamp }
95
+ : {
96
+ role: "assistant",
97
+ content: [{ type: "text", text: message.content }],
98
+ api: model.api,
99
+ provider: model.provider,
100
+ model: model.model,
101
+ usage: {
102
+ input: 0,
103
+ output: 0,
104
+ cacheRead: 0,
105
+ cacheWrite: 0,
106
+ totalTokens: 0,
107
+ cost: {
108
+ input: 0,
109
+ output: 0,
110
+ cacheRead: 0,
111
+ cacheWrite: 0,
112
+ total: 0,
113
+ },
114
+ },
115
+ stopReason: "stop",
116
+ timestamp,
117
+ };
118
+ return {
119
+ entries: [
120
+ ...state.entries,
121
+ {
122
+ type: "message",
123
+ id,
124
+ parentId: state.parentId,
125
+ timestamp: new Date(timestamp).toISOString(),
126
+ message: body,
127
+ },
128
+ ],
129
+ parentId: id,
130
+ };
131
+ }, { entries: initial, parentId: provenanceId }).entries;
132
+ const staged = await nativeFile.stage("glen-pi-takeover-", lines);
133
+ return staged.ok
134
+ ? ok({
135
+ ...staged.value,
136
+ recoveryCommand: `pi --session ${payload.destinationSessionId}`,
137
+ })
138
+ : staged;
139
+ };
140
+ const parse = async (staged) => {
141
+ const raw = await fromPromise(readFile(staged.path, "utf8"));
142
+ if (!raw.ok)
143
+ return err(cliErr({
144
+ what: "could not re-read the staged Pi session",
145
+ why: causeOf(raw.error),
146
+ path: staged.path,
147
+ remedy: "retry the takeover command",
148
+ }));
149
+ const parsed = parsePiTranscript(raw.value.split(/\r?\n/).filter(Boolean), payload.destinationSessionId);
150
+ if (!parsed)
151
+ return err(cliErr({
152
+ what: "Pi could not parse the staged transcript",
153
+ path: staged.path,
154
+ remedy: "update Glen and Pi, then retry",
155
+ }));
156
+ return ok(parsed.messages.map(({ role, text }) => ({ role, content: text })));
157
+ };
158
+ return {
159
+ probe,
160
+ stage,
161
+ parse,
162
+ install: (staged) => nativeFile.install(staged.path, targetPath, staged.recoveryCommand),
163
+ launch: async () => {
164
+ const checked = await probe();
165
+ if (!checked.ok)
166
+ return checked;
167
+ return nativeFile.launch(checked.value.binary, ["--session", payload.destinationSessionId], workspace);
168
+ },
169
+ cleanup: (staged) => nativeFile.cleanup(staged.path),
170
+ };
171
+ };
172
+ export { writePiSession };
173
+ //# sourceMappingURL=write-pi-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-pi-session.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/write-pi-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type CliError } from "../../_utils/cli-error.js";
2
+ import { readCredentials } from "../../_utils/credentials.js";
3
+ import { httpJson } from "../../_utils/http.js";
4
+ import { type Result } from "../../_utils/result.js";
5
+ import { readState } from "../../_utils/state.js";
6
+ import { stagedSession } from "./_utils/staged-session.js";
7
+ import { takeoverPayload } from "./takeover.schema.js";
8
+ type Prepared = Extract<ReturnType<typeof takeoverPayload.parsePrepare>, {
9
+ ok: true;
10
+ }>["value"];
11
+ type AdapterResult = Awaited<ReturnType<typeof stagedSession.forTarget>>;
12
+ type Dependencies = {
13
+ readonly readCredentials: typeof readCredentials;
14
+ readonly readState: typeof readState;
15
+ readonly httpJson: typeof httpJson;
16
+ readonly adapterFor: (target: Prepared["targetAgent"], payload: Prepared, workspace: string) => Promise<AdapterResult>;
17
+ readonly cwd: () => string;
18
+ readonly launchOutput: (message: string) => void;
19
+ };
20
+ declare const takeover: (code: string, overrides?: Partial<Dependencies>) => Promise<Result<void, CliError>>;
21
+ export { takeover };
@@ -0,0 +1,201 @@
1
+ import { cliErr } from "../../_utils/cli-error.js";
2
+ import { config } from "../../_utils/config.js";
3
+ import { readCredentials } from "../../_utils/credentials.js";
4
+ import { buildGlenHeaders } from "../../_utils/glen-headers.js";
5
+ import { httpJson, networkRemedy } from "../../_utils/http.js";
6
+ import { err, ok } from "../../_utils/result.js";
7
+ import { readState } from "../../_utils/state.js";
8
+ import { handle426AndReexec, maybeSpawnBackgroundUpdate, } from "../../_utils/update.js";
9
+ import { cliVersion } from "../../_utils/version.js";
10
+ import { canonicalDigest } from "./_utils/canonical-digest.js";
11
+ import { contextFit } from "./_utils/context-fit.js";
12
+ import { stagedSession } from "./_utils/staged-session.js";
13
+ import { takeoverPayload } from "./takeover.schema.js";
14
+ const defaults = {
15
+ readCredentials,
16
+ readState,
17
+ httpJson,
18
+ adapterFor: (target, payload, workspace) => stagedSession.forTarget(target, payload, workspace),
19
+ cwd: () => process.cwd(),
20
+ launchOutput: (message) => process.stdout.write(message),
21
+ };
22
+ const post = async (dependencies, url, body, headers, action) => {
23
+ const response = await dependencies.httpJson(url, {
24
+ method: "POST",
25
+ headers: { "content-type": "application/json", ...headers },
26
+ body: JSON.stringify(body),
27
+ timeoutMs: config.takeoverTimeoutMs,
28
+ });
29
+ if (!response.ok)
30
+ return err(cliErr({
31
+ what: `${action} failed`,
32
+ why: response.error.detail,
33
+ remedy: networkRemedy(response.error),
34
+ }));
35
+ if (response.value.status === 426) {
36
+ handle426AndReexec(process.argv.slice(2));
37
+ return err(cliErr({
38
+ what: "Glen must be updated before this takeover",
39
+ remedy: "run `glen update`, then retry",
40
+ }));
41
+ }
42
+ if (response.value.status === 401 || response.value.status === 403) {
43
+ if (response.value.rawText.includes("no active organization"))
44
+ return err(cliErr({
45
+ what: "no active organization",
46
+ remedy: "run `glen org switch`, then retry",
47
+ }));
48
+ return err(cliErr({
49
+ what: "this takeover is not available to the connected user",
50
+ httpStatus: response.value.status,
51
+ ...(response.value.rawText
52
+ ? { why: response.value.rawText.slice(0, 200) }
53
+ : {}),
54
+ remedy: "confirm you are signed in as the recipient and ask the sender for a new takeover command",
55
+ }));
56
+ }
57
+ if (!response.value.isOk)
58
+ return err(cliErr({
59
+ what: `${action} failed (HTTP ${response.value.status})`,
60
+ httpStatus: response.value.status,
61
+ ...(response.value.rawText
62
+ ? { why: response.value.rawText.slice(0, 200) }
63
+ : {}),
64
+ remedy: "fix the reported problem and retry the same command; no transcript content was truncated",
65
+ }));
66
+ return ok(response.value.json);
67
+ };
68
+ const takeover = async (code, overrides = {}) => {
69
+ void maybeSpawnBackgroundUpdate();
70
+ if (code.trim() === "")
71
+ return err(cliErr({
72
+ what: "missing takeover code",
73
+ remedy: "paste the complete `glen takeover …` command you received",
74
+ }));
75
+ const dependencies = { ...defaults, ...overrides };
76
+ const credentials = await dependencies.readCredentials();
77
+ if (!credentials)
78
+ return err(cliErr({ what: "not connected", remedy: "run `glen login` first" }));
79
+ const state = await dependencies.readState();
80
+ const headers = buildGlenHeaders({
81
+ key: credentials.key,
82
+ state: state ? { ...state, mode: "on" } : null,
83
+ version: cliVersion,
84
+ });
85
+ const preparedResponse = await post(dependencies, config.prepareTakeoverUrl, { code }, headers, "takeover preparation");
86
+ if (!preparedResponse.ok)
87
+ return preparedResponse;
88
+ const parsed = takeoverPayload.parsePrepare(preparedResponse.value);
89
+ if (!parsed.ok)
90
+ return parsed;
91
+ const prepared = parsed.value;
92
+ if (canonicalDigest(prepared.messages) !== prepared.canonicalDigest)
93
+ return err(cliErr({
94
+ what: "the prepared transcript failed its integrity check",
95
+ remedy: "retry once, then ask the sender for a new takeover command; no session was created",
96
+ }));
97
+ const selected = await dependencies.adapterFor(prepared.targetAgent, prepared, dependencies.cwd());
98
+ if (!selected.ok)
99
+ return selected;
100
+ const adapter = selected.value;
101
+ const probe = await adapter.probe();
102
+ if (!probe.ok)
103
+ return probe;
104
+ if (prepared.completed && prepared.targetAgent === "codex-desktop") {
105
+ const settled = adapter.settleRecovery
106
+ ? await adapter.settleRecovery(prepared.destinationSessionId)
107
+ : ok(undefined);
108
+ const url = `codex://threads/${encodeURIComponent(prepared.destinationSessionId)}`;
109
+ const reopened = await adapter.launch({
110
+ destinationSessionId: prepared.destinationSessionId,
111
+ recoveryCommand: `open ${JSON.stringify(url)}`,
112
+ });
113
+ if (!reopened.ok)
114
+ return err(cliErr({
115
+ what: "the completed Codex Desktop takeover did not reopen",
116
+ why: reopened.error.why ?? reopened.error.what,
117
+ remedy: `continue it with \`open ${JSON.stringify(url)}\``,
118
+ }));
119
+ if (!settled.ok)
120
+ return settled;
121
+ dependencies.launchOutput("Takeover already complete — reopened the existing Codex Desktop task.\n");
122
+ return ok(undefined);
123
+ }
124
+ const fit = contextFit({ ...probe.value, messages: prepared.messages });
125
+ if (!fit.ok)
126
+ return fit;
127
+ const recovered = adapter.recover ? await adapter.recover() : ok(null);
128
+ if (!recovered.ok)
129
+ return recovered;
130
+ const installed = recovered.value
131
+ ? ok(recovered.value)
132
+ : await (async () => {
133
+ const staged = await adapter.stage();
134
+ if (!staged.ok)
135
+ return staged;
136
+ const stagedMessages = await adapter.parse(staged.value);
137
+ if (!stagedMessages.ok) {
138
+ await adapter.cleanup(staged.value);
139
+ return stagedMessages;
140
+ }
141
+ if (canonicalDigest(stagedMessages.value) !== prepared.canonicalDigest) {
142
+ await adapter.cleanup(staged.value);
143
+ return err(cliErr({
144
+ what: "the staged native session did not round-trip exactly",
145
+ path: staged.value.path,
146
+ remedy: "update Glen and the target agent, then retry; the staged session was removed and nothing was installed",
147
+ }));
148
+ }
149
+ const next = await adapter.install(staged.value);
150
+ await adapter.cleanup(staged.value);
151
+ return next;
152
+ })();
153
+ if (!installed.ok)
154
+ return installed;
155
+ const completed = await post(dependencies, config.completeTakeoverUrl, {
156
+ takeoverId: prepared.takeoverId,
157
+ destinationSessionId: installed.value.destinationSessionId ?? prepared.destinationSessionId,
158
+ canonicalDigest: prepared.canonicalDigest,
159
+ cliVersion,
160
+ agentVersion: probe.value.version,
161
+ targetModel: probe.value.model,
162
+ }, headers, "takeover completion");
163
+ if (!completed.ok) {
164
+ const definitivelyRejected = completed.error.httpStatus !== undefined &&
165
+ completed.error.httpStatus >= 400 &&
166
+ completed.error.httpStatus < 500 &&
167
+ completed.error.httpStatus !== 426;
168
+ const rolledBack = definitivelyRejected && adapter.rollback
169
+ ? await adapter.rollback(installed.value)
170
+ : ok(null);
171
+ if (!rolledBack.ok)
172
+ return rolledBack;
173
+ const rejectedDesktopTaskArchived = definitivelyRejected && adapter.rollback !== undefined;
174
+ return err(cliErr({
175
+ what: completed.error.what,
176
+ ...(completed.error.httpStatus !== undefined
177
+ ? { httpStatus: completed.error.httpStatus }
178
+ : {}),
179
+ ...(completed.error.why ? { why: completed.error.why } : {}),
180
+ remedy: rejectedDesktopTaskArchived
181
+ ? "the rejected Desktop task was archived; retry the same takeover command to reopen the winning task"
182
+ : `the native session is saved for reuse; retry the same takeover command or continue with \`${installed.value.recoveryCommand}\``,
183
+ }));
184
+ }
185
+ const launched = await adapter.launch(installed.value);
186
+ if (!launched.ok)
187
+ return err(cliErr({
188
+ what: "the takeover session was created but the agent did not launch",
189
+ why: launched.error.why ?? launched.error.what,
190
+ remedy: `continue it with \`${installed.value.recoveryCommand}\``,
191
+ }));
192
+ const settled = adapter.settleRecovery
193
+ ? await adapter.settleRecovery(installed.value.destinationSessionId ?? prepared.destinationSessionId)
194
+ : ok(undefined);
195
+ if (!settled.ok)
196
+ return settled;
197
+ dependencies.launchOutput(`Takeover complete — continuing in a fresh ${prepared.targetAgent} session.\n`);
198
+ return ok(undefined);
199
+ };
200
+ export { takeover };
201
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/takeover/index.ts"],"names":[],"mappings":"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"}