@superblocksteam/vite-plugin-file-sync 2.0.167-next.0 → 2.0.168-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/dist/ai-service/agent/middleware.d.ts.map +1 -1
  2. package/dist/ai-service/agent/middleware.js +23 -0
  3. package/dist/ai-service/agent/middleware.js.map +1 -1
  4. package/dist/ai-service/agent/tool-message-utils.d.ts +1 -1
  5. package/dist/ai-service/agent/tool-message-utils.d.ts.map +1 -1
  6. package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
  7. package/dist/ai-service/agent/tool-permission-delivery.d.ts +5 -4
  8. package/dist/ai-service/agent/tool-permission-delivery.d.ts.map +1 -1
  9. package/dist/ai-service/agent/tool-permission-delivery.js +22 -28
  10. package/dist/ai-service/agent/tool-permission-delivery.js.map +1 -1
  11. package/dist/ai-service/agent/tool-permission-outcome-metrics.d.ts +9 -0
  12. package/dist/ai-service/agent/tool-permission-outcome-metrics.d.ts.map +1 -0
  13. package/dist/ai-service/agent/tool-permission-outcome-metrics.js +23 -0
  14. package/dist/ai-service/agent/tool-permission-outcome-metrics.js.map +1 -0
  15. package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts +44 -0
  16. package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
  17. package/dist/ai-service/agent/tools/build-capture-screenshot.js +198 -18
  18. package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
  19. package/dist/ai-service/agent/tools/build-manage-checklist.d.ts +2 -0
  20. package/dist/ai-service/agent/tools/build-manage-checklist.d.ts.map +1 -1
  21. package/dist/ai-service/agent/tools/build-manage-checklist.js.map +1 -1
  22. package/dist/ai-service/agent/tools/build-reload-file.d.ts.map +1 -1
  23. package/dist/ai-service/agent/tools/build-reload-file.js +32 -19
  24. package/dist/ai-service/agent/tools/build-reload-file.js.map +1 -1
  25. package/dist/ai-service/agent/tools/get-security-findings.d.ts +45 -0
  26. package/dist/ai-service/agent/tools/get-security-findings.d.ts.map +1 -0
  27. package/dist/ai-service/agent/tools/get-security-findings.js +74 -0
  28. package/dist/ai-service/agent/tools/get-security-findings.js.map +1 -0
  29. package/dist/ai-service/agent/tools/integrations/integration-setup.d.ts +2 -2
  30. package/dist/ai-service/agent/tools/integrations/integration-setup.d.ts.map +1 -1
  31. package/dist/ai-service/agent/tools/integrations/integration-setup.js +24 -2
  32. package/dist/ai-service/agent/tools/integrations/integration-setup.js.map +1 -1
  33. package/dist/ai-service/agent/tools/report-security-findings.d.ts +20 -20
  34. package/dist/ai-service/agent/tools.d.ts.map +1 -1
  35. package/dist/ai-service/agent/tools.js +13 -2
  36. package/dist/ai-service/agent/tools.js.map +1 -1
  37. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
  38. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +14 -0
  39. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
  40. package/dist/ai-service/agent/tools2/tools/git.d.ts +2 -1
  41. package/dist/ai-service/agent/tools2/tools/git.d.ts.map +1 -1
  42. package/dist/ai-service/agent/tools2/tools/git.js +1 -1
  43. package/dist/ai-service/agent/tools2/tools/git.js.map +1 -1
  44. package/dist/ai-service/agent/utils.d.ts.map +1 -1
  45. package/dist/ai-service/agent/utils.js +5 -0
  46. package/dist/ai-service/agent/utils.js.map +1 -1
  47. package/dist/ai-service/app-interface/app-package-manager.d.ts +43 -0
  48. package/dist/ai-service/app-interface/app-package-manager.d.ts.map +1 -0
  49. package/dist/ai-service/app-interface/app-package-manager.js +82 -0
  50. package/dist/ai-service/app-interface/app-package-manager.js.map +1 -0
  51. package/dist/ai-service/app-interface/constants.d.ts +2 -2
  52. package/dist/ai-service/app-interface/constants.d.ts.map +1 -1
  53. package/dist/ai-service/app-interface/constants.js +5 -0
  54. package/dist/ai-service/app-interface/constants.js.map +1 -1
  55. package/dist/ai-service/app-interface/file-system-interface.d.ts.map +1 -1
  56. package/dist/ai-service/app-interface/file-system-interface.js +0 -3
  57. package/dist/ai-service/app-interface/file-system-interface.js.map +1 -1
  58. package/dist/ai-service/app-interface/npm-error-parser.d.ts +1 -1
  59. package/dist/ai-service/app-interface/npm-error-parser.d.ts.map +1 -1
  60. package/dist/ai-service/app-interface/npm-error-parser.js +42 -8
  61. package/dist/ai-service/app-interface/npm-error-parser.js.map +1 -1
  62. package/dist/ai-service/app-interface/npm-registry.d.ts +30 -0
  63. package/dist/ai-service/app-interface/npm-registry.d.ts.map +1 -1
  64. package/dist/ai-service/app-interface/npm-registry.js +108 -1
  65. package/dist/ai-service/app-interface/npm-registry.js.map +1 -1
  66. package/dist/ai-service/app-interface/pnpm-lockfile.d.ts +28 -0
  67. package/dist/ai-service/app-interface/pnpm-lockfile.d.ts.map +1 -0
  68. package/dist/ai-service/app-interface/pnpm-lockfile.js +89 -0
  69. package/dist/ai-service/app-interface/pnpm-lockfile.js.map +1 -0
  70. package/dist/ai-service/app-interface/shell.d.ts +43 -7
  71. package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
  72. package/dist/ai-service/app-interface/shell.js +252 -119
  73. package/dist/ai-service/app-interface/shell.js.map +1 -1
  74. package/dist/ai-service/app-interface/vulnerability-gate.d.ts +5 -0
  75. package/dist/ai-service/app-interface/vulnerability-gate.d.ts.map +1 -1
  76. package/dist/ai-service/app-interface/vulnerability-gate.js +3 -0
  77. package/dist/ai-service/app-interface/vulnerability-gate.js.map +1 -1
  78. package/dist/ai-service/app-skills/helpers.d.ts.map +1 -1
  79. package/dist/ai-service/app-skills/helpers.js +9 -9
  80. package/dist/ai-service/app-skills/helpers.js.map +1 -1
  81. package/dist/ai-service/chat/chat-session-store.d.ts +4 -1
  82. package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
  83. package/dist/ai-service/chat/chat-session-store.js +4 -0
  84. package/dist/ai-service/chat/chat-session-store.js.map +1 -1
  85. package/dist/ai-service/checklist/persisted-checklist-store.d.ts +66 -1
  86. package/dist/ai-service/checklist/persisted-checklist-store.d.ts.map +1 -1
  87. package/dist/ai-service/checklist/persisted-checklist-store.js +274 -4
  88. package/dist/ai-service/checklist/persisted-checklist-store.js.map +1 -1
  89. package/dist/ai-service/checklist/policy-remediation.d.ts +8 -0
  90. package/dist/ai-service/checklist/policy-remediation.d.ts.map +1 -0
  91. package/dist/ai-service/checklist/policy-remediation.js +46 -0
  92. package/dist/ai-service/checklist/policy-remediation.js.map +1 -0
  93. package/dist/ai-service/checklist/remediation-findings-client.d.ts +31 -0
  94. package/dist/ai-service/checklist/remediation-findings-client.d.ts.map +1 -0
  95. package/dist/ai-service/checklist/remediation-findings-client.js +117 -0
  96. package/dist/ai-service/checklist/remediation-findings-client.js.map +1 -0
  97. package/dist/ai-service/context-download.d.ts.map +1 -1
  98. package/dist/ai-service/context-download.js +76 -37
  99. package/dist/ai-service/context-download.js.map +1 -1
  100. package/dist/ai-service/dev-database-file-sync.d.ts +2 -1
  101. package/dist/ai-service/dev-database-file-sync.d.ts.map +1 -1
  102. package/dist/ai-service/dev-database-file-sync.js.map +1 -1
  103. package/dist/ai-service/index.d.ts +59 -9
  104. package/dist/ai-service/index.d.ts.map +1 -1
  105. package/dist/ai-service/index.js +1191 -479
  106. package/dist/ai-service/index.js.map +1 -1
  107. package/dist/ai-service/integrations/store.d.ts.map +1 -1
  108. package/dist/ai-service/integrations/store.js +11 -2
  109. package/dist/ai-service/integrations/store.js.map +1 -1
  110. package/dist/ai-service/llm/context-v2/adapter.d.ts +3 -0
  111. package/dist/ai-service/llm/context-v2/adapter.d.ts.map +1 -1
  112. package/dist/ai-service/llm/context-v2/adapter.js +6 -0
  113. package/dist/ai-service/llm/context-v2/adapter.js.map +1 -1
  114. package/dist/ai-service/llm/context-v2/context.d.ts +22 -1
  115. package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
  116. package/dist/ai-service/llm/context-v2/context.js +185 -30
  117. package/dist/ai-service/llm/context-v2/context.js.map +1 -1
  118. package/dist/ai-service/llm/context-v2/conversation-context.d.ts +7 -0
  119. package/dist/ai-service/llm/context-v2/conversation-context.d.ts.map +1 -1
  120. package/dist/ai-service/llm/context-v2/manager.d.ts +11 -10
  121. package/dist/ai-service/llm/context-v2/manager.d.ts.map +1 -1
  122. package/dist/ai-service/llm/context-v2/manager.js +128 -85
  123. package/dist/ai-service/llm/context-v2/manager.js.map +1 -1
  124. package/dist/ai-service/llm/context-v2/storage/event-store.d.ts +73 -1
  125. package/dist/ai-service/llm/context-v2/storage/event-store.d.ts.map +1 -1
  126. package/dist/ai-service/llm/context-v2/storage/event-types.d.ts +152 -24
  127. package/dist/ai-service/llm/context-v2/storage/event-types.d.ts.map +1 -1
  128. package/dist/ai-service/llm/context-v2/storage/event-types.js +141 -0
  129. package/dist/ai-service/llm/context-v2/storage/event-types.js.map +1 -1
  130. package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.d.ts +20 -2
  131. package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.d.ts.map +1 -1
  132. package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.js +111 -49
  133. package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.js.map +1 -1
  134. package/dist/ai-service/llm/context-v2/storage/migration.d.ts.map +1 -1
  135. package/dist/ai-service/llm/context-v2/storage/migration.js +31 -4
  136. package/dist/ai-service/llm/context-v2/storage/migration.js.map +1 -1
  137. package/dist/ai-service/llm/context-v2/token-tracker.d.ts +34 -0
  138. package/dist/ai-service/llm/context-v2/token-tracker.d.ts.map +1 -1
  139. package/dist/ai-service/llm/context-v2/token-tracker.js +164 -0
  140. package/dist/ai-service/llm/context-v2/token-tracker.js.map +1 -1
  141. package/dist/ai-service/llm/context-v2/types.d.ts +5 -2
  142. package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
  143. package/dist/ai-service/llm/context-v2/types.js +1 -1
  144. package/dist/ai-service/llm/context-v2/types.js.map +1 -1
  145. package/dist/ai-service/llm/stream/config.d.ts +7 -0
  146. package/dist/ai-service/llm/stream/config.d.ts.map +1 -1
  147. package/dist/ai-service/llm/stream/config.js +20 -2
  148. package/dist/ai-service/llm/stream/config.js.map +1 -1
  149. package/dist/ai-service/llm/stream/orchestrator.d.ts.map +1 -1
  150. package/dist/ai-service/llm/stream/orchestrator.js +30 -14
  151. package/dist/ai-service/llm/stream/orchestrator.js.map +1 -1
  152. package/dist/ai-service/llm/stream/session.d.ts +1 -1
  153. package/dist/ai-service/llm/stream/session.d.ts.map +1 -1
  154. package/dist/ai-service/llm/stream/session.js +1 -1
  155. package/dist/ai-service/llm/stream/session.js.map +1 -1
  156. package/dist/ai-service/security/secret-scanner-service.d.ts.map +1 -1
  157. package/dist/ai-service/security/secret-scanner-service.js +12 -2
  158. package/dist/ai-service/security/secret-scanner-service.js.map +1 -1
  159. package/dist/ai-service/security/secret-scanner.d.ts +1 -1
  160. package/dist/ai-service/security/secret-scanner.d.ts.map +1 -1
  161. package/dist/ai-service/security/secret-scanner.js +4 -1
  162. package/dist/ai-service/security/secret-scanner.js.map +1 -1
  163. package/dist/ai-service/security/vulnerability-triage.d.ts +2 -2
  164. package/dist/ai-service/state-machine/clark-fsm.d.ts +17 -1
  165. package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
  166. package/dist/ai-service/state-machine/clark-fsm.js +85 -8
  167. package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
  168. package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
  169. package/dist/ai-service/state-machine/handlers/agent-planning.js +97 -47
  170. package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
  171. package/dist/ai-service/state-machine/handlers/awaiting-user.d.ts.map +1 -1
  172. package/dist/ai-service/state-machine/handlers/awaiting-user.js +68 -50
  173. package/dist/ai-service/state-machine/handlers/awaiting-user.js.map +1 -1
  174. package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
  175. package/dist/ai-service/state-machine/handlers/llm-generating.js +91 -73
  176. package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
  177. package/dist/ai-service/state-machine/helpers/prompt-failure.d.ts +1 -1
  178. package/dist/ai-service/state-machine/helpers/prompt-failure.d.ts.map +1 -1
  179. package/dist/ai-service/state-machine/helpers/prompt-failure.js +1 -0
  180. package/dist/ai-service/state-machine/helpers/prompt-failure.js.map +1 -1
  181. package/dist/ai-service/state-machine/helpers/prompt-request-metrics.d.ts +2 -1
  182. package/dist/ai-service/state-machine/helpers/prompt-request-metrics.d.ts.map +1 -1
  183. package/dist/ai-service/state-machine/helpers/prompt-request-metrics.js +1 -0
  184. package/dist/ai-service/state-machine/helpers/prompt-request-metrics.js.map +1 -1
  185. package/dist/ai-service/state-machine/helpers/user-response-message.d.ts +4 -0
  186. package/dist/ai-service/state-machine/helpers/user-response-message.d.ts.map +1 -0
  187. package/dist/ai-service/state-machine/helpers/user-response-message.js +37 -0
  188. package/dist/ai-service/state-machine/helpers/user-response-message.js.map +1 -0
  189. package/dist/ai-service/template-renderer.d.ts.map +1 -1
  190. package/dist/ai-service/template-renderer.js +22 -9
  191. package/dist/ai-service/template-renderer.js.map +1 -1
  192. package/dist/ai-service/types.d.ts +2 -1
  193. package/dist/ai-service/types.d.ts.map +1 -1
  194. package/dist/ai-service/types.js.map +1 -1
  195. package/dist/components-manager.d.ts +9 -2
  196. package/dist/components-manager.d.ts.map +1 -1
  197. package/dist/components-manager.js +0 -4
  198. package/dist/components-manager.js.map +1 -1
  199. package/dist/file-sync-vite-plugin.d.ts.map +1 -1
  200. package/dist/file-sync-vite-plugin.js +2 -1
  201. package/dist/file-sync-vite-plugin.js.map +1 -1
  202. package/dist/file-system-helpers.d.ts +7 -0
  203. package/dist/file-system-helpers.d.ts.map +1 -1
  204. package/dist/file-system-helpers.js +9 -1
  205. package/dist/file-system-helpers.js.map +1 -1
  206. package/dist/file-system-manager.d.ts +12 -1
  207. package/dist/file-system-manager.d.ts.map +1 -1
  208. package/dist/file-system-manager.js +37 -22
  209. package/dist/file-system-manager.js.map +1 -1
  210. package/dist/index.d.ts +7 -0
  211. package/dist/index.d.ts.map +1 -1
  212. package/dist/index.js +7 -0
  213. package/dist/index.js.map +1 -1
  214. package/dist/lock-service/index.d.ts +20 -0
  215. package/dist/lock-service/index.d.ts.map +1 -1
  216. package/dist/lock-service/index.js +53 -5
  217. package/dist/lock-service/index.js.map +1 -1
  218. package/dist/migration/get-fullstack-template-dir.js +2 -2
  219. package/dist/migration/get-fullstack-template-dir.js.map +1 -1
  220. package/dist/migration/migration-routes.d.ts.map +1 -1
  221. package/dist/migration/migration-routes.js +8 -2
  222. package/dist/migration/migration-routes.js.map +1 -1
  223. package/dist/plugin-options.d.ts +1 -0
  224. package/dist/plugin-options.d.ts.map +1 -1
  225. package/dist/plugin-options.js.map +1 -1
  226. package/dist/router-parser.d.ts.map +1 -1
  227. package/dist/router-parser.js +336 -65
  228. package/dist/router-parser.js.map +1 -1
  229. package/dist/socket-manager.d.ts +25 -2
  230. package/dist/socket-manager.d.ts.map +1 -1
  231. package/dist/socket-manager.js +270 -55
  232. package/dist/socket-manager.js.map +1 -1
  233. package/dist/split-edit-after-clark.d.ts +14 -0
  234. package/dist/split-edit-after-clark.d.ts.map +1 -0
  235. package/dist/split-edit-after-clark.js +40 -0
  236. package/dist/split-edit-after-clark.js.map +1 -0
  237. package/dist/sync-service/index.d.ts +2 -1
  238. package/dist/sync-service/index.d.ts.map +1 -1
  239. package/dist/sync-service/index.js +5 -0
  240. package/dist/sync-service/index.js.map +1 -1
  241. package/dist/sync-service/list-dir.d.ts.map +1 -1
  242. package/dist/sync-service/list-dir.js +9 -4
  243. package/dist/sync-service/list-dir.js.map +1 -1
  244. package/dist/util/log-sanitizer.d.ts.map +1 -1
  245. package/dist/util/log-sanitizer.js +4 -0
  246. package/dist/util/log-sanitizer.js.map +1 -1
  247. package/dist/vite-module-reload.d.ts +34 -0
  248. package/dist/vite-module-reload.d.ts.map +1 -0
  249. package/dist/vite-module-reload.js +121 -0
  250. package/dist/vite-module-reload.js.map +1 -0
  251. package/package.json +9 -8
