@opengeni/react 6.8.0 → 6.9.1-canary.41937124785001

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 (719) hide show
  1. package/dist/app/app-state.js +8 -8
  2. package/dist/app/components/Composer.js +18 -18
  3. package/dist/app/components/agent/agent-capability-picker.js +6 -6
  4. package/dist/app/components/artifacts/artifact-library.js +6 -6
  5. package/dist/app/components/artifacts/artifact-viewer.js +18 -18
  6. package/dist/app/components/artifacts/chat-interactive-block.js +11 -11
  7. package/dist/app/components/artifacts/file-reach-dialog.js +6 -6
  8. package/dist/app/components/artifacts/inline-chat-image.js +19 -19
  9. package/dist/app/components/artifacts/retained-file-preview.js +20 -20
  10. package/dist/app/components/artifacts/retained-text-preview.js +3 -3
  11. package/dist/app/components/artifacts/site-audience.js +3 -3
  12. package/dist/app/components/artifacts/site-conversations.js +9 -9
  13. package/dist/app/components/artifacts/site-data.js +10 -10
  14. package/dist/app/components/artifacts/site-publishing-page.js +25 -25
  15. package/dist/app/components/artifacts/site-publishing.js +22 -22
  16. package/dist/app/components/artifacts/site-settings.js +24 -24
  17. package/dist/app/components/artifacts/site-version-menu.js +3 -3
  18. package/dist/app/components/billing-class-mark.js +3 -3
  19. package/dist/app/components/bots/bot-launch-strip.js +20 -20
  20. package/dist/app/components/bots/bot-template-dialog.js +26 -26
  21. package/dist/app/components/bots/bot-template-shortcuts.js +20 -20
  22. package/dist/app/components/bots/bot-templates-page.js +30 -30
  23. package/dist/app/components/capabilities/capability-detail-sheet.js +6 -6
  24. package/dist/app/components/capabilities/capability-logo-source.js +13 -13
  25. package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
  26. package/dist/app/components/capabilities/native-connect-setup.js +13 -13
  27. package/dist/app/components/capabilities/own-logins-shared-heads-up.js +3 -3
  28. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +15 -15
  29. package/dist/app/components/capabilities/session-capability-card.js +52 -52
  30. package/dist/app/components/capabilities/session-chrome-card.js +20 -20
  31. package/dist/app/components/capabilities/session-custom-mcp-card.js +16 -16
  32. package/dist/app/components/capabilities/session-github-card.js +16 -16
  33. package/dist/app/components/capabilities/session-machine-card.js +19 -19
  34. package/dist/app/components/capabilities/session-personal-github-card.js +14 -14
  35. package/dist/app/components/capabilities/session-plugin-card.js +8 -8
  36. package/dist/app/components/command-menu/chat-status.js +15 -15
  37. package/dist/app/components/command-menu/chat-switcher.js +35 -35
  38. package/dist/app/components/command-menu/command-menu.js +39 -39
  39. package/dist/app/components/command-menu/shortcut-sheet.js +8 -8
  40. package/dist/app/components/composer-capabilities-menu-body.js +4 -4
  41. package/dist/app/components/composer-mobile-plus-panel.js +8 -8
  42. package/dist/app/components/composer-mobile-plus.js +1 -1
  43. package/dist/app/components/desktop/app-shots.js +6 -6
  44. package/dist/app/components/desktop/computer-use.js +2 -2
  45. package/dist/app/components/desktop/this-computer.js +5 -5
  46. package/dist/app/components/feedback.js +3 -3
  47. package/dist/app/components/github-app-connect-launcher.js +1 -1
  48. package/dist/app/components/machines/connect-machine-dialog.js +11 -11
  49. package/dist/app/components/markdown.js +6 -6
  50. package/dist/app/components/models/models-ui.js +5 -5
  51. package/dist/app/components/models/subscription-usage.d.ts +34 -0
  52. package/dist/app/components/models/subscription-usage.js +24 -0
  53. package/dist/app/components/my-things.js +4 -4
  54. package/dist/app/components/own-where-it-works.js +3 -3
  55. package/dist/app/components/personal-resource-attachment-surface.js +4 -4
  56. package/dist/app/components/pickers.js +5 -5
  57. package/dist/app/components/rail/channel-create-dialog.js +3 -3
  58. package/dist/app/components/rail/project-glyph.js +20 -20
  59. package/dist/app/components/rail/project-profile.js +27 -27
  60. package/dist/app/components/rail/rail-context.js +1 -1
  61. package/dist/app/components/rail/rail-sections.js +55 -55
  62. package/dist/app/components/rail/session-header.js +47 -47
  63. package/dist/app/components/rail/session-list.js +53 -53
  64. package/dist/app/components/rail/session-row-content.js +4 -4
  65. package/dist/app/components/rail/session-row-hover-details.js +14 -14
  66. package/dist/app/components/rail/session-shell.js +76 -73
  67. package/dist/app/components/rail/site-session-group-heading.js +8 -8
  68. package/dist/app/components/session/agent-configuration-panel.js +12 -12
  69. package/dist/app/components/session/banners.js +8 -8
  70. package/dist/app/components/session/console-new-conversation.js +39 -39
  71. package/dist/app/components/session/descendant-requests.js +36 -36
  72. package/dist/app/components/session/editable-artifacts-workspace.js +16 -16
  73. package/dist/app/components/session/failed-session-banner.js +6 -6
  74. package/dist/app/components/session/failure-recovery-boundary.js +3 -3
  75. package/dist/app/components/session/human-input-delegation-record.js +2 -2
  76. package/dist/app/components/session/human-input.js +33 -33
  77. package/dist/app/components/session/inspector.js +43 -43
  78. package/dist/app/components/session/message-actions.js +3 -3
  79. package/dist/app/components/session/message-resource-attachments.js +10 -10
  80. package/dist/app/components/session/model-recovery-notice.js +3 -3
  81. package/dist/app/components/session/new-session-settings-menu.js +6 -6
  82. package/dist/app/components/session/new-session-setup-strip.js +21 -21
  83. package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
  84. package/dist/app/components/session/sandbox-switcher.js +7 -7
  85. package/dist/app/components/session/sandbox-workspace.js +48 -48
  86. package/dist/app/components/session/search-markdown-highlight.js +7 -7
  87. package/dist/app/components/session/search-results-view.js +8 -8
  88. package/dist/app/components/session/session-admin-access.js +4 -4
  89. package/dist/app/components/session/session-admission-notice.js +4 -4
  90. package/dist/app/components/session/session-avatar-picker.js +21 -21
  91. package/dist/app/components/session/session-avatar.js +19 -19
  92. package/dist/app/components/session/session-machine-access-notice.js +4 -4
  93. package/dist/app/components/session/session-profile-dialog.js +25 -25
  94. package/dist/app/components/session/session-profile-editor.js +26 -26
  95. package/dist/app/components/session/session-retention.js +3 -3
  96. package/dist/app/components/session/session-search-dialog.js +8 -8
  97. package/dist/app/components/session/session-tenancy-control.js +2 -2
  98. package/dist/app/components/session/session-usage-limit-section.js +4 -4
  99. package/dist/app/components/session/share-chat-dialog.js +5 -5
  100. package/dist/app/components/session/subagents.js +8 -8
  101. package/dist/app/components/session/subscription-account-indicator.js +12 -7
  102. package/dist/app/components/session/subscription-account-menu.d.ts +15 -15
  103. package/dist/app/components/session/subscription-account-menu.js +6 -1
  104. package/dist/app/components/session/subscription-account.d.ts +16 -9
  105. package/dist/app/components/settings/row-select.js +4 -4
  106. package/dist/app/components/transcription-settings.js +6 -6
  107. package/dist/app/components/ui/destructive-confirm.js +5 -5
  108. package/dist/app/components/usage/usage-entry.js +3 -3
  109. package/dist/app/components/window-bar.js +9 -9
  110. package/dist/app/components/workspace-composer-plus.js +16 -16
  111. package/dist/app/components/workspace-reach.js +4 -4
  112. package/dist/app/embed/session-app.js +160 -157
  113. package/dist/app/lib/actions/actions-provider.js +8 -8
  114. package/dist/app/lib/agent-capabilities.d.ts +12 -2
  115. package/dist/app/lib/agent-capabilities.js +3 -3
  116. package/dist/app/lib/codex-usage-query.js +2 -2
  117. package/dist/app/lib/composer-connectors.js +14 -14
  118. package/dist/app/lib/console-site.js +2 -2
  119. package/dist/app/lib/console-text.js +2 -2
  120. package/dist/app/lib/events.js +12 -12
  121. package/dist/app/lib/failed-session-copy.js +3 -3
  122. package/dist/app/lib/model-access-onboarding.js +3 -3
  123. package/dist/app/lib/move-chat-to-machine.js +3 -3
  124. package/dist/app/lib/session-branch-cache.js +8 -8
  125. package/dist/app/lib/session-create.js +4 -4
  126. package/dist/app/lib/session-group-pagination.js +8 -8
  127. package/dist/app/lib/session-hover-facts.js +13 -13
  128. package/dist/app/lib/session-model.js +2 -2
  129. package/dist/app/lib/session-pins.js +1 -1
  130. package/dist/app/lib/session-rail.js +5 -5
  131. package/dist/app/lib/session-rename.js +3 -3
  132. package/dist/app/lib/sessions-group.d.ts +5 -3
  133. package/dist/app/lib/sessions-group.js +7 -7
  134. package/dist/app/lib/site-tool-consent-dialog.js +7 -7
  135. package/dist/app/lib/site-tool-consent.js +1 -1
  136. package/dist/app/lib/subscription-accounts.d.ts +79 -0
  137. package/dist/app/lib/subscription-accounts.js +18 -0
  138. package/dist/app/lib/turn-failure-analytics.js +4 -4
  139. package/dist/app/lib/use-follow-up-repositories.js +3 -3
  140. package/dist/app/lib/use-workspace-machines.js +4 -4
  141. package/dist/app/lib/use-workspace-model-catalog.js +3 -3
  142. package/dist/app/lib/use-workspace-rigs.js +2 -2
  143. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  144. package/dist/app/lib/workspace-scope-context.js +3 -3
  145. package/dist/app/routes/artifacts.js +48 -48
  146. package/dist/app/routes/retained-artifact.js +32 -32
  147. package/dist/app/routes/session.js +96 -96
  148. package/dist/app/routes/sessions-index-hydration.js +5 -5
  149. package/dist/app/routes/sessions-index.js +76 -76
  150. package/dist/app/routes/site-view.js +55 -55
  151. package/dist/artifacts-document.js +4 -4
  152. package/dist/artifacts-presentation.js +4 -4
  153. package/dist/artifacts-spreadsheet.js +4 -4
  154. package/dist/artifacts.js +10 -10
  155. package/dist/automations.js +10 -10
  156. package/dist/{browser-viewer-ZHQDVHZ2.js → browser-viewer-F4FL7JKB.js} +4 -4
  157. package/dist/{chat-interactive-block-VSDD6X3M.js → chat-interactive-block-4U5JWRSY.js} +5 -5
  158. package/dist/{chunk-4K64EKM7.js → chunk-22YIIM3X.js} +4 -4
  159. package/dist/{chunk-3NNAC43A.js → chunk-2N7ACQ7M.js} +2 -2
  160. package/dist/{chunk-7Z76QP64.js → chunk-2PY5XD3F.js} +35 -5
  161. package/dist/chunk-2PY5XD3F.js.map +1 -0
  162. package/dist/{chunk-WDASYY4S.js → chunk-2TEYUDJD.js} +8 -8
  163. package/dist/{chunk-OTW25A6I.js → chunk-37JJQNZB.js} +3 -3
  164. package/dist/{chunk-VCJQQYRE.js → chunk-3DWQPURZ.js} +4 -4
  165. package/dist/{chunk-GTRAH4FG.js → chunk-3GWC3FU3.js} +2 -2
  166. package/dist/{chunk-AB5IW227.js → chunk-3ICY6LP3.js} +3 -3
  167. package/dist/{chunk-WIFDNUKD.js → chunk-3OCU5RX5.js} +3 -3
  168. package/dist/{chunk-UBRQ3PQD.js → chunk-3SPDJLOR.js} +2 -2
  169. package/dist/{chunk-IZXYFWA4.js → chunk-3WVLR7UA.js} +12 -12
  170. package/dist/{chunk-DEHLWZSI.js → chunk-3XMB3L57.js} +4 -4
  171. package/dist/{chunk-AJBDAVX3.js → chunk-4IUOBO2H.js} +7 -7
  172. package/dist/{chunk-NFCS5WYC.js → chunk-4KQ3A3EO.js} +3 -3
  173. package/dist/{chunk-LIJNVIT3.js → chunk-4L5B5AZT.js} +3 -3
  174. package/dist/{chunk-EDDKPIIV.js → chunk-4NB3TPNE.js} +2 -2
  175. package/dist/{chunk-PSM3CU7N.js → chunk-4TDKXHCD.js} +46 -39
  176. package/dist/chunk-4TDKXHCD.js.map +1 -0
  177. package/dist/{chunk-OJWDNNW3.js → chunk-4TPTGBIO.js} +5 -5
  178. package/dist/{chunk-J2WY42FA.js → chunk-4UHGW6WF.js} +2 -2
  179. package/dist/{chunk-7NLF35YL.js → chunk-4YN2JLYK.js} +4 -4
  180. package/dist/{chunk-OOOSGPJL.js → chunk-53MYEEMA.js} +1 -1
  181. package/dist/{chunk-467WDSOK.js → chunk-5HYWXPMA.js} +2 -2
  182. package/dist/{chunk-XMBOLFFS.js → chunk-5IMNL6IV.js} +2 -2
  183. package/dist/{chunk-4Z5X7PLC.js → chunk-5MLM5T5C.js} +3 -3
  184. package/dist/{chunk-YMI27QPF.js → chunk-5NKQZVXP.js} +2 -2
  185. package/dist/{chunk-ZW5YTIH3.js → chunk-5PB46DAA.js} +1 -1
  186. package/dist/{chunk-ZW5YTIH3.js.map → chunk-5PB46DAA.js.map} +1 -1
  187. package/dist/{chunk-CYDXCILL.js → chunk-5SODSGW7.js} +7 -7
  188. package/dist/{chunk-Q5EZNBPI.js → chunk-5YAJASCO.js} +3 -3
  189. package/dist/{chunk-M3FDGRB4.js → chunk-62XAL5BA.js} +3 -3
  190. package/dist/{chunk-SGH7I7OY.js → chunk-67R6NAFI.js} +2 -2
  191. package/dist/{chunk-Q5K2J5GG.js → chunk-6BN3RU7T.js} +13 -3
  192. package/dist/chunk-6BN3RU7T.js.map +1 -0
  193. package/dist/{chunk-PYB4BFEC.js → chunk-6BQLDL6R.js} +3 -3
  194. package/dist/{chunk-YJSCLGAW.js → chunk-6EZYHJTL.js} +3 -3
  195. package/dist/{chunk-OWET7EY2.js → chunk-6GW7NJMK.js} +19 -13
  196. package/dist/{chunk-OWET7EY2.js.map → chunk-6GW7NJMK.js.map} +1 -1
  197. package/dist/{chunk-G5UQBTXY.js → chunk-6LXIL3Q3.js} +2 -2
  198. package/dist/{chunk-T67LTMSW.js → chunk-6LYVAJFZ.js} +10 -10
  199. package/dist/{chunk-3L465FBR.js → chunk-6WB5UXMZ.js} +6 -6
  200. package/dist/{chunk-EKJHOWTZ.js → chunk-74UGYVCA.js} +4 -4
  201. package/dist/{chunk-PWUSSSSL.js → chunk-7BTNYZC7.js} +2 -2
  202. package/dist/{chunk-NQ2CPQJF.js → chunk-7D3WIDKK.js} +26 -3
  203. package/dist/chunk-7D3WIDKK.js.map +1 -0
  204. package/dist/{chunk-ESXAECZ3.js → chunk-7KZFGA25.js} +2 -2
  205. package/dist/{chunk-EGKARC53.js → chunk-7MGDX2TD.js} +2 -2
  206. package/dist/{chunk-Y3XZEKDQ.js → chunk-7N3GFGB6.js} +2 -2
  207. package/dist/{chunk-AH3DGOTK.js → chunk-7SFSN6AX.js} +2 -2
  208. package/dist/{chunk-QPQ7R77C.js → chunk-7SU4YVZ5.js} +5 -1
  209. package/dist/chunk-7SU4YVZ5.js.map +1 -0
  210. package/dist/{chunk-6QK65ZWM.js → chunk-7TGUHFGO.js} +3 -3
  211. package/dist/{chunk-QURYQFDN.js → chunk-7ZIWO65F.js} +2 -2
  212. package/dist/{chunk-OYCK4JRS.js → chunk-AJHLEJTK.js} +2 -2
  213. package/dist/{chunk-3PZ3LRPV.js → chunk-AN4U7EPH.js} +3 -3
  214. package/dist/{chunk-77BHKC43.js → chunk-APG6CEG7.js} +1 -1
  215. package/dist/{chunk-FSDQQQIA.js → chunk-APHLXQNP.js} +3 -3
  216. package/dist/{chunk-SN2WENRP.js → chunk-AXHQ7QXV.js} +3 -3
  217. package/dist/{chunk-54U6ZBEX.js → chunk-AYTLSPF6.js} +3 -3
  218. package/dist/{chunk-WYGTAQMX.js → chunk-AZFVRPQM.js} +76 -22
  219. package/dist/chunk-AZFVRPQM.js.map +1 -0
  220. package/dist/{chunk-R33SBMB7.js → chunk-BBSKKBMV.js} +3 -3
  221. package/dist/{chunk-2GCHGWNE.js → chunk-BGH6TU2P.js} +3 -3
  222. package/dist/{chunk-D3PTVN2I.js → chunk-BGIYL26H.js} +2 -2
  223. package/dist/{chunk-BQYRZIZ7.js → chunk-BL7UQUC3.js} +2 -2
  224. package/dist/{chunk-EBTUPRRQ.js → chunk-BOUHCYL6.js} +4 -4
  225. package/dist/{chunk-MKDFYE2E.js → chunk-BVNGDFBC.js} +2 -2
  226. package/dist/{chunk-ICAMYP5M.js → chunk-BWJK64CP.js} +2 -2
  227. package/dist/{chunk-RHXYO4H2.js → chunk-BZ2GTCQV.js} +2 -2
  228. package/dist/{chunk-GIWFLWXG.js → chunk-C2KASMJK.js} +4 -4
  229. package/dist/{chunk-KO3OHHY2.js → chunk-CAZDRDQT.js} +2 -2
  230. package/dist/{chunk-OK7BQMCI.js → chunk-CBJRZKZB.js} +9 -9
  231. package/dist/{chunk-OYOFPNLC.js → chunk-CF6NYG7J.js} +4 -4
  232. package/dist/{chunk-MT2R57SF.js → chunk-COITN7WN.js} +2 -2
  233. package/dist/{chunk-OCXTTKVA.js → chunk-CPVOXM2Q.js} +2 -2
  234. package/dist/{chunk-HYEIA25Y.js → chunk-CTZRCBKH.js} +2 -2
  235. package/dist/{chunk-OCXEY7HE.js → chunk-CWL27YTB.js} +2 -2
  236. package/dist/{chunk-K4DQS2ML.js → chunk-D2I33V5P.js} +4 -4
  237. package/dist/{chunk-736RUNIA.js → chunk-DF7WI4JH.js} +4 -4
  238. package/dist/{chunk-KUE5BOQE.js → chunk-DKZYCJCO.js} +4 -4
  239. package/dist/{chunk-74CBR5YE.js → chunk-DQ32FKFQ.js} +2 -2
  240. package/dist/{chunk-4O2XWOLZ.js → chunk-DTKG2YUF.js} +3 -3
  241. package/dist/{chunk-GMHIOYB7.js → chunk-DUDA4V5R.js} +4 -4
  242. package/dist/{chunk-XUOYNJPB.js → chunk-ECROT4M5.js} +24 -24
  243. package/dist/{chunk-PVB4YVDP.js → chunk-EOXV5XGY.js} +2 -2
  244. package/dist/{chunk-U6552Q3T.js → chunk-EQQOZ6DD.js} +2 -2
  245. package/dist/{chunk-G6ICCGJ3.js → chunk-EY6W5H4B.js} +2 -2
  246. package/dist/{chunk-HWVPLFIW.js → chunk-EYRFEWXJ.js} +2 -2
  247. package/dist/{chunk-7YTR3UFO.js → chunk-FB4JWUVJ.js} +8 -5
  248. package/dist/chunk-FB4JWUVJ.js.map +1 -0
  249. package/dist/{chunk-U4LTPFD2.js → chunk-FKK2PD7K.js} +2 -2
  250. package/dist/{chunk-PUUEI4W3.js → chunk-FPHHIC5K.js} +5 -5
  251. package/dist/{chunk-SP44O3OU.js → chunk-FQM6L22H.js} +2 -2
  252. package/dist/{chunk-2J77TWGH.js → chunk-FW22IREV.js} +3 -3
  253. package/dist/{chunk-EBIVTDEG.js → chunk-G4M6AYDB.js} +2 -2
  254. package/dist/{chunk-O4JOE3R7.js → chunk-G55NAU5M.js} +60 -74
  255. package/dist/chunk-G55NAU5M.js.map +1 -0
  256. package/dist/{chunk-BASI553K.js → chunk-G6AZ2WIU.js} +4 -4
  257. package/dist/{chunk-SJYTQLN3.js → chunk-GJ5IDSAX.js} +3 -3
  258. package/dist/{chunk-TDTD66BK.js → chunk-GRDSEZWZ.js} +2 -2
  259. package/dist/{chunk-MV2CLIO6.js → chunk-HBVJIGY2.js} +6 -6
  260. package/dist/{chunk-R4JA5JFI.js → chunk-HCWQLIOE.js} +3 -3
  261. package/dist/{chunk-MZY3VKKM.js → chunk-HEVD4A5G.js} +2 -2
  262. package/dist/{chunk-DLVIRJGK.js → chunk-HNDHSEVJ.js} +2 -2
  263. package/dist/{chunk-LPKJ77EK.js → chunk-HNTZ7B7M.js} +2 -2
  264. package/dist/{chunk-QQIZMVAJ.js → chunk-HQ7GTMII.js} +59 -57
  265. package/dist/chunk-HQ7GTMII.js.map +1 -0
  266. package/dist/{chunk-IN3VQFKS.js → chunk-I2FC7CAI.js} +2 -2
  267. package/dist/{chunk-SK5S2PCK.js → chunk-I7BGHBOM.js} +14 -14
  268. package/dist/chunk-I7BGHBOM.js.map +1 -0
  269. package/dist/{chunk-ZBHGNE2J.js → chunk-IEHZFYMH.js} +3 -3
  270. package/dist/{chunk-DWJ6J3YW.js → chunk-IXISEVD7.js} +4 -4
  271. package/dist/{chunk-TK5FWVZR.js → chunk-IZEDVQUD.js} +3 -3
  272. package/dist/{chunk-HEGV4QMS.js → chunk-J42QE4VO.js} +2 -2
  273. package/dist/{chunk-PRT4J2DL.js → chunk-J555XSUM.js} +2 -2
  274. package/dist/{chunk-SBXSKRFA.js → chunk-JNMHFSDF.js} +3 -3
  275. package/dist/{chunk-KI46GKMD.js → chunk-JTBAOPYO.js} +7 -7
  276. package/dist/{chunk-JHZRAYI4.js → chunk-JWSRFXRN.js} +2 -2
  277. package/dist/chunk-JWSRFXRN.js.map +1 -0
  278. package/dist/{chunk-SXGJL7UT.js → chunk-K376MPJH.js} +14 -14
  279. package/dist/{chunk-OSJ366KR.js → chunk-KEBVT55V.js} +30 -30
  280. package/dist/{chunk-U5UGM5XD.js → chunk-KFIZAXHI.js} +5 -5
  281. package/dist/{chunk-KFNZZ2N6.js → chunk-KKGRDBMK.js} +2 -2
  282. package/dist/{chunk-PLYVGZIN.js → chunk-KKIG6DN5.js} +1 -1
  283. package/dist/{chunk-3OK7Y6ES.js → chunk-KKQO2GAA.js} +2 -2
  284. package/dist/{chunk-DQPIEQGP.js → chunk-KO753ZCZ.js} +2 -2
  285. package/dist/{chunk-YNTLWCF4.js → chunk-KYIRWU65.js} +3 -3
  286. package/dist/{chunk-JKL5S7UQ.js → chunk-L6V63DVI.js} +6 -6
  287. package/dist/{chunk-M5IQVMLR.js → chunk-LAZ2QZTJ.js} +11 -4
  288. package/dist/chunk-LAZ2QZTJ.js.map +1 -0
  289. package/dist/{chunk-CV4VVLPZ.js → chunk-LCNJ2KNS.js} +2 -2
  290. package/dist/{chunk-D74Z2N4K.js → chunk-LE7YKMTU.js} +2 -2
  291. package/dist/{chunk-D5TIVCXG.js → chunk-LEBEOMVT.js} +2 -2
  292. package/dist/chunk-LKLQVANM.js +2 -0
  293. package/dist/{chunk-2OXSB2OL.js → chunk-LKWVBUH6.js} +3 -2
  294. package/dist/chunk-LKWVBUH6.js.map +1 -0
  295. package/dist/{chunk-WXF2RTS4.js → chunk-M6URPYUB.js} +2 -2
  296. package/dist/{chunk-H6BX6WOW.js → chunk-MDHFMRBC.js} +3 -3
  297. package/dist/{chunk-3CDJSKDW.js → chunk-MGZO7CHI.js} +3 -3
  298. package/dist/{chunk-DCEQCGVN.js → chunk-MIWU52TW.js} +2 -2
  299. package/dist/{chunk-PF2WU2IL.js → chunk-ND4IQJUM.js} +120 -17
  300. package/dist/chunk-ND4IQJUM.js.map +1 -0
  301. package/dist/{chunk-3PM3M2Q6.js → chunk-NDXBF3RW.js} +27 -11
  302. package/dist/chunk-NDXBF3RW.js.map +1 -0
  303. package/dist/{chunk-LVELUUK6.js → chunk-NF6QVVMP.js} +2 -2
  304. package/dist/{chunk-UMX6DZME.js → chunk-NTZ5ZNVK.js} +2 -2
  305. package/dist/{chunk-FBA2NXYH.js → chunk-NWLRABUR.js} +3 -3
  306. package/dist/{chunk-TNSJFZ6Q.js → chunk-O2H2U7YS.js} +4 -4
  307. package/dist/{chunk-BFFNINCC.js → chunk-OAL2PPX4.js} +3 -3
  308. package/dist/{chunk-WTSQUCHB.js → chunk-OCYTHZ4A.js} +3 -3
  309. package/dist/{chunk-ZAX4XQLN.js → chunk-OEDTCIXF.js} +2 -2
  310. package/dist/{chunk-CHU3RDV4.js → chunk-OLVSYB3P.js} +3 -3
  311. package/dist/{chunk-PZKHST7A.js → chunk-OQ6QOPK6.js} +10 -3
  312. package/dist/chunk-OQ6QOPK6.js.map +1 -0
  313. package/dist/{chunk-IFSXVU2S.js → chunk-OQHTFOCA.js} +2 -2
  314. package/dist/{chunk-OXQ2SXVC.js → chunk-P56AVROH.js} +2 -2
  315. package/dist/{chunk-CXAN2FHF.js → chunk-PCEJHHGP.js} +6 -6
  316. package/dist/{chunk-5MIBQ4P5.js → chunk-PHGQGVVL.js} +2 -2
  317. package/dist/{chunk-FLWQJDJ5.js → chunk-PUZRHEQI.js} +6 -6
  318. package/dist/{chunk-OP2GD6QW.js → chunk-PV7U6OOJ.js} +2 -2
  319. package/dist/{chunk-SPD4ULVB.js → chunk-PYMROAWS.js} +2 -1
  320. package/dist/chunk-PYMROAWS.js.map +1 -0
  321. package/dist/{chunk-X2QJXDE4.js → chunk-PZQACDH5.js} +8 -8
  322. package/dist/{chunk-CH4UQ4NO.js → chunk-PZTS4O6E.js} +5 -5
  323. package/dist/{chunk-TKQL7EDB.js → chunk-Q42QHUAQ.js} +2 -2
  324. package/dist/{chunk-MRECRNVU.js → chunk-QCYGB6TZ.js} +5 -5
  325. package/dist/{chunk-GSCGKJNK.js → chunk-QECMETOF.js} +2 -2
  326. package/dist/{chunk-RMCLFSMX.js → chunk-QGX3LE6H.js} +2 -2
  327. package/dist/{chunk-HTMQGS63.js → chunk-QI3NDQFP.js} +8 -8
  328. package/dist/{chunk-UU5FBVRX.js → chunk-QZE4BTLA.js} +6 -5
  329. package/dist/chunk-QZE4BTLA.js.map +1 -0
  330. package/dist/{chunk-R5QAL43H.js → chunk-RA3Q52O2.js} +2 -2
  331. package/dist/chunk-RBOHWUSN.js +151 -0
  332. package/dist/chunk-RBOHWUSN.js.map +1 -0
  333. package/dist/{chunk-AJDGP2N4.js → chunk-RJNOQEJJ.js} +20 -20
  334. package/dist/{chunk-477DTTMH.js → chunk-RSFOFUR7.js} +3 -3
  335. package/dist/{chunk-JV5ULONH.js → chunk-RXR6PMSH.js} +39 -39
  336. package/dist/{chunk-J2BTILRR.js → chunk-SM7HFCGC.js} +2 -2
  337. package/dist/{chunk-UTRNLNCW.js → chunk-SN6ZWYOP.js} +69 -97
  338. package/dist/chunk-SN6ZWYOP.js.map +1 -0
  339. package/dist/{chunk-OBGOLHCP.js → chunk-T4HK4XCI.js} +3 -3
  340. package/dist/{chunk-XVLEBB4Y.js → chunk-TBWL6YWL.js} +2 -2
  341. package/dist/{chunk-AAS7OWV6.js → chunk-TIDXYWFX.js} +3 -3
  342. package/dist/{chunk-N3FM4BNA.js → chunk-TKHRGY2P.js} +2 -2
  343. package/dist/{chunk-GU7T2S5N.js → chunk-TU2GSZL7.js} +2 -2
  344. package/dist/{chunk-OI6VI6SU.js → chunk-U6HGJXXQ.js} +8 -8
  345. package/dist/{chunk-4BWMAGJJ.js → chunk-UGRW6RTR.js} +3 -3
  346. package/dist/{chunk-AVXDIRRW.js → chunk-UMRUDYUK.js} +2 -2
  347. package/dist/{chunk-FNXCFIPW.js → chunk-UOT2R5ZD.js} +2 -2
  348. package/dist/{chunk-DIP7YALH.js → chunk-USURKJVT.js} +2 -2
  349. package/dist/{chunk-S27VZ5DO.js → chunk-UU6Q67XM.js} +6 -6
  350. package/dist/{chunk-LTJFV2JI.js → chunk-UZ7NP5CW.js} +2 -2
  351. package/dist/{chunk-H6MJFMHZ.js → chunk-V4FO7UOE.js} +3 -3
  352. package/dist/{chunk-RGR57NYY.js → chunk-V4ZOZRCW.js} +2 -2
  353. package/dist/{chunk-LQKVNREV.js → chunk-V57YMKQZ.js} +3 -3
  354. package/dist/{chunk-XZCCEKPW.js → chunk-VOIWZBY6.js} +6 -6
  355. package/dist/{chunk-E5KOWRDU.js → chunk-VPHPLPDA.js} +2 -2
  356. package/dist/{chunk-OGU73VUN.js → chunk-VUL4KPUU.js} +2 -2
  357. package/dist/{chunk-SFIXTOOJ.js → chunk-VWF6ILAR.js} +3 -3
  358. package/dist/{chunk-FER6EVIY.js → chunk-W54BHJO7.js} +2 -2
  359. package/dist/{chunk-34NV52R3.js → chunk-WCYE4BLC.js} +4 -4
  360. package/dist/{chunk-RISUROBM.js → chunk-WTV25ELY.js} +4 -4
  361. package/dist/{chunk-UO35OEOX.js → chunk-WZYGH7CN.js} +3 -3
  362. package/dist/{chunk-CEMSIU4Z.js → chunk-XG2RWUF7.js} +5 -5
  363. package/dist/chunk-XK72HZ4C.js +147 -0
  364. package/dist/chunk-XK72HZ4C.js.map +1 -0
  365. package/dist/{chunk-K3D7IQQP.js → chunk-XV7QOT7W.js} +6 -6
  366. package/dist/{chunk-GOCODNQS.js → chunk-XWECT3GX.js} +2 -2
  367. package/dist/{chunk-5MHMCE2G.js → chunk-XZQK2ZLW.js} +3 -3
  368. package/dist/{chunk-JV3UI7BH.js → chunk-Y5BR66OH.js} +3 -3
  369. package/dist/{chunk-VXORMNU4.js → chunk-YBHAAULA.js} +67 -2
  370. package/dist/chunk-YBHAAULA.js.map +1 -0
  371. package/dist/{chunk-4F3AEJI6.js → chunk-YD6XU6FY.js} +4 -4
  372. package/dist/{chunk-VATYK3JQ.js → chunk-YFE47G3C.js} +3 -3
  373. package/dist/{chunk-ZR5EKJT6.js → chunk-YG6TWPP7.js} +2 -2
  374. package/dist/{chunk-44JWVYJB.js → chunk-YH3ARKBB.js} +2 -2
  375. package/dist/{chunk-752WXSDN.js → chunk-YI66STKJ.js} +2 -2
  376. package/dist/{chunk-QRECBCJM.js → chunk-YMVPYMKB.js} +2 -2
  377. package/dist/{chunk-77SYIH6O.js → chunk-YPIXBAF6.js} +2 -2
  378. package/dist/{chunk-WRMUXZ7C.js → chunk-YSWPNY6G.js} +3 -3
  379. package/dist/{chunk-GTHCHCWW.js → chunk-YWNNMBZG.js} +3 -3
  380. package/dist/{chunk-3DRLCX5V.js → chunk-Z3HYM2JT.js} +2 -2
  381. package/dist/{chunk-M3HGBO2Y.js → chunk-ZAC7YPRA.js} +1 -1
  382. package/dist/{chunk-2VJOSU4H.js → chunk-ZENESDAF.js} +2 -2
  383. package/dist/{chunk-4JXPLTWV.js → chunk-ZHAPMETO.js} +2 -2
  384. package/dist/{chunk-IJR6VOLU.js → chunk-ZVR6DUZH.js} +2 -2
  385. package/dist/components/message-timeline.d.ts +10 -2
  386. package/dist/composer.js +8 -8
  387. package/dist/{computer-viewer-5LKRCEVQ.js → computer-viewer-FOIOZUF5.js} +5 -5
  388. package/dist/connect.js +12 -12
  389. package/dist/desktop-dictation.js +8 -8
  390. package/dist/desktop.js +2 -2
  391. package/dist/editor.js +2 -2
  392. package/dist/{embedded-new-voice-GHJRY3YL.js → embedded-new-voice-WTXAJNGO.js} +5 -5
  393. package/dist/{embedded-voice-ASQXBSTX.js → embedded-voice-SIJOPN2G.js} +5 -5
  394. package/dist/{fleet-decision-row-U7LDVBEM.js → fleet-decision-row-XKQ3GMYT.js} +2 -2
  395. package/dist/hooks/use-recordings.d.ts +4 -2
  396. package/dist/in-chat-connect-model.js +5 -5
  397. package/dist/index.d.ts +2 -2
  398. package/dist/index.js +66 -60
  399. package/dist/interaction.js +5 -5
  400. package/dist/{latest-question-RNVF262Q.js → latest-question-KA7AQYVI.js} +2 -2
  401. package/dist/machines.js +3 -3
  402. package/dist/meetings/recorder-context.d.ts +6 -1
  403. package/dist/meetings/recorder-panel.d.ts +2 -5
  404. package/dist/meetings-recorder.js +1 -1
  405. package/dist/meetings.js +25 -23
  406. package/dist/meetings.js.map +1 -1
  407. package/dist/messages/en.d.ts +4 -0
  408. package/dist/messages.js +1 -1
  409. package/dist/{model-policy-picker-menu-E6XKMFTA.js → model-policy-picker-menu-6N2G7VGX.js} +4 -4
  410. package/dist/{payment-page-card-DJDKV2LW.js → payment-page-card-IJFZHQ52.js} +4 -4
  411. package/dist/{platform-activity-row-MSDCSMET.js → platform-activity-row-MFCMGI43.js} +2 -2
  412. package/dist/{queue-surface-implementation-GUAIG6TK.js → queue-surface-implementation-BBCDWWOP.js} +5 -5
  413. package/dist/realtime.js +4 -4
  414. package/dist/{recorder-host-2MYDJPQW.js → recorder-host-LDYYOKG7.js} +5 -5
  415. package/dist/recordings.js +4 -4
  416. package/dist/{sandbox-files-W5W2LW4K.js → sandbox-files-VYRBIXJY.js} +6 -6
  417. package/dist/session-app.js +160 -157
  418. package/dist/{session-connect-cards-HPH7JOZP.js → session-connect-cards-GBPSL6OT.js} +9 -9
  419. package/dist/session-connect-cards-GBPSL6OT.js.map +1 -0
  420. package/dist/session-list-model.js +2 -2
  421. package/dist/{session-realtime-SDTKFFIR.js → session-realtime-QGU57TND.js} +3 -3
  422. package/dist/session-realtime-QGU57TND.js.map +1 -0
  423. package/dist/session-realtime.js +2 -2
  424. package/dist/session-ui.js +33 -33
  425. package/dist/session.d.ts +3 -2
  426. package/dist/session.js +16 -10
  427. package/dist/sites.js +2 -2
  428. package/dist/terminal.js +2 -2
  429. package/dist/this-computer.js +3 -3
  430. package/dist/timeline/index.d.ts +3 -2
  431. package/dist/timeline/projection.d.ts +52 -0
  432. package/dist/timeline/turn-summary-model.d.ts +4 -3
  433. package/dist/timeline/types.d.ts +8 -2
  434. package/dist/timeline/use-timeline-pauses.d.ts +12 -0
  435. package/dist/timeline/work-presentation.d.ts +4 -3
  436. package/dist/{timeline-annotation-markers-FNILLWNU.js → timeline-annotation-markers-LL6ZVBZH.js} +2 -2
  437. package/dist/{timeline-annotation-selection-MBCIDO2Q.js → timeline-annotation-selection-WQA76WYC.js} +2 -2
  438. package/dist/{timeline-annotations-dialog-JPNKLOTE.js → timeline-annotations-dialog-HHETAEZA.js} +3 -3
  439. package/dist/timeline-model.js +2 -2
  440. package/dist/ui/access-list.js +5 -5
  441. package/dist/ui/cadence-picker.js +4 -4
  442. package/dist/ui/choice-cards.js +3 -3
  443. package/dist/ui/confirm-dialog.js +2 -2
  444. package/dist/ui/copy-field.js +3 -3
  445. package/dist/ui/detail-page.js +2 -2
  446. package/dist/ui/detail-sheet.js +2 -2
  447. package/dist/ui/disclosure.js +3 -3
  448. package/dist/ui/email-chips-input.js +3 -3
  449. package/dist/ui/field.js +2 -2
  450. package/dist/ui/flush-form-page.js +3 -3
  451. package/dist/ui/form-dialog.js +2 -2
  452. package/dist/ui/list-row.js +3 -3
  453. package/dist/ui/relative-time.js +2 -2
  454. package/dist/ui/revision-history.js +4 -4
  455. package/dist/ui/role-select.js +5 -5
  456. package/dist/ui/select-menu.js +3 -3
  457. package/dist/ui/usage-meter.d.ts +8 -2
  458. package/dist/ui/usage-meter.js +5 -3
  459. package/dist/usage.js +2 -2
  460. package/dist/workbench.js +4 -4
  461. package/package.json +6 -5
  462. package/src/app/components/agent/agent-capability-picker.test.tsx +1 -1
  463. package/src/app/components/models/subscription-usage.tsx +178 -0
  464. package/src/app/components/rail/session-row-content.tsx +27 -0
  465. package/src/app/components/session/subscription-account-indicator.test.ts +78 -18
  466. package/src/app/components/session/subscription-account-indicator.tsx +16 -31
  467. package/src/app/components/session/subscription-account-menu.tsx +79 -101
  468. package/src/app/components/session/subscription-account.test.ts +161 -54
  469. package/src/app/components/session/subscription-account.ts +106 -117
  470. package/src/app/lib/agent-capabilities.tsx +34 -7
  471. package/src/app/lib/session-branch-cache.tsx +1 -0
  472. package/src/app/lib/session-pins.tsx +1 -0
  473. package/src/app/lib/session-row-paused.test.tsx +183 -0
  474. package/src/app/lib/sessions-group-channels.test.ts +4 -4
  475. package/src/app/lib/sessions-group.tsx +62 -4
  476. package/src/app/lib/subscription-accounts.tsx +283 -0
  477. package/src/app/routes/session.tsx +2 -0
  478. package/src/components/message-timeline.tsx +14 -2
  479. package/src/components/session-conversation.tsx +2 -1
  480. package/src/components/timeline-annotations.tsx +4 -1
  481. package/src/components/timeline-settlement.ts +1 -1
  482. package/src/hooks/use-composer.ts +104 -25
  483. package/src/hooks/use-recordings.ts +5 -0
  484. package/src/index.ts +5 -0
  485. package/src/meetings/meeting-detail-page.tsx +4 -2
  486. package/src/meetings/meetings-pages.test.tsx +38 -0
  487. package/src/meetings/recorder-context.tsx +28 -5
  488. package/src/meetings/recorder-panel.tsx +13 -5
  489. package/src/meetings/recorder-workspace.test.tsx +57 -8
  490. package/src/messages/en.ts +5 -0
  491. package/src/recordings-model.ts +7 -0
  492. package/src/session.ts +8 -1
  493. package/src/timeline/index.ts +4 -1
  494. package/src/timeline/projection.ts +228 -16
  495. package/src/timeline/turn-summary-model.ts +4 -3
  496. package/src/timeline/turn-summary.tsx +15 -2
  497. package/src/timeline/types.ts +8 -2
  498. package/src/timeline/use-timeline-pauses.ts +105 -0
  499. package/src/timeline/work-presentation.ts +13 -4
  500. package/src/ui/usage-meter.tsx +10 -7
  501. package/styles/compiled.css +3 -0
  502. package/dist/chunk-2OXSB2OL.js.map +0 -1
  503. package/dist/chunk-3PM3M2Q6.js.map +0 -1
  504. package/dist/chunk-7YTR3UFO.js.map +0 -1
  505. package/dist/chunk-7Z76QP64.js.map +0 -1
  506. package/dist/chunk-JHZRAYI4.js.map +0 -1
  507. package/dist/chunk-M5IQVMLR.js.map +0 -1
  508. package/dist/chunk-NQ2CPQJF.js.map +0 -1
  509. package/dist/chunk-O2UPPN5M.js +0 -2
  510. package/dist/chunk-O4JOE3R7.js.map +0 -1
  511. package/dist/chunk-PF2WU2IL.js.map +0 -1
  512. package/dist/chunk-PSM3CU7N.js.map +0 -1
  513. package/dist/chunk-PZKHST7A.js.map +0 -1
  514. package/dist/chunk-Q5K2J5GG.js.map +0 -1
  515. package/dist/chunk-QPQ7R77C.js.map +0 -1
  516. package/dist/chunk-QQIZMVAJ.js.map +0 -1
  517. package/dist/chunk-SK5S2PCK.js.map +0 -1
  518. package/dist/chunk-SPD4ULVB.js.map +0 -1
  519. package/dist/chunk-UTRNLNCW.js.map +0 -1
  520. package/dist/chunk-UU5FBVRX.js.map +0 -1
  521. package/dist/chunk-VXORMNU4.js.map +0 -1
  522. package/dist/chunk-WYGTAQMX.js.map +0 -1
  523. /package/dist/{browser-viewer-ZHQDVHZ2.js.map → app/components/models/subscription-usage.js.map} +0 -0
  524. /package/dist/{chat-interactive-block-VSDD6X3M.js.map → app/lib/subscription-accounts.js.map} +0 -0
  525. /package/dist/{chunk-O2UPPN5M.js.map → browser-viewer-F4FL7JKB.js.map} +0 -0
  526. /package/dist/{computer-viewer-5LKRCEVQ.js.map → chat-interactive-block-4U5JWRSY.js.map} +0 -0
  527. /package/dist/{chunk-4K64EKM7.js.map → chunk-22YIIM3X.js.map} +0 -0
  528. /package/dist/{chunk-3NNAC43A.js.map → chunk-2N7ACQ7M.js.map} +0 -0
  529. /package/dist/{chunk-WDASYY4S.js.map → chunk-2TEYUDJD.js.map} +0 -0
  530. /package/dist/{chunk-OTW25A6I.js.map → chunk-37JJQNZB.js.map} +0 -0
  531. /package/dist/{chunk-VCJQQYRE.js.map → chunk-3DWQPURZ.js.map} +0 -0
  532. /package/dist/{chunk-GTRAH4FG.js.map → chunk-3GWC3FU3.js.map} +0 -0
  533. /package/dist/{chunk-AB5IW227.js.map → chunk-3ICY6LP3.js.map} +0 -0
  534. /package/dist/{chunk-WIFDNUKD.js.map → chunk-3OCU5RX5.js.map} +0 -0
  535. /package/dist/{chunk-UBRQ3PQD.js.map → chunk-3SPDJLOR.js.map} +0 -0
  536. /package/dist/{chunk-IZXYFWA4.js.map → chunk-3WVLR7UA.js.map} +0 -0
  537. /package/dist/{chunk-DEHLWZSI.js.map → chunk-3XMB3L57.js.map} +0 -0
  538. /package/dist/{chunk-AJBDAVX3.js.map → chunk-4IUOBO2H.js.map} +0 -0
  539. /package/dist/{chunk-NFCS5WYC.js.map → chunk-4KQ3A3EO.js.map} +0 -0
  540. /package/dist/{chunk-LIJNVIT3.js.map → chunk-4L5B5AZT.js.map} +0 -0
  541. /package/dist/{chunk-EDDKPIIV.js.map → chunk-4NB3TPNE.js.map} +0 -0
  542. /package/dist/{chunk-OJWDNNW3.js.map → chunk-4TPTGBIO.js.map} +0 -0
  543. /package/dist/{chunk-J2WY42FA.js.map → chunk-4UHGW6WF.js.map} +0 -0
  544. /package/dist/{chunk-7NLF35YL.js.map → chunk-4YN2JLYK.js.map} +0 -0
  545. /package/dist/{chunk-OOOSGPJL.js.map → chunk-53MYEEMA.js.map} +0 -0
  546. /package/dist/{chunk-467WDSOK.js.map → chunk-5HYWXPMA.js.map} +0 -0
  547. /package/dist/{chunk-XMBOLFFS.js.map → chunk-5IMNL6IV.js.map} +0 -0
  548. /package/dist/{chunk-4Z5X7PLC.js.map → chunk-5MLM5T5C.js.map} +0 -0
  549. /package/dist/{chunk-YMI27QPF.js.map → chunk-5NKQZVXP.js.map} +0 -0
  550. /package/dist/{chunk-CYDXCILL.js.map → chunk-5SODSGW7.js.map} +0 -0
  551. /package/dist/{chunk-Q5EZNBPI.js.map → chunk-5YAJASCO.js.map} +0 -0
  552. /package/dist/{chunk-M3FDGRB4.js.map → chunk-62XAL5BA.js.map} +0 -0
  553. /package/dist/{chunk-SGH7I7OY.js.map → chunk-67R6NAFI.js.map} +0 -0
  554. /package/dist/{chunk-PYB4BFEC.js.map → chunk-6BQLDL6R.js.map} +0 -0
  555. /package/dist/{chunk-YJSCLGAW.js.map → chunk-6EZYHJTL.js.map} +0 -0
  556. /package/dist/{chunk-G5UQBTXY.js.map → chunk-6LXIL3Q3.js.map} +0 -0
  557. /package/dist/{chunk-T67LTMSW.js.map → chunk-6LYVAJFZ.js.map} +0 -0
  558. /package/dist/{chunk-3L465FBR.js.map → chunk-6WB5UXMZ.js.map} +0 -0
  559. /package/dist/{chunk-EKJHOWTZ.js.map → chunk-74UGYVCA.js.map} +0 -0
  560. /package/dist/{chunk-PWUSSSSL.js.map → chunk-7BTNYZC7.js.map} +0 -0
  561. /package/dist/{chunk-ESXAECZ3.js.map → chunk-7KZFGA25.js.map} +0 -0
  562. /package/dist/{chunk-EGKARC53.js.map → chunk-7MGDX2TD.js.map} +0 -0
  563. /package/dist/{chunk-Y3XZEKDQ.js.map → chunk-7N3GFGB6.js.map} +0 -0
  564. /package/dist/{chunk-AH3DGOTK.js.map → chunk-7SFSN6AX.js.map} +0 -0
  565. /package/dist/{chunk-6QK65ZWM.js.map → chunk-7TGUHFGO.js.map} +0 -0
  566. /package/dist/{chunk-QURYQFDN.js.map → chunk-7ZIWO65F.js.map} +0 -0
  567. /package/dist/{chunk-OYCK4JRS.js.map → chunk-AJHLEJTK.js.map} +0 -0
  568. /package/dist/{chunk-3PZ3LRPV.js.map → chunk-AN4U7EPH.js.map} +0 -0
  569. /package/dist/{chunk-77BHKC43.js.map → chunk-APG6CEG7.js.map} +0 -0
  570. /package/dist/{chunk-FSDQQQIA.js.map → chunk-APHLXQNP.js.map} +0 -0
  571. /package/dist/{chunk-SN2WENRP.js.map → chunk-AXHQ7QXV.js.map} +0 -0
  572. /package/dist/{chunk-54U6ZBEX.js.map → chunk-AYTLSPF6.js.map} +0 -0
  573. /package/dist/{chunk-R33SBMB7.js.map → chunk-BBSKKBMV.js.map} +0 -0
  574. /package/dist/{chunk-2GCHGWNE.js.map → chunk-BGH6TU2P.js.map} +0 -0
  575. /package/dist/{chunk-D3PTVN2I.js.map → chunk-BGIYL26H.js.map} +0 -0
  576. /package/dist/{chunk-BQYRZIZ7.js.map → chunk-BL7UQUC3.js.map} +0 -0
  577. /package/dist/{chunk-EBTUPRRQ.js.map → chunk-BOUHCYL6.js.map} +0 -0
  578. /package/dist/{chunk-MKDFYE2E.js.map → chunk-BVNGDFBC.js.map} +0 -0
  579. /package/dist/{chunk-ICAMYP5M.js.map → chunk-BWJK64CP.js.map} +0 -0
  580. /package/dist/{chunk-RHXYO4H2.js.map → chunk-BZ2GTCQV.js.map} +0 -0
  581. /package/dist/{chunk-GIWFLWXG.js.map → chunk-C2KASMJK.js.map} +0 -0
  582. /package/dist/{chunk-KO3OHHY2.js.map → chunk-CAZDRDQT.js.map} +0 -0
  583. /package/dist/{chunk-OK7BQMCI.js.map → chunk-CBJRZKZB.js.map} +0 -0
  584. /package/dist/{chunk-OYOFPNLC.js.map → chunk-CF6NYG7J.js.map} +0 -0
  585. /package/dist/{chunk-MT2R57SF.js.map → chunk-COITN7WN.js.map} +0 -0
  586. /package/dist/{chunk-OCXTTKVA.js.map → chunk-CPVOXM2Q.js.map} +0 -0
  587. /package/dist/{chunk-HYEIA25Y.js.map → chunk-CTZRCBKH.js.map} +0 -0
  588. /package/dist/{chunk-OCXEY7HE.js.map → chunk-CWL27YTB.js.map} +0 -0
  589. /package/dist/{chunk-K4DQS2ML.js.map → chunk-D2I33V5P.js.map} +0 -0
  590. /package/dist/{chunk-736RUNIA.js.map → chunk-DF7WI4JH.js.map} +0 -0
  591. /package/dist/{chunk-KUE5BOQE.js.map → chunk-DKZYCJCO.js.map} +0 -0
  592. /package/dist/{chunk-74CBR5YE.js.map → chunk-DQ32FKFQ.js.map} +0 -0
  593. /package/dist/{chunk-4O2XWOLZ.js.map → chunk-DTKG2YUF.js.map} +0 -0
  594. /package/dist/{chunk-GMHIOYB7.js.map → chunk-DUDA4V5R.js.map} +0 -0
  595. /package/dist/{chunk-XUOYNJPB.js.map → chunk-ECROT4M5.js.map} +0 -0
  596. /package/dist/{chunk-PVB4YVDP.js.map → chunk-EOXV5XGY.js.map} +0 -0
  597. /package/dist/{chunk-U6552Q3T.js.map → chunk-EQQOZ6DD.js.map} +0 -0
  598. /package/dist/{chunk-G6ICCGJ3.js.map → chunk-EY6W5H4B.js.map} +0 -0
  599. /package/dist/{chunk-HWVPLFIW.js.map → chunk-EYRFEWXJ.js.map} +0 -0
  600. /package/dist/{chunk-U4LTPFD2.js.map → chunk-FKK2PD7K.js.map} +0 -0
  601. /package/dist/{chunk-PUUEI4W3.js.map → chunk-FPHHIC5K.js.map} +0 -0
  602. /package/dist/{chunk-SP44O3OU.js.map → chunk-FQM6L22H.js.map} +0 -0
  603. /package/dist/{chunk-2J77TWGH.js.map → chunk-FW22IREV.js.map} +0 -0
  604. /package/dist/{chunk-EBIVTDEG.js.map → chunk-G4M6AYDB.js.map} +0 -0
  605. /package/dist/{chunk-BASI553K.js.map → chunk-G6AZ2WIU.js.map} +0 -0
  606. /package/dist/{chunk-SJYTQLN3.js.map → chunk-GJ5IDSAX.js.map} +0 -0
  607. /package/dist/{chunk-TDTD66BK.js.map → chunk-GRDSEZWZ.js.map} +0 -0
  608. /package/dist/{chunk-MV2CLIO6.js.map → chunk-HBVJIGY2.js.map} +0 -0
  609. /package/dist/{chunk-R4JA5JFI.js.map → chunk-HCWQLIOE.js.map} +0 -0
  610. /package/dist/{chunk-MZY3VKKM.js.map → chunk-HEVD4A5G.js.map} +0 -0
  611. /package/dist/{chunk-DLVIRJGK.js.map → chunk-HNDHSEVJ.js.map} +0 -0
  612. /package/dist/{chunk-LPKJ77EK.js.map → chunk-HNTZ7B7M.js.map} +0 -0
  613. /package/dist/{chunk-IN3VQFKS.js.map → chunk-I2FC7CAI.js.map} +0 -0
  614. /package/dist/{chunk-ZBHGNE2J.js.map → chunk-IEHZFYMH.js.map} +0 -0
  615. /package/dist/{chunk-DWJ6J3YW.js.map → chunk-IXISEVD7.js.map} +0 -0
  616. /package/dist/{chunk-TK5FWVZR.js.map → chunk-IZEDVQUD.js.map} +0 -0
  617. /package/dist/{chunk-HEGV4QMS.js.map → chunk-J42QE4VO.js.map} +0 -0
  618. /package/dist/{chunk-PRT4J2DL.js.map → chunk-J555XSUM.js.map} +0 -0
  619. /package/dist/{chunk-SBXSKRFA.js.map → chunk-JNMHFSDF.js.map} +0 -0
  620. /package/dist/{chunk-KI46GKMD.js.map → chunk-JTBAOPYO.js.map} +0 -0
  621. /package/dist/{chunk-SXGJL7UT.js.map → chunk-K376MPJH.js.map} +0 -0
  622. /package/dist/{chunk-OSJ366KR.js.map → chunk-KEBVT55V.js.map} +0 -0
  623. /package/dist/{chunk-U5UGM5XD.js.map → chunk-KFIZAXHI.js.map} +0 -0
  624. /package/dist/{chunk-KFNZZ2N6.js.map → chunk-KKGRDBMK.js.map} +0 -0
  625. /package/dist/{chunk-PLYVGZIN.js.map → chunk-KKIG6DN5.js.map} +0 -0
  626. /package/dist/{chunk-3OK7Y6ES.js.map → chunk-KKQO2GAA.js.map} +0 -0
  627. /package/dist/{chunk-DQPIEQGP.js.map → chunk-KO753ZCZ.js.map} +0 -0
  628. /package/dist/{chunk-YNTLWCF4.js.map → chunk-KYIRWU65.js.map} +0 -0
  629. /package/dist/{chunk-JKL5S7UQ.js.map → chunk-L6V63DVI.js.map} +0 -0
  630. /package/dist/{chunk-CV4VVLPZ.js.map → chunk-LCNJ2KNS.js.map} +0 -0
  631. /package/dist/{chunk-D74Z2N4K.js.map → chunk-LE7YKMTU.js.map} +0 -0
  632. /package/dist/{chunk-D5TIVCXG.js.map → chunk-LEBEOMVT.js.map} +0 -0
  633. /package/dist/{embedded-new-voice-GHJRY3YL.js.map → chunk-LKLQVANM.js.map} +0 -0
  634. /package/dist/{chunk-WXF2RTS4.js.map → chunk-M6URPYUB.js.map} +0 -0
  635. /package/dist/{chunk-H6BX6WOW.js.map → chunk-MDHFMRBC.js.map} +0 -0
  636. /package/dist/{chunk-3CDJSKDW.js.map → chunk-MGZO7CHI.js.map} +0 -0
  637. /package/dist/{chunk-DCEQCGVN.js.map → chunk-MIWU52TW.js.map} +0 -0
  638. /package/dist/{chunk-LVELUUK6.js.map → chunk-NF6QVVMP.js.map} +0 -0
  639. /package/dist/{chunk-UMX6DZME.js.map → chunk-NTZ5ZNVK.js.map} +0 -0
  640. /package/dist/{chunk-FBA2NXYH.js.map → chunk-NWLRABUR.js.map} +0 -0
  641. /package/dist/{chunk-TNSJFZ6Q.js.map → chunk-O2H2U7YS.js.map} +0 -0
  642. /package/dist/{chunk-BFFNINCC.js.map → chunk-OAL2PPX4.js.map} +0 -0
  643. /package/dist/{chunk-WTSQUCHB.js.map → chunk-OCYTHZ4A.js.map} +0 -0
  644. /package/dist/{chunk-ZAX4XQLN.js.map → chunk-OEDTCIXF.js.map} +0 -0
  645. /package/dist/{chunk-CHU3RDV4.js.map → chunk-OLVSYB3P.js.map} +0 -0
  646. /package/dist/{chunk-IFSXVU2S.js.map → chunk-OQHTFOCA.js.map} +0 -0
  647. /package/dist/{chunk-OXQ2SXVC.js.map → chunk-P56AVROH.js.map} +0 -0
  648. /package/dist/{chunk-CXAN2FHF.js.map → chunk-PCEJHHGP.js.map} +0 -0
  649. /package/dist/{chunk-5MIBQ4P5.js.map → chunk-PHGQGVVL.js.map} +0 -0
  650. /package/dist/{chunk-FLWQJDJ5.js.map → chunk-PUZRHEQI.js.map} +0 -0
  651. /package/dist/{chunk-OP2GD6QW.js.map → chunk-PV7U6OOJ.js.map} +0 -0
  652. /package/dist/{chunk-X2QJXDE4.js.map → chunk-PZQACDH5.js.map} +0 -0
  653. /package/dist/{chunk-CH4UQ4NO.js.map → chunk-PZTS4O6E.js.map} +0 -0
  654. /package/dist/{chunk-TKQL7EDB.js.map → chunk-Q42QHUAQ.js.map} +0 -0
  655. /package/dist/{chunk-MRECRNVU.js.map → chunk-QCYGB6TZ.js.map} +0 -0
  656. /package/dist/{chunk-GSCGKJNK.js.map → chunk-QECMETOF.js.map} +0 -0
  657. /package/dist/{chunk-RMCLFSMX.js.map → chunk-QGX3LE6H.js.map} +0 -0
  658. /package/dist/{chunk-HTMQGS63.js.map → chunk-QI3NDQFP.js.map} +0 -0
  659. /package/dist/{chunk-R5QAL43H.js.map → chunk-RA3Q52O2.js.map} +0 -0
  660. /package/dist/{chunk-AJDGP2N4.js.map → chunk-RJNOQEJJ.js.map} +0 -0
  661. /package/dist/{chunk-477DTTMH.js.map → chunk-RSFOFUR7.js.map} +0 -0
  662. /package/dist/{chunk-JV5ULONH.js.map → chunk-RXR6PMSH.js.map} +0 -0
  663. /package/dist/{chunk-J2BTILRR.js.map → chunk-SM7HFCGC.js.map} +0 -0
  664. /package/dist/{chunk-OBGOLHCP.js.map → chunk-T4HK4XCI.js.map} +0 -0
  665. /package/dist/{chunk-XVLEBB4Y.js.map → chunk-TBWL6YWL.js.map} +0 -0
  666. /package/dist/{chunk-AAS7OWV6.js.map → chunk-TIDXYWFX.js.map} +0 -0
  667. /package/dist/{chunk-N3FM4BNA.js.map → chunk-TKHRGY2P.js.map} +0 -0
  668. /package/dist/{chunk-GU7T2S5N.js.map → chunk-TU2GSZL7.js.map} +0 -0
  669. /package/dist/{chunk-OI6VI6SU.js.map → chunk-U6HGJXXQ.js.map} +0 -0
  670. /package/dist/{chunk-4BWMAGJJ.js.map → chunk-UGRW6RTR.js.map} +0 -0
  671. /package/dist/{chunk-AVXDIRRW.js.map → chunk-UMRUDYUK.js.map} +0 -0
  672. /package/dist/{chunk-FNXCFIPW.js.map → chunk-UOT2R5ZD.js.map} +0 -0
  673. /package/dist/{chunk-DIP7YALH.js.map → chunk-USURKJVT.js.map} +0 -0
  674. /package/dist/{chunk-S27VZ5DO.js.map → chunk-UU6Q67XM.js.map} +0 -0
  675. /package/dist/{chunk-LTJFV2JI.js.map → chunk-UZ7NP5CW.js.map} +0 -0
  676. /package/dist/{chunk-H6MJFMHZ.js.map → chunk-V4FO7UOE.js.map} +0 -0
  677. /package/dist/{chunk-RGR57NYY.js.map → chunk-V4ZOZRCW.js.map} +0 -0
  678. /package/dist/{chunk-LQKVNREV.js.map → chunk-V57YMKQZ.js.map} +0 -0
  679. /package/dist/{chunk-XZCCEKPW.js.map → chunk-VOIWZBY6.js.map} +0 -0
  680. /package/dist/{chunk-E5KOWRDU.js.map → chunk-VPHPLPDA.js.map} +0 -0
  681. /package/dist/{chunk-OGU73VUN.js.map → chunk-VUL4KPUU.js.map} +0 -0
  682. /package/dist/{chunk-SFIXTOOJ.js.map → chunk-VWF6ILAR.js.map} +0 -0
  683. /package/dist/{chunk-FER6EVIY.js.map → chunk-W54BHJO7.js.map} +0 -0
  684. /package/dist/{chunk-34NV52R3.js.map → chunk-WCYE4BLC.js.map} +0 -0
  685. /package/dist/{chunk-RISUROBM.js.map → chunk-WTV25ELY.js.map} +0 -0
  686. /package/dist/{chunk-UO35OEOX.js.map → chunk-WZYGH7CN.js.map} +0 -0
  687. /package/dist/{chunk-CEMSIU4Z.js.map → chunk-XG2RWUF7.js.map} +0 -0
  688. /package/dist/{chunk-K3D7IQQP.js.map → chunk-XV7QOT7W.js.map} +0 -0
  689. /package/dist/{chunk-GOCODNQS.js.map → chunk-XWECT3GX.js.map} +0 -0
  690. /package/dist/{chunk-5MHMCE2G.js.map → chunk-XZQK2ZLW.js.map} +0 -0
  691. /package/dist/{chunk-JV3UI7BH.js.map → chunk-Y5BR66OH.js.map} +0 -0
  692. /package/dist/{chunk-4F3AEJI6.js.map → chunk-YD6XU6FY.js.map} +0 -0
  693. /package/dist/{chunk-VATYK3JQ.js.map → chunk-YFE47G3C.js.map} +0 -0
  694. /package/dist/{chunk-ZR5EKJT6.js.map → chunk-YG6TWPP7.js.map} +0 -0
  695. /package/dist/{chunk-44JWVYJB.js.map → chunk-YH3ARKBB.js.map} +0 -0
  696. /package/dist/{chunk-752WXSDN.js.map → chunk-YI66STKJ.js.map} +0 -0
  697. /package/dist/{chunk-QRECBCJM.js.map → chunk-YMVPYMKB.js.map} +0 -0
  698. /package/dist/{chunk-77SYIH6O.js.map → chunk-YPIXBAF6.js.map} +0 -0
  699. /package/dist/{chunk-WRMUXZ7C.js.map → chunk-YSWPNY6G.js.map} +0 -0
  700. /package/dist/{chunk-GTHCHCWW.js.map → chunk-YWNNMBZG.js.map} +0 -0
  701. /package/dist/{chunk-3DRLCX5V.js.map → chunk-Z3HYM2JT.js.map} +0 -0
  702. /package/dist/{chunk-M3HGBO2Y.js.map → chunk-ZAC7YPRA.js.map} +0 -0
  703. /package/dist/{chunk-2VJOSU4H.js.map → chunk-ZENESDAF.js.map} +0 -0
  704. /package/dist/{chunk-4JXPLTWV.js.map → chunk-ZHAPMETO.js.map} +0 -0
  705. /package/dist/{chunk-IJR6VOLU.js.map → chunk-ZVR6DUZH.js.map} +0 -0
  706. /package/dist/{embedded-voice-ASQXBSTX.js.map → computer-viewer-FOIOZUF5.js.map} +0 -0
  707. /package/dist/{model-policy-picker-menu-E6XKMFTA.js.map → embedded-new-voice-WTXAJNGO.js.map} +0 -0
  708. /package/dist/{sandbox-files-W5W2LW4K.js.map → embedded-voice-SIJOPN2G.js.map} +0 -0
  709. /package/dist/{fleet-decision-row-U7LDVBEM.js.map → fleet-decision-row-XKQ3GMYT.js.map} +0 -0
  710. /package/dist/{latest-question-RNVF262Q.js.map → latest-question-KA7AQYVI.js.map} +0 -0
  711. /package/dist/{session-connect-cards-HPH7JOZP.js.map → model-policy-picker-menu-6N2G7VGX.js.map} +0 -0
  712. /package/dist/{payment-page-card-DJDKV2LW.js.map → payment-page-card-IJFZHQ52.js.map} +0 -0
  713. /package/dist/{platform-activity-row-MSDCSMET.js.map → platform-activity-row-MFCMGI43.js.map} +0 -0
  714. /package/dist/{queue-surface-implementation-GUAIG6TK.js.map → queue-surface-implementation-BBCDWWOP.js.map} +0 -0
  715. /package/dist/{recorder-host-2MYDJPQW.js.map → recorder-host-LDYYOKG7.js.map} +0 -0
  716. /package/dist/{session-realtime-SDTKFFIR.js.map → sandbox-files-VYRBIXJY.js.map} +0 -0
  717. /package/dist/{timeline-annotation-markers-FNILLWNU.js.map → timeline-annotation-markers-LL6ZVBZH.js.map} +0 -0
  718. /package/dist/{timeline-annotation-selection-MBCIDO2Q.js.map → timeline-annotation-selection-WQA76WYC.js.map} +0 -0
  719. /package/dist/{timeline-annotations-dialog-JPNKLOTE.js.map → timeline-annotations-dialog-HHETAEZA.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-composer.ts","../src/lib/notify-observer.ts","../src/hooks/use-queued-prompt-recall.ts"],"sourcesContent":["import {\n DEFAULT_FILE_RESOURCE_MOUNT_ROOT,\n type ComposerDraft,\n type DraftTimelineAnnotation,\n type EffectiveControlResumeOption,\n type EffectiveSessionControl,\n type LatencyMode,\n OpenGeniApiError,\n type ReasoningEffort,\n type ResourceRef,\n type SaveComposerDraftRequest,\n type SendMessageInput,\n type SessionEvent,\n type SubmitComposerDraftResponse,\n isMaintenanceError,\n} from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { useEmbeddedSession, type EmbeddedSessionClientOverride } from \"../session-context\";\nimport {\n COMPOSER_MODEL_UNAVAILABLE_MESSAGE,\n COMPOSER_ACCOUNT_UNAVAILABLE_MESSAGE,\n ComposerReconciliationRequiredError,\n ComposerStateError,\n ComposerWorkspaceControlUnavailableError,\n composerSubmissionCanRetry,\n composerSubmissionErrorMessage,\n} from \"../lib/format\";\nimport { normalizeError, useErrorMessage } from \"../lib/error-message\";\nimport { notifyObserver as notifyComposerObserver } from \"../lib/notify-observer\";\nimport {\n isActionFailure,\n isCalmServiceFailure,\n isTransientServiceFailure,\n markActionFailure,\n TRANSIENT_RECONNECT_INTERVAL_MS,\n} from \"../lib/transient-retry\";\nimport { useSessionEventTrigger, type SessionEventFeedOptions } from \"./internal\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\nexport type ComposerPolicy = {\n model: string;\n reasoningEffort: ReasoningEffort;\n latencyMode: LatencyMode;\n};\n\nexport type ComposerSendExtras = Omit<\n SendMessageInput,\n \"text\" | \"clientEventId\" | \"annotations\" | \"model\" | \"reasoningEffort\" | \"latencyMode\"\n>;\n\n/** Unsent local content handed off from a new-conversation composer. */\nexport type InitialComposerDraft = {\n text: string;\n resources?: ResourceRef[] | undefined;\n annotations?: DraftTimelineAnnotation[] | undefined;\n policy?: ComposerPolicy | undefined;\n};\n\n/**\n * What an ordinary Send does while the agent is working: `queue` runs it after\n * the current turn, `steer` has the agent read it as soon as it can, usually\n * within seconds.\n */\nexport type ComposerBusySend = \"queue\" | \"steer\";\n\nexport type UseComposerOptions = EmbeddedSessionClientOverride &\n SessionEventFeedOptions & {\n /**\n * Whether the viewer can buy credits or upgrade the plan. When false, a\n * credit refusal tells them to ask an organization owner. Defaults to true.\n */\n canBuyCredits?: boolean | undefined;\n /** Called synchronously after local submission. Observer errors never change delivery. */\n onSubmitted?: ((text: string, input: SendMessageInput) => void) | undefined;\n /** Called with the accepted wire input. Observer errors never turn acceptance into failure. */\n onSent?: ((text: string, input: SendMessageInput) => void) | undefined;\n /** Called with the exact wire input after a delivery failure. */\n onDeliveryError?:\n | ((error: Error, input: SendMessageInput, delivery: \"send\" | \"steer\") => void)\n | undefined;\n /**\n * Non-policy message fields merged into every send. Durable policy belongs\n * to this composer draft; attachments and credentials may remain host-owned.\n */\n sendExtras?: ComposerSendExtras | (() => ComposerSendExtras) | undefined;\n /**\n * Fail-closed delivery guard evaluated at send time. Attachment hosts use\n * this to preserve unresolved upload cards until the operator waits,\n * retries, or removes them; direct hook callers cannot bypass the UI gate.\n */\n sendBlocked?: (() => boolean) | undefined;\n /** Latest server-derived workstream control; bound into Send/Steer OCC. */\n effectiveControl?: EffectiveSessionControl | null | undefined;\n /** Immediate user-visible destination for an ordinary Send before admission replies. */\n sendDestination?: (() => \"chat\" | \"queue\") | undefined;\n /**\n * What an ordinary Send does while the agent is working (while\n * `sendDestination` reports `queue`). `queue` (default) runs the message\n * after the current turn. `steer` delivers it as a Steer instead: the\n * agent reads it as soon as it can, usually within seconds (a reply still\n * being written stops; running tools are not cut off). `sendToQueue`\n * and `steer` stay explicit either way.\n *\n * Under `steer` the person has one Send and nothing to learn: no Queue\n * choice beside it, no Queue or Steer words (`singleSend`). Set\n * `offerQueue` to also offer Queue beside Send.\n */\n busySend?: ComposerBusySend | undefined;\n /**\n * Under `busySend: \"steer\"`, also offer Queue beside Send while the agent\n * works (and on Cmd/Ctrl+Enter), for people who line up follow-ups. Off\n * by default; under `busySend: \"queue\"` Steer is always offered.\n */\n offerQueue?: boolean | undefined;\n /** Disable remote composer-draft reads and writes for embedded hosts. */\n draftPersistence?: \"durable\" | \"disabled\" | undefined;\n /** Required explicit authority when durable draft persistence is disabled. */\n initialPolicy?: ComposerPolicy | undefined;\n /**\n * Seed local unsent content once when this session is mounted/selected.\n * The real server draft still supplies the revision used for persistence.\n * A retained uncertain submission takes precedence over this handoff.\n * An empty seed does not erase an existing server draft.\n */\n initialDraft?: InitialComposerDraft | undefined;\n };\n\ntype ComposerDraftShadow = {\n text: string;\n resources: ResourceRef[];\n annotations: DraftTimelineAnnotation[];\n policy?: ComposerPolicy | undefined;\n};\n\nfunction initialComposerShadow(\n seed: InitialComposerDraft | undefined,\n): ComposerDraftShadow | undefined {\n if (!seed || (!seed.text && !seed.resources?.length && !seed.annotations?.length && !seed.policy))\n return undefined;\n return {\n text: seed.text,\n resources: [...(seed.resources ?? [])],\n annotations: cloneAnnotations(seed.annotations ?? []),\n ...(seed.policy ? { policy: { ...seed.policy } } : {}),\n };\n}\n\ntype PendingComposerOperation = {\n delivery: \"send\" | \"steer\";\n input: SendMessageInput;\n draftAtSend: string;\n resourcesAtSend: ResourceRef[];\n annotationsAtSend: DraftTimelineAnnotation[];\n /** Latest local text/resources that must survive an uncertain delivery. */\n newerShadow: ComposerDraftShadow;\n clearDraftOnAccept: boolean;\n /** False after remount when the original input carried secret credentials. */\n canRetry: boolean;\n};\n\ntype StoredPendingComposerOperation = Omit<PendingComposerOperation, \"input\" | \"canRetry\"> & {\n input: Omit<SendMessageInput, \"mcpCredentialUpdates\">;\n hasMcpCredentialUpdates: boolean;\n};\n\nexport type ComposerOptimisticMessage = {\n clientEventId: string;\n delivery: \"send\" | \"steer\";\n destination: \"chat\" | \"queue\";\n text: string;\n annotations: DraftTimelineAnnotation[];\n resources: ResourceRef[];\n occurredAt: string;\n state: \"sending\" | \"queued\" | \"failed\";\n turnId?: string | null | undefined;\n triggerEventId?: string | null | undefined;\n appliedQueueVersion?: number | null | undefined;\n error?: string | undefined;\n /** Bounded support reference retained independently of display copy across remounts. */\n correlationId?: string | undefined;\n /** False for a definitive refusal that requires changing payment or allowance settings. */\n retryable?: boolean | undefined;\n outcomeUnknown?: boolean | undefined;\n};\n\ntype OptimisticSendOperation = ComposerOptimisticMessage & {\n input: SendMessageInput;\n draftPayload: SaveComposerDraftRequest | null;\n /** Latest unsent local draft that must survive this operation and remounts. */\n newerShadow: ComposerDraftShadow;\n canRetry: boolean;\n};\n\ntype StoredOptimisticSendOperation = Omit<OptimisticSendOperation, \"input\" | \"canRetry\"> & {\n input: Omit<SendMessageInput, \"mcpCredentialUpdates\">;\n hasMcpCredentialUpdates: boolean;\n};\n\nconst PENDING_COMPOSER_STORAGE_PREFIX = \"opengeni.pending-composer.v1:\";\nconst OPTIMISTIC_SEND_STORAGE_PREFIX = \"opengeni.optimistic-sends.v1:\";\n// A remount must not manufacture a new operation while the previous mutation\n// is still outcome-unknown. Keep only non-credential request fields here; the\n// mounted hook retains the exact input, including any credential updates. The\n// safe shadow is also session-scoped so a refresh cannot lose newer edits.\nconst pendingComposerOperations = new Map<string, StoredPendingComposerOperation>();\nconst optimisticSendOperations = new Map<string, StoredOptimisticSendOperation[]>();\n\nfunction pendingComposerOperationKey(\n workspaceId: string,\n sessionId: string | null | undefined,\n): string | null {\n return sessionId ? `${workspaceId}\\u0000${sessionId}` : null;\n}\n\nfunction pendingComposerStorage(): Storage | null {\n try {\n return typeof window === \"undefined\" ? null : window.sessionStorage;\n } catch {\n return null;\n }\n}\n\nfunction pendingComposerStorageKey(key: string): string {\n return `${PENDING_COMPOSER_STORAGE_PREFIX}${encodeURIComponent(key)}`;\n}\n\nfunction optimisticSendStorageKey(key: string): string {\n return `${OPTIMISTIC_SEND_STORAGE_PREFIX}${encodeURIComponent(key)}`;\n}\n\nfunction restoreOptimisticSendOperations(\n t: OpenGeniText,\n key: string | null,\n canBuyCredits = true,\n): OptimisticSendOperation[] {\n if (!key) return [];\n let stored = optimisticSendOperations.get(key);\n if (!stored) {\n const storage = pendingComposerStorage();\n try {\n const parsed: unknown = JSON.parse(storage?.getItem(optimisticSendStorageKey(key)) ?? \"[]\");\n stored = Array.isArray(parsed)\n ? (parsed.filter(\n (candidate): candidate is StoredOptimisticSendOperation =>\n typeof candidate === \"object\" &&\n candidate !== null &&\n typeof candidate.clientEventId === \"string\" &&\n typeof candidate.text === \"string\" &&\n typeof candidate.occurredAt === \"string\" &&\n (candidate.state === \"sending\" || candidate.state === \"failed\") &&\n typeof candidate.input === \"object\" &&\n candidate.input !== null &&\n typeof candidate.input.text === \"string\" &&\n typeof candidate.hasMcpCredentialUpdates === \"boolean\",\n ) as StoredOptimisticSendOperation[])\n : [];\n } catch {\n stored = [];\n }\n }\n return stored.map(({ hasMcpCredentialUpdates, ...operation }) => ({\n ...operation,\n delivery: \"send\",\n destination: operation.destination === \"queue\" ? \"queue\" : \"chat\",\n newerShadow: operation.newerShadow ?? { text: \"\", resources: [], annotations: [] },\n state:\n operation.state === \"sending\" || operation.state === \"queued\" ? \"sending\" : operation.state,\n outcomeUnknown:\n operation.state === \"sending\" || operation.state === \"queued\"\n ? true\n : operation.outcomeUnknown,\n correlationId: restoredCorrelationId(operation.correlationId),\n error: restoredErrorReference(\n t,\n operation.correlationId,\n hasMcpCredentialUpdates && (operation.state === \"sending\" || operation.outcomeUnknown)\n ? composerSubmissionErrorMessage(t, new ComposerReconciliationRequiredError())\n : operation.state === \"sending\"\n ? t(\"hooks.useComposer.deliveryWasInterruptedRetryTo\")\n : operation.outcomeUnknown\n ? t(\"hooks.useComposer.theRequestCouldNotBe\")\n : operation.error\n ? composerSubmissionErrorMessage(t, new Error(operation.error), canBuyCredits)\n : undefined,\n ),\n retryable:\n operation.state === \"sending\" || operation.outcomeUnknown\n ? true\n : (operation.retryable ??\n (operation.error ? composerSubmissionCanRetry(new Error(operation.error)) : true)),\n input: operation.input,\n canRetry: !hasMcpCredentialUpdates,\n }));\n}\n\nfunction restoredCorrelationId(value: unknown): string | undefined {\n return typeof value === \"string\" && /^[\\w.:-]{1,128}$/u.test(value) ? value : undefined;\n}\n\nfunction restoredErrorReference(\n t: OpenGeniText,\n reference: unknown,\n message: string | undefined,\n): string | undefined {\n const correlationId = restoredCorrelationId(reference);\n return message &&\n correlationId &&\n message !== COMPOSER_MODEL_UNAVAILABLE_MESSAGE &&\n message !== t(\"lib.format.modelUnavailable\") &&\n message !== COMPOSER_ACCOUNT_UNAVAILABLE_MESSAGE &&\n message !== t(\"lib.format.accountUnavailable\")\n ? t(\"hooks.useComposer.messageReferenceCorrelationid\", { message, correlationId })\n : message;\n}\n\nfunction rememberOptimisticSendOperations(\n key: string | null,\n operations: OptimisticSendOperation[],\n): void {\n if (!key) return;\n const stored = operations\n .filter((operation) => operation.state !== \"queued\")\n .map((operation) => {\n const { canRetry: _canRetry, input, ...rest } = operation;\n const { mcpCredentialUpdates: _credentials, ...safeInput } = input;\n return {\n ...rest,\n input: safeInput,\n hasMcpCredentialUpdates: input.mcpCredentialUpdates !== undefined,\n } satisfies StoredOptimisticSendOperation;\n });\n if (stored.length === 0) {\n optimisticSendOperations.delete(key);\n try {\n pendingComposerStorage()?.removeItem(optimisticSendStorageKey(key));\n } catch {\n // Best effort; the in-memory entry is already gone.\n }\n return;\n }\n optimisticSendOperations.set(key, stored);\n try {\n pendingComposerStorage()?.setItem(optimisticSendStorageKey(key), JSON.stringify(stored));\n } catch {\n // Best effort; the in-memory queue still owns this mount.\n }\n}\n\nfunction resourceList(value: unknown): value is ResourceRef[] {\n return (\n Array.isArray(value) &&\n value.every((candidate) => {\n if (typeof candidate !== \"object\" || candidate === null) return false;\n const resource = candidate as Record<string, unknown>;\n return resource.kind === \"file\"\n ? typeof resource.fileId === \"string\"\n : resource.kind === \"repository\" &&\n typeof resource.uri === \"string\" &&\n typeof resource.ref === \"string\";\n })\n );\n}\n\nfunction timelineAnnotationList(value: unknown): value is DraftTimelineAnnotation[] {\n return (\n Array.isArray(value) &&\n value.every((candidate) => {\n if (typeof candidate !== \"object\" || candidate === null) return false;\n const annotation = candidate as Record<string, unknown>;\n const source = annotation.source;\n if (typeof source !== \"object\" || source === null) return false;\n const sourceRecord = source as Record<string, unknown>;\n return (\n typeof annotation.id === \"string\" &&\n typeof annotation.quote === \"string\" &&\n typeof annotation.note === \"string\" &&\n typeof sourceRecord.eventId === \"string\" &&\n typeof sourceRecord.eventType === \"string\" &&\n typeof sourceRecord.sequence === \"number\" &&\n (typeof sourceRecord.turnId === \"string\" || sourceRecord.turnId === null) &&\n typeof sourceRecord.startOffset === \"number\" &&\n typeof sourceRecord.endOffset === \"number\" &&\n typeof sourceRecord.contextBefore === \"string\" &&\n typeof sourceRecord.contextAfter === \"string\"\n );\n })\n );\n}\n\nfunction cloneAnnotations(\n annotations: readonly DraftTimelineAnnotation[],\n): DraftTimelineAnnotation[] {\n return annotations.map((annotation) => ({\n ...annotation,\n source: { ...annotation.source },\n }));\n}\n\nfunction readStoredPendingComposerOperation(\n key: string | null,\n): StoredPendingComposerOperation | null {\n const storage = key ? pendingComposerStorage() : null;\n if (!storage || !key) return null;\n try {\n const parsed: unknown = JSON.parse(storage.getItem(pendingComposerStorageKey(key)) ?? \"null\");\n if (typeof parsed !== \"object\" || parsed === null) return null;\n const record = parsed as Record<string, unknown>;\n const input = record.input;\n const shadow = record.newerShadow;\n if (\n typeof input !== \"object\" ||\n input === null ||\n typeof shadow !== \"object\" ||\n shadow === null\n ) {\n return null;\n }\n const inputRecord = input as Record<string, unknown>;\n const shadowRecord = shadow as Record<string, unknown>;\n if (\n (record.delivery !== \"send\" && record.delivery !== \"steer\") ||\n typeof record.draftAtSend !== \"string\" ||\n !resourceList(record.resourcesAtSend) ||\n (record.annotationsAtSend !== undefined &&\n !timelineAnnotationList(record.annotationsAtSend)) ||\n typeof shadowRecord.text !== \"string\" ||\n !resourceList(shadowRecord.resources) ||\n (shadowRecord.annotations !== undefined &&\n !timelineAnnotationList(shadowRecord.annotations)) ||\n typeof record.clearDraftOnAccept !== \"boolean\" ||\n typeof record.hasMcpCredentialUpdates !== \"boolean\" ||\n typeof inputRecord.text !== \"string\" ||\n typeof inputRecord.clientEventId !== \"string\" ||\n \"mcpCredentialUpdates\" in inputRecord ||\n (\"resources\" in inputRecord && !resourceList(inputRecord.resources)) ||\n (\"annotations\" in inputRecord && !timelineAnnotationList(inputRecord.annotations))\n ) {\n return null;\n }\n return {\n ...(record as StoredPendingComposerOperation),\n annotationsAtSend: timelineAnnotationList(record.annotationsAtSend)\n ? record.annotationsAtSend\n : [],\n newerShadow: {\n ...(shadow as ComposerDraftShadow),\n annotations: timelineAnnotationList(shadowRecord.annotations)\n ? shadowRecord.annotations\n : [],\n },\n };\n } catch {\n return null;\n }\n}\n\nfunction writePendingComposerOperation(\n key: string,\n operation: StoredPendingComposerOperation,\n): void {\n const storage = pendingComposerStorage();\n if (!storage) return;\n try {\n storage.setItem(pendingComposerStorageKey(key), JSON.stringify(operation));\n } catch {\n // Storage is best effort; the in-memory record still protects remounts.\n }\n}\n\nfunction restorePendingComposerOperation(key: string | null): PendingComposerOperation | null {\n const stored =\n (key && pendingComposerOperations.get(key)) ?? readStoredPendingComposerOperation(key);\n if (!stored) return null;\n return {\n ...stored,\n input: stored.input,\n newerShadow: stored.newerShadow ?? {\n text: stored.draftAtSend,\n resources: stored.resourcesAtSend,\n annotations: stored.annotationsAtSend,\n },\n canRetry: !stored.hasMcpCredentialUpdates,\n };\n}\n\nfunction rememberPendingComposerOperation(\n key: string | null,\n operation: PendingComposerOperation,\n): void {\n if (!key) return;\n const { canRetry: _retry, ...safeOperation } = operation;\n const { input: originalInput, ...withoutInput } = safeOperation;\n const { mcpCredentialUpdates: _storedMcp, ...safeInput } = originalInput;\n const stored = {\n ...withoutInput,\n input: safeInput,\n hasMcpCredentialUpdates: operation.input.mcpCredentialUpdates !== undefined,\n newerShadow: {\n text: operation.newerShadow.text,\n resources: [...operation.newerShadow.resources],\n annotations: cloneAnnotations(operation.newerShadow.annotations),\n ...(operation.newerShadow.policy ? { policy: { ...operation.newerShadow.policy } } : {}),\n },\n } satisfies StoredPendingComposerOperation;\n pendingComposerOperations.set(key, stored);\n writePendingComposerOperation(key, stored);\n}\n\nfunction forgetPendingComposerOperation(key: string | null): void {\n if (!key) return;\n pendingComposerOperations.delete(key);\n const storage = pendingComposerStorage();\n if (!storage) return;\n try {\n storage.removeItem(pendingComposerStorageKey(key));\n } catch {\n // Ignore a blocked storage implementation; delivery has already settled.\n }\n}\n\nfunction updatePendingComposerShadow(\n key: string | null,\n operation: PendingComposerOperation | null,\n shadow: ComposerDraftShadow,\n): PendingComposerOperation | null {\n if (!key || !operation) return operation;\n const next = {\n ...operation,\n newerShadow: {\n ...shadow,\n resources: [...shadow.resources],\n annotations: cloneAnnotations(shadow.annotations),\n },\n };\n rememberPendingComposerOperation(key, next);\n return next;\n}\n\nexport type ComposerState = {\n value: string;\n setValue: (value: string) => void;\n annotations?: DraftTimelineAnnotation[] | undefined;\n addAnnotation?: ((annotation: DraftTimelineAnnotation) => void) | undefined;\n updateAnnotation?: ((id: string, note: string) => void) | undefined;\n removeAnnotation?: ((id: string) => void) | undefined;\n /** Newly captured annotation the review surface should focus. */\n annotationReviewTargetId?: string | null | undefined;\n clearAnnotationReviewTarget?: (() => void) | undefined;\n /** Focus an annotation, or the first incomplete note when omitted. */\n requestAnnotationReview?: ((id?: string) => void) | undefined;\n /** Read the current draft synchronously before a destructive replacement. */\n hasDraftContent: () => boolean;\n /**\n * The ordinary Send. While the agent is working it follows `busySend`:\n * queue behind the current turn (default) or Steer.\n */\n send: (text?: string) => Promise<boolean>;\n /** Append the draft behind prompts already visible in the queue, whatever `busySend` says. */\n sendToQueue?: ((text?: string) => Promise<boolean>) | undefined;\n /** What an ordinary Send does while the agent is working. */\n busySend?: ComposerBusySend | undefined;\n /**\n * One Send and nothing to choose (`busySend: \"steer\"` without\n * `offerQueue`): no alternate beside Send, Cmd/Ctrl+Enter sends normally,\n * and stock surfaces avoid Queue and Steer words.\n */\n singleSend?: boolean | undefined;\n /**\n * The other way to send right now, or `null` when Send is not taking its\n * busy path (nothing running or waiting, or the workstream is paused):\n * `steer` when Send queues, `queue` when Send steers. Hosts offer it next to\n * Send exactly when it is not `null`.\n */\n alternateSend?: ComposerBusySend | null | undefined;\n /**\n * The agent is working here: a turn runs or messages wait, so a Send takes\n * its busy path. `false` when nothing is running or waiting, or the\n * workstream is paused. Stock composers show Pause and the Queue and Steer\n * wording only while this is true; when it is left out they keep showing\n * them, as before.\n */\n working?: boolean | undefined;\n /** Send the draft the other way: Steer when Send queues, queue when Send steers. */\n sendAlternate?: ((text?: string) => Promise<boolean>) | undefined;\n /** Locally acknowledged ordinary sends awaiting durable timeline reconciliation. */\n optimisticMessages?: ComposerOptimisticMessage[] | undefined;\n retryOptimisticMessage?: ((clientEventId: string) => void) | undefined;\n /** Move a definitively refused message into an empty composer without resending it. */\n restoreOptimisticMessage?: ((clientEventId: string) => void) | undefined;\n removeOptimisticMessage?: ((clientEventId: string) => void) | undefined;\n /** Supersede current direction with the draft. */\n steer: (text?: string) => Promise<boolean>;\n /** Optimistic-to-durable projection for a Steer that has not started yet. */\n steering?: ComposerSteeringState | null | undefined;\n /** Immediate mutation-receipt projection while physical cancellation settles. */\n stoppingAttempt?: \"current\" | \"previous\" | null | undefined;\n sending: boolean;\n canSend: boolean;\n /**\n * Something Send needs is still loading (the model list, a saved draft).\n * While it is, a Send or Enter with a draft waits and sends once it is\n * ready, instead of doing nothing.\n */\n preparing?: boolean | undefined;\n /** Pause the session without deleting its prompt queue. */\n pause: (reason?: string) => Promise<void>;\n pausing: boolean;\n resume: (reason?: string) => Promise<void>;\n resumeScope: (option: EffectiveControlResumeOption) => Promise<void>;\n resuming: boolean;\n /** Mutation-confirmed control while the streamed queue projection catches up. */\n effectiveControl?: EffectiveSessionControl | null | undefined;\n draft: ComposerDraft | null;\n draftRevision: number;\n draftLoading: boolean;\n draftSaving: boolean;\n draftConflict: Error | null;\n /**\n * Save the draft now instead of after the autosave pause, for example\n * before the page leaves for checkout. Resolves once it is saved or\n * nothing needed saving.\n */\n flushDraft?: (() => Promise<void>) | undefined;\n /** Exact policy owned by this actor/session composer. Null while hydrating. */\n policy?: ComposerPolicy | null | undefined;\n /**\n * The policy to send with a message from outside the composer: the person's\n * pick, or null while the composer follows the chat's own settings (then a\n * message carries none and runs on the chat's current settings).\n */\n sendPolicy?: ComposerPolicy | null | undefined;\n setModel?: ((model: string) => void) | undefined;\n setReasoningEffort?: ((effort: ReasoningEffort) => void) | undefined;\n setLatencyMode?: ((mode: LatencyMode) => void) | undefined;\n /** Whether this controller owns a durable server-side draft. */\n draftPersistence?: \"durable\" | \"disabled\" | undefined;\n /** Apply an atomic queue Edit checkout without a second read. */\n applyDraft: (draft: ComposerDraft) => void;\n reloadDraft: () => Promise<void>;\n resolveDraftConflict: (choice: \"keep_mine\" | \"use_remote\") => Promise<void>;\n restoredResources: ResourceRef[];\n removeRestoredResource: (index: number) => void;\n error: Error | null;\n clearError: () => void;\n /**\n * Whether the person can fix a credit refusal themselves (the\n * `canBuyCredits` option). Surfaces that word `error` use it to pick the\n * ask-an-owner text for members.\n */\n canBuyCredits?: boolean | undefined;\n /**\n * True while a send is held because Opengeni is updating or briefly\n * unreachable. The message stays queued here with its idempotency key and\n * is retried automatically; surfaces show a calm \"updating\" state instead\n * of an error.\n */\n reconnecting?: boolean | undefined;\n};\n\n/** Longest pause between automatic retries of a send held by an update. */\nconst SERVICE_SEND_RETRY_MAX_DELAY_MS = 8_000;\n\nexport type ComposerControllerState = ComposerState & {\n policy: ComposerPolicy | null;\n sendPolicy: ComposerPolicy | null;\n setModel: (model: string) => void;\n setReasoningEffort: (effort: ReasoningEffort) => void;\n setLatencyMode: (mode: LatencyMode) => void;\n};\n\nexport type ComposerSteeringState = {\n phase: \"submitting\" | \"accepted\" | \"failed\";\n text: string;\n clientEventId: string | null;\n triggerEventId: string | null;\n turnId: string | null;\n /** True only when the accepted Steer durably interrupted a live attempt. */\n stoppingPreviousAttempt?: boolean | undefined;\n error?: string | undefined;\n outcomeUnknown?: boolean | undefined;\n};\n\nconst STEERING_SETTLEMENT_EVENT_TYPES = new Set([\n \"turn.started\",\n \"turn.completed\",\n \"turn.failed\",\n \"turn.cancelled\",\n \"turn.superseded\",\n]);\n\nfunction isSteeringSettlementEvent(event: SessionEvent): boolean {\n return STEERING_SETTLEMENT_EVENT_TYPES.has(event.type);\n}\n\nfunction steeringAcceptedEvent(\n steering: ComposerSteeringState,\n events: readonly SessionEvent[],\n): SessionEvent | undefined {\n return events.find(\n (event) =>\n event.type === \"user.message\" &&\n steering.clientEventId !== null &&\n event.clientEventId === steering.clientEventId,\n );\n}\n\nfunction promptTurnIdForTrigger(\n triggerEventId: string | null | undefined,\n events: readonly SessionEvent[],\n): string | null {\n if (!triggerEventId) return null;\n const queued = events.find((event) => {\n if (event.type !== \"turn.queued\") return false;\n const payload = event.payload;\n return (\n typeof payload === \"object\" &&\n payload !== null &&\n \"triggerEventId\" in payload &&\n payload.triggerEventId === triggerEventId\n );\n });\n if (!queued) return null;\n if (queued.turnId) return queued.turnId;\n const payload = queued.payload;\n return typeof payload === \"object\" &&\n payload !== null &&\n \"turnId\" in payload &&\n typeof payload.turnId === \"string\"\n ? payload.turnId\n : null;\n}\n\nfunction steeringSettledByEvents(\n steering: ComposerSteeringState,\n events: readonly SessionEvent[],\n): boolean {\n const acceptedEventId =\n steering.triggerEventId ?? steeringAcceptedEvent(steering, events)?.id ?? null;\n return events.some((event) => {\n if (steering.turnId && event.turnId === steering.turnId && isSteeringSettlementEvent(event)) {\n return true;\n }\n if (event.type !== \"turn.started\" || !acceptedEventId) return false;\n const payload = event.payload;\n return (\n typeof payload === \"object\" &&\n payload !== null &&\n \"triggerEventId\" in payload &&\n payload.triggerEventId === acceptedEventId\n );\n });\n}\n\nfunction reconcileOptimisticSendFromEvents(\n operation: OptimisticSendOperation,\n events: readonly SessionEvent[],\n): { operation: OptimisticSendOperation; admitted: boolean; settled: boolean } {\n const accepted = events.find(\n (event) => event.type === \"user.message\" && event.clientEventId === operation.clientEventId,\n );\n const triggerEventId = operation.triggerEventId ?? accepted?.id ?? null;\n const turnId = operation.turnId ?? promptTurnIdForTrigger(triggerEventId, events);\n const acceptedRouting = promptRoutingFromAcceptedEvent(accepted ?? null);\n const destination =\n acceptedRouting === \"queued_for_execution\"\n ? \"queue\"\n : acceptedRouting === \"accepted_for_execution\" || acceptedRouting === \"accepted_for_steering\"\n ? \"chat\"\n : operation.destination;\n const needsAdmissionUpdate =\n accepted !== undefined &&\n (operation.state !== \"queued\" ||\n operation.destination !== destination ||\n operation.triggerEventId !== triggerEventId ||\n operation.turnId !== turnId ||\n operation.error !== undefined ||\n operation.outcomeUnknown !== false);\n const reconciled: OptimisticSendOperation = needsAdmissionUpdate\n ? {\n ...operation,\n state: \"queued\",\n destination,\n triggerEventId,\n turnId,\n error: undefined,\n outcomeUnknown: false,\n }\n : operation;\n const withdrawnFromQueue = events.some((event) => {\n if (event.type !== \"session.queue.changed\" || !turnId) return false;\n const payload = event.payload;\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) return false;\n const record = payload as Record<string, unknown>;\n return (\n record.turnId === turnId && (record.operation === \"edit\" || record.operation === \"delete\")\n );\n });\n return {\n operation: reconciled,\n admitted: accepted !== undefined,\n // Edit/Delete atomically withdraw the queued turn. Keeping its optimistic\n // send alive after that point lets its old `newerShadow` become the newest\n // composer draft again when a later turn settles, duplicating submitted\n // text. The queue mutation is the durable terminal fact for this send.\n settled:\n withdrawnFromQueue ||\n steeringSettledByEvents(\n {\n phase: \"accepted\",\n text: reconciled.text,\n clientEventId: reconciled.clientEventId,\n triggerEventId: reconciled.triggerEventId ?? null,\n turnId: reconciled.turnId ?? null,\n },\n events,\n ),\n };\n}\n\n/**\n * Draft + send + Pause/Resume state for the chat composer — the only\n * human-to-agent input surface. The draft survives a failed send (nothing is\n * more hostile than losing a typed message); each send carries a generated\n * `clientEventId` so retries stay idempotent server-side.\n */\nexport function useComposer(\n sessionId: string | null | undefined,\n options: UseComposerOptions = {},\n): ComposerControllerState {\n const t = useOpenGeniText();\n const { client, workspaceId, registerSessionReconciler } = useEmbeddedSession(options);\n const formatError = useErrorMessage();\n const durableDrafts = options.draftPersistence !== \"disabled\";\n if (!durableDrafts && !options.initialPolicy) {\n throw new Error(\"useComposer requires initialPolicy when draft persistence is disabled\");\n }\n const targetKey = `${workspaceId}\\u0000${sessionId ?? \"\"}\\u0000${durableDrafts ? \"durable\" : \"disabled\"}`;\n const pendingOperationKey = pendingComposerOperationKey(workspaceId, sessionId);\n const initialPendingOperation = restorePendingComposerOperation(pendingOperationKey);\n const initialOptimisticSends = restoreOptimisticSendOperations(\n t,\n pendingOperationKey,\n options.canBuyCredits ?? true,\n );\n const initialShadow =\n initialPendingOperation?.newerShadow ??\n initialOptimisticSends.at(-1)?.newerShadow ??\n initialComposerShadow(options.initialDraft);\n const [value, setValue] = useState(() => initialShadow?.text ?? \"\");\n const [annotations, setAnnotations] = useState<DraftTimelineAnnotation[]>(\n () => initialShadow?.annotations ?? [],\n );\n const [annotationReviewTargetId, setAnnotationReviewTargetId] = useState<string | null>(null);\n // Keep rendered state behind the committed target identity for one frame:\n // a parent may switch sessionId without remounting this public hook.\n const [stateTargetKey, setStateTargetKey] = useState(targetKey);\n const [sending, setSending] = useState(false);\n const [optimisticSends, setOptimisticSends] =\n useState<OptimisticSendOperation[]>(initialOptimisticSends);\n const [steering, setSteering] = useState<ComposerSteeringState | null>(() =>\n initialPendingOperation?.delivery === \"steer\"\n ? {\n phase: \"failed\",\n text: initialPendingOperation.input.text,\n clientEventId: initialPendingOperation.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n error: t(\"hooks.useComposer.notConfirmedRetryToCheck\"),\n outcomeUnknown: true,\n }\n : null,\n );\n const [pausing, setPausing] = useState(false);\n const [acceptedControl, setAcceptedControl] = useState<EffectiveSessionControl | null>(null);\n const [resuming, setResuming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n // Background draft reads recover independently of Send/Steer/control failures.\n const [draftReadError, setDraftReadError] = useState<Error | null>(null);\n // The first read of the saved draft failed and a retry is scheduled: the\n // draft is still on its way, so an early Send keeps waiting for it.\n const [draftHydrationRetrying, setDraftHydrationRetrying] = useState(false);\n const [draft, setDraft] = useState<ComposerDraft | null>(null);\n const [draftLoading, setDraftLoading] = useState(Boolean(sessionId) && durableDrafts);\n const [draftSaving, setDraftSaving] = useState(false);\n const [draftConflict, setDraftConflict] = useState<Error | null>(null);\n const [policy, setPolicy] = useState<ComposerPolicy | null>(\n () => initialShadow?.policy ?? options.initialPolicy ?? null,\n );\n const [restoredResources, setRestoredResources] = useState<ResourceRef[]>(\n () => initialShadow?.resources ?? [],\n );\n const pendingOperationRef = useRef<PendingComposerOperation | null>(initialPendingOperation);\n const optimisticSendsRef = useRef<OptimisticSendOperation[]>(initialOptimisticSends);\n const optimisticProcessorBusyRef = useRef(false);\n // Sends held while Opengeni is updating: first calm failure, attempts and\n // the next retry time, keyed by client event ID. Never persisted: a\n // remount retries a restored send through its ordinary reconciliation.\n const serviceWaitRef = useRef(\n new Map<string, { since: number; attempts: number; retryAt: number }>(),\n );\n const serviceRetryTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const processOptimisticSendsRef = useRef<() => void>(() => undefined);\n const [serviceWaiting, setServiceWaiting] = useState(false);\n // Bumped to re-run autosave once Opengeni answers again after an update.\n const [autosaveRetry, setAutosaveRetry] = useState(0);\n const optimisticCallbackIdsRef = useRef(new Set<string>());\n const steeringSettlementEventsRef = useRef<SessionEvent[]>([]);\n const steeringRef = useRef(steering);\n const steeringOccurredAtRef = useRef(new Date().toISOString());\n const pendingClientEventId = useRef<string | null>(\n initialPendingOperation?.input.clientEventId ?? null,\n );\n const valueRef = useRef(initialShadow?.text ?? \"\");\n const annotationsRef = useRef<DraftTimelineAnnotation[]>(initialShadow?.annotations ?? []);\n const policyRef = useRef<ComposerPolicy | null>(\n initialShadow?.policy ?? options.initialPolicy ?? null,\n );\n // True once the person picks a model, effort or speed in this composer (or\n // adopts a draft that holds such a pick). Until then the composer follows\n // the chat's own settings: `policy` shows them, and saves and sends carry\n // none, so a change made elsewhere (for example by the agent) is what the\n // next message uses. Without durable drafts the caller's policy is a pick.\n const policyPickedRef = useRef(!durableDrafts || initialShadow?.policy !== undefined);\n const [policyPicked, setPolicyPicked] = useState(policyPickedRef.current);\n const draftRef = useRef<ComposerDraft | null>(null);\n const restoredResourcesRef = useRef<ResourceRef[]>(initialShadow?.resources ?? []);\n const localEditRevision = useRef(initialShadow ? 1 : 0);\n const targetGeneration = useRef(0);\n const draftReadGeneration = useRef(0);\n const draftReadInFlightRef = useRef<string | null>(null);\n const draftReadAbortRef = useRef<AbortController | null>(null);\n const draftReadRetryRef = useRef<{\n targetKey: string;\n failures: number;\n timer: ReturnType<typeof setTimeout> | null;\n }>({ targetKey, failures: 0, timer: null });\n const lastSavedSignature = useRef<string | null>(null);\n const saveChain = useRef<Promise<void>>(Promise.resolve());\n const onSent = useCallback(\n (text: string, input: SendMessageInput) => {\n notifyComposerObserver(options.onSent, text, input);\n },\n [options.onSent],\n );\n const onSubmitted = useCallback(\n (text: string, input: SendMessageInput) => {\n notifyComposerObserver(options.onSubmitted, text, input);\n },\n [options.onSubmitted],\n );\n const onDeliveryErrorRef = useRef(options.onDeliveryError);\n onDeliveryErrorRef.current = options.onDeliveryError;\n useLayoutEffect(() => {\n steeringRef.current = steering;\n }, [steering]);\n // Read through a ref so a new extras closure (created every render by\n // callers passing inline functions) does not invalidate `send`.\n const sendExtrasRef = useRef(options.sendExtras);\n sendExtrasRef.current = options.sendExtras;\n const sendDestinationRef = useRef(options.sendDestination);\n sendDestinationRef.current = options.sendDestination;\n const busySend: ComposerBusySend = options.busySend ?? \"queue\";\n const busySendRef = useRef(busySend);\n busySendRef.current = busySend;\n const singleSend = busySend === \"steer\" && options.offerQueue !== true;\n const sendBlockedRef = useRef(options.sendBlocked);\n sendBlockedRef.current = options.sendBlocked;\n // Who is viewing decides a credit refusal's fix, without invalidating `send`.\n const canBuyCreditsRef = useRef(options.canBuyCredits ?? true);\n canBuyCreditsRef.current = options.canBuyCredits ?? true;\n const effectiveControlRef = useRef<EffectiveSessionControl | null>(\n acceptedControl ?? options.effectiveControl ?? null,\n );\n effectiveControlRef.current = acceptedControl ?? options.effectiveControl ?? null;\n const liveExtrasVersion = JSON.stringify(resolveSendExtras(options.sendExtras));\n\n // A composer is bound to one session: switching targets must not leak the\n // previous session's draft, error, or retry idempotency key.\n const targetKeyRef = useRef(targetKey);\n useLayoutEffect(() => {\n if (targetKeyRef.current === targetKey) return;\n if (draftReadRetryRef.current.timer !== null) {\n clearTimeout(draftReadRetryRef.current.timer);\n }\n draftReadAbortRef.current?.abort();\n draftReadAbortRef.current = null;\n draftReadRetryRef.current = { targetKey, failures: 0, timer: null };\n targetKeyRef.current = targetKey;\n targetGeneration.current += 1;\n draftReadGeneration.current += 1;\n pendingOperationRef.current = restorePendingComposerOperation(pendingOperationKey);\n const restoredOptimisticSends = restoreOptimisticSendOperations(\n t,\n pendingOperationKey,\n canBuyCreditsRef.current,\n );\n optimisticSendsRef.current = restoredOptimisticSends;\n optimisticProcessorBusyRef.current = false;\n serviceWaitRef.current = new Map();\n if (serviceRetryTimerRef.current !== null) clearTimeout(serviceRetryTimerRef.current);\n serviceRetryTimerRef.current = null;\n setServiceWaiting(false);\n optimisticCallbackIdsRef.current = new Set();\n steeringSettlementEventsRef.current = [];\n pendingClientEventId.current = pendingOperationRef.current?.input.clientEventId ?? null;\n const shadow =\n pendingOperationRef.current?.newerShadow ??\n restoredOptimisticSends.at(-1)?.newerShadow ??\n initialComposerShadow(options.initialDraft);\n localEditRevision.current = shadow ? 1 : 0;\n valueRef.current = shadow?.text ?? \"\";\n annotationsRef.current = shadow?.annotations ?? [];\n policyRef.current = shadow?.policy ?? options.initialPolicy ?? null;\n policyPickedRef.current = !durableDrafts || shadow?.policy !== undefined;\n setPolicyPicked(policyPickedRef.current);\n draftRef.current = null;\n restoredResourcesRef.current = shadow?.resources ?? [];\n lastSavedSignature.current = null;\n // Old saves may still be awaiting the network. Their generation fence\n // prevents settlement, and a fresh chain avoids blocking this target.\n saveChain.current = Promise.resolve();\n setStateTargetKey(targetKey);\n setValue(shadow?.text ?? \"\");\n setAnnotations(shadow?.annotations ?? []);\n setPolicy(policyRef.current);\n setAnnotationReviewTargetId(null);\n setSending(false);\n setOptimisticSends(restoredOptimisticSends);\n setSteering(\n pendingOperationRef.current?.delivery === \"steer\"\n ? {\n phase: \"failed\",\n text: pendingOperationRef.current.input.text,\n clientEventId: pendingOperationRef.current.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n error: t(\"hooks.useComposer.notConfirmedRetryToCheck\"),\n outcomeUnknown: true,\n }\n : null,\n );\n setPausing(false);\n setAcceptedControl(null);\n setResuming(false);\n setError(null);\n setDraftReadError(null);\n setDraftHydrationRetrying(false);\n setDraft(null);\n setDraftLoading(Boolean(sessionId) && durableDrafts);\n setDraftSaving(false);\n setDraftConflict(null);\n setRestoredResources(shadow?.resources ?? []);\n }, [\n durableDrafts,\n options.initialPolicy,\n options.initialDraft,\n pendingOperationKey,\n sessionId,\n targetKey,\n t,\n ]);\n useEffect(\n () => () => {\n if (draftReadRetryRef.current.timer !== null) {\n clearTimeout(draftReadRetryRef.current.timer);\n }\n if (serviceRetryTimerRef.current !== null) clearTimeout(serviceRetryTimerRef.current);\n serviceRetryTimerRef.current = null;\n targetGeneration.current += 1;\n draftReadGeneration.current += 1;\n draftReadInFlightRef.current = null;\n draftReadAbortRef.current?.abort();\n draftReadAbortRef.current = null;\n },\n [],\n );\n\n const setOptimisticDraftShadow = useCallback(\n (shadow: ComposerDraftShadow): void => {\n if (optimisticSendsRef.current.length === 0) return;\n const next = optimisticSendsRef.current.map((operation) => ({\n ...operation,\n newerShadow: {\n text: shadow.text,\n resources: [...shadow.resources],\n annotations: cloneAnnotations(shadow.annotations),\n ...(shadow.policy ? { policy: { ...shadow.policy } } : {}),\n },\n }));\n optimisticSendsRef.current = next;\n rememberOptimisticSendOperations(pendingOperationKey, next);\n setOptimisticSends(next);\n },\n [pendingOperationKey],\n );\n\n const applyDraft = useCallback(\n (next: ComposerDraft): void => {\n if (targetKeyRef.current !== targetKey) return;\n if (!durableDrafts) {\n const nextPolicy = policyFromDraft(next);\n localEditRevision.current += 1;\n valueRef.current = next.text;\n annotationsRef.current = next.annotations ?? [];\n policyRef.current = nextPolicy;\n restoredResourcesRef.current = next.resources;\n draftRef.current = null;\n lastSavedSignature.current = null;\n setDraft(null);\n setValue(next.text);\n setAnnotations(next.annotations ?? []);\n setPolicy(nextPolicy);\n setRestoredResources(next.resources);\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n policy: nextPolicy,\n },\n );\n setOptimisticDraftShadow({\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n policy: nextPolicy,\n });\n setDraftConflict(null);\n return;\n }\n const nextPolicy = policyFromDraft(next);\n valueRef.current = next.text;\n annotationsRef.current = next.annotations ?? [];\n policyRef.current = nextPolicy;\n policyPickedRef.current = !next.policyFollowsSession;\n setPolicyPicked(policyPickedRef.current);\n draftRef.current = next;\n restoredResourcesRef.current = next.resources;\n lastSavedSignature.current = draftSignature(draftPayload(next));\n localEditRevision.current += 1;\n setDraft(next);\n setValue(next.text);\n setAnnotations(next.annotations ?? []);\n setPolicy(nextPolicy);\n setRestoredResources(next.resources);\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n policy: pickedPolicy(policyPickedRef, policyRef),\n },\n );\n setOptimisticDraftShadow({\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n policy: pickedPolicy(policyPickedRef, policyRef),\n });\n setDraftConflict(null);\n },\n [durableDrafts, pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const loadDraft = useCallback(\n async (replaceLocal: boolean): Promise<void> => {\n if (targetKeyRef.current !== targetKey) return;\n if (!sessionId || !durableDrafts) {\n setDraftLoading(false);\n setDraftReadError(null);\n setDraftHydrationRetrying(false);\n return;\n }\n let retry = draftReadRetryRef.current;\n if (retry.targetKey !== targetKey) {\n if (retry.timer !== null) clearTimeout(retry.timer);\n retry = { targetKey, failures: 0, timer: null };\n draftReadRetryRef.current = retry;\n }\n const scheduleRetry = (): void => {\n if (retry.timer !== null) return;\n retry.timer = setTimeout(\n () => {\n if (draftReadRetryRef.current !== retry || targetKeyRef.current !== targetKey) return;\n retry.timer = null;\n void loadDraft(false);\n },\n Math.min(25_000, 1_000 * 2 ** (retry.failures - 1)) * (0.8 + Math.random() * 0.4),\n );\n };\n if (!replaceLocal && retry.timer !== null) return;\n if (draftReadInFlightRef.current === targetKey) return;\n if (retry.timer !== null) {\n clearTimeout(retry.timer);\n retry.timer = null;\n }\n draftReadInFlightRef.current = targetKey;\n const generation = targetGeneration.current;\n const readTicket = ++draftReadGeneration.current;\n const requestAbort = new AbortController();\n draftReadAbortRef.current?.abort();\n draftReadAbortRef.current = requestAbort;\n const localAtStart = localEditRevision.current;\n const baseAtStart = draftRef.current;\n const policyAtStart = policyRef.current;\n const localSignatureAtStart = baseAtStart\n ? policyAtStart\n ? draftSignature(\n composerDraftPayload(\n baseAtStart,\n valueRef.current,\n restoredResourcesRef.current,\n annotationsRef.current,\n pickedPolicy(policyPickedRef, policyRef),\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n )\n : null\n : null;\n const localWasDirtyAtStart =\n localSignatureAtStart === null\n ? localAtStart !== 0\n : localSignatureAtStart !== lastSavedSignature.current;\n // Only blank the picker on first hydrate / hard reload. Reconcile and\n // event-triggered soft reloads (loadOlder SSE reconnect) must not flicker\n // draftLoading — stale-while-revalidate keeps the settled UI mounted.\n const showLoading = replaceLocal || draftRef.current === null;\n if (showLoading) {\n setDraftLoading(true);\n }\n try {\n const fetched = await client.getComposerDraft(workspaceId, sessionId, {\n signal: requestAbort.signal,\n });\n if (\n generation !== targetGeneration.current ||\n targetKeyRef.current !== targetKey ||\n readTicket !== draftReadGeneration.current\n ) {\n return;\n }\n if (retry.timer !== null) clearTimeout(retry.timer);\n retry.failures = 0;\n retry.timer = null;\n // Recovery also counts when the server returns the same draft revision.\n setDraftReadError(null);\n setDraftHydrationRetrying(false);\n const currentRevision = draftRef.current?.revision ?? -1;\n // A composer that follows the chat's settings shows the server's\n // current ones (the person has not picked any here).\n const adoptFetchedPolicy = (): void => {\n const fetchedPolicy = policyFromDraft(fetched);\n policyPickedRef.current = !fetched.policyFollowsSession;\n setPolicyPicked(policyPickedRef.current);\n if (samePolicy(policyRef.current, fetchedPolicy)) return;\n policyRef.current = fetchedPolicy;\n setPolicy(fetchedPolicy);\n };\n // Reconnect and client-generation effects can legitimately ask for the\n // draft again. A same-revision response is not new authority: publishing\n // its freshly decoded object back into React creates a response -> render\n // -> read feedback loop. Hard reload remains the explicit exception.\n if (replaceLocal || fetched.revision > currentRevision) {\n draftRef.current = fetched;\n setDraft(fetched);\n setDraftConflict(null);\n const shadow =\n pendingOperationRef.current?.newerShadow ??\n optimisticSendsRef.current.at(-1)?.newerShadow;\n if (shadow) {\n // The server can only know the original operation. Never replace\n // newer local edits while that operation is still uncertain.\n valueRef.current = shadow.text;\n restoredResourcesRef.current = shadow.resources;\n annotationsRef.current = shadow.annotations;\n if (shadow.policy) {\n policyRef.current = shadow.policy;\n policyPickedRef.current = true;\n setPolicyPicked(policyPickedRef.current);\n } else if (!policyPickedRef.current) {\n adoptFetchedPolicy();\n }\n localEditRevision.current ||= 1;\n setValue(shadow.text);\n setRestoredResources(shadow.resources);\n setAnnotations(shadow.annotations);\n if (shadow.policy) setPolicy(shadow.policy);\n } else if (\n replaceLocal ||\n (!localWasDirtyAtStart && localAtStart === localEditRevision.current)\n ) {\n valueRef.current = fetched.text;\n restoredResourcesRef.current = fetched.resources;\n annotationsRef.current = fetched.annotations ?? [];\n policyRef.current = policyFromDraft(fetched);\n policyPickedRef.current = !fetched.policyFollowsSession;\n setPolicyPicked(policyPickedRef.current);\n lastSavedSignature.current = draftSignature(draftPayload(fetched));\n setValue(fetched.text);\n setRestoredResources(fetched.resources);\n setAnnotations(fetched.annotations ?? []);\n setPolicy(policyRef.current);\n } else {\n // Keep the in-flight edit, but the fetched row is still the OCC\n // base. First hydrate has no local policy until this read lands;\n // without it autosave cannot persist the typed text.\n lastSavedSignature.current = draftSignature(draftPayload(fetched));\n if (!policyRef.current || !policyPickedRef.current) adoptFetchedPolicy();\n }\n } else if (\n fetched.revision === currentRevision &&\n fetched.policyFollowsSession &&\n !policyPickedRef.current &&\n !samePolicy(policyRef.current, policyFromDraft(fetched))\n ) {\n // The chat's settings changed without a new draft revision (for\n // example the agent switched the model). Only the shown policy moves;\n // the draft's content and save base are unchanged.\n draftRef.current = fetched;\n setDraft(fetched);\n adoptFetchedPolicy();\n }\n } catch (cause) {\n if (\n !requestAbort.signal.aborted &&\n generation === targetGeneration.current &&\n targetKeyRef.current === targetKey &&\n readTicket === draftReadGeneration.current\n ) {\n const problem = asError(cause);\n const timedOut = problem.name === \"TimeoutError\";\n setDraftReadError(\n timedOut\n ? new ComposerStateError(t(\"hooks.useComposer.draftSyncTimedOutRetrying\"), { cause })\n : problem,\n );\n if (\n timedOut ||\n cause instanceof TypeError ||\n (cause && typeof cause === \"object\" && \"retryable\" in cause && cause.retryable === true)\n ) {\n retry.failures += 1;\n scheduleRetry();\n if (draftRef.current === null) setDraftHydrationRetrying(true);\n } else {\n if (retry.timer !== null) clearTimeout(retry.timer);\n retry.failures = 0;\n retry.timer = null;\n setDraftHydrationRetrying(false);\n }\n }\n } finally {\n if (\n generation === targetGeneration.current &&\n targetKeyRef.current === targetKey &&\n readTicket === draftReadGeneration.current\n ) {\n setDraftLoading(false);\n }\n if (draftReadInFlightRef.current === targetKey) {\n draftReadInFlightRef.current = null;\n }\n if (draftReadAbortRef.current === requestAbort) {\n draftReadAbortRef.current = null;\n }\n }\n },\n [client, durableDrafts, sessionId, targetKey, workspaceId, t],\n );\n\n useEffect(() => {\n if (!sessionId || !durableDrafts) {\n setDraftLoading(false);\n return;\n }\n void loadDraft(false);\n }, [durableDrafts, loadDraft, sessionId]);\n // After long background / sleep the in-memory revision is often stale while\n // a prior autosave already advanced the server. Soft-reload on wake so the\n // next keystroke does not OCC against a dead revision.\n useEffect(() => {\n if (!sessionId || !durableDrafts) return;\n const onWake = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") return;\n void loadDraft(false);\n };\n document.addEventListener(\"visibilitychange\", onWake);\n window.addEventListener(\"pageshow\", onWake);\n return () => {\n document.removeEventListener(\"visibilitychange\", onWake);\n window.removeEventListener(\"pageshow\", onWake);\n };\n }, [durableDrafts, loadDraft, sessionId]);\n useEffect(() => {\n if (!sessionId || !durableDrafts) return;\n return registerSessionReconciler(sessionId, \"composer\", async () => await loadDraft(false));\n }, [durableDrafts, loadDraft, registerSessionReconciler, sessionId]);\n const reconcileSteering = useCallback(async (): Promise<void> => {\n if (!sessionId || !steeringRef.current) return;\n const ownedTargetKey = targetKey;\n let events: SessionEvent[];\n try {\n events = await client.listEvents(workspaceId, sessionId, {\n includeTypes: [\n \"user.message\",\n \"turn.started\",\n \"turn.completed\",\n \"turn.failed\",\n \"turn.cancelled\",\n \"turn.superseded\",\n ],\n limit: 250,\n payloadMode: \"full\",\n });\n } catch {\n // Best effort: the live stream still settles steering when its event arrives.\n return;\n }\n if (targetKeyRef.current !== ownedTargetKey) return;\n setSteering((current) => {\n if (!current) return current;\n if (steeringSettledByEvents(current, events)) {\n steeringSettlementEventsRef.current = [];\n return null;\n }\n const accepted = steeringAcceptedEvent(current, events);\n if (!accepted || current.triggerEventId) return current;\n return {\n ...current,\n phase: \"accepted\",\n triggerEventId: accepted.id,\n };\n });\n }, [client, sessionId, targetKey, workspaceId]);\n useSessionEventTrigger(\n client,\n workspaceId,\n sessionId,\n (event) => isComposerDraftEvent(event) || isSteeringSettlementEvent(event),\n (event) => {\n if (isComposerDraftEvent(event)) void loadDraft(false);\n if (!isSteeringSettlementEvent(event)) return;\n steeringSettlementEventsRef.current = [\n ...steeringSettlementEventsRef.current.slice(-15),\n event,\n ];\n setSteering((current) => {\n if (!current || !steeringSettledByEvents(current, [event])) return current;\n steeringSettlementEventsRef.current = [];\n return null;\n });\n },\n {\n enabled: Boolean(sessionId) && (durableDrafts || steering !== null),\n ...(options.events !== undefined ? { events: options.events } : {}),\n },\n reconcileSteering,\n );\n\n useEffect(() => {\n if (!steering) return;\n const observed = [...(options.events ?? []), ...steeringSettlementEventsRef.current];\n if (!steeringSettledByEvents(steering, observed)) return;\n steeringSettlementEventsRef.current = [];\n setSteering(null);\n }, [options.events, steering]);\n\n useEffect(() => {\n if (!acceptedControl) return;\n const effectiveControl = options.effectiveControl;\n if (!effectiveControl || effectiveControl.controlVersion < acceptedControl.controlVersion) {\n return;\n }\n setAcceptedControl((current) => (current === acceptedControl ? null : current));\n }, [acceptedControl, options.effectiveControl]);\n // The accepted receipt is newer than the authoritative control only until\n // that control catches up; derive it per render so a caught-up snapshot wins\n // in the same frame instead of after the clearing effect.\n const pendingAcceptedControl =\n acceptedControl &&\n (!options.effectiveControl ||\n options.effectiveControl.controlVersion < acceptedControl.controlVersion)\n ? acceptedControl\n : null;\n\n const currentDraftPayload = useCallback((): SaveComposerDraftRequest | null => {\n if (!durableDrafts || targetKeyRef.current !== targetKey) return null;\n const base = draftRef.current;\n const currentPolicy = policyRef.current;\n if (!base || !currentPolicy) return null;\n return composerDraftPayload(\n base,\n value,\n restoredResources,\n annotations,\n pickedPolicy(policyPickedRef, policyRef),\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n );\n }, [annotations, durableDrafts, restoredResources, targetKey, value]);\n\n const adoptDraftBase = useCallback(\n (next: ComposerDraft): void => {\n if (targetKeyRef.current !== targetKey) return;\n draftRef.current = next;\n setDraft(next);\n const nextPolicy = policyFromDraft(next);\n if (next.policyFollowsSession) {\n // A sent pick becomes the chat's setting and the server's next draft\n // follows the chat again; so does this composer unless the person\n // picked something else meanwhile. A following one shows the\n // server's current settings.\n if (samePolicy(policyRef.current, nextPolicy)) {\n policyPickedRef.current = false;\n setPolicyPicked(false);\n }\n if (!policyPickedRef.current && !samePolicy(policyRef.current, nextPolicy)) {\n policyRef.current = nextPolicy;\n setPolicy(nextPolicy);\n }\n }\n lastSavedSignature.current = draftSignature(draftPayload(next));\n setDraftConflict(null);\n setError(null);\n },\n [targetKey],\n );\n\n /**\n * Take the session's one draft slot. The server accepts a durable send only\n * with exactly the content saved at the revision it names, so a send holds\n * the slot from its save through its submit: no autosave and no other send\n * can write the draft in between. Everything that writes the draft waits\n * its turn here, in order. Call the returned function to let the next one\n * in; it is safe to call more than once.\n */\n const acquireDraftSlot = useCallback(async (): Promise<() => void> => {\n let release!: () => void;\n const released = new Promise<void>((resolve) => {\n release = resolve;\n });\n const previous = saveChain.current;\n saveChain.current = previous.then(\n () => released,\n () => released,\n );\n await previous.catch(() => undefined);\n return release;\n }, []);\n\n /**\n * Save the draft now. The caller holds the draft slot.\n *\n * A save refused as made against an old revision re-reads the draft before\n * it counts as a conflict. The same content, or content this page wrote itself (a save\n * whose reply was lost, or one that landed after the composer remounted),\n * is not another tab: the save just moves to the current revision. An\n * explicit choice (Send, Keep mine) saves the person's content over\n * whatever is there. Only an autosave that meets someone else's edit\n * stops and offers Keep mine / Use other draft.\n */\n const saveDraftInSlot = useCallback(\n async (\n payload: SaveComposerDraftRequest,\n owner: { targetKey: string; generation: number },\n // Receives this call's own failure (never a later autosave's), so a send\n // blocked by it keeps its real cause.\n onFailure?: (problem: Error) => void,\n intent: \"autosave\" | \"explicit\" = \"autosave\",\n ): Promise<boolean> => {\n const owned = () =>\n targetKeyRef.current === owner.targetKey && targetGeneration.current === owner.generation;\n if (!sessionId || !durableDrafts || !owned()) return false;\n const current = draftRef.current;\n if (!current) return false;\n let request = { ...payload, expectedRevision: current.revision };\n if (draftSignature(request) === lastSavedSignature.current) return true;\n const writesKey = `${workspaceId}\\u0000${sessionId}`;\n const fail = (problem: Error): false => {\n if (owned()) {\n // The conflict choice says what happened; a generic \"conflicts with\n // the current state\" line under it would only repeat it vaguely.\n if (isDraftConflictError(problem)) setDraftConflict(problem);\n else setError(problem);\n onFailure?.(problem);\n }\n return false;\n };\n setDraftSaving(true);\n try {\n for (let reread = 0; ; reread += 1) {\n let problem: Error;\n try {\n rememberDraftWrite(writesKey, draftContentKey(request));\n const saved = await client.saveComposerDraft(workspaceId, sessionId, request);\n if (!owned()) return false;\n adoptDraftBase(saved);\n return true;\n } catch (cause) {\n problem = asError(cause);\n }\n if (!owned()) return false;\n if (!isDraftConflictError(problem) || reread >= DRAFT_CONFLICT_REREADS) {\n return fail(problem);\n }\n let remote: ComposerDraft;\n try {\n remote = await client.getComposerDraft(workspaceId, sessionId);\n } catch (cause) {\n return fail(asError(cause));\n }\n if (!owned()) return false;\n const remoteContent = draftContentKey(draftPayload(remote));\n if (remoteContent === draftContentKey(request)) {\n adoptDraftBase(remote);\n return true;\n }\n if (intent !== \"explicit\" && !recentDraftWrites.get(writesKey)?.includes(remoteContent)) {\n return fail(problem);\n }\n draftRef.current = remote;\n setDraft(remote);\n request = { ...request, expectedRevision: remote.revision };\n }\n } finally {\n if (owned()) setDraftSaving(false);\n }\n },\n [adoptDraftBase, client, durableDrafts, sessionId, workspaceId],\n );\n\n const persistPayload = useCallback(\n async (\n payload: SaveComposerDraftRequest,\n onFailure?: (problem: Error) => void,\n intent: \"autosave\" | \"explicit\" = \"autosave\",\n ): Promise<boolean> => {\n const owner = { targetKey, generation: targetGeneration.current };\n if (!sessionId || !durableDrafts || targetKeyRef.current !== owner.targetKey) {\n return false;\n }\n const release = await acquireDraftSlot();\n try {\n return await saveDraftInSlot(payload, owner, onFailure, intent);\n } finally {\n release();\n }\n },\n [acquireDraftSlot, durableDrafts, saveDraftInSlot, sessionId, targetKey],\n );\n\n const flushDraft = useCallback(async (): Promise<void> => {\n if (draftLoading || sending || draftConflict) return;\n const payload = currentDraftPayload();\n if (!payload || draftSignature(payload) === lastSavedSignature.current) return;\n await persistPayload(payload);\n }, [currentDraftPayload, draftConflict, draftLoading, persistPayload, sending]);\n\n const replaceOptimisticSends = useCallback(\n (\n update: (current: OptimisticSendOperation[]) => OptimisticSendOperation[],\n ): OptimisticSendOperation[] => {\n const next = update(optimisticSendsRef.current);\n optimisticSendsRef.current = next;\n rememberOptimisticSendOperations(pendingOperationKey, next);\n setOptimisticSends(next);\n return next;\n },\n [pendingOperationKey],\n );\n\n const markOptimisticAccepted = useCallback(\n (operation: OptimisticSendOperation): void => {\n if (!optimisticCallbackIdsRef.current.has(operation.clientEventId)) {\n optimisticCallbackIdsRef.current.add(operation.clientEventId);\n onSent?.(operation.input.text, operation.input);\n }\n replaceOptimisticSends((current) =>\n current.filter((candidate) => candidate.clientEventId !== operation.clientEventId),\n );\n },\n [onSent, replaceOptimisticSends],\n );\n\n useEffect(() => {\n const events = options.events ?? [];\n if (events.length === 0 || optimisticSendsRef.current.length === 0) return;\n const reconciled = optimisticSendsRef.current.map((operation) =>\n reconcileOptimisticSendFromEvents(operation, events),\n );\n const settledIds = new Set(\n reconciled.filter((item) => item.settled).map((item) => item.operation.clientEventId),\n );\n const changed = reconciled.some(\n (item, index) =>\n item.operation !== optimisticSendsRef.current[index] &&\n !settledIds.has(item.operation.clientEventId),\n );\n for (const item of reconciled) {\n if (item.admitted && !optimisticCallbackIdsRef.current.has(item.operation.clientEventId)) {\n optimisticCallbackIdsRef.current.add(item.operation.clientEventId);\n onSent?.(item.operation.input.text, item.operation.input);\n }\n if (item.settled) markOptimisticAccepted(item.operation);\n }\n if (changed) {\n replaceOptimisticSends((current) =>\n current\n .map(\n (operation) =>\n reconciled.find((item) => item.operation.clientEventId === operation.clientEventId)\n ?.operation ?? operation,\n )\n .filter((operation) => !settledIds.has(operation.clientEventId)),\n );\n }\n if (durableDrafts && reconciled.some((item) => item.admitted)) void loadDraft(false);\n }, [\n durableDrafts,\n loadDraft,\n markOptimisticAccepted,\n onSent,\n options.events,\n replaceOptimisticSends,\n ]);\n\n const processOptimisticSends = useCallback((): void => {\n if (!sessionId || optimisticProcessorBusyRef.current) return;\n const currentOperations = optimisticSendsRef.current;\n const operationIndex = currentOperations.findIndex(\n (candidate) => candidate.state === \"sending\",\n );\n const operation = operationIndex < 0 ? undefined : currentOperations[operationIndex];\n if (!operation) return;\n const held = serviceWaitRef.current.get(operation.clientEventId);\n if (held && held.retryAt > Date.now()) {\n // Opengeni is updating: this send (and everything behind it, in order)\n // waits for its scheduled retry.\n if (serviceRetryTimerRef.current === null) {\n serviceRetryTimerRef.current = setTimeout(\n () => {\n serviceRetryTimerRef.current = null;\n processOptimisticSendsRef.current();\n },\n Math.max(0, held.retryAt - Date.now()),\n );\n }\n return;\n }\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n optimisticProcessorBusyRef.current = true;\n void (async () => {\n let mutationFailureObserved = false;\n // The draft save failed before anything was submitted.\n let notSubmitted = false;\n let holding = false;\n // Held from this send's draft save through its submit.\n let releaseDraftSlot: (() => void) | null = null;\n /**\n * Keep a send that failed only because Opengeni is updating: it stays\n * \"sending\" with the same client event ID and is retried with backoff.\n * An unconfirmed attempt is reconciled against the timeline first, so a\n * retry can never deliver it twice. Returns false once the failure is no\n * longer calm (it outlasted a normal update window).\n */\n const holdForService = (cause: unknown, outcomeUnknown: boolean): boolean => {\n if (outcomeUnknown && !operation.canRetry) return false;\n const now = Date.now();\n const previous = serviceWaitRef.current.get(operation.clientEventId);\n const since = isMaintenanceError(cause) ? now : (previous?.since ?? now);\n if (!isCalmServiceFailure(cause, since, now)) return false;\n const attempts = (previous?.attempts ?? 0) + 1;\n const delayMs = Math.round(\n Math.min(SERVICE_SEND_RETRY_MAX_DELAY_MS, 1_000 * 2 ** (attempts - 1)) *\n (0.8 + Math.random() * 0.4),\n );\n serviceWaitRef.current.set(operation.clientEventId, {\n since,\n attempts,\n retryAt: now + delayMs,\n });\n holding = true;\n setServiceWaiting(true);\n replaceOptimisticSends((current) =>\n current.map((candidate) =>\n candidate.clientEventId === operation.clientEventId\n ? { ...candidate, state: \"sending\", outcomeUnknown }\n : candidate,\n ),\n );\n return true;\n };\n const markFailed = (cause: unknown, outcomeUnknown: boolean): boolean => {\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n if (holdForService(cause, outcomeUnknown)) return true;\n const problem = asError(cause);\n replaceOptimisticSends((current) =>\n current.map((candidate) =>\n candidate.clientEventId === operation.clientEventId\n ? {\n ...candidate,\n state: \"failed\",\n error: formatError(\n cause,\n outcomeUnknown &&\n !isOutcomeUnknownError(problem) &&\n !(problem instanceof ComposerReconciliationRequiredError)\n ? problem instanceof OpenGeniApiError && problem.correlationId\n ? t(\"hooks.useComposer.notConfirmedCheckStatusWithReference\", {\n reference: problem.correlationId,\n })\n : t(\"hooks.useComposer.notConfirmedCheckStatus\")\n : composerSubmissionErrorMessage(t, problem, canBuyCreditsRef.current),\n ),\n retryable: outcomeUnknown || composerSubmissionCanRetry(problem),\n outcomeUnknown,\n correlationId:\n problem instanceof OpenGeniApiError\n ? problem.correlationId\n : candidate.correlationId,\n }\n : candidate,\n ),\n );\n return false;\n };\n try {\n if (operation.outcomeUnknown) {\n let events: SessionEvent[];\n try {\n events = await client.listEvents(workspaceId, sessionId, {\n includeTypes: [\n \"user.message\",\n \"turn.queued\",\n \"turn.started\",\n \"turn.completed\",\n \"turn.failed\",\n \"turn.cancelled\",\n \"turn.superseded\",\n ],\n limit: 250,\n payloadMode: \"full\",\n });\n } catch (cause) {\n // This read cannot settle the prior mutation in either direction.\n // Preserve its exact key and uncertain status until reconciliation\n // succeeds or that same mutation is actually replayed.\n const wasHeld = serviceWaitRef.current.has(operation.clientEventId);\n if (!markFailed(cause, true) && wasHeld) {\n // A send held for an update that can no longer wait is now a\n // delivery failure; its first failure was never reported.\n notifyComposerObserver(\n onDeliveryErrorRef.current,\n asError(cause),\n operation.input,\n \"send\",\n );\n }\n return;\n }\n const reconciled = reconcileOptimisticSendFromEvents(operation, events);\n if (reconciled.admitted) {\n if (durableDrafts) await loadDraft(false);\n if (reconciled.settled) {\n markOptimisticAccepted(reconciled.operation);\n } else {\n replaceOptimisticSends((current) =>\n current.map((candidate) =>\n candidate.clientEventId === operation.clientEventId\n ? reconciled.operation\n : candidate,\n ),\n );\n if (!optimisticCallbackIdsRef.current.has(operation.clientEventId)) {\n optimisticCallbackIdsRef.current.add(operation.clientEventId);\n onSent?.(reconciled.operation.input.text, reconciled.operation.input);\n }\n }\n return;\n }\n if (!operation.canRetry) {\n throw new ComposerReconciliationRequiredError();\n }\n }\n let expectedDraftRevision: number | undefined;\n if (durableDrafts && operation.draftPayload) {\n releaseDraftSlot = await acquireDraftSlot();\n let persistFailure = null as Error | null;\n if (\n !(await saveDraftInSlot(\n operation.draftPayload,\n { targetKey: ownedTargetKey, generation: ownedGeneration },\n (problem) => {\n persistFailure = problem;\n },\n \"explicit\",\n ))\n ) {\n // An update that blocks the draft save holds the send like any\n // other transient failure; nothing was submitted yet.\n if (persistFailure && isTransientServiceFailure(persistFailure)) {\n notSubmitted = true;\n throw persistFailure;\n }\n throw new ComposerStateError(t(\"hooks.useComposer.theMessageDraftCouldNot\"));\n }\n expectedDraftRevision = draftRef.current?.revision;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n const wireInput = {\n ...operation.input,\n ...(expectedDraftRevision !== undefined ? { expectedDraftRevision } : {}),\n };\n let acceptedResult: SubmitComposerDraftResponse | null = null;\n let acceptedEvent: SessionEvent | null = null;\n if (durableDrafts) {\n if (!operation.draftPayload || expectedDraftRevision === undefined) {\n throw new ComposerStateError(t(\"hooks.useComposer.theDurableComposerDraftIs\"));\n }\n const result = await client\n .submitComposerDraft(workspaceId, sessionId, {\n text: operation.draftPayload.text,\n annotations: operation.draftPayload.annotations,\n resources: operation.draftPayload.resources,\n // Absent while the draft follows the chat's settings.\n ...(operation.draftPayload.model !== undefined\n ? { model: operation.draftPayload.model }\n : {}),\n ...(operation.draftPayload.reasoningEffort !== undefined\n ? { reasoningEffort: operation.draftPayload.reasoningEffort }\n : {}),\n ...(operation.draftPayload.latencyMode !== undefined\n ? { latencyMode: operation.draftPayload.latencyMode }\n : {}),\n expectedDraftRevision,\n clientEventId: operation.clientEventId,\n delivery: \"send\",\n ...(wireInput.controlEtag ? { controlEtag: wireInput.controlEtag } : {}),\n ...(wireInput.modelContext ? { modelContext: wireInput.modelContext } : {}),\n ...(wireInput.mcpCredentialUpdates\n ? { mcpCredentialUpdates: wireInput.mcpCredentialUpdates }\n : {}),\n ...(wireInput.connectionAccounts\n ? { connectionAccounts: wireInput.connectionAccounts }\n : {}),\n\n ...(wireInput.personalResourceAttachment\n ? { personalResourceAttachment: wireInput.personalResourceAttachment }\n : {}),\n })\n .catch((cause: unknown) => {\n mutationFailureObserved = true;\n throw cause;\n });\n acceptedResult = result;\n adoptDraftBase(result.draft);\n releaseDraftSlot?.();\n } else {\n acceptedEvent = await client\n .sendMessage(workspaceId, sessionId, wireInput)\n .catch((cause: unknown) => {\n mutationFailureObserved = true;\n throw cause;\n });\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n const acceptedRouting =\n acceptedResult?.routing ?? promptRoutingFromAcceptedEvent(acceptedEvent);\n const acceptedDestination =\n acceptedRouting === \"queued_for_execution\"\n ? \"queue\"\n : acceptedRouting === \"accepted_for_execution\" ||\n acceptedRouting === \"accepted_for_steering\"\n ? \"chat\"\n : operation.destination;\n if (options.events === undefined && acceptedDestination === \"chat\") {\n markOptimisticAccepted({ ...operation, input: wireInput });\n } else {\n replaceOptimisticSends((current) =>\n current.map((candidate) =>\n candidate.clientEventId === operation.clientEventId\n ? {\n ...candidate,\n input: wireInput,\n destination: acceptedDestination,\n turnId: acceptedResult?.turn.id ?? candidate.turnId,\n triggerEventId:\n acceptedResult?.accepted.id ?? acceptedEvent?.id ?? candidate.triggerEventId,\n appliedQueueVersion:\n acceptedResult?.receipt?.appliedQueueVersion ?? candidate.appliedQueueVersion,\n state: \"queued\",\n error: undefined,\n }\n : candidate,\n ),\n );\n }\n if (!optimisticCallbackIdsRef.current.has(operation.clientEventId)) {\n optimisticCallbackIdsRef.current.add(operation.clientEventId);\n onSent?.(wireInput.text, wireInput);\n }\n } catch (cause) {\n const current = optimisticSendsRef.current.find(\n (candidate) => candidate.clientEventId === operation.clientEventId,\n );\n // A live durable event can prove admission before the original HTTP\n // response times out. Never regress that confirmed state to failure.\n if (!current || (current.state === \"queued\" && current.outcomeUnknown === false)) {\n return;\n }\n const problem = asError(cause);\n // Only an actual mutation replay can replace prior uncertainty with a\n // definitive response. Local preparation failures remain retry-only.\n const outcomeUnknown =\n operation.outcomeUnknown && !mutationFailureObserved\n ? true\n : !notSubmitted && isOutcomeUnknownError(cause);\n // A send held for an update is not a delivery failure (yet).\n if (!markFailed(cause, outcomeUnknown)) {\n notifyComposerObserver(onDeliveryErrorRef.current, problem, operation.input, \"send\");\n }\n } finally {\n releaseDraftSlot?.();\n optimisticProcessorBusyRef.current = false;\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n if (!holding) serviceWaitRef.current.delete(operation.clientEventId);\n for (const id of serviceWaitRef.current.keys()) {\n if (\n !optimisticSendsRef.current.some(\n (candidate) => candidate.clientEventId === id && candidate.state === \"sending\",\n )\n ) {\n serviceWaitRef.current.delete(id);\n }\n }\n setServiceWaiting(serviceWaitRef.current.size > 0);\n }\n if (targetKeyRef.current === ownedTargetKey) {\n setOptimisticSends([...optimisticSendsRef.current]);\n }\n }\n })();\n }, [\n acquireDraftSlot,\n adoptDraftBase,\n client,\n durableDrafts,\n formatError,\n markOptimisticAccepted,\n loadDraft,\n onSent,\n options.events,\n replaceOptimisticSends,\n saveDraftInSlot,\n sessionId,\n targetKey,\n workspaceId,\n t,\n ]);\n\n processOptimisticSendsRef.current = processOptimisticSends;\n useEffect(() => {\n processOptimisticSends();\n }, [optimisticSends, processOptimisticSends]);\n // A held send can also leave \"sending\" without its retry (the event stream\n // confirms it, or the person removes it): drop the hold so the updating\n // line clears with it.\n useEffect(() => {\n for (const id of serviceWaitRef.current.keys()) {\n if (\n !optimisticSends.some(\n (candidate) => candidate.clientEventId === id && candidate.state === \"sending\",\n )\n ) {\n serviceWaitRef.current.delete(id);\n }\n }\n setServiceWaiting(serviceWaitRef.current.size > 0);\n }, [optimisticSends]);\n\n // Private durable autosave. A newer local edit is never replaced by an older\n // response; saves serialize and each reads the latest acknowledged revision.\n useEffect(() => {\n const pending = pendingOperationRef.current;\n if (pending) {\n const shadow = {\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n ...(pickedPolicy(policyPickedRef, policyRef)\n ? { policy: pickedPolicy(policyPickedRef, policyRef) }\n : {}),\n };\n if (\n pending.newerShadow.text !== shadow.text ||\n JSON.stringify(pending.newerShadow.resources) !== JSON.stringify(shadow.resources) ||\n JSON.stringify(pending.newerShadow.annotations) !== JSON.stringify(shadow.annotations) ||\n JSON.stringify(pending.newerShadow.policy) !== JSON.stringify(shadow.policy)\n ) {\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pending,\n shadow,\n );\n }\n return;\n }\n const optimistic = optimisticSendsRef.current.at(-1);\n if (optimistic) {\n const shadow = {\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n ...(pickedPolicy(policyPickedRef, policyRef)\n ? { policy: pickedPolicy(policyPickedRef, policyRef) }\n : {}),\n };\n if (\n optimistic.newerShadow.text !== shadow.text ||\n JSON.stringify(optimistic.newerShadow.resources) !== JSON.stringify(shadow.resources) ||\n JSON.stringify(optimistic.newerShadow.annotations) !== JSON.stringify(shadow.annotations) ||\n JSON.stringify(optimistic.newerShadow.policy) !== JSON.stringify(shadow.policy)\n ) {\n setOptimisticDraftShadow(shadow);\n }\n }\n if (optimisticSendsRef.current.some((operation) => operation.state === \"sending\")) {\n return;\n }\n if (\n !durableDrafts ||\n !sessionId ||\n draftLoading ||\n sending ||\n !draftRef.current ||\n draftConflict\n )\n return;\n const payload = currentDraftPayload();\n if (!payload || draftSignature(payload) === lastSavedSignature.current) return;\n const timer = window.setTimeout(() => void persistPayload(payload), 500);\n return () => window.clearTimeout(timer);\n }, [\n autosaveRetry,\n currentDraftPayload,\n durableDrafts,\n draftConflict,\n draftLoading,\n liveExtrasVersion,\n pendingOperationKey,\n persistPayload,\n setOptimisticDraftShadow,\n sending,\n sessionId,\n ]);\n\n // An update or brief outage left a draft save error on the composer. Check\n // quietly until Opengeni answers again, then clear it and let autosave catch\n // up; nobody has to click anything. An explicit action's failure (Stop,\n // Resume, Steer) stays until the person acts, so it is never lost.\n useEffect(() => {\n if (!error || !sessionId || !isTransientServiceFailure(error) || isActionFailure(error)) {\n return;\n }\n const ownedTargetKey = targetKey;\n const ownedError = error;\n let cancelled = false;\n let inFlight = false;\n const timer = setInterval(() => {\n if (inFlight) return;\n inFlight = true;\n const probe: Promise<unknown> = durableDrafts\n ? client.getComposerDraft(workspaceId, sessionId)\n : client.listEvents(workspaceId, sessionId, { limit: 1, payloadMode: \"none\" });\n probe.then(\n () => {\n inFlight = false;\n if (cancelled || targetKeyRef.current !== ownedTargetKey) return;\n setError((current) => (current === ownedError ? null : current));\n setAutosaveRetry((nonce) => nonce + 1);\n },\n () => {\n inFlight = false;\n },\n );\n }, TRANSIENT_RECONNECT_INTERVAL_MS);\n return () => {\n cancelled = true;\n clearInterval(timer);\n };\n }, [client, durableDrafts, error, sessionId, targetKey, workspaceId]);\n\n const dispatch = useCallback(\n async (delivery: \"send\" | \"steer\", explicit?: string): Promise<boolean> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n const operationKey = pendingComposerOperationKey(workspaceId, sessionId);\n const pending = pendingOperationRef.current ?? restorePendingComposerOperation(operationKey);\n if (pending && !pendingOperationRef.current) {\n pendingOperationRef.current = pending;\n pendingClientEventId.current = pending.input.clientEventId ?? null;\n }\n const draftAtSend = value;\n const annotationsAtSend = annotations;\n const rawText = explicit ?? draftAtSend;\n const hasText = rawText.trim().length > 0;\n const hasAnnotations = annotationsAtSend.length > 0;\n const currentPolicy = policyRef.current;\n const annotationsComplete = annotationsAtSend.every(\n (annotation) => annotation.note.trim().length > 0,\n );\n // Resolve the extras once: a file-only message (empty text + ≥1 ready\n // resource) is legitimate, so we must not bail on empty text alone.\n const extras = pending ? {} : resolveSendExtras(sendExtrasRef.current);\n const hasResources = restoredResources.length > 0 || (extras.resources?.length ?? 0) > 0;\n if (\n (!pending && (!annotationsComplete || (!hasText && !hasResources && !hasAnnotations))) ||\n !sessionId ||\n !currentPolicy ||\n sending ||\n sendBlockedRef.current?.() === true ||\n targetKeyRef.current !== ownedTargetKey\n ) {\n return false;\n }\n\n const clearPending = (): void => {\n pendingOperationRef.current = null;\n pendingClientEventId.current = null;\n forgetPendingComposerOperation(operationKey);\n };\n\n let keepSteering = pending?.delivery === \"steer\";\n // Held from this send's draft save (or its retry) through its submit.\n let releaseDraftSlot: (() => void) | null = null;\n\n const settleAccepted = (operation: PendingComposerOperation): void => {\n clearPending();\n const draftWasUnchanged = valueRef.current === operation.draftAtSend;\n const resourcesWereUnchanged =\n JSON.stringify(restoredResourcesRef.current) ===\n JSON.stringify(operation.resourcesAtSend);\n const annotationsWereUnchanged =\n JSON.stringify(annotationsRef.current) === JSON.stringify(operation.annotationsAtSend);\n if (resourcesWereUnchanged) {\n restoredResourcesRef.current = [];\n setRestoredResources([]);\n }\n if (annotationsWereUnchanged) {\n annotationsRef.current = [];\n setAnnotations([]);\n setAnnotationReviewTargetId(null);\n }\n if (operation.clearDraftOnAccept && draftWasUnchanged) {\n valueRef.current = \"\";\n setValue(\"\");\n }\n onSent?.(operation.input.text, operation.input);\n };\n\n const deliver = async (operation: PendingComposerOperation) => {\n if (durableDrafts) {\n const input = operation.input;\n if (input.expectedDraftRevision === undefined || input.clientEventId === undefined) {\n throw new ComposerStateError(t(\"hooks.useComposer.theDurableComposerDraftIs\"));\n }\n const result = await client.submitComposerDraft(workspaceId, sessionId, {\n text: input.text,\n annotations: input.annotations ?? [],\n resources: input.resources ?? [],\n // Absent while the draft follows the chat's settings.\n ...(input.model ? { model: input.model } : {}),\n ...(input.reasoningEffort ? { reasoningEffort: input.reasoningEffort } : {}),\n ...(input.latencyMode ? { latencyMode: input.latencyMode } : {}),\n expectedDraftRevision: input.expectedDraftRevision,\n clientEventId: input.clientEventId,\n delivery: operation.delivery,\n ...(input.controlEtag ? { controlEtag: input.controlEtag } : {}),\n ...(input.modelContext ? { modelContext: input.modelContext } : {}),\n ...(input.mcpCredentialUpdates\n ? { mcpCredentialUpdates: input.mcpCredentialUpdates }\n : {}),\n ...(input.connectionAccounts ? { connectionAccounts: input.connectionAccounts } : {}),\n ...(input.personalResourceAttachment\n ? { personalResourceAttachment: input.personalResourceAttachment }\n : {}),\n });\n adoptDraftBase(result.draft);\n return result;\n }\n if (operation.delivery === \"steer\") {\n return await client.steerMessage(workspaceId, sessionId, operation.input);\n }\n await client.sendMessage(workspaceId, sessionId, operation.input);\n return null;\n };\n\n if (delivery === \"steer\") {\n if (steeringRef.current?.clientEventId !== pending?.input.clientEventId) {\n steeringOccurredAtRef.current = new Date().toISOString();\n }\n setSteering({\n phase: \"submitting\",\n text: rawText,\n clientEventId: pending?.input.clientEventId ?? pendingClientEventId.current,\n triggerEventId: null,\n turnId: null,\n });\n }\n setSending(true);\n setError(null);\n try {\n if (pending) {\n let acceptedEvent: SessionEvent | null = null;\n try {\n const events = await client.listEvents(workspaceId, sessionId, {\n includeTypes: [\"user.message\"],\n limit: 100,\n payloadMode: \"none\",\n });\n acceptedEvent =\n events.find(\n (event) =>\n event.type === \"user.message\" &&\n event.clientEventId === pending.input.clientEventId,\n ) ?? null;\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n const problem = markActionFailure(asError(cause));\n setError(problem);\n if (pending.delivery === \"steer\") {\n keepSteering = true;\n setSteering({\n phase: \"failed\",\n text: pending.input.text,\n clientEventId: pending.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n error: t(\"hooks.useComposer.notConfirmedRetry\"),\n outcomeUnknown: true,\n });\n }\n }\n return false;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n if (acceptedEvent) {\n if (durableDrafts) await loadDraft(false);\n if (pending.delivery === \"steer\") {\n keepSteering = true;\n setSteering({\n phase: \"accepted\",\n text: pending.input.text,\n clientEventId: pending.input.clientEventId ?? null,\n triggerEventId: acceptedEvent.id,\n turnId: null,\n });\n }\n settleAccepted(pending);\n return true;\n }\n if (!pending.canRetry) {\n setError(new ComposerReconciliationRequiredError());\n return false;\n }\n try {\n if (durableDrafts) releaseDraftSlot = await acquireDraftSlot();\n const result = await deliver(pending);\n if (pending.delivery === \"steer\" && result) {\n keepSteering = true;\n setSteering({\n phase: \"accepted\",\n text: pending.input.text,\n clientEventId: pending.input.clientEventId ?? null,\n triggerEventId: result.accepted.id,\n turnId: result.turn.id,\n stoppingPreviousAttempt:\n result.replay !== true && (result.interruptionCount ?? 0) > 0,\n });\n }\n } catch (cause) {\n const problem = asError(cause);\n const outcomeUnknown = isOutcomeUnknownError(cause);\n notifyComposerObserver(\n onDeliveryErrorRef.current,\n problem,\n pending.input,\n pending.delivery,\n );\n if (!outcomeUnknown) {\n clearPending();\n keepSteering = false;\n } else if (pending.delivery === \"steer\") {\n keepSteering = true;\n setSteering({\n phase: \"failed\",\n text: pending.input.text,\n clientEventId: pending.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n error: t(\"hooks.useComposer.notConfirmedRetry\"),\n outcomeUnknown: true,\n });\n }\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(markActionFailure(problem));\n }\n return false;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n settleAccepted(pending);\n return true;\n }\n\n // Trimming is only an emptiness check. A non-blank prompt is persisted\n // and submitted byte-for-byte, while file-only sends use the same\n // placeholder for both operations so the server content fence cannot\n // reject its own client.\n const sendText = hasText ? rawText : hasAnnotations ? \"\" : FILE_ONLY_MESSAGE_TEXT(t);\n const currentPayload = currentDraftPayload();\n const payload = currentPayload ? { ...currentPayload, text: sendText } : null;\n if (payload) {\n releaseDraftSlot = await acquireDraftSlot();\n if (\n !(await saveDraftInSlot(\n payload,\n { targetKey: ownedTargetKey, generation: ownedGeneration },\n undefined,\n \"explicit\",\n ))\n ) {\n return false;\n }\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n // The wire contract requires non-empty text (z.string().min(1)) and the\n // worker rejects whitespace-only text; a file-only message therefore\n // carries a minimal default so the attachments still get delivered.\n pendingClientEventId.current ??= generateClientEventId();\n const effectiveControl = effectiveControlRef.current;\n const input = composeSendInput(sendText, pendingClientEventId.current, extras, {\n ...pickedPolicy(policyPickedRef, policyRef),\n ...(effectiveControl?.controlEtag ? { controlEtag: effectiveControl.controlEtag } : {}),\n ...(durableDrafts && draftRef.current\n ? { expectedDraftRevision: draftRef.current.revision }\n : {}),\n resources: mergeResources(restoredResources, extras.resources ?? []),\n annotations: cloneAnnotations(annotationsAtSend),\n });\n const operation: PendingComposerOperation = {\n delivery,\n input,\n draftAtSend,\n resourcesAtSend: [...restoredResources],\n annotationsAtSend: cloneAnnotations(annotationsAtSend),\n newerShadow: {\n text: draftAtSend,\n resources: mergeResources(restoredResources, extras.resources ?? []),\n annotations: cloneAnnotations(annotationsAtSend),\n policy: pickedPolicy(policyPickedRef, policyRef),\n },\n clearDraftOnAccept: explicit === undefined,\n canRetry: true,\n };\n pendingOperationRef.current = operation;\n rememberPendingComposerOperation(operationKey, operation);\n if (delivery === \"steer\") {\n setSteering({\n phase: \"submitting\",\n text: sendText,\n clientEventId: input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n });\n }\n try {\n const result = await deliver(operation);\n if (delivery === \"steer\" && result) {\n keepSteering = true;\n setSteering({\n phase: \"accepted\",\n text: sendText,\n clientEventId: input.clientEventId ?? null,\n triggerEventId: result.accepted.id,\n turnId: result.turn.id,\n stoppingPreviousAttempt:\n result.replay !== true && (result.interruptionCount ?? 0) > 0,\n });\n }\n } catch (cause) {\n notifyComposerObserver(\n onDeliveryErrorRef.current,\n asError(cause),\n operation.input,\n operation.delivery,\n );\n if (!isOutcomeUnknownError(cause)) {\n clearPending();\n } else if (delivery === \"steer\") {\n keepSteering = true;\n setSteering({\n phase: \"failed\",\n text: operation.input.text,\n clientEventId: operation.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n error: t(\"hooks.useComposer.notConfirmedRetry\"),\n outcomeUnknown: true,\n });\n }\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(markActionFailure(asError(cause)));\n }\n return false;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n settleAccepted(operation);\n return true;\n } finally {\n releaseDraftSlot?.();\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setSending(false);\n if (delivery === \"steer\" && !keepSteering) setSteering(null);\n }\n }\n },\n [\n acquireDraftSlot,\n client,\n currentDraftPayload,\n durableDrafts,\n onSent,\n restoredResources,\n annotations,\n adoptDraftBase,\n saveDraftInSlot,\n sending,\n sessionId,\n targetKey,\n value,\n workspaceId,\n loadDraft,\n t,\n ],\n );\n\n const sendToQueue = useCallback(\n async (explicit?: string): Promise<boolean> => {\n if (pendingOperationRef.current?.delivery === \"send\") {\n return await dispatch(\"send\", explicit);\n }\n const rawText = explicit ?? valueRef.current;\n const annotationsAtSend = cloneAnnotations(annotationsRef.current);\n const currentPolicy = policyRef.current;\n const hasText = rawText.trim().length > 0;\n const hasAnnotations = annotationsAtSend.length > 0;\n const annotationsComplete = annotationsAtSend.every(\n (annotation) => annotation.note.trim().length > 0,\n );\n const extras = resolveSendExtras(sendExtrasRef.current);\n const resources = mergeResources(restoredResourcesRef.current, extras.resources ?? []);\n if (\n !sessionId ||\n !currentPolicy ||\n sending ||\n !annotationsComplete ||\n (!hasText && !hasAnnotations && resources.length === 0) ||\n sendBlockedRef.current?.() === true ||\n targetKeyRef.current !== targetKey\n ) {\n return false;\n }\n const sendText = hasText ? rawText : hasAnnotations ? \"\" : FILE_ONLY_MESSAGE_TEXT(t);\n const clientEventId = generateClientEventId();\n const effectiveControl = effectiveControlRef.current;\n const input = composeSendInput(sendText, clientEventId, extras, {\n ...pickedPolicy(policyPickedRef, policyRef),\n ...(effectiveControl?.controlEtag ? { controlEtag: effectiveControl.controlEtag } : {}),\n resources,\n annotations: annotationsAtSend,\n });\n const currentPayload = currentDraftPayload();\n const hasEarlierUnsettledSend = optimisticSendsRef.current.some(\n (candidate) => candidate.state !== \"failed\" || candidate.outcomeUnknown === true,\n );\n const operation: OptimisticSendOperation = {\n clientEventId,\n delivery: \"send\",\n destination:\n effectiveControl?.state === \"paused\" || hasEarlierUnsettledSend\n ? \"queue\"\n : (sendDestinationRef.current?.() ?? \"chat\"),\n text: sendText,\n annotations: annotationsAtSend,\n resources,\n occurredAt: new Date().toISOString(),\n state: \"sending\",\n input,\n draftPayload: currentPayload ? { ...currentPayload, text: sendText } : null,\n newerShadow: {\n text: explicit === undefined ? \"\" : valueRef.current,\n resources: explicit === undefined ? [] : [...restoredResourcesRef.current],\n annotations: explicit === undefined ? [] : cloneAnnotations(annotationsRef.current),\n policy: pickedPolicy(policyPickedRef, policyRef),\n },\n canRetry: true,\n };\n // The local submission acknowledgement owns the composer before any\n // host callback or queued processor can observe it. Hosts commonly use\n // onSubmitted to remove attachment/repository state, and those updates\n // may synchronously re-render the controlled composer. Clear the refs\n // first so that handoff cannot re-project the submitted text as the next\n // draft. The immutable operation above still owns the exact retry input.\n if (explicit === undefined) {\n valueRef.current = \"\";\n annotationsRef.current = [];\n restoredResourcesRef.current = [];\n localEditRevision.current += 1;\n setValue(\"\");\n setAnnotations([]);\n setAnnotationReviewTargetId(null);\n setRestoredResources([]);\n }\n replaceOptimisticSends((current) => [...current, operation]);\n queueMicrotask(processOptimisticSends);\n setError(null);\n onSubmitted?.(sendText, input);\n return true;\n },\n [\n currentDraftPayload,\n dispatch,\n onSubmitted,\n processOptimisticSends,\n replaceOptimisticSends,\n sending,\n sessionId,\n targetKey,\n t,\n ],\n );\n const steer = useCallback(async (text?: string) => await dispatch(\"steer\", text), [dispatch]);\n // Send takes its busy path while a turn runs or prompts wait, except in a\n // paused workstream, where it keeps ordinary queueing so a Send never\n // resumes it implicitly.\n const takesBusyPath = useCallback(\n (): boolean =>\n effectiveControlRef.current?.state !== \"paused\" && sendDestinationRef.current?.() === \"queue\",\n [],\n );\n const send = useCallback(\n async (explicit?: string): Promise<boolean> => {\n // A retained uncertain Send keeps its own delivery; only fresh input\n // follows the busy-send preference.\n if (\n busySendRef.current === \"steer\" &&\n pendingOperationRef.current?.delivery !== \"send\" &&\n takesBusyPath()\n ) {\n return await steer(explicit);\n }\n return await sendToQueue(explicit);\n },\n [sendToQueue, steer, takesBusyPath],\n );\n const sendAlternate = useCallback(\n async (explicit?: string): Promise<boolean> =>\n busySendRef.current === \"steer\" ? await sendToQueue(explicit) : await steer(explicit),\n [sendToQueue, steer],\n );\n const alternateSend: ComposerBusySend | null =\n !singleSend && takesBusyPath() ? (busySend === \"steer\" ? \"queue\" : \"steer\") : null;\n\n const retryOptimisticMessage = useCallback(\n (clientEventId: string): void => {\n if (sendBlockedRef.current?.() === true) return;\n const currentSteering = steeringRef.current;\n if (currentSteering?.phase === \"failed\" && currentSteering.clientEventId === clientEventId) {\n void dispatch(\"steer\");\n return;\n }\n replaceOptimisticSends((current) =>\n current.map((operation) => {\n if (operation.clientEventId !== clientEventId || operation.state !== \"failed\") {\n return operation;\n }\n if (operation.outcomeUnknown) {\n return { ...operation, state: \"sending\", error: undefined };\n }\n if (operation.retryable === false) return operation;\n const nextClientEventId = generateClientEventId();\n const currentPersonalResourceAttachment = resolveSendExtras(\n sendExtrasRef.current,\n ).personalResourceAttachment;\n const retryInput = composeSendInput(\n operation.text,\n nextClientEventId,\n {\n ...operation.input,\n ...(currentPersonalResourceAttachment\n ? { personalResourceAttachment: currentPersonalResourceAttachment }\n : {}),\n },\n {\n ...(effectiveControlRef.current?.controlEtag\n ? { controlEtag: effectiveControlRef.current.controlEtag }\n : {}),\n resources: operation.resources,\n annotations: operation.annotations,\n },\n );\n return {\n ...operation,\n clientEventId: nextClientEventId,\n input: retryInput,\n draftPayload: operation.draftPayload,\n occurredAt: new Date().toISOString(),\n state: \"sending\",\n error: undefined,\n retryable: undefined,\n outcomeUnknown: false,\n canRetry: true,\n };\n }),\n );\n queueMicrotask(processOptimisticSends);\n },\n [dispatch, processOptimisticSends, replaceOptimisticSends],\n );\n\n const removeOptimisticMessage = useCallback(\n (clientEventId: string): void => {\n if (steeringRef.current?.clientEventId === clientEventId) {\n pendingOperationRef.current = null;\n pendingClientEventId.current = null;\n forgetPendingComposerOperation(pendingComposerOperationKey(workspaceId, sessionId));\n setSteering(null);\n setError(null);\n return;\n }\n replaceOptimisticSends((current) =>\n current.filter((operation) => operation.clientEventId !== clientEventId),\n );\n },\n [replaceOptimisticSends, sessionId, workspaceId],\n );\n\n // A send is possible with non-empty text OR with ≥1 attached resource (a\n // file-only message). Resources ride in `sendExtras`, so we resolve them here\n // — keeping useComposer attachment-agnostic while still lighting up the send\n // affordance the moment a file is ready. Attachment hosts bind `sendBlocked`\n // to unresolved uploads so direct send()/steer() calls fail closed too.\n const hasReadyResources =\n restoredResources.length > 0 ||\n (resolveSendExtras(sendExtrasRef.current).resources?.length ?? 0) > 0;\n const hasPendingOperation = pendingOperationRef.current !== null;\n const annotationsComplete = annotations.every((annotation) => annotation.note.trim().length > 0);\n\n const pause = useCallback(\n async (reason?: string): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || pausing || targetKeyRef.current !== ownedTargetKey) {\n return;\n }\n setPausing(true);\n setError(null);\n try {\n const clientEventId = generateClientEventId();\n const effectiveControl = effectiveControlRef.current;\n const result = await replayOutcomeUnknown(() =>\n client.pauseSession(workspaceId, sessionId, {\n clientEventId,\n ...(reason !== undefined ? { reason } : {}),\n ...(effectiveControl?.controlEtag\n ? { expectedControlEtag: effectiveControl.controlEtag }\n : {}),\n }),\n );\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setAcceptedControl(result.effectiveControl);\n }\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(markActionFailure(normalizeError(cause)));\n }\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setPausing(false);\n }\n }\n },\n [client, workspaceId, sessionId, pausing, targetKey],\n );\n\n const resume = useCallback(\n async (reason?: string): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || resuming || targetKeyRef.current !== ownedTargetKey) return;\n setResuming(true);\n setError(null);\n try {\n const clientEventId = generateClientEventId();\n const effectiveControl = effectiveControlRef.current;\n const result = await replayOutcomeUnknown(() =>\n client.resumeSession(workspaceId, sessionId, {\n clientEventId,\n ...(reason !== undefined ? { reason } : {}),\n ...(effectiveControl?.controlEtag\n ? { expectedControlEtag: effectiveControl.controlEtag }\n : {}),\n }),\n );\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setAcceptedControl(result.effectiveControl);\n }\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(markActionFailure(normalizeError(cause)));\n }\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setResuming(false);\n }\n }\n },\n [client, workspaceId, sessionId, resuming, targetKey],\n );\n\n const resumeScope = useCallback(\n async (option: EffectiveControlResumeOption): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || resuming || targetKeyRef.current !== ownedTargetKey) return;\n setResuming(true);\n setError(null);\n try {\n if (option.scope === \"workspace\") {\n const workspaceBlocker = effectiveControlRef.current?.blockers.find(\n (blocker) => blocker.kind === \"workspace\",\n );\n if (!client.setWorkspaceInferenceState) {\n throw new ComposerWorkspaceControlUnavailableError();\n }\n const clientEventId = generateClientEventId();\n await replayOutcomeUnknown(() =>\n client.setWorkspaceInferenceState!(workspaceId, {\n action: \"resume\",\n clientEventId,\n ...(workspaceBlocker ? { expectedRevision: workspaceBlocker.revision } : {}),\n }),\n );\n } else if (option.scope === \"session\" && option.targetId) {\n const target = await client.getQueue(workspaceId, option.targetId);\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n const clientEventId = generateClientEventId();\n await replayOutcomeUnknown(() =>\n client.resumeSession(workspaceId, option.targetId!, {\n clientEventId,\n expectedControlEtag: target.effectiveControl.controlEtag,\n }),\n );\n } else {\n const clientEventId = generateClientEventId();\n const effectiveControl = effectiveControlRef.current;\n const result = await replayOutcomeUnknown(() =>\n client.resumeSession(workspaceId, sessionId, {\n clientEventId,\n ...(effectiveControl?.controlEtag\n ? { expectedControlEtag: effectiveControl.controlEtag }\n : {}),\n }),\n );\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setAcceptedControl(result.effectiveControl);\n }\n }\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(markActionFailure(asError(cause)));\n }\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setResuming(false);\n }\n }\n },\n [client, resuming, sessionId, targetKey, workspaceId],\n );\n\n const updateValue = useCallback(\n (next: string) => {\n if (targetKeyRef.current !== targetKey) return;\n localEditRevision.current += 1;\n valueRef.current = next;\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: next,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n policy: pickedPolicy(policyPickedRef, policyRef),\n },\n );\n setOptimisticDraftShadow({\n text: next,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n policy: pickedPolicy(policyPickedRef, policyRef),\n });\n setValue(next);\n },\n [pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const updateAnnotations = useCallback(\n (next: DraftTimelineAnnotation[], reviewTargetId: string | null = null) => {\n if (targetKeyRef.current !== targetKey) return;\n localEditRevision.current += 1;\n annotationsRef.current = next;\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next,\n policy: pickedPolicy(policyPickedRef, policyRef),\n },\n );\n setOptimisticDraftShadow({\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next,\n policy: pickedPolicy(policyPickedRef, policyRef),\n });\n setAnnotations(next);\n setAnnotationReviewTargetId(reviewTargetId);\n },\n [pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const addAnnotation = useCallback(\n (annotation: DraftTimelineAnnotation) => {\n const next = [...annotationsRef.current, annotation];\n updateAnnotations(next, annotation.id);\n },\n [updateAnnotations],\n );\n\n const updateAnnotation = useCallback(\n (id: string, note: string) => {\n updateAnnotations(\n annotationsRef.current.map((annotation) =>\n annotation.id === id ? { ...annotation, note } : annotation,\n ),\n );\n },\n [updateAnnotations],\n );\n\n const removeAnnotation = useCallback(\n (id: string) => {\n updateAnnotations(annotationsRef.current.filter((annotation) => annotation.id !== id));\n },\n [updateAnnotations],\n );\n\n const clearAnnotationReviewTarget = useCallback(() => {\n setAnnotationReviewTargetId(null);\n }, []);\n\n const requestAnnotationReview = useCallback((id?: string) => {\n const current = annotationsRef.current;\n if (current.length === 0) {\n setAnnotationReviewTargetId(null);\n return;\n }\n if (id && current.some((annotation) => annotation.id === id)) {\n setAnnotationReviewTargetId(id);\n return;\n }\n const incomplete = current.find((annotation) => annotation.note.trim().length === 0);\n setAnnotationReviewTargetId(incomplete?.id ?? current[0]!.id);\n }, []);\n\n const updatePolicy = useCallback(\n (next: ComposerPolicy): void => {\n if (targetKeyRef.current !== targetKey) return;\n localEditRevision.current += 1;\n policyRef.current = next;\n policyPickedRef.current = true;\n setPolicyPicked(policyPickedRef.current);\n const shadow = {\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n policy: next,\n };\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n shadow,\n );\n setOptimisticDraftShadow(shadow);\n setPolicy(next);\n },\n [pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const updateModel = useCallback(\n (model: string): void => {\n const current = policyRef.current;\n if (current) updatePolicy({ ...current, model });\n },\n [updatePolicy],\n );\n\n const updateReasoningEffort = useCallback(\n (reasoningEffort: ReasoningEffort): void => {\n const current = policyRef.current;\n if (current) updatePolicy({ ...current, reasoningEffort });\n },\n [updatePolicy],\n );\n\n const updateLatencyMode = useCallback(\n (latencyMode: LatencyMode): void => {\n const current = policyRef.current;\n if (current) updatePolicy({ ...current, latencyMode });\n },\n [updatePolicy],\n );\n\n const removeRestoredResource = useCallback(\n (index: number) => {\n if (targetKeyRef.current !== targetKey) return;\n localEditRevision.current += 1;\n const next = restoredResourcesRef.current.filter((_, candidate) => candidate !== index);\n restoredResourcesRef.current = next;\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: valueRef.current,\n resources: mergeResources(next, resolveSendExtras(sendExtrasRef.current).resources ?? []),\n annotations: annotationsRef.current,\n policy: pickedPolicy(policyPickedRef, policyRef),\n },\n );\n setOptimisticDraftShadow({\n text: valueRef.current,\n resources: mergeResources(next, resolveSendExtras(sendExtrasRef.current).resources ?? []),\n annotations: annotationsRef.current,\n policy: pickedPolicy(policyPickedRef, policyRef),\n });\n setRestoredResources(next);\n },\n [pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const hasDraftContent = useCallback((): boolean => {\n const current = draftRef.current;\n const extras = resolveSendExtras(sendExtrasRef.current);\n return (\n valueRef.current.length > 0 ||\n annotationsRef.current.length > 0 ||\n restoredResourcesRef.current.length > 0 ||\n (extras.resources?.length ?? 0) > 0 ||\n (current?.sourceTurnId !== null && current?.sourceTurnId !== undefined)\n );\n }, []);\n\n const restoreOptimisticMessage = useCallback(\n (clientEventId: string): void => {\n if (\n targetKeyRef.current !== targetKey ||\n draftLoading ||\n pendingOperationRef.current ||\n hasDraftContent()\n )\n return;\n const operation = optimisticSendsRef.current.find(\n (candidate) => candidate.clientEventId === clientEventId,\n );\n if (!operation || operation.state !== \"failed\" || operation.outcomeUnknown) return;\n // Restoring is a new draft edit, not a retry. Keep the user's current model\n // selection and never copy credentials from the old rejected request.\n localEditRevision.current += 1;\n valueRef.current = operation.text;\n restoredResourcesRef.current = [...operation.resources];\n annotationsRef.current = cloneAnnotations(operation.annotations);\n setValue(operation.text);\n setRestoredResources(restoredResourcesRef.current);\n setAnnotations(annotationsRef.current);\n setError(null);\n setOptimisticDraftShadow({\n text: operation.text,\n resources: restoredResourcesRef.current,\n annotations: annotationsRef.current,\n policy: pickedPolicy(policyPickedRef, policyRef),\n });\n replaceOptimisticSends((current) =>\n current.filter((candidate) => candidate.clientEventId !== clientEventId),\n );\n },\n [draftLoading, hasDraftContent, replaceOptimisticSends, setOptimisticDraftShadow, targetKey],\n );\n\n const resolveDraftConflict = useCallback(\n async (choice: \"keep_mine\" | \"use_remote\"): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || !durableDrafts || targetKeyRef.current !== ownedTargetKey) return;\n const remote = await client.getComposerDraft(workspaceId, sessionId);\n if (targetKeyRef.current !== ownedTargetKey || targetGeneration.current !== ownedGeneration) {\n return;\n }\n if (choice === \"use_remote\") {\n applyDraft(remote);\n setError(null);\n return;\n }\n draftRef.current = remote;\n setDraft(remote);\n setDraftConflict(null);\n setError(null);\n const payload = currentDraftPayload();\n if (payload) {\n await persistPayload(\n { ...payload, expectedRevision: remote.revision },\n undefined,\n \"explicit\",\n );\n }\n },\n [\n applyDraft,\n client,\n currentDraftPayload,\n durableDrafts,\n persistPayload,\n sessionId,\n targetKey,\n workspaceId,\n ],\n );\n\n const identityMatches = stateTargetKey === targetKey;\n const visibleSteering = identityMatches ? steering : null;\n const visibleOptimisticMessages: ComposerOptimisticMessage[] = identityMatches\n ? [\n ...optimisticSends.map(\n ({ input: _input, draftPayload: _payload, canRetry: _retry, ...item }) => item,\n ),\n ...(visibleSteering?.clientEventId\n ? [\n {\n clientEventId: visibleSteering.clientEventId,\n delivery: \"steer\" as const,\n destination: \"chat\" as const,\n text: visibleSteering.text,\n annotations:\n pendingOperationRef.current?.delivery === \"steer\"\n ? pendingOperationRef.current.annotationsAtSend\n : [],\n resources:\n pendingOperationRef.current?.delivery === \"steer\"\n ? pendingOperationRef.current.resourcesAtSend\n : [],\n occurredAt: steeringOccurredAtRef.current,\n state:\n visibleSteering.phase === \"submitting\"\n ? (\"sending\" as const)\n : visibleSteering.phase === \"failed\"\n ? (\"failed\" as const)\n : (\"queued\" as const),\n turnId: visibleSteering.turnId,\n triggerEventId: visibleSteering.triggerEventId,\n ...(visibleSteering.error ? { error: visibleSteering.error } : {}),\n ...(visibleSteering.outcomeUnknown !== undefined\n ? { outcomeUnknown: visibleSteering.outcomeUnknown }\n : {}),\n },\n ]\n : []),\n ]\n : [];\n const reloadDraft = useCallback(async () => await loadDraft(true), [loadDraft]);\n const clearError = useCallback(() => {\n if (targetKeyRef.current !== targetKey) return;\n setError(null);\n setDraftReadError(null);\n setDraftConflict(null);\n }, [targetKey]);\n // `valueRef` is the synchronous composer authority. React state exists to\n // schedule renders, but a concurrent autosave settlement can render the\n // previous state lane after a newer input event has already updated the ref.\n // Projecting that stale state into a controlled textarea rewrites the old\n // draft for one commit, which moves the caret and can briefly resurrect a\n // submitted message. Never let an incidental render outrank the latest\n // local lifecycle decision.\n const visibleValue = identityMatches ? valueRef.current : \"\";\n\n return {\n value: visibleValue,\n setValue: updateValue,\n annotations: identityMatches ? annotations : [],\n addAnnotation,\n updateAnnotation,\n removeAnnotation,\n annotationReviewTargetId: identityMatches ? annotationReviewTargetId : null,\n clearAnnotationReviewTarget,\n requestAnnotationReview,\n hasDraftContent,\n send,\n sendToQueue,\n busySend,\n singleSend,\n alternateSend: identityMatches ? alternateSend : null,\n working: identityMatches && takesBusyPath(),\n sendAlternate: singleSend ? undefined : sendAlternate,\n optimisticMessages: visibleOptimisticMessages,\n retryOptimisticMessage,\n restoreOptimisticMessage:\n !draftLoading && !pendingOperationRef.current && !hasDraftContent()\n ? restoreOptimisticMessage\n : undefined,\n removeOptimisticMessage,\n steer,\n steering: visibleSteering,\n // Receipt-backed: an accepted Steer stops the previous attempt, and an\n // accepted Pause whose receipt still reports physical settlement stops the\n // current one. Once the authoritative control catches up, the queue\n // snapshot owns this projection.\n stoppingAttempt: identityMatches\n ? visibleSteering?.phase === \"accepted\" && visibleSteering.stoppingPreviousAttempt === true\n ? \"previous\"\n : pendingAcceptedControl?.state === \"paused\" && pendingAcceptedControl.settlement !== null\n ? \"current\"\n : null\n : null,\n sending: identityMatches ? sending : false,\n canSend:\n identityMatches &&\n Boolean(sessionId) &&\n !sending &&\n !draftLoading &&\n policy !== null &&\n sendBlockedRef.current?.() !== true &&\n annotationsComplete &&\n (hasPendingOperation ||\n visibleValue.trim().length > 0 ||\n hasReadyResources ||\n annotations.length > 0),\n // The saved draft is still loading, or its first read is being retried:\n // an early Send waits for it (the composer bounds how long).\n preparing: identityMatches\n ? Boolean(sessionId) && (draftLoading || draftHydrationRetrying)\n : Boolean(sessionId) && durableDrafts,\n pause,\n pausing: identityMatches ? pausing : false,\n resume,\n resumeScope,\n resuming: identityMatches ? resuming : false,\n effectiveControl: identityMatches ? effectiveControlRef.current : null,\n draft: identityMatches ? draft : null,\n draftRevision: identityMatches ? (draft?.revision ?? 0) : 0,\n draftLoading: identityMatches ? draftLoading : Boolean(sessionId) && durableDrafts,\n draftSaving: identityMatches ? draftSaving : false,\n draftConflict: identityMatches ? draftConflict : null,\n flushDraft,\n policy: identityMatches ? policy : null,\n sendPolicy: identityMatches && policyPicked ? policy : null,\n setModel: updateModel,\n setReasoningEffort: updateReasoningEffort,\n setLatencyMode: updateLatencyMode,\n draftPersistence: durableDrafts ? \"durable\" : \"disabled\",\n applyDraft,\n reloadDraft,\n resolveDraftConflict,\n restoredResources: identityMatches ? restoredResources : [],\n removeRestoredResource,\n error: identityMatches ? (error ?? draftReadError) : null,\n clearError,\n canBuyCredits: options.canBuyCredits ?? true,\n reconnecting: identityMatches ? serviceWaiting : false,\n };\n}\n\n/** Events that can atomically replace or clear this subject's durable draft. */\nexport function isComposerDraftEvent(event: Pick<SessionEvent, \"type\">): boolean {\n return (\n event.type === \"user.message\" ||\n event.type === \"session.queue.changed\" ||\n // A following draft shows the chat's settings, which this event changes.\n event.type === \"session.model_settings.updated\"\n );\n}\n\n/**\n * Default text for a resource-only message (attachments present, no typed\n * draft). Kept non-empty so the wire contract (`text: z.string().min(1)`) and\n * the worker's non-whitespace guard accept it. The export name is retained for\n * compatibility now that repositories can ride beside files in `resources`.\n */\nexport const FILE_ONLY_MESSAGE_TEXT = (t: OpenGeniText) =>\n t(\"hooks.useComposer.seeAttachedContext\");\n\n/** Resolve possibly-deferred extras to a concrete bag (function evaluated now). */\nexport function resolveSendExtras(\n extras: ComposerSendExtras | (() => ComposerSendExtras) | undefined,\n): ComposerSendExtras {\n return (typeof extras === \"function\" ? extras() : extras) ?? {};\n}\n\n/**\n * Merge the draft text + idempotency key with caller-provided extras. The\n * text and clientEventId always win over extras. Exported for tests.\n */\nexport function composeSendInput(\n text: string,\n clientEventId: string,\n extras: ComposerSendExtras | (() => ComposerSendExtras) | undefined,\n bound: Partial<SendMessageInput> = {},\n): SendMessageInput {\n return { ...resolveSendExtras(extras), ...bound, text, clientEventId };\n}\n\n/** Submit on plain Enter; Shift+Enter inserts a newline. Exported for tests. */\nexport function shouldSubmitOnKey(event: {\n key: string;\n shiftKey: boolean;\n metaKey?: boolean;\n ctrlKey?: boolean;\n nativeEvent?: { isComposing?: boolean };\n}): boolean {\n if (event.key !== \"Enter\" || event.shiftKey) {\n return false;\n }\n return event.nativeEvent?.isComposing !== true;\n}\n\n/** Cmd/Ctrl+Enter steers; ordinary Enter appends to the queue. */\nexport function shouldSteerOnKey(event: { metaKey?: boolean; ctrlKey?: boolean }): boolean {\n return event.metaKey === true || event.ctrlKey === true;\n}\n\nfunction generateClientEventId(): string {\n return globalThis.crypto.randomUUID();\n}\n\nfunction isOutcomeUnknownError(cause: unknown): boolean {\n return (\n typeof cause === \"object\" &&\n cause !== null &&\n (cause as { outcomeUnknown?: unknown }).outcomeUnknown === true\n );\n}\n\nasync function replayOutcomeUnknown<T>(command: () => Promise<T>): Promise<T> {\n try {\n return await command();\n } catch (cause) {\n if (!isOutcomeUnknownError(cause)) throw cause;\n return await command();\n }\n}\n\nfunction asError(cause: unknown): Error {\n return normalizeError(cause);\n}\n\nfunction promptRoutingFromAcceptedEvent(\n event: SessionEvent | null,\n): \"accepted_for_execution\" | \"queued_for_execution\" | \"accepted_for_steering\" | null {\n if (\n typeof event?.payload !== \"object\" ||\n event.payload === null ||\n Array.isArray(event.payload)\n ) {\n return null;\n }\n const routing = (event.payload as Record<string, unknown>).routing;\n return routing === \"accepted_for_execution\" ||\n routing === \"queued_for_execution\" ||\n routing === \"accepted_for_steering\"\n ? routing\n : null;\n}\n\nfunction isDraftConflictError(error: Error): boolean {\n const apiError = error as Partial<OpenGeniApiError>;\n return (\n apiError.status === 409 && apiError.outcomeUnknown !== true && apiError.code === \"DRAFT_CHANGED\"\n );\n}\n\nfunction draftPayload(draft: ComposerDraft): SaveComposerDraftRequest {\n return {\n expectedRevision: draft.revision,\n text: draft.text,\n resources: draft.resources,\n annotations: draft.annotations ?? [],\n // A draft that follows the chat's settings is saved without them.\n ...(draft.policyFollowsSession\n ? {}\n : {\n model: draft.model,\n reasoningEffort: draft.reasoningEffort,\n latencyMode: draft.latencyMode,\n }),\n };\n}\n\nfunction policyFromDraft(draft: ComposerDraft): ComposerPolicy {\n return {\n model: draft.model,\n reasoningEffort: draft.reasoningEffort,\n latencyMode: draft.latencyMode,\n };\n}\n\n/** The person's pick to send or save, or undefined while following the chat. */\nfunction pickedPolicy(\n picked: { current: boolean },\n policy: { current: ComposerPolicy | null },\n): ComposerPolicy | undefined {\n return picked.current ? (policy.current ?? undefined) : undefined;\n}\n\nfunction samePolicy(a: ComposerPolicy | null, b: ComposerPolicy): boolean {\n return (\n a !== null &&\n a.model === b.model &&\n a.reasoningEffort === b.reasoningEffort &&\n a.latencyMode === b.latencyMode\n );\n}\n\nfunction composerDraftPayload(\n base: ComposerDraft,\n text: string,\n restoredResources: ResourceRef[],\n annotations: DraftTimelineAnnotation[],\n /** Undefined while the draft follows the chat's settings. */\n policy: ComposerPolicy | undefined,\n additionalResources: ResourceRef[],\n): SaveComposerDraftRequest {\n return {\n expectedRevision: base.revision,\n text,\n resources: mergeResources(restoredResources, additionalResources),\n annotations,\n ...(policy\n ? {\n model: policy.model,\n reasoningEffort: policy.reasoningEffort,\n latencyMode: policy.latencyMode,\n }\n : {}),\n };\n}\n\nfunction draftSignature(payload: SaveComposerDraftRequest): string {\n const { expectedRevision: _revision, ...content } = payload;\n return JSON.stringify(content);\n}\n\n/** Re-reads a save makes after \"draft changed\" before giving up on it. */\nconst DRAFT_CONFLICT_REREADS = 3;\n\n/**\n * The draft content this page recently wrote, per chat. It outlives a\n * composer remount, so a save that lands after the composer re-read the\n * draft is still recognised as this page's own write.\n */\nconst recentDraftWrites = new Map<string, string[]>();\n\nfunction rememberDraftWrite(chatKey: string, content: string): void {\n const writes = (recentDraftWrites.get(chatKey) ?? []).filter((entry) => entry !== content);\n writes.push(content);\n recentDraftWrites.set(chatKey, writes.slice(-8));\n}\n\n/** Draft content as the server stores it, for comparing a save with a read. */\nfunction draftContentKey(payload: SaveComposerDraftRequest): string {\n const { expectedRevision: _revision, resources, ...content } = payload;\n return JSON.stringify({ ...content, resources: resources.map(resourceIdentity) });\n}\n\nfunction resourceIdentity(resource: ResourceRef): string {\n // Reconnect reconciliation can restore the canonical server form while\n // the still-mounted upload card supplies the same ready file without its\n // default mount. Treat those two wire shapes as one selected attachment.\n return resource.kind === \"file\"\n ? `file:${resource.fileId}\\u0000${resource.mountPath ?? `${DEFAULT_FILE_RESOURCE_MOUNT_ROOT}/${resource.fileId}`}`\n : JSON.stringify(resource);\n}\n\nfunction mergeResources(base: ResourceRef[], additions: ResourceRef[]): ResourceRef[] {\n const seen = new Set<string>();\n return [...base, ...additions].filter((resource) => {\n // Preserving the first representation keeps custom mounts and ordering\n // intact while preventing the draft and command paths from seeing\n // different duplicate counts after server normalization.\n const key = resourceIdentity(resource);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n","/** Notifications cannot change the result of an already accepted operation. */\nexport function notifyObserver<Args extends unknown[]>(\n observer: ((...args: Args) => unknown) | undefined,\n ...args: Args\n): void {\n const report = (cause: unknown) => globalThis.reportError?.(cause);\n try {\n const result = observer?.(...args);\n if (result && typeof (result as PromiseLike<unknown>).then === \"function\") {\n void Promise.resolve(result).catch(report);\n }\n } catch (cause) {\n report(cause);\n }\n}\n","import type { SessionTurn } from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport type { ComposerOptimisticMessage, ComposerState } from \"./use-composer\";\nimport type { QueueMutationKind, UseTurnQueueResult } from \"./use-turn-queue\";\n\n/** What one Up-arrow recall did. `unavailable` leaves the composer untouched. */\nexport type QueuedPromptRecallOutcome = \"recalled\" | \"already_sent\" | \"unavailable\";\n\n/**\n * How long Up pressed right after a send waits for that prompt to reach the\n * queue. The send is normally settled within a second or two; past this the\n * press is dropped rather than left pending behind a stalled send.\n */\nexport const QUEUED_RECALL_SETTLE_TIMEOUT_MS = 10_000;\n\n/**\n * Up-arrow recall of the person's latest waiting prompt. `available` is a\n * render-time hint that Up should be taken for recall: a prompt is waiting, or\n * one just sent is still on its way into the queue. `recall` re-checks\n * everything against live state, waiting for such a send to settle first.\n */\nexport type ComposerQueuedRecall = {\n available: boolean;\n /** The waiting prompt Up would pull back now, for a subtle hint on its row. */\n turnId: string | null;\n recall: () => Promise<QueuedPromptRecallOutcome>;\n};\n\n/**\n * Plain Up in an empty composer (caret necessarily at the start), outside IME\n * composition and with no command/mention popup open. Any typed text, quote or\n * attachment keeps normal Up behaviour so recall never replaces a draft.\n */\nexport function shouldRecallQueuedOnKey(\n event: {\n key: string;\n shiftKey?: boolean;\n altKey?: boolean;\n metaKey?: boolean;\n ctrlKey?: boolean;\n keyCode?: number;\n nativeEvent?: { isComposing?: boolean; keyCode?: number };\n },\n field: {\n value: string;\n selectionStart: number | null;\n selectionEnd: number | null;\n /** Attachments, quotes or restored files already in the draft. */\n hasOtherContent: boolean;\n /** A command palette, mention list or other popup owns the arrow keys. */\n popupOpen: boolean;\n },\n): boolean {\n if (event.key !== \"ArrowUp\") return false;\n if (event.shiftKey || event.altKey || event.metaKey || event.ctrlKey) return false;\n // 229 is the IME \"process\" key some engines report instead of isComposing.\n if (event.nativeEvent?.isComposing === true) return false;\n if (event.keyCode === 229 || event.nativeEvent?.keyCode === 229) return false;\n if (field.popupOpen || field.hasOtherContent) return false;\n if (field.value.length > 0) return false;\n return (field.selectionStart ?? 0) === 0 && (field.selectionEnd ?? 0) === 0;\n}\n\n/**\n * The newest waiting human prompt this person may pull back: the last one in\n * queue order (the one that would run last), queued, not mid-mutation, not a\n * once personal-resource attachment (the server refuses those), and initiated\n * by this viewer when one is given.\n */\nexport function latestRecallableQueuedTurn(\n turns: readonly SessionTurn[],\n mutationFor: (turnId: string) => QueueMutationKind | null,\n subjectId?: string | null,\n): SessionTurn | null {\n for (let index = turns.length - 1; index >= 0; index -= 1) {\n const turn = turns[index]!;\n if (turn.status !== \"queued\") continue;\n if (turn.source !== \"user\" && turn.source !== \"api\") continue;\n if (mutationFor(turn.id) !== null) continue;\n if (turn.personalResources?.mode === \"once\") continue;\n if (subjectId && turn.initiator?.subjectId !== subjectId) continue;\n return turn;\n }\n return null;\n}\n\n/**\n * A just-sent prompt still on its way into the queue. Until it shows up there,\n * \"the latest waiting prompt\" is unknown, so recall waits rather than pulling\n * back an older one.\n */\nexport function hasQueuedSendInFlight(\n messages: readonly ComposerOptimisticMessage[] | undefined,\n queuedTurnIds: ReadonlySet<string>,\n queueVersion: number | null | undefined,\n): boolean {\n // Same projection as the queue panel's optimistic rows; failed sends stay in\n // the composer's retry UI and never block recall.\n return (messages ?? []).some((message) =>\n isQueuedSendInFlight(message, queuedTurnIds, queueVersion),\n );\n}\n\nfunction isQueuedSendInFlight(\n message: ComposerOptimisticMessage,\n queuedTurnIds: ReadonlySet<string>,\n queueVersion: number | null | undefined,\n): boolean {\n return (\n message.delivery === \"send\" &&\n message.destination === \"queue\" &&\n message.state !== \"failed\" &&\n (!message.turnId || !queuedTurnIds.has(message.turnId)) &&\n !(\n message.turnId &&\n message.appliedQueueVersion != null &&\n queueVersion != null &&\n queueVersion >= message.appliedQueueVersion\n )\n );\n}\n\n/**\n * Wire a session's queue to its composer for Up-arrow recall. The withdraw is\n * the same atomic server checkout as the queue's Edit action, so a prompt the\n * agent already took can never be duplicated or lost.\n *\n * The queue row shows a just-sent prompt as waiting before the server's queue\n * snapshot includes it. Up pressed in that window is taken at once: recall\n * follows exactly the sends in flight at the press and pulls back the newest\n * of them once it lands, so one press is always enough.\n */\nexport function useQueuedPromptRecall({\n queue,\n composer,\n subjectId,\n enabled = true,\n}: {\n queue: Pick<UseTurnQueueResult, \"queue\" | \"snapshot\" | \"mutationFor\" | \"recallTurn\">;\n composer:\n | Pick<\n ComposerState,\n | \"value\"\n | \"setValue\"\n | \"hasDraftContent\"\n | \"draftRevision\"\n | \"draftLoading\"\n | \"draftPersistence\"\n | \"applyDraft\"\n | \"sending\"\n | \"optimisticMessages\"\n >\n | undefined;\n subjectId?: string | null | undefined;\n enabled?: boolean | undefined;\n}): ComposerQueuedRecall | undefined {\n const candidate = latestRecallableQueuedTurn(queue.queue, queue.mutationFor, subjectId);\n const settling = composer ? recallSettling(composer, queue) : false;\n const queueSendInFlight = composer\n ? hasQueuedSendInFlight(\n composer.optimisticMessages,\n new Set(queue.queue.map((turn) => turn.id)),\n queue.snapshot?.version,\n )\n : false;\n const live = useRef({ queue, composer, subjectId });\n live.current = { queue, composer, subjectId };\n // Each waiting press re-checks live state after every commit, and is\n // cancelled on unmount.\n const settleWaiters = useRef(new Set<SettleWaiter>());\n useEffect(() => {\n for (const waiter of [...settleWaiters.current]) waiter.check();\n });\n useEffect(() => {\n const waiters = settleWaiters.current;\n return () => {\n for (const waiter of [...waiters]) waiter.cancel();\n };\n }, []);\n const supported =\n enabled &&\n composer !== undefined &&\n composer.draftPersistence !== \"disabled\" &&\n queue.recallTurn !== undefined;\n const recall = useCallback(async (): Promise<QueuedPromptRecallOutcome> => {\n let current = live.current;\n let target = current.composer;\n if (!target || target.draftPersistence === \"disabled\" || !current.queue.recallTurn) {\n return \"unavailable\";\n }\n if (target.draftLoading || target.hasDraftContent()) return \"unavailable\";\n let queued = current.queue.queue;\n // A just-sent prompt on its way into the queue: follow exactly the sends in\n // flight now, never an older prompt and never one sent after this press.\n const tracked = inFlightQueueSends(target, current.queue);\n if (tracked.size > 0) {\n const settled = await waitForTrackedSends(settleWaiters.current, live, tracked);\n if (!settled) return \"unavailable\";\n current = live.current;\n target = current.composer;\n if (!target || target.draftPersistence === \"disabled\") return \"unavailable\";\n if (target.draftLoading || target.hasDraftContent()) return \"unavailable\";\n const trackedTurnIds = new Set(\n [...tracked.values()].filter((turnId): turnId is string => turnId !== null),\n );\n queued = current.queue.queue.filter((turn) => trackedTurnIds.has(turn.id));\n if (\n latestRecallableQueuedTurn(queued, current.queue.mutationFor, current.subjectId) === null\n ) {\n const waitingIds = new Set(current.queue.queue.map((turn) => turn.id));\n // Placed in the queue, then started before this read: already sent.\n return [...trackedTurnIds].some((turnId) => !waitingIds.has(turnId))\n ? \"already_sent\"\n : \"unavailable\";\n }\n } else if (recallSettling(target, current.queue)) {\n // A Steer or other blocking send is running: nothing of ours is landing.\n return \"unavailable\";\n }\n const recallTurn = current.queue.recallTurn;\n if (!recallTurn) return \"unavailable\";\n const turn = latestRecallableQueuedTurn(queued, current.queue.mutationFor, current.subjectId);\n if (!turn) return \"unavailable\";\n const result = await recallTurn(turn.id, { expectedDraftRevision: target.draftRevision });\n if (result.status === \"recalled\") {\n const latest = live.current.composer ?? target;\n // Text typed while the withdraw was in flight may not have reached the\n // server draft yet; keep it after the recalled prompt instead of losing it.\n const typedMeanwhile = latest.value;\n latest.applyDraft(result.draft);\n if (typedMeanwhile.length > 0) {\n latest.setValue(\n result.draft.text.length > 0 ? `${result.draft.text}\\n${typedMeanwhile}` : typedMeanwhile,\n );\n }\n return \"recalled\";\n }\n return result.status === \"already_sent\" ? \"already_sent\" : \"unavailable\";\n }, []);\n return useMemo(\n () =>\n supported\n ? {\n // The row already shows a send on its way as queued, so Up is\n // taken now and `recall` waits for it to land.\n available: (candidate !== null && !settling) || queueSendInFlight,\n turnId: settling ? null : (candidate?.id ?? null),\n recall,\n }\n : undefined,\n [candidate, queueSendInFlight, recall, settling, supported],\n );\n}\n\nfunction recallSettling(\n composer: Pick<ComposerState, \"sending\" | \"optimisticMessages\">,\n queue: Pick<UseTurnQueueResult, \"queue\" | \"snapshot\">,\n): boolean {\n if (composer.sending) return true;\n if (!composer.optimisticMessages?.length) return false;\n return hasQueuedSendInFlight(\n composer.optimisticMessages,\n new Set(queue.queue.map((turn) => turn.id)),\n queue.snapshot?.version,\n );\n}\n\n/** Queue sends still on their way in, by client event id, with any turn id known. */\nfunction inFlightQueueSends(\n composer: Pick<ComposerState, \"optimisticMessages\">,\n queue: Pick<UseTurnQueueResult, \"queue\" | \"snapshot\">,\n): Map<string, string | null> {\n const queuedTurnIds = new Set(queue.queue.map((turn) => turn.id));\n return new Map(\n (composer.optimisticMessages ?? [])\n .filter((message) => isQueuedSendInFlight(message, queuedTurnIds, queue.snapshot?.version))\n .map((message) => [message.clientEventId, message.turnId ?? null]),\n );\n}\n\ntype SettleWaiter = { check: () => void; cancel: () => void };\n\ntype LiveRecallState = {\n current: {\n queue: Pick<UseTurnQueueResult, \"queue\" | \"snapshot\">;\n composer: Pick<ComposerState, \"hasDraftContent\" | \"optimisticMessages\"> | undefined;\n };\n};\n\n/**\n * Wait until every tracked send has settled: landed in the queue snapshot,\n * failed, or left (started or withdrawn). Records each send's turn id as it\n * becomes known, since the optimistic entry can go away once its turn starts.\n * Resolves false on timeout, unmount, typing, or a newer send, which all mean\n * the person moved on from this press.\n */\nfunction waitForTrackedSends(\n waiters: Set<SettleWaiter>,\n live: LiveRecallState,\n tracked: Map<string, string | null>,\n): Promise<boolean> {\n const known = new Set(\n (live.current.composer?.optimisticMessages ?? []).map((message) => message.clientEventId),\n );\n return new Promise<boolean>((resolve) => {\n const finish = (settled: boolean) => {\n clearTimeout(timer);\n waiters.delete(waiter);\n resolve(settled);\n };\n const waiter: SettleWaiter = {\n cancel: () => finish(false),\n check: () => {\n const { composer, queue } = live.current;\n if (!composer || composer.hasDraftContent()) return finish(false);\n const messages = composer.optimisticMessages ?? [];\n if (messages.some((message) => !known.has(message.clientEventId))) return finish(false);\n const queuedTurnIds = new Set(queue.queue.map((turn) => turn.id));\n let pending = false;\n for (const clientEventId of tracked.keys()) {\n const message = messages.find((candidate) => candidate.clientEventId === clientEventId);\n if (message?.turnId) tracked.set(clientEventId, message.turnId);\n if (message && isQueuedSendInFlight(message, queuedTurnIds, queue.snapshot?.version)) {\n pending = true;\n }\n }\n if (!pending) finish(true);\n },\n };\n const timer = setTimeout(() => finish(false), QUEUED_RECALL_SETTLE_TIMEOUT_MS);\n waiters.add(waiter);\n });\n}\n"],"mappings":"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","names":["payload","nextPolicy","annotationsComplete","useCallback","useEffect","useRef","turn"]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  ChoiceCard,
