@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.
- package/.nebutra/debug/event-log.jsonl +2 -2
- package/.turbo/turbo-build.log +4 -4
- package/.turbo/turbo-test.log +4 -4
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +12 -0
- package/dist/{chunk-GZ3DFTWX.js → chunk-L5NN4BRT.js} +3 -2
- package/dist/chunk-L5NN4BRT.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +5 -3
- package/src/index.ts +2 -1
- package/dist/chunk-GZ3DFTWX.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
{"traceId":"thread_1","kind":"tool_call","affected":["hello.md"],"snapshot":{"hello.md":"hi"},"parent":null,"id":"
|
|
2
|
-
{"traceId":"t","kind":"tool_call","affected":[],"parent":null,"id":"
|
|
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":[]}
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @nebutra/event-log@0.1.
|
|
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
|
[34mCLI[39m Building entry: src/cli.ts, src/index.ts
|
|
@@ -11,12 +11,12 @@
|
|
|
11
11
|
[34mESM[39m Build start
|
|
12
12
|
[32mESM[39m [1mdist/cli.js [22m[32m890.00 B[39m
|
|
13
13
|
[32mESM[39m [1mdist/index.js [22m[32m106.00 B[39m
|
|
14
|
-
[32mESM[39m [1mdist/chunk-
|
|
14
|
+
[32mESM[39m [1mdist/chunk-L5NN4BRT.js [22m[32m3.50 KB[39m
|
|
15
15
|
[32mESM[39m [1mdist/cli.js.map [22m[32m1.54 KB[39m
|
|
16
16
|
[32mESM[39m [1mdist/index.js.map [22m[32m71.00 B[39m
|
|
17
|
-
[32mESM[39m [1mdist/chunk-
|
|
17
|
+
[32mESM[39m [1mdist/chunk-L5NN4BRT.js.map [22m[32m7.63 KB[39m
|
|
18
18
|
[32mESM[39m ⚡️ Build success in 113ms
|
|
19
19
|
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 10582ms
|
|
21
21
|
[32mDTS[39m [1mdist/cli.d.ts [22m[32m13.00 B[39m
|
|
22
22
|
[32mDTS[39m [1mdist/index.d.ts [22m[32m1.44 KB[39m
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
|
|
2
|
-
> @nebutra/event-log@0.1.
|
|
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
|
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.4 [39m[90m/home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/event-log[39m
|
|
7
7
|
|
|
8
|
-
[32m✓[39m src/index.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m
|
|
8
|
+
[32m✓[39m src/index.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 78[2mms[22m[39m
|
|
9
9
|
|
|
10
10
|
[2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m
|
|
11
11
|
[2m Tests [22m [1m[32m2 passed[39m[22m[90m (2)[39m
|
|
12
|
-
[2m Start at [22m
|
|
13
|
-
[2m Duration [22m
|
|
12
|
+
[2m Start at [22m 08:15:10
|
|
13
|
+
[2m Duration [22m 967ms[2m (transform 362ms, setup 0ms, import 496ms, tests 78ms, environment 0ms)[22m
|
|
14
14
|
|
package/CHANGELOG.md
ADDED
|
@@ -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
|
|
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-
|
|
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":"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","names":[]}
|
package/dist/cli.js
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nebutra/event-log",
|
|
3
|
-
"version": "0.1.
|
|
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/
|
|
21
|
-
"@nebutra/
|
|
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
|
|
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":[]}
|