@kortix/sdk 0.12.8 → 0.13.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 (274) hide show
  1. package/README.md +3 -6
  2. package/dist/browser/session-sync/session-sync-registry.d.ts +7 -2
  3. package/dist/browser/session-sync/session-sync-registry.d.ts.map +1 -1
  4. package/dist/browser/session-sync/session-sync-registry.js +33 -44
  5. package/dist/browser/session-sync/session-sync-registry.js.map +1 -1
  6. package/dist/browser/session-sync/session-transcript-cache.d.ts +9 -2
  7. package/dist/browser/session-sync/session-transcript-cache.d.ts.map +1 -1
  8. package/dist/browser/session-sync/session-transcript-cache.js +15 -5
  9. package/dist/browser/session-sync/session-transcript-cache.js.map +1 -1
  10. package/dist/browser/stores/opencode-compaction-store.d.ts +9 -3
  11. package/dist/browser/stores/opencode-compaction-store.d.ts.map +1 -1
  12. package/dist/browser/stores/opencode-compaction-store.js +5 -12
  13. package/dist/browser/stores/opencode-compaction-store.js.map +1 -1
  14. package/dist/browser/stores/sandbox-connection-store.d.ts +28 -17
  15. package/dist/browser/stores/sandbox-connection-store.d.ts.map +1 -1
  16. package/dist/browser/stores/sandbox-connection-store.js +32 -84
  17. package/dist/browser/stores/sandbox-connection-store.js.map +1 -1
  18. package/dist/browser/stores/session-working-store.d.ts +73 -0
  19. package/dist/browser/stores/session-working-store.d.ts.map +1 -0
  20. package/dist/browser/stores/session-working-store.js +86 -0
  21. package/dist/browser/stores/session-working-store.js.map +1 -0
  22. package/dist/browser/stores/sync-store/types.d.ts +14 -4
  23. package/dist/browser/stores/sync-store/types.d.ts.map +1 -1
  24. package/dist/browser/stores/sync-store.d.ts +179 -4
  25. package/dist/browser/stores/sync-store.d.ts.map +1 -1
  26. package/dist/browser/stores/sync-store.js +777 -65
  27. package/dist/browser/stores/sync-store.js.map +1 -1
  28. package/dist/core/client/kortix.d.ts +95 -0
  29. package/dist/core/client/kortix.d.ts.map +1 -1
  30. package/dist/core/client/kortix.js +78 -0
  31. package/dist/core/client/kortix.js.map +1 -1
  32. package/dist/core/files/client.d.ts +50 -2
  33. package/dist/core/files/client.d.ts.map +1 -1
  34. package/dist/core/files/client.js +253 -44
  35. package/dist/core/files/client.js.map +1 -1
  36. package/dist/core/files/types.d.ts +11 -0
  37. package/dist/core/files/types.d.ts.map +1 -1
  38. package/dist/core/http/abort-error.d.ts +89 -0
  39. package/dist/core/http/abort-error.d.ts.map +1 -0
  40. package/dist/core/http/abort-error.js +190 -0
  41. package/dist/core/http/abort-error.js.map +1 -0
  42. package/dist/core/http/api-client.d.ts.map +1 -1
  43. package/dist/core/http/api-client.js +18 -4
  44. package/dist/core/http/api-client.js.map +1 -1
  45. package/dist/core/http/opencode-errors.d.ts +7 -0
  46. package/dist/core/http/opencode-errors.d.ts.map +1 -1
  47. package/dist/core/http/opencode-errors.js +45 -13
  48. package/dist/core/http/opencode-errors.js.map +1 -1
  49. package/dist/core/rest/platform-client/github-app.d.ts +13 -0
  50. package/dist/core/rest/platform-client/github-app.d.ts.map +1 -1
  51. package/dist/core/rest/platform-client/github-app.js +2 -0
  52. package/dist/core/rest/platform-client/github-app.js.map +1 -1
  53. package/dist/core/rest/platform-client/members.d.ts +10 -64
  54. package/dist/core/rest/platform-client/members.d.ts.map +1 -1
  55. package/dist/core/rest/platform-client/members.js +10 -28
  56. package/dist/core/rest/platform-client/members.js.map +1 -1
  57. package/dist/core/rest/projects-client/accounts.d.ts +30 -5
  58. package/dist/core/rest/projects-client/accounts.d.ts.map +1 -1
  59. package/dist/core/rest/projects-client/accounts.js +1 -1
  60. package/dist/core/rest/projects-client/accounts.js.map +1 -1
  61. package/dist/core/rest/projects-client/apps.d.ts +13 -0
  62. package/dist/core/rest/projects-client/apps.d.ts.map +1 -1
  63. package/dist/core/rest/projects-client/apps.js.map +1 -1
  64. package/dist/core/rest/projects-client/assignments.d.ts +114 -0
  65. package/dist/core/rest/projects-client/assignments.d.ts.map +1 -0
  66. package/dist/core/rest/projects-client/assignments.js +91 -0
  67. package/dist/core/rest/projects-client/assignments.js.map +1 -0
  68. package/dist/core/rest/projects-client/billing.d.ts +10 -1
  69. package/dist/core/rest/projects-client/billing.d.ts.map +1 -1
  70. package/dist/core/rest/projects-client/billing.js +11 -2
  71. package/dist/core/rest/projects-client/billing.js.map +1 -1
  72. package/dist/core/rest/projects-client/connectors.d.ts +69 -1
  73. package/dist/core/rest/projects-client/connectors.d.ts.map +1 -1
  74. package/dist/core/rest/projects-client/connectors.js +17 -0
  75. package/dist/core/rest/projects-client/connectors.js.map +1 -1
  76. package/dist/core/rest/projects-client/files.js +2 -2
  77. package/dist/core/rest/projects-client/files.js.map +1 -1
  78. package/dist/core/rest/projects-client/gateway.d.ts +51 -0
  79. package/dist/core/rest/projects-client/gateway.d.ts.map +1 -1
  80. package/dist/core/rest/projects-client/gateway.js.map +1 -1
  81. package/dist/core/rest/projects-client/iam.d.ts +51 -3
  82. package/dist/core/rest/projects-client/iam.d.ts.map +1 -1
  83. package/dist/core/rest/projects-client/iam.js +18 -1
  84. package/dist/core/rest/projects-client/iam.js.map +1 -1
  85. package/dist/core/rest/projects-client/index.d.ts +1 -0
  86. package/dist/core/rest/projects-client/index.d.ts.map +1 -1
  87. package/dist/core/rest/projects-client/index.js +1 -0
  88. package/dist/core/rest/projects-client/index.js.map +1 -1
  89. package/dist/core/rest/projects-client/projects.d.ts +1 -1
  90. package/dist/core/rest/projects-client/projects.d.ts.map +1 -1
  91. package/dist/core/rest/projects-client/projects.js +2 -0
  92. package/dist/core/rest/projects-client/projects.js.map +1 -1
  93. package/dist/core/rest/projects-client/secrets.d.ts +19 -1
  94. package/dist/core/rest/projects-client/secrets.d.ts.map +1 -1
  95. package/dist/core/rest/projects-client/secrets.js +1 -1
  96. package/dist/core/rest/projects-client/secrets.js.map +1 -1
  97. package/dist/core/rest/projects-client/session-costs.d.ts +33 -0
  98. package/dist/core/rest/projects-client/session-costs.d.ts.map +1 -1
  99. package/dist/core/rest/projects-client/session-costs.js.map +1 -1
  100. package/dist/core/rest/projects-client/sessions.d.ts +261 -2
  101. package/dist/core/rest/projects-client/sessions.d.ts.map +1 -1
  102. package/dist/core/rest/projects-client/sessions.js +106 -4
  103. package/dist/core/rest/projects-client/sessions.js.map +1 -1
  104. package/dist/core/rest/projects-client/shared.d.ts +10 -1
  105. package/dist/core/rest/projects-client/shared.d.ts.map +1 -1
  106. package/dist/core/rest/projects-client/shared.js.map +1 -1
  107. package/dist/core/rest/projects-client/tokens.d.ts +13 -1
  108. package/dist/core/rest/projects-client/tokens.d.ts.map +1 -1
  109. package/dist/core/rest/projects-client/tokens.js +7 -2
  110. package/dist/core/rest/projects-client/tokens.js.map +1 -1
  111. package/dist/core/rest/projects-client/triggers.d.ts +69 -2
  112. package/dist/core/rest/projects-client/triggers.d.ts.map +1 -1
  113. package/dist/core/rest/projects-client/triggers.js +1 -1
  114. package/dist/core/rest/projects-client/triggers.js.map +1 -1
  115. package/dist/core/session/compaction.d.ts +98 -0
  116. package/dist/core/session/compaction.d.ts.map +1 -0
  117. package/dist/core/session/compaction.js +108 -0
  118. package/dist/core/session/compaction.js.map +1 -0
  119. package/dist/core/session/health.d.ts +22 -0
  120. package/dist/core/session/health.d.ts.map +1 -1
  121. package/dist/core/session/health.js +31 -5
  122. package/dist/core/session/health.js.map +1 -1
  123. package/dist/core/session/index.d.ts +2 -0
  124. package/dist/core/session/index.d.ts.map +1 -1
  125. package/dist/core/session/index.js +2 -0
  126. package/dist/core/session/index.js.map +1 -1
  127. package/dist/core/session/message-queue.d.ts +79 -15
  128. package/dist/core/session/message-queue.d.ts.map +1 -1
  129. package/dist/core/session/message-queue.js +73 -27
  130. package/dist/core/session/message-queue.js.map +1 -1
  131. package/dist/core/session/rewind.d.ts +76 -10
  132. package/dist/core/session/rewind.d.ts.map +1 -1
  133. package/dist/core/session/rewind.js +68 -11
  134. package/dist/core/session/rewind.js.map +1 -1
  135. package/dist/core/session/working.d.ts +241 -0
  136. package/dist/core/session/working.d.ts.map +1 -0
  137. package/dist/core/session/working.js +261 -0
  138. package/dist/core/session/working.js.map +1 -0
  139. package/dist/core/session-sync/session-sync-controller.d.ts +35 -20
  140. package/dist/core/session-sync/session-sync-controller.d.ts.map +1 -1
  141. package/dist/core/session-sync/session-sync-controller.js +48 -115
  142. package/dist/core/session-sync/session-sync-controller.js.map +1 -1
  143. package/dist/core/stream/event-stream.d.ts +22 -0
  144. package/dist/core/stream/event-stream.d.ts.map +1 -1
  145. package/dist/core/stream/event-stream.js +132 -36
  146. package/dist/core/stream/event-stream.js.map +1 -1
  147. package/dist/core/turns/grouping.d.ts +18 -2
  148. package/dist/core/turns/grouping.d.ts.map +1 -1
  149. package/dist/core/turns/grouping.js +45 -2
  150. package/dist/core/turns/grouping.js.map +1 -1
  151. package/dist/core/turns/index.d.ts +1 -0
  152. package/dist/core/turns/index.d.ts.map +1 -1
  153. package/dist/core/turns/index.js +1 -0
  154. package/dist/core/turns/index.js.map +1 -1
  155. package/dist/core/turns/open-turn.d.ts +81 -0
  156. package/dist/core/turns/open-turn.d.ts.map +1 -0
  157. package/dist/core/turns/open-turn.js +77 -0
  158. package/dist/core/turns/open-turn.js.map +1 -0
  159. package/dist/core/turns/state.js +26 -26
  160. package/dist/core/turns/state.js.map +1 -1
  161. package/dist/core/turns/types.d.ts +5 -0
  162. package/dist/core/turns/types.d.ts.map +1 -1
  163. package/dist/index.d.ts +2 -1
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +2 -1
  166. package/dist/index.js.map +1 -1
  167. package/dist/kortix.esm.min.js +25 -25
  168. package/dist/kortix.global.js +25 -25
  169. package/dist/node/server.d.ts.map +1 -1
  170. package/dist/node/server.js +14 -2
  171. package/dist/node/server.js.map +1 -1
  172. package/dist/react/index.d.ts +2 -1
  173. package/dist/react/index.d.ts.map +1 -1
  174. package/dist/react/index.js +7 -1
  175. package/dist/react/index.js.map +1 -1
  176. package/dist/react/initial-session-pin.d.ts +17 -0
  177. package/dist/react/initial-session-pin.d.ts.map +1 -1
  178. package/dist/react/initial-session-pin.js +58 -0
  179. package/dist/react/initial-session-pin.js.map +1 -1
  180. package/dist/react/opencode.d.ts +6 -2
  181. package/dist/react/opencode.d.ts.map +1 -1
  182. package/dist/react/opencode.js +5 -1
  183. package/dist/react/opencode.js.map +1 -1
  184. package/dist/react/prefetch-session-start.d.ts +10 -4
  185. package/dist/react/prefetch-session-start.d.ts.map +1 -1
  186. package/dist/react/prefetch-session-start.js +10 -4
  187. package/dist/react/prefetch-session-start.js.map +1 -1
  188. package/dist/react/query-contracts.d.ts +2 -0
  189. package/dist/react/query-contracts.d.ts.map +1 -1
  190. package/dist/react/query-contracts.js +2 -0
  191. package/dist/react/query-contracts.js.map +1 -1
  192. package/dist/react/query-keys.d.ts +13 -2
  193. package/dist/react/query-keys.d.ts.map +1 -1
  194. package/dist/react/query-keys.js +13 -2
  195. package/dist/react/query-keys.js.map +1 -1
  196. package/dist/react/session-start-stash.d.ts +25 -0
  197. package/dist/react/session-start-stash.d.ts.map +1 -1
  198. package/dist/react/session-start-stash.js +34 -3
  199. package/dist/react/session-start-stash.js.map +1 -1
  200. package/dist/react/session-title-sync.d.ts +5 -1
  201. package/dist/react/session-title-sync.d.ts.map +1 -1
  202. package/dist/react/session-title-sync.js +16 -4
  203. package/dist/react/session-title-sync.js.map +1 -1
  204. package/dist/react/use-can.d.ts +105 -0
  205. package/dist/react/use-can.d.ts.map +1 -0
  206. package/dist/react/use-can.js +190 -0
  207. package/dist/react/use-can.js.map +1 -0
  208. package/dist/react/use-canonical-opencode-session.d.ts +6 -1
  209. package/dist/react/use-canonical-opencode-session.d.ts.map +1 -1
  210. package/dist/react/use-canonical-opencode-session.js +46 -3
  211. package/dist/react/use-canonical-opencode-session.js.map +1 -1
  212. package/dist/react/use-opencode-events/handle-event.d.ts +10 -0
  213. package/dist/react/use-opencode-events/handle-event.d.ts.map +1 -1
  214. package/dist/react/use-opencode-events/handle-event.js +76 -7
  215. package/dist/react/use-opencode-events/handle-event.js.map +1 -1
  216. package/dist/react/use-opencode-events/helpers.d.ts +21 -8
  217. package/dist/react/use-opencode-events/helpers.d.ts.map +1 -1
  218. package/dist/react/use-opencode-events/helpers.js +25 -26
  219. package/dist/react/use-opencode-events/helpers.js.map +1 -1
  220. package/dist/react/use-opencode-events/index.d.ts.map +1 -1
  221. package/dist/react/use-opencode-events/index.js +43 -26
  222. package/dist/react/use-opencode-events/index.js.map +1 -1
  223. package/dist/react/use-opencode-events/use-event-stream-refs.d.ts.map +1 -1
  224. package/dist/react/use-opencode-events/use-event-stream-refs.js +66 -3
  225. package/dist/react/use-opencode-events/use-event-stream-refs.js.map +1 -1
  226. package/dist/react/use-opencode-local.d.ts +17 -0
  227. package/dist/react/use-opencode-local.d.ts.map +1 -1
  228. package/dist/react/use-opencode-local.js +41 -7
  229. package/dist/react/use-opencode-local.js.map +1 -1
  230. package/dist/react/use-opencode-sessions/messages.d.ts +101 -1
  231. package/dist/react/use-opencode-sessions/messages.d.ts.map +1 -1
  232. package/dist/react/use-opencode-sessions/messages.js +481 -63
  233. package/dist/react/use-opencode-sessions/messages.js.map +1 -1
  234. package/dist/react/use-project-apps.d.ts +24 -1
  235. package/dist/react/use-project-apps.d.ts.map +1 -1
  236. package/dist/react/use-project-apps.js +5 -3
  237. package/dist/react/use-project-apps.js.map +1 -1
  238. package/dist/react/use-runtime-boot-stalled.d.ts +32 -0
  239. package/dist/react/use-runtime-boot-stalled.d.ts.map +1 -0
  240. package/dist/react/use-runtime-boot-stalled.js +48 -0
  241. package/dist/react/use-runtime-boot-stalled.js.map +1 -0
  242. package/dist/react/use-runtime-reconnect.d.ts +67 -1
  243. package/dist/react/use-runtime-reconnect.d.ts.map +1 -1
  244. package/dist/react/use-runtime-reconnect.js +116 -18
  245. package/dist/react/use-runtime-reconnect.js.map +1 -1
  246. package/dist/react/use-session-prompts.d.ts +113 -0
  247. package/dist/react/use-session-prompts.d.ts.map +1 -0
  248. package/dist/react/use-session-prompts.js +250 -0
  249. package/dist/react/use-session-prompts.js.map +1 -0
  250. package/dist/react/use-session-send.d.ts +169 -20
  251. package/dist/react/use-session-send.d.ts.map +1 -1
  252. package/dist/react/use-session-send.js +183 -30
  253. package/dist/react/use-session-send.js.map +1 -1
  254. package/dist/react/use-session-sync.d.ts +35 -2
  255. package/dist/react/use-session-sync.d.ts.map +1 -1
  256. package/dist/react/use-session-sync.js +49 -11
  257. package/dist/react/use-session-sync.js.map +1 -1
  258. package/dist/react/use-session-working.d.ts +57 -0
  259. package/dist/react/use-session-working.d.ts.map +1 -0
  260. package/dist/react/use-session-working.js +178 -0
  261. package/dist/react/use-session-working.js.map +1 -0
  262. package/dist/react/use-session.d.ts +131 -5
  263. package/dist/react/use-session.d.ts.map +1 -1
  264. package/dist/react/use-session.js +358 -69
  265. package/dist/react/use-session.js.map +1 -1
  266. package/package.json +2 -2
  267. package/dist/browser/stores/tab-store.d.ts +0 -91
  268. package/dist/browser/stores/tab-store.d.ts.map +0 -1
  269. package/dist/browser/stores/tab-store.js +0 -369
  270. package/dist/browser/stores/tab-store.js.map +0 -1
  271. package/dist/core/session/send-queue.d.ts +0 -70
  272. package/dist/core/session/send-queue.d.ts.map +0 -1
  273. package/dist/core/session/send-queue.js +0 -116
  274. package/dist/core/session/send-queue.js.map +0 -1
