@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.
@@ -1,4 +1,4 @@
1
- {"at":"2026-05-18T16:46:04.951Z","type":"reindex","tenantId":"tenant_a","files":0}
2
- {"at":"2026-05-18T16:46:05.064Z","type":"reindex","tenantId":"tenant_a","files":0}
3
- {"at":"2026-05-18T16:46:05.204Z","type":"write","tenantId":"tenant_a","path":"time-machine/annotations/f5b1e58398070402897c931546485520546b2ca6944fd749169ce4cc8421dbb4.json"}
4
- {"at":"2026-05-18T16:46:05.335Z","type":"reindex","tenantId":"tenant_a","files":0}
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":"b7d0a3a97ea25d785b85e06256eaa4ab46ac4e7f18f7ea59eb3109c1b66c352d","tenantId":"tenant_a","at":"2026-05-18T16:46:04.969Z","summary":"content_write touched 1 path(s)","objectHashes":["b343d4492837788b413910202f644e658701e9ea4f6c7bdfd4f9844212975d05"]}
2
- {"traceId":"film","kind":"content_write","affected":["company/film_60s.mp4","company/BRAND.md"],"parent":"b7d0a3a97ea25d785b85e06256eaa4ab46ac4e7f18f7ea59eb3109c1b66c352d","snapshot":{"company/BRAND.md":"name: Loop\npalette: purple\n"},"id":"ba21b79dbfa8d290d2a3e7154bbddd785fe3a76fb7f70e6bce4aa2ca3a50dd1c","tenantId":"tenant_a","at":"2026-05-18T16:46:04.981Z","summary":"content_write touched 2 path(s)","objectHashes":["b3ce7a30eada9179db405b8b19dadb8eedfd6501c6d262d4436898b539974059"]}
3
- {"traceId":"brand","kind":"content_write","affected":["company/BRAND.md"],"parent":null,"snapshot":{"company/BRAND.md":"name: Loop\npalette: blue\n"},"id":"f5b1e58398070402897c931546485520546b2ca6944fd749169ce4cc8421dbb4","tenantId":"tenant_a","at":"2026-05-18T16:46:05.068Z","summary":"content_write touched 1 path(s)","objectHashes":["b343d4492837788b413910202f644e658701e9ea4f6c7bdfd4f9844212975d05"]}
4
- {"traceId":"film","kind":"content_write","affected":["company/film_60s.mp4","company/BRAND.md"],"parent":"f5b1e58398070402897c931546485520546b2ca6944fd749169ce4cc8421dbb4","snapshot":{"company/BRAND.md":"name: Loop\npalette: purple\n"},"id":"3482a6ba414291b7282537ece2b25ba74524b5e17c8a1f72617e465999057fbe","tenantId":"tenant_a","at":"2026-05-18T16:46:05.117Z","summary":"content_write touched 2 path(s)","objectHashes":["b3ce7a30eada9179db405b8b19dadb8eedfd6501c6d262d4436898b539974059"]}
5
- {"traceId":"time_machine_annotation_f5b1e58398070402897c931546485520546b2ca6_mpbfrbfc","kind":"content_write","affected":["time-machine/annotations/f5b1e58398070402897c931546485520546b2ca6944fd749169ce4cc8421dbb4.json"],"parent":"f5b1e58398070402897c931546485520546b2ca6944fd749169ce4cc8421dbb4","snapshot":{"time-machine/annotations/f5b1e58398070402897c931546485520546b2ca6944fd749169ce4cc8421dbb4.json":"{\n \"eventId\": \"f5b1e58398070402897c931546485520546b2ca6944fd749169ce4cc8421dbb4\",\n \"starred\": true,\n \"label\": \"first brand\",\n \"createdAt\": \"2026-05-18T16:46:05.180Z\",\n \"truthSource\": \"event-log\"\n}\n"},"id":"a91b23725fd63d9fcd2fbf05cd61b16cfaef391cfdbc9a4b83c4b7ebc070d945","tenantId":"tenant_a","at":"2026-05-18T16:46:05.214Z","summary":"content_write touched 1 path(s)","objectHashes":["be5b38d760c6e4dccb3773bb5d40db85c5d499dbb9b7e3fc67c2ed065d0f9918"]}
6
- {"traceId":"brand","kind":"content_write","affected":["company/BRAND.md"],"parent":null,"snapshot":{"company/BRAND.md":"name: Loop\npalette: blue\n"},"id":"741e8c5ff4f58188617567f1df76442b303ea91a9371086f2e2ec57014c2bdb7","tenantId":"tenant_a","at":"2026-05-18T16:46:05.340Z","summary":"content_write touched 1 path(s)","objectHashes":["b343d4492837788b413910202f644e658701e9ea4f6c7bdfd4f9844212975d05"]}
7
- {"traceId":"film","kind":"content_write","affected":["company/film_60s.mp4","company/BRAND.md"],"parent":"741e8c5ff4f58188617567f1df76442b303ea91a9371086f2e2ec57014c2bdb7","snapshot":{"company/BRAND.md":"name: Loop\npalette: purple\n"},"id":"a1df5d30f0539721a779c9a33ab3df4e7265c5ef0402bd761ecf8887c9424594","tenantId":"tenant_a","at":"2026-05-18T16:46:05.344Z","summary":"content_write touched 2 path(s)","objectHashes":["b3ce7a30eada9179db405b8b19dadb8eedfd6501c6d262d4436898b539974059"]}
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"]}
@@ -1,5 +1,5 @@
1
1
 
