@kortix/sdk 0.13.5 → 0.13.9

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 (253) hide show
  1. package/README.md +69 -6
  2. package/dist/browser/session-sync/server-transcript-mirror.d.ts +82 -0
  3. package/dist/browser/session-sync/server-transcript-mirror.d.ts.map +1 -0
  4. package/dist/browser/session-sync/server-transcript-mirror.js +143 -0
  5. package/dist/browser/session-sync/server-transcript-mirror.js.map +1 -0
  6. package/dist/browser/session-sync/session-sync-registry.d.ts +11 -21
  7. package/dist/browser/session-sync/session-sync-registry.d.ts.map +1 -1
  8. package/dist/browser/session-sync/session-sync-registry.js +48 -3
  9. package/dist/browser/session-sync/session-sync-registry.js.map +1 -1
  10. package/dist/browser/stores/sandbox-connection-store.d.ts +13 -1
  11. package/dist/browser/stores/sandbox-connection-store.d.ts.map +1 -1
  12. package/dist/browser/stores/sandbox-connection-store.js +5 -2
  13. package/dist/browser/stores/sandbox-connection-store.js.map +1 -1
  14. package/dist/browser/stores/session-working-store.d.ts +10 -5
  15. package/dist/browser/stores/session-working-store.d.ts.map +1 -1
  16. package/dist/browser/stores/session-working-store.js +32 -8
  17. package/dist/browser/stores/session-working-store.js.map +1 -1
  18. package/dist/browser/stores/sync-store.d.ts +29 -1
  19. package/dist/browser/stores/sync-store.d.ts.map +1 -1
  20. package/dist/browser/stores/sync-store.js +516 -393
  21. package/dist/browser/stores/sync-store.js.map +1 -1
  22. package/dist/core/auth/app-viewer.d.ts +57 -0
  23. package/dist/core/auth/app-viewer.d.ts.map +1 -0
  24. package/dist/core/auth/app-viewer.js +82 -0
  25. package/dist/core/auth/app-viewer.js.map +1 -0
  26. package/dist/core/auth/session.d.ts +45 -0
  27. package/dist/core/auth/session.d.ts.map +1 -0
  28. package/dist/core/auth/session.js +113 -0
  29. package/dist/core/auth/session.js.map +1 -0
  30. package/dist/core/client/kortix.d.ts +37 -18
  31. package/dist/core/client/kortix.d.ts.map +1 -1
  32. package/dist/core/client/kortix.js +47 -0
  33. package/dist/core/client/kortix.js.map +1 -1
  34. package/dist/core/http/config.d.ts +4 -2
  35. package/dist/core/http/config.d.ts.map +1 -1
  36. package/dist/core/http/config.js.map +1 -1
  37. package/dist/core/http/opencode-errors.d.ts +17 -0
  38. package/dist/core/http/opencode-errors.d.ts.map +1 -1
  39. package/dist/core/http/opencode-errors.js +25 -0
  40. package/dist/core/http/opencode-errors.js.map +1 -1
  41. package/dist/core/rest/platform-client/auth.d.ts +120 -0
  42. package/dist/core/rest/platform-client/auth.d.ts.map +1 -0
  43. package/dist/core/rest/platform-client/auth.js +98 -0
  44. package/dist/core/rest/platform-client/auth.js.map +1 -0
  45. package/dist/core/rest/platform-client/host-boundary.d.ts +5 -0
  46. package/dist/core/rest/platform-client/host-boundary.d.ts.map +1 -1
  47. package/dist/core/rest/platform-client/host-boundary.js.map +1 -1
  48. package/dist/core/rest/projects-client/accounts.d.ts +57 -0
  49. package/dist/core/rest/projects-client/accounts.d.ts.map +1 -1
  50. package/dist/core/rest/projects-client/accounts.js +31 -0
  51. package/dist/core/rest/projects-client/accounts.js.map +1 -1
  52. package/dist/core/rest/projects-client/apps.d.ts +9 -0
  53. package/dist/core/rest/projects-client/apps.d.ts.map +1 -1
  54. package/dist/core/rest/projects-client/apps.js.map +1 -1
  55. package/dist/core/rest/projects-client/billing.d.ts +2 -0
  56. package/dist/core/rest/projects-client/billing.d.ts.map +1 -1
  57. package/dist/core/rest/projects-client/billing.js.map +1 -1
  58. package/dist/core/rest/projects-client/connectors.d.ts +104 -19
  59. package/dist/core/rest/projects-client/connectors.d.ts.map +1 -1
  60. package/dist/core/rest/projects-client/connectors.js +56 -2
  61. package/dist/core/rest/projects-client/connectors.js.map +1 -1
  62. package/dist/core/rest/projects-client/index.d.ts +1 -0
  63. package/dist/core/rest/projects-client/index.d.ts.map +1 -1
  64. package/dist/core/rest/projects-client/index.js +1 -0
  65. package/dist/core/rest/projects-client/index.js.map +1 -1
  66. package/dist/core/rest/projects-client/oauth-clients.d.ts +47 -0
  67. package/dist/core/rest/projects-client/oauth-clients.d.ts.map +1 -0
  68. package/dist/core/rest/projects-client/oauth-clients.js +33 -0
  69. package/dist/core/rest/projects-client/oauth-clients.js.map +1 -0
  70. package/dist/core/rest/projects-client/projects.d.ts +23 -6
  71. package/dist/core/rest/projects-client/projects.d.ts.map +1 -1
  72. package/dist/core/rest/projects-client/projects.js +1 -0
  73. package/dist/core/rest/projects-client/projects.js.map +1 -1
  74. package/dist/core/rest/projects-client/session-sandbox.d.ts +52 -0
  75. package/dist/core/rest/projects-client/session-sandbox.d.ts.map +1 -1
  76. package/dist/core/rest/projects-client/session-sandbox.js.map +1 -1
  77. package/dist/core/rest/projects-client/sessions.d.ts +134 -1
  78. package/dist/core/rest/projects-client/sessions.d.ts.map +1 -1
  79. package/dist/core/rest/projects-client/sessions.js +47 -1
  80. package/dist/core/rest/projects-client/sessions.js.map +1 -1
  81. package/dist/core/session/index.d.ts +1 -0
  82. package/dist/core/session/index.d.ts.map +1 -1
  83. package/dist/core/session/index.js +1 -0
  84. package/dist/core/session/index.js.map +1 -1
  85. package/dist/core/session/open-bundle.d.ts +110 -0
  86. package/dist/core/session/open-bundle.d.ts.map +1 -0
  87. package/dist/core/session/open-bundle.js +183 -0
  88. package/dist/core/session/open-bundle.js.map +1 -0
  89. package/dist/core/session/poll-owner.d.ts +35 -0
  90. package/dist/core/session/poll-owner.d.ts.map +1 -0
  91. package/dist/core/session/poll-owner.js +90 -0
  92. package/dist/core/session/poll-owner.js.map +1 -0
  93. package/dist/core/session/static-file-preview.d.ts +50 -0
  94. package/dist/core/session/static-file-preview.d.ts.map +1 -0
  95. package/dist/core/session/static-file-preview.js +91 -0
  96. package/dist/core/session/static-file-preview.js.map +1 -0
  97. package/dist/core/session/wake-escalation.d.ts +188 -0
  98. package/dist/core/session/wake-escalation.d.ts.map +1 -0
  99. package/dist/core/session/wake-escalation.js +241 -0
  100. package/dist/core/session/wake-escalation.js.map +1 -0
  101. package/dist/core/session/working.d.ts +63 -2
  102. package/dist/core/session/working.d.ts.map +1 -1
  103. package/dist/core/session/working.js +66 -9
  104. package/dist/core/session/working.js.map +1 -1
  105. package/dist/core/session-sync/session-sync-controller.d.ts +34 -2
  106. package/dist/core/session-sync/session-sync-controller.d.ts.map +1 -1
  107. package/dist/core/session-sync/session-sync-controller.js +97 -11
  108. package/dist/core/session-sync/session-sync-controller.js.map +1 -1
  109. package/dist/core/stream/keepalive.d.ts +17 -0
  110. package/dist/core/stream/keepalive.d.ts.map +1 -0
  111. package/dist/core/stream/keepalive.js +19 -0
  112. package/dist/core/stream/keepalive.js.map +1 -0
  113. package/dist/core/turns/grouping.d.ts.map +1 -1
  114. package/dist/core/turns/grouping.js +13 -0
  115. package/dist/core/turns/grouping.js.map +1 -1
  116. package/dist/core/turns/types.d.ts +5 -0
  117. package/dist/core/turns/types.d.ts.map +1 -1
  118. package/dist/index.d.ts +15 -1
  119. package/dist/index.d.ts.map +1 -1
  120. package/dist/index.js +18 -0
  121. package/dist/index.js.map +1 -1
  122. package/dist/kortix.esm.min.js +25 -25
  123. package/dist/kortix.global.js +25 -25
  124. package/dist/node/app-viewer.d.ts +41 -0
  125. package/dist/node/app-viewer.d.ts.map +1 -0
  126. package/dist/node/app-viewer.js +150 -0
  127. package/dist/node/app-viewer.js.map +1 -0
  128. package/dist/node/auth.d.ts +84 -0
  129. package/dist/node/auth.d.ts.map +1 -0
  130. package/dist/node/auth.js +414 -0
  131. package/dist/node/auth.js.map +1 -0
  132. package/dist/node/server.d.ts +19 -0
  133. package/dist/node/server.d.ts.map +1 -1
  134. package/dist/node/server.js +13 -1
  135. package/dist/node/server.js.map +1 -1
  136. package/dist/react/bedrock-invokable.d.ts +58 -0
  137. package/dist/react/bedrock-invokable.d.ts.map +1 -0
  138. package/dist/react/bedrock-invokable.js +83 -0
  139. package/dist/react/bedrock-invokable.js.map +1 -0
  140. package/dist/react/index.d.ts +3 -0
  141. package/dist/react/index.d.ts.map +1 -1
  142. package/dist/react/index.js +7 -0
  143. package/dist/react/index.js.map +1 -1
  144. package/dist/react/model-flatten.d.ts +14 -1
  145. package/dist/react/model-flatten.d.ts.map +1 -1
  146. package/dist/react/model-flatten.js +3 -4
  147. package/dist/react/model-flatten.js.map +1 -1
  148. package/dist/react/opencode.d.ts +2 -1
  149. package/dist/react/opencode.d.ts.map +1 -1
  150. package/dist/react/opencode.js +2 -1
  151. package/dist/react/opencode.js.map +1 -1
  152. package/dist/react/provider-selection.d.ts +58 -0
  153. package/dist/react/provider-selection.d.ts.map +1 -1
  154. package/dist/react/provider-selection.js +253 -2
  155. package/dist/react/provider-selection.js.map +1 -1
  156. package/dist/react/session-start-giveup.d.ts +12 -0
  157. package/dist/react/session-start-giveup.d.ts.map +1 -0
  158. package/dist/react/session-start-giveup.js +13 -0
  159. package/dist/react/session-start-giveup.js.map +1 -0
  160. package/dist/react/session-title-sync.d.ts.map +1 -1
  161. package/dist/react/session-title-sync.js +15 -5
  162. package/dist/react/session-title-sync.js.map +1 -1
  163. package/dist/react/sign-in-with-kortix.d.ts +346 -0
  164. package/dist/react/sign-in-with-kortix.d.ts.map +1 -0
  165. package/dist/react/sign-in-with-kortix.js +65 -0
  166. package/dist/react/sign-in-with-kortix.js.map +1 -0
  167. package/dist/react/use-admin-accounts.d.ts +1 -1
  168. package/dist/react/use-admin-accounts.d.ts.map +1 -1
  169. package/dist/react/use-admin-accounts.js +1 -0
  170. package/dist/react/use-admin-accounts.js.map +1 -1
  171. package/dist/react/use-gateway-routing-policy.d.ts +1 -0
  172. package/dist/react/use-gateway-routing-policy.d.ts.map +1 -1
  173. package/dist/react/use-gateway-routing-policy.js +12 -1
  174. package/dist/react/use-gateway-routing-policy.js.map +1 -1
  175. package/dist/react/use-kortix-app-viewer.d.ts +13 -0
  176. package/dist/react/use-kortix-app-viewer.d.ts.map +1 -0
  177. package/dist/react/use-kortix-app-viewer.js +29 -0
  178. package/dist/react/use-kortix-app-viewer.js.map +1 -0
  179. package/dist/react/use-model-defaults.d.ts +7 -0
  180. package/dist/react/use-model-defaults.d.ts.map +1 -1
  181. package/dist/react/use-model-defaults.js +7 -1
  182. package/dist/react/use-model-defaults.js.map +1 -1
  183. package/dist/react/use-model-enablement.d.ts.map +1 -1
  184. package/dist/react/use-model-enablement.js +5 -1
  185. package/dist/react/use-model-enablement.js.map +1 -1
  186. package/dist/react/use-model-store.d.ts +31 -0
  187. package/dist/react/use-model-store.d.ts.map +1 -1
  188. package/dist/react/use-model-store.js +31 -2
  189. package/dist/react/use-model-store.js.map +1 -1
  190. package/dist/react/use-opencode-events/helpers.d.ts +49 -5
  191. package/dist/react/use-opencode-events/helpers.d.ts.map +1 -1
  192. package/dist/react/use-opencode-events/helpers.js +54 -6
  193. package/dist/react/use-opencode-events/helpers.js.map +1 -1
  194. package/dist/react/use-opencode-events/index.d.ts.map +1 -1
  195. package/dist/react/use-opencode-events/index.js +22 -3
  196. package/dist/react/use-opencode-events/index.js.map +1 -1
  197. package/dist/react/use-opencode-events/use-event-stream-refs.d.ts.map +1 -1
  198. package/dist/react/use-opencode-events/use-event-stream-refs.js +14 -2
  199. package/dist/react/use-opencode-events/use-event-stream-refs.js.map +1 -1
  200. package/dist/react/use-opencode-local.d.ts.map +1 -1
  201. package/dist/react/use-opencode-local.js +27 -8
  202. package/dist/react/use-opencode-local.js.map +1 -1
  203. package/dist/react/use-opencode-sessions/providers.d.ts.map +1 -1
  204. package/dist/react/use-opencode-sessions/providers.js +44 -3
  205. package/dist/react/use-opencode-sessions/providers.js.map +1 -1
  206. package/dist/react/use-poll-owner.d.ts +14 -0
  207. package/dist/react/use-poll-owner.d.ts.map +1 -0
  208. package/dist/react/use-poll-owner.js +32 -0
  209. package/dist/react/use-poll-owner.js.map +1 -0
  210. package/dist/react/use-project-llm-gateway.d.ts +27 -0
  211. package/dist/react/use-project-llm-gateway.d.ts.map +1 -0
  212. package/dist/react/use-project-llm-gateway.js +41 -0
  213. package/dist/react/use-project-llm-gateway.js.map +1 -0
  214. package/dist/react/use-project-models.d.ts +9 -0
  215. package/dist/react/use-project-models.d.ts.map +1 -1
  216. package/dist/react/use-project-models.js +24 -1
  217. package/dist/react/use-project-models.js.map +1 -1
  218. package/dist/react/use-runtime-reconnect.d.ts +11 -0
  219. package/dist/react/use-runtime-reconnect.d.ts.map +1 -1
  220. package/dist/react/use-runtime-reconnect.js +34 -3
  221. package/dist/react/use-runtime-reconnect.js.map +1 -1
  222. package/dist/react/use-session-prompts.d.ts +16 -1
  223. package/dist/react/use-session-prompts.d.ts.map +1 -1
  224. package/dist/react/use-session-prompts.js +76 -11
  225. package/dist/react/use-session-prompts.js.map +1 -1
  226. package/dist/react/use-session-send.d.ts.map +1 -1
  227. package/dist/react/use-session-send.js +14 -1
  228. package/dist/react/use-session-send.js.map +1 -1
  229. package/dist/react/use-session-start-give-up.d.ts +20 -0
  230. package/dist/react/use-session-start-give-up.d.ts.map +1 -0
  231. package/dist/react/use-session-start-give-up.js +60 -0
  232. package/dist/react/use-session-start-give-up.js.map +1 -0
  233. package/dist/react/use-session-sync.d.ts +22 -0
  234. package/dist/react/use-session-sync.d.ts.map +1 -1
  235. package/dist/react/use-session-sync.js +61 -5
  236. package/dist/react/use-session-sync.js.map +1 -1
  237. package/dist/react/use-session-working.d.ts +38 -0
  238. package/dist/react/use-session-working.d.ts.map +1 -1
  239. package/dist/react/use-session-working.js +81 -10
  240. package/dist/react/use-session-working.js.map +1 -1
  241. package/dist/react/use-session.d.ts +13 -13
  242. package/dist/react/use-session.d.ts.map +1 -1
  243. package/dist/react/use-session.js +74 -53
  244. package/dist/react/use-session.js.map +1 -1
  245. package/dist/react/use-static-file-preview.d.ts +12 -0
  246. package/dist/react/use-static-file-preview.d.ts.map +1 -0
  247. package/dist/react/use-static-file-preview.js +119 -0
  248. package/dist/react/use-static-file-preview.js.map +1 -0
  249. package/dist/react/use-wake-escalation.d.ts +51 -0
  250. package/dist/react/use-wake-escalation.d.ts.map +1 -0
  251. package/dist/react/use-wake-escalation.js +62 -0
  252. package/dist/react/use-wake-escalation.js.map +1 -0
  253. package/package.json +6 -4
