@nebutra/event-log 0.1.0 → 0.1.1

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.
@@ -1,2 +1,2 @@
1
- {"traceId":"thread_1","kind":"tool_call","affected":["hello.md"],"snapshot":{"hello.md":"hi"},"parent":null,"id":"17749e64fe288d4313a962a754acc5ceaedb9ab08dd70b5a89aead28befaee6a","tenantId":"tenant_a","at":"2026-05-17T16:51:16.184Z","summary":"wrote hello","objectHashes":["85052e9aab1b67b6622d94a08441b09fd5b7aca61ee360416d70de5da67d86ca"]}
2
- {"traceId":"t","kind":"tool_call","affected":[],"parent":null,"id":"ec7e3bc1b6cdc8c725d9312b6382457d7de7b6385f1b7181bd8508842776c98a","tenantId":"local","at":"2026-05-17T16:51:16.232Z","summary":"tool_call touched 0 path(s)","objectHashes":[]}
1
+ {"at":"2026-05-19T08:15:11.839Z","traceId":"thread_1","kind":"tool_call","affected":["hello.md"],"snapshot":{"hello.md":"hi"},"parent":null,"id":"d7c55a73981aac389a21b4f15833b4e0b830432312dde0cd075cb323a19076db","tenantId":"tenant_a","summary":"wrote hello","objectHashes":["85052e9aab1b67b6622d94a08441b09fd5b7aca61ee360416d70de5da67d86ca"]}
2
+ {"at":"2026-05-19T08:15:11.873Z","traceId":"t","kind":"tool_call","affected":[],"parent":null,"id":"85df196b09e71d6e27678aa5d6cf5ee4c1267175ee998805770fbbf456f558e6","tenantId":"local","summary":"tool_call touched 0 path(s)","objectHashes":[]}
@@ -1,5 +1,5 @@
1
1
 
2
- > @nebutra/event-log@0.1.0 build /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/event-log
2
+ > @nebutra/event-log@0.1.1 build /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/event-log
3
3
  > tsup
4
4
 
5
5
  CLI Building entry: src/cli.ts, src/index.ts
@@ -11,12 +11,12 @@
11
11
  ESM Build start
12
12
  ESM dist/cli.js 890.00 B
13
13
  ESM dist/index.js 106.00 B
14
- ESM dist/chunk-GZ3DFTWX.js 3.46 KB
14
+ ESM dist/chunk-L5NN4BRT.js 3.50 KB
15
15
  ESM dist/cli.js.map 1.54 KB
16
16
  ESM dist/index.js.map 71.00 B
17
- ESM dist/chunk-GZ3DFTWX.js.map 7.59 KB
17
+ ESM dist/chunk-L5NN4BRT.js.map 7.63 KB
18
18
  ESM ⚡️ Build success in 113ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 10613ms
20
+ DTS ⚡️ Build success in 10582ms
21
21
  DTS dist/cli.d.ts 13.00 B
22
22
  DTS dist/index.d.ts 1.44 KB
@@ -1,14 +1,14 @@
1
1
 
2
- > @nebutra/event-log@0.1.0 test /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/event-log
2
+ > @nebutra/event-log@0.1.1 test /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/event-log
3
3
  > vitest run
4
4
 
5
5
 
6
6
   RUN  v4.1.4 /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/event-log
7
7
 
8
- ✓ src/index.test.ts (2 tests) 128ms
8
+ ✓ src/index.test.ts (2 tests) 78ms
9
9
 
10
10
   Test Files  1 passed (1)
11
11
   Tests  2 passed (2)
12
-  Start at  16:51:14
13
-  Duration  1.47s (transform 482ms, setup 0ms, import 582ms, tests 128ms, environment 0ms)
12
+  Start at  08:15:10
13
+  Duration  967ms (transform 362ms, setup 0ms, import 496ms, tests 78ms, environment 0ms)
14
14
 
@@ -1,4 +1,4 @@
1
1
 
2
- > @nebutra/event-log@0.1.0 typecheck /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/event-log
2
+ > @nebutra/event-log@0.1.1 typecheck /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/event-log
3
3
  > tsc --noEmit
4
4
 
package/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # @nebutra/event-log
2
+
3
+ ## 0.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Publish registry package metadata under the MIT license.
8
+
9
+ - Updated dependencies []:
10
+ - @nebutra/capability-kit@0.2.1
11
+ - @nebutra/content-store@0.1.1
12
+ - @nebutra/errors@0.1.1
@@ -1,6 +1,7 @@
1
1
  // src/index.ts