@@ -6,7 +6,9 @@
6
6
  * or compaction received). The event log replaces full-context JSON
7
7
  * blob storage with an incremental, corruption-tolerant format.
8
8
  */
9
- import type { SuperblocksMetadata } from "../types.js";
9
+ import { z } from "zod";
10
+ import type { ContextUsageSnapshot } from "@superblocksteam/library-shared/types";
11
+ import type { AttachmentsRecord, SuperblocksMetadata } from "../types.js";
10
12
  /**
11
13
  * Discriminator for event log entries.
12
14
  *
@@ -16,7 +18,8 @@ import type { SuperblocksMetadata } from "../types.js";
16
18
  * server-side compaction summary or the anchor marker written before a
17
19
  * client-side phase-1 compaction window.
18
20
  */
19
- export type EventType = "prompt_sent" | "response_received" | "compaction_received";
21
+ export declare const EventTypeSchema: z.ZodEnum<["prompt_sent", "response_received", "compaction_received", "context_state_updated"]>;
22
+ export type EventType = z.infer<typeof EventTypeSchema>;
20
23
  /**
21
24
  * Content of the `compaction_received` marker written before a client-side
22
25
  * phase-1 compaction window. The marker is the replay anchor that
@@ -27,33 +30,158 @@ export declare const CLIENT_COMPACTION_MARKER = "Client-side compaction applied"
27
30
  /**
28
31
  * Message role aligned with AI SDK's `ModelMessage` role literals.
29
32
  */
