@superblocksteam/vite-plugin-file-sync 2.0.151 → 2.0.152-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/dist/ai-service/agent/middleware.d.ts.map +1 -1
  2. package/dist/ai-service/agent/middleware.js +10 -1
  3. package/dist/ai-service/agent/middleware.js.map +1 -1
  4. package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
  5. package/dist/ai-service/agent/prompts/build-base-system-prompt.js +25 -6
  6. package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
  7. package/dist/ai-service/agent/prompts/build-security-scan-prompt.d.ts.map +1 -1
  8. package/dist/ai-service/agent/prompts/build-security-scan-prompt.js +7 -2
  9. package/dist/ai-service/agent/prompts/build-security-scan-prompt.js.map +1 -1
  10. package/dist/ai-service/agent/tools/apis/get-sdk-api-docs.d.ts +47 -1
  11. package/dist/ai-service/agent/tools/apis/get-sdk-api-docs.d.ts.map +1 -1
  12. package/dist/ai-service/agent/tools/apis/get-sdk-api-docs.js +129 -15
  13. package/dist/ai-service/agent/tools/apis/get-sdk-api-docs.js.map +1 -1
  14. package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
  15. package/dist/ai-service/agent/tools/apis/test-api.js +1 -24
  16. package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
  17. package/dist/ai-service/agent/tools/databases/dev-database-tasks.d.ts +53 -9
  18. package/dist/ai-service/agent/tools/databases/dev-database-tasks.d.ts.map +1 -1
  19. package/dist/ai-service/agent/tools/databases/dev-database-tasks.js +304 -67
  20. package/dist/ai-service/agent/tools/databases/dev-database-tasks.js.map +1 -1
  21. package/dist/ai-service/agent/tools/databases/dev-database-tools.d.ts +47 -1
  22. package/dist/ai-service/agent/tools/databases/dev-database-tools.d.ts.map +1 -1
  23. package/dist/ai-service/agent/tools/databases/dev-database-tools.js +38 -1
  24. package/dist/ai-service/agent/tools/databases/dev-database-tools.js.map +1 -1
  25. package/dist/ai-service/agent/tools/integrations/execute-request.d.ts +391 -0
  26. package/dist/ai-service/agent/tools/integrations/execute-request.d.ts.map +1 -1
  27. package/dist/ai-service/agent/tools/integrations/execute-request.js +257 -44
  28. package/dist/ai-service/agent/tools/integrations/execute-request.js.map +1 -1
  29. package/dist/ai-service/agent/tools/integrations/index.d.ts +1 -1
  30. package/dist/ai-service/agent/tools/integrations/index.d.ts.map +1 -1
  31. package/dist/ai-service/agent/tools/integrations/index.js +1 -1
  32. package/dist/ai-service/agent/tools/integrations/index.js.map +1 -1
  33. package/dist/ai-service/agent/tools/integrations/managed-app-database.d.ts +16 -0
  34. package/dist/ai-service/agent/tools/integrations/managed-app-database.d.ts.map +1 -0
  35. package/dist/ai-service/agent/tools/integrations/managed-app-database.js +31 -0
  36. package/dist/ai-service/agent/tools/integrations/managed-app-database.js.map +1 -0
  37. package/dist/ai-service/agent/tools/integrations/sql-classification.d.ts +44 -0
  38. package/dist/ai-service/agent/tools/integrations/sql-classification.d.ts.map +1 -0
  39. package/dist/ai-service/agent/tools/integrations/sql-classification.js +352 -0
  40. package/dist/ai-service/agent/tools/integrations/sql-classification.js.map +1 -0
  41. package/dist/ai-service/agent/tools/report-security-findings.d.ts +5 -5
  42. package/dist/ai-service/agent/tools.d.ts.map +1 -1
  43. package/dist/ai-service/agent/tools.js +5 -1
  44. package/dist/ai-service/agent/tools.js.map +1 -1
  45. package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
  46. package/dist/ai-service/agent/tools2/registry.js +2 -0
  47. package/dist/ai-service/agent/tools2/registry.js.map +1 -1
  48. package/dist/ai-service/agent/tools2/tools/check-task.d.ts.map +1 -1
  49. package/dist/ai-service/agent/tools2/tools/check-task.js +4 -1
  50. package/dist/ai-service/agent/tools2/tools/check-task.js.map +1 -1
  51. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
  52. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +12 -1
  53. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
  54. package/dist/ai-service/agent/tools2/tools/wait-for-task.d.ts.map +1 -1
  55. package/dist/ai-service/agent/tools2/tools/wait-for-task.js +5 -1
  56. package/dist/ai-service/agent/tools2/tools/wait-for-task.js.map +1 -1
  57. package/dist/ai-service/chat/chat-session-store.d.ts +10 -1
  58. package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
  59. package/dist/ai-service/chat/chat-session-store.js +65 -15
  60. package/dist/ai-service/chat/chat-session-store.js.map +1 -1
  61. package/dist/ai-service/context-archive-paths.d.ts +7 -0
  62. package/dist/ai-service/context-archive-paths.d.ts.map +1 -1
  63. package/dist/ai-service/context-archive-paths.js +7 -0
  64. package/dist/ai-service/context-archive-paths.js.map +1 -1
  65. package/dist/ai-service/context-download.d.ts.map +1 -1
  66. package/dist/ai-service/context-download.js +8 -10
  67. package/dist/ai-service/context-download.js.map +1 -1
  68. package/dist/ai-service/context-flush.d.ts +36 -0
  69. package/dist/ai-service/context-flush.d.ts.map +1 -0
  70. package/dist/ai-service/context-flush.js +90 -0
  71. package/dist/ai-service/context-flush.js.map +1 -0
  72. package/dist/ai-service/context-restore.d.ts +64 -0
  73. package/dist/ai-service/context-restore.d.ts.map +1 -0
  74. package/dist/ai-service/context-restore.js +136 -0
  75. package/dist/ai-service/context-restore.js.map +1 -0
  76. package/dist/ai-service/context-upload.d.ts +13 -4
  77. package/dist/ai-service/context-upload.d.ts.map +1 -1
  78. package/dist/ai-service/context-upload.js +28 -18
  79. package/dist/ai-service/context-upload.js.map +1 -1
  80. package/dist/ai-service/dev-database-client.d.ts +51 -0
  81. package/dist/ai-service/dev-database-client.d.ts.map +1 -1
  82. package/dist/ai-service/dev-database-client.js +3 -0
  83. package/dist/ai-service/dev-database-client.js.map +1 -1
  84. package/dist/ai-service/index.d.ts +19 -0
  85. package/dist/ai-service/index.d.ts.map +1 -1
  86. package/dist/ai-service/index.js +449 -182
  87. package/dist/ai-service/index.js.map +1 -1
  88. package/dist/ai-service/llm/context-v2/adapter.d.ts.map +1 -1
  89. package/dist/ai-service/llm/context-v2/adapter.js +1 -0
  90. package/dist/ai-service/llm/context-v2/adapter.js.map +1 -1
  91. package/dist/ai-service/llm/context-v2/compaction/client-side.d.ts +30 -0
  92. package/dist/ai-service/llm/context-v2/compaction/client-side.d.ts.map +1 -1
  93. package/dist/ai-service/llm/context-v2/compaction/client-side.js +77 -4
  94. package/dist/ai-service/llm/context-v2/compaction/client-side.js.map +1 -1
  95. package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.d.ts +5 -0
  96. package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.d.ts.map +1 -1
  97. package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts +1 -0
  98. package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts.map +1 -1
  99. package/dist/ai-service/llm/context-v2/compaction/server-side.js +3 -0
  100. package/dist/ai-service/llm/context-v2/compaction/server-side.js.map +1 -1
  101. package/dist/ai-service/llm/context-v2/compactor.d.ts.map +1 -1
  102. package/dist/ai-service/llm/context-v2/compactor.js +57 -6
  103. package/dist/ai-service/llm/context-v2/compactor.js.map +1 -1
  104. package/dist/ai-service/llm/context-v2/config.d.ts +13 -1
  105. package/dist/ai-service/llm/context-v2/config.d.ts.map +1 -1
  106. package/dist/ai-service/llm/context-v2/config.js +39 -2
  107. package/dist/ai-service/llm/context-v2/config.js.map +1 -1
  108. package/dist/ai-service/llm/context-v2/context-metrics.d.ts +23 -0
  109. package/dist/ai-service/llm/context-v2/context-metrics.d.ts.map +1 -1
  110. package/dist/ai-service/llm/context-v2/context-metrics.js +52 -1
  111. package/dist/ai-service/llm/context-v2/context-metrics.js.map +1 -1
  112. package/dist/ai-service/llm/context-v2/context.d.ts +27 -3
  113. package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
  114. package/dist/ai-service/llm/context-v2/context.js +107 -10
  115. package/dist/ai-service/llm/context-v2/context.js.map +1 -1
  116. package/dist/ai-service/llm/context-v2/manager.d.ts +66 -0
  117. package/dist/ai-service/llm/context-v2/manager.d.ts.map +1 -1
  118. package/dist/ai-service/llm/context-v2/manager.js +194 -2
  119. package/dist/ai-service/llm/context-v2/manager.js.map +1 -1
  120. package/dist/ai-service/llm/context-v2/storage/event-store.d.ts +31 -5
  121. package/dist/ai-service/llm/context-v2/storage/event-store.d.ts.map +1 -1
  122. package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.d.ts +30 -9
  123. package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.d.ts.map +1 -1
  124. package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.js +96 -13
  125. package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.js.map +1 -1
  126. package/dist/ai-service/llm/context-v2/storage/legacy-context-adoption.d.ts +46 -0
  127. package/dist/ai-service/llm/context-v2/storage/legacy-context-adoption.d.ts.map +1 -0
  128. package/dist/ai-service/llm/context-v2/storage/legacy-context-adoption.js +240 -0
  129. package/dist/ai-service/llm/context-v2/storage/legacy-context-adoption.js.map +1 -0
  130. package/dist/ai-service/llm/context-v2/storage/local.d.ts +1 -1
  131. package/dist/ai-service/llm/context-v2/storage/local.d.ts.map +1 -1
  132. package/dist/ai-service/llm/context-v2/storage/local.js +3 -2
  133. package/dist/ai-service/llm/context-v2/storage/local.js.map +1 -1
  134. package/dist/ai-service/llm/context-v2/types.d.ts +5 -1
  135. package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
  136. package/dist/ai-service/llm/context-v2/types.js.map +1 -1
  137. package/dist/ai-service/llm/stream/config.d.ts +4 -3
  138. package/dist/ai-service/llm/stream/config.d.ts.map +1 -1
  139. package/dist/ai-service/llm/stream/config.js.map +1 -1
  140. package/dist/ai-service/llm/stream/idle-monitor.d.ts +37 -4
  141. package/dist/ai-service/llm/stream/idle-monitor.d.ts.map +1 -1
  142. package/dist/ai-service/llm/stream/idle-monitor.js +38 -3
  143. package/dist/ai-service/llm/stream/idle-monitor.js.map +1 -1
  144. package/dist/ai-service/policy-agent-metrics.d.ts +18 -0
  145. package/dist/ai-service/policy-agent-metrics.d.ts.map +1 -0
  146. package/dist/ai-service/policy-agent-metrics.js +99 -0
  147. package/dist/ai-service/policy-agent-metrics.js.map +1 -0
  148. package/dist/ai-service/state-machine/clark-fsm.d.ts +9 -0
  149. package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
  150. package/dist/ai-service/state-machine/helpers/prompt-request-metrics.d.ts +9 -0
  151. package/dist/ai-service/state-machine/helpers/prompt-request-metrics.d.ts.map +1 -1
  152. package/dist/ai-service/state-machine/helpers/prompt-request-metrics.js +27 -0
  153. package/dist/ai-service/state-machine/helpers/prompt-request-metrics.js.map +1 -1
  154. package/dist/ai-service/tasks/factory.d.ts +7 -0
  155. package/dist/ai-service/tasks/factory.d.ts.map +1 -1
  156. package/dist/ai-service/tasks/factory.js +5 -0
  157. package/dist/ai-service/tasks/factory.js.map +1 -1
  158. package/dist/ai-service/tasks/task-store.d.ts +11 -1
  159. package/dist/ai-service/tasks/task-store.d.ts.map +1 -1
  160. package/dist/ai-service/tasks/task-store.js +104 -29
  161. package/dist/ai-service/tasks/task-store.js.map +1 -1
  162. package/dist/ai-service/tasks/types.d.ts +9 -1
  163. package/dist/ai-service/tasks/types.d.ts.map +1 -1
  164. package/dist/extract-api-integrations.d.ts +76 -0
  165. package/dist/extract-api-integrations.d.ts.map +1 -1
  166. package/dist/extract-api-integrations.js +428 -109
  167. package/dist/extract-api-integrations.js.map +1 -1
  168. package/dist/file-sync-vite-plugin.d.ts +1 -1
  169. package/dist/file-sync-vite-plugin.d.ts.map +1 -1
  170. package/dist/file-sync-vite-plugin.js +42 -79
  171. package/dist/file-sync-vite-plugin.js.map +1 -1
  172. package/dist/file-system-helpers.d.ts +1 -1
  173. package/dist/file-system-helpers.d.ts.map +1 -1
  174. package/dist/file-system-helpers.js +1 -0
  175. package/dist/file-system-helpers.js.map +1 -1
  176. package/dist/git-auth-state.d.ts +4 -0
  177. package/dist/git-auth-state.d.ts.map +1 -0
  178. package/dist/git-auth-state.js +25 -0
  179. package/dist/git-auth-state.js.map +1 -0
  180. package/dist/git-service/checkpoint-commit-metrics.d.ts +2 -0
  181. package/dist/git-service/checkpoint-commit-metrics.d.ts.map +1 -0
  182. package/dist/git-service/checkpoint-commit-metrics.js +15 -0
  183. package/dist/git-service/checkpoint-commit-metrics.js.map +1 -0
  184. package/dist/git-service/checkpoint-committer.d.ts +22 -0
  185. package/dist/git-service/checkpoint-committer.d.ts.map +1 -0
  186. package/dist/git-service/checkpoint-committer.js +91 -0
  187. package/dist/git-service/checkpoint-committer.js.map +1 -0
  188. package/dist/git-service/commit-live-branch.d.ts +17 -0
  189. package/dist/git-service/commit-live-branch.d.ts.map +1 -0
  190. package/dist/git-service/commit-live-branch.js +28 -0
  191. package/dist/git-service/commit-live-branch.js.map +1 -0
  192. package/dist/git-service/provider-workflow-files.d.ts +12 -0
  193. package/dist/git-service/provider-workflow-files.d.ts.map +1 -0
  194. package/dist/git-service/provider-workflow-files.js +36 -0
  195. package/dist/git-service/provider-workflow-files.js.map +1 -0
  196. package/dist/plugin-options.d.ts +8 -0
  197. package/dist/plugin-options.d.ts.map +1 -1
  198. package/dist/plugin-options.js.map +1 -1
  199. package/dist/policy-gate-runner.d.ts.map +1 -1
  200. package/dist/policy-gate-runner.js +7 -9
  201. package/dist/policy-gate-runner.js.map +1 -1
  202. package/dist/server-rpc/client.d.ts.map +1 -1
  203. package/dist/server-rpc/client.js +2 -0
  204. package/dist/server-rpc/client.js.map +1 -1
  205. package/dist/server-rpc/index.d.ts +43 -1
  206. package/dist/server-rpc/index.d.ts.map +1 -1
  207. package/dist/server-rpc/index.js +143 -5
  208. package/dist/server-rpc/index.js.map +1 -1
  209. package/dist/server-rpc/request-abort-context.d.ts +3 -0
  210. package/dist/server-rpc/request-abort-context.d.ts.map +1 -0
  211. package/dist/server-rpc/request-abort-context.js +23 -0
  212. package/dist/server-rpc/request-abort-context.js.map +1 -0
  213. package/dist/server-rpc/rpc-invalidate-metrics.d.ts +20 -0
  214. package/dist/server-rpc/rpc-invalidate-metrics.d.ts.map +1 -0
  215. package/dist/server-rpc/rpc-invalidate-metrics.js +86 -0
  216. package/dist/server-rpc/rpc-invalidate-metrics.js.map +1 -0
  217. package/dist/socket-manager.d.ts.map +1 -1
  218. package/dist/socket-manager.js +21 -60
  219. package/dist/socket-manager.js.map +1 -1
  220. package/dist/sync-service/index.d.ts +26 -2
  221. package/dist/sync-service/index.d.ts.map +1 -1
  222. package/dist/sync-service/index.js +74 -37
  223. package/dist/sync-service/index.js.map +1 -1
  224. package/package.json +9 -8
