@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,307 @@
1
+ import { appendFileSync, mkdirSync, writeFileSync, existsSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { homedir } from "node:os";
4
+ import { join, resolve } from "node:path";
5
+ import { randomUUID } from "node:crypto";
6
+ import { loadClaudeLedger } from "../adapters/claude-code.js";
7
+ import { loadCodexLedger } from "../adapters/codex.js";
8
+ import { loadAntigravityLedger } from "../adapters/antigravity.js";
9
+ import { loadGeminiLedger } from "../adapters/gemini.js";
10
+ function translateToolCall(name, input, localCwd) {
11
+ let targetName = name;
12
+ let targetArgs = {};
13
+ const cleanInput = (input && typeof input === "object") ? input : {};
14
+ if (name === "run_command" || name === "bash" || name === "execute_command") {
15
+ targetName = "exec_command";
16
+ targetArgs = {
17
+ cmd: cleanInput.CommandLine || cleanInput.cmd || cleanInput.CommandLineInput || "",
18
+ workdir: cleanInput.Cwd || localCwd,
19
+ yield_time_ms: 1000,
20
+ max_output_tokens: 20000
21
+ };
22
+ }
23
+ else if (name === "view_file" || name === "read_file" || name === "view_file_content") {
24
+ targetName = "exec_command";
25
+ const filePath = cleanInput.AbsolutePath || cleanInput.path || cleanInput.TargetFile || "";
26
+ targetArgs = {
27
+ cmd: `cat ${filePath}`,
28
+ workdir: localCwd,
29
+ yield_time_ms: 1000,
30
+ max_output_tokens: 20000
31
+ };
32
+ }
33
+ else if (name === "list_dir" || name === "list_directory") {
34
+ targetName = "exec_command";
35
+ const dirPath = cleanInput.DirectoryPath || cleanInput.path || "";
36
+ targetArgs = {
37
+ cmd: `ls -la ${dirPath}`,
38
+ workdir: localCwd,
39
+ yield_time_ms: 1000,
40
+ max_output_tokens: 20000
41
+ };
42
+ }
43
+ else if (name === "grep_search" || name === "grep") {
44
+ targetName = "exec_command";
45
+ const query = cleanInput.Query || cleanInput.query || "";
46
+ const searchPath = cleanInput.SearchPath || localCwd;
47
+ targetArgs = {
48
+ cmd: `rg ${query}`,
49
+ workdir: searchPath,
50
+ yield_time_ms: 1000,
51
+ max_output_tokens: 20000
52
+ };
53
+ }
54
+ else if (name === "write_file" || name === "write_to_file" || name === "create_file" || name === "CODE_ACTION" || name === "replace_file_content" || name === "multi_replace_file_content") {
55
+ targetName = "exec_command";
56
+ const filePath = cleanInput.TargetFile || cleanInput.path || "";
57
+ const content = cleanInput.CodeContent || cleanInput.content || cleanInput.ReplacementContent || "";
58
+ targetArgs = {
59
+ cmd: `cat << 'EOF' > ${filePath}\n${content}\nEOF`,
60
+ workdir: localCwd,
61
+ yield_time_ms: 1000,
62
+ max_output_tokens: 20000
63
+ };
64
+ }
65
+ else {
66
+ // Fallback to exec_command with a generic print or placeholder if unknown
67
+ targetName = "exec_command";
68
+ targetArgs = {
69
+ cmd: `echo "Called tool: ${name}"`,
70
+ workdir: localCwd,
71
+ yield_time_ms: 1000,
72
+ max_output_tokens: 20000
73
+ };
74
+ }
75
+ return {
76
+ name: targetName,
77
+ arguments: JSON.stringify(targetArgs)
78
+ };
79
+ }
80
+ export function injectCodexSession(packet, workspaceDir, home = homedir()) {
81
+ const now = new Date();
82
+ const yyyy = String(now.getFullYear());
83
+ const mm = String(now.getMonth() + 1).padStart(2, "0");
84
+ const dd = String(now.getDate()).padStart(2, "0");
85
+ const uuid = randomUUID();
86
+ const timestampStr = now.toISOString().replace(/:/g, "-").replace(/\..*$/, "");
87
+ const rolloutName = `rollout-${timestampStr}-${uuid}.jsonl`;
88
+ const dirPath = join(home, ".codex", "sessions", yyyy, mm, dd);
89
+ const rolloutPath = join(dirPath, rolloutName);
90
+ mkdirSync(dirPath, { recursive: true });
91
+ const nowIso = now.toISOString();
92
+ const localCwd = resolve(workspaceDir);
93
+ let ledgerEvents = [];
94
+ if (packet.ledgerRef && existsSync(packet.ledgerRef)) {
95
+ try {
96
+ const agent = packet.packet.from.agent;
97
+ let ledger;
98
+ if (agent === "codex") {
99
+ ledger = loadCodexLedger(packet.ledgerRef);
100
+ }
101
+ else if (agent === "gemini-cli") {
102
+ ledger = loadGeminiLedger(packet.ledgerRef);
103
+ }
104
+ else if (agent === "antigravity") {
105
+ ledger = loadAntigravityLedger(packet.ledgerRef);
106
+ }
107
+ else {
108
+ ledger = loadClaudeLedger(packet.ledgerRef);
109
+ }
110
+ if (ledger && Array.isArray(ledger.events)) {
111
+ ledgerEvents = ledger.events;
112
+ }
113
+ }
114
+ catch (error) {
115
+ console.warn("Could not load ledger from ledgerRef:", error);
116
+ }
117
+ }
118
+ const lines = [];
119
+ // 1. Write session_meta
120
+ lines.push(JSON.stringify({
121
+ timestamp: nowIso,
122
+ type: "session_meta",
123
+ payload: {
124
+ id: uuid,
125
+ timestamp: nowIso,
126
+ cwd: localCwd,
127
+ originator: "memento",
128
+ cli_version: "0.140.0-alpha.2",
129
+ source: "vscode",
130
+ // Codex rebuilds model context from response_items and needs these
131
+ // meta fields to resume cleanly; omitting them leaves the session
132
+ // un-resumable ("nothing carried over").
133
+ model_provider: "openai",
134
+ base_instructions: null,
135
+ dynamic_tools: [],
136
+ git: packet.workspace.git ? {
137
+ commit_hash: packet.workspace.git.headSha,
138
+ branch: packet.workspace.git.branch,
139
+ repository_url: packet.workspace.git.remote,
140
+ } : null,
141
+ },
142
+ }));
143
+ // 2. Write historical events from ledger
144
+ for (const event of ledgerEvents) {
145
+ const at = event.at ?? nowIso;
146
+ if (event.type === "message.user") {
147
+ // event_msg drives the TUI scrollback; response_item drives the
148
+ // model's conversation history on resume. Both are required.
149
+ lines.push(JSON.stringify({
150
+ timestamp: at,
151
+ type: "event_msg",
152
+ payload: {
153
+ type: "user_message",
154
+ message: event.content,
155
+ kind: "plain",
156
+ },
157
+ }));
158
+ lines.push(JSON.stringify({
159
+ timestamp: at,
160
+ type: "response_item",
161
+ payload: {
162
+ type: "message",
163
+ role: "user",
164
+ content: [{ type: "input_text", text: event.content }],
165
+ },
166
+ }));
167
+ }
168
+ else if (event.type === "message.assistant") {
169
+ lines.push(JSON.stringify({
170
+ timestamp: at,
171
+ type: "event_msg",
172
+ payload: {
173
+ type: "agent_message",
174
+ message: event.content,
175
+ phase: "final_answer",
176
+ },
177
+ }));
178
+ lines.push(JSON.stringify({
179
+ timestamp: at,
180
+ type: "response_item",
181
+ payload: {
182
+ type: "message",
183
+ role: "assistant",
184
+ content: [{ type: "output_text", text: event.content }],
185
+ },
186
+ }));
187
+ }
188
+ else if (event.type === "tool.called" && event.tool) {
189
+ const translated = translateToolCall(event.tool.name, event.tool.input, localCwd);
190
+ lines.push(JSON.stringify({
191
+ timestamp: at,
192
+ type: "response_item",
193
+ payload: {
194
+ type: "function_call",
195
+ name: translated.name,
196
+ arguments: translated.arguments,
197
+ call_id: event.tool.callId || `call_${Math.random().toString(36).substring(7)}`,
198
+ },
199
+ }));
200
+ }
201
+ else if ((event.type === "tool.completed" || event.type === "tool.failed") && event.tool) {
202
+ const isError = event.type === "tool.failed" || event.tool.isError;
203
+ const formattedOutput = `Process exited with code ${isError ? 1 : 0}\nOutput:\n${event.tool.outcome ?? ""}`;
204
+ lines.push(JSON.stringify({
205
+ timestamp: at,
206
+ type: "response_item",
207
+ payload: {
208
+ type: "function_call_output",
209
+ call_id: event.tool.callId || `call_${Math.random().toString(36).substring(7)}`,
210
+ output: formattedOutput,
211
+ },
212
+ }));
213
+ }
214
+ }
215
+ // 3. Write final resume message
216
+ const codexResumeMessage = [
217
+ "You are continuing a task another agent started. Here is the objective and immediate next steps:",
218
+ "",
219
+ "Objective:",
220
+ packet.task.objective,
221
+ "",
222
+ "Next steps:",
223
+ packet.next.map((step, idx) => `${idx + 1}. ${step}`).join("\n"),
224
+ ].join("\n");
225
+ lines.push(JSON.stringify({
226
+ timestamp: nowIso,
227
+ type: "event_msg",
228
+ payload: {
229
+ type: "user_message",
230
+ message: codexResumeMessage,
231
+ kind: "plain",
232
+ },
233
+ }));
234
+ // The resume prompt must reach the model, so it also goes in as a
235
+ // response_item message — without this, the continuing agent never sees
236
+ // the objective or next steps.
237
+ lines.push(JSON.stringify({
238
+ timestamp: nowIso,
239
+ type: "response_item",
240
+ payload: {
241
+ type: "message",
242
+ role: "user",
243
+ content: [{ type: "input_text", text: codexResumeMessage }],
244
+ },
245
+ }));
246
+ // 4. Write turn_context
247
+ lines.push(JSON.stringify({
248
+ timestamp: nowIso,
249
+ type: "turn_context",
250
+ payload: {
251
+ cwd: localCwd,
252
+ approval_policy: "never",
253
+ sandbox_policy: {
254
+ mode: "danger-full-access",
255
+ },
256
+ },
257
+ }));
258
+ writeFileSync(rolloutPath, lines.join("\n") + "\n");
259
+ // Insert row into sqlite state_5.sqlite
260
+ let sqliteUpdated = false;
261
+ const dbPath = join(home, ".codex", "state_5.sqlite");
262
+ if (existsSync(dbPath)) {
263
+ try {
264
+ const require = createRequire(import.meta.url);
265
+ const { DatabaseSync } = require("node:sqlite");
266
+ const db = new DatabaseSync(dbPath);
267
+ try {
268
+ const nowSec = Math.floor(now.getTime() / 1000);
269
+ const nowMs = now.getTime();
270
+ const title = `Memento Handoff: ${packet.task.title}`;
271
+ db.prepare(`
272
+ INSERT OR REPLACE INTO threads (
273
+ id, rollout_path, created_at, updated_at, source, model_provider, cwd, title,
274
+ sandbox_policy, approval_mode, tokens_used, has_user_event, archived, cli_version,
275
+ first_user_message, preview, created_at_ms, updated_at_ms, thread_source
276
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
277
+ `).run(uuid, rolloutPath, nowSec, nowSec, "vscode", "openai", localCwd, title, '{"type":"danger-full-access"}', "never", 0, 1, 0, "0.140.0-alpha.2", packet.task.objective, title, nowMs, nowMs, "user");
278
+ sqliteUpdated = true;
279
+ }
280
+ finally {
281
+ db.close();
282
+ }
283
+ }
284
+ catch (error) {
285
+ console.warn("Could not insert session into Codex SQLite database:", error);
286
+ }
287
+ }
288
+ // Append to session_index.jsonl
289
+ const indexPath = join(home, ".codex", "session_index.jsonl");
290
+ const indexLine = JSON.stringify({
291
+ id: uuid,
292
+ thread_name: `Memento Handoff: ${packet.task.title}`,
293
+ updated_at: nowIso,
294
+ }) + "\n";
295
+ try {
296
+ appendFileSync(indexPath, indexLine);
297
+ }
298
+ catch (error) {
299
+ console.warn("Could not append session to session_index.jsonl:", error);
300
+ }
301
+ return {
302
+ sessionId: uuid,
303
+ rolloutPath,
304
+ sqliteUpdated,
305
+ };
306
+ }
307
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/inject/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Packet } from "../packet.js";
2
+ export type InjectTarget = "codex" | "antigravity" | "claude-code";
3
+ export declare const INJECT_TARGETS: readonly InjectTarget[];
4
+ export declare function isInjectTarget(value: string): value is InjectTarget;
5
+ /**
6
+ * Write the packet as a native session for the target agent. Shared by the
7
+ * `inject` and `handoff` CLI commands and the `memento_handoff` MCP tool, so the
8
+ * per-agent logic lives in exactly one place. Returns human-readable summary
9
+ * lines; the caller decides how to surface them.
10
+ */
11
+ export declare function injectPacket(target: InjectTarget, packet: Packet, workspace: string): Promise<string[]>;
@@ -0,0 +1,42 @@
1
+ export const INJECT_TARGETS = ["codex", "antigravity", "claude-code"];
2
+ export function isInjectTarget(value) {
3
+ return INJECT_TARGETS.includes(value);
4
+ }
5
+ /**
6
+ * Write the packet as a native session for the target agent. Shared by the
7
+ * `inject` and `handoff` CLI commands and the `memento_handoff` MCP tool, so the
8
+ * per-agent logic lives in exactly one place. Returns human-readable summary
9
+ * lines; the caller decides how to surface them.
10
+ */
11
+ export async function injectPacket(target, packet, workspace) {
12
+ if (target === "codex") {
13
+ const { injectCodexSession } = await import("./codex.js");
14
+ const r = injectCodexSession(packet, workspace);
15
+ return [
16
+ "Injected Codex session:",
17
+ ` id: ${r.sessionId}`,
18
+ ` rollout: ${r.rolloutPath}`,
19
+ ` sqlite: ${r.sqliteUpdated ? "updated" : "skipped/unavailable"}`,
20
+ " Open Codex — the session will appear in Recent.",
21
+ ];
22
+ }
23
+ if (target === "antigravity") {
24
+ const { injectAntigravitySession } = await import("./antigravity.js");
25
+ const r = injectAntigravitySession(packet, workspace);
26
+ return [
27
+ "Injected Antigravity session:",
28
+ ` id: ${r.sessionId}`,
29
+ ` transcript: ${r.transcriptPath}`,
30
+ ` sqlite: ${r.sqliteUpdated ? "updated" : "skipped/unavailable"}`,
31
+ " Open Antigravity — the session will appear in the sidebar.",
32
+ ];
33
+ }
34
+ const { injectClaudeCode } = await import("./claude-code.js");
35
+ const r = injectClaudeCode(packet, workspace);
36
+ return [
37
+ "Injected Claude Code session:",
38
+ ` file: ${r.sessionFile}`,
39
+ " Open Claude Code in this workspace — the continuation will appear in Recent.",
40
+ ];
41
+ }
42
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/inject/dispatch.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;AAE/F,MAAM,UAAU,cAAc,CAAC,KAAa;IACxC,OAAQ,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,MAAoB,EACpB,MAAc,EACd,SAAiB;IAEjB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,EAAC,kBAAkB,EAAC,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChD,OAAO;YACH,yBAAyB;YACzB,cAAc,CAAC,CAAC,SAAS,EAAE;YAC3B,cAAc,CAAC,CAAC,WAAW,EAAE;YAC7B,cAAc,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,EAAE;YACnE,mDAAmD;SACtD,CAAC;IACN,CAAC;IAED,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,EAAC,wBAAwB,EAAC,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACtD,OAAO;YACH,+BAA+B;YAC/B,iBAAiB,CAAC,CAAC,SAAS,EAAE;YAC9B,iBAAiB,CAAC,CAAC,cAAc,EAAE;YACnC,iBAAiB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,EAAE;YACtE,8DAA8D;SACjE,CAAC;IACN,CAAC;IAED,MAAM,EAAC,gBAAgB,EAAC,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC5D,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,OAAO;QACH,+BAA+B;QAC/B,WAAW,CAAC,CAAC,WAAW,EAAE;QAC1B,gFAAgF;KACnF,CAAC;AACN,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Public re-export surface for the inject sub-modules. Consumers can either
3
+ * import from this file (unified API) or from the individual adapters in
4
+ * src/inject/ (for tree-shaking or CLI lazy imports).
5
+ */
6
+ export { injectCodexSession } from "./inject/codex.js";
7
+ export type { InjectResult as CodexInjectResult } from "./inject/codex.js";
8
+ export { injectAntigravitySession } from "./inject/antigravity.js";
9
+ export type { InjectResult as AntigravityInjectResult } from "./inject/antigravity.js";
10
+ export { injectClaudeCode } from "./inject/claude-code.js";
11
+ export type { ClaudeInjectResult } from "./inject/claude-code.js";
12
+ import type { Packet } from "./packet.js";
13
+ export type InjectTarget = "codex" | "antigravity" | "claude-code";
14
+ export interface InjectResult {
15
+ target: InjectTarget;
16
+ sessionFile: string;
17
+ hint: string;
18
+ }
19
+ /** Inject a sealed packet into the given target agent's sessions directory. */
20
+ export declare function injectSession(packet: Packet, target: InjectTarget, workspaceDir: string, home?: string): InjectResult;
21
+ /** Convenience: load packet from workspace and inject. */
22
+ export declare function injectFromWorkspace(workspaceDir: string, target: InjectTarget, home?: string): InjectResult;
package/dist/inject.js ADDED
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Public re-export surface for the inject sub-modules. Consumers can either
3
+ * import from this file (unified API) or from the individual adapters in
4
+ * src/inject/ (for tree-shaking or CLI lazy imports).
5
+ */
6
+ export { injectCodexSession } from "./inject/codex.js";
7
+ export { injectAntigravitySession } from "./inject/antigravity.js";
8
+ export { injectClaudeCode } from "./inject/claude-code.js";
9
+ import { homedir } from "node:os";
10
+ import { loadPacket } from "./artifacts.js";
11
+ import { injectCodexSession } from "./inject/codex.js";
12
+ import { injectAntigravitySession } from "./inject/antigravity.js";
13
+ import { injectClaudeCode } from "./inject/claude-code.js";
14
+ /** Inject a sealed packet into the given target agent's sessions directory. */
15
+ export function injectSession(packet, target, workspaceDir, home = homedir()) {
16
+ if (target === "codex") {
17
+ const r = injectCodexSession(packet, workspaceDir, home);
18
+ return {
19
+ target,
20
+ sessionFile: r.rolloutPath,
21
+ hint: `Open Codex — the session will appear in Recent.`,
22
+ };
23
+ }
24
+ if (target === "antigravity") {
25
+ const r = injectAntigravitySession(packet, workspaceDir, home);
26
+ return {
27
+ target,
28
+ sessionFile: r.transcriptPath,
29
+ hint: `Open Antigravity — the session will appear in the sidebar.`,
30
+ };
31
+ }
32
+ const r = injectClaudeCode(packet, workspaceDir, home);
33
+ return {
34
+ target,
35
+ sessionFile: r.sessionFile,
36
+ hint: `Open Claude Code in this workspace — the continuation will appear in Recent.`,
37
+ };
38
+ }
39
+ /** Convenience: load packet from workspace and inject. */
40
+ export function injectFromWorkspace(workspaceDir, target, home = homedir()) {
41
+ const packet = loadPacket(workspaceDir);
42
+ if (!packet) {
43
+ throw new Error(`No packet found in ${workspaceDir}/.memento — run \`memento compile\` first.`);
44
+ }
45
+ return injectSession(packet, target, workspaceDir, home);
46
+ }
47
+ //# sourceMappingURL=inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.js","sourceRoot":"","sources":["../src/inject.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAC,wBAAwB,EAAC,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AAGzD,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;AAChC,OAAO,EAAC,UAAU,EAAC,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAC,wBAAwB,EAAC,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AAWzD,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CACzB,MAAc,EACd,MAAoB,EACpB,YAAoB,EACpB,OAAe,OAAO,EAAE;IAExB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QACzD,OAAO;YACH,MAAM;YACN,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,IAAI,EAAE,iDAAiD;SAC1D,CAAC;IACN,CAAC;IAED,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QAC/D,OAAO;YACH,MAAM;YACN,WAAW,EAAE,CAAC,CAAC,cAAc;YAC7B,IAAI,EAAE,4DAA4D;SACrE,CAAC;IACN,CAAC;IAED,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IACvD,OAAO;QACH,MAAM;QACN,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,IAAI,EAAE,8EAA8E;KACvF,CAAC;AACN,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,mBAAmB,CAC/B,YAAoB,EACpB,MAAoB,EACpB,OAAe,OAAO,EAAE;IAExB,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAExC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,sBAAsB,YAAY,4CAA4C,CAAC,CAAC;IACpG,CAAC;IAED,OAAO,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The Session Ledger (spec §5.2): every agent's native session format is
3
+ * normalized into this one event vocabulary. Adapters produce ledgers;
4
+ * the compiler consumes them. The ledger is the raw material — packets are
5
+ * compiled FROM it, never invented beside it.
6
+ */
7
+ export type LedgerEventType = "task.started" | "message.user" | "message.assistant" | "tool.called" | "tool.completed" | "tool.failed" | "approval.requested" | "approval.resolved" | "plan.updated" | "decision.made" | "compaction" | "handoff.initiated" | "handoff.completed";
8
+ export interface LedgerToolInfo {
9
+ name: string;
10
+ /** Primary argument worth showing a human: file path, command, url… */
11
+ target?: string;
12
+ /** Correlates tool.called with its tool.completed/failed. */
13
+ callId?: string;
14
+ input?: unknown;
15
+ /** For completed/failed events: truncated observable result. */
16
+ outcome?: string;
17
+ isError?: boolean;
18
+ }
19
+ export interface LedgerEvent {
20
+ seq: number;
21
+ type: LedgerEventType;
22
+ /** ISO 8601 when the source format provides one. */
23
+ at?: string;
24
+ /** Human-readable payload: message text, summary text, decision text. */
25
+ content?: string;
26
+ tool?: LedgerToolInfo;
27
+ meta?: Record<string, unknown>;
28
+ }
29
+ export interface Ledger {
30
+ sessionId: string;
31
+ /** Producing agent, e.g. "claude-code", "codex", "gemini-cli", "pi". */
32
+ agent: string;
33
+ sourcePath?: string;
34
+ cwd?: string;
35
+ gitBranch?: string;
36
+ events: LedgerEvent[];
37
+ }
38
+ /** Truncate observable output for packet/ledger embedding. */
39
+ export declare function truncate(text: string, max: number): string;
40
+ export declare function cleanMementoTemplate(content: string): string;
41
+ export declare function cleanUserMessage(content: string): string;
42
+ /** First user message = the task statement, by convention. */
43
+ export declare function firstUserMessage(ledger: Ledger): string | undefined;
44
+ /** tool.called events that never got a completed/failed with the same callId. */
45
+ export declare function inFlightCalls(ledger: Ledger): LedgerEvent[];
package/dist/ledger.js ADDED
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The Session Ledger (spec §5.2): every agent's native session format is
3
+ * normalized into this one event vocabulary. Adapters produce ledgers;
4
+ * the compiler consumes them. The ledger is the raw material — packets are
5
+ * compiled FROM it, never invented beside it.
6
+ */
7
+ /** Truncate observable output for packet/ledger embedding. */
8
+ export function truncate(text, max) {
9
+ const collapsed = text.replace(/\s+/g, " ").trim();
10
+ return collapsed.length <= max ? collapsed : `${collapsed.slice(0, max - 1)}…`;
11
+ }
12
+ export function cleanMementoTemplate(content) {
13
+ const trimmed = content.trim();
14
+ if (!trimmed.includes("You are continuing a task another agent started") && !trimmed.includes("# Memento Handoff")) {
15
+ return content;
16
+ }
17
+ // 1. Try "## Objective" markdown header format
18
+ const objectiveMarkdownMatch = trimmed.match(/##\s+Objective\s*\n+([\s\S]*?)(?:\n##|\n---|$)/i);
19
+ if (objectiveMarkdownMatch && objectiveMarkdownMatch[1]) {
20
+ return objectiveMarkdownMatch[1].trim();
21
+ }
22
+ // 2. Try "Objective:" label format
23
+ const objectiveLabelMatch = trimmed.match(/Objective:\s*\n+([\s\S]*?)(?:\n\n\w+:|\n\nNext steps:|$)/i);
24
+ if (objectiveLabelMatch && objectiveLabelMatch[1]) {
25
+ return objectiveLabelMatch[1].trim();
26
+ }
27
+ return content;
28
+ }
29
+ export function cleanUserMessage(content) {
30
+ const match = content.match(/<USER_REQUEST>([\s\S]*?)<\/USER_REQUEST>/i);
31
+ let text = match && match[1] ? match[1].trim() : content;
32
+ text = text.replace(/<ADDITIONAL_METADATA>[\s\S]*?<\/ADDITIONAL_METADATA>/gi, "");
33
+ text = text.replace(/<USER_SETTINGS_CHANGE>[\s\S]*?<\/USER_SETTINGS_CHANGE>/gi, "");
34
+ text = text.replace(/<EPHEMERAL_MESSAGE>[\s\S]*?<\/EPHEMERAL_MESSAGE>/gi, "");
35
+ text = text.trim();
36
+ return cleanMementoTemplate(text);
37
+ }
38
+ /** First user message = the task statement, by convention. */
39
+ export function firstUserMessage(ledger) {
40
+ return ledger.events.find((event) => event.type === "message.user")?.content;
41
+ }
42
+ /** tool.called events that never got a completed/failed with the same callId. */
43
+ export function inFlightCalls(ledger) {
44
+ const resolved = new Set(ledger.events
45
+ .filter((e) => e.type === "tool.completed" || e.type === "tool.failed")
46
+ .map((e) => e.tool?.callId)
47
+ .filter((id) => Boolean(id)));
48
+ return ledger.events.filter((e) => e.type === "tool.called" && (!e.tool?.callId || !resolved.has(e.tool.callId)));
49
+ }
50
+ //# sourceMappingURL=ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ export declare function buildMcpServer(): Server;
3
+ export declare function runMcpServer(): Promise<void>;