30
- export type MessageRole = "user" | "assistant" | "tool" | "system";
33
+ export declare const MessageRoleSchema: z.ZodEnum<["user", "assistant", "tool", "system"]>;
34
+ export type MessageRole = z.infer<typeof MessageRoleSchema>;
31
35
  /**
32
- * A single entry in the JSONL event log.
36
+ * An event is one persisted JSONL entry. Message events represent conversation
37
+ * turns and replay into one `StoredMessage` each; `context_state_updated` is a
38
+ * state-only event and never appears in the replayed message list.
33
39
  *
34
40
  * Each entry captures a conversation turn with enough metadata to
35
41
  * reconstruct `StoredMessage[]` for the AI SDK. The `_superblocks`
36
42
  * field preserves round-trip metadata (token counts, summary flags)
37
43
  * through the storage layer.
44
+ *
45
+ * Prompt and compaction events may also carry an attachment snapshot. Prompt
46
+ * snapshots keep attachment state adjacent to the user turn that introduced it;
47
+ * compaction snapshots keep the catalog recoverable when message replay starts
48
+ * from the compaction anchor instead of the beginning of the log.
49
+ */
50
+ export declare const MessageEventLogEntrySchema: z.ZodObject<{
51
+ type: z.ZodEnum<["prompt_sent", "response_received", "compaction_received"]>;
52
+ timestamp: z.ZodNumber;
53
+ role: z.ZodEnum<["user", "assistant", "tool", "system"]>;
54
+ content: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodUnknown, "many">]>;
55
+ usage: z.ZodOptional<z.ZodObject<{
56
+ input: z.ZodNumber;
57
+ output: z.ZodNumber;
58
+ cacheRead: z.ZodNumber;
59
+ }, "strip", z.ZodTypeAny, {
60
+ input: number;
61
+ output: number;
62
+ cacheRead: number;
63
+ }, {
64
+ input: number;
65
+ output: number;
66
+ cacheRead: number;
67
+ }>>;
68
+ providerMetadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
69
+ _superblocks: z.ZodOptional<z.ZodType<SuperblocksMetadata, z.ZodTypeDef, SuperblocksMetadata>>;
70
+ attachments: z.ZodOptional<z.ZodType<AttachmentsRecord, z.ZodTypeDef, AttachmentsRecord>>;
71
+ }, "strip", z.ZodTypeAny, {
72
+ type: "prompt_sent" | "response_received" | "compaction_received";
73
+ timestamp: number;
74
+ role: "system" | "user" | "assistant" | "tool";
75
+ content: string | unknown[];
76
+ _superblocks?: SuperblocksMetadata | undefined;
77
+ attachments?: AttachmentsRecord | undefined;
78
+ usage?: {
79
+ input: number;
80
+ output: number;
81
+ cacheRead: number;
82
+ } | undefined;
83
+ providerMetadata?: Record<string, unknown> | undefined;
84
+ }, {
85
+ type: "prompt_sent" | "response_received" | "compaction_received";
86
+ timestamp: number;
87
+ role: "system" | "user" | "assistant" | "tool";
88
+ content: string | unknown[];
89
+ _superblocks?: SuperblocksMetadata | undefined;
90
+ attachments?: AttachmentsRecord | undefined;
91
+ usage?: {
92
+ input: number;
93
+ output: number;
94
+ cacheRead: number;
95
+ } | undefined;
96
+ providerMetadata?: Record<string, unknown> | undefined;
97
+ }>;
98
+ export type MessageEventLogEntry = z.infer<typeof MessageEventLogEntrySchema>;
99
+ /**
100
+ * Non-message context state carried by the event log.
101
+ *
102
+ * Messages remain first-class event entries so compaction-window replay can
103
+ * keep using the append-only log. This state entry captures the remaining
104
+ * ContextRecordV2 fields that must survive after legacy main.json goes away.
38
105
  */
