@zakstam/codex-local-component 0.1.3 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +39 -42
  2. package/dist/app-server/client.d.ts +24 -0
  3. package/dist/app-server/client.d.ts.map +1 -0
  4. package/dist/app-server/client.js +44 -0
  5. package/dist/app-server/client.js.map +1 -0
  6. package/dist/app-server/index.d.ts +2 -0
  7. package/dist/app-server/index.d.ts.map +1 -0
  8. package/dist/app-server/index.js +2 -0
  9. package/dist/app-server/index.js.map +1 -0
  10. package/dist/client/index.d.ts +1 -1
  11. package/dist/client/index.d.ts.map +1 -1
  12. package/dist/client/index.js +1 -1
  13. package/dist/client/index.js.map +1 -1
  14. package/dist/client/sync.d.ts +4 -4
  15. package/dist/client/sync.d.ts.map +1 -1
  16. package/dist/client/sync.js +4 -4
  17. package/dist/client/sync.js.map +1 -1
  18. package/dist/client/types.d.ts +3 -3
  19. package/dist/client/types.d.ts.map +1 -1
  20. package/dist/component/_generated/component.d.ts +190 -5
  21. package/dist/component/_generated/component.d.ts.map +1 -1
  22. package/dist/component/approvals.d.ts.map +1 -1
  23. package/dist/component/approvals.js +33 -12
  24. package/dist/component/approvals.js.map +1 -1
  25. package/dist/component/messages.d.ts.map +1 -1
  26. package/dist/component/messages.js +12 -3
  27. package/dist/component/messages.js.map +1 -1
  28. package/dist/component/pagination.d.ts +5 -0
  29. package/dist/component/pagination.d.ts.map +1 -0
  30. package/dist/component/pagination.js +30 -0
  31. package/dist/component/pagination.js.map +1 -0
  32. package/dist/component/schema.d.ts +52 -6
  33. package/dist/component/schema.d.ts.map +1 -1
  34. package/dist/component/schema.js +32 -3
  35. package/dist/component/schema.js.map +1 -1
  36. package/dist/component/streams.d.ts +1 -1
  37. package/dist/component/streams.js +2 -2
  38. package/dist/component/streams.js.map +1 -1
  39. package/dist/component/sync.d.ts +94 -5
  40. package/dist/component/sync.d.ts.map +1 -1
  41. package/dist/component/sync.js +88 -11
  42. package/dist/component/sync.js.map +1 -1
  43. package/dist/component/syncIngest.d.ts +61 -4
  44. package/dist/component/syncIngest.d.ts.map +1 -1
  45. package/dist/component/syncIngest.js +346 -150
  46. package/dist/component/syncIngest.js.map +1 -1
  47. package/dist/component/syncReplay.d.ts +28 -7
  48. package/dist/component/syncReplay.d.ts.map +1 -1
  49. package/dist/component/syncReplay.js +122 -60
  50. package/dist/component/syncReplay.js.map +1 -1
  51. package/dist/component/threads.d.ts +38 -0
  52. package/dist/component/threads.d.ts.map +1 -1
  53. package/dist/component/threads.js +178 -32
  54. package/dist/component/threads.js.map +1 -1
  55. package/dist/component/utils.d.ts.map +1 -1
  56. package/dist/component/utils.js +4 -3
  57. package/dist/component/utils.js.map +1 -1
  58. package/dist/host/convex.d.ts +85 -0
  59. package/dist/host/convex.d.ts.map +1 -0
  60. package/dist/host/convex.js +50 -0
  61. package/dist/host/convex.js.map +1 -0
  62. package/dist/host/index.d.ts +3 -0
  63. package/dist/host/index.d.ts.map +1 -0
  64. package/dist/host/index.js +3 -0
  65. package/dist/host/index.js.map +1 -0
  66. package/dist/host/runtime.d.ts +116 -0
  67. package/dist/host/runtime.d.ts.map +1 -0
  68. package/dist/host/runtime.js +320 -0
  69. package/dist/host/runtime.js.map +1 -0
  70. package/dist/index.d.ts +1 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +1 -0
  73. package/dist/index.js.map +1 -1
  74. package/dist/protocol/classifier.d.ts.map +1 -1
  75. package/dist/protocol/classifier.js +4 -7
  76. package/dist/protocol/classifier.js.map +1 -1
  77. package/dist/react/types.d.ts +10 -0
  78. package/dist/react/types.d.ts.map +1 -1
  79. package/dist/react/useCodexStreamOverlay.d.ts.map +1 -1
  80. package/dist/react/useCodexStreamOverlay.js +46 -8
  81. package/dist/react/useCodexStreamOverlay.js.map +1 -1
  82. package/package.json +10 -1