@@ -1,15 +1,58 @@
1
1
  import type { Message, Event as OpenCodeEvent, Part, SessionStatus, Todo } from "@opencode-ai/sdk/v2/client";
2
2
  import { ascendingId } from "./sync-store/ascending-id.js";
3
3
  import { Binary } from "./sync-store/binary.js";
4
- import type { FileDiff, MessageError, MessageWithParts } from "./sync-store/types.js";
4
+ import type { FileDiff, MessageError, MessageWithParts, SessionRewindState } from "./sync-store/types.js";
5
5
  export { ascendingId, Binary };
6
- export type { MessageError, MessageWithParts };
6
+ export type { MessageError, MessageWithParts, SessionRewindState };
7
+ /**
8
+ * Do two `SessionStatus` values say the same thing?
9
+ *
10
+ * NOT a deep equality: it compares `type` plus exactly the fields the retry
11
+ * readers actually read — `getRetryInfo` / `getRetryMessage` in
12
+ * `core/turns/state.ts` take `attempt`, `message` and `next`. A blanket
13
+ * deep-equal would also compare `action`, which nothing reads, and would then
14
+ * mint a new observation for a change no surface can render.
15
+ *
16
+ * The point of the comparison is object identity, not the boolean: a status
17
+ * frame is an OBSERVATION, and `useSessionWorking` dates it by the identity of
18
+ * the object in the store. Two equal values are one observation.
19
+ */
20
+ export declare function sameSessionStatus(a: SessionStatus | undefined, b: SessionStatus | undefined): boolean;
7
21
  interface SyncState {
8
22
  messages: Record<string, Message[]>;
9
23
  parts: Record<string, Part[]>;
10
24
  sessionStatus: Record<string, SessionStatus>;
11
25
  diffs: Record<string, FileDiff[]>;
12
26
  todos: Record<string, Todo[]>;
27
+ /**
28
+ * T22 — the client's mirror of the server's staged/committed session
29
+ * revert, per session. `null` means "no revert pointer" (either never
30
+ * staged, or observed cleared/committed-and-deleted). Absent from the
31
+ * record entirely (`undefined` via plain lookup) means the same thing as
32
+ * `null` — no session has ever had one tracked.
33
+ *
34
+ * Driven by three independent sources that must all converge on the same
35
+ * shape: a local `rewind()` REST call (`useSession`), the wire events
36
+ * `session.next.revert.staged/.cleared/.committed` (below, via
37
+ * `applyEvent`), and a `Session.revert` field read off `session.created`/
38
+ * `session.updated` (`syncSessionRevertFromInfo`, called from
39
+ * `use-opencode-events/handle-event.ts` — the reload/cross-tab recovery
40
+ * path, since a hard reload observes neither of the other two).
41
+ */
42
+ sessionRevert: Record<string, SessionRewindState | null>;
43
+ /**
44
+ * F2 — set when a `session.next.revert.committed` event arrives for a
45
+ * session with NO tracked local `sessionRevert` record (a fresh mount, or
46
+ * a second tab that never observed `.staged`). The store deliberately
47
+ * does not guess a watermark and delete a range in that case — see
48
+ * `markSessionRevertNeedsTailReconcile`'s doc comment for why — so this
49
+ * is the signal a consumer (the sync controller / `use-opencode-events`)
50
+ * reads to know it must fetch the session's real transcript instead of
51
+ * trusting local messages. `true` means "reconcile owed"; absent or
52
+ * `false` means nothing is owed. Cleared by
53
+ * `clearSessionRevertNeedsTailReconcile` once a consumer has acted on it.
54
+ */
55
+ sessionRevertNeedsTailReconcile: Record<string, boolean>;
13
56
  applyEvent: (event: OpenCodeEvent) => void;
14
57
  upsertMessage: (sessionID: string, message: Message) => void;
15
58
  removeMessage: (sessionID: string, messageID: string) => void;
@@ -45,11 +88,84 @@ interface SyncState {
45
88
  * it technically part of the published surface, so an out-of-repo consumer
46
89
  * calling it directly would fail to compile — that needs a semver-relevant
47
90
  * callout in the next release notes.
91
+ *
92
+ * `eventID` (T14): the wire's own `message.part.delta` event id
93
+ * (`event.id`, not `event.properties.id` — see `deltaEventTails` above for
94
+ * why this is the correct duplicate-delivery key). Optional and additive:
95
+ * omitting it reproduces this function's exact pre-existing behavior, so
96
+ * the one in-repo caller change (`applyEvent`) is the only place this
97
+ * matters, and appending a trailing optional param is not a breaking
98
+ * arity change.
48
99
  */
49
- applyPartDelta: (sessionID: string, messageID: string, partID: string, field: string, delta: string) => void;
100
+ applyPartDelta: (sessionID: string, messageID: string, partID: string, field: string, delta: string, eventID?: string) => void;
50
101
  setStatus: (sessionID: string, status: SessionStatus) => void;
51
102
  setDiff: (sessionID: string, diffs: FileDiff[]) => void;
52
103
  setTodo: (sessionID: string, todos: Todo[]) => void;
104
+ /**
105
+ * Stage a rewind's local hide window. Idempotent per boundary id: calling
106
+ * this again for the SAME `messageID` while already staged is a no-op —
107
+ * whichever caller stages first freezes the watermark, and a redundant
108
+ * echo (the local REST caller AND the wire's `.staged` confirmation both
109
+ * call this for the same action) must never widen it after messages have
110
+ * moved on. A DIFFERENT `messageID` replaces the record with a fresh
111
+ * watermark computed from the CURRENTLY known message list.
112
+ */
113
+ stageSessionRevert: (sessionId: string, messageId: string) => void;
114
+ /** Mark a staged rewind committed (Restore stops being offered) without
115
+ * dropping its hide window — see `commitSessionRewind`'s doc comment.
116
+ * No-op when nothing is tracked for this session. */
117
+ commitSessionRevert: (sessionId: string) => void;
118
+ /** Drop the local revert record entirely — `unrevert` succeeded, or a
119
+ * `session.next.revert.cleared` wire event says the server dropped it.
120
+ * The window was only ever HIDDEN while staged, never deleted, so
121
+ * clearing alone is enough to make every row visible again. */
122
+ clearSessionRevert: (sessionId: string) => void;
123
+ /**
124
+ * The `.committed` event's actual cleanup: delete every message (and its
125
+ * parts) inside `[boundaryId, watermark]` and drop the revert record. The
126
+ * first explicit deletion this store performs for rewind — `hydrate`
127
+ * never deletes (see its own doc comment), by design; this is a
128
+ * dedicated, separately tested action instead of a weakening of that
129
+ * invariant. A session with no local messages (or nothing in range)
130
+ * safely clears the record and does nothing else.
131
+ */
132
+ applyCommittedRevert: (sessionId: string, boundaryId: string, watermark: string) => void;
133
+ /**
134
+ * F2 — mark `sessionId` as owing a tail reconcile: a
135
+ * `session.next.revert.committed` event arrived with no tracked local
136
+ * `sessionRevert` record to source a trustworthy watermark from. The
137
+ * REMOVED fallback (`newestMessageId(local messages)`) could be the
138
+ * user's own REPLACEMENT prompt — if its `message.updated` happened to
139
+ * arrive before this `.committed` event, that fallback deleted the
140
+ * replacement and its answer along with the abandoned range. Deliberately
141
+ * does NOT touch `messages`/`parts`/`sessionRevert` — the server's own
142
+ * transcript (fetched by whatever the flagged consumer's reconcile reads)
143
+ * is the only trustworthy source of the real truncation here, not a
144
+ * local guess.
145
+ */
146
+ markSessionRevertNeedsTailReconcile: (sessionId: string) => void;
147
+ /** Consumer-side ack for {@link markSessionRevertNeedsTailReconcile} — call
148
+ * once the flagged session's tail has actually been reconciled against
149
+ * the server. */
150
+ clearSessionRevertNeedsTailReconcile: (sessionId: string) => void;
151
+ /**
152
+ * Reconcile the local revert record against a `Session.revert` field read
153
+ * off a `session.created`/`session.updated` event's `info` — the reload
154
+ * and cross-tab recovery path. A hard page reload observes neither a
155
+ * fresh `rewind()` call nor a `.staged` wire transition (that already
156
+ * happened, possibly in a different tab or before this tab existed), so
157
+ * this is the only way a reload can rediscover an already-staged revert.
158
+ *
159
+ * Deliberately asymmetric: a PRESENT `revert.messageID` seeds a fresh
160
+ * local record (via `stageSessionRevert`, so the same idempotency and
161
+ * watermark-freezing rules apply) — but an ABSENT one never clears an
162
+ * existing record. The three wire events are the sole authority for
163
+ * transitions; a stale or momentarily-absent `Session.revert` snapshot
164
+ * must never race ahead of (or override) them.
165
+ */
166
+ syncSessionRevertFromInfo: (sessionId: string, revert: {
167
+ messageID: string;
168
+ } | null | undefined) => void;
53
169
  optimisticAdd: (sessionID: string, message: Message, messageParts: Part[]) => void;
54
170
  optimisticRemove: (sessionID: string, messageID: string) => void;
55
171
  /**
@@ -64,11 +180,61 @@ interface SyncState {
64
180
  * part-id correlation still supersedes their messages normally.
65
181
  */
66
182
  markOptimisticDispatched: (sessionID: string, messageID: string) => void;
183
+ /**
184
+ * Mark an optimistic message as held DURABLY by the control plane — its
185
+ * prompt-inbox row landed (the POST returned). From here the message is not
186
+ * "unconfirmed": the server has it and will deliver it, so the local idle
187
+ * sweep ({@link SyncState.clearOptimisticMessages}) must not delete it. It
188
+ * leaves the transcript only by the runtime's echo (same id, or a re-minted
189
+ * one — see {@link SyncState.optimisticEchoOf}), by
190
+ * {@link SyncState.optimisticRemove}, or with the session.
191
+ */
192
+ markOptimisticInboxBacked: (sessionID: string, messageID: string) => void;
67
193
  clearOptimisticMessages: (sessionID: string) => void;
194
+ /**
195
+ * The runtime's id for an optimistic message that was superseded under a
196
+ * DIFFERENT id (the control plane re-mints a wire id that would sort below
197
+ * the transcript tip). Lets a host keep ONE identity for the prompt across
198
+ * the swap — a React key, an inbox row's `message_id` — instead of seeing
199
+ * two. Undefined for a message confirmed under its own id or never
200
+ * superseded.
201
+ */
202
+ optimisticEchoOf: (sessionID: string, optimisticID: string) => string | undefined;
203
+ /** The inverse of {@link SyncState.optimisticEchoOf}. */
204
+ optimisticOriginOf: (sessionID: string, echoID: string) => string | undefined;
205
+ /**
206
+ * Announce, AHEAD of the echo, which runtime id an optimistic message will
207
+ * come back under. The control plane re-mints a queued prompt's wire id at
208
+ * delivery and lists BOTH ids on the row — so the pairing is known before
209
+ * any `message.updated` arrives. With it recorded, the echo supersedes ITS
210
+ * OWN bubble; without it, an echo whose parts had not landed yet fell back
211
+ * to superseding the OLDEST in-flight optimistic message (measured: a
212
+ * burst's first bubble vanished, replaced by the second's echo).
213
+ */
214
+ registerOptimisticEcho: (sessionID: string, optimisticID: string, echoID: string) => void;
215
+ /**
216
+ * The user CANCELLED this message (`DELETE .../prompts`): drop its bubble
217
+ * and every claim on it — the reclaim that normally protects a
218
+ * control-plane-owned message from `message.removed` must not resurrect
219
+ * something the user explicitly removed.
220
+ */
221
+ forgetControlPlaneMessage: (sessionID: string, messageID: string) => void;
68
222
  /** True when the session's message list still holds an unconfirmed optimistic
69
223
  * message — lets the SSE reconciler avoid idling+clearing a brand-new session
70
224
  * whose first prompt the server hasn't registered yet. */
71
225
  hasOptimisticMessages: (sessionID: string) => boolean;
226
+ /** Is this message still this tab's optimistic stub (not yet confirmed
227
+ * by the runtime)? Hosts use it to keep stubs out of anything that must
228
+ * only hold what the runtime holds — the disk transcript cache. */
229
+ isOptimisticMessage: (sessionID: string, messageID: string) => boolean;
230
+ /**
231
+ * A `message.removed` for a user message the control plane still owns
232
+ * (an inbox-backed send the runtime confirmed) is a RE-PLACEMENT in
233
+ * progress — the server took the copy out to insert it again under a new
234
+ * id. Keeps the bubble as an optimistic stub for the next echo to
235
+ * supersede. Returns true when the removal was absorbed this way.
236
+ */
237
+ reclaimRemovedMessage: (sessionID: string, messageID: string) => boolean;
72
238
  clearSession: (sessionID: string) => void;
73
239
  /**
74
240
  * Take a hold on `sessionID`'s transcript for one mounted consumer, and get
@@ -126,7 +292,16 @@ interface SyncState {
126
292
  hydrate: (sessionID: string, msgs: Array<{
127
293
  info: Message;
128
294
  parts: Part[];
129
- }>) => void;
295
+ }>,
296
+ /**
297
+ * Where this snapshot came from. `cache` (the disk transcript cache)
298
+ * paints messages PROVISIONALLY: the next runtime hydrate whose tail
299
+ * covers their position drops any it does not contain. Default:
300
+ * the runtime.
301
+ */
302
+ opts?: {
303
+ source?: "cache" | "runtime";
304
+ }) => void;
130
305
  reset: () => void;
131
306
  getMessages: (sessionID: string) => MessageWithParts[];
132
307
  statuses: Record<string, SessionStatus>;
@@ -1 +1 @@
1
- {"version":3,"file":"sync-store.d.ts","sourceRoot":"","sources":["../../../src/browser/stores/sync-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-store.d.ts","sourceRoot":"","sources":["../../../src/browser/stores/sync-store.ts"],"names":[],"mappings":"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"}