39
- export interface EventLogEntry {
40
- /** Event discriminator. */
41
- readonly type: EventType;
42
- /** Unix epoch milliseconds when this event occurred. */
43
- readonly timestamp: number;
44
- /** Message role matching AI SDK `ModelMessage` role literals. */
45
- readonly role: MessageRole;
46
- /** Message content -- string, array of content parts, or other AI SDK content shapes. */
47
- readonly content: unknown;
48
- /** Token usage for this turn (typically set on response_received events). */
49
- readonly usage?: {
50
- readonly input: number;
51
- readonly output: number;
52
- readonly cacheRead: number;
53
- };
54
- /** Provider-specific metadata passed through from the AI SDK. */
55
- readonly providerMetadata?: Record<string, unknown>;
56
- /** Superblocks metadata preserved through storage round-trip (isSummary, tokenCount, etc.). */
57
- readonly _superblocks?: SuperblocksMetadata;
58
- }
106
+ export declare const ContextStateEventLogEntrySchema: z.ZodObject<{
107
+ type: z.ZodLiteral<"context_state_updated">;
108
+ timestamp: z.ZodNumber;
109
+ attachments: z.ZodOptional<z.ZodType<AttachmentsRecord, z.ZodTypeDef, AttachmentsRecord>>;
110
+ lastContextUsage: z.ZodCatch<z.ZodOptional<z.ZodType<ContextUsageSnapshot, z.ZodTypeDef, ContextUsageSnapshot>>>;
111
+ }, "strip", z.ZodTypeAny, {
112
+ type: "context_state_updated";
113
+ timestamp: number;
114
+ attachments?: AttachmentsRecord | undefined;
115
+ lastContextUsage?: ContextUsageSnapshot | undefined;
116
+ }, {
117
+ type: "context_state_updated";
118
+ timestamp: number;
119
+ attachments?: AttachmentsRecord | undefined;
120
+ lastContextUsage?: unknown;
121
+ }>;
122
+ export type ContextStateEventLogEntry = z.infer<typeof ContextStateEventLogEntrySchema>;
123
+ export declare const EventLogEntrySchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
124
+ type: z.ZodEnum<["prompt_sent", "response_received", "compaction_received"]>;
125
+ timestamp: z.ZodNumber;
126
+ role: z.ZodEnum<["user", "assistant", "tool", "system"]>;
127
+ content: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodUnknown, "many">]>;
128
+ usage: z.ZodOptional<z.ZodObject<{
129
+ input: z.ZodNumber;
130
+ output: z.ZodNumber;
131
+ cacheRead: z.ZodNumber;
132
+ }, "strip", z.ZodTypeAny, {
133
+ input: number;
134
+ output: number;
135
+ cacheRead: number;
136
+ }, {
137
+ input: number;
138
+ output: number;
139
+ cacheRead: number;
140
+ }>>;
141
+ providerMetadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
142
+ _superblocks: z.ZodOptional<z.ZodType<SuperblocksMetadata, z.ZodTypeDef, SuperblocksMetadata>>;
143
+ attachments: z.ZodOptional<z.ZodType<AttachmentsRecord, z.ZodTypeDef, AttachmentsRecord>>;
144
+ }, "strip", z.ZodTypeAny, {
145
+ type: "prompt_sent" | "response_received" | "compaction_received";
146
+ timestamp: number;
147
+ role: "system" | "user" | "assistant" | "tool";
148
+ content: string | unknown[];
149
+ _superblocks?: SuperblocksMetadata | undefined;
150
+ attachments?: AttachmentsRecord | undefined;
151
+ usage?: {
152
+ input: number;
153
+ output: number;
154
+ cacheRead: number;
155
+ } | undefined;
156
+ providerMetadata?: Record<string, unknown> | undefined;
157
+ }, {
158
+ type: "prompt_sent" | "response_received" | "compaction_received";
159
+ timestamp: number;
160
+ role: "system" | "user" | "assistant" | "tool";
161
+ content: string | unknown[];
162
+ _superblocks?: SuperblocksMetadata | undefined;
163
+ attachments?: AttachmentsRecord | undefined;
164
+ usage?: {
165
+ input: number;
166
+ output: number;
167
+ cacheRead: number;
168
+ } | undefined;
169
+ providerMetadata?: Record<string, unknown> | undefined;
170
+ }>, z.ZodObject<{
171
+ type: z.ZodLiteral<"context_state_updated">;
172
+ timestamp: z.ZodNumber;
173
+ attachments: z.ZodOptional<z.ZodType<AttachmentsRecord, z.ZodTypeDef, AttachmentsRecord>>;
174
+ lastContextUsage: z.ZodCatch<z.ZodOptional<z.ZodType<ContextUsageSnapshot, z.ZodTypeDef, ContextUsageSnapshot>>>;
175
+ }, "strip", z.ZodTypeAny, {
176
+ type: "context_state_updated";
177
+ timestamp: number;
178
+ attachments?: AttachmentsRecord | undefined;
179
+ lastContextUsage?: ContextUsageSnapshot | undefined;
180
+ }, {
181
+ type: "context_state_updated";
182
+ timestamp: number;
183
+ attachments?: AttachmentsRecord | undefined;
184
+ lastContextUsage?: unknown;
185
+ }>]>;
186
+ export type EventLogEntry = z.infer<typeof EventLogEntrySchema>;
59
187
  //# sourceMappingURL=event-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-types.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/event-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GACjB,aAAa,GACb,mBAAmB,GACnB,qBAAqB,CAAC;AAE1B;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,mCAAmC,CAAC;AAEzE;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEnE;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,yFAAyF;IACzF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,iEAAiE;IACjE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,+FAA+F;IAC/F,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;CAC7C"}
