@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,20 +1,28 @@
1
1
  'use client';
2
2
  import { useCallback, useState } from 'react';
3
3
  import { getClient } from '../core/runtime/client.js';
4
+ import { useSessionWorkingStore } from '../browser/stores/session-working-store.js';
4
5
  import { SESSION_SYNC_PAGE_SIZE } from '../core/session-sync/session-sync-controller.js';
6
+ import { holdSessionPrompts } from '../core/rest/projects-client/index.js';
5
7
  import { ascendingId, useSyncStore } from '../browser/stores/sync-store.js';
6
8
  import { classifySendError } from './use-session.js';
7
- import { promptOpenCodeMessage, useAbortOpenCodeSession, } from './use-opencode-sessions/index.js';
9
+ import { abortInFlightDeliveries, awaitAbortSettlement, promptOpenCodeMessage, useAbortOpenCodeSession, } from './use-opencode-sessions/index.js';
8
10
  import { readStartStash, writeStartStash } from './session-start-stash.js';
9
11
  // ============================================================================
10
12
  // Optimistic-send bookkeeping — pure sync-store mechanics, shared by every
11
13
  // send path.
12
14
  // ============================================================================
13
15
  /**
14
- * Add a user message to the sync store optimistically (before the server has
15
- * accepted it) and flip the session busy. Both actions are independent
16
- * zustand writes (neither depends on the other's result), so callers that
17
- * used to fire them in the opposite order see no observable difference.
16
+ * Add a user message to the sync store optimistically before the server has
17
+ * accepted it and nothing else.
18
+ *
19
+ * It used to also write `{type:'busy'}` into `sessionStatus`, the slot the
20
+ * runtime's own SSE frames land in. A fabricated frame there is
21
+ * indistinguishable from one the daemon sent, and it outranked a real
22
+ * `GET .../turn` read stamped after it. "Is this session working?" is answered
23
+ * once, by `projectWorking`, and this tab's own claim on it is the
24
+ * `SendReceipt` (`session-working-store.ts`) — not a status write. This
25
+ * function paints the bubble; the receipt owns the working state.
18
26
  */
19
27
  export function beginOptimisticSend(sessionId, messageId, text, partIds) {
20
28
  const parts = text.trim()
@@ -35,10 +43,13 @@ export function beginOptimisticSend(sessionId, messageId, text, partIds) {
35
43
  id: messageId,
36
44
  sessionID: sessionId,
37
45
  role: 'user',
38
- time: { created: Date.now() },
46
+ // No `time.created`: display order is by the BOX's `time.created`
47
+ // (`compareMessagesForDisplay`), and a stub stamped from the browser's
48
+ // clock sorted ABOVE real messages whenever the box ran behind it. An
49
+ // untimed stub is "the newest thing the user did", on every clock.
50
+ time: {},
39
51
  };
40
52
  useSyncStore.getState().optimisticAdd(sessionId, info, parts);
41
- useSyncStore.getState().setStatus(sessionId, { type: 'busy' });
42
53
  }
43
54
  /**
44
55
  * The prompt has gone out — the optimistic message is no longer `pending`.
@@ -63,31 +74,59 @@ export function beginOptimisticSend(sessionId, messageId, text, partIds) {
63
74
  export function markOptimisticSendDispatched(sessionId, messageId) {
64
75
  useSyncStore.getState().markOptimisticDispatched(sessionId, messageId);
65
76
  }
77
+ /**
78
+ * The prompt is going to the durable inbox (`POST .../prompts`): from here the
79
+ * host's own send path owns the bubble's life — the POST's failure path
80
+ * removes it explicitly, the runtime's echo confirms it in place (same id) or
81
+ * supersedes it (re-minted id, aliased by the store) — and the local idle
82
+ * sweep must leave it alone. Call it next to `markOptimisticSendDispatched`,
83
+ * BEFORE the POST: the enqueue promise settles after its cache work, and a
84
+ * session that goes idle or aborts in that window (a Stop, an asleep box) is
85
+ * not evidence the prompt was lost. Only for a host that painted the bubble
86
+ * with the WIRE id it hands the inbox.
87
+ */
88
+ export function markOptimisticSendInboxBacked(sessionId, messageId) {
89
+ useSyncStore.getState().markOptimisticInboxBacked(sessionId, messageId);
90
+ }
66
91
  /**
67
92
  * A send that never reached the network at all (e.g. building the outgoing
68
93
  * parts — file uploads — threw before `promptOpenCodeMessage` was even
69
94
  * called). There is nothing to rehydrate from the server since it never saw
70
- * this message, so just clear busy and drop the optimistic message outright
71
- * — unlike `recoverFromSendFailure`, which keeps it pending a rehydrate.
95
+ * this message, so drop the optimistic message outright — unlike
96
+ * `recoverFromSendFailure`, which keeps it pending a rehydrate.
97
+ *
98
+ * It releases the send RECEIPT, not the session status. "Nothing is coming for
99
+ * this send" is what this path knows; "the session is idle" is not, and writing
100
+ * it into the status slot unmasked live turns (a trigger, a second device).
101
+ * NAMED, so a slow abandon cannot drop a later send's receipt.
72
102
  */