2
- > @nebutra/time-machine@0.1.1 build /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/time-machine
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
  CLI Building entry: src/cli.ts, src/index.ts
@@ -11,12 +11,12 @@
11
11
  ESM Build start
12
12
  ESM dist/cli.js 1.00 KB
13
13
  ESM dist/index.js 160.00 B
14
- ESM dist/chunk-AQ6XF75L.js 6.00 KB
14
+ ESM dist/chunk-YM7DY2TO.js 6.04 KB
15
15
  ESM dist/cli.js.map 1.81 KB
16
16
  ESM dist/index.js.map 71.00 B
17
- ESM dist/chunk-AQ6XF75L.js.map 13.02 KB
18
- ESM ⚡️ Build success in 77ms
17
+ ESM dist/chunk-YM7DY2TO.js.map 13.04 KB
18
+ ESM ⚡️ Build success in 93ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 10762ms
20
+ DTS ⚡️ Build success in 12240ms
21
21
  DTS dist/cli.d.ts 13.00 B
22
22
  DTS dist/index.d.ts 2.72 KB
@@ -1,16 +1,15 @@
1
1
 
2
- > @nebutra/time-machine@0.1.1 test /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/time-machine
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
   RUN  v4.1.4 /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/time-machine
7
7
 
8
- (node:11083) ExperimentalWarning: SQLite is an experimental feature and might change at any time
9
- (Use `node --trace-warnings ...` to show where the warning was created)
10
- ✓ src/index.test.ts (3 tests) 551ms
8
+ ✓ src/index.test.ts (3 tests) 673ms
9
+ ✓ projects event-log records into a founder timeline without owning truth  370ms
11
10
 
12
11
   Test Files  1 passed (1)
13
12
   Tests  3 passed (3)
14
-  Start at  16:46:02
15
-  Duration  2.44s (transform 715ms, setup 0ms, import 819ms, tests 551ms, environment 0ms)
13
+  Start at  08:15:15
14
+  Duration  2.86s (transform 1.01s, setup 0ms, import 1.20s, tests 673ms, environment 0ms)
16
15
 
@@ -1,4 +1,4 @@
1
1
 
2
- > @nebutra/time-machine@0.1.1 typecheck /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/time-machine
2
+ > @nebutra/time-machine@0.1.2 typecheck /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/time-machine
3
3
  > tsc --noEmit
4
4
 
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 = requireTenant(options.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-AQ6XF75L.js.map
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
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  TimeMachine,
3
3
  readTimeMachineDebug
4
- } from "./chunk-AQ6XF75L.js";
4
+ } from "./chunk-YM7DY2TO.js";
5
5
 
6
6
  // src/cli.ts
7
7
  var command = process.argv[2] ?? "doctor";
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  TimeMachine,
3
3
  readTimeMachineDebug