1
+ {"version":3,"file":"event-types.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/event-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAElF,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAyE1E;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,iGAK1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,mCAAmC,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,iBAAiB,oDAK5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAerC,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;EAO1C,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAC7C,OAAO,+BAA+B,CACvC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAG9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -6,6 +6,88 @@
6
6
  * or compaction received). The event log replaces full-context JSON
7
7
  * blob storage with an incremental, corruption-tolerant format.
8
8
  */
9
+ import { z } from "zod";
10
+ const storedAttachmentBaseSchema = z.object({
11
+ id: z.number(),
12
+ fileName: z.string().optional(),
13
+ label: z.string().optional(),
14
+ insight: z.string().optional(),
15
+ originalMessage: z.string().optional(),
16
+ createdAt: z.number(),
17
+ updatedAt: z.number(),
18
+ });
19
+ const storedAttachmentSchema = z.union([
20
+ storedAttachmentBaseSchema.extend({
21
+ type: z.literal("image"),
22
+ imageDataUrl: z.string(),
23
+ }),
24
+ storedAttachmentBaseSchema.extend({
25
+ type: z.literal("pdf"),
26
+ data: z.string(),
27
+ size: z.number().optional(),
28
+ }),
29
+ storedAttachmentBaseSchema.extend({
30
+ type: z.literal("archive"),
31
+ data: z.string(),
32
+ size: z.number().optional(),
33
+ }),
34
+ storedAttachmentBaseSchema.extend({
35
+ type: z.enum(["csv", "json", "yaml", "css", "txt"]),
36
+ content: z.string(),
37
+ mimeType: z.string(),
38
+ size: z.number().optional(),
39
+ }),
40
+ storedAttachmentBaseSchema.extend({
41
+ type: z.literal("uploaded"),
42
+ url: z.string(),
43
+ signedUrl: z.string().optional(),
44
+ mediaType: z.string(),
45
+ storageKey: z.string().optional(),
46
+ signedUrlExpiresAt: z.string().optional(),
47
+ scopeType: z.enum(["org", "app"]).optional(),
48
+ applicationId: z.string().optional(),
49
+ }),
50
+ ]);
51
+ const attachmentsRecordSchema = z.object({
52
+ nextId: z.number(),
53
+ attachments: z.array(storedAttachmentSchema),
54
+ });
55
+ const contextUsageSnapshotSchema = z.object({
56
+ breakdown: z.object({
57
+ conversation: z.number(),
58
+ summarizedConversation: z.number(),
59
+ systemPrompt: z.number(),
60
+ tools: z.number(),
61
+ }),
62
+ compactionThreshold: z.number(),
63
+ contextLimit: z.number(),
64
+ contextUsed: z.number(),
65
+ });
66
+ const superblocksMetadataSchema = z.object({
67
+ tokenCount: z.number().optional(),
68
+ cumulativeInputTokens: z.number().optional(),
69
+ timestamp: z.number(),
70
+ isSummary: z.boolean().optional(),
71
+ protected: z.record(z.boolean()).optional(),
72
+ toolSummaries: z.record(z.string()).optional(),
73
+ summarized: z.boolean().optional(),
74
+ preCompactionInputTokenBaseline: z.boolean().optional(),
75
+ });
76
+ /**
77
+ * Discriminator for event log entries.
78
+ *
79
+ * - `prompt_sent`: A user prompt was sent to the LLM.
80
+ * - `response_received`: An assistant response was received from the LLM.
81
+ * - `compaction_received`: A compaction replaced earlier history — either a
82
+ * server-side compaction summary or the anchor marker written before a
83
+ * client-side phase-1 compaction window.
84
+ */
85
+ export const EventTypeSchema = z.enum([
86
+ "prompt_sent",
87
+ "response_received",
88
+ "compaction_received",
89
+ "context_state_updated",
90
+ ]);
9
91
  /**
10
92
  * Content of the `compaction_received` marker written before a client-side
11
93
  * phase-1 compaction window. The marker is the replay anchor that
@@ -13,4 +95,63 @@
13
95
  * it because their first message carries `isSummary`.
14
96
  */
