@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.
Files changed (199) hide show
  1. package/README.md +33 -3
  2. package/dist/app-server/client.d.ts +41 -1
  3. package/dist/app-server/client.d.ts.map +1 -1
  4. package/dist/app-server/client.js +67 -3
  5. package/dist/app-server/client.js.map +1 -1
  6. package/dist/app-server/index.d.ts +1 -1
  7. package/dist/app-server/index.d.ts.map +1 -1
  8. package/dist/app-server/index.js +1 -1
  9. package/dist/app-server/index.js.map +1 -1
  10. package/dist/client/index.d.ts +4 -2
  11. package/dist/client/index.d.ts.map +1 -1
  12. package/dist/client/index.js +3 -1
  13. package/dist/client/index.js.map +1 -1
  14. package/dist/client/reasoning.d.ts +10 -0
  15. package/dist/client/reasoning.d.ts.map +1 -0
  16. package/dist/client/reasoning.js +4 -0
  17. package/dist/client/reasoning.js.map +1 -0
  18. package/dist/client/serverRequests.d.ts +14 -0
  19. package/dist/client/serverRequests.d.ts.map +1 -0
  20. package/dist/client/serverRequests.js +10 -0
  21. package/dist/client/serverRequests.js.map +1 -0
  22. package/dist/client/threads.d.ts +39 -3
  23. package/dist/client/threads.d.ts.map +1 -1
  24. package/dist/client/threads.js +18 -0
  25. package/dist/client/threads.js.map +1 -1
  26. package/dist/client/types.d.ts +23 -1
  27. package/dist/client/types.d.ts.map +1 -1
  28. package/dist/component/_generated/component.d.ts +131 -0
  29. package/dist/component/_generated/component.d.ts.map +1 -1
  30. package/dist/component/approvals.d.ts +1 -1
  31. package/dist/component/index.d.ts +2 -0
  32. package/dist/component/index.d.ts.map +1 -1
  33. package/dist/component/index.js +2 -0
  34. package/dist/component/index.js.map +1 -1
  35. package/dist/component/ingest/applyApprovals.d.ts +5 -0
  36. package/dist/component/ingest/applyApprovals.d.ts.map +1 -0
  37. package/dist/component/ingest/applyApprovals.js +59 -0
  38. package/dist/component/ingest/applyApprovals.js.map +1 -0
  39. package/dist/component/ingest/applyMessages.d.ts +4 -0
  40. package/dist/component/ingest/applyMessages.d.ts.map +1 -0
  41. package/dist/component/ingest/applyMessages.js +149 -0
  42. package/dist/component/ingest/applyMessages.js.map +1 -0
  43. package/dist/component/ingest/applyStreams.d.ts +7 -0
  44. package/dist/component/ingest/applyStreams.d.ts.map +1 -0
  45. package/dist/component/ingest/applyStreams.js +189 -0
  46. package/dist/component/ingest/applyStreams.js.map +1 -0
  47. package/dist/component/ingest/applyTurns.d.ts +6 -0
  48. package/dist/component/ingest/applyTurns.d.ts.map +1 -0
  49. package/dist/component/ingest/applyTurns.js +94 -0
  50. package/dist/component/ingest/applyTurns.js.map +1 -0
  51. package/dist/component/ingest/checkpoints.d.ts +12 -0
  52. package/dist/component/ingest/checkpoints.d.ts.map +1 -0
  53. package/dist/component/ingest/checkpoints.js +63 -0
  54. package/dist/component/ingest/checkpoints.js.map +1 -0
  55. package/dist/component/ingest/index.d.ts +10 -0
  56. package/dist/component/ingest/index.d.ts.map +1 -0
  57. package/dist/component/ingest/index.js +76 -0
  58. package/dist/component/ingest/index.js.map +1 -0
  59. package/dist/component/ingest/normalize.d.ts +5 -0
  60. package/dist/component/ingest/normalize.d.ts.map +1 -0
  61. package/dist/component/ingest/normalize.js +35 -0
  62. package/dist/component/ingest/normalize.js.map +1 -0
  63. package/dist/component/ingest/postIngest.d.ts +4 -0
  64. package/dist/component/ingest/postIngest.d.ts.map +1 -0
  65. package/dist/component/ingest/postIngest.js +31 -0
  66. package/dist/component/ingest/postIngest.js.map +1 -0
  67. package/dist/component/ingest/sessionGuard.d.ts +9 -0
  68. package/dist/component/ingest/sessionGuard.d.ts.map +1 -0
  69. package/dist/component/ingest/sessionGuard.js +102 -0
  70. package/dist/component/ingest/sessionGuard.js.map +1 -0
  71. package/dist/component/ingest/stateCache.d.ts +19 -0
  72. package/dist/component/ingest/stateCache.d.ts.map +1 -0
  73. package/dist/component/ingest/stateCache.js +121 -0
  74. package/dist/component/ingest/stateCache.js.map +1 -0
  75. package/dist/component/ingest/types.d.ts +129 -0
  76. package/dist/component/ingest/types.d.ts.map +1 -0
  77. package/dist/component/ingest/types.js +2 -0
  78. package/dist/component/ingest/types.js.map +1 -0
  79. package/dist/component/reasoning.d.ts +37 -0
  80. package/dist/component/reasoning.d.ts.map +1 -0
  81. package/dist/component/reasoning.js +48 -0
  82. package/dist/component/reasoning.js.map +1 -0
  83. package/dist/component/schema.d.ts +105 -11
  84. package/dist/component/schema.d.ts.map +1 -1
  85. package/dist/component/schema.js +57 -0
  86. package/dist/component/schema.js.map +1 -1
  87. package/dist/component/serverRequests.d.ts +53 -0
  88. package/dist/component/serverRequests.d.ts.map +1 -0
  89. package/dist/component/serverRequests.js +187 -0
  90. package/dist/component/serverRequests.js.map +1 -0
  91. package/dist/component/streamStats.d.ts +10 -0
  92. package/dist/component/streamStats.d.ts.map +1 -1
  93. package/dist/component/streamStats.js +34 -0
  94. package/dist/component/streamStats.js.map +1 -1
  95. package/dist/component/streams.d.ts +1 -1
  96. package/dist/component/streams.js +2 -2
  97. package/dist/component/streams.js.map +1 -1
  98. package/dist/component/sync.d.ts +4 -22
  99. package/dist/component/sync.d.ts.map +1 -1
  100. package/dist/component/sync.js +45 -1
  101. package/dist/component/sync.js.map +1 -1
  102. package/dist/component/syncHelpers.d.ts +12 -35
  103. package/dist/component/syncHelpers.d.ts.map +1 -1
  104. package/dist/component/syncHelpers.js +11 -228
  105. package/dist/component/syncHelpers.js.map +1 -1
  106. package/dist/component/syncIngest.d.ts +4 -44
  107. package/dist/component/syncIngest.d.ts.map +1 -1
  108. package/dist/component/syncIngest.js +72 -679
  109. package/dist/component/syncIngest.js.map +1 -1
  110. package/dist/component/syncRuntime.d.ts +7 -1
  111. package/dist/component/syncRuntime.d.ts.map +1 -1
  112. package/dist/component/syncRuntime.js +8 -2
  113. package/dist/component/syncRuntime.js.map +1 -1
  114. package/dist/component/threads.d.ts +38 -0
  115. package/dist/component/threads.d.ts.map +1 -1
  116. package/dist/component/threads.js +166 -28
  117. package/dist/component/threads.js.map +1 -1
  118. package/dist/component/types.d.ts +5 -1
  119. package/dist/component/types.d.ts.map +1 -1
  120. package/dist/component/types.js +2 -0
  121. package/dist/component/types.js.map +1 -1
  122. package/dist/component/utils.d.ts.map +1 -1
  123. package/dist/component/utils.js +4 -3
  124. package/dist/component/utils.js.map +1 -1
  125. package/dist/host/convex-entry.d.ts +3 -0
  126. package/dist/host/convex-entry.d.ts.map +1 -0
  127. package/dist/host/convex-entry.js +3 -0
  128. package/dist/host/convex-entry.js.map +1 -0
  129. package/dist/host/convex.d.ts +102 -0
  130. package/dist/host/convex.d.ts.map +1 -0
  131. package/dist/host/convex.js +59 -0
  132. package/dist/host/convex.js.map +1 -0
  133. package/dist/host/convexSlice.d.ts +504 -0
  134. package/dist/host/convexSlice.d.ts.map +1 -0
  135. package/dist/host/convexSlice.js +315 -0
  136. package/dist/host/convexSlice.js.map +1 -0
  137. package/dist/host/index.d.ts +4 -0
  138. package/dist/host/index.d.ts.map +1 -0
  139. package/dist/host/index.js +4 -0
  140. package/dist/host/index.js.map +1 -0
  141. package/dist/host/runtime.d.ts +214 -0
  142. package/dist/host/runtime.d.ts.map +1 -0
  143. package/dist/host/runtime.js +616 -0
  144. package/dist/host/runtime.js.map +1 -0
  145. package/dist/index.d.ts +1 -0
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +1 -0
  148. package/dist/index.js.map +1 -1
  149. package/dist/local-adapter/bridge.d.ts +3 -2
  150. package/dist/local-adapter/bridge.d.ts.map +1 -1
  151. package/dist/local-adapter/bridge.js.map +1 -1
  152. package/dist/mapping.d.ts +29 -0
  153. package/dist/mapping.d.ts.map +1 -1
  154. package/dist/mapping.js +136 -46
  155. package/dist/mapping.js.map +1 -1
  156. package/dist/protocol/classifier.d.ts +2 -12
  157. package/dist/protocol/classifier.d.ts.map +1 -1
  158. package/dist/protocol/classifier.js +1 -107
  159. package/dist/protocol/classifier.js.map +1 -1
  160. package/dist/protocol/events.d.ts +72 -0
  161. package/dist/protocol/events.d.ts.map +1 -0
  162. package/dist/protocol/events.js +533 -0
  163. package/dist/protocol/events.js.map +1 -0
  164. package/dist/protocol/generated.d.ts +16 -2
  165. package/dist/protocol/generated.d.ts.map +1 -1
  166. package/dist/protocol/index.d.ts +3 -0
  167. package/dist/protocol/index.d.ts.map +1 -1
  168. package/dist/protocol/index.js +3 -0
  169. package/dist/protocol/index.js.map +1 -1
  170. package/dist/protocol/outbound.d.ts +13 -0
  171. package/dist/protocol/outbound.d.ts.map +1 -0
  172. package/dist/protocol/outbound.js +2 -0
  173. package/dist/protocol/outbound.js.map +1 -0
  174. package/dist/protocol/parser.d.ts +3 -2
  175. package/dist/protocol/parser.d.ts.map +1 -1
  176. package/dist/protocol/parser.js +99 -3
  177. package/dist/protocol/parser.js.map +1 -1
  178. package/dist/protocol/schemas/CommandExecutionRequestApprovalResponse.json +72 -0
  179. package/dist/protocol/schemas/DynamicToolCallResponse.json +66 -0
  180. package/dist/protocol/schemas/FileChangeRequestApprovalResponse.json +47 -0
  181. package/dist/protocol/schemas/ToolRequestUserInputResponse.json +34 -0
  182. package/dist/react/index.d.ts +3 -1
  183. package/dist/react/index.d.ts.map +1 -1
  184. package/dist/react/index.js +2 -0
  185. package/dist/react/index.js.map +1 -1
  186. package/dist/react/types.d.ts +13 -1
  187. package/dist/react/types.d.ts.map +1 -1
  188. package/dist/react/useCodexReasoning.d.ts +7 -0
  189. package/dist/react/useCodexReasoning.d.ts.map +1 -0
  190. package/dist/react/useCodexReasoning.js +16 -0
  191. package/dist/react/useCodexReasoning.js.map +1 -0
  192. package/dist/react/useCodexStreamOverlay.d.ts.map +1 -1
  193. package/dist/react/useCodexStreamOverlay.js +68 -23
  194. package/dist/react/useCodexStreamOverlay.js.map +1 -1
  195. package/dist/react/useCodexStreamingReasoning.d.ts +12 -0
  196. package/dist/react/useCodexStreamingReasoning.d.ts.map +1 -0
  197. package/dist/react/useCodexStreamingReasoning.js +21 -0
  198. package/dist/react/useCodexStreamingReasoning.js.map +1 -0
  199. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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":"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"}