@samjurnio_/memento 0.2.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 (82) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +144 -0
  3. package/dist/adapters/antigravity.d.ts +19 -0
  4. package/dist/adapters/antigravity.js +463 -0
  5. package/dist/adapters/antigravity.js.map +1 -0
  6. package/dist/adapters/claude-code.d.ts +14 -0
  7. package/dist/adapters/claude-code.js +213 -0
  8. package/dist/adapters/claude-code.js.map +1 -0
  9. package/dist/adapters/codex.d.ts +12 -0
  10. package/dist/adapters/codex.js +247 -0
  11. package/dist/adapters/codex.js.map +1 -0
  12. package/dist/adapters/gemini.d.ts +10 -0
  13. package/dist/adapters/gemini.js +171 -0
  14. package/dist/adapters/gemini.js.map +1 -0
  15. package/dist/adapters/opencode.d.ts +3 -0
  16. package/dist/adapters/opencode.js +137 -0
  17. package/dist/adapters/opencode.js.map +1 -0
  18. package/dist/adapters/pi.d.ts +6 -0
  19. package/dist/adapters/pi.js +172 -0
  20. package/dist/adapters/pi.js.map +1 -0
  21. package/dist/artifacts.d.ts +25 -0
  22. package/dist/artifacts.js +50 -0
  23. package/dist/artifacts.js.map +1 -0
  24. package/dist/bench-live.d.ts +28 -0
  25. package/dist/bench-live.js +187 -0
  26. package/dist/bench-live.js.map +1 -0
  27. package/dist/bench.d.ts +33 -0
  28. package/dist/bench.js +213 -0
  29. package/dist/bench.js.map +1 -0
  30. package/dist/cli.d.ts +2 -0
  31. package/dist/cli.js +338 -0
  32. package/dist/cli.js.map +1 -0
  33. package/dist/compile.d.ts +27 -0
  34. package/dist/compile.js +193 -0
  35. package/dist/compile.js.map +1 -0
  36. package/dist/git.d.ts +45 -0
  37. package/dist/git.js +172 -0
  38. package/dist/git.js.map +1 -0
  39. package/dist/handoff.d.ts +26 -0
  40. package/dist/handoff.js +80 -0
  41. package/dist/handoff.js.map +1 -0
  42. package/dist/hooks.d.ts +25 -0
  43. package/dist/hooks.js +114 -0
  44. package/dist/hooks.js.map +1 -0
  45. package/dist/ids.d.ts +10 -0
  46. package/dist/ids.js +32 -0
  47. package/dist/ids.js.map +1 -0
  48. package/dist/inject/antigravity.d.ts +7 -0
  49. package/dist/inject/antigravity.js +391 -0
  50. package/dist/inject/antigravity.js.map +1 -0
  51. package/dist/inject/claude-code.d.ts +15 -0
  52. package/dist/inject/claude-code.js +53 -0
  53. package/dist/inject/claude-code.js.map +1 -0
  54. package/dist/inject/codex.d.ts +7 -0
  55. package/dist/inject/codex.js +307 -0
  56. package/dist/inject/codex.js.map +1 -0
  57. package/dist/inject/dispatch.d.ts +11 -0
  58. package/dist/inject/dispatch.js +42 -0
  59. package/dist/inject/dispatch.js.map +1 -0
  60. package/dist/inject.d.ts +22 -0
  61. package/dist/inject.js +47 -0
  62. package/dist/inject.js.map +1 -0
  63. package/dist/ledger.d.ts +45 -0
  64. package/dist/ledger.js +50 -0
  65. package/dist/ledger.js.map +1 -0
  66. package/dist/mcp.d.ts +3 -0
  67. package/dist/mcp.js +197 -0
  68. package/dist/mcp.js.map +1 -0
  69. package/dist/packet.d.ts +185 -0
  70. package/dist/packet.js +154 -0
  71. package/dist/packet.js.map +1 -0
  72. package/dist/redact.d.ts +19 -0
  73. package/dist/redact.js +86 -0
  74. package/dist/redact.js.map +1 -0
  75. package/dist/render.d.ts +11 -0
  76. package/dist/render.js +145 -0
  77. package/dist/render.js.map +1 -0
  78. package/dist/summarize.d.ts +35 -0
  79. package/dist/summarize.js +166 -0
  80. package/dist/summarize.js.map +1 -0
  81. package/package.json +61 -0
  82. package/schemas/packet.v1.schema.json +510 -0