15
97
  export const CLIENT_COMPACTION_MARKER = "Client-side compaction applied";
98
+ /**
99
+ * Message role aligned with AI SDK's `ModelMessage` role literals.
100
+ */
101
+ export const MessageRoleSchema = z.enum([
102
+ "user",
103
+ "assistant",
104
+ "tool",
105
+ "system",
106
+ ]);
107
+ /**
108
+ * An event is one persisted JSONL entry. Message events represent conversation
109
+ * turns and replay into one `StoredMessage` each; `context_state_updated` is a
110
+ * state-only event and never appears in the replayed message list.
111
+ *
112
+ * Each entry captures a conversation turn with enough metadata to
113
+ * reconstruct `StoredMessage[]` for the AI SDK. The `_superblocks`
114
+ * field preserves round-trip metadata (token counts, summary flags)
115
+ * through the storage layer.
116
+ *
117
+ * Prompt and compaction events may also carry an attachment snapshot. Prompt
118
+ * snapshots keep attachment state adjacent to the user turn that introduced it;
119
+ * compaction snapshots keep the catalog recoverable when message replay starts
120
+ * from the compaction anchor instead of the beginning of the log.
121
+ */
122
+ export const MessageEventLogEntrySchema = z.object({
123
+ type: z.enum(["prompt_sent", "response_received", "compaction_received"]),
124
+ timestamp: z.number(),
125
+ role: MessageRoleSchema,
126
+ content: z.union([z.string(), z.array(z.unknown())]),
127
+ usage: z
128
+ .object({
129
+ input: z.number(),
130
+ output: z.number(),
131
+ cacheRead: z.number(),
132
+ })
133
+ .optional(),
134
+ providerMetadata: z.record(z.unknown()).optional(),
135
+ _superblocks: superblocksMetadataSchema.optional(),
136
+ attachments: attachmentsRecordSchema.optional(),
137
+ });
138
+ /**
139
+ * Non-message context state carried by the event log.
140
+ *
141
+ * Messages remain first-class event entries so compaction-window replay can
142
+ * keep using the append-only log. This state entry captures the remaining
143
+ * ContextRecordV2 fields that must survive after legacy main.json goes away.
144
+ */
145
+ export const ContextStateEventLogEntrySchema = z.object({
146
+ type: z.literal("context_state_updated"),
147
+ timestamp: z.number(),
148
+ attachments: attachmentsRecordSchema.optional(),
149
+ // Display-only, so a malformed value degrades to absent instead of failing
150
+ // the whole entry, which would count as corruption and demote the log.
151
+ lastContextUsage: contextUsageSnapshotSchema.optional().catch(undefined),
152
+ });
153
+ export const EventLogEntrySchema = z.discriminatedUnion("type", [
154
+ MessageEventLogEntrySchema,
155
+ ContextStateEventLogEntrySchema,
156
+ ]);
16
157
  //# sourceMappingURL=event-types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-types.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/event-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,gCAAgC,CAAC"}
1
+ {"version":3,"file":"event-types.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/event-types.ts"],"names":[],"mappings":"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"}
@@ -19,8 +19,9 @@
19
19
  * are skipped with a warning log, making the format tolerant to
20
20
  * partial writes or manual edits.
21
21
  */
22
- import type { ContextId, StoredMessage } from "../types.js";
23
- import type { EventStore } from "./event-store.js";
22
+ import type { ContextUsageSnapshot } from "@superblocksteam/library-shared/types";
23
+ import type { AttachmentsRecord, ContextId, StoredMessage } from "../types.js";
24
+ import type { EventLogSnapshot, EventStore } from "./event-store.js";
24
25
  import type { EventLogEntry } from "./event-types.js";
25
26
  /**
26
27
  * Append-only JSONL event store backed by the local filesystem.
@@ -51,10 +52,19 @@ export declare class JsonlEventStore implements EventStore {
51
52
  appendEvent(id: ContextId, event: EventLogEntry, opts?: {
52
53
  shouldAbort?: () => boolean;
53
54
  }): Promise<void>;
55
+ appendAttachmentState(id: ContextId, attachments: AttachmentsRecord | undefined, opts?: {
56
+ shouldAbort?: () => boolean;
57
+ }, lastContextUsage?: ContextUsageSnapshot): Promise<void>;
54
58
  /**
55
59
  * Check whether any events exist for the given context.
56
60
  */
57
61
  hasEvents(id: ContextId): Promise<boolean>;
62
+ /**
63
+ * Atomically replace the event log. See {@link EventStore.replaceEvents}.
64
+ */
65
+ replaceEvents(id: ContextId, events: EventLogEntry[], opts?: {
66
+ shouldAbort?: () => boolean;
67
+ }): Promise<void>;
58
68
  /**
59
69
  * Remove the event log for a single context. Missing files are
60
70
  * treated as success so callers can use this as a fire-and-forget
@@ -91,6 +101,12 @@ export declare class JsonlEventStore implements EventStore {
91
101
  * consumers receive the AI SDK `ModelMessage` shape.
92
102
  */