73
103
  export function abandonOptimisticSend(sessionId, messageId) {
74
- useSyncStore.getState().setStatus(sessionId, { type: 'idle' });
104
+ useSessionWorkingStore.getState().clearSendReceipt(sessionId, messageId);
75
105
  useSyncStore.getState().optimisticRemove(sessionId, messageId);
76
106
  }
77
107
  /**
78
108
  * A send reached the network and failed (or the network dispatch itself
79
- * threw). Classify the error, clear busy, and either rehydrate real messages
80
- * from the server (keeping the optimistic message visible until then — some
81
- * error paths never emit a `session.error` SSE event) or drop the optimistic
82
- * message if the server has no record of it. The rehydrate is fire-and-forget
83
- * (matches the original inline `.then()/.catch()` — callers don't await it),
84
- * so this function itself resolves synchronously with the classified error.
109
+ * threw). Classify the error, release this send's receipt, and either
110
+ * rehydrate real messages from the server (keeping the optimistic message
111
+ * visible until then — some error paths never emit a `session.error` SSE
112
+ * event) or drop the optimistic message if the server has no record of it. The
113
+ * rehydrate is fire-and-forget (matches the original inline `.then()/.catch()`
114
+ * — callers don't await it), so this function itself resolves synchronously
115
+ * with the classified error.
116
+ *
117
+ * It writes NO status. An HTTP send failure is not evidence that the session is
118
+ * idle: a trigger, a second device, or a POST the control plane already
119
+ * accepted can all be running, and this was the worst of the fabricated writes
120
+ * — it unmasked a live turn by declaring idle into the slot the projection
121
+ * reads as runtime truth.
85
122
  */
86
123
  export function recoverFromSendFailure(sessionId, messageId, error, options = {}) {
87
124
  const classify = options.classify ?? classifySendError;
88
125
  const resolveClient = options.getClient ?? getClient;
89
126
  const classified = classify(error);
90
- useSyncStore.getState().setStatus(sessionId, { type: 'idle' });
127
+ // NAMED: a slow failure must not drop the receipt of a send submitted after
128
+ // it whose POST is still on the wire. See `clearSendReceipt`.
129
+ useSessionWorkingStore.getState().clearSendReceipt(sessionId, messageId);
91
130
  let client;
92
131
  try {
93
132
  client = resolveClient();
@@ -137,6 +176,7 @@ export async function sendAndRecover(args) {
137
176
  sessionId: args.sessionId,
138
177
  parts: args.parts,
139
178
  options: args.options,
179
+ ...(args.clientMessageId ? { clientMessageId: args.clientMessageId } : {}),
140
180
  });
141
181
  return { ok: true };
142
182
  }