2
2
  import { mkdir, readFile, writeFile } from "fs/promises";
3
3
  import { dirname, join } from "path";
4
+ import { appendCapabilityDebug } from "@nebutra/capability-kit/debug";
4
5
  import { CapabilityError } from "@nebutra/errors";
5
6
  import { blake3 } from "@noble/hashes/blake3.js";
6
7
  import { bytesToHex } from "@noble/hashes/utils.js";
@@ -67,7 +68,7 @@ var EventLog = class _EventLog {
67
68
  objectHashes
68
69
  };
69
70
  await appendJsonl(this.eventsPath(), record);
70
- await appendJsonl(join(process.cwd(), ".nebutra", "debug", "event-log.jsonl"), record);
71
+ await appendCapabilityDebug("event-log", { ...record });
71
72
  return id;
72
73
  }
73
74
  async timeline() {
@@ -107,4 +108,4 @@ var EventLog = class _EventLog {
107
108
  export {
108
109
  EventLog
109
110
  };
110
- //# sourceMappingURL=chunk-GZ3DFTWX.js.map
111
+ //# sourceMappingURL=chunk-L5NN4BRT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { appendCapabilityDebug } from \"@nebutra/capability-kit/debug\";\nimport { CapabilityError } from \"@nebutra/errors\";\nimport { blake3 } from \"@noble/hashes/blake3.js\";\nimport { bytesToHex } from \"@noble/hashes/utils.js\";\n\nexport type EventKind =\n | \"llm_call\"\n | \"tool_call\"\n | \"sub_agent_call\"\n | \"content_write\"\n | \"sandbox_exec\";\n\nexport interface EventInput {\n readonly traceId: string;\n readonly kind: EventKind;\n readonly affected: readonly string[];\n readonly parent: string | null;\n readonly snapshot?: Record<string, string>;\n}\n\nexport interface EventRecord extends EventInput {\n readonly id: string;\n readonly tenantId: string;\n readonly at: string;\n readonly summary: string;\n readonly objectHashes: readonly string[];\n}\n\nexport interface BranchRecord {\n readonly name: string;\n readonly from: string;\n readonly at: string;\n}\n\nexport interface RollbackPlan {\n readonly dryRun: true;\n readonly target: string;\n readonly affected: readonly string[];\n readonly suggestion: string;\n}\n\nexport interface EventLogOptions {\n readonly tenantId?: string;\n readonly summarize?: (event: EventInput) => Promise<string>;\n}\n\nfunction hashContent(content: string): string {\n return bytesToHex(blake3(new TextEncoder().encode(content)));\n}\n\nasync function appendJsonl(path: string, value: unknown): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(value)}\\n`, { flag: \"a\" });\n}\n\nasync function readJsonl<T>(path: string): Promise<T[]> {\n try {\n const raw = await readFile(path, \"utf8\");\n return raw\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => JSON.parse(line) as T);\n } catch {\n return [];\n }\n}\n\nexport class EventLog {\n readonly #root: string;\n readonly #tenantId: string;\n readonly #summarize: (event: EventInput) => Promise<string>;\n\n private constructor(\n root: string,\n tenantId: string,\n summarize: (event: EventInput) => Promise<string>,\n ) {\n this.#root = root;\n this.#tenantId = tenantId;\n this.#summarize = summarize;\n }\n\n static async open(root: string, options: EventLogOptions = {}): Promise<EventLog> {\n const log = new EventLog(\n root,\n options.tenantId ?? \"local\",\n options.summarize ??\n (async (event) => `${event.kind} touched ${event.affected.length} path(s)`),\n );\n await mkdir(log.objectsRoot(), { recursive: true });\n return log;\n }\n\n objectsRoot(): string {\n return join(this.#root, \"objects\", this.#tenantId);\n }\n\n eventsPath(): string {\n return join(this.#root, \"events\", `${this.#tenantId}.jsonl`);\n }\n\n branchesPath(): string {\n return join(this.#root, \"branches\", `${this.#tenantId}.jsonl`);\n }\n\n async commit(event: EventInput): Promise<string> {\n const objectHashes: string[] = [];\n for (const [path, content] of Object.entries(event.snapshot ?? {})) {\n const hash = hashContent(content);\n objectHashes.push(hash);\n await writeFile(join(this.objectsRoot(), hash), content, \"utf8\");\n await appendJsonl(join(this.objectsRoot(), \"index.jsonl\"), { hash, path });\n }\n const id = hashContent(\n JSON.stringify({ event, objectHashes, tenantId: this.#tenantId, at: Date.now() }),\n );\n const record: EventRecord = {\n ...event,\n id,\n tenantId: this.#tenantId,\n at: new Date().toISOString(),\n summary: await this.#summarize(event),\n objectHashes,\n };\n await appendJsonl(this.eventsPath(), record);\n await appendCapabilityDebug(\"event-log\", { ...record });\n return id;\n }\n\n async timeline(): Promise<readonly EventRecord[]> {\n return readJsonl<EventRecord>(this.eventsPath());\n }\n\n async rollbackTo(id: string): Promise<RollbackPlan> {\n const target = (await this.timeline()).find((event) => event.id === id);\n if (!target) {\n throw new CapabilityError(\"event-log\", \"Rollback target not found\", {\n suggestion: \"Run `pnpm chronos:timeline` and choose an event id from the current tenant.\",\n metadata: { id },\n statusCode: 404,\n });\n }\n return {\n dryRun: true,\n target: id,\n affected: target.affected,\n suggestion: \"Review this plan, then call an explicit apply API in a higher layer.\",\n };\n }\n\n async branchFrom(id: string, name: string): Promise<BranchRecord> {\n const exists = (await this.timeline()).some((event) => event.id === id);\n if (!exists) {\n throw new CapabilityError(\"event-log\", \"Branch source not found\", {\n suggestion: \"Run `pnpm chronos:timeline` and branch from an existing event id.\",\n metadata: { id },\n statusCode: 404,\n });\n }\n const branch = { name, from: id, at: new Date().toISOString() };\n await appendJsonl(this.branchesPath(), branch);\n return branch;\n }\n}\n"],"mappings":";AAAA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,SAAS,YAAY;AAC9B,SAAS,6BAA6B;AACtC,SAAS,uBAAuB;AAChC,SAAS,cAAc;AACvB,SAAS,kBAAkB;AA2C3B,SAAS,YAAY,SAAyB;AAC5C,SAAO,WAAW,OAAO,IAAI,YAAY,EAAE,OAAO,OAAO,CAAC,CAAC;AAC7D;AAEA,eAAe,YAAY,MAAc,OAA+B;AACtE,QAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,UAAU,MAAM,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,GAAM,EAAE,MAAM,IAAI,CAAC;AACnE;AAEA,eAAe,UAAa,MAA4B;AACtD,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,MAAM,MAAM;AACvC,WAAO,IACJ,KAAK,EACL,MAAM,IAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAM;AAAA,EACxC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,IAAM,WAAN,MAAM,UAAS;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EAED,YACN,MACA,UACA,WACA;AACA,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,aAAa,KAAK,MAAc,UAA2B,CAAC,GAAsB;AAChF,UAAM,MAAM,IAAI;AAAA,MACd;AAAA,MACA,QAAQ,YAAY;AAAA,MACpB,QAAQ,cACL,OAAO,UAAU,GAAG,MAAM,IAAI,YAAY,MAAM,SAAS,MAAM;AAAA,IACpE;AACA,UAAM,MAAM,IAAI,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,WAAO;AAAA,EACT;AAAA,EAEA,cAAsB;AACpB,WAAO,KAAK,KAAK,OAAO,WAAW,KAAK,SAAS;AAAA,EACnD;AAAA,EAEA,aAAqB;AACnB,WAAO,KAAK,KAAK,OAAO,UAAU,GAAG,KAAK,SAAS,QAAQ;AAAA,EAC7D;AAAA,EAEA,eAAuB;AACrB,WAAO,KAAK,KAAK,OAAO,YAAY,GAAG,KAAK,SAAS,QAAQ;AAAA,EAC/D;AAAA,EAEA,MAAM,OAAO,OAAoC;AAC/C,UAAM,eAAyB,CAAC;AAChC,eAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,MAAM,YAAY,CAAC,CAAC,GAAG;AAClE,YAAM,OAAO,YAAY,OAAO;AAChC,mBAAa,KAAK,IAAI;AACtB,YAAM,UAAU,KAAK,KAAK,YAAY,GAAG,IAAI,GAAG,SAAS,MAAM;AAC/D,YAAM,YAAY,KAAK,KAAK,YAAY,GAAG,aAAa,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,IAC3E;AACA,UAAM,KAAK;AAAA,MACT,KAAK,UAAU,EAAE,OAAO,cAAc,UAAU,KAAK,WAAW,IAAI,KAAK,IAAI,EAAE,CAAC;AAAA,IAClF;AACA,UAAM,SAAsB;AAAA,MAC1B,GAAG;AAAA,MACH;AAAA,MACA,UAAU,KAAK;AAAA,MACf,KAAI,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC3B,SAAS,MAAM,KAAK,WAAW,KAAK;AAAA,MACpC;AAAA,IACF;AACA,UAAM,YAAY,KAAK,WAAW,GAAG,MAAM;AAC3C,UAAM,sBAAsB,aAAa,EAAE,GAAG,OAAO,CAAC;AACtD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAA4C;AAChD,WAAO,UAAuB,KAAK,WAAW,CAAC;AAAA,EACjD;AAAA,EAEA,MAAM,WAAW,IAAmC;AAClD,UAAM,UAAU,MAAM,KAAK,SAAS,GAAG,KAAK,CAAC,UAAU,MAAM,OAAO,EAAE;AACtE,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,gBAAgB,aAAa,6BAA6B;AAAA,QAClE,YAAY;AAAA,QACZ,UAAU,EAAE,GAAG;AAAA,QACf,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU,OAAO;AAAA,MACjB,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,IAAY,MAAqC;AAChE,UAAM,UAAU,MAAM,KAAK,SAAS,GAAG,KAAK,CAAC,UAAU,MAAM,OAAO,EAAE;AACtE,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,gBAAgB,aAAa,2BAA2B;AAAA,QAChE,YAAY;AAAA,QACZ,UAAU,EAAE,GAAG;AAAA,QACf,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AACA,UAAM,SAAS,EAAE,MAAM,MAAM,IAAI,KAAI,oBAAI,KAAK,GAAE,YAAY,EAAE;AAC9D,UAAM,YAAY,KAAK,aAAa,GAAG,MAAM;AAC7C,WAAO;AAAA,EACT;AACF;","names":[]}
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EventLog
3
- } from "./chunk-GZ3DFTWX.js";
3
+ } from "./chunk-L5NN4BRT.js";
4
4
 