4
4
  ChoiceCards
5
- } from "./chunk-N3FM4BNA.js";
5
+ } from "./chunk-TKHRGY2P.js";
6
6
  import {
7
7
  Toolbar,
8
8
  ToolbarSearch
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-HJO32O7Z.js";
13
13
  import {
14
14
  CheckboxField
15
- } from "./chunk-PRT4J2DL.js";
15
+ } from "./chunk-J555XSUM.js";
16
16
  import {
17
17
  Button
18
18
  } from "./chunk-7QQN3KNP.js";
@@ -252,4 +252,4 @@ export {
252
252
  WorkspaceChecklist,
253
253
  WorkspaceReachFields
254
254
  };
255
- //# sourceMappingURL=chunk-R33SBMB7.js.map
255
+ //# sourceMappingURL=chunk-BBSKKBMV.js.map
@@ -20,14 +20,14 @@ import {
20
20
  } from "./chunk-GM3LG6BG.js";
21
21
  import {
22
22
  FormDialog
23
- } from "./chunk-GU7T2S5N.js";
23
+ } from "./chunk-TU2GSZL7.js";
24
24
  import {
25
25
  userErrorText
26
26
  } from "./chunk-O4OOG3D6.js";
27
27
  import {
28
28
  Field,
29
29
  FieldStack
30
- } from "./chunk-PRT4J2DL.js";
30
+ } from "./chunk-J555XSUM.js";
31
31
  import {
32
32
  ADMIN_ACCESS_DURATIONS,
33
33
  ADMIN_ACCESS_GRANT_DESCRIPTION,
@@ -231,4 +231,4 @@ export {
231
231
  SessionAdminAccessMenuItems,
232
232
  GrantSessionAdminAccessDialog
233
233
  };
234
- //# sourceMappingURL=chunk-2GCHGWNE.js.map
234
+ //# sourceMappingURL=chunk-BGH6TU2P.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-ZHC47M2B.js";
8
8
  import {
9
9
  createOpenGeniText
10
- } from "./chunk-QPQ7R77C.js";
10
+ } from "./chunk-7SU4YVZ5.js";
11
11
 
12
12
  // src/session-list-model.ts
13
13
  import {
@@ -428,4 +428,4 @@ export {
428
428
  homeSessionSections,
429
429
  groupSessionsByProject
430
430
  };
431
- //# sourceMappingURL=chunk-D3PTVN2I.js.map
431
+ //# sourceMappingURL=chunk-BGIYL26H.js.map