@@ -3,15 +3,15 @@
3
3
  *
4
4
  * Stores conversation events as newline-delimited JSON in per-context
5
5
  * `.jsonl` files under
6
- * `{rootDir}/.superblocks/events/{userId}/{name}.jsonl`.
6
+ * `{rootDir}/.superblocks/events/shared/{name}.jsonl`.
7
7
  *
8
- * Each `ContextId` segment is `encodeURIComponent`-encoded before being
9
- * joined into the path. This guarantees two things:
10
- * 1. Different `{userId, name}` tuples cannot collide on disk, so
11
- * one user's conversation cannot leak into another user's context
12
- * in the same app workspace.
13
- * 2. Segments containing `..`, `/`, or other path-control characters
14
- * cannot escape the `events/` root via path traversal.
8
+ * The path is rooted under the fixed `SHARED_CONTEXT_SEGMENT` (`shared`)
9
+ * segment: the reasoning context is intentionally shared by every editor
10
+ * of the app, not partitioned per user. Only the `name` segment is
11
+ * derived from the `ContextId`, and it is `encodeContextPathSegment`-encoded
12
+ * before being joined into the path via `safeJoinUnderRoot`, which guards
13
+ * against `..`, `/`, or other path-control characters escaping the
14
+ * `events/` root via path traversal.
15
15
  *
