@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
package/dist/cli.js ADDED
@@ -0,0 +1,338 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
3
+ import { resolve } from "node:path";
4
+ import { loadPacket } from "./artifacts.js";
5
+ import { captureGitState, restoreWorkspace, snapshotRefExists, verifyWorkspace } from "./git.js";
6
+ import { AGENTS, performHandoff, REASONS } from "./handoff.js";
7
+ import { handleHookPayload, installClaudeHooks, readStdin } from "./hooks.js";
8
+ import { runMcpServer } from "./mcp.js";
9
+ import { packetJsonSchema, verifySeal } from "./packet.js";
10
+ import { renderResumePrompt, renderStatus } from "./render.js";
11
+ import { INJECT_TARGETS, injectPacket, isInjectTarget } from "./inject/dispatch.js";
12
+ const HELP = `memento — cross-agent session continuity
13
+
14
+ Usage:
15
+ memento compile [--agent claude-code|codex|gemini-cli|antigravity|pi|opencode]
16
+ [--transcript <path>] [--workspace <dir>] [--reason <reason>]
17
+ [--task <taskId>] [--no-snapshot]
18
+ Compile a Continuation Packet from an agent session and write it to
19
+ <workspace>/.memento/handoff.json + HANDOFF.md.
20
+ --reason: context_exhaustion | operator_switch | session_end |
21
+ scheduled | team_handoff (default: operator_switch)
22
+
23
+ memento inject codex|antigravity|claude-code [--workspace <dir>]
24
+ Write the compiled packet as a native session in the target agent's
25
+ sessions directory so it appears in their Recent list — no paste step.
26
+ codex → ~/.codex/sessions/<date>/rollout-*.jsonl + SQLite index
27
+ antigravity → brain logs + SQLite
28
+ claude-code → ~/.claude/projects/<workspace>/<uuid>.jsonl
29
+
30
+ memento handoff <from> <to> [--workspace <dir>] [--reason <reason>]
31
+ One shot: compile the latest <from> session and inject it as a native
32
+ <to> session — the whole point of memento.
33
+ <from>: claude-code | codex | gemini-cli | antigravity | pi | opencode
34
+ <to>: codex | claude-code | antigravity
35
+ e.g. memento handoff codex claude-code
36
+
37
+ memento resume [--workspace <dir>]
38
+ Print the resume prompt for pasting into any agent:
39
+ codex exec "$(memento resume)"
40
+
41
+ memento verify [--workspace <dir>]
42
+ Compare the live workspace against the packet's recorded git state.
43
+ Exit 0 when clean, 1 on drift.
44
+
45
+ memento restore [--workspace <dir>] [--force]
46
+ Materialize the packet's working-tree snapshot into the workspace — the
47
+ prior agent's actual uncommitted + untracked files, not just a summary.
48
+ Refuses to overwrite diverging local edits unless --force.
49
+
50
+ memento status [--workspace <dir>]
51
+ One-line packet summary.
52
+
53
+ memento schema
54
+ Print the Packet v1 JSON Schema.
55
+
56
+ memento install-hooks claude-code [--workspace <dir>] [--command <cmd>]
57
+ Add PreCompact + SessionEnd hooks to <workspace>/.claude/settings.json
58
+ so a packet is compiled automatically at context pressure.
59
+ --command defaults to "memento hook" (requires memento on PATH).
60
+
61
+ memento install-hooks codex
62
+ Register [mcp_servers.memento] in ~/.codex/config.toml so Codex calls
63
+ memento_resume / memento_handoff natively. Idempotent, append-only.
64
+
65
+ memento hook
66
+ Hook stdin entrypoint: reads the Claude Code hook payload and compiles
67
+ a packet from the session's own transcript. Always exits 0.
68
+
69
+ memento mcp
70
+ Run Memento as an MCP server over stdio, exposing memento_handoff,
71
+ memento_resume, memento_verify, memento_status as native agent tools.
72
+ Register: claude mcp add memento -- memento mcp
73
+
74
+ memento bench [--json <path>]
75
+ Continuity Bench: fixed scenarios scoring packet fidelity
76
+ (objective survival, failure surfacing, in-flight state, redaction,
77
+ chain integrity). Offline, reproducible. Exit 1 on any failed check.
78
+
79
+ memento bench-live [--exec "<cmd>"] [--baseline] [--json <path>]
80
+ Live bench: a REAL receiving agent gets the resume prompt on stdin in
81
+ a fixture repo; what it does is scored mechanically (next step done,
82
+ constraint honored, completed work not redone). --baseline adds a
83
+ cold-start arm — the delta is what the packet buys.
84
+ Default executor: claude -p --permission-mode acceptEdits
85
+ `;
86
+ function flag(args, name) {
87
+ const index = args.indexOf(name);
88
+ return index !== -1 ? args[index + 1] : undefined;
89
+ }
90
+ function readPacket(workspace) {
91
+ const packet = loadPacket(workspace);
92
+ if (!packet) {
93
+ console.error(`No packet found in ${workspace}/.memento — run \`memento compile\` first.`);
94
+ process.exit(1);
95
+ }
96
+ return packet;
97
+ }
98
+ async function main() {
99
+ const [command, ...args] = process.argv.slice(2);
100
+ const workspace = resolve(flag(args, "--workspace") ?? process.cwd());
101
+ if (command === "version" || command === "--version" || command === "-v") {
102
+ const pkg = createRequire(import.meta.url)("../package.json");
103
+ console.log(`memento ${pkg.version}`);
104
+ return;
105
+ }
106
+ switch (command) {
107
+ case "compile": {
108
+ const reasonInput = flag(args, "--reason") ?? "operator_switch";
109
+ if (!REASONS.includes(reasonInput)) {
110
+ console.error(`Unknown --reason "${reasonInput}". One of: ${REASONS.join(", ")}`);
111
+ process.exit(1);
112
+ }
113
+ const agent = flag(args, "--agent");
114
+ const transcript = flag(args, "--transcript");
115
+ const taskId = flag(args, "--task");
116
+ const result = await performHandoff({
117
+ workspaceDir: workspace,
118
+ reason: reasonInput,
119
+ ...(agent ? { agent } : {}),
120
+ ...(transcript ? { transcript } : {}),
121
+ ...(taskId ? { taskId } : {}),
122
+ ...(args.includes("--no-snapshot") ? { noSnapshot: true } : {}),
123
+ });
124
+ const { packet, artifacts } = result;
125
+ console.log(`Sealed packet ${packet.packet.id} (task ${packet.packet.taskId}, seq ${packet.packet.seq})`);
126
+ console.log(` ledger: ${result.transcriptPath} (${result.eventCount} events)`);
127
+ console.log(` snapshot: ${packet.workspace.git?.snapshotRef ?? "(none)"}`);
128
+ console.log(` redaction: ${packet.redaction.count} hit(s)`);
129
+ console.log(` wrote: ${artifacts.jsonPath}`);
130
+ console.log(` ${artifacts.markdownPath}`);
131
+ return;
132
+ }
133
+ case "inject": {
134
+ const target = args.find((a) => !a.startsWith("--"));
135
+ if (!target || !isInjectTarget(target)) {
136
+ console.error(`Usage: memento inject ${INJECT_TARGETS.join("|")} [--workspace <dir>]`);
137
+ process.exit(1);
138
+ }
139
+ const packet = readPacket(workspace);
140
+ try {
141
+ const lines = await injectPacket(target, packet, workspace);
142
+ console.log(lines.join("\n"));
143
+ }
144
+ catch (err) {
145
+ console.error(`Inject failed: ${err instanceof Error ? err.message : String(err)}`);
146
+ process.exit(1);
147
+ }
148
+ return;
149
+ }
150
+ case "handoff": {
151
+ // One shot: compile from <from>, inject into <to>. The whole point
152
+ // of memento — pass the live session straight to the next agent.
153
+ const positionals = args.filter((a) => !a.startsWith("--"));
154
+ const from = positionals[0];
155
+ const to = positionals[1];
156
+ if (!from || !to || !AGENTS.includes(from) || !isInjectTarget(to)) {
157
+ console.error(`Usage: memento handoff <from> <to> e.g. memento handoff codex claude-code`);
158
+ console.error(` <from> (session to read): ${AGENTS.join(" | ")}`);
159
+ console.error(` <to> (native target): ${INJECT_TARGETS.join(" | ")}`);
160
+ process.exit(1);
161
+ }
162
+ const reasonInput = flag(args, "--reason") ?? "operator_switch";
163
+ if (!REASONS.includes(reasonInput)) {
164
+ console.error(`Unknown --reason "${reasonInput}". One of: ${REASONS.join(", ")}`);
165
+ process.exit(1);
166
+ }
167
+ const transcript = flag(args, "--transcript");
168
+ const result = await performHandoff({
169
+ workspaceDir: workspace,
170
+ reason: reasonInput,
171
+ agent: from,
172
+ ...(transcript ? { transcript } : {}),
173
+ ...(args.includes("--no-snapshot") ? { noSnapshot: true } : {}),
174
+ });
175
+ console.log(`Compiled packet ${result.packet.packet.id} from ${from} (${result.eventCount} events).`);
176
+ try {
177
+ const lines = await injectPacket(to, result.packet, workspace);
178
+ console.log(lines.join("\n"));
179
+ }
180
+ catch (err) {
181
+ console.error(`Inject failed: ${err instanceof Error ? err.message : String(err)}`);
182
+ process.exit(1);
183
+ }
184
+ console.log(`\nHanded off ${from} → ${to}.`);
185
+ return;
186
+ }
187
+ case "mcp": {
188
+ await runMcpServer();
189
+ return;
190
+ }
191
+ case "bench-live": {
192
+ const { runLiveBench, formatLiveBenchReport, shellExecutor } = await import("./bench-live.js");
193
+ const command = flag(args, "--exec") ?? "claude -p --permission-mode acceptEdits";
194
+ const report = await runLiveBench({
195
+ executor: shellExecutor(command),
196
+ executorLabel: command,
197
+ ...(args.includes("--baseline") ? { baseline: true } : {}),
198
+ });
199
+ console.log(formatLiveBenchReport(report));
200
+ const liveOut = flag(args, "--json");
201
+ if (liveOut) {
202
+ const { writeFileSync } = await import("node:fs");
203
+ writeFileSync(liveOut, `${JSON.stringify(report, null, 2)}\n`);
204
+ console.log(`report: ${liveOut}`);
205
+ }
206
+ return;
207
+ }
208
+ case "bench": {
209
+ const { runContinuityBench, formatBenchReport } = await import("./bench.js");
210
+ const report = await runContinuityBench();
211
+ console.log(formatBenchReport(report));
212
+ const out = flag(args, "--json");
213
+ if (out) {
214
+ const { writeFileSync } = await import("node:fs");
215
+ writeFileSync(out, `${JSON.stringify(report, null, 2)}\n`);
216
+ console.log(`report: ${out}`);
217
+ }
218
+ if (!report.allPassed) {
219
+ process.exit(1);
220
+ }
221
+ return;
222
+ }
223
+ case "install-hooks": {
224
+ const agent = args.find((arg) => !arg.startsWith("--")) ?? "claude-code";
225
+ if (agent === "codex") {
226
+ const { installCodexMcp } = await import("./hooks.js");
227
+ const result = installCodexMcp();
228
+ console.log(result.installed
229
+ ? `Registered [mcp_servers.memento] in ${result.configPath}`
230
+ : `Already registered in ${result.configPath} — left as-is.`);
231
+ console.log(`Codex can now call memento_resume / memento_handoff / memento_verify / memento_status natively.`);
232
+ return;
233
+ }
234
+ if (agent !== "claude-code") {
235
+ console.error(`Installer for "${agent}" is not implemented yet (claude-code | codex).`);
236
+ process.exit(1);
237
+ }
238
+ const command = flag(args, "--command") ?? "memento hook";
239
+ const result = installClaudeHooks(workspace, command);
240
+ console.log(`Updated ${result.settingsPath}`);
241
+ result.installed.forEach((event) => console.log(` + ${event} → ${command}`));
242
+ result.skipped.forEach((event) => console.log(` = ${event} (already installed, left as-is)`));
243
+ if (command === "memento hook") {
244
+ console.log(`\nNote: "memento" must be on PATH for hooks to fire (pnpm build && npm link).`);
245
+ }
246
+ return;
247
+ }
248
+ case "hook": {
249
+ const outcome = await handleHookPayload(await readStdin());
250
+ console.error(outcome.message);
251
+ // Always exit 0: a capture failure must never disrupt the
252
+ // session it is trying to protect.
253
+ return;
254
+ }
255
+ case "resume": {
256
+ const packet = readPacket(workspace);
257
+ if (!verifySeal(packet)) {
258
+ console.error("⚠ Packet seal does not verify — it was modified after sealing. Refusing.");
259
+ process.exit(1);
260
+ }
261
+ console.log(renderResumePrompt(packet));
262
+ return;
263
+ }
264
+ case "verify": {
265
+ const packet = readPacket(workspace);
266
+ if (!packet.workspace.git) {
267
+ console.log("Packet carries no git state; nothing to verify.");
268
+ return;
269
+ }
270
+ const report = await verifyWorkspace(workspace, packet.workspace.git);
271
+ if (report.clean) {
272
+ console.log(`✓ Workspace matches packet ${packet.packet.id} — safe to continue.`);
273
+ return;
274
+ }
275
+ console.error(`✗ Drift detected against packet ${packet.packet.id}:`);
276
+ report.drift.forEach((line) => console.error(` ${line}`));
277
+ process.exit(1);
278
+ // eslint-disable-next-line no-unreachable
279
+ return;
280
+ }
281
+ case "restore": {
282
+ const packet = readPacket(workspace);
283
+ const snapshotRef = packet.workspace.git?.snapshotRef;
284
+ if (!snapshotRef) {
285
+ console.error("Packet carries no working-tree snapshot — nothing to restore.");
286
+ process.exit(1);
287
+ }
288
+ if (!(await snapshotRefExists(workspace, snapshotRef))) {
289
+ console.error(`Snapshot ${snapshotRef} is not present in this repo.`);
290
+ console.error("Restore runs where the packet was captured; cross-machine restore needs a bundle.");
291
+ process.exit(1);
292
+ }
293
+ // Don't silently clobber the receiver's own uncommitted work: refuse
294
+ // when the live tree has edits that diverge from the packet, unless
295
+ // --force. A clean checkout (or one already matching the packet) is
296
+ // safe — that's the primary "bring the work here" case.
297
+ const force = args.includes("--force");
298
+ if (!force && packet.workspace.git) {
299
+ const current = await captureGitState(workspace);
300
+ if (current && current.dirty.length > 0) {
301
+ const report = await verifyWorkspace(workspace, packet.workspace.git);
302
+ if (!report.clean) {
303
+ console.error("⚠ Workspace has uncommitted changes that diverge from the packet — restore would overwrite them.");
304
+ report.drift.forEach((line) => console.error(` ${line}`));
305
+ console.error("Commit/stash your changes, or re-run with --force to overwrite.");
306
+ process.exit(1);
307
+ }
308
+ }
309
+ }
310
+ const result = await restoreWorkspace(workspace, snapshotRef);
311
+ console.log(`✓ Restored ${result.files.length} file(s) from ${snapshotRef} into ${workspace}.`);
312
+ result.files.slice(0, 12).forEach((file) => console.log(` ${file}`));
313
+ if (result.files.length > 12) {
314
+ console.log(` … and ${result.files.length - 12} more`);
315
+ }
316
+ console.log("\nThe prior agent's working tree (uncommitted + untracked included) is now in place.");
317
+ return;
318
+ }
319
+ case "status": {
320
+ const packet = readPacket(workspace);
321
+ console.log(renderStatus(packet, verifySeal(packet)));
322
+ return;
323
+ }
324
+ case "schema": {
325
+ console.log(JSON.stringify(packetJsonSchema(), null, 2));
326
+ return;
327
+ }
328
+ default: {
329
+ console.log(HELP);
330
+ process.exit(command ? 1 : 0);
331
+ }
332
+ }
333
+ }
334
+ main().catch((error) => {
335
+ console.error(error instanceof Error ? error.message : String(error));
336
+ process.exit(1);
337
+ });
338
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type Ledger } from "./ledger.js";
2
+ import { type Packet } from "./packet.js";
3
+ import { type Summarizer } from "./summarize.js";
4
+ /**
5
+ * The packet compiler (spec §7.2). Deterministic fields (git state, tool
6
+ * outcomes, in-flight calls) are EXTRACTED from the ledger and workspace;
7
+ * narrative fields (objective, next, warnings) come from the pluggable
8
+ * summarizer. The LLM — when one is configured — only ever writes prose
9
+ * around verified facts, never the facts themselves.
10
+ */
11
+ export interface CompilePacketOptions {
12
+ ledger: Ledger;
13
+ workspaceDir: string;
14
+ reason: Packet["packet"]["reason"];
15
+ peer?: string;
16
+ human?: string;
17
+ model?: string;
18
+ taskId?: string;
19
+ parent?: string | null;
20
+ seq?: number;
21
+ scope?: Packet["packet"]["scope"];
22
+ summarizer?: Summarizer;
23
+ /** Skip the refs/memento/* snapshot (e.g. read-only checkouts). */
24
+ noSnapshot?: boolean;
25
+ now?: () => Date;
26
+ }
27
+ export declare function compilePacket(options: CompilePacketOptions): Promise<Packet>;
@@ -0,0 +1,193 @@
1
+ import { inFlightCalls, truncate } from "./ledger.js";
2
+ import { newPacketId, newTaskId, workspaceId } from "./ids.js";
3
+ import { captureGitState } from "./git.js";
4
+ import { PacketSchema, sealPacket, } from "./packet.js";
5
+ import { redactDeep } from "./redact.js";
6
+ import { HeuristicSummarizer } from "./summarize.js";
7
+ const COMPLETED_MAX = 14;
8
+ const OUTCOME_MAX = 200;
9
+ export async function compilePacket(options) {
10
+ let summarizer = options.summarizer;
11
+ if (!summarizer) {
12
+ if (process.env.OPENAI_API_KEY || process.env.ANTHROPIC_API_KEY) {
13
+ try {
14
+ const { LlmSummarizer } = await import("./summarize.js");
15
+ summarizer = new LlmSummarizer();
16
+ }
17
+ catch {
18
+ summarizer = new HeuristicSummarizer();
19
+ }
20
+ }
21
+ else {
22
+ summarizer = new HeuristicSummarizer();
23
+ }
24
+ }
25
+ const now = options.now ?? (() => new Date());
26
+ const packetId = newPacketId();
27
+ const git = await captureGitState(options.workspaceDir, {
28
+ ...(options.noSnapshot ? {} : { snapshotPacketId: packetId }),
29
+ });
30
+ const finalSummarizer = summarizer || new HeuristicSummarizer();
31
+ const summary = await finalSummarizer.summarize(options.ledger);
32
+ const toolState = extractToolState(options.ledger);
33
+ const lastRun = extractLastRun(options.ledger);
34
+ // Redact everything narrative or tool-derived BEFORE assembly; git paths
35
+ // and ids are structural and stay as-is.
36
+ const redacted = redactDeep({
37
+ objective: summary.objective,
38
+ planSteps: summary.planSteps,
39
+ decisions: summary.decisions,
40
+ next: summary.next,
41
+ warnings: summary.warnings,
42
+ toolState,
43
+ lastRun,
44
+ });
45
+ const r = redacted.value;
46
+ const title = truncate(r.objective.split(/[.!?\n]/)[0] ?? r.objective, 80);
47
+ const packet = {
48
+ memento: "1.0",
49
+ packet: {
50
+ id: packetId,
51
+ taskId: options.taskId ?? newTaskId(),
52
+ workspaceId: workspaceId(git?.remote ?? options.workspaceDir),
53
+ scope: options.scope ?? "workspace",
54
+ createdAt: now().toISOString(),
55
+ reason: options.reason,
56
+ from: {
57
+ peer: options.peer ?? `peer_${options.ledger.agent}`,
58
+ agent: options.ledger.agent,
59
+ ...(options.model ? { model: options.model } : {}),
60
+ ...(options.human ? { human: options.human } : {}),
61
+ },
62
+ seq: options.seq ?? 0,
63
+ parent: options.parent ?? null,
64
+ },
65
+ task: {
66
+ title,
67
+ objective: r.objective,
68
+ constraints: [],
69
+ acceptance: [],
70
+ },
71
+ plan: { steps: r.planSteps },
72
+ decisions: r.decisions,
73
+ workspace: {
74
+ ...(git ? { git } : {}),
75
+ ...(r.lastRun ? { lastRun: r.lastRun } : {}),
76
+ },
77
+ toolState: r.toolState,
78
+ memory: { inline: [] },
79
+ next: r.next,
80
+ warnings: r.warnings,
81
+ ...(options.ledger.sourcePath ? { ledgerRef: options.ledger.sourcePath } : {}),
82
+ fidelity: "structural",
83
+ redaction: {
84
+ applied: redacted.count > 0,
85
+ rules: redacted.rulesHit,
86
+ count: redacted.count,
87
+ },
88
+ ...(options.ledger.sourcePath ? { ledgerRef: options.ledger.sourcePath } : {}),
89
+ };
90
+ // Validate against the schema before sealing — a packet that does not
91
+ // parse is a bug here, not a surprise for the receiving agent.
92
+ return sealPacket(PacketSchema.parse(packet));
93
+ }
94
+ function extractToolState(ledger) {
95
+ const completed = [];
96
+ const seen = new Set();
97
+ // Walk backwards: the most recent outcome per tool+target wins, and the
98
+ // packet keeps only the freshest COMPLETED_MAX.
99
+ for (let i = ledger.events.length - 1; i >= 0; i -= 1) {
100
+ const event = ledger.events[i];
101
+ if (!event || (event.type !== "tool.completed" && event.type !== "tool.failed") || !event.tool) {
102
+ continue;
103
+ }
104
+ const key = `${event.tool.name} ${event.tool.target ?? ""}`;
105
+ if (seen.has(key)) {
106
+ continue;
107
+ }
108
+ seen.add(key);
109
+ completed.unshift({
110
+ tool: event.tool.name,
111
+ ...(event.tool.target ? { target: event.tool.target } : {}),
112
+ outcome: `${event.type === "tool.failed" ? "FAILED: " : ""}${truncate(event.tool.outcome ?? "(no output)", OUTCOME_MAX)}`,
113
+ });
114
+ if (completed.length >= COMPLETED_MAX) {
115
+ break;
116
+ }
117
+ }
118
+ const inFlight = inFlightCalls(ledger).map((event) => ({
119
+ tool: event.tool?.name ?? "unknown",
120
+ ...(event.tool?.target ? { target: event.tool.target } : {}),
121
+ disposition: "NOT applied — re-derive from the actual working tree, do not assume this ran.",
122
+ }));
123
+ return {
124
+ completed,
125
+ inFlight,
126
+ approvals: extractApprovals(ledger),
127
+ };
128
+ }
129
+ function extractApprovals(ledger) {
130
+ const grantedSessionSet = new Set();
131
+ const pendingRequests = new Map();
132
+ const denied = [];
133
+ // Map to find request details for a resolved event
134
+ const requestedById = new Map();
135
+ for (const event of ledger.events) {
136
+ if (event.type === "approval.requested" && event.tool) {
137
+ const approvalId = event.meta?.approvalId ?? String(event.seq);
138
+ const detail = {
139
+ tool: event.tool.name,
140
+ target: event.tool.target,
141
+ reason: event.content,
142
+ };
143
+ requestedById.set(approvalId, detail);
144
+ pendingRequests.set(approvalId, detail);
145
+ }
146
+ else if (event.type === "approval.resolved" && event.tool) {
147
+ const approvalId = event.meta?.approvalId ?? String(event.seq);
148
+ const status = event.meta?.status;
149
+ const scope = event.meta?.scope;
150
+ // Remove from pending as it is resolved
151
+ pendingRequests.delete(approvalId);
152
+ const req = requestedById.get(approvalId);
153
+ const tool = event.tool.name || req?.tool || "unknown";
154
+ const target = event.tool.target || req?.target;
155
+ if (status === "approved" && scope === "session") {
156
+ const key = target ? `${tool}:${target}` : tool;
157
+ grantedSessionSet.add(key);
158
+ }
159
+ else if (status === "denied") {
160
+ denied.push({
161
+ tool,
162
+ ...(target ? { target } : {}),
163
+ ...(event.content ? { note: event.content } : req?.reason ? { note: req.reason } : {}),
164
+ });
165
+ }
166
+ }
167
+ }
168
+ const pending = Array.from(pendingRequests.values()).map((req) => {
169
+ return req.target ? `${req.tool}:${req.target}` : req.tool;
170
+ });
171
+ return {
172
+ granted_session: Array.from(grantedSessionSet),
173
+ pending,
174
+ denied,
175
+ };
176
+ }
177
+ function extractLastRun(ledger) {
178
+ for (let i = ledger.events.length - 1; i >= 0; i -= 1) {
179
+ const event = ledger.events[i];
180
+ if (event
181
+ && (event.type === "tool.completed" || event.type === "tool.failed")
182
+ && event.tool?.name.toLowerCase() === "bash"
183
+ && event.tool.target) {
184
+ return {
185
+ cmd: event.tool.target,
186
+ result: truncate(event.tool.outcome ?? "(no output)", OUTCOME_MAX),
187
+ ...(event.at ? { at: event.at } : {}),
188
+ };
189
+ }
190
+ }
191
+ return undefined;
192
+ }
193
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"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"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,45 @@
1
+ import type { PacketGitState } from "./packet.js";
2
+ export interface CaptureGitStateOptions {
3
+ /** Create a refs/memento/<packetId> snapshot of the full tree. Default true. */
4
+ snapshotPacketId?: string;
5
+ }
6
+ /**
7
+ * Capture the workspace's git state for a packet. Returns undefined when the
8
+ * directory is not a git repository (packets allow workspace.git to be absent).
9
+ */
10
+ export declare function captureGitState(dir: string, options?: CaptureGitStateOptions): Promise<PacketGitState | undefined>;
11
+ export declare function digestDirtyState(porcelain: string, diff: string): string;
12
+ /**
13
+ * Snapshot the FULL working tree (incl. uncommitted and untracked files) into
14
+ * a shadow commit at refs/memento/<packetId>. Uses GIT_INDEX_FILE so the user's
15
+ * staging area is untouched. Returns the ref name, or null on failure —
16
+ * snapshot failure must never block packet compilation.
17
+ */
18
+ export declare function snapshotWorkspace(dir: string, packetId: string, headSha: string | null): Promise<string | null>;
19
+ export interface DriftReport {
20
+ clean: boolean;
21
+ drift: string[];
22
+ }
23
+ /**
24
+ * The continuity check (spec §7.4): compare the live workspace against the
25
+ * git state recorded in a packet. Drift is surfaced, never auto-resolved.
26
+ */
27
+ export declare function verifyWorkspace(dir: string, expected: PacketGitState): Promise<DriftReport>;
28
+ /** True if `ref` resolves in this repo (snapshots live only where captured). */
29
+ export declare function snapshotRefExists(dir: string, ref: string): Promise<boolean>;
30
+ export interface RestoreReport {
31
+ /** Paths written into the working tree from the snapshot. */
32
+ files: string[];
33
+ }
34
+ /**
35
+ * Materialize a packet's working-tree snapshot (refs/memento/<id>) back into
36
+ * `dir` — the receiving agent gets the prior agent's actual uncommitted AND
37
+ * untracked files, not just a description of them. This is what makes a memento
38
+ * carry executable state rather than notes.
39
+ *
40
+ * Uses a TEMPORARY index + checkout-index so the real index and HEAD are never
41
+ * touched. Existing files are overwritten (-f); files absent from the snapshot
42
+ * are left in place (non-deleting by design — restore is additive, never
43
+ * destructive to work the snapshot didn't know about).
44
+ */
45
+ export declare function restoreWorkspace(dir: string, snapshotRef: string): Promise<RestoreReport>;