93
103
  loadMessages(id: ContextId): Promise<StoredMessage[]>;
104
+ loadSnapshot(id: ContextId): Promise<EventLogSnapshot>;
105
+ private loadMessagesFromEvents;
106
+ loadAttachmentState(id: ContextId): Promise<AttachmentsRecord | undefined>;
107
+ private loadAttachmentStateFromEvents;
108
+ hasAttachmentState(id: ContextId): Promise<boolean>;
109
+ private hasAttachmentStateInEvents;
94
110
  /**
95
111
  * Map an EventLogEntry to a StoredMessage (AI SDK ModelMessage shape).
96
112
  *
@@ -102,6 +118,8 @@ export declare class JsonlEventStore implements EventStore {
102
118
  * against SDK version changes.
103
119
  */
104
120
  private toStoredMessage;
121
+ private loadEventEntries;
122
+ private isMessageEvent;
105
123
  private getEventsRoot;
106
124
  private getFilePath;
107
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jsonl-event-store.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/jsonl-event-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAkBH,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,kBAAkB,CAAC;AAInE;;;;;;GAMG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAIpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAkB;IAChE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAY;gBAEpB,OAAO,EAAE,MAAM;IAE5C;;;;;;;;;;;;;OAaG;IACG,WAAW,CACf,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,aAAa,EACpB,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,GACrC,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;IACG,SAAS,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAYhD;;;;OAIG;IACG,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;;;;;;;;OASG;IACG,sBAAsB,CAC1B,EAAE,EAAE,SAAS,EACb,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC;IAmElB;;;;;OAKG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC;;;;;;;;;;OAUG;IACG,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAwE3D;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,WAAW;CAQpB"}
1
+ {"version":3,"file":"jsonl-event-store.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/jsonl-event-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAaH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAQlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAEV,aAAa,EAGd,MAAM,kBAAkB,CAAC;AAK1B;;;;;;GAMG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAIpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAkB;IAChE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAY;gBAEpB,OAAO,EAAE,MAAM;IAE5C;;;;;;;;;;;;;OAaG;IACG,WAAW,CACf,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,aAAa,EACpB,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,GACrC,OAAO,CAAC,IAAI,CAAC;IAOV,qBAAqB,CACzB,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,iBAAiB,GAAG,SAAS,EAC1C,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,EACtC,gBAAgB,CAAC,EAAE,oBAAoB,GACtC,OAAO,CAAC,IAAI,CAAC;IAahB;;OAEG;IACG,SAAS,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhD;;OAEG;IACG,aAAa,CACjB,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,aAAa,EAAE,EACvB,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,GACrC,OAAO,CAAC,IAAI,CAAC;IAsBhB;;;;OAIG;IACG,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;;;;;;;;OASG;IACG,sBAAsB,CAC1B,EAAE,EAAE,SAAS,EACb,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC;IAmElB;;;;;OAKG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC;;;;;;;;;;OAUG;IACG,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAIrD,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoB5D,OAAO,CAAC,sBAAsB;IAoCxB,mBAAmB,CACvB,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAIzC,OAAO,CAAC,6BAA6B;IAe/B,kBAAkB,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzD,OAAO,CAAC,0BAA0B;IAQlC;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;YAcT,gBAAgB;IA8C9B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,WAAW;CAQpB"}
@@ -19,10 +19,12 @@
19
19
  * are skipped with a warning log, making the format tolerant to
20
20
  * partial writes or manual edits.
21
21
  */
22
+ import { randomUUID } from "node:crypto";
22
23
  import { readFile, appendFile, mkdir, rename, rm, writeFile, } from "node:fs/promises";
23
24
  import * as path from "node:path";
24
25
  import { getPrefixedLogger } from "../../../../util/logger.js";
25
26
  import { encodeContextPathSegment, safeJoinUnderRoot, SHARED_CONTEXT_SEGMENT, } from "../../../context-archive-paths.js";
27
+ import { EventLogEntrySchema } from "./event-types.js";
26
28
  const logger = getPrefixedLogger("[jsonl-event-store]");
27
29
  /**
28
30
  * Append-only JSONL event store backed by the local filesystem.
@@ -59,18 +61,39 @@ export class JsonlEventStore {
59
61
  return;
60
62
  await appendFile(filePath, JSON.stringify(event) + "\n");
61
63
  }
64
+ async appendAttachmentState(id, attachments, opts, lastContextUsage) {
65
+ await this.appendEvent(id, {
66
+ type: "context_state_updated",
67
+ timestamp: Date.now(),
68
+ ...(attachments !== undefined ? { attachments } : {}),
69
+ ...(lastContextUsage !== undefined ? { lastContextUsage } : {}),
70
+ }, opts);
71
+ }
62
72
  /**
63
73
  * Check whether any events exist for the given context.
64
74
  */
65
75
  async hasEvents(id) {
76
+ return (await this.loadSnapshot(id)).hasEvents;
77
+ }
78
+ /**
79
+ * Atomically replace the event log. See {@link EventStore.replaceEvents}.
80
+ */
81
+ async replaceEvents(id, events, opts) {
82
+ const filePath = this.getFilePath(id);
83
+ await mkdir(path.dirname(filePath), { recursive: true });
84
+ // Unique per call, so a concurrent replace or truncate (which uses its own
85
+ // temp file) can never write into or rename away this one.
86
+ const tmpPath = `${filePath}.${randomUUID()}.tmp`;
66
87
  try {
67
- const content = await readFile(this.getFilePath(id), "utf-8");
68
- return content.trimEnd().length > 0;
88
+ await writeFile(tmpPath, events.map((event) => JSON.stringify(event) + "\n").join(""));
89
+ if (opts?.shouldAbort?.()) {
90
+ await rm(tmpPath, { force: true });
91
+ return;
92
+ }
93
+ await rename(tmpPath, filePath);
69
94
  }
70
95
  catch (err) {
71
- if (err.code === "ENOENT") {
72
- return false;
73
- }
96
+ await rm(tmpPath, { force: true }).catch(() => { });
74
97
  throw err;
75
98
  }
76
99
  }