@@ -1,4 +1,4 @@
1
- export declare const pushEvents: import("convex/server").RegisteredMutation<"public", {
1
+ export declare const ingest: import("convex/server").RegisteredMutation<"public", {
2
2
  actor: {
3
3
  tenantId: string;
4
4
  userId: string;
@@ -6,12 +6,48 @@ export declare const pushEvents: import("convex/server").RegisteredMutation<"pub
6
6
  };
7
7
  sessionId: string;
8
8
  threadId: string;
9
- deltas: import("./syncIngest.js").InboundEvent[];
9
+ streamDeltas: import("./syncIngest.js").StreamInboundEvent[];
10
+ lifecycleEvents: import("./syncIngest.js").LifecycleInboundEvent[];
10
11
  runtime?: import("./syncRuntime.js").SyncRuntimeInput;
11
12
  }, Promise<{
12
- ackCursor: number;
13
+ ackedStreams: Array<{
14
+ streamId: string;
15
+ ackCursorEnd: number;
16
+ }>;
17
+ ingestStatus: "ok" | "partial";
13
18
  }>>;
14
- export declare const pullState: import("convex/server").RegisteredQuery<"public", {
19
+ export declare const ingestSafe: import("convex/server").RegisteredMutation<"public", {
20
+ actor: {
21
+ tenantId: string;
22
+ userId: string;
23
+ deviceId: string;
24
+ };
25
+ sessionId: string;
26
+ threadId: string;
27
+ streamDeltas: import("./syncIngest.js").StreamInboundEvent[];
28
+ lifecycleEvents: import("./syncIngest.js").LifecycleInboundEvent[];
29
+ runtime?: import("./syncRuntime.js").SyncRuntimeInput;
30
+ } & {
31
+ ensureLastEventCursor?: number;
32
+ }, Promise<{
33
+ status: "ok" | "partial" | "session_recovered" | "rejected";
34
+ ingestStatus: "ok" | "partial";
35
+ ackedStreams: Array<{
36
+ streamId: string;
37
+ ackCursorEnd: number;
38
+ }>;
39
+ recovery?: {
40
+ action: "session_rebound";
41
+ sessionId: string;
42
+ threadId: string;
43
+ };
44
+ errors: Array<{
45
+ code: "OUT_OF_ORDER" | "REPLAY_GAP" | "SESSION_DEVICE_MISMATCH" | "SESSION_NOT_FOUND" | "SESSION_THREAD_MISMATCH" | "UNKNOWN";
46
+ message: string;
47
+ recoverable: boolean;
48
+ }>;
49
+ }>>;
50
+ export declare const replay: import("convex/server").RegisteredQuery<"public", {
15
51
  actor: {
16
52
  tenantId: string;
17
53
  userId: string;
@@ -28,6 +64,16 @@ export declare const pullState: import("convex/server").RegisteredQuery<"public"
28
64
  streamId: string;
29
65
  state: string;
30
66
  }[];
67
+ streamWindows: {
68
+ streamId: string;
69
+ status: "ok" | "stale" | "rebased";
70
+ serverCursorStart: number;
71
+ serverCursorEnd: number;
72
+ }[];
73
+ nextCheckpoints: {
74
+ streamId: string;
75
+ cursor: number;
76
+ }[];
31
77
  deltas: {
32
78
  streamId: string;
33
79
  cursorStart: number;
@@ -42,6 +88,29 @@ export declare const pullState: import("convex/server").RegisteredQuery<"public"
42
88
  payloadJson: string;
43
89
  }[];
44
90
  }>>;
91
+ export declare const listCheckpoints: import("convex/server").RegisteredQuery<"public", {
92
+ actor: {
93
+ tenantId: string;
94
+ userId: string;
95
+ deviceId: string;
96
+ };
97
+ threadId: string;
98
+ }, Promise<{
99
+ streamId: string;
100
+ cursor: number;
101
+ }[]>>;
102
+ export declare const upsertCheckpoint: import("convex/server").RegisteredMutation<"public", {
103
+ actor: {
104
+ tenantId: string;
105
+ userId: string;
106
+ deviceId: string;
107
+ };
108
+ threadId: string;
109
+ streamId: string;
110
+ cursor: number;
111
+ }, Promise<{
112
+ ok: true;
113
+ }>>;
45
114
  export declare const heartbeat: import("convex/server").RegisteredMutation<"public", {
46
115
  actor: {
47
116
  tenantId: string;
@@ -52,7 +121,21 @@ export declare const heartbeat: import("convex/server").RegisteredMutation<"publ
52
121
  threadId: string;
53
122
  lastEventCursor: number;
54
123
  }, Promise<null>>;
55
- export declare const resumeFromCursor: import("convex/server").RegisteredQuery<"public", {
124
+ export declare const ensureSession: import("convex/server").RegisteredMutation<"public", {
125
+ actor: {
126
+ tenantId: string;
127
+ userId: string;
128
+ deviceId: string;
129
+ };
130
+ sessionId: string;
131
+ threadId: string;
132
+ lastEventCursor: number;
133
+ }, Promise<{
134
+ sessionId: string;
135
+ threadId: string;
136
+ status: "created" | "active";
137
+ }>>;
138
+ export declare const resumeReplay: import("convex/server").RegisteredQuery<"public", {
56
139
  actor: {
57
140
  tenantId: string;
58
141
  userId: string;
@@ -63,6 +146,12 @@ export declare const resumeFromCursor: import("convex/server").RegisteredQuery<"
63
146
  fromCursor: number;
64
147
  runtime?: import("./syncRuntime.js").SyncRuntimeInput;
65
148
  }, Promise<{
149
+ streamWindow: {
150
+ streamId: string;
151
+ status: "ok" | "stale" | "rebased";
152
+ serverCursorStart: number;
153
+ serverCursorEnd: number;
154
+ };
66
155
  deltas: {
67
156
  cursorStart: number;
68
157
  cursorEnd: number;
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/component/sync.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,UAAU;;;;;;;;;;;;GAUrB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAQpB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;iBASpB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;GAS3B,CAAC"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/component/sync.ts"],"names":[],"mappings":"AAiCA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;GAmBjB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CrB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAQjB,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;KAM1B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;GAS3B,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;iBASpB,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;GAaxB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;GASvB,CAAC"}
@@ -1,9 +1,10 @@
1
1
  import { v } from "convex/values";
2
2
  import { mutation, query } from "./_generated/server.js";
3
3
  import { vActorContext, vSyncRuntimeOptions } from "./types.js";
4
- import { heartbeatHandler, pushEventsHandler } from "./syncIngest.js";
5
- import { pullStateHandler, resumeFromCursorHandler } from "./syncReplay.js";
6
- const vInboundEvent = v.object({
4
+ import { ensureSessionHandler, heartbeatHandler, ingestHandler, ingestSafeHandler, upsertCheckpointHandler, } from "./syncIngest.js";
5
+ import { listCheckpointsHandler, replayHandler, resumeReplayHandler } from "./syncReplay.js";
6
+ const vStreamInboundEvent = v.object({
7
+ type: v.literal("stream_delta"),
7
8
  eventId: v.string(),
8
9
  turnId: v.string(),
9
10
  streamId: v.string(),
@@ -13,25 +14,87 @@ const vInboundEvent = v.object({
13
14
  cursorEnd: v.number(),
14
15
  createdAt: v.number(),
15
16
  });
16
- export const pushEvents = mutation({
17
+ const vLifecycleEvent = v.object({
18
+ type: v.literal("lifecycle_event"),
19
+ eventId: v.string(),
20
+ turnId: v.optional(v.string()),
21
+ kind: v.string(),
22
+ payloadJson: v.string(),
23
+ createdAt: v.number(),
24
+ });
25
+ export const ingest = mutation({
26
+ args: {
27
+ actor: vActorContext,
28
+ sessionId: v.string(),
29
+ threadId: v.string(),
30
+ streamDeltas: v.array(vStreamInboundEvent),
31
+ lifecycleEvents: v.array(vLifecycleEvent),
32
+ runtime: v.optional(vSyncRuntimeOptions),
33
+ },
34
+ returns: v.object({
35
+ ackedStreams: v.array(v.object({
36
+ streamId: v.string(),
37
+ ackCursorEnd: v.number(),
38
+ })),
39
+ ingestStatus: v.union(v.literal("ok"), v.literal("partial")),
40
+ }),
41
+ handler: ingestHandler,
42
+ });
43
+ export const ingestSafe = mutation({
17
44
  args: {
18
45
  actor: vActorContext,
19
46
  sessionId: v.string(),
20
47
  threadId: v.string(),
21
- deltas: v.array(vInboundEvent),
48
+ streamDeltas: v.array(vStreamInboundEvent),
49
+ lifecycleEvents: v.array(vLifecycleEvent),
50
+ ensureLastEventCursor: v.optional(v.number()),
22
51
  runtime: v.optional(vSyncRuntimeOptions),
23
52
  },
24
- returns: v.object({ ackCursor: v.number() }),
25
- handler: pushEventsHandler,
53
+ returns: v.object({
54
+ status: v.union(v.literal("ok"), v.literal("partial"), v.literal("session_recovered"), v.literal("rejected")),
55
+ ingestStatus: v.union(v.literal("ok"), v.literal("partial")),
56
+ ackedStreams: v.array(v.object({
57
+ streamId: v.string(),
58
+ ackCursorEnd: v.number(),
59
+ })),
60
+ recovery: v.optional(v.object({
61
+ action: v.literal("session_rebound"),
62
+ sessionId: v.string(),
63
+ threadId: v.string(),
64
+ })),
65
+ errors: v.array(v.object({
66
+ code: v.union(v.literal("SESSION_NOT_FOUND"), v.literal("SESSION_THREAD_MISMATCH"), v.literal("SESSION_DEVICE_MISMATCH"), v.literal("OUT_OF_ORDER"), v.literal("REPLAY_GAP"), v.literal("UNKNOWN")),
67
+ message: v.string(),
68
+ recoverable: v.boolean(),
69
+ })),
70
+ }),
71
+ handler: ingestSafeHandler,
26
72
  });
27
- export const pullState = query({
73
+ export const replay = query({
28
74
  args: {
29
75
  actor: vActorContext,
30
76
  threadId: v.string(),
31
77
  streamCursorsById: v.array(v.object({ streamId: v.string(), cursor: v.number() })),
32
78
  runtime: v.optional(vSyncRuntimeOptions),
33
79
  },
34
- handler: pullStateHandler,
80
+ handler: replayHandler,
81
+ });
82
+ export const listCheckpoints = query({
83
+ args: {
84
+ actor: vActorContext,
85
+ threadId: v.string(),
86
+ },
87
+ handler: listCheckpointsHandler,
88
+ });
89
+ export const upsertCheckpoint = mutation({
90
+ args: {
91
+ actor: vActorContext,
92
+ threadId: v.string(),
93
+ streamId: v.string(),
94
+ cursor: v.number(),
95
+ },
96
+ returns: v.object({ ok: v.literal(true) }),
97
+ handler: upsertCheckpointHandler,
35
98
  });
36
99
  export const heartbeat = mutation({
37
100
  args: {
@@ -43,7 +106,21 @@ export const heartbeat = mutation({
43
106
  returns: v.null(),
44
107
  handler: heartbeatHandler,
45
108
  });
46
- export const resumeFromCursor = query({
109
+ export const ensureSession = mutation({
110
+ args: {
111
+ actor: vActorContext,
112
+ sessionId: v.string(),
113
+ threadId: v.string(),
114
+ lastEventCursor: v.number(),
115
+ },
116
+ returns: v.object({
117
+ sessionId: v.string(),
118
+ threadId: v.string(),
119
+ status: v.union(v.literal("created"), v.literal("active")),
120
+ }),
121
+ handler: ensureSessionHandler,
122
+ });
123
+ export const resumeReplay = query({
47
124
  args: {
48
125
  actor: vActorContext,
49
126
  threadId: v.string(),
@@ -51,6 +128,6 @@ export const resumeFromCursor = query({
51
128
  fromCursor: v.number(),
52
129
  runtime: v.optional(vSyncRuntimeOptions),
53
130
  },
54
- handler: resumeFromCursorHandler,
131
+ handler: resumeReplayHandler,
55
132
  });
56
133
  //# sourceMappingURL=sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/component/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;IACjC,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;QAC9B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KACzC;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IAC5C,OAAO,EAAE,iBAAiB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC;IAC7B,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClF,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KACzC;IACD,OAAO,EAAE,gBAAgB;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC;IAChC,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;KAC5B;IACD,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;IACjB,OAAO,EAAE,gBAAgB;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;IACpC,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KACzC;IACD,OAAO,EAAE,uBAAuB;CACjC,CAAC,CAAC"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/component/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE7F,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAC/B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC;IAC7B,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;QAC1C,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC;QACzC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KACzC;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,YAAY,EAAE,CAAC,CAAC,KAAK,CACnB,CAAC,CAAC,MAAM,CAAC;YACP,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;YACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;SACzB,CAAC,CACH;QACD,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;KAC7D,CAAC;IACF,OAAO,EAAE,aAAa;CACvB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;IACjC,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;QAC1C,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC;QACzC,qBAAqB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7C,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KACzC;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7G,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5D,YAAY,EAAE,CAAC,CAAC,KAAK,CACnB,CAAC,CAAC,MAAM,CAAC;YACP,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;YACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;SACzB,CAAC,CACH;QACD,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAClB,CAAC,CAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;YACpC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;YACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;SACrB,CAAC,CACH;QACD,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,KAAK,CACX,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAC9B,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,EACpC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,EACpC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EACzB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EACvB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CACrB;YACD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;YACnB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE;SACzB,CAAC,CACH;KACF,CAAC;IACF,OAAO,EAAE,iBAAiB;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;IAC1B,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClF,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KACzC;IACD,OAAO,EAAE,aAAa;CACvB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC;IACnC,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACrB;IACD,OAAO,EAAE,sBAAsB;CAChC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACvC,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,OAAO,EAAE,uBAAuB;CACjC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC;IAChC,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;KAC5B;IACD,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;IACjB,OAAO,EAAE,gBAAgB;CAC1B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC;IACpC,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;KAC5B;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;KAC3D,CAAC;IACF,OAAO,EAAE,oBAAoB;CAC9B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC;IAChC,IAAI,EAAE;QACJ,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KACzC;IACD,OAAO,EAAE,mBAAmB;CAC7B,CAAC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { MutationCtx } from "./_generated/server.js";
2
2
  import { type SyncRuntimeInput } from "./syncRuntime.js";
3
- export type InboundEvent = {
3
+ export type StreamInboundEvent = {
4
+ type: "stream_delta";
4
5
  eventId: string;
5
6
  turnId: string;
6
7
  streamId: string;
@@ -10,6 +11,15 @@ export type InboundEvent = {
10
11
  cursorEnd: number;
11
12
  createdAt: number;
12
13
  };
14
+ export type LifecycleInboundEvent = {
15
+ type: "lifecycle_event";
16
+ eventId: string;
17
+ turnId?: string;
18
+ kind: string;
19
+ payloadJson: string;
20
+ createdAt: number;
21
+ };
22
+ export type InboundEvent = StreamInboundEvent | LifecycleInboundEvent;
13
23
  type PushEventsArgs = {
14
24
  actor: {
15
25
  tenantId: string;
@@ -18,7 +28,8 @@ type PushEventsArgs = {
18
28
  };
19
29
  sessionId: string;
20
30
  threadId: string;
21
- deltas: InboundEvent[];
31
+ streamDeltas: StreamInboundEvent[];
32
+ lifecycleEvents: LifecycleInboundEvent[];
22
33
  runtime?: SyncRuntimeInput;
23
34
  };
24
35
  type HeartbeatArgs = {
@@ -31,9 +42,55 @@ type HeartbeatArgs = {
31
42
  threadId: string;
32
43
  lastEventCursor: number;
33
44
  };
34
- export declare function pushEventsHandler(ctx: MutationCtx, args: PushEventsArgs): Promise<{
35
- ackCursor: number;
45
+ type EnsureSessionArgs = HeartbeatArgs;
46
+ type EnsureSessionResult = {
47
+ sessionId: string;
48
+ threadId: string;
49
+ status: "created" | "active";
50
+ };
51
+ type IngestSafeArgs = PushEventsArgs & {
52
+ ensureLastEventCursor?: number;
53
+ };
54
+ type IngestSafeErrorCode = "SESSION_NOT_FOUND" | "SESSION_THREAD_MISMATCH" | "SESSION_DEVICE_MISMATCH" | "OUT_OF_ORDER" | "REPLAY_GAP" | "UNKNOWN";
55
+ 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 declare function ingestHandler(ctx: MutationCtx, args: PushEventsArgs): Promise<{
74
+ ackedStreams: Array<{
75
+ streamId: string;
76
+ ackCursorEnd: number;
77
+ }>;
78
+ ingestStatus: "ok" | "partial";
79
+ }>;
80
+ export declare function upsertCheckpointHandler(ctx: MutationCtx, args: {
81
+ actor: {
82
+ tenantId: string;
83
+ userId: string;
84
+ deviceId: string;
85
+ };
86
+ threadId: string;
87
+ streamId: string;
88
+ cursor: number;
89
+ }): Promise<{
90
+ ok: true;
36
91
  }>;
92
+ export declare function ensureSessionHandler(ctx: MutationCtx, args: EnsureSessionArgs): Promise<EnsureSessionResult>;
37
93
  export declare function heartbeatHandler(ctx: MutationCtx, args: HeartbeatArgs): Promise<null>;
94
+ export declare function ingestSafeHandler(ctx: MutationCtx, args: IngestSafeArgs): Promise<IngestSafeResult>;
38
95
  export {};
39
96
  //# sourceMappingURL=syncIngest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"syncIngest.d.ts","sourceRoot":"","sources":["../../src/component/syncIngest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAa1D,OAAO,EAUL,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAuB1B,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAsBF,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAmpBhC;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAmDf"}
1
+ {"version":3,"file":"syncIngest.d.ts","sourceRoot":"","sources":["../../src/component/syncIngest.ts"],"names":[],"mappings":"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"}