@@ -158,13 +198,20 @@ export async function sendAndRecover(args) {
158
198
  // that doesn't).
159
199
  // ============================================================================
160
200
  /**
161
- * Optimistically mark the session idle and patch an "aborted" error onto the
162
- * last assistant message that doesn't already have one, so an "Interrupted"
163
- * label can render instantly instead of waiting for the SSE `session.error`
164
- * round-trip. Call this immediately before issuing the actual abort request.
201
+ * Patch an "aborted" error onto the last assistant message that doesn't
202
+ * already have one, so an "Interrupted" label can render instantly instead of
203
+ * waiting for the SSE `session.error` round-trip. Call this immediately
204
+ * before issuing the actual abort request.
205
+ *
206
+ * This deliberately writes NO status frame. It used to fabricate an idle
207
+ * frame here, and `projectWorking` cannot tell a fabricated frame from a real
208
+ * one — the fabrication outranked the control plane's own `/turn` answer for
209
+ * the whole abort round-trip. The same intent now travels as an
210
+ * `AbortReceipt` (`noteAbortReceipt`), which carries provenance and a bound
211
+ * (`OPTIMISTIC_ABORT_MAX_MS`). The transcript-side patch below stays: it is a
212
+ * designed optimistic echo about a MESSAGE, not a status.
165
213
  */
166
214
  export function applyOptimisticAbort(sessionId) {
167
- useSyncStore.getState().setStatus(sessionId, { type: 'idle' });
168
215
  const store = useSyncStore.getState();
169
216
  const msgs = store.messages[sessionId];
170
217
  if (!msgs)
@@ -175,9 +222,13 @@ export function applyOptimisticAbort(sessionId) {
175
222
  // Typed as the wider `MessageError` (not just the literal shape below)
176
223
  // so the assertion further down overlaps with `AssistantMessage.error`'s
177
224
  // real union — see `MessageError` in the sync store.
225
+ // `reason: 'user'` — a REAL user stop, as opposed to
226
+ // `markSessionAbortedLocally`'s `'runtime-disposed'`. Read via the
227
+ // SDK's `abortErrorReason` (`core/http/abort-error.ts`); apps/web
228
+ // renders this reason as the "Interrupted" checkpoint row.
178
229
  const error = {
179
230
  name: 'AbortError',
180
- data: { message: 'The operation was aborted.' },
231
+ data: { message: 'The operation was aborted.', reason: 'user' },
181
232
  };
182
233
  // `error`'s shape (`SyntheticAbortError`) isn't part of the SDK's
183
234
  // `AssistantMessage.error` union — see `MessageError` in the sync
@@ -282,8 +333,107 @@ export function replayStartStash(options) {
282
333
  },
283
334
  };
284
335
  }
336
+ /**
337
+ * Send, with this tab's own receipt filed around it.
338
+ *
339
+ * The receipt is what stops a `GET .../turn` read issued while the POST is
340
+ * still on the wire — which honestly answers "no turns", because there is
341
+ * nothing for it to see yet — from flipping the composer back to Send in the
342
+ * middle of the send. It is noted BEFORE the request and accepted only once
343
+ * the server has durably taken the prompt; a refused send releases it (via
344
+ * `recoverFromSendFailure`, by name) so a send that will never run cannot
345
+ * claim `working` for a minute. See `SendReceipt`.
346
+ */
347
+ export async function sendWithReceipt(args) {
348
+ const workingSessionId = args.workingSessionId ?? args.sessionId;
349
+ useSessionWorkingStore
350
+ .getState()
351
+ .noteSendReceipt(workingSessionId, { messageId: args.messageId, atMs: Date.now() });
352
+ const result = await sendAndRecover(args);
353
+ if (result.ok) {
354
+ // The server has the prompt. From here — and NOT before — a `/turn` read
355
+ // is able to see it, so one is allowed to answer for it.
356
+ useSessionWorkingStore
357
+ .getState()
358
+ .acceptSendReceipt(workingSessionId, args.messageId, Date.now());
359
+ }
360
+ else {
361
+ // The prompt never reached the server, so there is nothing to wait for.
362
+ // `recoverFromSendFailure` already released it under `args.sessionId`;
363
+ // repeat it under the working id for a host whose two ids differ. NAMED,
364
+ // so a slow failure cannot drop a later send's receipt.
365
+ useSessionWorkingStore.getState().clearSendReceipt(workingSessionId, args.messageId);
366
+ }
367
+ return result;
368
+ }
369
+ /**
370
+ * How long `stopWithReceipt` waits for the server-side prompt-inbox hold
371
+ * (below) before issuing the abort anyway. Mirrors apps/web's
372
+ * `STOP_HOLD_DEADLINE_MS` (`session-chat.tsx`) — kept as the same value for
373
+ * the same reason: the hold call carries no client timeout of its own, and a
374
+ * stalled socket must not delay the abort by more than a bounded amount.
375
+ */
376
+ export const STOP_HOLD_DEADLINE_MS = 1_500;
377
+ /**
378
+ * Stop, with this tab's own abort receipt filed around it.
379
+ *
380
+ * The mirror of `sendWithReceipt`, for the mirror-image failure: the cancel
381
+ * needs a round trip through the control plane and the daemon (~1.6s measured)
382
+ * before turn authority is released, so every `/turn` read issued inside that
383
+ * window still reports the doomed turn — including the one the optimistic idle
384
+ * frame itself triggers. Without the receipt the composer swapped Send back to
385
+ * Stop about 120ms after the click and stayed there for the whole abort. See
386
+ * `AbortReceipt`.
387
+ *
388
+ * It also holds the session's server-side prompt inbox BEFORE issuing the
389
+ * abort, the same pairing apps/web's `handleStop` does by hand
390
+ * (`session-chat.tsx`). A prompt sent mid-turn is forwarded into OpenCode's
391
+ * live queue the moment it is admitted, so at stop time the inbox can hold a
392
+ * row OpenCode already has. The abort drops OpenCode's in-memory queue; the
393
+ * reaper then sees that row unanswered and redelivers it — due now — unless
394
+ * the hold already marked it stop-paused. AWAITED (bounded by
395
+ * `holdDeadlineMs`) so the ordering is a fact, not a race: without it, Stop
396
+ * aborts the turn and is followed a beat later by exactly the message the
397
+ * user pressed Stop to get ahead of. A failed hold is caught, never
398
+ * rethrown — it must not cost the user their abort — and skipped entirely
399
+ * when no `projectId` is given.
400
+ *
401
+ * `runAbort` is taken as a callback (normally `() =>
402
+ * abortMutation.mutateAsync(sessionId)`) so the pairing is testable without
403
+ * rendering a hook — the same shape `awaitAbortSettlement` already uses.
404
+ */
405
+ export async function stopWithReceipt(sessionId, runAbort, options = {}) {
406
+ const workingSessionId = options.workingSessionId ?? sessionId;
407
+ const store = useSessionWorkingStore.getState();
408
+ // Nothing is coming for ANY send once the user has pressed Stop — the one
409
+ // place the unnamed clear is the correct one.
410
+ store.clearSendReceipt(workingSessionId);
411
+ store.noteAbortReceipt(workingSessionId, Date.now());
412
+ applyOptimisticAbort(sessionId);
413
+ // T9: stop a delivery still retrying its boot/wake backoff BEFORE the abort
414
+ // request goes out, so it can never land after this point.
415
+ abortInFlightDeliveries(sessionId);
416
+ if (options.projectId) {
417
+ const inboxSessionId = options.inboxSessionId ?? workingSessionId;
418
+ const hold = options.holdInboxPrompts ?? holdSessionPrompts;
419
+ const deadlineMs = options.holdDeadlineMs ?? STOP_HOLD_DEADLINE_MS;
420
+ await Promise.race([
421
+ hold(options.projectId, inboxSessionId, true).catch((error) => {
422
+ // Caught, never rethrown — see the doc comment above.
423
+ console.warn('[useSessionSend] failed to hold the prompt inbox on stop', error);
424
+ }),
425
+ new Promise((resolve) => setTimeout(resolve, deadlineMs)),
426
+ ]);
427
+ }
428
+ const settlement = awaitAbortSettlement(runAbort);
429
+ // `awaitAbortSettlement` never rejects — it resolves with how the abort ended
430
+ // (acknowledged, failed, or timed out). Any of those is the instant from
431
+ // which a server read can see the abort's effect, or fail to.
432
+ void settlement.then(() => useSessionWorkingStore.getState().settleAbortReceipt(workingSessionId, Date.now()));
433
+ return settlement;
434
+ }
285
435
  export function useSessionSend(sessionId, options = {}) {
286
- const { getClient: getClientOpt, classify } = options;
436
+ const { getClient: getClientOpt, classify, workingSessionId, projectId } = options;
287
437
  const [sendError, setSendError] = useState(null);
288
438
  const [isSending, setIsSending] = useState(false);
289
439
  const abortMutation = useAbortOpenCodeSession();
@@ -294,8 +444,9 @@ export function useSessionSend(sessionId, options = {}) {
294
444
  const optimisticText = callOptions.optimisticText ?? firstText?.text ?? '';
295
445
  beginOptimisticSend(sessionId, messageId, optimisticText, callOptions.partIds);
296
446
  setIsSending(true);
297
- const result = await sendAndRecover({
447
+ const result = await sendWithReceipt({
298
448
  sessionId,
449
+ ...(workingSessionId ? { workingSessionId } : {}),
299
450
  messageId,
300
451
  parts,
301
452
  options: sendOptions,
@@ -306,13 +457,15 @@ export function useSessionSend(sessionId, options = {}) {
306
457
  if (!result.ok)
307
458
  setSendError(result.error);
308
459
  return result;
309
- }, [sessionId, getClientOpt, classify]);
460
+ }, [sessionId, workingSessionId, getClientOpt, classify]);
310
461
  const stop = useCallback(() => {
311
462
  if (!sessionId || abortMutation.isPending)
312
- return;
313
- applyOptimisticAbort(sessionId);
314
- abortMutation.mutate(sessionId);
315
- }, [sessionId, abortMutation]);
463
+ return Promise.resolve({ status: 'skipped' });
464
+ return stopWithReceipt(sessionId, () => abortMutation.mutateAsync(sessionId), {
465
+ ...(workingSessionId ? { workingSessionId } : {}),
466
+ ...(projectId ? { projectId } : {}),
467
+ });
468
+ }, [sessionId, workingSessionId, projectId, abortMutation]);
316
469
  return { send, stop, isSending, isStopping: abortMutation.isPending, sendError };
317
470
  }
318
471
  //# sourceMappingURL=use-session-send.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-session-send.js","sourceRoot":"","sources":["../../src/react/use-session-send.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAqCb,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8CAA8C,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEzE,OAAO,EAAE,iBAAiB,EAAwB,MAAM,eAAe,CAAC;AACxE,OAAO,EACL,qBAAqB,EACrB,uBAAuB,GAGxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAmB,MAAM,uBAAuB,CAAC;AAEzF,+EAA+E;AAC/E,2EAA2E;AAC3E,aAAa;AACb,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAAiB,EACjB,SAAiB,EACjB,IAAY,EACZ,OAAkB;IAElB,MAAM,KAAK,GAAW,IAAI,CAAC,IAAI,EAAE;QAC/B,CAAC,CAAC;YACE;gBACE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC;gBACtC,SAAS,EAAE,SAAS;gBACpB,SAAS,EAAE,SAAS;gBACpB,IAAI,EAAE,MAAe;gBACrB,IAAI;aACL;SACF;QACH,CAAC,CAAC,EAAE,CAAC;IACP,wEAAwE;IACxE,oEAAoE;IACpE,wDAAwD;IACxD,MAAM,IAAI,GAAG;QACX,EAAE,EAAE,SAAS;QACb,SAAS,EAAE,SAAS;QACpB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;KACnB,CAAC;IACb,YAAY,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9D,YAAY,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,4BAA4B,CAAC,SAAiB,EAAE,SAAiB;IAC/E,YAAY,CAAC,QAAQ,EAAE,CAAC,wBAAwB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB,EAAE,SAAiB;IACxE,YAAY,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,YAAY,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACjE,CAAC;AAgCD;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAAiB,EACjB,SAAiB,EACjB,KAAc,EACd,UAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IACvD,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,IAAK,SAAqD,CAAC;IAClG,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEnC,YAAY,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/D,IAAI,MAA8B,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,aAAa,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,YAAY,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/D,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,OAAO;SACX,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;SACjE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QACZ,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC;YACd,qEAAqE;YACrE,4DAA4D;YAC5D,oEAAoE;YACpE,oEAAoE;YACpE,mEAAmE;YACnE,6CAA6C;YAC7C,YAAY,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,IAAoB,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,uDAAuD;YACvD,YAAY,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,+DAA+D;QAC/D,YAAY,CAAC,QAAQ,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEL,OAAO,UAAU,CAAC;AACpB,CAAC;AAgBD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAwB;IAC3D,IAAI,CAAC;QACH,uEAAuE;QACvE,0EAA0E;QAC1E,wDAAwD;QACxD,YAAY,CAAC,QAAQ,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACjF,MAAM,qBAAqB,CAAC;YAC1B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE;YAC1E,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,2EAA2E;AAC3E,iBAAiB;AACjB,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,YAAY,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YAC3C,uEAAuE;YACvE,yEAAyE;YACzE,qDAAqD;YACrD,MAAM,KAAK,GAAiB;gBAC1B,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,EAAE,OAAO,EAAE,4BAA4B,EAAE;aAChD,CAAC;YACF,kEAAkE;YAClE,kEAAkE;YAClE,kEAAkE;YAClE,sEAAsE;YACtE,wEAAwE;YACxE,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,KAAK,EAAwB,CAAC;YACxD,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC;AAoBD,MAAM,qBAAqB,GAAsB;IAC/C,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;IACpD,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAmD,CAAC;CAC5F,CAAC;AAgEF;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAwC;IAExC,MAAM,EACJ,SAAS,EACT,SAAS,GAAG,cAAc,EAC1B,iBAAiB,GAAG,CAAC,EACrB,mBAAmB,GAAG,EAAE,EACxB,cAAc,EACd,iBAAiB,GAAG,GAAG,EACvB,mBAAmB,GAAG,GAAG,EACzB,kBAAkB,EAClB,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,EAAE,YAAY,EACvB,QAAQ,GACT,GAAG,OAAO,CAAC;IACZ,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,qBAAqB,CAAC;IAClD,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,KAA6B,CAAC;IAElC,MAAM,IAAI,GAAG,CAAC,KAAiB,EAAE,SAAiB,EAAE,KAAc,EAAE,EAAE;QACpE,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,sBAAsB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE;YACrE,SAAS,EAAE,YAAY;YACvB,QAAQ;SACT,CAAC,CAAC;QACH,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAE,KAAa,EAAE,EAAE;QACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACvC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9F,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,KAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;YACtC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,sEAAsE;gBACtE,8DAA8D;gBAC9D,+CAA+C;gBAC/C,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YACD,IAAI,CAAC;gBACH,YAAY,CAAC,QAAQ,EAAE,CAAC,wBAAwB,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAChF,MAAM,qBAAqB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;gBACjF,IAAI,CAAC,SAAS;oBAAE,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,SAAS;oBAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,KAAiB,EAAE,OAAe,EAAE,EAAE;QAC3D,IAAI,SAAS;YAAE,OAAO;QACtB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,IAAI,OAAO,GAAG,iBAAiB,EAAE,CAAC;YAChC,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;YACnF,OAAO;QACT,CAAC;QACD,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE;QACxC,IAAI,SAAS;YAAE,OAAO;QACtB,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YACnB,IAAI,OAAO,GAAG,iBAAiB,EAAE,CAAC;gBAChC,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;gBAC5E,OAAO;YACT,CAAC;YACD,OAAO;QACT,CAAC;QACD,uEAAuE;QACvE,oEAAoE;QACpE,qEAAqE;QACrE,wEAAwE;QACxE,oEAAoE;QACpE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,aAAa,CAAC,CAAC,CAAC,CAAC;IAEjB,OAAO;QACL,MAAM,EAAE,GAAG,EAAE;YACX,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,KAAK,KAAK,SAAS;gBAAE,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;KACF,CAAC;AACJ,CAAC;AA2CD,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,UAAiC,EAAE;IAEnC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAyB,IAAI,CAAC,CAAC;IACzE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,uBAAuB,EAAE,CAAC;IAEhD,MAAM,IAAI,GAAG,WAAW,CACtB,KAAK,EACH,KAAmB,EACnB,WAAgC,EAChC,cAA+B,EAAE,EACF,EAAE;QACjC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAA8C,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACnG,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,IAAI,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;QAC3E,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAC/E,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;YAClC,SAAS;YACT,SAAS;YACT,KAAK;YACL,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,YAAY;YACvB,QAAQ;SACT,CAAC,CAAC;QACH,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC,EACD,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,CACpC,CAAC;IAEF,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC,SAAS;YAAE,OAAO;QAClD,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAChC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAE/B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC;AACnF,CAAC"}
1
+ {"version":3,"file":"use-session-send.js","sourceRoot":"","sources":["../../src/react/use-session-send.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { SessionStatus, Todo } from '@opencode-ai/sdk/v2/client';
2
- import { loadSessionTranscriptMessages } from '../browser/session-sync/session-sync-registry.js';
3
- export { loadSessionTranscriptMessages };
2
+ import { loadSessionRuntimeStatus, loadSessionTranscriptMessages } from '../browser/session-sync/session-sync-registry.js';
3
+ export { loadSessionRuntimeStatus, loadSessionTranscriptMessages };
4
4
  type FileDiff = Omit<import('@opencode-ai/sdk/v2/client').SnapshotFileDiff, 'patch'> & {
5
5
  patch?: string;
6
6
  before?: string;
@@ -21,7 +21,40 @@ interface UseSessionSyncOptions {
21
21
  * Set false while `/start` has not switched this Kortix session's sandbox.
22
22
  */
23
23
  networkEnabled?: boolean;
24
+ /**
25
+ * The caller's working projection (`useSessionWorking`), when it has one.
26
+ *
27
+ * It is the transcript liveness poll's switch. Reading the raw `session.status`
28
+ * slot instead means a dropped busy frame — a backgrounded tab, a proxy
29
+ * reconnect across the start of a turn — leaves the poll off for a turn the
30
+ * server's own authority says is running, and the transcript then never
31
+ * refreshes behind the missing stream. Omit it (apps/mobile) and the stream
32
+ * slot decides, as before.
33
+ */
34
+ working?: boolean;
24
35
  }
36
+ /**
37
+ * Is this session working, as far as THIS hook can answer?
38
+ *
39
+ * One rule with two readers: the poll's switch below, and the hook's public
40
+ * `isBusy`. They disagreed — `isBusy` derived from the raw stream slot while
41
+ * `livenessBusy` already preferred the caller's projection — so the hook handed
42
+ * out the weaker of two answers it computed side by side.
43
+ */
44
+ export declare function sessionSyncBusy(input: {
45
+ working: boolean | undefined;
46
+ streamBusy: boolean;
47
+ }): boolean;
48
+ /**
49
+ * Whether the transcript liveness poll should be running. Pure, so "the
50
+ * projection outranks the stream slot" is a test rather than a convention.
51
+ */
52
+ export declare function livenessBusy(input: {
53
+ networkEnabled: boolean;
54
+ runtimeHealthy: boolean;
55
+ working: boolean | undefined;
56
+ streamBusy: boolean;
57
+ }): boolean;
25
58
  export declare function useSessionSync(sessionId: string, options?: UseSessionSyncOptions): {
26
59
  messages: import("../internal/sync-store.js").MessageWithParts[];
27
60
  status: SessionStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"use-session-sync.d.ts","sourceRoot":"","sources":["../../src/react/use-session-sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAQtE,OAAO,EAEL,6BAA6B,EAG9B,MAAM,+CAA+C,CAAC;AAYvD,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAEzC,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,4BAA4B,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAOF;;;GAGG;AACH,UAAU,qBAAqB;IAC7B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B;;;;;;;;;;;EA+IpF"}
1
+ {"version":3,"file":"use-session-sync.d.ts","sourceRoot":"","sources":["../../src/react/use-session-sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAQtE,OAAO,EAEL,wBAAwB,EACxB,6BAA6B,EAG9B,MAAM,+CAA+C,CAAC;AAYvD,OAAO,EAAE,wBAAwB,EAAE,6BAA6B,EAAE,CAAC;AAEnE,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,4BAA4B,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAMF;;;GAGG;AACH,UAAU,qBAAqB;IAC7B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAEV;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAGV;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B;;;;;;;;;;;EAuKpF"}
@@ -1,19 +1,38 @@
1
1
  'use client';
2
2
  import { useEffect, useSyncExternalStore } from 'react';
3
3
  import { claimSessionCacheOwnership, getSessionCacheOwnership, resolveSessionCacheOwnerScope, sessionCacheOwnerScopesConflict, } from '../browser/session-sync/session-cache-ownership.js';
4
- import { getSessionSyncController, loadSessionTranscriptMessages, resetSessionSyncControllersForSession, retainSessionSyncController, } from '../browser/session-sync/session-sync-registry.js';
4
+ import { getSessionSyncController, loadSessionRuntimeStatus, loadSessionTranscriptMessages, resetSessionSyncControllersForSession, retainSessionSyncController, } from '../browser/session-sync/session-sync-registry.js';
5
5
  import { readCachedTranscript, shouldHydrateFromCache, toHydrateEntries, writeCachedTranscript, } from '../browser/session-sync/session-transcript-cache.js';
6
6
  import { useSandboxConnectionStore } from '../browser/stores/sandbox-connection-store.js';
7
7
  import { useSyncStore } from '../browser/stores/sync-store.js';
8
8
  import { useCurrentRuntime } from './use-current-runtime.js';
9
9
  import { canQueryOpenCodeSession } from './use-opencode-sessions/index.js';
10
- export { loadSessionTranscriptMessages };
10
+ export { loadSessionRuntimeStatus, loadSessionTranscriptMessages };
11
11
  const EMPTY_DIFFS = [];
12
12
  const EMPTY_TODOS = [];
13
13
  const IDLE_STATUS = { type: 'idle' };
14
- const BUSY_STATUS = { type: 'busy' };
14
+ /**
15
+ * Is this session working, as far as THIS hook can answer?
16
+ *
17
+ * One rule with two readers: the poll's switch below, and the hook's public
18
+ * `isBusy`. They disagreed — `isBusy` derived from the raw stream slot while
19
+ * `livenessBusy` already preferred the caller's projection — so the hook handed
20
+ * out the weaker of two answers it computed side by side.
21
+ */
22
+ export function sessionSyncBusy(input) {
23
+ return input.working ?? input.streamBusy;
24
+ }
25
+ /**
26
+ * Whether the transcript liveness poll should be running. Pure, so "the
27
+ * projection outranks the stream slot" is a test rather than a convention.
28
+ */
29
+ export function livenessBusy(input) {
30
+ if (!input.networkEnabled || !input.runtimeHealthy)
31
+ return false;
32
+ return sessionSyncBusy(input);
33
+ }
15
34
  export function useSessionSync(sessionId, options = {}) {
16
- const { kortixSessionScope, networkEnabled = true } = options;
35
+ const { kortixSessionScope, networkEnabled = true, working } = options;
17
36
  const runtimeHealthy = useSandboxConnectionStore((state) => state.healthy === true);
18
37
  const runtimeScope = useCurrentRuntime((state) => state.sandboxId) ?? 'none';
19
38
  const cacheOwnerScope = resolveSessionCacheOwnerScope(runtimeScope, kortixSessionScope);
@@ -67,7 +86,8 @@ export function useSessionSync(sessionId, options = {}) {
67
86
  })) {
68
87
  return;
69
88
  }
70
- store.hydrate(sessionId, toHydrateEntries(cached));
89
+ // Provisional: the first runtime read settles what the disk copy holds.
90
+ store.hydrate(sessionId, toHydrateEntries(cached), { source: 'cache' });
71
91
  })();
72
92
  return () => {
73
93
  cancelled = true;
@@ -103,21 +123,39 @@ export function useSessionSync(sessionId, options = {}) {
103
123
  return;
104
124
  lastMessages = state.messages[sessionId];
105
125
  lastParts = state.parts;
106
- void writeCachedTranscript(state, sessionId, kortixSessionScope);
126
+ void writeCachedTranscript(state, sessionId, kortixSessionScope, (id) => state.isOptimisticMessage(sessionId, id));
107
127
  };
108
128
  persist(useSyncStore.getState());
109
129
  return useSyncStore.subscribe(persist);
110
130
  }, [kortixSessionScope, sessionId]);
111
131
  const messages = useSyncStore((state) => state.buildSessionMessages(readableSessionId, state.messages[readableSessionId], state.parts));
112
- const runtimeStatus = useSyncStore((state) => state.sessionStatus[readableSessionId] ?? IDLE_STATUS);
113
- const status = sync.isPromptObservedBusy && runtimeStatus.type === 'idle' ? BUSY_STATUS : runtimeStatus;
132
+ // The runtime's own status, unmodified.
133
+ //
134
+ // A busy OVERRIDE used to sit here: while a prompt was "observed", an idle
135
+ // runtime status was rewritten to busy. It was a guess with a latch — every
136
+ // signal that could release it can be lost — and it is what left sessions
137
+ // rendering as working until the user reloaded. "Is this session working?"
138
+ // is now answered once, by `useSessionWorking` over the server's turn
139
+ // authority; this hook reports what the stream said and nothing more.
140
+ //
141
+ // The `?? IDLE_STATUS` default is a DISPLAY convenience and deliberately not
142
+ // what the projection reads: `useSessionWorking` reads the raw slot, where
143
+ // absence means "no frame has ever been observed" — silence, not idle —
144
+ // because reading silence as idle is what unmasked live turns. Widening this
145
+ // to `SessionStatus | undefined` would be a breaking change to a published
146
+ // return type and buys nothing now that `isBusy` no longer derives from it.
147
+ const status = useSyncStore((state) => state.sessionStatus[readableSessionId] ?? IDLE_STATUS);
114
148
  const diffs = useSyncStore((state) => state.diffs[readableSessionId]);
115
149
  const todos = useSyncStore((state) => state.todos[readableSessionId]);
116
- const isBusy = status.type === 'busy' || status.type === 'retry';
150
+ const streamBusy = status.type === 'busy' || status.type === 'retry';
151
+ // Published, so it cannot be removed — but it is now an ALIAS of the
152
+ // projection when the caller passed one, so the hook's public answer and the
153
+ // poll's switch are the same rule instead of two.
154
+ const isBusy = sessionSyncBusy({ working, streamBusy });
117
155
  const isLoading = !useSyncStore((state) => readableSessionId in state.messages);
118
156
  useEffect(() => {
119
- controller.setBusy(networkEnabled && runtimeHealthy && isBusy);
120
- }, [controller, isBusy, networkEnabled, runtimeHealthy]);
157
+ controller.setBusy(livenessBusy({ networkEnabled, runtimeHealthy, working, streamBusy }));
158
+ }, [controller, streamBusy, networkEnabled, runtimeHealthy, working]);
121
159
  return {
122
160
  messages,
123
161
  status,
@@ -1 +1 @@
1
- {"version":3,"file":"use-session-sync.js","sourceRoot":"","sources":["../../src/react/use-session-sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-session-sync.js","sourceRoot":"","sources":["../../src/react/use-session-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { SessionStatus } from '@opencode-ai/sdk/v2/client';
2
+ import { type SessionTurn, type SessionTurnEnded } from '../core/rest/projects-client/sessions.js';
3
+ import { type AbortReceipt, type SendReceipt, type WorkingInboxInput, type WorkingInputs, type WorkingProjection } from '../core/session/working.js';
4
+ /**
5
+ * The ONE answer to "is this session working?", and where the answer came from.
6
+ *
7
+ * It replaces four machines that each held a private opinion and could not be
8
+ * reconciled: a prompt-observation phase machine with a stall timer, a busy
9
+ * status override in the sync layer, a 30s safety timeout in the composer, and
10
+ * a 5s polling grace beside it. When a session stayed busy forever, none of
11
+ * them could be blamed or believed — which is exactly why this one is a pure
12
+ * projection over observations that are each stamped and attributed.
13
+ */
14
+ /** Cadence while the session is idle. Never `false`: a turn can START without
15
+ * this tab doing anything — a trigger fires, a second device sends, the inbox
16
+ * delivers a queued prompt — and only a poll (or an SSE frame that may never
17
+ * come) can show it. */
18
+ export declare const WORKING_POLL_IDLE_MS = 15000;
19
+ /** Cadence while the session is working, including on this tab's own
20
+ * unanswered receipt: the end of the turn is the news worth having early. */
21
+ export declare const WORKING_POLL_ACTIVE_MS = 5000;
22
+ export declare function workingPollMs(projection: WorkingProjection): number;
23
+ /** One `GET .../turn` answer plus the instant the read was ISSUED. Stamping at
24
+ * issue rather than arrival is what lets the projection tell "this read is
25
+ * older than the send" from "this read answers the send". */
26
+ export interface SessionTurnObservation {
27
+ turns: SessionTurn[];
28
+ last_ended?: SessionTurnEnded;
29
+ atMs: number;
30
+ }
31
+ /** Fold the two live sources plus the local receipt into the projection's
32
+ * inputs. Pure, so "a failed read contributes nothing" is a test, not a
33
+ * convention. */
34
+ export declare function buildWorkingInputs(input: {
35
+ turn: SessionTurnObservation | undefined;
36
+ inbox: WorkingInboxInput | undefined;
37
+ status: SessionStatus | undefined;
38
+ statusAtMs: number;
39
+ optimistic: SendReceipt | null;
40
+ abort?: AbortReceipt | null;
41
+ nowMs: number;
42
+ }): WorkingInputs;
43
+ export interface UseSessionWorkingOptions {
44
+ enabled?: boolean;
45
+ /**
46
+ * The OpenCode wire session id whose SSE status frames belong to this
47
+ * session, when the host knows it.
48
+ *
49
+ * Two ids, deliberately: `sessionId` is the Kortix session (what `/turn` is
50
+ * addressed by), while the sync store is keyed by the wire id OpenCode
51
+ * assigns inside the sandbox. Passing the wrong one would read another
52
+ * session's frames, so it is explicit rather than guessed.
53
+ */
54
+ runtimeSessionId?: string | null;
55
+ }
56
+ export declare function useSessionWorking(projectId: string, sessionId: string, options?: UseSessionWorkingOptions): WorkingProjection;
57
+ //# sourceMappingURL=use-session-working.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-session-working.d.ts","sourceRoot":"","sources":["../../src/react/use-session-working.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAKhE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAEtB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EAGvB,MAAM,yBAAyB,CAAC;AAGjC;;;;;;;;;GASG;AAEH;;;yBAGyB;AACzB,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAC3C;8EAC8E;AAC9E,eAAO,MAAM,sBAAsB,OAAQ,CAAC;AAE5C,wBAAgB,aAAa,CAAC,UAAU,EAAE,iBAAiB,GAAG,MAAM,CAEnE;AAED;;8DAE8D;AAC9D,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;kBAEkB;AAClB,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,IAAI,EAAE,sBAAsB,GAAG,SAAS,CAAC;IACzC,KAAK,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACrC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,aAAa,CAsBhB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAMD,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CAwInB"}