5
5
  // src/cli.ts
6
6
  var command = process.argv[2] ?? "doctor";
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EventLog
3
- } from "./chunk-GZ3DFTWX.js";
3
+ } from "./chunk-L5NN4BRT.js";
4
4
  export {
5
5
  EventLog
6
6
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nebutra/event-log",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Append-only event log with content-addressed snapshots",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -8,6 +8,7 @@
8
8
  "nebutra": {
9
9
  "featureId": "event-log",
10
10
  "category": "ai",
11
+ "surface": "persistence",
11
12
  "summary": "Immutable event log, rollback dry-runs, and branches"
12
13
  },
13
14
  "main": "./src/index.ts",
@@ -17,8 +18,9 @@
17
18
  },
18
19
  "dependencies": {
19
20
  "@noble/hashes": "2.0.1",
20
- "@nebutra/content-store": "0.1.0",
21
- "@nebutra/errors": "0.1.0"
21
+ "@nebutra/capability-kit": "0.2.1",
22
+ "@nebutra/content-store": "0.1.1",
23
+ "@nebutra/errors": "0.1.1"
22
24
  },
23
25
  "devDependencies": {
24
26
  "@types/node": "^22.19.15",
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { mkdir, readFile, writeFile } from "node:fs/promises";
2
2
  import { dirname, join } from "node:path";
3
+ import { appendCapabilityDebug } from "@nebutra/capability-kit/debug";
3
4
  import { CapabilityError } from "@nebutra/errors";
4
5
  import { blake3 } from "@noble/hashes/blake3.js";
5
6
  import { bytesToHex } from "@noble/hashes/utils.js";
@@ -125,7 +126,7 @@ export class EventLog {
125
126
  objectHashes,
126
127
  };
127
128
  await appendJsonl(this.eventsPath(), record);
128
- await appendJsonl(join(process.cwd(), ".nebutra", "debug", "event-log.jsonl"), record);
129
+ await appendCapabilityDebug("event-log", { ...record });
129
130
  return id;
130
131
  }
