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