@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.
- package/dist/ai-service/agent/middleware.d.ts.map +1 -1
- package/dist/ai-service/agent/middleware.js +10 -1
- package/dist/ai-service/agent/middleware.js.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js +25 -6
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.js +7 -2
- package/dist/ai-service/agent/prompts/build-security-scan-prompt.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-sdk-api-docs.d.ts +47 -1
- package/dist/ai-service/agent/tools/apis/get-sdk-api-docs.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-sdk-api-docs.js +129 -15
- package/dist/ai-service/agent/tools/apis/get-sdk-api-docs.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +1 -24
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.d.ts +53 -9
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.js +304 -67
- package/dist/ai-service/agent/tools/databases/dev-database-tasks.js.map +1 -1
- package/dist/ai-service/agent/tools/databases/dev-database-tools.d.ts +47 -1
- package/dist/ai-service/agent/tools/databases/dev-database-tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/databases/dev-database-tools.js +38 -1
- package/dist/ai-service/agent/tools/databases/dev-database-tools.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts +391 -0
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.js +257 -44
- package/dist/ai-service/agent/tools/integrations/execute-request.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/index.d.ts +1 -1
- package/dist/ai-service/agent/tools/integrations/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/index.js +1 -1
- package/dist/ai-service/agent/tools/integrations/index.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/managed-app-database.d.ts +16 -0
- package/dist/ai-service/agent/tools/integrations/managed-app-database.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/integrations/managed-app-database.js +31 -0
- package/dist/ai-service/agent/tools/integrations/managed-app-database.js.map +1 -0
- package/dist/ai-service/agent/tools/integrations/sql-classification.d.ts +44 -0
- package/dist/ai-service/agent/tools/integrations/sql-classification.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/integrations/sql-classification.js +352 -0
- package/dist/ai-service/agent/tools/integrations/sql-classification.js.map +1 -0
- package/dist/ai-service/agent/tools/report-security-findings.d.ts +5 -5
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +5 -1
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/registry.js +2 -0
- package/dist/ai-service/agent/tools2/registry.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/check-task.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/check-task.js +4 -1
- package/dist/ai-service/agent/tools2/tools/check-task.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +12 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/wait-for-task.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/wait-for-task.js +5 -1
- package/dist/ai-service/agent/tools2/tools/wait-for-task.js.map +1 -1
- package/dist/ai-service/chat/chat-session-store.d.ts +10 -1
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +65 -15
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/context-archive-paths.d.ts +7 -0
- package/dist/ai-service/context-archive-paths.d.ts.map +1 -1
- package/dist/ai-service/context-archive-paths.js +7 -0
- package/dist/ai-service/context-archive-paths.js.map +1 -1
- package/dist/ai-service/context-download.d.ts.map +1 -1
- package/dist/ai-service/context-download.js +8 -10
- package/dist/ai-service/context-download.js.map +1 -1
- package/dist/ai-service/context-flush.d.ts +36 -0
- package/dist/ai-service/context-flush.d.ts.map +1 -0
- package/dist/ai-service/context-flush.js +90 -0
- package/dist/ai-service/context-flush.js.map +1 -0
- package/dist/ai-service/context-restore.d.ts +64 -0
- package/dist/ai-service/context-restore.d.ts.map +1 -0
- package/dist/ai-service/context-restore.js +136 -0
- package/dist/ai-service/context-restore.js.map +1 -0
- package/dist/ai-service/context-upload.d.ts +13 -4
- package/dist/ai-service/context-upload.d.ts.map +1 -1
- package/dist/ai-service/context-upload.js +28 -18
- package/dist/ai-service/context-upload.js.map +1 -1
- package/dist/ai-service/dev-database-client.d.ts +51 -0
- package/dist/ai-service/dev-database-client.d.ts.map +1 -1
- package/dist/ai-service/dev-database-client.js +3 -0
- package/dist/ai-service/dev-database-client.js.map +1 -1
- package/dist/ai-service/index.d.ts +19 -0
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +449 -182
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/adapter.js +1 -0
- package/dist/ai-service/llm/context-v2/adapter.js.map +1 -1
- package/dist/ai-service/llm/context-v2/compaction/client-side.d.ts +30 -0
- package/dist/ai-service/llm/context-v2/compaction/client-side.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/compaction/client-side.js +77 -4
- package/dist/ai-service/llm/context-v2/compaction/client-side.js.map +1 -1
- package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.d.ts +5 -0
- package/dist/ai-service/llm/context-v2/compaction/compaction-strategy.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts +1 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/compaction/server-side.js +3 -0
- package/dist/ai-service/llm/context-v2/compaction/server-side.js.map +1 -1
- package/dist/ai-service/llm/context-v2/compactor.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/compactor.js +57 -6
- package/dist/ai-service/llm/context-v2/compactor.js.map +1 -1
- package/dist/ai-service/llm/context-v2/config.d.ts +13 -1
- package/dist/ai-service/llm/context-v2/config.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/config.js +39 -2
- package/dist/ai-service/llm/context-v2/config.js.map +1 -1
- package/dist/ai-service/llm/context-v2/context-metrics.d.ts +23 -0
- package/dist/ai-service/llm/context-v2/context-metrics.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context-metrics.js +52 -1
- package/dist/ai-service/llm/context-v2/context-metrics.js.map +1 -1
- package/dist/ai-service/llm/context-v2/context.d.ts +27 -3
- package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/context.js +107 -10
- package/dist/ai-service/llm/context-v2/context.js.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.d.ts +66 -0
- package/dist/ai-service/llm/context-v2/manager.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/manager.js +194 -2
- package/dist/ai-service/llm/context-v2/manager.js.map +1 -1
- package/dist/ai-service/llm/context-v2/storage/event-store.d.ts +31 -5
- package/dist/ai-service/llm/context-v2/storage/event-store.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.d.ts +30 -9
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.js +96 -13
- package/dist/ai-service/llm/context-v2/storage/jsonl-event-store.js.map +1 -1
- package/dist/ai-service/llm/context-v2/storage/legacy-context-adoption.d.ts +46 -0
- package/dist/ai-service/llm/context-v2/storage/legacy-context-adoption.d.ts.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/legacy-context-adoption.js +240 -0
- package/dist/ai-service/llm/context-v2/storage/legacy-context-adoption.js.map +1 -0
- package/dist/ai-service/llm/context-v2/storage/local.d.ts +1 -1
- package/dist/ai-service/llm/context-v2/storage/local.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/storage/local.js +3 -2
- package/dist/ai-service/llm/context-v2/storage/local.js.map +1 -1
- package/dist/ai-service/llm/context-v2/types.d.ts +5 -1
- package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
- package/dist/ai-service/llm/context-v2/types.js.map +1 -1
- package/dist/ai-service/llm/stream/config.d.ts +4 -3
- package/dist/ai-service/llm/stream/config.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/config.js.map +1 -1
- package/dist/ai-service/llm/stream/idle-monitor.d.ts +37 -4
- package/dist/ai-service/llm/stream/idle-monitor.d.ts.map +1 -1
- package/dist/ai-service/llm/stream/idle-monitor.js +38 -3
- package/dist/ai-service/llm/stream/idle-monitor.js.map +1 -1
- package/dist/ai-service/policy-agent-metrics.d.ts +18 -0
- package/dist/ai-service/policy-agent-metrics.d.ts.map +1 -0
- package/dist/ai-service/policy-agent-metrics.js +99 -0
- package/dist/ai-service/policy-agent-metrics.js.map +1 -0
- package/dist/ai-service/state-machine/clark-fsm.d.ts +9 -0
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/prompt-request-metrics.d.ts +9 -0
- package/dist/ai-service/state-machine/helpers/prompt-request-metrics.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/prompt-request-metrics.js +27 -0
- package/dist/ai-service/state-machine/helpers/prompt-request-metrics.js.map +1 -1
- package/dist/ai-service/tasks/factory.d.ts +7 -0
- package/dist/ai-service/tasks/factory.d.ts.map +1 -1
- package/dist/ai-service/tasks/factory.js +5 -0
- package/dist/ai-service/tasks/factory.js.map +1 -1
- package/dist/ai-service/tasks/task-store.d.ts +11 -1
- package/dist/ai-service/tasks/task-store.d.ts.map +1 -1
- package/dist/ai-service/tasks/task-store.js +104 -29
- package/dist/ai-service/tasks/task-store.js.map +1 -1
- package/dist/ai-service/tasks/types.d.ts +9 -1
- package/dist/ai-service/tasks/types.d.ts.map +1 -1
- package/dist/extract-api-integrations.d.ts +76 -0
- package/dist/extract-api-integrations.d.ts.map +1 -1
- package/dist/extract-api-integrations.js +428 -109
- package/dist/extract-api-integrations.js.map +1 -1
- package/dist/file-sync-vite-plugin.d.ts +1 -1
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +42 -79
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/file-system-helpers.d.ts +1 -1
- package/dist/file-system-helpers.d.ts.map +1 -1
- package/dist/file-system-helpers.js +1 -0
- package/dist/file-system-helpers.js.map +1 -1
- package/dist/git-auth-state.d.ts +4 -0
- package/dist/git-auth-state.d.ts.map +1 -0
- package/dist/git-auth-state.js +25 -0
- package/dist/git-auth-state.js.map +1 -0
- package/dist/git-service/checkpoint-commit-metrics.d.ts +2 -0
- package/dist/git-service/checkpoint-commit-metrics.d.ts.map +1 -0
- package/dist/git-service/checkpoint-commit-metrics.js +15 -0
- package/dist/git-service/checkpoint-commit-metrics.js.map +1 -0
- package/dist/git-service/checkpoint-committer.d.ts +22 -0
- package/dist/git-service/checkpoint-committer.d.ts.map +1 -0
- package/dist/git-service/checkpoint-committer.js +91 -0
- package/dist/git-service/checkpoint-committer.js.map +1 -0
- package/dist/git-service/commit-live-branch.d.ts +17 -0
- package/dist/git-service/commit-live-branch.d.ts.map +1 -0
- package/dist/git-service/commit-live-branch.js +28 -0
- package/dist/git-service/commit-live-branch.js.map +1 -0
- package/dist/git-service/provider-workflow-files.d.ts +12 -0
- package/dist/git-service/provider-workflow-files.d.ts.map +1 -0
- package/dist/git-service/provider-workflow-files.js +36 -0
- package/dist/git-service/provider-workflow-files.js.map +1 -0
- package/dist/plugin-options.d.ts +8 -0
- package/dist/plugin-options.d.ts.map +1 -1
- package/dist/plugin-options.js.map +1 -1
- package/dist/policy-gate-runner.d.ts.map +1 -1
- package/dist/policy-gate-runner.js +7 -9
- package/dist/policy-gate-runner.js.map +1 -1
- package/dist/server-rpc/client.d.ts.map +1 -1
- package/dist/server-rpc/client.js +2 -0
- package/dist/server-rpc/client.js.map +1 -1
- package/dist/server-rpc/index.d.ts +43 -1
- package/dist/server-rpc/index.d.ts.map +1 -1
- package/dist/server-rpc/index.js +143 -5
- package/dist/server-rpc/index.js.map +1 -1
- package/dist/server-rpc/request-abort-context.d.ts +3 -0
- package/dist/server-rpc/request-abort-context.d.ts.map +1 -0
- package/dist/server-rpc/request-abort-context.js +23 -0
- package/dist/server-rpc/request-abort-context.js.map +1 -0
- package/dist/server-rpc/rpc-invalidate-metrics.d.ts +20 -0
- package/dist/server-rpc/rpc-invalidate-metrics.d.ts.map +1 -0
- package/dist/server-rpc/rpc-invalidate-metrics.js +86 -0
- package/dist/server-rpc/rpc-invalidate-metrics.js.map +1 -0
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +21 -60
- package/dist/socket-manager.js.map +1 -1
- package/dist/sync-service/index.d.ts +26 -2
- package/dist/sync-service/index.d.ts.map +1 -1
- package/dist/sync-service/index.js +74 -37
- package/dist/sync-service/index.js.map +1 -1
- 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/
|
|
6
|
+
* `{rootDir}/.superblocks/events/shared/{name}.jsonl`.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
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
|
|
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;
|
|
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/
|
|
6
|
+
* `{rootDir}/.superblocks/events/shared/{name}.jsonl`.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
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.
|
|
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,
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,
|
|
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/
|
|
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":"
|
|
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/
|
|
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",
|
|
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
|
-
/**
|
|
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;
|