@zakstam/codex-local-component 0.2.0 → 0.3.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/README.md +33 -3
- package/dist/app-server/client.d.ts +41 -1
- package/dist/app-server/client.d.ts.map +1 -1
- package/dist/app-server/client.js +67 -3
- package/dist/app-server/client.js.map +1 -1
- package/dist/app-server/index.d.ts +1 -1
- package/dist/app-server/index.d.ts.map +1 -1
- package/dist/app-server/index.js +1 -1
- package/dist/app-server/index.js.map +1 -1
- package/dist/client/index.d.ts +4 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/reasoning.d.ts +10 -0
- package/dist/client/reasoning.d.ts.map +1 -0
- package/dist/client/reasoning.js +4 -0
- package/dist/client/reasoning.js.map +1 -0
- package/dist/client/serverRequests.d.ts +14 -0
- package/dist/client/serverRequests.d.ts.map +1 -0
- package/dist/client/serverRequests.js +10 -0
- package/dist/client/serverRequests.js.map +1 -0
- package/dist/client/threads.d.ts +39 -3
- package/dist/client/threads.d.ts.map +1 -1
- package/dist/client/threads.js +18 -0
- package/dist/client/threads.js.map +1 -1
- package/dist/client/types.d.ts +23 -1
- package/dist/client/types.d.ts.map +1 -1
- package/dist/component/_generated/component.d.ts +131 -0
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/approvals.d.ts +1 -1
- package/dist/component/index.d.ts +2 -0
- package/dist/component/index.d.ts.map +1 -1
- package/dist/component/index.js +2 -0
- package/dist/component/index.js.map +1 -1
- package/dist/component/ingest/applyApprovals.d.ts +5 -0
- package/dist/component/ingest/applyApprovals.d.ts.map +1 -0
- package/dist/component/ingest/applyApprovals.js +59 -0
- package/dist/component/ingest/applyApprovals.js.map +1 -0
- package/dist/component/ingest/applyMessages.d.ts +4 -0
- package/dist/component/ingest/applyMessages.d.ts.map +1 -0
- package/dist/component/ingest/applyMessages.js +149 -0
- package/dist/component/ingest/applyMessages.js.map +1 -0
- package/dist/component/ingest/applyStreams.d.ts +7 -0
- package/dist/component/ingest/applyStreams.d.ts.map +1 -0
- package/dist/component/ingest/applyStreams.js +189 -0
- package/dist/component/ingest/applyStreams.js.map +1 -0
- package/dist/component/ingest/applyTurns.d.ts +6 -0
- package/dist/component/ingest/applyTurns.d.ts.map +1 -0
- package/dist/component/ingest/applyTurns.js +94 -0
- package/dist/component/ingest/applyTurns.js.map +1 -0
- package/dist/component/ingest/checkpoints.d.ts +12 -0
- package/dist/component/ingest/checkpoints.d.ts.map +1 -0
- package/dist/component/ingest/checkpoints.js +63 -0
- package/dist/component/ingest/checkpoints.js.map +1 -0
- package/dist/component/ingest/index.d.ts +10 -0
- package/dist/component/ingest/index.d.ts.map +1 -0
- package/dist/component/ingest/index.js +76 -0
- package/dist/component/ingest/index.js.map +1 -0
- package/dist/component/ingest/normalize.d.ts +5 -0
- package/dist/component/ingest/normalize.d.ts.map +1 -0
- package/dist/component/ingest/normalize.js +35 -0
- package/dist/component/ingest/normalize.js.map +1 -0
- package/dist/component/ingest/postIngest.d.ts +4 -0
- package/dist/component/ingest/postIngest.d.ts.map +1 -0
- package/dist/component/ingest/postIngest.js +31 -0
- package/dist/component/ingest/postIngest.js.map +1 -0
- package/dist/component/ingest/sessionGuard.d.ts +9 -0
- package/dist/component/ingest/sessionGuard.d.ts.map +1 -0
- package/dist/component/ingest/sessionGuard.js +102 -0
- package/dist/component/ingest/sessionGuard.js.map +1 -0
- package/dist/component/ingest/stateCache.d.ts +19 -0
- package/dist/component/ingest/stateCache.d.ts.map +1 -0
- package/dist/component/ingest/stateCache.js +121 -0
- package/dist/component/ingest/stateCache.js.map +1 -0
- package/dist/component/ingest/types.d.ts +129 -0
- package/dist/component/ingest/types.d.ts.map +1 -0
- package/dist/component/ingest/types.js +2 -0
- package/dist/component/ingest/types.js.map +1 -0
- package/dist/component/reasoning.d.ts +37 -0
- package/dist/component/reasoning.d.ts.map +1 -0
- package/dist/component/reasoning.js +48 -0
- package/dist/component/reasoning.js.map +1 -0
- package/dist/component/schema.d.ts +105 -11
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +57 -0
- package/dist/component/schema.js.map +1 -1
- package/dist/component/serverRequests.d.ts +53 -0
- package/dist/component/serverRequests.d.ts.map +1 -0
- package/dist/component/serverRequests.js +187 -0
- package/dist/component/serverRequests.js.map +1 -0
- package/dist/component/streamStats.d.ts +10 -0
- package/dist/component/streamStats.d.ts.map +1 -1
- package/dist/component/streamStats.js +34 -0
- package/dist/component/streamStats.js.map +1 -1
- package/dist/component/streams.d.ts +1 -1
- package/dist/component/streams.js +2 -2
- package/dist/component/streams.js.map +1 -1
- package/dist/component/sync.d.ts +4 -22
- package/dist/component/sync.d.ts.map +1 -1
- package/dist/component/sync.js +45 -1
- package/dist/component/sync.js.map +1 -1
- package/dist/component/syncHelpers.d.ts +12 -35
- package/dist/component/syncHelpers.d.ts.map +1 -1
- package/dist/component/syncHelpers.js +11 -228
- package/dist/component/syncHelpers.js.map +1 -1
- package/dist/component/syncIngest.d.ts +4 -44
- package/dist/component/syncIngest.d.ts.map +1 -1
- package/dist/component/syncIngest.js +72 -679
- package/dist/component/syncIngest.js.map +1 -1
- package/dist/component/syncRuntime.d.ts +7 -1
- package/dist/component/syncRuntime.d.ts.map +1 -1
- package/dist/component/syncRuntime.js +8 -2
- package/dist/component/syncRuntime.js.map +1 -1
- package/dist/component/threads.d.ts +38 -0
- package/dist/component/threads.d.ts.map +1 -1
- package/dist/component/threads.js +166 -28
- package/dist/component/threads.js.map +1 -1
- package/dist/component/types.d.ts +5 -1
- package/dist/component/types.d.ts.map +1 -1
- package/dist/component/types.js +2 -0
- package/dist/component/types.js.map +1 -1
- package/dist/component/utils.d.ts.map +1 -1
- package/dist/component/utils.js +4 -3
- package/dist/component/utils.js.map +1 -1
- package/dist/host/convex-entry.d.ts +3 -0
- package/dist/host/convex-entry.d.ts.map +1 -0
- package/dist/host/convex-entry.js +3 -0
- package/dist/host/convex-entry.js.map +1 -0
- package/dist/host/convex.d.ts +102 -0
- package/dist/host/convex.d.ts.map +1 -0
- package/dist/host/convex.js +59 -0
- package/dist/host/convex.js.map +1 -0
- package/dist/host/convexSlice.d.ts +504 -0
- package/dist/host/convexSlice.d.ts.map +1 -0
- package/dist/host/convexSlice.js +315 -0
- package/dist/host/convexSlice.js.map +1 -0
- package/dist/host/index.d.ts +4 -0
- package/dist/host/index.d.ts.map +1 -0
- package/dist/host/index.js +4 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/runtime.d.ts +214 -0
- package/dist/host/runtime.d.ts.map +1 -0
- package/dist/host/runtime.js +616 -0
- package/dist/host/runtime.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/local-adapter/bridge.d.ts +3 -2
- package/dist/local-adapter/bridge.d.ts.map +1 -1
- package/dist/local-adapter/bridge.js.map +1 -1
- package/dist/mapping.d.ts +29 -0
- package/dist/mapping.d.ts.map +1 -1
- package/dist/mapping.js +136 -46
- package/dist/mapping.js.map +1 -1
- package/dist/protocol/classifier.d.ts +2 -12
- package/dist/protocol/classifier.d.ts.map +1 -1
- package/dist/protocol/classifier.js +1 -107
- package/dist/protocol/classifier.js.map +1 -1
- package/dist/protocol/events.d.ts +72 -0
- package/dist/protocol/events.d.ts.map +1 -0
- package/dist/protocol/events.js +533 -0
- package/dist/protocol/events.js.map +1 -0
- package/dist/protocol/generated.d.ts +16 -2
- package/dist/protocol/generated.d.ts.map +1 -1
- package/dist/protocol/index.d.ts +3 -0
- package/dist/protocol/index.d.ts.map +1 -1
- package/dist/protocol/index.js +3 -0
- package/dist/protocol/index.js.map +1 -1
- package/dist/protocol/outbound.d.ts +13 -0
- package/dist/protocol/outbound.d.ts.map +1 -0
- package/dist/protocol/outbound.js +2 -0
- package/dist/protocol/outbound.js.map +1 -0
- package/dist/protocol/parser.d.ts +3 -2
- package/dist/protocol/parser.d.ts.map +1 -1
- package/dist/protocol/parser.js +99 -3
- package/dist/protocol/parser.js.map +1 -1
- package/dist/protocol/schemas/CommandExecutionRequestApprovalResponse.json +72 -0
- package/dist/protocol/schemas/DynamicToolCallResponse.json +66 -0
- package/dist/protocol/schemas/FileChangeRequestApprovalResponse.json +47 -0
- package/dist/protocol/schemas/ToolRequestUserInputResponse.json +34 -0
- package/dist/react/index.d.ts +3 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +2 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/types.d.ts +13 -1
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/useCodexReasoning.d.ts +7 -0
- package/dist/react/useCodexReasoning.d.ts.map +1 -0
- package/dist/react/useCodexReasoning.js +16 -0
- package/dist/react/useCodexReasoning.js.map +1 -0
- package/dist/react/useCodexStreamOverlay.d.ts.map +1 -1
- package/dist/react/useCodexStreamOverlay.js +68 -23
- package/dist/react/useCodexStreamOverlay.js.map +1 -1
- package/dist/react/useCodexStreamingReasoning.d.ts +12 -0
- package/dist/react/useCodexStreamingReasoning.d.ts.map +1 -0
- package/dist/react/useCodexStreamingReasoning.js +21 -0
- package/dist/react/useCodexStreamingReasoning.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { authzError, now, requireThreadForActor } from "../utils.js";
|
|
2
|
+
import { syncError } from "../syncRuntime.js";
|
|
3
|
+
const RECOVERABLE_INGEST_CODES = new Set([
|
|
4
|
+
"E_SYNC_SESSION_NOT_FOUND",
|
|
5
|
+
"E_SYNC_SESSION_THREAD_MISMATCH",
|
|
6
|
+
"E_SYNC_SESSION_DEVICE_MISMATCH",
|
|
7
|
+
]);
|
|
8
|
+
function getErrorMessage(error) {
|
|
9
|
+
return error instanceof Error ? error.message : String(error);
|
|
10
|
+
}
|
|
11
|
+
export function parseSyncErrorCode(error) {
|
|
12
|
+
const message = getErrorMessage(error);
|
|
13
|
+
const match = /^\[([A-Z0-9_]+)\]/.exec(message);
|
|
14
|
+
return match?.[1] ?? null;
|
|
15
|
+
}
|
|
16
|
+
export function mapIngestSafeCode(rawCode) {
|
|
17
|
+
switch (rawCode) {
|
|
18
|
+
case "E_SYNC_SESSION_NOT_FOUND":
|
|
19
|
+
return "SESSION_NOT_FOUND";
|
|
20
|
+
case "E_SYNC_SESSION_THREAD_MISMATCH":
|
|
21
|
+
return "SESSION_THREAD_MISMATCH";
|
|
22
|
+
case "E_SYNC_SESSION_DEVICE_MISMATCH":
|
|
23
|
+
return "SESSION_DEVICE_MISMATCH";
|
|
24
|
+
case "E_SYNC_OUT_OF_ORDER":
|
|
25
|
+
return "OUT_OF_ORDER";
|
|
26
|
+
case "E_SYNC_REPLAY_GAP":
|
|
27
|
+
return "REPLAY_GAP";
|
|
28
|
+
default:
|
|
29
|
+
return "UNKNOWN";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function isRecoverableIngestErrorCode(rawCode) {
|
|
33
|
+
return rawCode ? RECOVERABLE_INGEST_CODES.has(rawCode) : false;
|
|
34
|
+
}
|
|
35
|
+
export function errorMessage(error) {
|
|
36
|
+
return getErrorMessage(error);
|
|
37
|
+
}
|
|
38
|
+
export async function requireBoundSession(ctx, args) {
|
|
39
|
+
await requireThreadForActor(ctx, args.actor, args.threadId);
|
|
40
|
+
const session = await ctx.db
|
|
41
|
+
.query("codex_sessions")
|
|
42
|
+
.withIndex("tenantId_sessionId", (q) => q.eq("tenantId", args.actor.tenantId).eq("sessionId", args.sessionId))
|
|
43
|
+
.first();
|
|
44
|
+
if (!session) {
|
|
45
|
+
syncError("E_SYNC_SESSION_NOT_FOUND", `No active session found for sessionId=${args.sessionId}`);
|
|
46
|
+
}
|
|
47
|
+
if (session.threadId !== args.threadId) {
|
|
48
|
+
syncError("E_SYNC_SESSION_THREAD_MISMATCH", `Session threadId=${session.threadId} does not match request threadId=${args.threadId}`);
|
|
49
|
+
}
|
|
50
|
+
if (session.deviceId !== args.actor.deviceId) {
|
|
51
|
+
syncError("E_SYNC_SESSION_DEVICE_MISMATCH", `Session deviceId=${session.deviceId} does not match actor deviceId=${args.actor.deviceId}`);
|
|
52
|
+
}
|
|
53
|
+
if (session.userId !== args.actor.userId) {
|
|
54
|
+
authzError("E_AUTH_SESSION_FORBIDDEN", `User ${args.actor.userId} is not allowed to access session ${args.sessionId}`);
|
|
55
|
+
}
|
|
56
|
+
return session;
|
|
57
|
+
}
|
|
58
|
+
export async function upsertSessionHeartbeat(ctx, args) {
|
|
59
|
+
await requireThreadForActor(ctx, args.actor, args.threadId);
|
|
60
|
+
const session = await ctx.db
|
|
61
|
+
.query("codex_sessions")
|
|
62
|
+
.withIndex("tenantId_sessionId", (q) => q.eq("tenantId", args.actor.tenantId).eq("sessionId", args.sessionId))
|
|
63
|
+
.first();
|
|
64
|
+
if (!session) {
|
|
65
|
+
await ctx.db.insert("codex_sessions", {
|
|
66
|
+
tenantId: args.actor.tenantId,
|
|
67
|
+
userId: args.actor.userId,
|
|
68
|
+
deviceId: args.actor.deviceId,
|
|
69
|
+
threadId: args.threadId,
|
|
70
|
+
sessionId: args.sessionId,
|
|
71
|
+
status: "active",
|
|
72
|
+
lastHeartbeatAt: now(),
|
|
73
|
+
lastEventCursor: args.lastEventCursor,
|
|
74
|
+
startedAt: now(),
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
sessionId: args.sessionId,
|
|
78
|
+
threadId: args.threadId,
|
|
79
|
+
status: "created",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (session.userId !== args.actor.userId) {
|
|
83
|
+
authzError("E_AUTH_SESSION_FORBIDDEN", `User ${args.actor.userId} is not allowed to access session ${args.sessionId}`);
|
|
84
|
+
}
|
|
85
|
+
if (session.threadId !== args.threadId) {
|
|
86
|
+
syncError("E_SYNC_SESSION_THREAD_MISMATCH", `Session threadId=${session.threadId} does not match request threadId=${args.threadId}`);
|
|
87
|
+
}
|
|
88
|
+
if (session.deviceId !== args.actor.deviceId) {
|
|
89
|
+
syncError("E_SYNC_SESSION_DEVICE_MISMATCH", `Session deviceId=${session.deviceId} does not match actor deviceId=${args.actor.deviceId}`);
|
|
90
|
+
}
|
|
91
|
+
await ctx.db.patch(session._id, {
|
|
92
|
+
status: "active",
|
|
93
|
+
lastHeartbeatAt: now(),
|
|
94
|
+
lastEventCursor: Math.max(args.lastEventCursor, session.lastEventCursor),
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
sessionId: args.sessionId,
|
|
98
|
+
threadId: args.threadId,
|
|
99
|
+
status: "active",
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=sessionGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionGuard.js","sourceRoot":"","sources":["../../../src/component/ingest/sessionGuard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MutationCtx } from "../_generated/server.js";
|
|
2
|
+
import type { CachedApproval, CachedMessage, CachedStream } from "./types.js";
|
|
3
|
+
export type IngestStateCache = {
|
|
4
|
+
nextOrderForTurn: (turnId: string) => Promise<number>;
|
|
5
|
+
getMessageRecord: (turnId: string, messageId: string) => Promise<CachedMessage | null>;
|
|
6
|
+
setMessageRecord: (turnId: string, messageId: string, value: CachedMessage | null) => void;
|
|
7
|
+
getApprovalRecord: (turnId: string, itemId: string) => Promise<CachedApproval | null>;
|
|
8
|
+
setApprovalRecord: (turnId: string, itemId: string, value: CachedApproval | null) => void;
|
|
9
|
+
getStreamRecord: (streamId: string) => Promise<CachedStream | null>;
|
|
10
|
+
setStreamRecord: (streamId: string, value: CachedStream | null) => void;
|
|
11
|
+
queueMessagePatch: (id: string, patch: Record<string, unknown>) => void;
|
|
12
|
+
flushMessagePatches: () => Promise<void>;
|
|
13
|
+
};
|
|
14
|
+
export declare function createIngestStateCache(args: {
|
|
15
|
+
ctx: MutationCtx;
|
|
16
|
+
tenantId: string;
|
|
17
|
+
threadId: string;
|
|
18
|
+
}): IngestStateCache;
|
|
19
|
+
//# sourceMappingURL=stateCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateCache.d.ts","sourceRoot":"","sources":["../../../src/component/ingest/stateCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACvF,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3F,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACtF,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1F,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACpE,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IACxE,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACxE,mBAAmB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,GAAG,EAAE,WAAW,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,gBAAgB,CA+InB"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
export function createIngestStateCache(args) {
|
|
2
|
+
const { ctx, tenantId, threadId } = args;
|
|
3
|
+
const messageOrderCacheByTurn = new Map();
|
|
4
|
+
const messageByKey = new Map();
|
|
5
|
+
const streamById = new Map();
|
|
6
|
+
const approvalByKey = new Map();
|
|
7
|
+
const messagePatchById = new Map();
|
|
8
|
+
const messageKey = (turnId, messageId) => `${tenantId}:${threadId}:${turnId}:${messageId}`;
|
|
9
|
+
const approvalKey = (turnId, itemId) => `${tenantId}:${threadId}:${turnId}:${itemId}`;
|
|
10
|
+
const nextOrderForTurn = async (turnId) => {
|
|
11
|
+
const cached = messageOrderCacheByTurn.get(turnId);
|
|
12
|
+
if (cached !== undefined) {
|
|
13
|
+
messageOrderCacheByTurn.set(turnId, cached + 1);
|
|
14
|
+
return cached;
|
|
15
|
+
}
|
|
16
|
+
const lastMessage = await ctx.db
|
|
17
|
+
.query("codex_messages")
|
|
18
|
+
.withIndex("tenantId_threadId_turnId_orderInTurn", (q) => q.eq("tenantId", tenantId).eq("threadId", threadId).eq("turnId", turnId))
|
|
19
|
+
.order("desc")
|
|
20
|
+
.take(1);
|
|
21
|
+
const next = (lastMessage[0]?.orderInTurn ?? -1) + 1;
|
|
22
|
+
messageOrderCacheByTurn.set(turnId, next + 1);
|
|
23
|
+
return next;
|
|
24
|
+
};
|
|
25
|
+
const getMessageRecord = async (turnId, messageId) => {
|
|
26
|
+
const key = messageKey(turnId, messageId);
|
|
27
|
+
if (messageByKey.has(key)) {
|
|
28
|
+
return messageByKey.get(key) ?? null;
|
|
29
|
+
}
|
|
30
|
+
const existing = await ctx.db
|
|
31
|
+
.query("codex_messages")
|
|
32
|
+
.withIndex("tenantId_threadId_turnId_messageId", (q) => q
|
|
33
|
+
.eq("tenantId", tenantId)
|
|
34
|
+
.eq("threadId", threadId)
|
|
35
|
+
.eq("turnId", turnId)
|
|
36
|
+
.eq("messageId", messageId))
|
|
37
|
+
.first();
|
|
38
|
+
const normalized = existing
|
|
39
|
+
? {
|
|
40
|
+
_id: existing._id,
|
|
41
|
+
status: existing.status,
|
|
42
|
+
text: existing.text,
|
|
43
|
+
}
|
|
44
|
+
: null;
|
|
45
|
+
messageByKey.set(key, normalized);
|
|
46
|
+
return normalized;
|
|
47
|
+
};
|
|
48
|
+
const setMessageRecord = (turnId, messageId, value) => {
|
|
49
|
+
messageByKey.set(messageKey(turnId, messageId), value);
|
|
50
|
+
};
|
|
51
|
+
const getApprovalRecord = async (turnId, itemId) => {
|
|
52
|
+
const key = approvalKey(turnId, itemId);
|
|
53
|
+
if (approvalByKey.has(key)) {
|
|
54
|
+
return approvalByKey.get(key) ?? null;
|
|
55
|
+
}
|
|
56
|
+
const existing = await ctx.db
|
|
57
|
+
.query("codex_approvals")
|
|
58
|
+
.withIndex("tenantId_threadId_turnId_itemId", (q) => q.eq("tenantId", tenantId).eq("threadId", threadId).eq("turnId", turnId).eq("itemId", itemId))
|
|
59
|
+
.first();
|
|
60
|
+
const normalized = existing
|
|
61
|
+
? {
|
|
62
|
+
_id: existing._id,
|
|
63
|
+
status: existing.status,
|
|
64
|
+
}
|
|
65
|
+
: null;
|
|
66
|
+
approvalByKey.set(key, normalized);
|
|
67
|
+
return normalized;
|
|
68
|
+
};
|
|
69
|
+
const setApprovalRecord = (turnId, itemId, value) => {
|
|
70
|
+
approvalByKey.set(approvalKey(turnId, itemId), value);
|
|
71
|
+
};
|
|
72
|
+
const getStreamRecord = async (streamId) => {
|
|
73
|
+
if (streamById.has(streamId)) {
|
|
74
|
+
return streamById.get(streamId) ?? null;
|
|
75
|
+
}
|
|
76
|
+
const stream = await ctx.db
|
|
77
|
+
.query("codex_streams")
|
|
78
|
+
.withIndex("tenantId_streamId", (q) => q.eq("tenantId", tenantId).eq("streamId", streamId))
|
|
79
|
+
.first();
|
|
80
|
+
const normalized = stream
|
|
81
|
+
? {
|
|
82
|
+
_id: stream._id,
|
|
83
|
+
turnId: stream.turnId,
|
|
84
|
+
state: { kind: stream.state.kind },
|
|
85
|
+
}
|
|
86
|
+
: null;
|
|
87
|
+
streamById.set(streamId, normalized);
|
|
88
|
+
return normalized;
|
|
89
|
+
};
|
|
90
|
+
const setStreamRecord = (streamId, value) => {
|
|
91
|
+
streamById.set(streamId, value);
|
|
92
|
+
};
|
|
93
|
+
const queueMessagePatch = (id, patch) => {
|
|
94
|
+
const existing = messagePatchById.get(id);
|
|
95
|
+
if (!existing) {
|
|
96
|
+
messagePatchById.set(id, { ...patch });
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
messagePatchById.set(id, { ...existing, ...patch });
|
|
100
|
+
};
|
|
101
|
+
const flushMessagePatches = async () => {
|
|
102
|
+
if (messagePatchById.size === 0) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const pending = Array.from(messagePatchById.entries());
|
|
106
|
+
messagePatchById.clear();
|
|
107
|
+
await Promise.all(pending.map(([id, patch]) => ctx.db.patch(id, patch)));
|
|
108
|
+
};
|
|
109
|
+
return {
|
|
110
|
+
nextOrderForTurn,
|
|
111
|
+
getMessageRecord,
|
|
112
|
+
setMessageRecord,
|
|
113
|
+
getApprovalRecord,
|
|
114
|
+
setApprovalRecord,
|
|
115
|
+
getStreamRecord,
|
|
116
|
+
setStreamRecord,
|
|
117
|
+
queueMessagePatch,
|
|
118
|
+
flushMessagePatches,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=stateCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateCache.js","sourceRoot":"","sources":["../../../src/component/ingest/stateCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { GenericId } from "convex/values";
|
|
2
|
+
import type { Doc } from "../_generated/dataModel.js";
|
|
3
|
+
import type { MutationCtx } from "../_generated/server.js";
|
|
4
|
+
import type { ApprovalRequest, ApprovalResolution, DurableMessageDeltaFromEvent, DurableMessageFromEvent, ReasoningDeltaFromEvent, TerminalTurnStatus } from "../syncHelpers.js";
|
|
5
|
+
import type { RuntimeOptions, SyncRuntimeInput } from "../syncRuntime.js";
|
|
6
|
+
export type ActorContext = {
|
|
7
|
+
tenantId: string;
|
|
8
|
+
userId: string;
|
|
9
|
+
deviceId: string;
|
|
10
|
+
};
|
|
11
|
+
export type StreamInboundEvent = {
|
|
12
|
+
type: "stream_delta";
|
|
13
|
+
eventId: string;
|
|
14
|
+
turnId: string;
|
|
15
|
+
streamId: string;
|
|
16
|
+
kind: string;
|
|
17
|
+
payloadJson: string;
|
|
18
|
+
cursorStart: number;
|
|
19
|
+
cursorEnd: number;
|
|
20
|
+
createdAt: number;
|
|
21
|
+
};
|
|
22
|
+
export type LifecycleInboundEvent = {
|
|
23
|
+
type: "lifecycle_event";
|
|
24
|
+
eventId: string;
|
|
25
|
+
turnId?: string;
|
|
26
|
+
kind: string;
|
|
27
|
+
payloadJson: string;
|
|
28
|
+
createdAt: number;
|
|
29
|
+
};
|
|
30
|
+
export type InboundEvent = StreamInboundEvent | LifecycleInboundEvent;
|
|
31
|
+
export type PushEventsArgs = {
|
|
32
|
+
actor: ActorContext;
|
|
33
|
+
sessionId: string;
|
|
34
|
+
threadId: string;
|
|
35
|
+
streamDeltas: StreamInboundEvent[];
|
|
36
|
+
lifecycleEvents: LifecycleInboundEvent[];
|
|
37
|
+
runtime?: SyncRuntimeInput;
|
|
38
|
+
};
|
|
39
|
+
export type HeartbeatArgs = {
|
|
40
|
+
actor: ActorContext;
|
|
41
|
+
sessionId: string;
|
|
42
|
+
threadId: string;
|
|
43
|
+
lastEventCursor: number;
|
|
44
|
+
};
|
|
45
|
+
export type EnsureSessionArgs = HeartbeatArgs;
|
|
46
|
+
export type EnsureSessionResult = {
|
|
47
|
+
sessionId: string;
|
|
48
|
+
threadId: string;
|
|
49
|
+
status: "created" | "active";
|
|
50
|
+
};
|
|
51
|
+
export type IngestSafeErrorCode = "SESSION_NOT_FOUND" | "SESSION_THREAD_MISMATCH" | "SESSION_DEVICE_MISMATCH" | "OUT_OF_ORDER" | "REPLAY_GAP" | "UNKNOWN";
|
|
52
|
+
export type IngestSafeArgs = PushEventsArgs & {
|
|
53
|
+
ensureLastEventCursor?: number;
|
|
54
|
+
};
|
|
55
|
+
export type IngestSafeResult = {
|
|
56
|
+
status: "ok" | "partial" | "session_recovered" | "rejected";
|
|
57
|
+
ingestStatus: "ok" | "partial";
|
|
58
|
+
ackedStreams: Array<{
|
|
59
|
+
streamId: string;
|
|
60
|
+
ackCursorEnd: number;
|
|
61
|
+
}>;
|
|
62
|
+
recovery?: {
|
|
63
|
+
action: "session_rebound";
|
|
64
|
+
sessionId: string;
|
|
65
|
+
threadId: string;
|
|
66
|
+
};
|
|
67
|
+
errors: Array<{
|
|
68
|
+
code: IngestSafeErrorCode;
|
|
69
|
+
message: string;
|
|
70
|
+
recoverable: boolean;
|
|
71
|
+
}>;
|
|
72
|
+
};
|
|
73
|
+
export type CachedMessage = {
|
|
74
|
+
_id: GenericId<"codex_messages">;
|
|
75
|
+
status: "streaming" | "completed" | "failed" | "interrupted";
|
|
76
|
+
text: string;
|
|
77
|
+
};
|
|
78
|
+
export type CachedApproval = {
|
|
79
|
+
_id: GenericId<"codex_approvals">;
|
|
80
|
+
status: "pending" | "accepted" | "declined";
|
|
81
|
+
};
|
|
82
|
+
export type CachedStream = {
|
|
83
|
+
_id: GenericId<"codex_streams">;
|
|
84
|
+
turnId: string;
|
|
85
|
+
state: {
|
|
86
|
+
kind: "streaming" | "finished" | "aborted";
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
export type IngestSession = Doc<"codex_sessions">;
|
|
90
|
+
export type IngestStreamStatsState = {
|
|
91
|
+
persistedStatsByStreamId: Map<string, {
|
|
92
|
+
threadId: string;
|
|
93
|
+
turnId: string;
|
|
94
|
+
latestCursor: number;
|
|
95
|
+
deltaCount: number;
|
|
96
|
+
}>;
|
|
97
|
+
expectedCursorByStreamId: Map<string, number>;
|
|
98
|
+
streamCheckpointCursorByStreamId: Map<string, number>;
|
|
99
|
+
};
|
|
100
|
+
export type IngestCollectedState = {
|
|
101
|
+
inBatchEventIds: Set<string>;
|
|
102
|
+
knownTurnIds: Set<string>;
|
|
103
|
+
startedTurns: Set<string>;
|
|
104
|
+
terminalTurns: Map<string, TerminalTurnStatus>;
|
|
105
|
+
terminalByStream: Map<string, TerminalTurnStatus>;
|
|
106
|
+
pendingApprovals: Map<string, ApprovalRequest>;
|
|
107
|
+
resolvedApprovals: Map<string, ApprovalResolution>;
|
|
108
|
+
};
|
|
109
|
+
export type NormalizedInboundEvent = InboundEvent & {
|
|
110
|
+
syntheticTurnStatus: "queued" | "inProgress" | "completed" | "interrupted" | "failed";
|
|
111
|
+
terminalTurnStatus: TerminalTurnStatus | null;
|
|
112
|
+
approvalRequest: ApprovalRequest | null;
|
|
113
|
+
approvalResolution: ApprovalResolution | null;
|
|
114
|
+
durableMessage: DurableMessageFromEvent | null;
|
|
115
|
+
durableDelta: DurableMessageDeltaFromEvent | null;
|
|
116
|
+
reasoningDelta: ReasoningDeltaFromEvent | null;
|
|
117
|
+
};
|
|
118
|
+
export type IngestContext = {
|
|
119
|
+
ctx: MutationCtx;
|
|
120
|
+
args: PushEventsArgs;
|
|
121
|
+
runtime: RuntimeOptions;
|
|
122
|
+
session: IngestSession;
|
|
123
|
+
collected: IngestCollectedState;
|
|
124
|
+
streamState: IngestStreamStatsState;
|
|
125
|
+
lastPersistedCursor: number;
|
|
126
|
+
persistedAnyEvent: boolean;
|
|
127
|
+
ingestStatus: "ok" | "partial";
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/component/ingest/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/component/ingest/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare const listByThread: import("convex/server").RegisteredQuery<"public", {
|
|
2
|
+
includeRaw?: boolean;
|
|
3
|
+
threadId: string;
|
|
4
|
+
actor: {
|
|
5
|
+
tenantId: string;
|
|
6
|
+
userId: string;
|
|
7
|
+
deviceId: string;
|
|
8
|
+
};
|
|
9
|
+
paginationOpts: {
|
|
10
|
+
id?: number;
|
|
11
|
+
endCursor?: string | null;
|
|
12
|
+
maximumRowsRead?: number;
|
|
13
|
+
maximumBytesRead?: number;
|
|
14
|
+
numItems: number;
|
|
15
|
+
cursor: string | null;
|
|
16
|
+
};
|
|
17
|
+
}, Promise<{
|
|
18
|
+
page: {
|
|
19
|
+
cursorStart: number;
|
|
20
|
+
cursorEnd: number;
|
|
21
|
+
createdAt: number;
|
|
22
|
+
contentIndex?: number;
|
|
23
|
+
summaryIndex?: number;
|
|
24
|
+
segmentId: string;
|
|
25
|
+
eventId: string;
|
|
26
|
+
turnId: string;
|
|
27
|
+
itemId: string;
|
|
28
|
+
channel: "summary" | "raw";
|
|
29
|
+
segmentType: "textDelta" | "sectionBreak";
|
|
30
|
+
text: string;
|
|
31
|
+
}[];
|
|
32
|
+
isDone: boolean;
|
|
33
|
+
continueCursor: import("convex/server").Cursor;
|
|
34
|
+
splitCursor?: import("convex/server").Cursor | null;
|
|
35
|
+
pageStatus?: "SplitRecommended" | "SplitRequired" | null;
|
|
36
|
+
}>>;
|
|
37
|
+
//# sourceMappingURL=reasoning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning.d.ts","sourceRoot":"","sources":["../../src/component/reasoning.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DvB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { paginationOptsValidator } from "convex/server";
|
|
2
|
+
import { v } from "convex/values";
|
|
3
|
+
import { query } from "./_generated/server.js";
|
|
4
|
+
import { decodeKeysetCursor, keysetPageResult } from "./pagination.js";
|
|
5
|
+
import { vActorContext } from "./types.js";
|
|
6
|
+
import { requireThreadForActor } from "./utils.js";
|
|
7
|
+
export const listByThread = query({
|
|
8
|
+
args: {
|
|
9
|
+
actor: vActorContext,
|
|
10
|
+
threadId: v.string(),
|
|
11
|
+
paginationOpts: paginationOptsValidator,
|
|
12
|
+
includeRaw: v.optional(v.boolean()),
|
|
13
|
+
},
|
|
14
|
+
handler: async (ctx, args) => {
|
|
15
|
+
await requireThreadForActor(ctx, args.actor, args.threadId);
|
|
16
|
+
const cursor = decodeKeysetCursor(args.paginationOpts.cursor);
|
|
17
|
+
const scanned = await ctx.db
|
|
18
|
+
.query("codex_reasoning_segments")
|
|
19
|
+
.withIndex("tenantId_threadId_createdAt_segmentId", (q) => q.eq("tenantId", args.actor.tenantId).eq("threadId", args.threadId))
|
|
20
|
+
.filter((q) => q.and(cursor
|
|
21
|
+
? q.or(q.lt(q.field("createdAt"), cursor.createdAt), q.and(q.eq(q.field("createdAt"), cursor.createdAt), q.lt(q.field("segmentId"), cursor.segmentId)))
|
|
22
|
+
: q.eq(q.field("tenantId"), args.actor.tenantId), args.includeRaw ? q.eq(q.field("tenantId"), args.actor.tenantId) : q.eq(q.field("channel"), "summary")))
|
|
23
|
+
.order("desc")
|
|
24
|
+
.take(args.paginationOpts.numItems + 1);
|
|
25
|
+
const result = keysetPageResult(scanned, args.paginationOpts, (segment) => ({
|
|
26
|
+
createdAt: Number(segment.createdAt),
|
|
27
|
+
segmentId: String(segment.segmentId),
|
|
28
|
+
}));
|
|
29
|
+
return {
|
|
30
|
+
...result,
|
|
31
|
+
page: result.page.map((segment) => ({
|
|
32
|
+
segmentId: String(segment.segmentId),
|
|
33
|
+
eventId: String(segment.eventId),
|
|
34
|
+
turnId: String(segment.turnId),
|
|
35
|
+
itemId: String(segment.itemId),
|
|
36
|
+
channel: segment.channel,
|
|
37
|
+
segmentType: segment.segmentType,
|
|
38
|
+
text: String(segment.text),
|
|
39
|
+
...(typeof segment.summaryIndex === "number" ? { summaryIndex: Number(segment.summaryIndex) } : {}),
|
|
40
|
+
...(typeof segment.contentIndex === "number" ? { contentIndex: Number(segment.contentIndex) } : {}),
|
|
41
|
+
cursorStart: Number(segment.cursorStart),
|
|
42
|
+
cursorEnd: Number(segment.cursorEnd),
|
|
43
|
+
createdAt: Number(segment.createdAt),
|
|
44
|
+
})),
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=reasoning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reasoning.js","sourceRoot":"","sources":["../../src/component/reasoning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC;IAChC,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,cAAc,EAAE,uBAAuB;QACvC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KACpC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,kBAAkB,CAC/B,IAAI,CAAC,cAAc,CAAC,MAAM,CAC3B,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;aACzB,KAAK,CAAC,0BAA0B,CAAC;aACjC,SAAS,CAAC,uCAAuC,EAAE,CAAC,CAAC,EAAE,EAAE,CACxD,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CACpE;aACA,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACZ,CAAC,CAAC,GAAG,CACH,MAAM;YACJ,CAAC,CAAC,CAAC,CAAC,EAAE,CACF,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,EAC5C,CAAC,CAAC,GAAG,CACH,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,EAC5C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAC7C,CACF;YACH,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAClD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CACvG,CACF;aACA,KAAK,CAAC,MAAM,CAAC;aACb,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC1E,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;YACpC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;SACrC,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAClC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;gBACpC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;gBAChC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC9B,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC1B,GAAG,CAAC,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnG,GAAG,CAAC,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnG,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;gBACxC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;gBACpC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;aACrC,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|