@@ -1,4 +1,4 @@
1
- import type { AbortReceipt, SendReceipt, WorkingInboxInput } from '../../core/session/working.js';
1
+ import { type AbortReceipt, type SendReceipt, type WorkingInboxInput } from '../../core/session/working.js';
2
2
  /**
3
3
  * The LOCAL-ISH inputs to `projectWorking`, one set per Kortix session.
4
4
  *
@@ -26,6 +26,7 @@ interface SessionWorkingState {
26
26
  * pending stop — sending is the user saying they are not stopping. */
27
27
  noteSendReceipt: (sessionId: string, receipt: {
28
28
  messageId: string;
29
+ turnId?: string | null;
29
30
  atMs: number;
30
31
  }) => void;
31
32
  /** The server durably accepted `messageId`. Ignored when a NEWER send has
@@ -53,14 +54,18 @@ interface SessionWorkingState {
53
54
  /** The server acknowledged the cancel. Stamped once — the first
54
55
  * acknowledgement is the one a server read can be measured against. */
55
56
  settleAbortReceipt: (sessionId: string, atMs: number) => void;
56
- /** One reading of the durable prompt inbox, stamped at ISSUE time. */
57
- noteInboxPending: (sessionId: string, pending: number, atMs: number) => void;
57
+ /** One reading of the durable prompt inbox. `atMs` is this tab's clock at
58
+ * ISSUE/RECEIVE time (age); `serverAtMs` is the server's `observed_at`
59
+ * (ordering) when the endpoint supplied one. See `WorkingInboxInput`. */
60
+ noteInboxPending: (sessionId: string, pending: number, atMs: number, serverAtMs?: number) => void;
58
61
  /** `POST .../prompts` returned: the row EXISTS, and the server said so. Raise
59
62
  * the inbox floor to at least one pending row, covering the gap between that
60
63
  * response and the list query refetching — a `/turn` poll landing in that gap
61
64
  * answers "no turns" honestly and used to flip the composer back to Send with
62
- * the user's prompt already queued. */
63
- notePromptAccepted: (sessionId: string, atMs: number) => void;
65
+ * the user's prompt already queued. `serverAtMs` is the response's
66
+ * `observed_at`: the write's place on the server clock, which is what bars a
67
+ * read issued BEFORE the POST from erasing the row after it settles. */
68
+ notePromptAccepted: (sessionId: string, atMs: number, serverAtMs?: number) => void;
64
69
  /** Drop every input this session holds. Called by `useSessionWorking` when
65
70
  * the LAST observer of the session unmounts — the maps otherwise accumulate
66
71
  * one entry per session visited for the tab's lifetime. Correctness never
@@ -1 +1 @@
1
- {"version":3,"file":"session-working-store.d.ts","sourceRoot":"","sources":["../../../src/browser/stores/session-working-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/F;;;;;;;;;;;;;;;GAeG;AACH,UAAU,mBAAmB;IAC3B;oDACgD;IAChD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAEzC;;2EAEuE;IACvE,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3F;;qDAEiD;IACjD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChF;;;;;;;;;OASG;IACH,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE;;;;;OAKG;IACH,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D;4EACwE;IACxE,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D,sEAAsE;IACtE,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7E;;;;4CAIwC;IACxC,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D;;;yEAGqE;IACrE,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,sBAAsB,kFA0FhC,CAAC"}
1
+ {"version":3,"file":"session-working-store.d.ts","sourceRoot":"","sources":["../../../src/browser/stores/session-working-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAEpC;;;;;;;;;;;;;;;GAeG;AACH,UAAU,mBAAmB;IAC3B;oDACgD;IAChD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAEzC;;2EAEuE;IACvE,eAAe,EAAE,CACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KACjE,IAAI,CAAC;IACV;;qDAEiD;IACjD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChF;;;;;;;;;OASG;IACH,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE;;;;;OAKG;IACH,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D;4EACwE;IACxE,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D;;8EAE0E;IAC1E,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClG;;;;;;6EAMyE;IACzE,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnF;;;yEAGqE;IACrE,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,sBAAsB,kFAwHhC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
  import { create } from 'zustand';
3
+ import { inboxObservationSupersedes, } from '../../core/session/working.js';
3
4
  export const useSessionWorkingStore = create()((set) => ({
4
5
  receipts: {},
5
6
  aborts: {},
@@ -11,7 +12,7 @@ export const useSessionWorkingStore = create()((set) => ({
11
12
  return {
12
13
  receipts: {
13
14
  ...state.receipts,
14
- [sessionId]: { messageId: receipt.messageId, atMs: receipt.atMs, acceptedAtMs: null },
15
+ [sessionId]: { ...receipt, acceptedAtMs: null },
15
16
  },
16
17
  // A send releases the stop. Leaving it would bar `/turn` from reporting
17
18
  // the turn this very send is about to start.
@@ -48,27 +49,50 @@ export const useSessionWorkingStore = create()((set) => ({
48
49
  return state;
49
50
  return { aborts: { ...state.aborts, [sessionId]: { ...current, settledAtMs: atMs } } };
50
51
  }),
51
- noteInboxPending: (sessionId, pending, atMs) => set((state) => {
52
+ noteInboxPending: (sessionId, pending, atMs, serverAtMs) => set((state) => {
52
53
  if (!sessionId)
53
54
  return state;
54
55
  const current = state.inbox[sessionId];
55
56
  // Readings settle in whatever order the network gives them; only the
56
57
  // newest OBSERVATION may stand, or a late older one would walk the
57
- // projection backwards.
58
- if (current && current.atMs > atMs)
58
+ // projection backwards. Server-stamped readings rank on the server's own
59
+ // clock see `inboxObservationSupersedes`.
60
+ const candidate = {
61
+ pending,
62
+ atMs,
63
+ ...(serverAtMs != null ? { serverAtMs } : {}),
64
+ };
65
+ if (!inboxObservationSupersedes(candidate, current))
59
66
  return state;
60
- if (current && current.atMs === atMs && current.pending === pending)
67
+ if (current &&
68
+ current.atMs === atMs &&
69
+ current.pending === pending &&
70
+ current.serverAtMs === candidate.serverAtMs) {
61
71
  return state;
62
- return { inbox: { ...state.inbox, [sessionId]: { pending, atMs } } };
72
+ }
73
+ return { inbox: { ...state.inbox, [sessionId]: candidate } };
63
74
  }),
64
- notePromptAccepted: (sessionId, atMs) => set((state) => {
75
+ notePromptAccepted: (sessionId, atMs, serverAtMs) => set((state) => {
65
76
  if (!sessionId)
66
77
  return state;
67
78
  const current = state.inbox[sessionId];
68
79
  if (current && current.atMs > atMs)
69
80
  return state;
81
+ // A reading whose server stamp postdates this POST already answered for
82
+ // it — the acceptance must not walk the ordering key backwards.
83
+ if (current?.serverAtMs != null && serverAtMs != null && current.serverAtMs > serverAtMs) {
84
+ return state;
85
+ }
70
86
  const pending = Math.max(1, current?.pending ?? 0);
71
- return { inbox: { ...state.inbox, [sessionId]: { pending, atMs } } };
87
+ const merged = serverAtMs != null || current?.serverAtMs != null
88
+ ? Math.max(serverAtMs ?? Number.NEGATIVE_INFINITY, current?.serverAtMs ?? Number.NEGATIVE_INFINITY)
89
+ : undefined;
90
+ return {
91
+ inbox: {
92
+ ...state.inbox,
93
+ [sessionId]: { pending, atMs, ...(merged != null ? { serverAtMs: merged } : {}) },
94
+ },
95
+ };
72
96
  }),
73
97
  clearSession: (sessionId) => set((state) => {
74
98
  if (!(sessionId in state.receipts) &&
@@ -1 +1 @@
1
- {"version":3,"file":"session-working-store.js","sourceRoot":"","sources":["../../../src/browser/stores/session-working-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-working-store.js","sourceRoot":"","sources":["../../../src/browser/stores/session-working-store.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,34 @@ interface SyncState {
32
32
  messages: Record<string, Message[]>;
33
33
  parts: Record<string, Part[]>;
34
34
  sessionStatus: Record<string, SessionStatus>;
35
+ /**
36
+ * WHO minted each session's current `sessionStatus` value: `'wire'` for the
37
+ * runtime's own SSE frame, `'local'` for a tab-synthesized one (the
38
+ * missing-busy sweep, a synthetic abort, `clearSession`). Absent means
39
+ * `'wire'` — the field is additive.
40
+ *
41
+ * `useSessionWorking` threads this into `projectWorking`
42
+ * (`WorkingStreamInput.origin`): only the runtime's own idle frame may
43
+ * contradict the control plane's open `/turn` row. Without the bit, one
44
+ * fabricated idle vetoed the lifecycle authority for the rest of a quiet
45
+ * turn (dev, 2026-08-24).
46
+ */
47
+ sessionStatusOrigin: Record<string, "wire" | "local">;
48
+ /**
49
+ * When each session's current `sessionStatus` value LANDED in this store —
50
+ * stamped by `setStatus` on any state change (a new value, or an origin
51
+ * flip over an unchanged value, which is a new observation), and preserved
52
+ * across same-value rewrites exactly like the status object's identity.
53
+ *
54
+ * The store used to keep no arrival time, and freshness was stamped by
55
+ * whichever component observed the slot. Two failures grew out of that: a
56
+ * remount re-stamped a dead stream's last idle frame as brand new, and the
57
+ * reconnect status fill could not tell a frame the live stream just
58
+ * delivered from one a dead stream left behind — so it protected both
59
+ * (`shouldSkipStatusFill`). Absent means the slot predates this slice; the
60
+ * readers fall back to their old stamping.
61
+ */
62
+ sessionStatusAt: Record<string, number>;
35
63
  /**
36
64
  * When the RUNTIME'S OWN OUTPUT last reached this tab, per session.
37
65
  *
@@ -122,7 +150,7 @@ interface SyncState {
122
150
  * arity change.
123
151
  */