4
- } from "./chunk-AQ6XF75L.js";
4
+ } from "./chunk-YM7DY2TO.js";
5
5
  export {
6
6
  TimeMachine,
7
7
  readTimeMachineDebug
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nebutra/time-machine",
3
- "version": "0.1.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.0",
33
- "@nebutra/content-store": "0.1.0",
34
- "@nebutra/errors": "0.1.0",
35
- "@nebutra/event-log": "0.1.0",
36
- "@nebutra/generation-context": "0.1.0"
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 = requireTenant(options.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":";AAAA,SAAS,aAAa;AACtB,SAAS,YAAY;AACrB,SAAS,uBAAuB,2BAA2B;AAC3D,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,gBAAqD;AAC9D,SAAS,eAAe;AA+DxB,SAAS,cAAc,OAAmC;AACxD,MAAI,CAAC,OAAO,KAAK,GAAG;AAClB,UAAM,IAAI,gBAAgB,gBAAgB,wCAAwC;AAAA,MAChF,YAAY;AAAA,MACZ,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,SAAS,OAAsC;AACtD,MAAI,MAAM,QAAQ,SAAS,QAAQ,EAAG,QAAO;AAC7C,MAAI,MAAM,QAAQ,SAAS,UAAU,EAAG,QAAO;AAC/C,MAAI,MAAM,QAAQ,SAAS,MAAM,EAAG,QAAO;AAC3C,SAAO;AACT;AAEA,SAAS,OAAO,OAAkC;AAChD,SAAO;AAAA,IACL,IAAI,QAAQ,MAAM,EAAE;AAAA,IACpB,SAAS,MAAM;AAAA,IACf,MAAM,SAAS,KAAK;AAAA,IACpB,WAAW,MAAM;AAAA,IACjB,gBAAgB,MAAM;AAAA,IACtB,UAAU;AAAA,IACV,GAAI,MAAM,SAAS,EAAE,YAAY,QAAQ,MAAM,MAAM,GAAG,IAAI,CAAC;AAAA,IAC7D,gBAAgB,MAAM;AAAA,IACtB,SAAS,EAAE,MAAM,iBAAiB,MAAM,MAAM,QAAQ;AAAA,EACxD;AACF;AAEA,SAAS,OAAO,QAAqC;AACnD,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAC7E;AAEO,IAAM,cAAN,MAAM,aAAY;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAED,YACN,SAEA;AACA,SAAK,YAAY,cAAc,QAAQ,QAAQ;AAC/C,SAAK,aAAa,QAAQ,aAAa,QAAQ,IAAI;AACnD,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,YAAY,QAAQ;AAAA,EAC3B;AAAA,EAEA,aAAa,KACX,OAAO,yBACP,UAA0E,CAAC,GACrD;AACtB,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACrC,UAAM,eAAe,MAAM,aAAa,KAAK,KAAK,MAAM,SAAS,GAAG,EAAE,SAAS,CAAC;AAChF,UAAM,WAAW,MAAM,SAAS,KAAK,KAAK,MAAM,WAAW,GAAG,EAAE,SAAS,CAAC;AAC1E,WAAO,IAAI,aAAY,EAAE,GAAG,SAAS,UAAU,cAAc,SAAS,CAAC;AAAA,EACzE;AAAA,EAEA,aAAa,WACX,SAEsB;AACtB,QAAI,QAAQ,KAAM,OAAM,MAAM,QAAQ,MAAM,EAAE,WAAW,KAAK,CAAC;AAC/D,WAAO,IAAI,aAAY;AAAA,MACrB,UAAU,QAAQ;AAAA,MAClB,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ;AAAA,MAClB,IAAK,QAAQ,aAAa,QAAQ,UAAU,SACxC,EAAE,WAAW,QAAQ,aAAa,QAAQ,KAAK,IAC/C,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAsC;AAC1C,UAAM,SAAS,MAAM,KAAK,UAAU,SAAS;AAC7C,UAAM,QAAQ,OAAO,IAAI,MAAM;AAC/B,UAAM,KAAK,OAAO,EAAE,MAAM,iBAAiB,UAAU,KAAK,WAAW,OAAO,MAAM,OAAO,CAAC;AAC1F,WAAO,EAAE,UAAU,KAAK,WAAW,aAAa,aAAa,MAAM;AAAA,EACrE;AAAA,EAEA,MAAM,WAAW,SAAiB,MAAuC;AACvE,UAAM,SAAS,MAAM,KAAK,UAAU,WAAW,SAAS,IAAI;AAC5D,UAAM,SAAS;AAAA,MACb,UAAU,QAAQ,UAAU,GAAG,OAAO,IAAI,IAAI,EAAE;AAAA,MAChD,MAAM,OAAO;AAAA,MACb,aAAa,OAAO;AAAA,MACpB,WAAW,OAAO;AAAA,IACpB;AACA,UAAM,KAAK,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK,WAAW,SAAS,KAAK,CAAC;AAC7E,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,SAAiB,QAAQ,WAAwC;AAC1E,UAAM,KAAK,cAAc,OAAO;AAChC,UAAM,aAAa;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,aAAa;AAAA,IACf;AACA,UAAM,OAAO,4BAA4B,OAAO;AAChD,UAAM,KAAK,cAAc,MAAM,MAAM,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,CAAI;AAC/E,UAAM,KAAK,UAAU,OAAO;AAAA,MAC1B,SAAS,QAAQ,2BAA2B,OAAO;AAAA,MACnD,MAAM;AAAA,MACN,UAAU,CAAC,IAAI;AAAA,MACf,QAAQ;AAAA,MACR,UAAU,EAAE,CAAC,IAAI,GAAG,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,EAAK;AAAA,IACjE,CAAC;AACD,UAAM,KAAK,OAAO,EAAE,MAAM,QAAQ,UAAU,KAAK,WAAW,SAAS,MAAM,CAAC;AAC5E,WAAO,EAAE,SAAS,SAAS,MAAM,OAAO,KAAK;AAAA,EAC/C;AAAA,EAEA,MAAM,QAAQ,aAAqB,cAAmD;AACpF,UAAM,OAAO,MAAM,KAAK,cAAc,WAAW;AACjD,UAAM,QAAQ,MAAM,KAAK,cAAc,YAAY;AACnD,UAAM,gBAAgB,OAAO,CAAC,GAAG,KAAK,UAAU,GAAG,MAAM,QAAQ,CAAC;AAClE,UAAM,YAAY,YAAY,WAAW,OAAO,YAAY,KAAK,cAAc;AAAA,MAC7E;AAAA,IACF,CAAC;AACD,UAAM,KAAK,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO,EAAE,aAAa,cAAc,eAAe,UAAU;AAAA,EAC/D;AAAA,EAEA,MAAM,eAAe,SAAwC;AAC3D,UAAM,OAAO,MAAM,KAAK,UAAU,WAAW,OAAO;AACpD,UAAM,KAAK,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,UAAU,KAAK;AAAA,MACf;AAAA,MACA,UAAU,KAAK;AAAA,IACjB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAA2C;AAC/C,UAAM,SAAS,MAAM,KAAK,UAAU,SAAS;AAC7C,UAAM,SAAkC;AAAA,MACtC,YAAY;AAAA,MACZ,IAAI;AAAA,MACJ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,aAAa;AAAA,MACb,UAAU,CAAC,YAAY,UAAU,WAAW,oBAAoB,YAAY;AAAA,MAC5E,GAAI,OAAO,WAAW,IAClB,EAAE,YAAY,yEAAyE,IACvF,CAAC;AAAA,IACP;AACA,UAAM,KAAK,OAAO,EAAE,MAAM,UAAU,UAAU,KAAK,WAAW,QAAQ,OAAO,OAAO,CAAC;AACrF,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,cAAc,MAAM;AAAA,EACjC;AAAA,EAEA,MAAM,cAAc,SAAuC;AACzD,UAAM,SAAS,MAAM,KAAK,UAAU,SAAS,GAAG,KAAK,CAAC,WAAW,OAAO,OAAO,OAAO;AACtF,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,gBAAgB,gBAAgB,4BAA4B;AAAA,QACpE,YAAY;AAAA,QACZ,UAAU,EAAE,QAAQ;AAAA,QACpB,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,OAA+C;AAC1D,UAAM,sBAAsB,gBAAgB,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC;AAAA,EAC9E;AACF;AAEA,eAAsB,qBAAqB,OAAO,QAAQ,IAAI,GAAG,QAAQ,IAAwB;AAC/F,SAAO,oBAAoB,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAC5D;","names":[]}