@@ -0,0 +1,213 @@
1
+ import { readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join, resolve } from "node:path";
4
+ import { truncate, cleanUserMessage } from "../ledger.js";
5
+ /**
6
+ * Claude Code adapter: normalizes a transcript JSONL
7
+ * (~/.claude/projects/<encoded-cwd>/<sessionId>.jsonl) into a Memento ledger.
8
+ *
9
+ * The transcript event-type enum is OPEN — Anthropic adds line types across
10
+ * versions — so this parser is deliberately lenient: unknown line types and
11
+ * malformed lines are skipped, never thrown on. Losing one exotic event is
12
+ * fine; losing the handoff is not.
13
+ */
14
+ const OUTCOME_MAX = 400;
15
+ const MESSAGE_MAX = 2000;
16
+ export function parseClaudeTranscript(jsonl, sourcePath) {
17
+ const events = [];
18
+ let sessionId = "unknown";
19
+ let cwd;
20
+ let gitBranch;
21
+ let seq = 0;
22
+ let sawUserMessage = false;
23
+ const push = (event) => {
24
+ events.push({ ...event, seq: seq++ });
25
+ };
26
+ for (const raw of jsonl.split("\n")) {
27
+ const trimmed = raw.trim();
28
+ if (!trimmed) {
29
+ continue;
30
+ }
31
+ let line;
32
+ try {
33
+ line = JSON.parse(trimmed);
34
+ }
35
+ catch {
36
+ continue;
37
+ }
38
+ if (line.sessionId && sessionId === "unknown") {
39
+ sessionId = line.sessionId;
40
+ }
41
+ cwd = cwd ?? line.cwd;
42
+ gitBranch = gitBranch ?? line.gitBranch;
43
+ const at = line.timestamp;
44
+ if (line.type === "summary" || line.isCompactSummary) {
45
+ const content = line.summary ?? textFromContent(line.message?.content);
46
+ if (content) {
47
+ push({ type: "compaction", content: truncate(content, MESSAGE_MAX), ...(at ? { at } : {}) });
48
+ }
49
+ continue;
50
+ }
51
+ if (line.type === "user") {
52
+ for (const event of userEvents(line.message?.content)) {
53
+ if (event.type === "message.user" && !sawUserMessage) {
54
+ sawUserMessage = true;
55
+ push({ type: "task.started", ...(event.content ? { content: event.content } : {}), ...(at ? { at } : {}) });
56
+ }
57
+ push({ ...event, ...(at ? { at } : {}) });
58
+ }
59
+ continue;
60
+ }
61
+ if (line.type === "assistant") {
62
+ for (const event of assistantEvents(line.message?.content)) {
63
+ push({ ...event, ...(at ? { at } : {}) });
64
+ }
65
+ }
66
+ // Unknown types: skipped by design.
67
+ }
68
+ return {
69
+ sessionId,
70
+ agent: "claude-code",
71
+ ...(sourcePath ? { sourcePath } : {}),
72
+ ...(cwd ? { cwd } : {}),
73
+ ...(gitBranch ? { gitBranch } : {}),
74
+ events,
75
+ };
76
+ }
77
+ function userEvents(content) {
78
+ if (typeof content === "string") {
79
+ const text = cleanUserMessage(content);
80
+ return text ? [{ type: "message.user", content: truncate(text, MESSAGE_MAX) }] : [];
81
+ }
82
+ if (!Array.isArray(content)) {
83
+ return [];
84
+ }
85
+ const out = [];
86
+ for (const block of content) {
87
+ if (block?.type === "tool_result") {
88
+ const outcome = truncate(textFromContent(block.content) ?? "(no output)", OUTCOME_MAX);
89
+ const isError = block.is_error === true;
90
+ const tool = {
91
+ name: "(pending-match)",
92
+ outcome,
93
+ isError,
94
+ ...(typeof block.tool_use_id === "string" ? { callId: block.tool_use_id } : {}),
95
+ };
96
+ out.push({ type: isError ? "tool.failed" : "tool.completed", tool });
97
+ }
98
+ else if (block?.type === "text" && typeof block.text === "string" && block.text.trim()) {
99
+ const cleanedText = cleanUserMessage(block.text);
100
+ if (cleanedText) {
101
+ out.push({ type: "message.user", content: truncate(cleanedText, MESSAGE_MAX) });
102
+ }
103
+ }
104
+ }
105
+ return out;
106
+ }
107
+ function assistantEvents(content) {
108
+ if (!Array.isArray(content)) {
109
+ return [];
110
+ }
111
+ const out = [];
112
+ const texts = [];
113
+ for (const block of content) {
114
+ if (block?.type === "text" && typeof block.text === "string" && block.text.trim()) {
115
+ texts.push(block.text);
116
+ }
117
+ else if (block?.type === "tool_use" && typeof block.name === "string") {
118
+ const input = block.input;
119
+ const tool = {
120
+ name: block.name,
121
+ input,
122
+ ...(typeof block.id === "string" ? { callId: block.id } : {}),
123
+ ...(extractTarget(input) ? { target: extractTarget(input) } : {}),
124
+ };
125
+ out.push({ type: "tool.called", tool });
126
+ }
127
+ // "thinking" blocks are intentionally dropped: internal reasoning is
128
+ // not part of the portable execution state.
129
+ }
130
+ if (texts.length > 0) {
131
+ out.unshift({ type: "message.assistant", content: truncate(texts.join("\n"), MESSAGE_MAX) });
132
+ }
133
+ return out;
134
+ }
135
+ /** The one human-meaningful argument: path, command, url, pattern… (shared across adapters) */
136
+ export function extractTarget(input) {
137
+ if (input === null || typeof input !== "object") {
138
+ return undefined;
139
+ }
140
+ const record = input;
141
+ for (const key of ["file_path", "path", "command", "cmd", "url", "pattern", "query", "notebook_path"]) {
142
+ const value = record[key];
143
+ if (typeof value === "string" && value.trim()) {
144
+ return truncate(value, 160);
145
+ }
146
+ }
147
+ return undefined;
148
+ }
149
+ function textFromContent(content) {
150
+ if (typeof content === "string") {
151
+ return content;
152
+ }
153
+ if (Array.isArray(content)) {
154
+ const texts = content
155
+ .filter((block) => block?.type === "text" && typeof block.text === "string")
156
+ .map((block) => block.text);
157
+ return texts.length > 0 ? texts.join("\n") : undefined;
158
+ }
159
+ return undefined;
160
+ }
161
+ /**
162
+ * Resolve the matching tool name onto tool.completed/failed events by callId.
163
+ * Transcripts carry the name only on tool_use; results reference the id.
164
+ */
165
+ export function resolveToolNames(ledger) {
166
+ const nameById = new Map();
167
+ for (const event of ledger.events) {
168
+ if (event.type === "tool.called" && event.tool?.callId) {
169
+ nameById.set(event.tool.callId, {
170
+ name: event.tool.name,
171
+ ...(event.tool.target ? { target: event.tool.target } : {}),
172
+ });
173
+ }
174
+ }
175
+ const events = ledger.events.map((event) => {
176
+ if ((event.type === "tool.completed" || event.type === "tool.failed") && event.tool?.callId) {
177
+ const match = nameById.get(event.tool.callId);
178
+ if (match) {
179
+ return {
180
+ ...event,
181
+ tool: { ...event.tool, name: match.name, ...(match.target ? { target: match.target } : {}) },
182
+ };
183
+ }
184
+ }
185
+ return event;
186
+ });
187
+ return { ...ledger, events };
188
+ }
189
+ /** ~/.claude/projects/<encoded-cwd>: every non [a-zA-Z0-9-] char becomes "-". */
190
+ export function claudeProjectDir(workspaceDir, home = homedir()) {
191
+ const encoded = resolve(workspaceDir).replace(/[^a-zA-Z0-9-]/g, "-");
192
+ return join(home, ".claude", "projects", encoded);
193
+ }
194
+ /** Newest transcript JSONL for a workspace, or undefined when none exists. */
195
+ export function latestClaudeTranscript(workspaceDir, home = homedir()) {
196
+ const dir = claudeProjectDir(workspaceDir, home);
197
+ let entries;
198
+ try {
199
+ entries = readdirSync(dir).filter((name) => name.endsWith(".jsonl"));
200
+ }
201
+ catch {
202
+ return undefined;
203
+ }
204
+ const newest = entries
205
+ .map((name) => ({ name, mtime: statSync(join(dir, name)).mtimeMs }))
206
+ .sort((a, b) => b.mtime - a.mtime)[0];
207
+ return newest ? join(dir, newest.name) : undefined;
208
+ }
209
+ export function loadClaudeLedger(transcriptPath) {
210
+ const jsonl = readFileSync(transcriptPath, "utf8");
211
+ return resolveToolNames(parseClaudeTranscript(jsonl, transcriptPath));
212
+ }
213
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Ledger } from "../ledger.js";
2
+ export declare function parseCodexRollout(jsonl: string, sourcePath?: string): Ledger;
3
+ /** Resolve tool names onto outputs by call_id (names only ride function_call). */
4
+ export declare function resolveCodexToolNames(ledger: Ledger): Ledger;
5
+ /**
6
+ * Newest rollout whose session_meta.cwd matches the workspace. Rollouts for
7
+ * ALL projects live in one date-partitioned tree, so we scan the most recent
8
+ * files and read only their first line(s) to match cwd. Compressed (.zst)
9
+ * cold files are skipped — recent sessions are always plain JSONL.
10
+ */
11
+ export declare function latestCodexRollout(workspaceDir: string, home?: string): string | undefined;
12
+ export declare function loadCodexLedger(rolloutPath: string): Ledger;
@@ -0,0 +1,247 @@
1
+ import { readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join, resolve } from "node:path";
4
+ import { truncate, cleanUserMessage } from "../ledger.js";
5
+ import { extractTarget } from "./claude-code.js";
6
+ /**
7
+ * Codex CLI adapter: normalizes a rollout JSONL
8
+ * (~/.codex/sessions/YYYY/MM/DD/rollout-<ts>-<uuid>.jsonl) into a Memento ledger.
9
+ *
10
+ * Field names validated against REAL local rollouts (cli 0.104.x, 2026):
11
+ * line = {timestamp, type, payload}
12
+ * session_meta → payload.{id, cwd, ...}
13
+ * event_msg → payload.type: user_message | agent_message | token_count
14
+ * | agent_reasoning | task_started ... ({message} on the
15
+ * first two)
16
+ * response_item → payload.type: function_call {name, arguments: JSON
17
+ * STRING, call_id} | function_call_output {call_id,
18
+ * output} | message | reasoning
19
+ * compacted → payload.{message}
20
+ *
21
+ * Messages are taken from event_msg only (response_item "message" duplicates
22
+ * them and also carries developer/system context). Like the Claude adapter,
23
+ * unknown types are skipped, never fatal — the enum is open across versions.
24
+ */
25
+ const OUTCOME_MAX = 400;
26
+ const MESSAGE_MAX = 2000;
27
+ const EXIT_CODE_PATTERN = /(?:Process exited with code|exited with code|exit code[:=]?)\s+(\d+)/i;
28
+ export function parseCodexRollout(jsonl, sourcePath) {
29
+ const events = [];
30
+ let sessionId = "unknown";
31
+ let cwd;
32
+ let seq = 0;
33
+ let sawUserMessage = false;
34
+ const push = (event) => {
35
+ events.push({ ...event, seq: seq++ });
36
+ };
37
+ for (const raw of jsonl.split("\n")) {
38
+ const trimmed = raw.trim();
39
+ if (!trimmed) {
40
+ continue;
41
+ }
42
+ let line;
43
+ try {
44
+ line = JSON.parse(trimmed);
45
+ }
46
+ catch {
47
+ continue;
48
+ }
49
+ const payload = line.payload;
50
+ if (!payload || typeof payload !== "object") {
51
+ continue;
52
+ }
53
+ const at = line.timestamp;
54
+ if (line.type === "session_meta") {
55
+ if (typeof payload.id === "string" && sessionId === "unknown") {
56
+ sessionId = payload.id;
57
+ }
58
+ if (typeof payload.cwd === "string") {
59
+ cwd = cwd ?? payload.cwd;
60
+ }
61
+ continue;
62
+ }
63
+ if (line.type === "compacted") {
64
+ const message = typeof payload.message === "string" ? payload.message : undefined;
65
+ if (message) {
66
+ push({ type: "compaction", content: truncate(message, MESSAGE_MAX), ...(at ? { at } : {}) });
67
+ }
68
+ continue;
69
+ }
70
+ if (line.type === "event_msg") {
71
+ const kind = payload.type;
72
+ const message = typeof payload.message === "string" ? payload.message : undefined;
73
+ if (kind === "user_message" && message) {
74
+ const cleanedText = cleanUserMessage(message);
75
+ if (cleanedText) {
76
+ if (!sawUserMessage) {
77
+ sawUserMessage = true;
78
+ push({ type: "task.started", content: truncate(cleanedText, MESSAGE_MAX), ...(at ? { at } : {}) });
79
+ }
80
+ push({ type: "message.user", content: truncate(cleanedText, MESSAGE_MAX), ...(at ? { at } : {}) });
81
+ }
82
+ }
83
+ else if (kind === "agent_message" && message) {
84
+ push({ type: "message.assistant", content: truncate(message, MESSAGE_MAX), ...(at ? { at } : {}) });
85
+ }
86
+ // token_count / agent_reasoning / task_started etc.: skipped.
87
+ continue;
88
+ }
89
+ if (line.type === "response_item") {
90
+ const kind = payload.type;
91
+ if (kind === "function_call" && typeof payload.name === "string") {
92
+ const input = parseArguments(payload.arguments);
93
+ const tool = {
94
+ name: payload.name,
95
+ ...(input !== undefined ? { input } : {}),
96
+ ...(typeof payload.call_id === "string" ? { callId: payload.call_id } : {}),
97
+ ...(extractTarget(input) ? { target: extractTarget(input) } : {}),
98
+ };
99
+ push({ type: "tool.called", tool, ...(at ? { at } : {}) });
100
+ }
101
+ else if (kind === "function_call_output") {
102
+ const output = outputText(payload.output);
103
+ const exitMatch = EXIT_CODE_PATTERN.exec(output);
104
+ const isError = exitMatch ? exitMatch[1] !== "0" : false;
105
+ const tool = {
106
+ name: "(pending-match)",
107
+ outcome: truncate(output || "(no output)", OUTCOME_MAX),
108
+ isError,
109
+ ...(typeof payload.call_id === "string" ? { callId: payload.call_id } : {}),
110
+ };
111
+ push({ type: isError ? "tool.failed" : "tool.completed", tool, ...(at ? { at } : {}) });
112
+ }
113
+ // "message" (covered by event_msg) and "reasoning": skipped.
114
+ }
115
+ }
116
+ return {
117
+ sessionId,
118
+ agent: "codex",
119
+ ...(sourcePath ? { sourcePath } : {}),
120
+ ...(cwd ? { cwd } : {}),
121
+ events,
122
+ };
123
+ }
124
+ /** function_call.arguments is a JSON STRING in rollouts; be lenient anyway. */
125
+ function parseArguments(value) {
126
+ if (typeof value !== "string") {
127
+ return value ?? undefined;
128
+ }
129
+ try {
130
+ return JSON.parse(value);
131
+ }
132
+ catch {
133
+ return { raw: value };
134
+ }
135
+ }
136
+ function outputText(value) {
137
+ if (typeof value === "string") {
138
+ return value;
139
+ }
140
+ if (value !== null && typeof value === "object") {
141
+ const record = value;
142
+ if (typeof record.output === "string") {
143
+ return record.output;
144
+ }
145
+ if (typeof record.content === "string") {
146
+ return record.content;
147
+ }
148
+ return JSON.stringify(value);
149
+ }
150
+ return "";
151
+ }
152
+ /** Resolve tool names onto outputs by call_id (names only ride function_call). */
153
+ export function resolveCodexToolNames(ledger) {
154
+ const nameById = new Map();
155
+ for (const event of ledger.events) {
156
+ if (event.type === "tool.called" && event.tool?.callId) {
157
+ nameById.set(event.tool.callId, {
158
+ name: event.tool.name,
159
+ ...(event.tool.target ? { target: event.tool.target } : {}),
160
+ });
161
+ }
162
+ }
163
+ const events = ledger.events.map((event) => {
164
+ if ((event.type === "tool.completed" || event.type === "tool.failed") && event.tool?.callId) {
165
+ const match = nameById.get(event.tool.callId);
166
+ if (match) {
167
+ return {
168
+ ...event,
169
+ tool: { ...event.tool, name: match.name, ...(match.target ? { target: match.target } : {}) },
170
+ };
171
+ }
172
+ }
173
+ return event;
174
+ });
175
+ return { ...ledger, events };
176
+ }
177
+ const DISCOVERY_SCAN_LIMIT = 60;
178
+ /**
179
+ * Newest rollout whose session_meta.cwd matches the workspace. Rollouts for
180
+ * ALL projects live in one date-partitioned tree, so we scan the most recent
181
+ * files and read only their first line(s) to match cwd. Compressed (.zst)
182
+ * cold files are skipped — recent sessions are always plain JSONL.
183
+ */
184
+ export function latestCodexRollout(workspaceDir, home = homedir()) {
185
+ const root = join(home, ".codex", "sessions");
186
+ const target = resolve(workspaceDir);
187
+ const candidates = [];
188
+ const walk = (dir) => {
189
+ let entries;
190
+ try {
191
+ entries = readdirSync(dir);
192
+ }
193
+ catch {
194
+ return;
195
+ }
196
+ for (const name of entries) {
197
+ const full = join(dir, name);
198
+ try {
199
+ const stat = statSync(full);
200
+ if (stat.isDirectory()) {
201
+ walk(full);
202
+ }
203
+ else if (name.startsWith("rollout-") && name.endsWith(".jsonl")) {
204
+ candidates.push({ path: full, mtime: stat.mtimeMs });
205
+ }
206
+ }
207
+ catch {
208
+ continue;
209
+ }
210
+ }
211
+ };
212
+ walk(root);
213
+ candidates.sort((a, b) => b.mtime - a.mtime);
214
+ for (const candidate of candidates.slice(0, DISCOVERY_SCAN_LIMIT)) {
215
+ if (rolloutCwd(candidate.path) === target) {
216
+ return candidate.path;
217
+ }
218
+ }
219
+ return undefined;
220
+ }
221
+ /** Read just the head of a rollout to find its session_meta.cwd. */
222
+ function rolloutCwd(path) {
223
+ let head;
224
+ try {
225
+ head = readFileSync(path, "utf8").slice(0, 16384);
226
+ }
227
+ catch {
228
+ return undefined;
229
+ }
230
+ for (const raw of head.split("\n").slice(0, 5)) {
231
+ try {
232
+ const line = JSON.parse(raw);
233
+ if (line.type === "session_meta" && typeof line.payload?.cwd === "string") {
234
+ return resolve(line.payload.cwd);
235
+ }
236
+ }
237
+ catch {
238
+ continue;
239
+ }
240
+ }
241
+ return undefined;
242
+ }
243
+ export function loadCodexLedger(rolloutPath) {
244
+ const jsonl = readFileSync(rolloutPath, "utf8");
245
+ return resolveCodexToolNames(parseCodexRollout(jsonl, rolloutPath));
246
+ }
247
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Ledger } from "../ledger.js";
2
+ export declare function parseGeminiCheckpoint(json: string, sourcePath?: string): Ledger;
3
+ /**
4
+ * Newest checkpoint across ALL Gemini projects. The checkpoint format
5
+ * carries no cwd and the project-hash derivation is undocumented, so this
6
+ * cannot be workspace-scoped — pass an explicit --transcript when precision
7
+ * matters.
8
+ */
9
+ export declare function latestGeminiCheckpoint(home?: string): string | undefined;
10
+ export declare function loadGeminiLedger(checkpointPath: string): Ledger;