16
16
  * Writes are append-only (one `appendFile` call per event). Reads
17
17
  * scan backward for the most recent compaction anchor, then return
@@ -39,8 +39,18 @@ export declare class JsonlEventStore implements EventStore {
39
39
  *
40
40
  * Creates parent directories if they do not exist. Each call
41
41
  * writes exactly one JSON line terminated by `\n`.
42
+ *
43
+ * `opts.shouldAbort` is re-checked here, between the `mkdir` and the
44
+ * `appendFile`, with no `await` in between: a concurrent clear can
45
+ * finish inside the gap opened by the `mkdir` await above, and this
46
+ * is the last point before the write where that can be caught. An
47
+ * empty recreated directory from the `mkdir` is harmless -- there is
48
+ * no file yet, so `loadMessages` on a missing file returns `[]` and
49
+ * no anchor exists.
42
50
  */
43
- appendEvent(id: ContextId, event: EventLogEntry): Promise<void>;
51
+ appendEvent(id: ContextId, event: EventLogEntry, opts?: {
52
+ shouldAbort?: () => boolean;
53
+ }): Promise<void>;
44
54
  /**
45
55
  * Check whether any events exist for the given context.
46
56
  */
@@ -51,6 +61,17 @@ export declare class JsonlEventStore implements EventStore {
51
61
  * cleanup step.
52
62
  */
53
63
  deleteEvents(id: ContextId): Promise<void>;
64
+ /**
65
+ * Drop every event newer than `sinceTimestamp`, keeping the prefix that
66
+ * existed at or before the checkpoint. See {@link EventStore.truncateAfterTimestamp}.
67
+ *
68
+ * Kept lines are written back verbatim (not re-serialized) so metadata this
69
+ * store does not model is never lost. The rewrite is atomic — a temp file in
70
+ * the same directory plus `rename` — so a process kill mid-write (an OOM/pod
71
+ * eviction on this live dev-server pod) can never leave the log empty or
72
+ * half-written and silently lose the whole conversation.
73
+ */
74
+ truncateAfterTimestamp(id: ContextId, sinceTimestamp: number): Promise<number>;
54
75
  /**
55
76
  * Remove the entire `.superblocks/events/` tree under `rootDir`.
56
77
  *
@@ -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;AAUH,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;;;;;OAKG;IACG,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrE;;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;;;;;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;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"}
@@ -3,15 +3,15 @@
3
3
  *
4
4
  * Stores conversation events as newline-delimited JSON in per-context
5
5
  * `.jsonl` files under
6
- * `{rootDir}/.superblocks/events/{userId}/{name}.jsonl`.
6
+ * `{rootDir}/.superblocks/events/shared/{name}.jsonl`.
7
7
  *
8
- * Each `ContextId` segment is `encodeURIComponent`-encoded before being
9
- * joined into the path. This guarantees two things:
10
- * 1. Different `{userId, name}` tuples cannot collide on disk, so
11
- * one user's conversation cannot leak into another user's context
12
- * in the same app workspace.
13
- * 2. Segments containing `..`, `/`, or other path-control characters
14
- * cannot escape the `events/` root via path traversal.
8
+ * The path is rooted under the fixed `SHARED_CONTEXT_SEGMENT` (`shared`)
9
+ * segment: the reasoning context is intentionally shared by every editor
10
+ * of the app, not partitioned per user. Only the `name` segment is
11
+ * derived from the `ContextId`, and it is `encodeContextPathSegment`-encoded
12
+ * before being joined into the path via `safeJoinUnderRoot`, which guards
13
+ * against `..`, `/`, or other path-control characters escaping the
14
+ * `events/` root via path traversal.
15
15
  *
16
16
  * Writes are append-only (one `appendFile` call per event). Reads
17
17
  * scan backward for the most recent compaction anchor, then return
@@ -19,10 +19,10 @@
19
19
  * are skipped with a warning log, making the format tolerant to
20
20
  * partial writes or manual edits.
21
21
  */
22
- import { readFile, appendFile, mkdir, rm } from "node:fs/promises";
22
+ import { readFile, appendFile, mkdir, rename, rm, writeFile, } from "node:fs/promises";
23
23
  import * as path from "node:path";
24
24
  import { getPrefixedLogger } from "../../../../util/logger.js";
25
- import { encodeContextPathSegment, safeJoinUnderRoot, } from "../../../context-archive-paths.js";
25
+ import { encodeContextPathSegment, safeJoinUnderRoot, SHARED_CONTEXT_SEGMENT, } from "../../../context-archive-paths.js";
26
26
  const logger = getPrefixedLogger("[jsonl-event-store]");
27
27
  /**
28
28
  * Append-only JSONL event store backed by the local filesystem.
@@ -43,10 +43,20 @@ export class JsonlEventStore {
43
43
  *
44
44
  * Creates parent directories if they do not exist. Each call
45
45
  * writes exactly one JSON line terminated by `\n`.
46
+ *
47
+ * `opts.shouldAbort` is re-checked here, between the `mkdir` and the
48
+ * `appendFile`, with no `await` in between: a concurrent clear can
49
+ * finish inside the gap opened by the `mkdir` await above, and this
50
+ * is the last point before the write where that can be caught. An
51
+ * empty recreated directory from the `mkdir` is harmless -- there is
52
+ * no file yet, so `loadMessages` on a missing file returns `[]` and
53
+ * no anchor exists.
46
54
  */
47
- async appendEvent(id, event) {
55
+ async appendEvent(id, event, opts) {
48
56
  const filePath = this.getFilePath(id);
49
57
  await mkdir(path.dirname(filePath), { recursive: true });
58
+ if (opts?.shouldAbort?.())
59
+ return;
50
60
  await appendFile(filePath, JSON.stringify(event) + "\n");
51
61
  }
52
62
  /**
@@ -72,6 +82,79 @@ export class JsonlEventStore {
72
82
  async deleteEvents(id) {
73
83
  await rm(this.getFilePath(id), { force: true });
74
84
  }
85
+ /**
86
+ * Drop every event newer than `sinceTimestamp`, keeping the prefix that
87
+ * existed at or before the checkpoint. See {@link EventStore.truncateAfterTimestamp}.
88
+ *
89
+ * Kept lines are written back verbatim (not re-serialized) so metadata this
90
+ * store does not model is never lost. The rewrite is atomic — a temp file in
91
+ * the same directory plus `rename` — so a process kill mid-write (an OOM/pod
92
+ * eviction on this live dev-server pod) can never leave the log empty or
93
+ * half-written and silently lose the whole conversation.
94
+ */
95
+ async truncateAfterTimestamp(id, sinceTimestamp) {
96
+ const filePath = this.getFilePath(id);
97
+ let raw;
98
+ try {
99
+ raw = await readFile(filePath, "utf-8");
100
+ }
101
+ catch (err) {
102
+ if (err.code === "ENOENT") {
103
+ return 0;
104
+ }
105
+ throw err;
106
+ }
107
+ const contextLabel = `${id.appId}/${id.userId}/${id.name}`;
108
+ const lines = raw.split("\n").filter((line) => line.length > 0);
109
+ const kept = [];
110
+ let dropped = 0;
111
+ for (const line of lines) {
112
+ let timestamp;
113
+ try {
114
+ timestamp = JSON.parse(line).timestamp;
115
+ }
116
+ catch {
117
+ // Unparseable line: keep it (its timestamp is unknown, and dropping a
118
+ // line that might be a compaction anchor could unbound a later load).
119
+ // Mirror loadMessages' policy of warning on corruption without logging
120
+ // the raw payload, which can hold user prompts or tool results.
121
+ logger.warn(`Keeping a corrupted JSONL line during truncation for context '${contextLabel}' (length=${line.length}); its timestamp is unknown`);
122
+ kept.push(line);
123
+ continue;
124
+ }
125
+ if (typeof timestamp !== "number") {
126
+ // Parseable but no usable timestamp — cannot decide if it is newer than
127
+ // the checkpoint, so keep it. Warn: every appended EventLogEntry carries
128
+ // a numeric timestamp, so a missing one signals a malformed write.
129
+ logger.warn(`Keeping an event with no numeric timestamp during truncation for context '${contextLabel}'`);
130
+ kept.push(line);
131
+ continue;
132
+ }
133
+ if (timestamp > sinceTimestamp) {
134
+ dropped++;
135
+ }
136
+ else {
137
+ kept.push(line);
138
+ }
139
+ }
140
+ if (dropped === 0) {
141
+ return 0;
142
+ }
143
+ // Atomic rewrite: write the kept prefix to a sibling temp file, then rename
144
+ // over the original. rename(2) is atomic within a filesystem, so a crash
145
+ // leaves either the old file or the fully-written new one — never a partial.
146
+ const next = kept.length > 0 ? kept.join("\n") + "\n" : "";
147
+ const tmpPath = `${filePath}.tmp`;
148
+ await writeFile(tmpPath, next);
149
+ try {
150
+ await rename(tmpPath, filePath);
151
+ }
152
+ catch (err) {
153
+ await rm(tmpPath, { force: true }).catch(() => { });
154
+ throw err;
155
+ }
156
+ return dropped;
157
+ }
75
158
  /**
76
159
  * Remove the entire `.superblocks/events/` tree under `rootDir`.
77
160
  *
@@ -118,7 +201,7 @@ export class JsonlEventStore {
118
201
  // would otherwise leak into log sinks that don't share the event
119
202
  // store's privacy boundary. Length is enough to debug truncation
120
203
  // patterns without spilling content.
121
- const contextLabel = `${id.appId}/${id.userId}/${id.name}`;
204
+ const contextLabel = `${id.appId}/${id.name}`;
122
205
  const events = [];
123
206
  let corruptedCount = 0;
124
207
  for (let i = 0; i < lines.length; i++) {
@@ -178,7 +261,7 @@ export class JsonlEventStore {
178
261
  }
179
262
  getFilePath(id) {
180
263
  const root = this.getEventsRoot();
181
- return safeJoinUnderRoot(root, encodeContextPathSegment(id.userId, "userId"), `${encodeContextPathSegment(id.name, "name")}.jsonl`);
264
+ return safeJoinUnderRoot(root, SHARED_CONTEXT_SEGMENT, `${encodeContextPathSegment(id.name, "name")}.jsonl`);
182
265
  }
183
266
  }
184
267
  //# sourceMappingURL=jsonl-event-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsonl-event-store.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/jsonl-event-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jsonl-event-store.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/jsonl-event-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * One-time adoption of pre-app-scoping per-user ContextV2 directories.
3
+ *
4
+ * Before the app-scoped layout, each editor's context lived under
5
+ * `.superblocks/context/{userId}/` (event logs under
6
+ * `.superblocks/events/{userId}/`). Warm-pool S3 restore and PVC reuse can
7
+ * put those directories on disk under code that only reads the `shared/`
8
+ * segment, which would silently drop uncommitted conversations at the
9
+ * deploy boundary.
10
+ *
11
+ * Policy:
12
+ * - If `context/shared/` does not exist, move the most recently modified
13
+ * per-user context dir (and that same user's event logs) into `shared/`.
14
+ * - If `context/shared/` already exists and no adoption pass is in flight
15
+ * (no intent marker), adopt nothing from either tree — not even a
16
+ * still-missing `events/shared/` — because the event log is replayed
17
+ * before the context snapshot on load, and grafting a stale per-user
18
+ * event log onto a live shared context would resurrect old conversation
19
+ * content for every editor.
20
+ * - Delete every remaining per-user directory afterward. The deletion is
21
+ * the tombstone: a re-fire after a New Chat clear would resurrect a
22
+ * cleared conversation, and a rollback should read the committed remote
23
+ * rather than stale local state.
24
+ * - Collapsing N per-user threads into one shared thread is lossy by
25
+ * design: latest-modified wins, matching the app-scoped product model.
26
+ * - The winner is moved BEFORE losers are deleted, so a crash mid-pass
27
+ * only leaves cleanup for the next run to finish.
28
+ *
29
+ * Crash safety: the picked winner is pinned in an intent marker
30
+ * (`INTENT_MARKER_FILE`, written directly under `context/`) BEFORE any
31
+ * rename. Each tree
32
+ * (context, events) is then adopted with a single whole-directory rename
33
+ * from the winner's per-user dir straight to its own `shared/` — no
34
+ * per-file loop, so `shared/` is never partially populated. The marker is
35
+ * removed only after both renames and the legacy-dir cleanup finished, and
36
+ * a pass that finds a marker resumes with the recorded winner instead of
37
+ * treating `context/shared/`'s existence as proof the pass completed. A
38
+ * crash between the two renames therefore can neither delete the winner's
39
+ * still-unadopted event log nor pair one user's snapshot with a different
40
+ * user's event log on the retry. A torn marker write can only happen
41
+ * before any rename ran, so an unreadable marker safely degrades to the
42
+ * fresh-pass logic. Without a marker, an existing `context/shared/` wins
43
+ * wholesale, whatever its age, and nothing is adopted.
44
+ */
45
+ export declare function adoptLegacyPerUserContextDirs(rootDir: string): Promise<void>;
46
+ //# sourceMappingURL=legacy-context-adoption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-context-adoption.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/legacy-context-adoption.ts"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA8Ef"}
@@ -0,0 +1,240 @@
1
+ import { mkdir, readdir, readFile, rename, rm, stat, writeFile, } from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { getPrefixedLogger } from "../../../../util/logger.js";
4
+ import { SHARED_CONTEXT_SEGMENT } from "../../../context-archive-paths.js";
5
+ const logger = getPrefixedLogger("[legacy-context-adoption]");
6
+ const SUPERBLOCKS_SYSTEM_DIR = ".superblocks";
7
+ // Written under `context/` before any rename, removed only after the whole
8
+ // pass (both renames + legacy-dir cleanup) has finished. Lives inside the
9
+ // context tree so it travels with it through warm-pool persist/restore and
10
+ // is wiped together with it by a clear-all.
11
+ const INTENT_MARKER_FILE = ".legacy-adoption-intent.json";
12
+ /**
13
+ * One-time adoption of pre-app-scoping per-user ContextV2 directories.
14
+ *
15
+ * Before the app-scoped layout, each editor's context lived under
16
+ * `.superblocks/context/{userId}/` (event logs under
17
+ * `.superblocks/events/{userId}/`). Warm-pool S3 restore and PVC reuse can
18
+ * put those directories on disk under code that only reads the `shared/`
19
+ * segment, which would silently drop uncommitted conversations at the
20
+ * deploy boundary.
21
+ *
22
+ * Policy:
23
+ * - If `context/shared/` does not exist, move the most recently modified
24
+ * per-user context dir (and that same user's event logs) into `shared/`.
25
+ * - If `context/shared/` already exists and no adoption pass is in flight
26
+ * (no intent marker), adopt nothing from either tree — not even a
27
+ * still-missing `events/shared/` — because the event log is replayed
28
+ * before the context snapshot on load, and grafting a stale per-user
29
+ * event log onto a live shared context would resurrect old conversation
30
+ * content for every editor.
31
+ * - Delete every remaining per-user directory afterward. The deletion is
32
+ * the tombstone: a re-fire after a New Chat clear would resurrect a
33
+ * cleared conversation, and a rollback should read the committed remote
34
+ * rather than stale local state.
35
+ * - Collapsing N per-user threads into one shared thread is lossy by
36
+ * design: latest-modified wins, matching the app-scoped product model.
37
+ * - The winner is moved BEFORE losers are deleted, so a crash mid-pass
38
+ * only leaves cleanup for the next run to finish.
39
+ *
40
+ * Crash safety: the picked winner is pinned in an intent marker
41
+ * (`INTENT_MARKER_FILE`, written directly under `context/`) BEFORE any
42
+ * rename. Each tree
43
+ * (context, events) is then adopted with a single whole-directory rename
44
+ * from the winner's per-user dir straight to its own `shared/` — no
45
+ * per-file loop, so `shared/` is never partially populated. The marker is
46
+ * removed only after both renames and the legacy-dir cleanup finished, and
47
+ * a pass that finds a marker resumes with the recorded winner instead of
48
+ * treating `context/shared/`'s existence as proof the pass completed. A
49
+ * crash between the two renames therefore can neither delete the winner's
50
+ * still-unadopted event log nor pair one user's snapshot with a different
51
+ * user's event log on the retry. A torn marker write can only happen
52
+ * before any rename ran, so an unreadable marker safely degrades to the
53
+ * fresh-pass logic. Without a marker, an existing `context/shared/` wins
54
+ * wholesale, whatever its age, and nothing is adopted.
55
+ */
56
+ export async function adoptLegacyPerUserContextDirs(rootDir) {
57
+ const contextRoot = path.join(rootDir, SUPERBLOCKS_SYSTEM_DIR, "context");
58
+ const eventsRoot = path.join(rootDir, SUPERBLOCKS_SYSTEM_DIR, "events");
59
+ const intentPath = path.join(contextRoot, INTENT_MARKER_FILE);
60
+ const legacyContextDirs = await listLegacySubdirs(contextRoot);
61
+ const legacyEventDirs = await listLegacySubdirs(eventsRoot);
62
+ const pendingWinner = await readIntentMarker(intentPath);
63
+ if (legacyContextDirs.length === 0 &&
64
+ legacyEventDirs.length === 0 &&
65
+ pendingWinner === null) {
66
+ return;
67
+ }
68
+ const sharedContextDir = path.join(contextRoot, SHARED_CONTEXT_SEGMENT);
69
+ let winner;
70
+ if (pendingWinner !== null) {
71
+ // Resume an interrupted pass. The marker pins the winner picked before
72
+ // any rename, so recovery finishes the same user's adoption instead of
73
+ // re-picking among the leftover dirs (which could pair one user's
74
+ // snapshot with a different user's event log).
75
+ winner = pendingWinner;
76
+ }
77
+ else if (await exists(sharedContextDir)) {
78
+ winner = null;
79
+ }
80
+ else {
81
+ winner = await pickMostRecentUser(contextRoot, eventsRoot, legacyContextDirs, legacyEventDirs);
82
+ }
83
+ let adoptedContext = false;
84
+ let adoptedEvents = false;
85
+ if (winner !== null) {
86
+ if (pendingWinner === null) {
87
+ await writeIntentMarker(intentPath, winner);
88
+ }
89
+ try {
90
+ adoptedContext = await adoptTree(path.join(contextRoot, winner), sharedContextDir);
91
+ }
92
+ catch (err) {
93
+ // The rename is atomic, so a throw here means nothing has moved yet.
94
+ // Drop the marker before rethrowing: if it survived, a later pass
95
+ // would resume against a context/shared that something else (e.g. a
96
+ // remote restore) created in the meantime and graft the winner's
97
+ // event log onto that unrelated context. A throw from the events
98
+ // adoption below must NOT drop the marker — there the context tree
99
+ // has already moved and the marker is what lets the next pass finish.
100
+ await rm(intentPath, { force: true }).catch((rmErr) => {
101
+ logger.warn(`Failed to remove the adoption intent marker after a failed context adoption: ${rmErr}`);
102
+ });
103
+ throw err;
104
+ }
105
+ adoptedEvents = await adoptTree(path.join(eventsRoot, winner), path.join(eventsRoot, SHARED_CONTEXT_SEGMENT));
106
+ }
107
+ logger.info(`Legacy context adoption complete (adoptedContext=${adoptedContext}, adoptedEvents=${adoptedEvents}, resumed=${pendingWinner !== null}, candidateContextDirs=${legacyContextDirs.length}, candidateEventDirs=${legacyEventDirs.length})`);
108
+ for (const dir of legacyContextDirs) {
109
+ await rm(path.join(contextRoot, dir), { recursive: true, force: true });
110
+ }
111
+ for (const dir of legacyEventDirs) {
112
+ await rm(path.join(eventsRoot, dir), { recursive: true, force: true });
113
+ }
114
+ await rm(intentPath, { force: true });
115
+ }
116
+ /**
117
+ * Reads the winner recorded by an interrupted pass. A missing marker, a
118
+ * torn write, or a value that is not a plain directory name degrades to
119
+ * `null`, i.e. the fresh-pass logic. That is safe because the marker is
120
+ * written before any rename, so torn content means nothing was moved yet.
121
+ * Any other read failure aborts the pass instead: a marker that is present
122
+ * but unreadable may pin a half-done adoption, and running fresh-pass
123
+ * logic over it would delete the recorded winner's still-unadopted event
124
+ * log.
125
+ */
126
+ async function readIntentMarker(intentPath) {
127
+ let raw;
128
+ try {
129
+ raw = await readFile(intentPath, "utf-8");
130
+ }
131
+ catch (err) {
132
+ if (err.code === "ENOENT") {
133
+ return null;
134
+ }
135
+ throw err;
136
+ }
137
+ try {
138
+ const winner = JSON.parse(raw).winner;
139
+ if (typeof winner !== "string" ||
140
+ winner.length === 0 ||
141
+ winner === "." ||
142
+ winner === ".." ||
143
+ winner === SHARED_CONTEXT_SEGMENT ||
144
+ winner !== path.basename(winner)) {
145
+ return null;
146
+ }
147
+ return winner;
148
+ }
149
+ catch {
150
+ return null;
151
+ }
152
+ }
153
+ async function writeIntentMarker(intentPath, winner) {
154
+ await mkdir(path.dirname(intentPath), { recursive: true });
155
+ await writeFile(intentPath, JSON.stringify({ winner }));
156
+ }
157
+ async function listLegacySubdirs(root) {
158
+ try {
159
+ const entries = await readdir(root, { withFileTypes: true });
160
+ return entries
161
+ .filter((e) => e.isDirectory() && e.name !== SHARED_CONTEXT_SEGMENT)
162
+ .map((e) => e.name);
163
+ }
164
+ catch (err) {
165
+ if (err.code === "ENOENT") {
166
+ return [];
167
+ }
168
+ throw err;
169
+ }
170
+ }
171
+ async function exists(target) {
172
+ try {
173
+ await stat(target);
174
+ return true;
175
+ }
176
+ catch {
177
+ return false;
178
+ }
179
+ }
180
+ async function latestMtimeMs(dir) {
181
+ let names;
182
+ try {
183
+ names = await readdir(dir);
184
+ }
185
+ catch {
186
+ return 0;
187
+ }
188
+ let latest = 0;
189
+ for (const name of names) {
190
+ try {
191
+ const s = await stat(path.join(dir, name));
192
+ if (s.isFile() && s.mtimeMs > latest) {
193
+ latest = s.mtimeMs;
194
+ }
195
+ }
196
+ catch {
197
+ // A file disappearing mid-scan just drops out of the comparison.
198
+ }
199
+ }
200
+ return latest;
201
+ }
202
+ async function pickMostRecentUser(contextRoot, eventsRoot, contextDirs, eventDirs) {
203
+ const users = [...new Set([...contextDirs, ...eventDirs])].sort();
204
+ let winner = null;
205
+ let winnerMtime = -1;
206
+ for (const user of users) {
207
+ const mtime = Math.max(await latestMtimeMs(path.join(contextRoot, user)), await latestMtimeMs(path.join(eventsRoot, user)));
208
+ if (mtime > winnerMtime) {
209
+ winnerMtime = mtime;
210
+ winner = user;
211
+ }
212
+ }
213
+ return winner;
214
+ }
215
+ /**
216
+ * Adopts an entire per-user tree into `shared/` with a single atomic
217
+ * rename, rather than a per-file merge. If `destDir` already exists, this
218
+ * tree's adoption is skipped entirely: an existing shared tree wins
219
+ * wholesale, whatever its age, so a live `shared/` never receives a
220
+ * per-file merge that a crash could leave half-applied.
221
+ *
222
+ * Returns whether the rename happened (i.e. there was something to
223
+ * adopt and no destination stood in the way).
224
+ */
225
+ async function adoptTree(srcDir, destDir) {
226
+ if (await exists(destDir)) {
227
+ return false;
228
+ }
229
+ try {
230
+ await rename(srcDir, destDir);
231
+ return true;
232
+ }
233
+ catch (err) {
234
+ if (err.code === "ENOENT") {
235
+ return false;
236
+ }
237
+ throw err;
238
+ }
239
+ }
240
+ //# sourceMappingURL=legacy-context-adoption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-context-adoption.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/legacy-context-adoption.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import type { ContextId } from "./types.js";
5
5
  * Local filesystem storage backend for context records.
6
6
  *
7
7
  * Contexts are stored as JSON files in the following structure:
8
- * {rootDir}/.superblocks/context/{userId}/{contextName}.json
8
+ * {rootDir}/.superblocks/context/shared/{contextName}.json
9
9
  *
10
10
  * This uses the same path structure as V1 for upload/download compatibility.
11
11
  * The migration system handles version detection and migration when loading.
@@ -1 +1 @@
1
- {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/local.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqB5C;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,gBAAgB;IAEhD,QAAQ,CAAC,OAAO,EAAE,MAAM;IADpC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAkB;gBACpC,OAAO,EAAE,MAAM;IAE9B,WAAW,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA+BnD,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BlE,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYxC,OAAO,CAAC,aAAa;YAIP,mBAAmB;IAIjC,OAAO,CAAC,WAAW;CASpB"}
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/local.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqB5C;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,gBAAgB;IAEhD,QAAQ,CAAC,OAAO,EAAE,MAAM;IADpC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAkB;gBACpC,OAAO,EAAE,MAAM;IAE9B,WAAW,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA+BnD,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BlE,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYxC,OAAO,CAAC,aAAa;YAIP,mBAAmB;IAIjC,OAAO,CAAC,WAAW;CASpB"}
@@ -1,6 +1,7 @@
1
1
  import { readFile, writeFile, mkdir, unlink, rm } from "node:fs/promises";
2
2
  import * as path from "node:path";
3
3
  import { getPrefixedLogger } from "../../../../util/logger.js";
4
+ import { SHARED_CONTEXT_SEGMENT } from "../../../context-archive-paths.js";
4
5
  import { recordContextFileBytes } from "../context-metrics.js";
5
6
  const logger = getPrefixedLogger("[context-storage]");
6
7
  /**
@@ -21,7 +22,7 @@ const toMb = (bytes) => (bytes / 1024 / 1024).toFixed(1);
21
22
  * Local filesystem storage backend for context records.
22
23
  *
23
24
  * Contexts are stored as JSON files in the following structure:
24
- * {rootDir}/.superblocks/context/{userId}/{contextName}.json
25
+ * {rootDir}/.superblocks/context/shared/{contextName}.json
25
26
  *
26
27
  * This uses the same path structure as V1 for upload/download compatibility.
27
28
  * The migration system handles version detection and migration when loading.
@@ -117,7 +118,7 @@ export class LocalContextStorageV2 {
117
118
  await mkdir(path.dirname(filePath), { recursive: true });
118
119
  }
119
120
  getFilePath(id) {
120
- return path.join(this.rootDir, this.SUPERBLOCKS_SYSTEM_DIR, "context", id.userId, `${id.name}.json`);
121
+ return path.join(this.rootDir, this.SUPERBLOCKS_SYSTEM_DIR, "context", SHARED_CONTEXT_SEGMENT, `${id.name}.json`);
121
122
  }
122
123
  }
123
124
  //# sourceMappingURL=local.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/local.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/context-v2/storage/local.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,11 @@ export type ContextId = {
11
11
  appId: string;
12
12
  /** Organization identifier, used for telemetry filtering when available. */
13
13
  organizationId?: string;
14
- /** User identifier */
14
+ /**
15
+ * User identifier of the requesting editor. Not part of context identity —
16
+ * contexts are app-scoped, so ids differing only in `userId` name the same
17
+ * context. Retained for log and telemetry attribution.
18
+ */
15
19
  userId: string;
16
20
  /** Context name */
17
21
  name: string;