@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
@@ -7,6 +7,31 @@ import { httpJson, networkRemedy } from "../_utils/http.js";
7
7
  import { err, ok } from "../_utils/result.js";
8
8
  import { readState, statePath, writeState } from "../_utils/state.js";
9
9
  import { cliVersion } from "../_utils/version.js";
10
+ const postSwitchAudit = async (url, key, state, body) => {
11
+ const response = await httpJson(url, {
12
+ method: "POST",
13
+ headers: {
14
+ "content-type": "application/json",
15
+ ...buildGlenHeaders({ key, state, version: cliVersion }),
16
+ },
17
+ body: JSON.stringify(body),
18
+ timeoutMs: config.setRecordingTimeoutMs,
19
+ });
20
+ if (!response.ok)
21
+ return err(cliErr({
22
+ what: "could not log the organization switch — organization unchanged",
23
+ why: response.error.detail,
24
+ remedy: networkRemedy(response.error),
25
+ }));
26
+ if (!response.value.isOk)
27
+ return err(cliErr({
28
+ what: "could not log the organization switch — organization unchanged",
29
+ why: response.value.rawText.slice(0, 200) ||
30
+ `HTTP ${response.value.status}`,
31
+ remedy: "try again in a minute",
32
+ }));
33
+ return ok(response.value.json);
34
+ };
10
35
  const fetchOrgs = async () => {
11
36
  const creds = await readCredentials();
12
37
  if (!creds)
@@ -47,20 +72,42 @@ const fetchOrgs = async () => {
47
72
  return ok(orgs);
48
73
  };
49
74
  const applySwitch = async (target) => {
75
+ const credentials = await readCredentials();
76
+ if (!credentials)
77
+ return err(cliErr({ what: "not connected", remedy: "run `glen login` first" }));
50
78
  const current = await readState();
51
- const w = await writeState({
79
+ const next = {
52
80
  activeOrgId: target.orgId,
53
81
  activeOrgSlug: target.slug,
54
82
  activeOrgName: target.name,
55
- // Switching org preserves the current recording mode (on/off/incognito).
56
83
  mode: current?.mode ?? "on",
57
- });
58
- if (!w.ok)
84
+ ...(current?.modeUpdatedAt ? { modeUpdatedAt: current.modeUpdatedAt } : {}),
85
+ };
86
+ const started = await postSwitchAudit(config.beginOrgSwitchUrl, credentials.key, next, { previousOrgId: current?.activeOrgId ?? null });
87
+ if (!started.ok)
88
+ return started;
89
+ const eventId = started.value?.id;
90
+ if (typeof eventId !== "string")
59
91
  return err(cliErr({
92
+ what: "could not log the organization switch — organization unchanged",
93
+ remedy: "run `glen update` and retry",
94
+ }));
95
+ const w = await writeState(next);
96
+ if (!w.ok)
97
+ return postSwitchAudit(config.finishOrgSwitchUrl, credentials.key, next, {
98
+ eventId,
99
+ outcome: "failed",
100
+ }).then(() => err(cliErr({
60
101
  what: "could not save org selection",
61
102
  why: causeOf(w.error),
62
103
  path: statePath(),
63
104
  remedy: "check ownership of ~/.glen (e.g. `sudo chown -R $USER ~/.glen`) and retry",
105
+ })));
106
+ const finished = await postSwitchAudit(config.finishOrgSwitchUrl, credentials.key, next, { eventId, outcome: "applied" });
107
+ if (!finished.ok)
108
+ return err(cliErr({
109
+ what: "organization changed, but its audit log could not be completed",
110
+ remedy: "retry `glen org switch` to confirm the selection",
64
111
  }));
65
112
  process.stdout.write(`🏔️ Active organization is now ${target.name} (${target.slug}).\n`);
66
113
  return ok(undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"org.js","sourceRoot":"","sources":["../../src/commands/org.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"org.js","sourceRoot":"","sources":["../../src/commands/org.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { spawn } from "node:child_process";
2
2
  import { config } from "../_utils/config.js";
3
3
  import { readCredentials } from "../_utils/credentials.js";
4
4
  import { isEphemeralSession } from "../_utils/ephemeral-session.js";
5
+ import { refreshControlState } from "../_utils/refresh-control-state.js";
5
6
  import { recordSession } from "../_utils/session-map.js";
6
7
  import { rememberStateLine } from "../_utils/state-line-memo.js";
7
8
  import { formatStateLine } from "../_utils/state-line.js";
@@ -86,10 +87,13 @@ const sessionStart = async (agent) => {
86
87
  const cwd = typeof event?.cwd === "string" ? event.cwd : process.cwd();
87
88
  await recordSession(cwd, sessionId);
88
89
  }
89
- const [credentials, state] = await Promise.all([
90
+ const [credentials, localState] = await Promise.all([
90
91
  readCredentials(),
91
92
  readState(),
92
93
  ]);
94
+ const state = credentials && localState
95
+ ? await refreshControlState(credentials.key, localState)
96
+ : localState;
93
97
  const noOrgHint = "[glen] no org selected — ask the user whether to set up glen, then use the setup skill.";
94
98
  const reviewLinkInstruction = `When you share a GitHub pull request URL, also surface its Glen review link (${config.baseUrl}/review/<owner>/<repo>/<number>) so the team can open the PR in Glen's reviewer.`;
95
99
  // Self-identifying provenance: if these lines ever surface somewhere
@@ -1 +1 @@
1
- {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/commands/session-start.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/commands/session-start.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,9 @@ import { type Result } from "../_utils/result.js";
3
3
  import { type GlenMode } from "../_utils/state.js";
4
4
  /**
5
5
  * Set the recording/injection mode. Shared by `glen on|off|incognito|silent`.
6
- * `on`/`incognito`/`silent` set the account-wide server preference FIRST (the
7
- * source of truth, enforced server-side) and mirror it locally only on
8
- * success; `off` is machine-local by definition (this machine's hooks stop
9
- * injecting entirely) and never touches the server preference.
6
+ * Every mode sets the account-wide server preference FIRST (the source of
7
+ * truth, enforced server-side) and mirrors the accepted state locally only on
8
+ * success.
10
9
  */
11
10
  declare const setMode: (mode: GlenMode) => Promise<Result<void, CliError>>;
12
11
  export { setMode };
@@ -9,7 +9,7 @@ import { handle426AndReexec } from "../_utils/update.js";
9
9
  import { cliVersion } from "../_utils/version.js";
10
10
  const confirmation = {
11
11
  on: "🏔️ glen is ON — injecting context and recording (account-wide).\n",
12
- off: "🏔️ glen is OFF — nothing is injected or recorded on this machine until you run `glen on`.\n",
12
+ off: "🏔️ glen is OFF — nothing is injected or recorded on any machine or agent until you run `glen on`.\n",
13
13
  incognito: "🏔️ Incognito ON — glen keeps recalling but records nothing, on every machine and agent, until you run `glen on`.\n",
14
14
  silent: "🏔️ Silent ON — glen keeps recording but surfaces nothing (no recall, no suggestions, no search results), on every machine and agent, until you run `glen on`.\n",
15
15
  };
@@ -29,10 +29,7 @@ const pushServerPreference = async (state, mode) => {
29
29
  "content-type": "application/json",
30
30
  ...buildGlenHeaders({ key: creds.key, state, version: cliVersion }),
31
31
  },
32
- body: JSON.stringify({
33
- incognito: mode === "incognito",
34
- silent: mode === "silent",
35
- }),
32
+ body: JSON.stringify({ mode }),
36
33
  timeoutMs: config.setRecordingTimeoutMs,
37
34
  });
38
35
  if (!res.ok)
@@ -61,14 +58,22 @@ const pushServerPreference = async (state, mode) => {
61
58
  remedy: "try again in a minute — if it persists, check https://tryglen.com/status",
62
59
  }));
63
60
  const d = res.value.json;
64
- return ok(typeof d?.updatedAt === "string" ? d.updatedAt : null);
61
+ const acceptedMode = d?.mode === "on" ||
62
+ d?.mode === "off" ||
63
+ d?.mode === "incognito" ||
64
+ d?.mode === "silent"
65
+ ? d.mode
66
+ : mode;
67
+ return ok({
68
+ mode: acceptedMode,
69
+ updatedAt: typeof d?.updatedAt === "string" ? d.updatedAt : null,
70
+ });
65
71
  };
66
72
  /**
67
73
  * Set the recording/injection mode. Shared by `glen on|off|incognito|silent`.
68
- * `on`/`incognito`/`silent` set the account-wide server preference FIRST (the
69
- * source of truth, enforced server-side) and mirror it locally only on
70
- * success; `off` is machine-local by definition (this machine's hooks stop
71
- * injecting entirely) and never touches the server preference.
74
+ * Every mode sets the account-wide server preference FIRST (the source of
75
+ * truth, enforced server-side) and mirrors the accepted state locally only on
76
+ * success.
72
77
  */
73
78
  const setMode = async (mode) => {
74
79
  const current = await readState();
@@ -77,14 +82,14 @@ const setMode = async (mode) => {
77
82
  what: "no active organization",
78
83
  remedy: "run `glen org switch` (or `glen login`) first",
79
84
  }));
80
- const pushed = mode === "off" ? null : await pushServerPreference(current, mode);
81
- if (pushed && !pushed.ok)
85
+ const pushed = await pushServerPreference(current, mode);
86
+ if (!pushed.ok)
82
87
  return pushed;
83
88
  const w = await writeState({
84
89
  ...current,
85
- mode,
86
- ...(pushed?.ok && pushed.value !== null
87
- ? { modeUpdatedAt: pushed.value }
90
+ mode: pushed.value.mode,
91
+ ...(pushed.value.updatedAt !== null
92
+ ? { modeUpdatedAt: pushed.value.updatedAt }
88
93
  : {}),
89
94
  });
90
95
  if (!w.ok)
@@ -1 +1 @@
1
- {"version":3,"file":"set-mode.js","sourceRoot":"","sources":["../../src/commands/set-mode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"set-mode.js","sourceRoot":"","sources":["../../src/commands/set-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAe,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAGL,SAAS,EACT,SAAS,EACT,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,YAAY,GAA6B;IAC7C,EAAE,EAAE,oEAAoE;IACxE,GAAG,EAAE,sGAAsG;IAC3G,SAAS,EACP,qHAAqH;IACvH,MAAM,EACJ,kKAAkK;CACrK,CAAC;AAEF,2EAA2E;AAC3E,0EAA0E;AAC1E,8EAA8E;AAC9E,wEAAwE;AACxE,2EAA2E;AAC3E,mBAAmB;AACnB,MAAM,oBAAoB,GAAG,KAAK,EAChC,KAAgB,EAChB,IAAc,EAC2D,EAAE;IAC3E,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK;QACR,OAAO,GAAG,CACR,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC,CACpE,CAAC;IACJ,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE;QACjD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,gBAAgB,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;SACpE;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC,qBAAqB;KACxC,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,4DAA4D;YAClE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;YACrB,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;SACjC,CAAC,CACH,CAAC;IACJ,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG;QAAE,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACzD,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACtD,OAAO,GAAG,CACR,MAAM,CAAC;gBACL,IAAI,EAAE,wBAAwB;gBAC9B,MAAM,EAAE,uBAAuB;aAChC,CAAC,CACH,CAAC;QACJ,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,+BAA+B;SACxC,CAAC,CACH,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI;QACjB,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,mDAAmD,GAAG,CAAC,KAAK,CAAC,MAAM,oBAAoB;YAC7F,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE;YAClE,MAAM,EACJ,0EAA0E;SAC7E,CAAC,CACH,CAAC;IACJ,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAsD,CAAC;IAC3E,MAAM,YAAY,GAChB,CAAC,EAAE,IAAI,KAAK,IAAI;QAChB,CAAC,EAAE,IAAI,KAAK,KAAK;QACjB,CAAC,EAAE,IAAI,KAAK,WAAW;QACvB,CAAC,EAAE,IAAI,KAAK,QAAQ;QAClB,CAAC,CAAC,CAAC,CAAC,IAAI;QACR,CAAC,CAAC,IAAI,CAAC;IACX,OAAO,EAAE,CAAC;QACR,IAAI,EAAE,YAAY;QAClB,SAAS,EAAE,OAAO,CAAC,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;KACjE,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,OAAO,GAAG,KAAK,EAAE,IAAc,EAAmC,EAAE;IACxE,MAAM,OAAO,GAAG,MAAM,SAAS,EAAE,CAAC;IAClC,IAAI,CAAC,OAAO;QACV,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,wBAAwB;YAC9B,MAAM,EAAE,+CAA+C;SACxD,CAAC,CACH,CAAC;IACJ,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,CAAC,GAAG,MAAM,UAAU,CAAC;QACzB,GAAG,OAAO;QACV,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;QACvB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI;YACjC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE;YAC3C,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,CAAC,EAAE;QACP,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,0BAA0B;YAChC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;YACrB,IAAI,EAAE,SAAS,EAAE;YACjB,MAAM,EACJ,2EAA2E;SAC9E,CAAC,CACH,CAAC;IACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ declare const agentPaths: {
2
+ claude(workspace: string, sessionId: string): string;
3
+ codex(sessionId: string, date?: Date): string;
4
+ pi(workspace: string, sessionId: string, date?: Date): string;
5
+ };
6
+ export { agentPaths };
@@ -0,0 +1,23 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ const projectKey = (workspace) => workspace.replaceAll("/", "-").replace(/[^A-Za-z0-9._-]/g, "-");
4
+ const agentPaths = {
5
+ claude(workspace, sessionId) {
6
+ const root = process.env.GLEN_CLAUDE_HOME ?? join(homedir(), ".claude");
7
+ return join(root, "projects", projectKey(workspace), `${sessionId}.jsonl`);
8
+ },
9
+ codex(sessionId, date = new Date()) {
10
+ const root = process.env.GLEN_CODEX_HOME ?? join(homedir(), ".codex");
11
+ const day = date.toISOString().slice(0, 10);
12
+ const timestamp = date.toISOString().replace(/[:.]/g, "-");
13
+ return join(root, "sessions", day.slice(0, 4), day.slice(5, 7), day.slice(8, 10), `rollout-${timestamp}-${sessionId}.jsonl`);
14
+ },
15
+ pi(workspace, sessionId, date = new Date()) {
16
+ const root = process.env.GLEN_PI_HOME ?? join(homedir(), ".pi", "agent");
17
+ const sessionRoot = process.env.PI_CODING_AGENT_SESSION_DIR;
18
+ const timestamp = date.toISOString().replace(/[:.]/g, "-");
19
+ return join(sessionRoot ?? join(root, "sessions"), projectKey(workspace), `${timestamp}_${sessionId}.jsonl`);
20
+ },
21
+ };
22
+ export { agentPaths };
23
+ //# sourceMappingURL=agent-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-paths.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/agent-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAU,EAAE,CAC/C,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;AAElE,MAAM,UAAU,GAAG;IACjB,MAAM,CAAC,SAAiB,EAAE,SAAiB;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;IAC7E,CAAC;IACD,KAAK,CAAC,SAAiB,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3D,OAAO,IAAI,CACT,IAAI,EACJ,UAAU,EACV,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EACf,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EACf,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAChB,WAAW,SAAS,IAAI,SAAS,QAAQ,CAC1C,CAAC;IACJ,CAAC;IACD,EAAE,CAAC,SAAiB,EAAE,SAAiB,EAAE,IAAI,GAAG,IAAI,IAAI,EAAE;QACxD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC3D,OAAO,IAAI,CACT,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EACrC,UAAU,CAAC,SAAS,CAAC,EACrB,GAAG,SAAS,IAAI,SAAS,QAAQ,CAClC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ declare const archiveCodexDesktopThread: (input: {
2
+ readonly binary: string;
3
+ readonly threadId: string;
4
+ }) => Promise<boolean>;
5
+ export { archiveCodexDesktopThread };
@@ -0,0 +1,63 @@
1
+ import { spawn } from "node:child_process";
2
+ import { cliVersion } from "../../../_utils/version.js";
3
+ const CLEANUP_TIMEOUT_MS = 5_000;
4
+ const archiveCodexDesktopThread = (input) => new Promise((resolve) => {
5
+ const child = spawn(input.binary, ["app-server"], {
6
+ stdio: ["pipe", "pipe", "ignore"],
7
+ });
8
+ const state = { buffer: "", finished: false };
9
+ const finish = (archived = false) => {
10
+ if (state.finished)
11
+ return;
12
+ state.finished = true;
13
+ clearTimeout(timer);
14
+ child.kill();
15
+ resolve(archived);
16
+ };
17
+ const write = (message) => {
18
+ if (state.finished)
19
+ return;
20
+ child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", ...message })}\n`);
21
+ };
22
+ const timer = setTimeout(finish, CLEANUP_TIMEOUT_MS);
23
+ child.on("error", () => finish(false));
24
+ child.on("close", () => finish(false));
25
+ child.stdin.on("error", () => finish(false));
26
+ child.stdout.on("data", (chunk) => {
27
+ state.buffer += chunk.toString();
28
+ const lines = state.buffer.split("\n");
29
+ state.buffer = lines.pop() ?? "";
30
+ for (const line of lines) {
31
+ if (!line.trim())
32
+ continue;
33
+ const message = (() => {
34
+ try {
35
+ return JSON.parse(line);
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ })();
41
+ if (message?.id === 1) {
42
+ write({ method: "initialized", params: {} });
43
+ write({
44
+ id: 2,
45
+ method: "thread/archive",
46
+ params: { threadId: input.threadId },
47
+ });
48
+ }
49
+ if (message?.id === 2)
50
+ finish(message.error === undefined);
51
+ }
52
+ });
53
+ queueMicrotask(() => write({
54
+ id: 1,
55
+ method: "initialize",
56
+ params: {
57
+ clientInfo: { name: "glen", title: "Glen CLI", version: cliVersion },
58
+ capabilities: { experimentalApi: true },
59
+ },
60
+ }));
61
+ });
62
+ export { archiveCodexDesktopThread };
63
+ //# sourceMappingURL=archive-codex-desktop-thread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-codex-desktop-thread.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/archive-codex-desktop-thread.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ declare const canonicalDigest: (messages: readonly {
2
+ role: string;
3
+ content: string;
4
+ }[]) => string;
5
+ export { canonicalDigest };
@@ -0,0 +1,4 @@
1
+ import { createHash } from "node:crypto";
2
+ const canonicalDigest = (messages) => createHash("sha256").update(JSON.stringify(messages)).digest("hex");
3
+ export { canonicalDigest };
4
+ //# sourceMappingURL=canonical-digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-digest.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/canonical-digest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,eAAe,GAAG,CACtB,QAAsD,EAC9C,EAAE,CACV,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEtE,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type CliError } from "../../../_utils/cli-error.js";
2
+ import { type Result } from "../../../_utils/result.js";
3
+ declare const codexDesktopRecovery: {
4
+ load(takeoverId: string): Promise<Result<{
5
+ takeoverId: string;
6
+ canonicalDigest: string;
7
+ destinationSessionId: string;
8
+ } | null, CliError>>;
9
+ save(record: {
10
+ readonly takeoverId: string;
11
+ readonly canonicalDigest: string;
12
+ readonly destinationSessionId: string;
13
+ }): Promise<Result<typeof record, CliError>>;
14
+ clear(takeoverId: string, expectedDestinationSessionId: string): Promise<Result<void, CliError>>;
15
+ };
16
+ export { codexDesktopRecovery };
@@ -0,0 +1,102 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { link, mkdir, readFile, rm, unlink, writeFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { causeOf, cliErr } from "../../../_utils/cli-error.js";
5
+ import { err, fromPromise, ok } from "../../../_utils/result.js";
6
+ import { statePath } from "../../../_utils/state.js";
7
+ const pathFor = (takeoverId) => join(dirname(statePath()), "takeover-recovery", `${encodeURIComponent(takeoverId)}.json`);
8
+ const codexDesktopRecovery = {
9
+ async load(takeoverId) {
10
+ const path = pathFor(takeoverId);
11
+ const raw = await fromPromise(readFile(path, "utf8"));
12
+ if (!raw.ok) {
13
+ if (raw.error.code === "ENOENT")
14
+ return ok(null);
15
+ return err(cliErr({
16
+ what: "could not read the saved Codex Desktop takeover",
17
+ why: causeOf(raw.error),
18
+ path,
19
+ remedy: "fix the reported file permissions, then retry",
20
+ }));
21
+ }
22
+ const parsed = await fromPromise(new Promise((resolve) => resolve(JSON.parse(raw.value))));
23
+ if (!parsed.ok)
24
+ return err(cliErr({
25
+ what: "the saved Codex Desktop takeover is invalid",
26
+ why: causeOf(parsed.error),
27
+ path,
28
+ remedy: "remove the reported recovery file, then retry",
29
+ }));
30
+ const value = parsed.value;
31
+ if (!value ||
32
+ value.takeoverId !== takeoverId ||
33
+ typeof value.canonicalDigest !== "string" ||
34
+ typeof value.destinationSessionId !== "string")
35
+ return err(cliErr({
36
+ what: "the saved Codex Desktop takeover is invalid",
37
+ path,
38
+ remedy: "remove the reported recovery file, then retry",
39
+ }));
40
+ return ok({
41
+ takeoverId,
42
+ canonicalDigest: value.canonicalDigest,
43
+ destinationSessionId: value.destinationSessionId,
44
+ });
45
+ },
46
+ async save(record) {
47
+ const path = pathFor(record.takeoverId);
48
+ const made = await fromPromise(mkdir(dirname(path), { recursive: true, mode: 0o700 }));
49
+ if (!made.ok)
50
+ return err(cliErr({
51
+ what: "could not create Codex Desktop takeover recovery storage",
52
+ why: causeOf(made.error),
53
+ path: dirname(path),
54
+ remedy: "fix the reported directory permissions, then retry",
55
+ }));
56
+ const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;
57
+ const written = await fromPromise(writeFile(temporary, JSON.stringify(record), { mode: 0o600 }));
58
+ if (!written.ok)
59
+ return err(cliErr({
60
+ what: "could not save Codex Desktop takeover recovery",
61
+ why: causeOf(written.error),
62
+ path: temporary,
63
+ remedy: "check disk space and permissions, then retry",
64
+ }));
65
+ const claimed = await fromPromise(link(temporary, path));
66
+ await rm(temporary, { force: true });
67
+ if (claimed.ok)
68
+ return ok(record);
69
+ const existing = await codexDesktopRecovery.load(record.takeoverId);
70
+ if (!existing.ok)
71
+ return existing;
72
+ if (existing.value)
73
+ return ok(existing.value);
74
+ return err(cliErr({
75
+ what: "could not claim Codex Desktop takeover recovery",
76
+ why: causeOf(claimed.error),
77
+ path,
78
+ remedy: "fix the reported directory permissions, then retry",
79
+ }));
80
+ },
81
+ async clear(takeoverId, expectedDestinationSessionId) {
82
+ const path = pathFor(takeoverId);
83
+ const existing = await codexDesktopRecovery.load(takeoverId);
84
+ if (!existing.ok)
85
+ return existing;
86
+ if (!existing.value ||
87
+ existing.value.destinationSessionId !== expectedDestinationSessionId)
88
+ return ok(undefined);
89
+ const removed = await fromPromise(unlink(path));
90
+ if (!removed.ok &&
91
+ removed.error.code !== "ENOENT")
92
+ return err(cliErr({
93
+ what: "could not clear Codex Desktop takeover recovery",
94
+ why: causeOf(removed.error),
95
+ path,
96
+ remedy: "remove the reported recovery file manually",
97
+ }));
98
+ return ok(undefined);
99
+ },
100
+ };
101
+ export { codexDesktopRecovery };
102
+ //# sourceMappingURL=codex-desktop-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-desktop-recovery.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/codex-desktop-recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type CliError } from "../../../_utils/cli-error.js";
2
+ import { type Result } from "../../../_utils/result.js";
3
+ declare const contextFit: (input: {
4
+ readonly messages: readonly {
5
+ role: string;
6
+ content: string;
7
+ }[];
8
+ readonly model: string;
9
+ readonly version: string;
10
+ readonly contextWindowTokens: number;
11
+ readonly startupReserveTokens: number;
12
+ readonly responseReserveTokens: number;
13
+ }) => Result<{
14
+ transcriptTokenUpperBound: number;
15
+ totalRequiredTokens: number;
16
+ availableTokens: number;
17
+ }, CliError>;
18
+ export { contextFit };
@@ -0,0 +1,30 @@
1
+ import { cliErr } from "../../../_utils/cli-error.js";
2
+ import { err, ok } from "../../../_utils/result.js";
3
+ const contextFit = (input) => {
4
+ if (input.model.trim() === "" ||
5
+ input.version.trim() === "" ||
6
+ !Number.isSafeInteger(input.contextWindowTokens) ||
7
+ input.contextWindowTokens <= 0)
8
+ return err(cliErr({
9
+ what: "cannot prove this transcript fits the target session",
10
+ why: "the target agent reported an unknown model, version, or context window",
11
+ remedy: "update the target agent and Glen, then retry; no session was created",
12
+ }));
13
+ const transcriptTokenUpperBound = Buffer.byteLength(JSON.stringify(input.messages), "utf8");
14
+ const totalRequiredTokens = transcriptTokenUpperBound +
15
+ input.startupReserveTokens +
16
+ input.responseReserveTokens;
17
+ if (totalRequiredTokens > input.contextWindowTokens)
18
+ return err(cliErr({
19
+ what: "the entire transcript does not fit in the target session",
20
+ why: `required ${totalRequiredTokens} tokens by the conservative UTF-8 bound; available ${input.contextWindowTokens}; startup reserve ${input.startupReserveTokens}; response reserve ${input.responseReserveTokens}`,
21
+ remedy: "use a target model with a larger context window; Glen did not truncate anything and did not create a session",
22
+ }));
23
+ return ok({
24
+ transcriptTokenUpperBound,
25
+ totalRequiredTokens,
26
+ availableTokens: input.contextWindowTokens,
27
+ });
28
+ };
29
+ export { contextFit };
30
+ //# sourceMappingURL=context-fit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-fit.js","sourceRoot":"","sources":["../../../../src/commands/takeover/_utils/context-fit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAe,GAAG,EAAE,EAAE,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,UAAU,GAAG,CAAC,KAOnB,EAOC,EAAE;IACF,IACE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QACzB,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;QAC3B,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,mBAAmB,CAAC;QAChD,KAAK,CAAC,mBAAmB,IAAI,CAAC;QAE9B,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,sDAAsD;YAC5D,GAAG,EAAE,wEAAwE;YAC7E,MAAM,EACJ,sEAAsE;SACzE,CAAC,CACH,CAAC;IAEJ,MAAM,yBAAyB,GAAG,MAAM,CAAC,UAAU,CACjD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAC9B,MAAM,CACP,CAAC;IACF,MAAM,mBAAmB,GACvB,yBAAyB;QACzB,KAAK,CAAC,oBAAoB;QAC1B,KAAK,CAAC,qBAAqB,CAAC;IAC9B,IAAI,mBAAmB,GAAG,KAAK,CAAC,mBAAmB;QACjD,OAAO,GAAG,CACR,MAAM,CAAC;YACL,IAAI,EAAE,0DAA0D;YAChE,GAAG,EAAE,YAAY,mBAAmB,sDAAsD,KAAK,CAAC,mBAAmB,qBAAqB,KAAK,CAAC,oBAAoB,sBAAsB,KAAK,CAAC,qBAAqB,EAAE;YACrN,MAAM,EACJ,8GAA8G;SACjH,CAAC,CACH,CAAC;IAEJ,OAAO,EAAE,CAAC;QACR,yBAAyB;QACzB,mBAAmB;QACnB,eAAe,EAAE,KAAK,CAAC,mBAAmB;KAC3C,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type CliError } from "../../../_utils/cli-error.js";
2
+ import { type Result } from "../../../_utils/result.js";
3
+ type SqliteStatement = {
4
+ all: (...params: unknown[]) => Record<string, unknown>[];
5
+ get: (...params: unknown[]) => Record<string, unknown> | undefined;
6
+ run: (...params: unknown[]) => unknown;
7
+ };
8
+ type SqliteDb = {
9
+ exec: (sql: string) => void;
10
+ prepare: (sql: string) => SqliteStatement;
11
+ close: () => void;
12
+ };
13
+ declare const mutate: (db: SqliteDb, input: {
14
+ readonly sessionId: string;
15
+ readonly workspaceId: string;
16
+ readonly composer: string;
17
+ readonly header: string;
18
+ readonly bubbles: readonly {
19
+ key: string;
20
+ value: string;
21
+ }[];
22
+ readonly workspaceIndex: string;
23
+ readonly now: number;
24
+ }) => void;
25
+ declare const cursorStore: {
26
+ locate(workspace: string): Promise<Result<{
27
+ globalDb: string;
28
+ workspaceDb: string;
29
+ workspaceId: string;
30
+ }, CliError>>;
31
+ probe(paths: {
32
+ globalDb: string;
33
+ workspaceDb: string;
34
+ }): Promise<Result<void, CliError>>;
35
+ stage(paths: {
36
+ globalDb: string;
37
+ workspaceDb: string;
38
+ }, input: Parameters<typeof mutate>[1]): Promise<Result<{
39
+ path: string;
40
+ }, CliError>>;
41
+ install(paths: {
42
+ globalDb: string;
43
+ workspaceDb: string;
44
+ }, stagedDirectory: string, sessionId: string): Promise<Result<{
45
+ backups: readonly string[];
46
+ }, CliError>>;
47
+ cleanup(path: string): Promise<void>;
48
+ };
49
+ export { cursorStore };