@nebutra/time-machine 0.1.1 → 0.1.2
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/content-store.jsonl +4 -4
- package/.nebutra/debug/event-log.jsonl +7 -7
- package/.turbo/turbo-build.log +5 -5
- package/.turbo/turbo-test.log +5 -6
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +13 -0
- package/dist/{chunk-AQ6XF75L.js → chunk-YM7DY2TO.js} +9 -11
- package/dist/chunk-YM7DY2TO.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +6 -6
- package/src/index.ts +10 -11
- package/dist/chunk-AQ6XF75L.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{"at":"2026-05-
|
|
2
|
-
{"at":"2026-05-
|
|
3
|
-
{"at":"2026-05-
|
|
4
|
-
{"at":"2026-05-
|
|
1
|
+
{"at":"2026-05-19T08:15:17.503Z","type":"reindex","tenantId":"tenant_a","files":0}
|
|
2
|
+
{"at":"2026-05-19T08:15:17.713Z","type":"reindex","tenantId":"tenant_a","files":0}
|
|
3
|
+
{"at":"2026-05-19T08:15:17.779Z","type":"write","tenantId":"tenant_a","path":"time-machine/annotations/eac7a8780b66720f63652f747d6903076527005ffcabe73c8e8e0f732b1a428b.json"}
|
|
4
|
+
{"at":"2026-05-19T08:15:17.927Z","type":"reindex","tenantId":"tenant_a","files":0}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
{"traceId":"brand","kind":"content_write","affected":["company/BRAND.md"],"parent":null,"snapshot":{"company/BRAND.md":"name: Loop\npalette: blue\n"},"id":"
|
|
2
|
-
{"traceId":"film","kind":"content_write","affected":["company/film_60s.mp4","company/BRAND.md"],"parent":"
|
|
3
|
-
{"traceId":"brand","kind":"content_write","affected":["company/BRAND.md"],"parent":null,"snapshot":{"company/BRAND.md":"name: Loop\npalette: blue\n"},"id":"
|
|
4
|
-
{"traceId":"film","kind":"content_write","affected":["company/film_60s.mp4","company/BRAND.md"],"parent":"
|
|
5
|
-
{"traceId":"
|
|
6
|
-
{"traceId":"brand","kind":"content_write","affected":["company/BRAND.md"],"parent":null,"snapshot":{"company/BRAND.md":"name: Loop\npalette: blue\n"},"id":"
|
|
7
|
-
{"traceId":"film","kind":"content_write","affected":["company/film_60s.mp4","company/BRAND.md"],"parent":"
|
|
1
|
+
{"at":"2026-05-19T08:15:17.541Z","traceId":"brand","kind":"content_write","affected":["company/BRAND.md"],"parent":null,"snapshot":{"company/BRAND.md":"name: Loop\npalette: blue\n"},"id":"b008501e5023a12fffe28ab87e6c89dc657ed724c3227b333cad40d7941a03ee","tenantId":"tenant_a","summary":"content_write touched 1 path(s)","objectHashes":["b343d4492837788b413910202f644e658701e9ea4f6c7bdfd4f9844212975d05"]}
|
|
2
|
+
{"at":"2026-05-19T08:15:17.613Z","traceId":"film","kind":"content_write","affected":["company/film_60s.mp4","company/BRAND.md"],"parent":"b008501e5023a12fffe28ab87e6c89dc657ed724c3227b333cad40d7941a03ee","snapshot":{"company/BRAND.md":"name: Loop\npalette: purple\n"},"id":"f2328652fbfc4b86f0a9323978f0764cfa211eac62c67eded1b62f0796e57de8","tenantId":"tenant_a","summary":"content_write touched 2 path(s)","objectHashes":["b3ce7a30eada9179db405b8b19dadb8eedfd6501c6d262d4436898b539974059"]}
|
|
3
|
+
{"at":"2026-05-19T08:15:17.732Z","traceId":"brand","kind":"content_write","affected":["company/BRAND.md"],"parent":null,"snapshot":{"company/BRAND.md":"name: Loop\npalette: blue\n"},"id":"eac7a8780b66720f63652f747d6903076527005ffcabe73c8e8e0f732b1a428b","tenantId":"tenant_a","summary":"content_write touched 1 path(s)","objectHashes":["b343d4492837788b413910202f644e658701e9ea4f6c7bdfd4f9844212975d05"]}
|
|
4
|
+
{"at":"2026-05-19T08:15:17.736Z","traceId":"film","kind":"content_write","affected":["company/film_60s.mp4","company/BRAND.md"],"parent":"eac7a8780b66720f63652f747d6903076527005ffcabe73c8e8e0f732b1a428b","snapshot":{"company/BRAND.md":"name: Loop\npalette: purple\n"},"id":"158971d0065fc0b6246fa71448892f3f9f7c65173046dafedf83706c9ab74a84","tenantId":"tenant_a","summary":"content_write touched 2 path(s)","objectHashes":["b3ce7a30eada9179db405b8b19dadb8eedfd6501c6d262d4436898b539974059"]}
|
|
5
|
+
{"at":"2026-05-19T08:15:17.795Z","traceId":"time_machine_annotation_eac7a8780b66720f63652f747d6903076527005f_mpccyadw","kind":"content_write","affected":["time-machine/annotations/eac7a8780b66720f63652f747d6903076527005ffcabe73c8e8e0f732b1a428b.json"],"parent":"eac7a8780b66720f63652f747d6903076527005ffcabe73c8e8e0f732b1a428b","snapshot":{"time-machine/annotations/eac7a8780b66720f63652f747d6903076527005ffcabe73c8e8e0f732b1a428b.json":"{\n \"eventId\": \"eac7a8780b66720f63652f747d6903076527005ffcabe73c8e8e0f732b1a428b\",\n \"starred\": true,\n \"label\": \"first brand\",\n \"createdAt\": \"2026-05-19T08:15:17.755Z\",\n \"truthSource\": \"event-log\"\n}\n"},"id":"2f397d2758063a62d4f4da67c05cc19a17ea01d1af7b66311045977462e045e7","tenantId":"tenant_a","summary":"content_write touched 1 path(s)","objectHashes":["7669acab8bc2e0965086975d55505abbc9ab7a46df80a77adaf119991d57b595"]}
|
|
6
|
+
{"at":"2026-05-19T08:15:17.941Z","traceId":"brand","kind":"content_write","affected":["company/BRAND.md"],"parent":null,"snapshot":{"company/BRAND.md":"name: Loop\npalette: blue\n"},"id":"4a281af5bb77e67f64761803e1cd8f2e5848df81a33c175626f48bb5dde43a09","tenantId":"tenant_a","summary":"content_write touched 1 path(s)","objectHashes":["b343d4492837788b413910202f644e658701e9ea4f6c7bdfd4f9844212975d05"]}
|
|
7
|
+
{"at":"2026-05-19T08:15:17.955Z","traceId":"film","kind":"content_write","affected":["company/film_60s.mp4","company/BRAND.md"],"parent":"4a281af5bb77e67f64761803e1cd8f2e5848df81a33c175626f48bb5dde43a09","snapshot":{"company/BRAND.md":"name: Loop\npalette: purple\n"},"id":"367e9e254deda4853254d4d435e591f42c0b5775389b65a5596523926ad050fa","tenantId":"tenant_a","summary":"content_write touched 2 path(s)","objectHashes":["b3ce7a30eada9179db405b8b19dadb8eedfd6501c6d262d4436898b539974059"]}
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @nebutra/time-machine@0.1.
|
|
2
|
+
> @nebutra/time-machine@0.1.2 build /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/time-machine
|
|
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[32m1.00 KB[39m
|
|
13
13
|
[32mESM[39m [1mdist/index.js [22m[32m160.00 B[39m
|
|
14
|
-
[32mESM[39m [1mdist/chunk-
|
|
14
|
+
[32mESM[39m [1mdist/chunk-YM7DY2TO.js [22m[32m6.04 KB[39m
|
|
15
15
|
[32mESM[39m [1mdist/cli.js.map [22m[32m1.81 KB[39m
|
|
16
16
|
[32mESM[39m [1mdist/index.js.map [22m[32m71.00 B[39m
|
|
17
|
-
[32mESM[39m [1mdist/chunk-
|
|
18
|
-
[32mESM[39m ⚡️ Build success in
|
|
17
|
+
[32mESM[39m [1mdist/chunk-YM7DY2TO.js.map [22m[32m13.04 KB[39m
|
|
18
|
+
[32mESM[39m ⚡️ Build success in 93ms
|
|
19
19
|
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 12240ms
|
|
21
21
|
[32mDTS[39m [1mdist/cli.d.ts [22m[32m13.00 B[39m
|
|
22
22
|
[32mDTS[39m [1mdist/index.d.ts [22m[32m2.72 KB[39m
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
|
|
2
|
-
> @nebutra/time-machine@0.1.
|
|
2
|
+
> @nebutra/time-machine@0.1.2 test /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/time-machine
|
|
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/time-machine[39m
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
[32m✓[39m src/index.test.ts [2m([22m[2m3 tests[22m[2m)[22m[33m 551[2mms[22m[39m
|
|
8
|
+
[32m✓[39m src/index.test.ts [2m([22m[2m3 tests[22m[2m)[22m[33m 673[2mms[22m[39m
|
|
9
|
+
[33m[2m✓[22m[39m projects event-log records into a founder timeline without owning truth [33m 370[2mms[22m[39m
|
|
11
10
|
|
|
12
11
|
[2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m
|
|
13
12
|
[2m Tests [22m [1m[32m3 passed[39m[22m[90m (3)[39m
|
|
14
|
-
[2m Start at [22m
|
|
15
|
-
[2m Duration [22m 2.
|
|
13
|
+
[2m Start at [22m 08:15:15
|
|
14
|
+
[2m Duration [22m 2.86s[2m (transform 1.01s, setup 0ms, import 1.20s, tests 673ms, environment 0ms)[22m
|
|
16
15
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @nebutra/time-machine
|
|
2
2
|
|
|
3
|
+
## 0.1.2
|
|
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
|
|
13
|
+
- @nebutra/event-log@0.1.1
|
|
14
|
+
- @nebutra/generation-context@0.1.1
|
|
15
|
+
|
|
3
16
|
## 0.1.1
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import { mkdir } from "fs/promises";
|
|
3
3
|
import { join } from "path";
|
|
4
|
+
import { requireCapabilityTenant } from "@nebutra/capability-kit";
|
|
4
5
|
import { appendCapabilityDebug, readCapabilityDebug } from "@nebutra/capability-kit/debug";
|
|
5
6
|
import { ContentStore } from "@nebutra/content-store";
|
|
6
7
|
import { CapabilityError } from "@nebutra/errors";
|
|
7
8
|
import { EventLog } from "@nebutra/event-log";
|
|
8
9
|
import { assetId } from "@nebutra/generation-context";
|
|
9
|
-
function requireTenant(value) {
|
|
10
|
-
if (!value?.trim()) {
|
|
11
|
-
throw new CapabilityError("time-machine", "Time Machine requires tenant context", {
|
|
12
|
-
suggestion: "Pass tenantId when opening TimeMachine so timeline reads stay tenant-scoped.",
|
|
13
|
-
statusCode: 400
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
return value;
|
|
17
|
-
}
|
|
18
10
|
function nodeKind(event) {
|
|
19
11
|
if (event.traceId.includes("branch")) return "branch";
|
|
20
12
|
if (event.traceId.includes("decision")) return "decision";
|
|
@@ -43,7 +35,13 @@ var TimeMachine = class _TimeMachine {
|
|
|
43
35
|
#contentStore;
|
|
44
36
|
#eventLog;
|
|
45
37
|
constructor(options) {
|
|
46
|
-
this.#tenantId =
|
|
38
|
+
this.#tenantId = requireCapabilityTenant({
|
|
39
|
+
explicit: options.tenantId,
|
|
40
|
+
onMissing: () => new CapabilityError("time-machine", "Time Machine requires tenant context", {
|
|
41
|
+
suggestion: "Pass tenantId when opening TimeMachine so timeline reads stay tenant-scoped.",
|
|
42
|
+
statusCode: 400
|
|
43
|
+
})
|
|
44
|
+
});
|
|
47
45
|
this.#debugRoot = options.debugRoot ?? process.cwd();
|
|
48
46
|
this.#contentStore = options.contentStore;
|
|
49
47
|
this.#eventLog = options.eventLog;
|
|
@@ -169,4 +167,4 @@ export {
|
|
|
169
167
|
TimeMachine,
|
|
170
168
|
readTimeMachineDebug
|
|
171
169
|
};
|
|
172
|
-
//# sourceMappingURL=chunk-
|
|
170
|
+
//# sourceMappingURL=chunk-YM7DY2TO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { requireCapabilityTenant } from \"@nebutra/capability-kit\";\nimport { appendCapabilityDebug, readCapabilityDebug } from \"@nebutra/capability-kit/debug\";\nimport { ContentStore } from \"@nebutra/content-store\";\nimport { CapabilityError } from \"@nebutra/errors\";\nimport { EventLog, type EventRecord, type RollbackPlan } from \"@nebutra/event-log\";\nimport { assetId } from \"@nebutra/generation-context\";\n\nexport type TimelineNodeKind = \"milestone\" | \"decision\" | \"branch\" | \"play_completed\";\n\nexport interface TimelineNode {\n readonly id: string;\n readonly eventId: string;\n readonly kind: TimelineNodeKind;\n readonly timestamp: string;\n readonly oneLineSummary: string;\n readonly branchId: string;\n readonly parentNode?: string;\n readonly affectedAssets: readonly string[];\n readonly preview: {\n readonly kind: \"event-summary\";\n readonly text: string;\n };\n}\n\nexport interface TimelineView {\n readonly tenantId: string;\n readonly truthSource: \"event-log\";\n readonly nodes: readonly TimelineNode[];\n}\n\nexport interface TimelineBranch {\n readonly branchId: string;\n readonly name: string;\n readonly fromEventId: string;\n readonly createdAt: string;\n}\n\nexport interface TimelineAnnotation {\n readonly eventId: string;\n readonly starred: true;\n readonly label: string;\n readonly path: string;\n}\n\nexport interface TimelineComparison {\n readonly leftEventId: string;\n readonly rightEventId: string;\n readonly changedAssets: readonly string[];\n readonly narrative: string;\n}\n\nexport interface TimeMachineDoctorReport {\n readonly capability: \"time-machine\";\n readonly ok: boolean;\n readonly checkedAt: string;\n readonly truthSource: \"event-log\";\n readonly features: readonly string[];\n readonly suggestion?: string;\n}\n\nexport interface TimeMachineOptions {\n readonly tenantId?: string;\n readonly root?: string;\n readonly debugRoot?: string;\n readonly contentStore?: ContentStore;\n readonly eventLog?: EventLog;\n}\n\nfunction nodeKind(event: EventRecord): TimelineNodeKind {\n if (event.traceId.includes(\"branch\")) return \"branch\";\n if (event.traceId.includes(\"decision\")) return \"decision\";\n if (event.traceId.includes(\"play\")) return \"play_completed\";\n return \"milestone\";\n}\n\nfunction toNode(event: EventRecord): TimelineNode {\n return {\n id: `node_${event.id}`,\n eventId: event.id,\n kind: nodeKind(event),\n timestamp: event.at,\n oneLineSummary: event.summary,\n branchId: \"main\",\n ...(event.parent ? { parentNode: `node_${event.parent}` } : {}),\n affectedAssets: event.affected,\n preview: { kind: \"event-summary\", text: event.summary },\n };\n}\n\nfunction unique(values: readonly string[]): string[] {\n return [...new Set(values)].sort((left, right) => left.localeCompare(right));\n}\n\nexport class TimeMachine {\n readonly #tenantId: string;\n readonly #debugRoot: string;\n readonly #contentStore: ContentStore;\n readonly #eventLog: EventLog;\n\n private constructor(\n options: Required<Pick<TimeMachineOptions, \"tenantId\" | \"contentStore\" | \"eventLog\">> &\n Pick<TimeMachineOptions, \"debugRoot\">,\n ) {\n this.#tenantId = requireCapabilityTenant({\n explicit: options.tenantId,\n onMissing: () =>\n new CapabilityError(\"time-machine\", \"Time Machine requires tenant context\", {\n suggestion:\n \"Pass tenantId when opening TimeMachine so timeline reads stay tenant-scoped.\",\n statusCode: 400,\n }),\n });\n this.#debugRoot = options.debugRoot ?? process.cwd();\n this.#contentStore = options.contentStore;\n this.#eventLog = options.eventLog;\n }\n\n static async open(\n root = \".nebutra/time-machine\",\n options: Omit<TimeMachineOptions, \"root\" | \"contentStore\" | \"eventLog\"> = {},\n ): Promise<TimeMachine> {\n const tenantId = options.tenantId ?? \"local\";\n await mkdir(root, { recursive: true });\n const contentStore = await ContentStore.open(join(root, \"content\"), { tenantId });\n const eventLog = await EventLog.open(join(root, \"event-log\"), { tenantId });\n return new TimeMachine({ ...options, tenantId, contentStore, eventLog });\n }\n\n static async fromStores(\n options: Required<Pick<TimeMachineOptions, \"tenantId\" | \"contentStore\" | \"eventLog\">> &\n Pick<TimeMachineOptions, \"root\" | \"debugRoot\">,\n ): Promise<TimeMachine> {\n if (options.root) await mkdir(options.root, { recursive: true });\n return new TimeMachine({\n tenantId: options.tenantId,\n contentStore: options.contentStore,\n eventLog: options.eventLog,\n ...((options.debugRoot ?? options.root) !== undefined\n ? { debugRoot: options.debugRoot ?? options.root }\n : {}),\n });\n }\n\n async timelineView(): Promise<TimelineView> {\n const events = await this.#eventLog.timeline();\n const nodes = events.map(toNode);\n await this.#debug({ type: \"timeline_view\", tenantId: this.#tenantId, nodes: nodes.length });\n return { tenantId: this.#tenantId, truthSource: \"event-log\", nodes };\n }\n\n async branchFrom(eventId: string, name: string): Promise<TimelineBranch> {\n const branch = await this.#eventLog.branchFrom(eventId, name);\n const result = {\n branchId: assetId(\"branch\", `${eventId}_${name}`),\n name: branch.name,\n fromEventId: branch.from,\n createdAt: branch.at,\n };\n await this.#debug({ type: \"branch\", tenantId: this.#tenantId, eventId, name });\n return result;\n }\n\n async star(eventId: string, label = \"starred\"): Promise<TimelineAnnotation> {\n await this.#requireEvent(eventId);\n const annotation = {\n eventId,\n starred: true,\n label,\n createdAt: new Date().toISOString(),\n truthSource: \"event-log\",\n };\n const path = `time-machine/annotations/${eventId}.json`;\n await this.#contentStore.write(path, `${JSON.stringify(annotation, null, 2)}\\n`);\n await this.#eventLog.commit({\n traceId: assetId(\"time_machine_annotation\", eventId),\n kind: \"content_write\",\n affected: [path],\n parent: eventId,\n snapshot: { [path]: `${JSON.stringify(annotation, null, 2)}\\n` },\n });\n await this.#debug({ type: \"star\", tenantId: this.#tenantId, eventId, label });\n return { eventId, starred: true, label, path };\n }\n\n async compare(leftEventId: string, rightEventId: string): Promise<TimelineComparison> {\n const left = await this.#requireEvent(leftEventId);\n const right = await this.#requireEvent(rightEventId);\n const changedAssets = unique([...left.affected, ...right.affected]);\n const narrative = `Compared ${leftEventId} to ${rightEventId}: ${changedAssets.join(\n \", \",\n )} changed.`;\n await this.#debug({\n type: \"compare\",\n tenantId: this.#tenantId,\n leftEventId,\n rightEventId,\n changedAssets,\n });\n return { leftEventId, rightEventId, changedAssets, narrative };\n }\n\n async rollbackDryRun(eventId: string): Promise<RollbackPlan> {\n const plan = await this.#eventLog.rollbackTo(eventId);\n await this.#debug({\n type: \"rollback_dry_run\",\n tenantId: this.#tenantId,\n eventId,\n affected: plan.affected,\n });\n return plan;\n }\n\n async doctor(): Promise<TimeMachineDoctorReport> {\n const events = await this.#eventLog.timeline();\n const report: TimeMachineDoctorReport = {\n capability: \"time-machine\",\n ok: true,\n checkedAt: new Date().toISOString(),\n truthSource: \"event-log\",\n features: [\"timeline\", \"branch\", \"compare\", \"rollback-dry-run\", \"annotation\"],\n ...(events.length === 0\n ? { suggestion: \"Commit at least one event to Chronos before opening the star-map view.\" }\n : {}),\n };\n await this.#debug({ type: \"doctor\", tenantId: this.#tenantId, events: events.length });\n return report;\n }\n\n async close(): Promise<void> {\n await this.#contentStore.close();\n }\n\n async #requireEvent(eventId: string): Promise<EventRecord> {\n const event = (await this.#eventLog.timeline()).find((record) => record.id === eventId);\n if (!event) {\n throw new CapabilityError(\"time-machine\", \"Timeline event not found\", {\n suggestion: \"Call timelineView and choose an event id from the current tenant.\",\n metadata: { eventId },\n statusCode: 404,\n });\n }\n return event;\n }\n\n async #debug(entry: Record<string, unknown>): Promise<void> {\n await appendCapabilityDebug(\"time-machine\", entry, { root: this.#debugRoot });\n }\n}\n\nexport async function readTimeMachineDebug(root = process.cwd(), limit = 20): Promise<unknown[]> {\n return readCapabilityDebug(\"time-machine\", { root, limit });\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/time-machine",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Chronos product surface for timeline browsing, branching, comparison, and rollback previews",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "MIT",
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
".": "./src/index.ts"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@nebutra/capability-kit": "0.2.
|
|
33
|
-
"@nebutra/content-store": "0.1.
|
|
34
|
-
"@nebutra/errors": "0.1.
|
|
35
|
-
"@nebutra/event-log": "0.1.
|
|
36
|
-
"@nebutra/generation-context": "0.1.
|
|
32
|
+
"@nebutra/capability-kit": "0.2.1",
|
|
33
|
+
"@nebutra/content-store": "0.1.1",
|
|
34
|
+
"@nebutra/errors": "0.1.1",
|
|
35
|
+
"@nebutra/event-log": "0.1.1",
|
|
36
|
+
"@nebutra/generation-context": "0.1.1"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/node": "^22.19.15",
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { mkdir } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
+
import { requireCapabilityTenant } from "@nebutra/capability-kit";
|
|
3
4
|
import { appendCapabilityDebug, readCapabilityDebug } from "@nebutra/capability-kit/debug";
|
|
4
5
|
import { ContentStore } from "@nebutra/content-store";
|
|
5
6
|
import { CapabilityError } from "@nebutra/errors";
|
|
@@ -67,16 +68,6 @@ export interface TimeMachineOptions {
|
|
|
67
68
|
readonly eventLog?: EventLog;
|
|
68
69
|
}
|
|
69
70
|
|
|
70
|
-
function requireTenant(value: string | undefined): string {
|
|
71
|
-
if (!value?.trim()) {
|
|
72
|
-
throw new CapabilityError("time-machine", "Time Machine requires tenant context", {
|
|
73
|
-
suggestion: "Pass tenantId when opening TimeMachine so timeline reads stay tenant-scoped.",
|
|
74
|
-
statusCode: 400,
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
return value;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
71
|
function nodeKind(event: EventRecord): TimelineNodeKind {
|
|
81
72
|
if (event.traceId.includes("branch")) return "branch";
|
|
82
73
|
if (event.traceId.includes("decision")) return "decision";
|
|
@@ -112,7 +103,15 @@ export class TimeMachine {
|
|
|
112
103
|
options: Required<Pick<TimeMachineOptions, "tenantId" | "contentStore" | "eventLog">> &
|
|
113
104
|
Pick<TimeMachineOptions, "debugRoot">,
|
|
114
105
|
) {
|
|
115
|
-
this.#tenantId =
|
|
106
|
+
this.#tenantId = requireCapabilityTenant({
|
|
107
|
+
explicit: options.tenantId,
|
|
108
|
+
onMissing: () =>
|
|
109
|
+
new CapabilityError("time-machine", "Time Machine requires tenant context", {
|
|
110
|
+
suggestion:
|
|
111
|
+
"Pass tenantId when opening TimeMachine so timeline reads stay tenant-scoped.",
|
|
112
|
+
statusCode: 400,
|
|
113
|
+
}),
|
|
114
|
+
});
|
|
116
115
|
this.#debugRoot = options.debugRoot ?? process.cwd();
|
|
117
116
|
this.#contentStore = options.contentStore;
|
|
118
117
|
this.#eventLog = options.eventLog;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { appendCapabilityDebug, readCapabilityDebug } from \"@nebutra/capability-kit/debug\";\nimport { ContentStore } from \"@nebutra/content-store\";\nimport { CapabilityError } from \"@nebutra/errors\";\nimport { EventLog, type EventRecord, type RollbackPlan } from \"@nebutra/event-log\";\nimport { assetId } from \"@nebutra/generation-context\";\n\nexport type TimelineNodeKind = \"milestone\" | \"decision\" | \"branch\" | \"play_completed\";\n\nexport interface TimelineNode {\n readonly id: string;\n readonly eventId: string;\n readonly kind: TimelineNodeKind;\n readonly timestamp: string;\n readonly oneLineSummary: string;\n readonly branchId: string;\n readonly parentNode?: string;\n readonly affectedAssets: readonly string[];\n readonly preview: {\n readonly kind: \"event-summary\";\n readonly text: string;\n };\n}\n\nexport interface TimelineView {\n readonly tenantId: string;\n readonly truthSource: \"event-log\";\n readonly nodes: readonly TimelineNode[];\n}\n\nexport interface TimelineBranch {\n readonly branchId: string;\n readonly name: string;\n readonly fromEventId: string;\n readonly createdAt: string;\n}\n\nexport interface TimelineAnnotation {\n readonly eventId: string;\n readonly starred: true;\n readonly label: string;\n readonly path: string;\n}\n\nexport interface TimelineComparison {\n readonly leftEventId: string;\n readonly rightEventId: string;\n readonly changedAssets: readonly string[];\n readonly narrative: string;\n}\n\nexport interface TimeMachineDoctorReport {\n readonly capability: \"time-machine\";\n readonly ok: boolean;\n readonly checkedAt: string;\n readonly truthSource: \"event-log\";\n readonly features: readonly string[];\n readonly suggestion?: string;\n}\n\nexport interface TimeMachineOptions {\n readonly tenantId?: string;\n readonly root?: string;\n readonly debugRoot?: string;\n readonly contentStore?: ContentStore;\n readonly eventLog?: EventLog;\n}\n\nfunction requireTenant(value: string | undefined): string {\n if (!value?.trim()) {\n throw new CapabilityError(\"time-machine\", \"Time Machine requires tenant context\", {\n suggestion: \"Pass tenantId when opening TimeMachine so timeline reads stay tenant-scoped.\",\n statusCode: 400,\n });\n }\n return value;\n}\n\nfunction nodeKind(event: EventRecord): TimelineNodeKind {\n if (event.traceId.includes(\"branch\")) return \"branch\";\n if (event.traceId.includes(\"decision\")) return \"decision\";\n if (event.traceId.includes(\"play\")) return \"play_completed\";\n return \"milestone\";\n}\n\nfunction toNode(event: EventRecord): TimelineNode {\n return {\n id: `node_${event.id}`,\n eventId: event.id,\n kind: nodeKind(event),\n timestamp: event.at,\n oneLineSummary: event.summary,\n branchId: \"main\",\n ...(event.parent ? { parentNode: `node_${event.parent}` } : {}),\n affectedAssets: event.affected,\n preview: { kind: \"event-summary\", text: event.summary },\n };\n}\n\nfunction unique(values: readonly string[]): string[] {\n return [...new Set(values)].sort((left, right) => left.localeCompare(right));\n}\n\nexport class TimeMachine {\n readonly #tenantId: string;\n readonly #debugRoot: string;\n readonly #contentStore: ContentStore;\n readonly #eventLog: EventLog;\n\n private constructor(\n options: Required<Pick<TimeMachineOptions, \"tenantId\" | \"contentStore\" | \"eventLog\">> &\n Pick<TimeMachineOptions, \"debugRoot\">,\n ) {\n this.#tenantId = requireTenant(options.tenantId);\n this.#debugRoot = options.debugRoot ?? process.cwd();\n this.#contentStore = options.contentStore;\n this.#eventLog = options.eventLog;\n }\n\n static async open(\n root = \".nebutra/time-machine\",\n options: Omit<TimeMachineOptions, \"root\" | \"contentStore\" | \"eventLog\"> = {},\n ): Promise<TimeMachine> {\n const tenantId = options.tenantId ?? \"local\";\n await mkdir(root, { recursive: true });\n const contentStore = await ContentStore.open(join(root, \"content\"), { tenantId });\n const eventLog = await EventLog.open(join(root, \"event-log\"), { tenantId });\n return new TimeMachine({ ...options, tenantId, contentStore, eventLog });\n }\n\n static async fromStores(\n options: Required<Pick<TimeMachineOptions, \"tenantId\" | \"contentStore\" | \"eventLog\">> &\n Pick<TimeMachineOptions, \"root\" | \"debugRoot\">,\n ): Promise<TimeMachine> {\n if (options.root) await mkdir(options.root, { recursive: true });\n return new TimeMachine({\n tenantId: options.tenantId,\n contentStore: options.contentStore,\n eventLog: options.eventLog,\n ...((options.debugRoot ?? options.root) !== undefined\n ? { debugRoot: options.debugRoot ?? options.root }\n : {}),\n });\n }\n\n async timelineView(): Promise<TimelineView> {\n const events = await this.#eventLog.timeline();\n const nodes = events.map(toNode);\n await this.#debug({ type: \"timeline_view\", tenantId: this.#tenantId, nodes: nodes.length });\n return { tenantId: this.#tenantId, truthSource: \"event-log\", nodes };\n }\n\n async branchFrom(eventId: string, name: string): Promise<TimelineBranch> {\n const branch = await this.#eventLog.branchFrom(eventId, name);\n const result = {\n branchId: assetId(\"branch\", `${eventId}_${name}`),\n name: branch.name,\n fromEventId: branch.from,\n createdAt: branch.at,\n };\n await this.#debug({ type: \"branch\", tenantId: this.#tenantId, eventId, name });\n return result;\n }\n\n async star(eventId: string, label = \"starred\"): Promise<TimelineAnnotation> {\n await this.#requireEvent(eventId);\n const annotation = {\n eventId,\n starred: true,\n label,\n createdAt: new Date().toISOString(),\n truthSource: \"event-log\",\n };\n const path = `time-machine/annotations/${eventId}.json`;\n await this.#contentStore.write(path, `${JSON.stringify(annotation, null, 2)}\\n`);\n await this.#eventLog.commit({\n traceId: assetId(\"time_machine_annotation\", eventId),\n kind: \"content_write\",\n affected: [path],\n parent: eventId,\n snapshot: { [path]: `${JSON.stringify(annotation, null, 2)}\\n` },\n });\n await this.#debug({ type: \"star\", tenantId: this.#tenantId, eventId, label });\n return { eventId, starred: true, label, path };\n }\n\n async compare(leftEventId: string, rightEventId: string): Promise<TimelineComparison> {\n const left = await this.#requireEvent(leftEventId);\n const right = await this.#requireEvent(rightEventId);\n const changedAssets = unique([...left.affected, ...right.affected]);\n const narrative = `Compared ${leftEventId} to ${rightEventId}: ${changedAssets.join(\n \", \",\n )} changed.`;\n await this.#debug({\n type: \"compare\",\n tenantId: this.#tenantId,\n leftEventId,\n rightEventId,\n changedAssets,\n });\n return { leftEventId, rightEventId, changedAssets, narrative };\n }\n\n async rollbackDryRun(eventId: string): Promise<RollbackPlan> {\n const plan = await this.#eventLog.rollbackTo(eventId);\n await this.#debug({\n type: \"rollback_dry_run\",\n tenantId: this.#tenantId,\n eventId,\n affected: plan.affected,\n });\n return plan;\n }\n\n async doctor(): Promise<TimeMachineDoctorReport> {\n const events = await this.#eventLog.timeline();\n const report: TimeMachineDoctorReport = {\n capability: \"time-machine\",\n ok: true,\n checkedAt: new Date().toISOString(),\n truthSource: \"event-log\",\n features: [\"timeline\", \"branch\", \"compare\", \"rollback-dry-run\", \"annotation\"],\n ...(events.length === 0\n ? { suggestion: \"Commit at least one event to Chronos before opening the star-map view.\" }\n : {}),\n };\n await this.#debug({ type: \"doctor\", tenantId: this.#tenantId, events: events.length });\n return report;\n }\n\n async close(): Promise<void> {\n await this.#contentStore.close();\n }\n\n async #requireEvent(eventId: string): Promise<EventRecord> {\n const event = (await this.#eventLog.timeline()).find((record) => record.id === eventId);\n if (!event) {\n throw new CapabilityError(\"time-machine\", \"Timeline event not found\", {\n suggestion: \"Call timelineView and choose an event id from the current tenant.\",\n metadata: { eventId },\n statusCode: 404,\n });\n }\n return event;\n }\n\n async #debug(entry: Record<string, unknown>): Promise<void> {\n await appendCapabilityDebug(\"time-machine\", entry, { root: this.#debugRoot });\n }\n}\n\nexport async function readTimeMachineDebug(root = process.cwd(), limit = 20): Promise<unknown[]> {\n return readCapabilityDebug(\"time-machine\", { root, limit });\n}\n"],"mappings":"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","names":[]}
|