131
132
 
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { CapabilityError } from \"@nebutra/errors\";\nimport { blake3 } from \"@noble/hashes/blake3.js\";\nimport { bytesToHex } from \"@noble/hashes/utils.js\";\n\nexport type EventKind =\n | \"llm_call\"\n | \"tool_call\"\n | \"sub_agent_call\"\n | \"content_write\"\n | \"sandbox_exec\";\n\nexport interface EventInput {\n readonly traceId: string;\n readonly kind: EventKind;\n readonly affected: readonly string[];\n readonly parent: string | null;\n readonly snapshot?: Record<string, string>;\n}\n\nexport interface EventRecord extends EventInput {\n readonly id: string;\n readonly tenantId: string;\n readonly at: string;\n readonly summary: string;\n readonly objectHashes: readonly string[];\n}\n\nexport interface BranchRecord {\n readonly name: string;\n readonly from: string;\n readonly at: string;\n}\n\nexport interface RollbackPlan {\n readonly dryRun: true;\n readonly target: string;\n readonly affected: readonly string[];\n readonly suggestion: string;\n}\n\nexport interface EventLogOptions {\n readonly tenantId?: string;\n readonly summarize?: (event: EventInput) => Promise<string>;\n}\n\nfunction hashContent(content: string): string {\n return bytesToHex(blake3(new TextEncoder().encode(content)));\n}\n\nasync function appendJsonl(path: string, value: unknown): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, `${JSON.stringify(value)}\\n`, { flag: \"a\" });\n}\n\nasync function readJsonl<T>(path: string): Promise<T[]> {\n try {\n const raw = await readFile(path, \"utf8\");\n return raw\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => JSON.parse(line) as T);\n } catch {\n return [];\n }\n}\n\nexport class EventLog {\n readonly #root: string;\n readonly #tenantId: string;\n readonly #summarize: (event: EventInput) => Promise<string>;\n\n private constructor(\n root: string,\n tenantId: string,\n summarize: (event: EventInput) => Promise<string>,\n ) {\n this.#root = root;\n this.#tenantId = tenantId;\n this.#summarize = summarize;\n }\n\n static async open(root: string, options: EventLogOptions = {}): Promise<EventLog> {\n const log = new EventLog(\n root,\n options.tenantId ?? \"local\",\n options.summarize ??\n (async (event) => `${event.kind} touched ${event.affected.length} path(s)`),\n );\n await mkdir(log.objectsRoot(), { recursive: true });\n return log;\n }\n\n objectsRoot(): string {\n return join(this.#root, \"objects\", this.#tenantId);\n }\n\n eventsPath(): string {\n return join(this.#root, \"events\", `${this.#tenantId}.jsonl`);\n }\n\n branchesPath(): string {\n return join(this.#root, \"branches\", `${this.#tenantId}.jsonl`);\n }\n\n async commit(event: EventInput): Promise<string> {\n const objectHashes: string[] = [];\n for (const [path, content] of Object.entries(event.snapshot ?? {})) {\n const hash = hashContent(content);\n objectHashes.push(hash);\n await writeFile(join(this.objectsRoot(), hash), content, \"utf8\");\n await appendJsonl(join(this.objectsRoot(), \"index.jsonl\"), { hash, path });\n }\n const id = hashContent(\n JSON.stringify({ event, objectHashes, tenantId: this.#tenantId, at: Date.now() }),\n );\n const record: EventRecord = {\n ...event,\n id,\n tenantId: this.#tenantId,\n at: new Date().toISOString(),\n summary: await this.#summarize(event),\n objectHashes,\n };\n await appendJsonl(this.eventsPath(), record);\n await appendJsonl(join(process.cwd(), \".nebutra\", \"debug\", \"event-log.jsonl\"), record);\n return id;\n }\n\n async timeline(): Promise<readonly EventRecord[]> {\n return readJsonl<EventRecord>(this.eventsPath());\n }\n\n async rollbackTo(id: string): Promise<RollbackPlan> {\n const target = (await this.timeline()).find((event) => event.id === id);\n if (!target) {\n throw new CapabilityError(\"event-log\", \"Rollback target not found\", {\n suggestion: \"Run `pnpm chronos:timeline` and choose an event id from the current tenant.\",\n metadata: { id },\n statusCode: 404,\n });\n }\n return {\n dryRun: true,\n target: id,\n affected: target.affected,\n suggestion: \"Review this plan, then call an explicit apply API in a higher layer.\",\n };\n }\n\n async branchFrom(id: string, name: string): Promise<BranchRecord> {\n const exists = (await this.timeline()).some((event) => event.id === id);\n if (!exists) {\n throw new CapabilityError(\"event-log\", \"Branch source not found\", {\n suggestion: \"Run `pnpm chronos:timeline` and branch from an existing event id.\",\n metadata: { id },\n statusCode: 404,\n });\n }\n const branch = { name, from: id, at: new Date().toISOString() };\n await appendJsonl(this.branchesPath(), branch);\n return branch;\n }\n}\n"],"mappings":"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","names":[]}