124
152
  applyPartDelta: (sessionID: string, messageID: string, partID: string, field: string, delta: string, eventID?: string) => void;
125
- setStatus: (sessionID: string, status: SessionStatus) => void;
153
+ setStatus: (sessionID: string, status: SessionStatus, origin?: "wire" | "local") => void;
126
154
  setDiff: (sessionID: string, diffs: FileDiff[]) => void;
127
155
  setTodo: (sessionID: string, todos: Todo[]) => void;
128
156
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sync-store.d.ts","sourceRoot":"","sources":["../../../src/browser/stores/sync-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,OAAO,EACP,KAAK,IAAI,aAAa,EACtB,IAAI,EAEJ,aAAa,EAEb,IAAI,EACJ,MAAM,4BAA4B,CAAC;AAQpC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,KAAK,EACX,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAC/B,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;AAEnE;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAChC,CAAC,EAAE,aAAa,GAAG,SAAS,EAC5B,CAAC,EAAE,aAAa,GAAG,SAAS,GAC1B,OAAO,CAMT;AAyED;;;;;;;;;GASG;AAMH,UAAU,SAAS;IAElB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC7C;;;;;;;;;;;;OAYG;IACH,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9B;;;;;;;;;;;;;;OAcG;IACH,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACzD;;;;;;;;;;;OAWG;IACH,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGzD,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC3C,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7D,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D;;;;;;;;;;;;;;OAcG;IACH,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,cAAc,EAAE,CACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,KACZ,IAAI,CAAC;IACV,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9D,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IACxD,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACpD;;;;;;;;OAQG;IACH,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE;;0DAEsD;IACtD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD;;;oEAGgE;IAChE,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD;;;;;;;;OAQG;IACH,oBAAoB,EAAE,CACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,KACzB,IAAI,CAAC;IACV;;;;;;;;;;;;OAYG;IACH,mCAAmC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE;;sBAEkB;IAClB,oCAAoC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE;;;;;;;;;;;;;;OAcG;IACH,yBAAyB,EAAE,CAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,SAAS,KAC5C,IAAI,CAAC;IACV,aAAa,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,IAAI,EAAE,KAChB,IAAI,CAAC;IACV,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE;;;;;;;;;;OAUG;IACH,wBAAwB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE;;;;;;;;OAQG;IACH,yBAAyB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,uBAAuB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,yEAAyE;IACzE,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE;;;;;;;OAOG;IACH,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAClF,yDAAyD;IACzD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC9E;;;;;;;;OAQG;IACH,sBAAsB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1F;;;;;OAKG;IACH,yBAAyB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E;;+DAE2D;IAC3D,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACtD;;wEAEoE;IACpE,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACvE;;;;;;OAMG;IACH,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACzE,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;;;;;;;;;;;;;;OAgBG;IACH,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,IAAI,CAAC;IACjD;;;;;;;;;;;;;;;;;OAiBG;IACH,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACrD;;;;;;;;;;;;;;OAcG;IACH,oBAAoB,EAAE,CACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,EAAE,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,KACzB,gBAAgB,EAAE,CAAC;IACxB,OAAO,EAAE,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,IAAI,EAAE,CAAA;KAAE,CAAC;IAC7C;;;;;OAKG;IACH,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,KACnC,IAAI,CAAC;IACV,KAAK,EAAE,MAAM,IAAI,CAAC;IAGlB,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;IAIvD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACxC;AAikBD,eAAO,MAAM,YAAY,wEAg/CtB,CAAC"}
1
+ {"version":3,"file":"sync-store.d.ts","sourceRoot":"","sources":["../../../src/browser/stores/sync-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,OAAO,EACP,KAAK,IAAI,aAAa,EACtB,IAAI,EAEJ,aAAa,EAEb,IAAI,EACJ,MAAM,4BAA4B,CAAC;AASpC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,KAAK,EACX,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAC/B,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC;AAEnE;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAChC,CAAC,EAAE,aAAa,GAAG,SAAS,EAC5B,CAAC,EAAE,aAAa,GAAG,SAAS,GAC1B,OAAO,CAMT;AAuFD;;;;;;;;;GASG;AAMH,UAAU,SAAS;IAElB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC7C;;;;;;;;;;;OAWG;IACH,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACtD;;;;;;;;;;;;;OAaG;IACH,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;;;;;;;;;;;;OAYG;IACH,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9B;;;;;;;;;;;;;;OAcG;IACH,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACzD;;;;;;;;;;;OAWG;IACH,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGzD,UAAU,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC3C,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7D,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9D;;;;;;;;;;;;;;OAcG;IACH,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,cAAc,EAAE,CACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,KACZ,IAAI,CAAC;IACV,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;IACzF,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IACxD,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACpD;;;;;;;;OAQG;IACH,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE;;0DAEsD;IACtD,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD;;;oEAGgE;IAChE,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD;;;;;;;;OAQG;IACH,oBAAoB,EAAE,CACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,KACzB,IAAI,CAAC;IACV;;;;;;;;;;;;OAYG;IACH,mCAAmC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE;;sBAEkB;IAClB,oCAAoC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE;;;;;;;;;;;;;;OAcG;IACH,yBAAyB,EAAE,CAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,SAAS,KAC5C,IAAI,CAAC;IACV,aAAa,EAAE,CACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,IAAI,EAAE,KAChB,IAAI,CAAC;IACV,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE;;;;;;;;;;OAUG;IACH,wBAAwB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE;;;;;;;;OAQG;IACH,yBAAyB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,uBAAuB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,yEAAyE;IACzE,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE;;;;;;;OAOG;IACH,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAClF,yDAAyD;IACzD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC9E;;;;;;;;OAQG;IACH,sBAAsB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1F;;;;;OAKG;IACH,yBAAyB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E;;+DAE2D;IAC3D,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACtD;;wEAEoE;IACpE,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACvE;;;;;;OAMG;IACH,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACzE,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;;;;;;;;;;;;;;OAgBG;IACH,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,IAAI,CAAC;IACjD;;;;;;;;;;;;;;;;;OAiBG;IACH,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACrD;;;;;;;;;;;;;;OAcG;IACH,oBAAoB,EAAE,CACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,EAAE,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,KACzB,gBAAgB,EAAE,CAAC;IACxB,OAAO,EAAE,CACR,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,IAAI,EAAE,CAAA;KAAE,CAAC;IAC7C;;;;;OAKG;IACH,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,KACnC,IAAI,CAAC;IACV,KAAK,EAAE,MAAM,IAAI,CAAC;IAGlB,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,gBAAgB,EAAE,CAAC;IAIvD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACxC;AAikBD,eAAO,MAAM,YAAY,wEA4lDtB,CAAC"}