@@ -176,51 +199,29 @@ export class JsonlEventStore {
176
199
  * consumers receive the AI SDK `ModelMessage` shape.
177
200
  */
178
201
  async loadMessages(id) {
179
- const filePath = this.getFilePath(id);
180
- let raw;
181
- try {
182
- raw = await readFile(filePath, "utf-8");
183
- }
184
- catch (err) {
185
- if (err.code === "ENOENT") {
186
- return [];
187
- }
188
- throw err;
189
- }
190
- const lines = raw.split("\n").filter((line) => line.length > 0);
191
- if (lines.length === 0) {
192
- return [];
193
- }
194
- // Parse each line, skipping corrupted entries. A corrupted line could
195
- // be the compaction anchor itself; if that happens the backward scan
196
- // below will overshoot and return more history than intended, so we
197
- // log loudly enough that the discrepancy is investigable.
198
- //
199
- // The raw line payload is intentionally NOT logged: even a partial
200
- // JSONL fragment can contain user prompts or tool results, and those
201
- // would otherwise leak into log sinks that don't share the event
202
- // store's privacy boundary. Length is enough to debug truncation
203
- // patterns without spilling content.
204
- const contextLabel = `${id.appId}/${id.name}`;
205
- const events = [];
206
- let corruptedCount = 0;
207
- for (let i = 0; i < lines.length; i++) {
208
- const line = lines[i];
209
- try {
210
- events.push(JSON.parse(line));
211
- }
212
- catch {
213
- corruptedCount++;
214
- logger.warn(`Skipping corrupted JSONL line ${i} for context '${contextLabel}' (length=${line.length})`);
215
- }
216
- }
217
- if (corruptedCount > 0) {
218
- logger.warn(`Encountered ${corruptedCount} corrupted line(s) in event log for context '${contextLabel}'; if any held a compaction anchor the loaded window may extend further back than expected.`);
219
- }
202
+ return (await this.loadSnapshot(id)).messages;
203
+ }
204
+ async loadSnapshot(id) {
205
+ const { events, corruptedCount, contextLabel, hasContent } = await this.loadEventEntries(id);
206
+ return {
207
+ hasEvents: hasContent,
208
+ messages: this.loadMessagesFromEvents({
209
+ events,
210
+ corruptedCount,
211
+ contextLabel,
212
+ }),
213
+ hasAttachmentState: this.hasAttachmentStateInEvents(events),
214
+ attachments: this.loadAttachmentStateFromEvents(events),
215
+ lastContextUsage: events.findLast((event) => event.type === "context_state_updated")?.lastContextUsage,
216
+ corruptedCount,
217
+ };
218
+ }
219
+ loadMessagesFromEvents({ events, corruptedCount, contextLabel, }) {
220
+ const messageEvents = events.filter(this.isMessageEvent);
220
221
  // Backward scan: find the last compaction anchor
221
222
  let anchorIndex = -1;
222
- for (let i = events.length - 1; i >= 0; i--) {
223
- const event = events[i];
223
+ for (let i = messageEvents.length - 1; i >= 0; i--) {
224
+ const event = messageEvents[i];
224
225
  if (event.type === "compaction_received" ||
225
226
  event._superblocks?.isSummary === true) {
226
227
  anchorIndex = i;
@@ -230,9 +231,31 @@ export class JsonlEventStore {
230
231
  if (anchorIndex < 0 && corruptedCount > 0) {
231
232
  logger.error(`No compaction anchor found for context '${contextLabel}' but ${corruptedCount} corrupted line(s) were skipped; the loaded conversation window may be unbounded.`);
232
233
  }
233
- const window = anchorIndex >= 0 ? events.slice(anchorIndex) : events;
234
+ const window = anchorIndex >= 0 ? messageEvents.slice(anchorIndex) : messageEvents;
234
235
  return window.map((event) => this.toStoredMessage(event));
235
236
  }
237
+ async loadAttachmentState(id) {
238
+ return (await this.loadSnapshot(id)).attachments;
239
+ }
240
+ loadAttachmentStateFromEvents(events) {
241
+ for (let i = events.length - 1; i >= 0; i--) {
242
+ const event = events[i];
243
+ if (event.type === "context_state_updated") {
244
+ return event.attachments;
245
+ }
246
+ if (event.attachments !== undefined) {
247
+ return event.attachments;
248
+ }
249
+ }
250
+ return undefined;
251
+ }
252
+ async hasAttachmentState(id) {
253
+ return (await this.loadSnapshot(id)).hasAttachmentState;
254
+ }
255
+ hasAttachmentStateInEvents(events) {
256
+ return events.some((event) => event.type === "context_state_updated" ||
257
+ event.attachments !== undefined);
258
+ }
236
259
  /**
237
260
  * Map an EventLogEntry to a StoredMessage (AI SDK ModelMessage shape).
238
261
  *
@@ -256,6 +279,45 @@ export class JsonlEventStore {
256
279
  },
257
280
  };
258
281
  }
282
+ async loadEventEntries(id) {
283
+ const contextLabel = `${id.appId}/${id.name}`;
284
+ let raw;
285
+ try {
286
+ raw = await readFile(this.getFilePath(id), "utf-8");
287
+ }
288
+ catch (err) {
289
+ if (err.code === "ENOENT") {
290
+ return {
291
+ events: [],
292
+ corruptedCount: 0,
293
+ contextLabel,
294
+ hasContent: false,
295
+ };
296
+ }
297
+ throw err;
298
+ }
299
+ const hasContent = raw.trimEnd().length > 0;
300
+ const lines = raw.split("\n").filter((line) => line.length > 0);
301
+ const events = [];
302
+ let corruptedCount = 0;
303
+ for (let i = 0; i < lines.length; i++) {
304
+ const line = lines[i];
305
+ try {
306
+ events.push(EventLogEntrySchema.parse(JSON.parse(line)));
307
+ }
308
+ catch {
309
+ corruptedCount++;
310
+ logger.warn(`Skipping invalid JSONL line ${i} for context '${contextLabel}' (length=${line.length})`);
311
+ }
312
+ }
313
+ if (corruptedCount > 0) {
314
+ logger.warn(`Encountered ${corruptedCount} corrupted line(s) in event log for context '${contextLabel}'; if any held a compaction anchor the loaded window may extend further back than expected.`);
315
+ }
316
+ return { events, corruptedCount, contextLabel, hasContent };
317
+ }
318
+ isMessageEvent(event) {
319
+ return event.type !== "context_state_updated";
320
+ }
259
321
  getEventsRoot() {
260
322
  return path.join(this.rootDir, JsonlEventStore.SUPERBLOCKS_SYSTEM_DIR, JsonlEventStore.EVENTS_SUBDIR);
261
323
  }