@mneme-ai/core 2.64.0 → 2.66.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.
@@ -0,0 +1,406 @@
1
+ /**
2
+ * v2.66.0 — REFLOG: cross-session time-machine for AI-driven repos.
3
+ *
4
+ * Closes the Mneme MCP septet: bodyguard + diplomat + conscience +
5
+ * memory + consensus + coordination + **time machine**. With v2.66
6
+ * shipped, the full 7-primitive agent infrastructure stack is LIVE.
7
+ *
8
+ * Killer use case: "rewind 2 hours, keep tests" → bad commits revert,
9
+ * tests intact. Pre-MIRROR: `git reset --hard` is all-or-nothing —
10
+ * loses the good with the bad. REFLOG keeps:
11
+ * - HMAC-signed checkpoints (HEAD ref + per-file SHA + AI pheromone
12
+ * tag = which agent was active when each file was last touched)
13
+ * - Selective rewind via path-predicate filter (include/exclude
14
+ * globs) and/or AI pheromone filter (only rewind cursor's edits)
15
+ * - Dry-run preview by default — shows what WOULD revert / keep
16
+ * - Cryptographic audit trail of every checkpoint + rewind
17
+ *
18
+ * REFLOG is SAFE by construction: rewind() never touches the working
19
+ * tree. It returns a PROPOSAL (a list of files + their target SHAs).
20
+ * The caller applies it via a separate operation OR pastes the
21
+ * proposal into git/IDE for manual review.
22
+ *
23
+ * 7 wild innovations:
24
+ *
25
+ * 1. PER-FILE SHA CHECKPOINT — snapshot the SHA of every tracked
26
+ * file at checkpoint time. Lets rewind operate at file
27
+ * granularity, not just commit granularity.
28
+ *
29
+ * 2. AI PHEROMONE TAGGING — each checkpoint records `recentAgent`
30
+ * (Claude / Cursor / Continue / Aider) inferred from env vars
31
+ * (CLAUDECODE / CURSOR_AGENT / etc). Rewind can filter by
32
+ * pheromone: "rewind only Cursor's edits in the last 2h".
33
+ *
34
+ * 3. PATH-PREDICATE FILTER — minimatch-style include/exclude globs.
35
+ * "Rewind everything EXCEPT tests/**" keeps tests intact while
36
+ * reverting production code.
37
+ *
38
+ * 4. TIME-WINDOW REWIND — `--since 2h` or `--checkpoint <id>`.
39
+ * REFLOG computes the right target checkpoint then diffs.
40
+ *
41
+ * 5. DRY-RUN PROPOSAL — every rewind returns a structured
42
+ * `RewindProposal` (toRevert + toKeep). The agent reviews
43
+ * before applying. No accidental data loss.
44
+ *
45
+ * 6. HMAC-CHAINED REFLOG LEDGER — every checkpoint + rewind
46
+ * proposal + apply event chained. Tamper-evident.
47
+ *
48
+ * 7. COMPOSES WITH SWARM BUS — when a rewind ships, REFLOG can
49
+ * auto-broadcast to a swarm channel so other agents know
50
+ * the working tree changed. Wire pending v2.67+.
51
+ *
52
+ * Pure ESM. Defensive — never throws.
53
+ */
54
+ import { createHash, createHmac } from "node:crypto";
55
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
56
+ import { dirname, join, relative, sep } from "node:path";
57
+ const KEY_ENV = "MNEME_REFLOG_KEY";
58
+ const DEFAULT_KEY = "mneme-reflog-v1";
59
+ function keyOf() { return process.env[KEY_ENV] ?? DEFAULT_KEY; }
60
+ /* ── Canonical JSON HMAC ────────────────────────────────────────── */
61
+ function canonicalJson(o) {
62
+ if (o === undefined)
63
+ return "null";
64
+ if (o === null || typeof o !== "object")
65
+ return JSON.stringify(o);
66
+ if (Array.isArray(o))
67
+ return "[" + o.map((x) => canonicalJson(x === undefined ? null : x)).join(",") + "]";
68
+ const entries = Object.entries(o).filter(([, v]) => v !== undefined);
69
+ entries.sort(([a], [b]) => a.localeCompare(b));
70
+ return "{" + entries.map(([k, v]) => JSON.stringify(k) + ":" + canonicalJson(v)).join(",") + "}";
71
+ }
72
+ function signHmac(body) {
73
+ return createHmac("sha256", keyOf()).update(canonicalJson(body)).digest("hex");
74
+ }
75
+ /* ── Pheromone detection (cheap env-var scan) ───────────────────── */
76
+ export function detectPheromone() {
77
+ // Same inputs NEMESIS uses for env_scan; cheap synchronous fallback.
78
+ if (process.env["CLAUDECODE"] || process.env["CLAUDE_CODE_SSE_PORT"] || process.env["CLAUDE_CODE_SESSION"] || process.env["CLAUDE_CODE_ENTRYPOINT"])
79
+ return "claude-code";
80
+ if (process.env["CURSOR_AGENT"] || process.env["CURSOR_SESSION"])
81
+ return "cursor";
82
+ if (process.env["CONTINUE_AGENT"] || process.env["CONTINUE_SESSION"])
83
+ return "continue";
84
+ if (process.env["AIDER_VERSION"] || process.env["AIDER_AGENT"])
85
+ return "aider";
86
+ if (process.env["DEVIN_SESSION"])
87
+ return "devin";
88
+ if (process.env["GROK_AGENT"] || process.env["GROK_CLI"] || process.env["XAI_API_KEY"])
89
+ return "grok";
90
+ if (process.env["GEMINI_AGENT"] || process.env["GOOGLE_AI_KEY"])
91
+ return "gemini";
92
+ if (process.env["COPILOT_AGENT"])
93
+ return "copilot";
94
+ return "unknown";
95
+ }
96
+ /* ── File walk + SHA ────────────────────────────────────────────── */
97
+ function sha256Hex(buf) {
98
+ return createHash("sha256").update(buf).digest("hex");
99
+ }
100
+ const DEFAULT_EXCLUDE = [
101
+ ".git", "node_modules", ".mneme", "dist", "build", "out", ".next", ".turbo",
102
+ "coverage", ".cache", ".vite", ".parcel-cache", "*.log",
103
+ ];
104
+ function matchAny(path, patterns) {
105
+ // Lightweight glob: handles literal substring + leading "/" anchor + "*" wildcard.
106
+ const norm = path.replace(/\\/g, "/");
107
+ for (const p of patterns) {
108
+ if (p.length === 0)
109
+ continue;
110
+ if (p.startsWith("*.") && norm.endsWith(p.slice(1)))
111
+ return true;
112
+ if (p.includes("*")) {
113
+ const rx = new RegExp("^" + p.replace(/\./g, "\\.").replace(/\*\*/g, "::DSTAR::").replace(/\*/g, "[^/]*").replace(/::DSTAR::/g, ".*") + "$");
114
+ if (rx.test(norm))
115
+ return true;
116
+ }
117
+ else if (norm === p || norm.startsWith(p + "/") || norm.endsWith("/" + p) || norm.includes("/" + p + "/")) {
118
+ return true;
119
+ }
120
+ else if (norm === p)
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+ function walkFiles(root, include, exclude, maxFiles) {
126
+ const out = [];
127
+ const queue = [root];
128
+ while (queue.length > 0 && out.length < maxFiles) {
129
+ const dir = queue.shift();
130
+ let entries;
131
+ try {
132
+ entries = readdirSync(dir, { withFileTypes: true });
133
+ }
134
+ catch {
135
+ continue;
136
+ }
137
+ for (const e of entries) {
138
+ const full = join(dir, e.name);
139
+ const rel = relative(root, full).split(sep).join("/");
140
+ // Skip excluded paths early.
141
+ if (matchAny(rel, exclude) || matchAny(e.name, exclude))
142
+ continue;
143
+ if (e.isDirectory()) {
144
+ queue.push(full);
145
+ continue;
146
+ }
147
+ if (!e.isFile())
148
+ continue;
149
+ if (include.length > 0 && !include.includes("**/*") && !matchAny(rel, include))
150
+ continue;
151
+ out.push(rel);
152
+ if (out.length >= maxFiles)
153
+ break;
154
+ }
155
+ }
156
+ return out;
157
+ }
158
+ function gitHead(cwd) {
159
+ try {
160
+ const headFile = join(cwd, ".git", "HEAD");
161
+ if (!existsSync(headFile))
162
+ return "";
163
+ const head = readFileSync(headFile, "utf8").trim();
164
+ if (head.startsWith("ref: ")) {
165
+ const refPath = join(cwd, ".git", head.slice(5).trim());
166
+ if (existsSync(refPath))
167
+ return readFileSync(refPath, "utf8").trim();
168
+ return head;
169
+ }
170
+ return head;
171
+ }
172
+ catch {
173
+ return "";
174
+ }
175
+ }
176
+ /* ── Checkpoint ─────────────────────────────────────────────────── */
177
+ export function createCheckpoint(input = {}) {
178
+ const cwd = input.cwd ?? process.cwd();
179
+ const include = input.include ?? ["**/*"];
180
+ const exclude = [...DEFAULT_EXCLUDE, ...(input.exclude ?? [])];
181
+ const maxFiles = input.maxFiles ?? 5000;
182
+ const at = new Date().toISOString();
183
+ const id = sha256Hex(at + Math.random().toString()).slice(0, 16);
184
+ const head = gitHead(cwd);
185
+ const pheromone = detectPheromone();
186
+ const files = [];
187
+ for (const rel of walkFiles(cwd, include, exclude, maxFiles)) {
188
+ try {
189
+ const full = join(cwd, rel);
190
+ const stat = statSync(full);
191
+ if (stat.size > 5 * 1024 * 1024)
192
+ continue; // skip >5MB
193
+ const content = readFileSync(full);
194
+ files.push({ path: rel, sha: sha256Hex(content), mtimeMs: stat.mtimeMs });
195
+ }
196
+ catch { /* skip unreadable */ }
197
+ }
198
+ const body = { id, at, gitHead: head, pheromone, files, label: input.label };
199
+ const hmac = signHmac(body);
200
+ const cp = { ...body, hmac };
201
+ // Persist + append ledger.
202
+ try {
203
+ const p = join(cwd, ".mneme", "reflog", `checkpoint-${id}.json`);
204
+ mkdirSync(dirname(p), { recursive: true });
205
+ writeFileSync(p, JSON.stringify(cp, null, 2));
206
+ }
207
+ catch { /* noop */ }
208
+ appendLedger(cwd, { kind: "checkpoint", at, id, detail: `files=${files.length} pheromone=${pheromone} head=${head.slice(0, 8)}` });
209
+ return { ok: true, checkpoint: cp, hint: `checkpoint ${id} created · ${files.length} file(s) · pheromone=${pheromone}` };
210
+ }
211
+ export function listCheckpoints(cwd) {
212
+ const dir = join(cwd, ".mneme", "reflog");
213
+ if (!existsSync(dir))
214
+ return [];
215
+ const out = [];
216
+ let entries;
217
+ try {
218
+ entries = readdirSync(dir, { withFileTypes: true });
219
+ }
220
+ catch {
221
+ return [];
222
+ }
223
+ for (const e of entries) {
224
+ if (!e.isFile() || !e.name.startsWith("checkpoint-") || !e.name.endsWith(".json"))
225
+ continue;
226
+ try {
227
+ const cp = JSON.parse(readFileSync(join(dir, e.name), "utf8"));
228
+ out.push({ id: cp.id, at: cp.at, label: cp.label, fileCount: cp.files.length, pheromone: cp.pheromone });
229
+ }
230
+ catch { /* skip */ }
231
+ }
232
+ out.sort((a, b) => b.at.localeCompare(a.at));
233
+ return out;
234
+ }
235
+ export function readCheckpoint(cwd, id) {
236
+ try {
237
+ const p = join(cwd, ".mneme", "reflog", `checkpoint-${id}.json`);
238
+ if (!existsSync(p))
239
+ return null;
240
+ return JSON.parse(readFileSync(p, "utf8"));
241
+ }
242
+ catch {
243
+ return null;
244
+ }
245
+ }
246
+ export function verifyCheckpoint(c) {
247
+ if (!c || typeof c.hmac !== "string")
248
+ return false;
249
+ const { hmac, ...body } = c;
250
+ return signHmac(body) === hmac;
251
+ }
252
+ /* ── Rewind proposal ────────────────────────────────────────────── */
253
+ function parseSince(s) {
254
+ // "2h" "30m" "1d" → ms ago
255
+ const m = /^(\d+)\s*([smhd])$/.exec(s.trim());
256
+ if (!m)
257
+ return 0;
258
+ const n = parseInt(m[1], 10);
259
+ const unit = m[2];
260
+ const mul = unit === "s" ? 1000 : unit === "m" ? 60000 : unit === "h" ? 3600000 : 86400000;
261
+ return n * mul;
262
+ }
263
+ export function rewindPreview(input) {
264
+ const cwd = input.cwd ?? process.cwd();
265
+ const ckpts = listCheckpoints(cwd).map((m) => readCheckpoint(cwd, m.id)).filter((x) => !!x);
266
+ let target = null;
267
+ if (input.checkpointId) {
268
+ target = ckpts.find((c) => c.id === input.checkpointId) ?? null;
269
+ }
270
+ else if (input.since) {
271
+ const cutoff = Date.now() - parseSince(input.since);
272
+ // Pick the LATEST checkpoint AT-OR-BEFORE cutoff (so we restore the state from before "since" ago).
273
+ const candidates = ckpts.filter((c) => new Date(c.at).getTime() <= cutoff);
274
+ target = candidates.sort((a, b) => b.at.localeCompare(a.at))[0] ?? null;
275
+ }
276
+ else {
277
+ // Default: previous-to-current checkpoint.
278
+ target = ckpts[1] ?? null;
279
+ }
280
+ if (!target) {
281
+ return {
282
+ ok: false, targetCheckpoint: { id: "", at: "" },
283
+ toRevert: [], toKeep: [],
284
+ summary: "no target checkpoint found (need at least one checkpoint matching the filter)",
285
+ hmac: signHmac({}),
286
+ };
287
+ }
288
+ const include = input.include ?? [];
289
+ const exclude = input.exclude ?? [];
290
+ const toRevert = [];
291
+ const toKeep = [];
292
+ for (const f of target.files) {
293
+ if (input.pheromone && target.pheromone !== input.pheromone) {
294
+ toKeep.push({ path: f.path, reason: `pheromone mismatch (target=${target.pheromone}, want=${input.pheromone})` });
295
+ continue;
296
+ }
297
+ if (exclude.length > 0 && matchAny(f.path, exclude)) {
298
+ toKeep.push({ path: f.path, reason: "excluded by --exclude pattern" });
299
+ continue;
300
+ }
301
+ if (include.length > 0 && !matchAny(f.path, include)) {
302
+ toKeep.push({ path: f.path, reason: "not in --include pattern" });
303
+ continue;
304
+ }
305
+ // Current SHA
306
+ let currentSha = "";
307
+ try {
308
+ const full = join(cwd, f.path);
309
+ if (existsSync(full))
310
+ currentSha = sha256Hex(readFileSync(full));
311
+ }
312
+ catch { /* leave empty */ }
313
+ if (currentSha === f.sha) {
314
+ toKeep.push({ path: f.path, reason: "no change since checkpoint" });
315
+ continue;
316
+ }
317
+ toRevert.push({ path: f.path, currentSha, targetSha: f.sha, targetMtimeMs: f.mtimeMs, targetPheromone: target.pheromone });
318
+ }
319
+ const summary = `rewind to ${target.id} (${target.at}) — ${toRevert.length} file(s) to revert, ${toKeep.length} kept`;
320
+ const body = {
321
+ ok: toRevert.length > 0,
322
+ targetCheckpoint: { id: target.id, at: target.at, label: target.label },
323
+ toRevert, toKeep, summary,
324
+ };
325
+ const hmac = signHmac(body);
326
+ appendLedger(cwd, { kind: "rewind_preview", at: new Date().toISOString(), id: target.id, detail: `toRevert=${toRevert.length} toKeep=${toKeep.length}` });
327
+ return { ...body, hmac };
328
+ }
329
+ export function verifyRewindProposal(r) {
330
+ if (!r || typeof r.hmac !== "string")
331
+ return false;
332
+ const { hmac, ...body } = r;
333
+ return signHmac(body) === hmac;
334
+ }
335
+ function ledgerPath(cwd) {
336
+ return join(cwd, ".mneme", "reflog", "ledger.jsonl");
337
+ }
338
+ function lastLedgerHmac(cwd) {
339
+ try {
340
+ const lines = readFileSync(ledgerPath(cwd), "utf8").trim().split(/\n/).filter((l) => l.trim().length > 0);
341
+ if (lines.length === 0)
342
+ return "";
343
+ return JSON.parse(lines[lines.length - 1]).hmac;
344
+ }
345
+ catch {
346
+ return "";
347
+ }
348
+ }
349
+ function appendLedger(cwd, entry) {
350
+ const prevHmac = lastLedgerHmac(cwd);
351
+ const body = { ...entry, prevHmac };
352
+ const hmac = createHmac("sha256", keyOf()).update(prevHmac).update(canonicalJson(body)).digest("hex");
353
+ const row = { ...body, hmac };
354
+ try {
355
+ mkdirSync(dirname(ledgerPath(cwd)), { recursive: true });
356
+ appendFileSync(ledgerPath(cwd), JSON.stringify(row) + "\n");
357
+ }
358
+ catch { /* noop */ }
359
+ return row;
360
+ }
361
+ export function readLedger(cwd) {
362
+ try {
363
+ return readFileSync(ledgerPath(cwd), "utf8").trim().split(/\n/).filter((l) => l.trim().length > 0).map((l) => JSON.parse(l));
364
+ }
365
+ catch {
366
+ return [];
367
+ }
368
+ }
369
+ export function verifyLedgerChain(cwd) {
370
+ const lines = readLedger(cwd);
371
+ let prevHmac = "";
372
+ for (let i = 0; i < lines.length; i++) {
373
+ const row = lines[i];
374
+ if (row.prevHmac !== prevHmac)
375
+ return { ok: false, rows: i, brokenAt: i };
376
+ const { hmac, ...body } = row;
377
+ const expected = createHmac("sha256", keyOf()).update(prevHmac).update(canonicalJson(body)).digest("hex");
378
+ if (expected !== hmac)
379
+ return { ok: false, rows: i, brokenAt: i };
380
+ prevHmac = hmac;
381
+ }
382
+ return { ok: true, rows: lines.length };
383
+ }
384
+ /* ── Render banner ──────────────────────────────────────────────── */
385
+ export function renderRewindBanner(r) {
386
+ const lines = [
387
+ `⏪ REFLOG · ${r.summary}`,
388
+ "",
389
+ ];
390
+ for (const f of r.toRevert.slice(0, 30)) {
391
+ lines.push(` ↩ ${f.path} (now ${f.currentSha.slice(0, 8)} → ${f.targetSha.slice(0, 8)} from ${f.targetPheromone})`);
392
+ }
393
+ if (r.toRevert.length > 30)
394
+ lines.push(` …and ${r.toRevert.length - 30} more`);
395
+ if (r.toKeep.length > 0) {
396
+ lines.push("");
397
+ lines.push(` KEEPING (${r.toKeep.length}):`);
398
+ for (const k of r.toKeep.slice(0, 8)) {
399
+ lines.push(` ${k.path} — ${k.reason}`);
400
+ }
401
+ if (r.toKeep.length > 8)
402
+ lines.push(` …and ${r.toKeep.length - 8} more`);
403
+ }
404
+ return lines.join("\n");
405
+ }
406
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reflog/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * v2.65.0 — SWARM BUS: cross-agent message bus over Mneme MCP.
3
+ *
4
+ * Continues Mneme MCP user-roadmap. v2.60-v2.64 quintet shipped:
5
+ * bodyguard / diplomat / conscience / memory / consensus. v2.65 adds
6
+ * the **cross-agent coordination** primitive (6th of 7).
7
+ *
8
+ * (Distinct namespace from v2.19 `swarm/` orchestrator wrapper.
9
+ * SWARM BUS = the actual message broker. Separate concern.)
10
+ *
11
+ * Killer use case: Claude finishes auth.ts → broadcasts on channel
12
+ * "team_x" → Cursor (in a different window, same Mneme MCP) receives
13
+ * via drain → verifies artifact HMAC → adds tests → broadcasts back.
14
+ * User watches the full Claude → Cursor → Continue handoff chain in
15
+ * `mneme swarm_bus audit`, each step HMAC-proven.
16
+ *
17
+ * Multi-agent orchestration today = framework lock-in (LangGraph,
18
+ * CrewAI, AutoGen). SWARM BUS = vendor-agnostic broker. Any agent
19
+ * that speaks MCP can join the swarm.
20
+ *
21
+ * 6 wild innovations:
22
+ *
23
+ * 1. PER-AGENT INBOX — each agent has its own queue. broadcast()
24
+ * enqueues to ALL subscribers of the channel; drain() pops the
25
+ * pending messages for one agent (marking them delivered).
26
+ * Messages persist across process restarts.
27
+ *
28
+ * 2. LAMPORT-CLOCK CAUSAL ORDERING — broadcast bumps a per-channel
29
+ * Lamport timestamp; messages delivered in causally-correct
30
+ * order even when broadcasters race.
31
+ *
32
+ * 3. ARTIFACT HMAC VERIFICATION — broadcast can include
33
+ * `artifactHmac` (e.g. SHA-256 of `auth.ts`). Receiving agent
34
+ * re-hashes the file before acting. Tamper between broadcast
35
+ * and consume is detectable.
36
+ *
37
+ * 4. CHANNEL ACL VIA PASSPORT (composes with v2.61 PASSPORT) —
38
+ * channels can be `private`; subscribe + broadcast require a
39
+ * valid capability passport with scope `swarm:<channel>`.
40
+ * Public channels are open.
41
+ *
42
+ * 5. HANDOFF NARRATIVE — `auditHandoff(channel)` walks the ledger
43
+ * and renders the agent → agent → agent chain as plain English
44
+ * with HMAC proof per step. Inspector for "what did the swarm
45
+ * actually do?".
46
+ *
47
+ * 6. HMAC-CHAINED LEDGER (`.mneme/swarm_bus/bus.jsonl`) — every
48
+ * subscribe + broadcast + drain row's HMAC depends on prev row.
49
+ * Same canonical-JSON convention as v2.61-v2.64.
50
+ *
51
+ * Pure ESM. Defensive — never throws.
52
+ */
53
+ export type ChannelKind = "public" | "private";
54
+ export interface SwarmMessage {
55
+ id: string;
56
+ at: string;
57
+ channel: string;
58
+ from: string;
59
+ text: string;
60
+ lamport: number;
61
+ artifactHmac?: string;
62
+ artifactPath?: string;
63
+ hmac: string;
64
+ }
65
+ export interface BroadcastInput {
66
+ channel: string;
67
+ from: string;
68
+ text: string;
69
+ artifactHmac?: string;
70
+ artifactPath?: string;
71
+ passportToken?: string;
72
+ cwd?: string;
73
+ }
74
+ export interface BroadcastResult {
75
+ ok: boolean;
76
+ reason: "delivered" | "channel_unknown" | "no_subscribers" | "passport_required" | "passport_invalid";
77
+ message?: SwarmMessage;
78
+ deliveredTo: string[];
79
+ hint: string;
80
+ }
81
+ export interface SubscribeInput {
82
+ channel: string;
83
+ agent: string;
84
+ passportToken?: string;
85
+ cwd?: string;
86
+ }
87
+ export interface SubscribeResult {
88
+ ok: boolean;
89
+ reason: "subscribed" | "already_subscribed" | "passport_required" | "passport_invalid";
90
+ channel: string;
91
+ agent: string;
92
+ hint: string;
93
+ }
94
+ export interface DrainInput {
95
+ agent: string;
96
+ channel?: string;
97
+ limit?: number;
98
+ cwd?: string;
99
+ }
100
+ export interface DrainResult {
101
+ ok: boolean;
102
+ messages: SwarmMessage[];
103
+ hint: string;
104
+ }
105
+ export interface CreateChannelInput {
106
+ channel: string;
107
+ kind: ChannelKind;
108
+ owner: string;
109
+ cwd?: string;
110
+ }
111
+ interface ChannelMeta {
112
+ name: string;
113
+ kind: ChannelKind;
114
+ owner: string;
115
+ createdAt: string;
116
+ lamport: number;
117
+ subscribers: string[];
118
+ }
119
+ interface LedgerEntry {
120
+ kind: "channel_create" | "subscribe" | "broadcast" | "drain";
121
+ at: string;
122
+ channel: string;
123
+ agent: string;
124
+ detail: string;
125
+ prevHmac: string;
126
+ hmac: string;
127
+ }
128
+ export declare function readLedger(cwd: string): LedgerEntry[];
129
+ export declare function verifyLedgerChain(cwd: string): {
130
+ ok: boolean;
131
+ rows: number;
132
+ brokenAt?: number;
133
+ };
134
+ export declare function createChannel(input: CreateChannelInput): {
135
+ ok: boolean;
136
+ channel: ChannelMeta;
137
+ hint: string;
138
+ };
139
+ export declare function listChannels(cwd: string): ChannelMeta[];
140
+ export declare function subscribe(input: SubscribeInput): Promise<SubscribeResult>;
141
+ export declare function broadcast(input: BroadcastInput): Promise<BroadcastResult>;
142
+ export declare function verifyMessage(m: SwarmMessage): boolean;
143
+ export declare function drain(input: DrainInput): DrainResult;
144
+ export declare function peekInbox(cwd: string, agent: string): SwarmMessage[];
145
+ export interface HandoffStep {
146
+ step: number;
147
+ at: string;
148
+ from: string;
149
+ channel: string;
150
+ detail: string;
151
+ hmac: string;
152
+ }
153
+ export interface HandoffNarrative {
154
+ ok: boolean;
155
+ channel: string;
156
+ steps: HandoffStep[];
157
+ chain: string[];
158
+ rendered: string;
159
+ }
160
+ export declare function auditHandoff(cwd: string, channel: string): HandoffNarrative;
161
+ export declare function renderInbox(messages: SwarmMessage[]): string;
162
+ export {};
163
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/swarm_bus/index.ts"],"names":[],"mappings":"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"}