@opengeni/react 6.8.0 → 6.8.1-canary.41842879332001

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 (685) 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 +47 -47
  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 +32 -32
  38. package/dist/app/components/command-menu/command-menu.js +36 -36
  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/credit-required-gate.js +1 -1
  44. package/dist/app/components/credit-required-prompt.js +3 -3
  45. package/dist/app/components/desktop/app-shots.js +6 -6
  46. package/dist/app/components/desktop/computer-use.js +2 -2
  47. package/dist/app/components/desktop/this-computer.js +5 -5
  48. package/dist/app/components/feedback.js +3 -3
  49. package/dist/app/components/github-app-connect-launcher.js +1 -1
  50. package/dist/app/components/machines/connect-machine-dialog.js +11 -11
  51. package/dist/app/components/markdown.js +6 -6
  52. package/dist/app/components/models/models-ui.js +5 -5
  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 +73 -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 +6 -6
  102. package/dist/app/components/settings/row-select.js +4 -4
  103. package/dist/app/components/transcription-settings.js +6 -6
  104. package/dist/app/components/ui/destructive-confirm.js +5 -5
  105. package/dist/app/components/usage/usage-entry.js +3 -3
  106. package/dist/app/components/window-bar.js +9 -9
  107. package/dist/app/components/workspace-composer-plus.js +16 -16
  108. package/dist/app/components/workspace-reach.js +4 -4
  109. package/dist/app/embed/session-app.js +156 -156
  110. package/dist/app/lib/actions/actions-provider.js +8 -8
  111. package/dist/app/lib/agent-capabilities.js +3 -3
  112. package/dist/app/lib/codex-usage-query.js +2 -2
  113. package/dist/app/lib/composer-connectors.js +14 -14
  114. package/dist/app/lib/console-site.js +2 -2
  115. package/dist/app/lib/console-text.js +2 -2
  116. package/dist/app/lib/events.js +12 -12
  117. package/dist/app/lib/failed-session-copy.js +3 -3
  118. package/dist/app/lib/model-access-onboarding.js +3 -3
  119. package/dist/app/lib/move-chat-to-machine.js +3 -3
  120. package/dist/app/lib/session-branch-cache.js +8 -8
  121. package/dist/app/lib/session-create.js +4 -4
  122. package/dist/app/lib/session-group-pagination.js +8 -8
  123. package/dist/app/lib/session-hover-facts.js +13 -13
  124. package/dist/app/lib/session-model.js +2 -2
  125. package/dist/app/lib/session-pins.js +1 -1
  126. package/dist/app/lib/session-rail.js +5 -5
  127. package/dist/app/lib/session-rename.js +3 -3
  128. package/dist/app/lib/sessions-group.d.ts +5 -3
  129. package/dist/app/lib/sessions-group.js +7 -7
  130. package/dist/app/lib/site-tool-consent-dialog.js +7 -7
  131. package/dist/app/lib/site-tool-consent.js +1 -1
  132. package/dist/app/lib/turn-failure-analytics.js +4 -4
  133. package/dist/app/lib/use-follow-up-repositories.js +3 -3
  134. package/dist/app/lib/use-workspace-machines.js +4 -4
  135. package/dist/app/lib/use-workspace-model-catalog.js +3 -3
  136. package/dist/app/lib/use-workspace-rigs.js +2 -2
  137. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  138. package/dist/app/lib/workspace-scope-context.js +3 -3
  139. package/dist/app/routes/artifacts.js +48 -48
  140. package/dist/app/routes/retained-artifact.js +32 -32
  141. package/dist/app/routes/session.js +94 -94
  142. package/dist/app/routes/sessions-index-hydration.js +5 -5
  143. package/dist/app/routes/sessions-index.js +76 -76
  144. package/dist/app/routes/site-view.js +55 -55
  145. package/dist/artifacts-document.js +4 -4
  146. package/dist/artifacts-presentation.js +4 -4
  147. package/dist/artifacts-spreadsheet.js +4 -4
  148. package/dist/artifacts.js +10 -10
  149. package/dist/automations.js +10 -10
  150. package/dist/{browser-viewer-ZHQDVHZ2.js → browser-viewer-H7PKY67P.js} +4 -4
  151. package/dist/{chat-interactive-block-VSDD6X3M.js → chat-interactive-block-47TCT4DN.js} +5 -5
  152. package/dist/{chunk-7Z76QP64.js → chunk-2QH3Q6Z2.js} +35 -5
  153. package/dist/chunk-2QH3Q6Z2.js.map +1 -0
  154. package/dist/{chunk-5MHMCE2G.js → chunk-2X2B6D5G.js} +3 -3
  155. package/dist/{chunk-OCXEY7HE.js → chunk-3BUI5DT7.js} +2 -2
  156. package/dist/{chunk-OSJ366KR.js → chunk-3FWP3TD3.js} +29 -29
  157. package/dist/{chunk-PWUSSSSL.js → chunk-3G5IA36N.js} +2 -2
  158. package/dist/{chunk-RGR57NYY.js → chunk-3NK4JAHL.js} +2 -2
  159. package/dist/{chunk-XUOYNJPB.js → chunk-3O7UZRWM.js} +24 -24
  160. package/dist/{chunk-JV3UI7BH.js → chunk-3OR6HMA4.js} +3 -3
  161. package/dist/{chunk-MV2CLIO6.js → chunk-3PC45I5N.js} +6 -6
  162. package/dist/{chunk-SJYTQLN3.js → chunk-3PI2BYK5.js} +3 -3
  163. package/dist/{chunk-DCEQCGVN.js → chunk-3PNA2P2Z.js} +2 -2
  164. package/dist/{chunk-ESXAECZ3.js → chunk-3XBZKF3K.js} +2 -2
  165. package/dist/{chunk-SBXSKRFA.js → chunk-45OGYO3S.js} +3 -3
  166. package/dist/{chunk-M3FDGRB4.js → chunk-4A7TKVNX.js} +3 -3
  167. package/dist/{chunk-RHXYO4H2.js → chunk-4BXRGXTD.js} +2 -2
  168. package/dist/{chunk-CV4VVLPZ.js → chunk-4HQAJA3T.js} +2 -2
  169. package/dist/{chunk-VCJQQYRE.js → chunk-4X2A3KPB.js} +4 -4
  170. package/dist/{chunk-OCXTTKVA.js → chunk-555K37A7.js} +2 -2
  171. package/dist/{chunk-EBIVTDEG.js → chunk-57L5ZXDS.js} +2 -2
  172. package/dist/{chunk-3L465FBR.js → chunk-5IADORIV.js} +6 -6
  173. package/dist/{chunk-SK5S2PCK.js → chunk-5IZQT4TE.js} +14 -14
  174. package/dist/chunk-5IZQT4TE.js.map +1 -0
  175. package/dist/{chunk-ZW5YTIH3.js → chunk-5PB46DAA.js} +1 -1
  176. package/dist/{chunk-ZW5YTIH3.js.map → chunk-5PB46DAA.js.map} +1 -1
  177. package/dist/{chunk-PVB4YVDP.js → chunk-5Y2O2432.js} +2 -2
  178. package/dist/{chunk-OOOSGPJL.js → chunk-6572EFE4.js} +1 -1
  179. package/dist/{chunk-YMI27QPF.js → chunk-6BG5HCUP.js} +2 -2
  180. package/dist/{chunk-QRECBCJM.js → chunk-6EXFJWII.js} +2 -2
  181. package/dist/{chunk-74CBR5YE.js → chunk-6PNRUGOK.js} +2 -2
  182. package/dist/{chunk-PUUEI4W3.js → chunk-6RJEY6TC.js} +5 -5
  183. package/dist/{chunk-DLVIRJGK.js → chunk-727GL2YY.js} +2 -2
  184. package/dist/{chunk-J2BTILRR.js → chunk-7FGYLFW6.js} +2 -2
  185. package/dist/{chunk-MKDFYE2E.js → chunk-7IMWTFEG.js} +2 -2
  186. package/dist/{chunk-FER6EVIY.js → chunk-7POKH54R.js} +2 -2
  187. package/dist/{chunk-H6BX6WOW.js → chunk-7T26IH6W.js} +3 -3
  188. package/dist/{chunk-R33SBMB7.js → chunk-7XQRVZZQ.js} +3 -3
  189. package/dist/{chunk-NFCS5WYC.js → chunk-A3SPPXMC.js} +3 -3
  190. package/dist/{chunk-DQPIEQGP.js → chunk-A7CWPDEH.js} +2 -2
  191. package/dist/{chunk-3PM3M2Q6.js → chunk-AGOYVKTI.js} +2 -2
  192. package/dist/{chunk-OBGOLHCP.js → chunk-AIQKZUPB.js} +3 -3
  193. package/dist/{chunk-GSCGKJNK.js → chunk-AMYDHG3S.js} +2 -2
  194. package/dist/{chunk-U4LTPFD2.js → chunk-APJPB6TX.js} +2 -2
  195. package/dist/{chunk-SP44O3OU.js → chunk-APLGT5EI.js} +2 -2
  196. package/dist/{chunk-M3HGBO2Y.js → chunk-ATNKMGLO.js} +1 -1
  197. package/dist/{chunk-4O2XWOLZ.js → chunk-AVX4CZQ3.js} +3 -3
  198. package/dist/{chunk-CXAN2FHF.js → chunk-B46MK44K.js} +6 -6
  199. package/dist/{chunk-RMCLFSMX.js → chunk-BBKUPEGG.js} +2 -2
  200. package/dist/{chunk-J2WY42FA.js → chunk-BES6OQE3.js} +2 -2
  201. package/dist/{chunk-GU7T2S5N.js → chunk-BM2N26SH.js} +2 -2
  202. package/dist/{chunk-HEGV4QMS.js → chunk-C3NS74PZ.js} +2 -2
  203. package/dist/{chunk-752WXSDN.js → chunk-C56ABB5V.js} +2 -2
  204. package/dist/{chunk-77SYIH6O.js → chunk-C6MATJQ5.js} +2 -2
  205. package/dist/{chunk-KUE5BOQE.js → chunk-CRX47CO6.js} +4 -4
  206. package/dist/{chunk-QPQ7R77C.js → chunk-CUIV2XPO.js} +3 -1
  207. package/dist/chunk-CUIV2XPO.js.map +1 -0
  208. package/dist/{chunk-GTHCHCWW.js → chunk-D33KWZQJ.js} +3 -3
  209. package/dist/{chunk-AH3DGOTK.js → chunk-D7E3BSCX.js} +2 -2
  210. package/dist/{chunk-OJWDNNW3.js → chunk-DFR3TMTZ.js} +5 -5
  211. package/dist/{chunk-WYGTAQMX.js → chunk-DICC75CU.js} +2 -2
  212. package/dist/{chunk-736RUNIA.js → chunk-DJ2LMKKX.js} +4 -4
  213. package/dist/{chunk-4F3AEJI6.js → chunk-DJI4D7PM.js} +4 -4
  214. package/dist/{chunk-LVELUUK6.js → chunk-DSZUQL4W.js} +2 -2
  215. package/dist/{chunk-MT2R57SF.js → chunk-DVF246BE.js} +2 -2
  216. package/dist/{chunk-OI6VI6SU.js → chunk-DVOWBHWN.js} +8 -8
  217. package/dist/{chunk-PZKHST7A.js → chunk-E2KPRSA4.js} +2 -2
  218. package/dist/{chunk-EKJHOWTZ.js → chunk-E3LMLWEB.js} +4 -4
  219. package/dist/{chunk-QURYQFDN.js → chunk-EDC7X7PW.js} +2 -2
  220. package/dist/{chunk-HYEIA25Y.js → chunk-EDSMULHU.js} +2 -2
  221. package/dist/{chunk-U6552Q3T.js → chunk-EQQOZ6DD.js} +2 -2
  222. package/dist/{chunk-IFSXVU2S.js → chunk-ERBDQ2GY.js} +2 -2
  223. package/dist/{chunk-IZXYFWA4.js → chunk-EWI73URG.js} +13 -13
  224. package/dist/{chunk-N3FM4BNA.js → chunk-EZ6LFN33.js} +2 -2
  225. package/dist/{chunk-4K64EKM7.js → chunk-F7YL6DPR.js} +4 -4
  226. package/dist/{chunk-ICAMYP5M.js → chunk-FIGFXMUP.js} +2 -2
  227. package/dist/{chunk-54U6ZBEX.js → chunk-FJRJK67G.js} +3 -3
  228. package/dist/{chunk-E5KOWRDU.js → chunk-FLHB2NZT.js} +2 -2
  229. package/dist/{chunk-OWET7EY2.js → chunk-FRSZSL2S.js} +19 -13
  230. package/dist/{chunk-OWET7EY2.js.map → chunk-FRSZSL2S.js.map} +1 -1
  231. package/dist/{chunk-D3PTVN2I.js → chunk-FUGGM76A.js} +2 -2
  232. package/dist/{chunk-QQIZMVAJ.js → chunk-FWLLGNGP.js} +51 -49
  233. package/dist/chunk-FWLLGNGP.js.map +1 -0
  234. package/dist/{chunk-TDTD66BK.js → chunk-FXPZAZYT.js} +2 -2
  235. package/dist/{chunk-KO3OHHY2.js → chunk-GAGAM4MT.js} +2 -2
  236. package/dist/{chunk-TK5FWVZR.js → chunk-GESGH3HY.js} +3 -3
  237. package/dist/{chunk-2VJOSU4H.js → chunk-GI4PWKXI.js} +2 -2
  238. package/dist/{chunk-KFNZZ2N6.js → chunk-GJTEBAZ7.js} +2 -2
  239. package/dist/{chunk-LTJFV2JI.js → chunk-GNCGEW7F.js} +2 -2
  240. package/dist/{chunk-34NV52R3.js → chunk-GOMUNPB6.js} +4 -4
  241. package/dist/{chunk-7YTR3UFO.js → chunk-GPWE5UD7.js} +8 -5
  242. package/dist/chunk-GPWE5UD7.js.map +1 -0
  243. package/dist/{chunk-LIJNVIT3.js → chunk-GUMUILEI.js} +3 -3
  244. package/dist/{chunk-7NLF35YL.js → chunk-GVGNHBFT.js} +4 -4
  245. package/dist/{chunk-K3D7IQQP.js → chunk-GW4YI3FB.js} +6 -6
  246. package/dist/{chunk-D5TIVCXG.js → chunk-GXKCV7X7.js} +2 -2
  247. package/dist/{chunk-2J77TWGH.js → chunk-H467EQA6.js} +3 -3
  248. package/dist/{chunk-3OK7Y6ES.js → chunk-HE77VDDR.js} +2 -2
  249. package/dist/{chunk-UO35OEOX.js → chunk-HT65RGCX.js} +3 -3
  250. package/dist/{chunk-G6ICCGJ3.js → chunk-HVQSFTE7.js} +2 -2
  251. package/dist/{chunk-G5UQBTXY.js → chunk-HXJPDC76.js} +2 -2
  252. package/dist/{chunk-GIWFLWXG.js → chunk-I6LQW24C.js} +4 -4
  253. package/dist/{chunk-467WDSOK.js → chunk-I7A6S5YL.js} +2 -2
  254. package/dist/{chunk-AAS7OWV6.js → chunk-IADS4ZYD.js} +3 -3
  255. package/dist/{chunk-Y3XZEKDQ.js → chunk-IJWMWCGR.js} +2 -2
  256. package/dist/{chunk-SGH7I7OY.js → chunk-IWFO6KOU.js} +2 -2
  257. package/dist/{chunk-GMHIOYB7.js → chunk-IYC6QGV2.js} +4 -4
  258. package/dist/{chunk-2OXSB2OL.js → chunk-J2TZIFRC.js} +3 -2
  259. package/dist/chunk-J2TZIFRC.js.map +1 -0
  260. package/dist/{chunk-3NNAC43A.js → chunk-J5AODKJO.js} +2 -2
  261. package/dist/{chunk-DIP7YALH.js → chunk-JKI3LMLH.js} +2 -2
  262. package/dist/{chunk-IJR6VOLU.js → chunk-JSYRWOCE.js} +2 -2
  263. package/dist/{chunk-CEMSIU4Z.js → chunk-JTQTWO4D.js} +5 -5
  264. package/dist/{chunk-JHZRAYI4.js → chunk-JWSRFXRN.js} +2 -2
  265. package/dist/chunk-JWSRFXRN.js.map +1 -0
  266. package/dist/{chunk-BASI553K.js → chunk-KBTKAAHM.js} +4 -4
  267. package/dist/{chunk-OYOFPNLC.js → chunk-KD7VEMWY.js} +4 -4
  268. package/dist/{chunk-3DRLCX5V.js → chunk-KPGFGRSA.js} +2 -2
  269. package/dist/{chunk-PLYVGZIN.js → chunk-KWFDEJFI.js} +1 -1
  270. package/dist/{chunk-FNXCFIPW.js → chunk-KYLEH4OF.js} +2 -2
  271. package/dist/{chunk-WXF2RTS4.js → chunk-L7FJTFJN.js} +2 -2
  272. package/dist/{chunk-KI46GKMD.js → chunk-L7VVQOSY.js} +7 -7
  273. package/dist/{chunk-M5IQVMLR.js → chunk-LAZ2QZTJ.js} +11 -4
  274. package/dist/chunk-LAZ2QZTJ.js.map +1 -0
  275. package/dist/chunk-LKLQVANM.js +2 -0
  276. package/dist/{chunk-YNTLWCF4.js → chunk-LLYEAZ4E.js} +3 -3
  277. package/dist/{chunk-4Z5X7PLC.js → chunk-LWM7JUW6.js} +3 -3
  278. package/dist/{chunk-CHU3RDV4.js → chunk-LXKV4ND3.js} +3 -3
  279. package/dist/{chunk-AB5IW227.js → chunk-LYLICEQO.js} +3 -3
  280. package/dist/{chunk-PSM3CU7N.js → chunk-M3OZOCIK.js} +46 -39
  281. package/dist/chunk-M3OZOCIK.js.map +1 -0
  282. package/dist/{chunk-OTW25A6I.js → chunk-M5GRI5K4.js} +3 -3
  283. package/dist/{chunk-X2QJXDE4.js → chunk-MF65PKKF.js} +8 -8
  284. package/dist/{chunk-EDDKPIIV.js → chunk-MJ4XIOPM.js} +2 -2
  285. package/dist/{chunk-FLWQJDJ5.js → chunk-MMPJJQG3.js} +6 -6
  286. package/dist/{chunk-T67LTMSW.js → chunk-MOU54FGD.js} +10 -10
  287. package/dist/{chunk-LQKVNREV.js → chunk-NAWHQ4IL.js} +3 -3
  288. package/dist/{chunk-ZBHGNE2J.js → chunk-NBHBB2VV.js} +3 -3
  289. package/dist/{chunk-PF2WU2IL.js → chunk-ND4IQJUM.js} +120 -17
  290. package/dist/chunk-ND4IQJUM.js.map +1 -0
  291. package/dist/{chunk-U5UGM5XD.js → chunk-NMOZDAEZ.js} +5 -5
  292. package/dist/{chunk-D74Z2N4K.js → chunk-NZA4R3BE.js} +2 -2
  293. package/dist/{chunk-WRMUXZ7C.js → chunk-OB2CX7PJ.js} +3 -3
  294. package/dist/{chunk-YJSCLGAW.js → chunk-OB4I4OIT.js} +3 -3
  295. package/dist/{chunk-DWJ6J3YW.js → chunk-OKQW2FPL.js} +4 -4
  296. package/dist/{chunk-2GCHGWNE.js → chunk-ORLX6A3C.js} +3 -3
  297. package/dist/{chunk-EBTUPRRQ.js → chunk-P5N4EYFW.js} +4 -4
  298. package/dist/{chunk-JKL5S7UQ.js → chunk-PL4JE3NI.js} +6 -6
  299. package/dist/{chunk-OP2GD6QW.js → chunk-PNUHKDY2.js} +2 -2
  300. package/dist/{chunk-MZY3VKKM.js → chunk-PWJE7D6V.js} +2 -2
  301. package/dist/{chunk-RISUROBM.js → chunk-PYE27I6J.js} +4 -4
  302. package/dist/{chunk-SPD4ULVB.js → chunk-PYMROAWS.js} +2 -1
  303. package/dist/chunk-PYMROAWS.js.map +1 -0
  304. package/dist/{chunk-Q5K2J5GG.js → chunk-Q74FQK3A.js} +13 -3
  305. package/dist/chunk-Q74FQK3A.js.map +1 -0
  306. package/dist/{chunk-R5QAL43H.js → chunk-QIJHK6P4.js} +2 -2
  307. package/dist/{chunk-AJBDAVX3.js → chunk-QK3A23NP.js} +7 -7
  308. package/dist/{chunk-CYDXCILL.js → chunk-QLWDNAOV.js} +7 -7
  309. package/dist/{chunk-BQYRZIZ7.js → chunk-QS6DQBVJ.js} +2 -2
  310. package/dist/{chunk-3PZ3LRPV.js → chunk-QSUVFPG3.js} +3 -3
  311. package/dist/{chunk-PYB4BFEC.js → chunk-QUC5MLTN.js} +3 -3
  312. package/dist/{chunk-WDASYY4S.js → chunk-QVT5AWPI.js} +6 -6
  313. package/dist/{chunk-K4DQS2ML.js → chunk-QZC6WCBR.js} +4 -4
  314. package/dist/{chunk-HWVPLFIW.js → chunk-RAHNICPP.js} +2 -2
  315. package/dist/{chunk-H6MJFMHZ.js → chunk-RME6RGIW.js} +3 -3
  316. package/dist/{chunk-XMBOLFFS.js → chunk-RQIB2F53.js} +2 -2
  317. package/dist/{chunk-OXQ2SXVC.js → chunk-RUA72NQY.js} +2 -2
  318. package/dist/{chunk-UMX6DZME.js → chunk-SCJHWN4X.js} +2 -2
  319. package/dist/{chunk-HTMQGS63.js → chunk-SIXBDT5F.js} +8 -8
  320. package/dist/{chunk-ZAX4XQLN.js → chunk-SPK3T4JK.js} +2 -2
  321. package/dist/{chunk-WTSQUCHB.js → chunk-SSN2YSST.js} +3 -3
  322. package/dist/{chunk-5MIBQ4P5.js → chunk-SYJCDX5V.js} +2 -2
  323. package/dist/{chunk-NQ2CPQJF.js → chunk-SYL7LCRA.js} +26 -3
  324. package/dist/chunk-SYL7LCRA.js.map +1 -0
  325. package/dist/{chunk-ZR5EKJT6.js → chunk-T6276OXI.js} +2 -2
  326. package/dist/{chunk-DEHLWZSI.js → chunk-T7OARG4N.js} +4 -4
  327. package/dist/{chunk-77BHKC43.js → chunk-TF5L3BEV.js} +1 -1
  328. package/dist/{chunk-GOCODNQS.js → chunk-TF6Z7BOP.js} +2 -2
  329. package/dist/{chunk-WIFDNUKD.js → chunk-TJDXWZMO.js} +3 -3
  330. package/dist/{chunk-SFIXTOOJ.js → chunk-TL5ATBHZ.js} +3 -3
  331. package/dist/{chunk-XZCCEKPW.js → chunk-TMOHIOMT.js} +6 -6
  332. package/dist/{chunk-AVXDIRRW.js → chunk-UI5X63YC.js} +2 -2
  333. package/dist/{chunk-6QK65ZWM.js → chunk-UIY7BDZC.js} +3 -3
  334. package/dist/{chunk-VATYK3JQ.js → chunk-UMBFMEO7.js} +3 -3
  335. package/dist/{chunk-UU5FBVRX.js → chunk-UU5G7OA4.js} +2 -2
  336. package/dist/{chunk-EGKARC53.js → chunk-UZUCYCF4.js} +2 -2
  337. package/dist/{chunk-LPKJ77EK.js → chunk-V2A7G7S7.js} +2 -2
  338. package/dist/{chunk-CH4UQ4NO.js → chunk-V5G4TKRC.js} +5 -5
  339. package/dist/{chunk-UBRQ3PQD.js → chunk-VKAVW34W.js} +2 -2
  340. package/dist/{chunk-JV5ULONH.js → chunk-VVLEVNTQ.js} +36 -36
  341. package/dist/{chunk-44JWVYJB.js → chunk-VW7X7TWZ.js} +2 -2
  342. package/dist/{chunk-3CDJSKDW.js → chunk-VWA2CHSL.js} +3 -3
  343. package/dist/{chunk-IN3VQFKS.js → chunk-W43HZPM7.js} +2 -2
  344. package/dist/{chunk-SXGJL7UT.js → chunk-WHGD7Q2L.js} +14 -14
  345. package/dist/{chunk-XOIDUM2H.js → chunk-WNXKYEVN.js} +1 -1
  346. package/dist/{chunk-TKQL7EDB.js → chunk-WSA7UBX4.js} +2 -2
  347. package/dist/{chunk-AJDGP2N4.js → chunk-WZ5TQJ3T.js} +19 -19
  348. package/dist/{chunk-FBA2NXYH.js → chunk-X3TGNSOG.js} +3 -3
  349. package/dist/{chunk-R4JA5JFI.js → chunk-X4WXYI3N.js} +3 -3
  350. package/dist/{chunk-Q5EZNBPI.js → chunk-XIQ3AIAJ.js} +3 -3
  351. package/dist/{chunk-S27VZ5DO.js → chunk-XWYT4LEL.js} +6 -6
  352. package/dist/{chunk-477DTTMH.js → chunk-Y3PU75OC.js} +3 -3
  353. package/dist/{chunk-4JXPLTWV.js → chunk-Y5ZWX5YS.js} +2 -2
  354. package/dist/{chunk-4BWMAGJJ.js → chunk-YA5PABND.js} +3 -3
  355. package/dist/{chunk-VXORMNU4.js → chunk-YBHAAULA.js} +67 -2
  356. package/dist/chunk-YBHAAULA.js.map +1 -0
  357. package/dist/{chunk-OGU73VUN.js → chunk-YBPRR2QS.js} +2 -2
  358. package/dist/{chunk-TNSJFZ6Q.js → chunk-YDYR7XQE.js} +4 -4
  359. package/dist/{chunk-GTRAH4FG.js → chunk-YG6V2LQH.js} +2 -2
  360. package/dist/{chunk-XVLEBB4Y.js → chunk-YUXA7ALE.js} +2 -2
  361. package/dist/{chunk-SN2WENRP.js → chunk-YWHQDXPB.js} +3 -3
  362. package/dist/{chunk-BFFNINCC.js → chunk-YWRR5R7B.js} +3 -3
  363. package/dist/{chunk-FSDQQQIA.js → chunk-YYRK7A4N.js} +3 -3
  364. package/dist/{chunk-MRECRNVU.js → chunk-Z26CDLUV.js} +5 -5
  365. package/dist/{chunk-OYCK4JRS.js → chunk-Z27EXLMQ.js} +2 -2
  366. package/dist/{chunk-UTRNLNCW.js → chunk-Z7GDH7W2.js} +3 -3
  367. package/dist/{chunk-PRT4J2DL.js → chunk-ZGVLSAWL.js} +2 -2
  368. package/dist/{chunk-OK7BQMCI.js → chunk-ZM6Q5NQN.js} +9 -9
  369. package/dist/components/message-timeline.d.ts +10 -2
  370. package/dist/composer.js +8 -8
  371. package/dist/{computer-viewer-5LKRCEVQ.js → computer-viewer-SROXREYD.js} +5 -5
  372. package/dist/connect.js +12 -12
  373. package/dist/desktop-dictation.js +8 -8
  374. package/dist/desktop.js +2 -2
  375. package/dist/editor.js +2 -2
  376. package/dist/{embedded-new-voice-GHJRY3YL.js → embedded-new-voice-EIQY2VBF.js} +5 -5
  377. package/dist/{embedded-voice-ASQXBSTX.js → embedded-voice-LMWNH7F7.js} +5 -5
  378. package/dist/{fleet-decision-row-U7LDVBEM.js → fleet-decision-row-X2G56ZRA.js} +2 -2
  379. package/dist/hooks/use-recordings.d.ts +4 -2
  380. package/dist/in-chat-connect-model.js +5 -5
  381. package/dist/index.d.ts +2 -2
  382. package/dist/index.js +66 -60
  383. package/dist/interaction.js +5 -5
  384. package/dist/{latest-question-RNVF262Q.js → latest-question-KA7AQYVI.js} +2 -2
  385. package/dist/machines.js +3 -3
  386. package/dist/meetings/recorder-context.d.ts +6 -1
  387. package/dist/meetings/recorder-panel.d.ts +2 -5
  388. package/dist/meetings-recorder.js +1 -1
  389. package/dist/meetings.js +22 -21
  390. package/dist/meetings.js.map +1 -1
  391. package/dist/messages/en.d.ts +2 -0
  392. package/dist/messages.js +1 -1
  393. package/dist/{model-policy-picker-menu-E6XKMFTA.js → model-policy-picker-menu-SHWPT5VA.js} +4 -4
  394. package/dist/{payment-page-card-DJDKV2LW.js → payment-page-card-NNVUISN4.js} +4 -4
  395. package/dist/{platform-activity-row-MSDCSMET.js → platform-activity-row-7UDWSAHK.js} +2 -2
  396. package/dist/{queue-surface-implementation-GUAIG6TK.js → queue-surface-implementation-BUXSO24N.js} +5 -5
  397. package/dist/realtime.js +4 -4
  398. package/dist/{recorder-host-2MYDJPQW.js → recorder-host-POX54CFT.js} +5 -5
  399. package/dist/recordings.js +4 -4
  400. package/dist/{sandbox-files-W5W2LW4K.js → sandbox-files-33QD7DW2.js} +6 -6
  401. package/dist/session-app.js +156 -156
  402. package/dist/{session-connect-cards-HPH7JOZP.js → session-connect-cards-CXGNVA2A.js} +9 -9
  403. package/dist/session-list-model.js +2 -2
  404. package/dist/{session-realtime-SDTKFFIR.js → session-realtime-CVDSEULB.js} +3 -3
  405. package/dist/session-realtime.js +2 -2
  406. package/dist/session-ui.js +33 -33
  407. package/dist/session.d.ts +3 -2
  408. package/dist/session.js +16 -10
  409. package/dist/sites.js +2 -2
  410. package/dist/terminal.js +2 -2
  411. package/dist/this-computer.js +3 -3
  412. package/dist/timeline/index.d.ts +3 -2
  413. package/dist/timeline/projection.d.ts +52 -0
  414. package/dist/timeline/turn-summary-model.d.ts +4 -3
  415. package/dist/timeline/types.d.ts +8 -2
  416. package/dist/timeline/use-timeline-pauses.d.ts +12 -0
  417. package/dist/timeline/work-presentation.d.ts +4 -3
  418. package/dist/{timeline-annotation-markers-FNILLWNU.js → timeline-annotation-markers-5J5TM5IP.js} +2 -2
  419. package/dist/{timeline-annotation-selection-MBCIDO2Q.js → timeline-annotation-selection-WLY7FB7F.js} +2 -2
  420. package/dist/{timeline-annotations-dialog-JPNKLOTE.js → timeline-annotations-dialog-67VRFKJU.js} +3 -3
  421. package/dist/timeline-model.js +2 -2
  422. package/dist/ui/access-list.js +5 -5
  423. package/dist/ui/cadence-picker.js +4 -4
  424. package/dist/ui/choice-cards.js +3 -3
  425. package/dist/ui/confirm-dialog.js +2 -2
  426. package/dist/ui/copy-field.js +3 -3
  427. package/dist/ui/detail-page.js +2 -2
  428. package/dist/ui/detail-sheet.js +2 -2
  429. package/dist/ui/disclosure.js +3 -3
  430. package/dist/ui/email-chips-input.js +3 -3
  431. package/dist/ui/field.js +2 -2
  432. package/dist/ui/flush-form-page.js +3 -3
  433. package/dist/ui/form-dialog.js +2 -2
  434. package/dist/ui/list-row.js +3 -3
  435. package/dist/ui/relative-time.js +2 -2
  436. package/dist/ui/revision-history.js +4 -4
  437. package/dist/ui/role-select.js +5 -5
  438. package/dist/ui/select-menu.js +3 -3
  439. package/dist/ui/usage-meter.js +3 -3
  440. package/dist/usage.js +2 -2
  441. package/dist/workbench.js +4 -4
  442. package/package.json +6 -5
  443. package/src/app/components/rail/session-row-content.tsx +27 -0
  444. package/src/app/lib/session-branch-cache.tsx +1 -0
  445. package/src/app/lib/session-pins.tsx +1 -0
  446. package/src/app/lib/session-row-paused.test.tsx +183 -0
  447. package/src/app/lib/sessions-group-channels.test.ts +4 -4
  448. package/src/app/lib/sessions-group.tsx +62 -4
  449. package/src/app/routes/session.tsx +2 -0
  450. package/src/components/message-timeline.tsx +14 -2
  451. package/src/components/session-conversation.tsx +2 -1
  452. package/src/components/timeline-annotations.tsx +4 -1
  453. package/src/components/timeline-settlement.ts +1 -1
  454. package/src/hooks/use-recordings.ts +5 -0
  455. package/src/index.ts +5 -0
  456. package/src/meetings/recorder-context.tsx +28 -5
  457. package/src/meetings/recorder-panel.tsx +13 -5
  458. package/src/meetings/recorder-workspace.test.tsx +57 -8
  459. package/src/messages/en.ts +2 -0
  460. package/src/session.ts +8 -1
  461. package/src/timeline/index.ts +4 -1
  462. package/src/timeline/projection.ts +228 -16
  463. package/src/timeline/turn-summary-model.ts +4 -3
  464. package/src/timeline/turn-summary.tsx +15 -2
  465. package/src/timeline/types.ts +8 -2
  466. package/src/timeline/use-timeline-pauses.ts +105 -0
  467. package/src/timeline/work-presentation.ts +13 -4
  468. package/dist/chunk-2OXSB2OL.js.map +0 -1
  469. package/dist/chunk-7YTR3UFO.js.map +0 -1
  470. package/dist/chunk-7Z76QP64.js.map +0 -1
  471. package/dist/chunk-JHZRAYI4.js.map +0 -1
  472. package/dist/chunk-M5IQVMLR.js.map +0 -1
  473. package/dist/chunk-NQ2CPQJF.js.map +0 -1
  474. package/dist/chunk-O2UPPN5M.js +0 -2
  475. package/dist/chunk-PF2WU2IL.js.map +0 -1
  476. package/dist/chunk-PSM3CU7N.js.map +0 -1
  477. package/dist/chunk-Q5K2J5GG.js.map +0 -1
  478. package/dist/chunk-QPQ7R77C.js.map +0 -1
  479. package/dist/chunk-QQIZMVAJ.js.map +0 -1
  480. package/dist/chunk-SK5S2PCK.js.map +0 -1
  481. package/dist/chunk-SPD4ULVB.js.map +0 -1
  482. package/dist/chunk-VXORMNU4.js.map +0 -1
  483. /package/dist/{browser-viewer-ZHQDVHZ2.js.map → browser-viewer-H7PKY67P.js.map} +0 -0
  484. /package/dist/{chat-interactive-block-VSDD6X3M.js.map → chat-interactive-block-47TCT4DN.js.map} +0 -0
  485. /package/dist/{chunk-5MHMCE2G.js.map → chunk-2X2B6D5G.js.map} +0 -0
  486. /package/dist/{chunk-OCXEY7HE.js.map → chunk-3BUI5DT7.js.map} +0 -0
  487. /package/dist/{chunk-OSJ366KR.js.map → chunk-3FWP3TD3.js.map} +0 -0
  488. /package/dist/{chunk-PWUSSSSL.js.map → chunk-3G5IA36N.js.map} +0 -0
  489. /package/dist/{chunk-RGR57NYY.js.map → chunk-3NK4JAHL.js.map} +0 -0
  490. /package/dist/{chunk-XUOYNJPB.js.map → chunk-3O7UZRWM.js.map} +0 -0
  491. /package/dist/{chunk-JV3UI7BH.js.map → chunk-3OR6HMA4.js.map} +0 -0
  492. /package/dist/{chunk-MV2CLIO6.js.map → chunk-3PC45I5N.js.map} +0 -0
  493. /package/dist/{chunk-SJYTQLN3.js.map → chunk-3PI2BYK5.js.map} +0 -0
  494. /package/dist/{chunk-DCEQCGVN.js.map → chunk-3PNA2P2Z.js.map} +0 -0
  495. /package/dist/{chunk-ESXAECZ3.js.map → chunk-3XBZKF3K.js.map} +0 -0
  496. /package/dist/{chunk-SBXSKRFA.js.map → chunk-45OGYO3S.js.map} +0 -0
  497. /package/dist/{chunk-M3FDGRB4.js.map → chunk-4A7TKVNX.js.map} +0 -0
  498. /package/dist/{chunk-RHXYO4H2.js.map → chunk-4BXRGXTD.js.map} +0 -0
  499. /package/dist/{chunk-CV4VVLPZ.js.map → chunk-4HQAJA3T.js.map} +0 -0
  500. /package/dist/{chunk-VCJQQYRE.js.map → chunk-4X2A3KPB.js.map} +0 -0
  501. /package/dist/{chunk-OCXTTKVA.js.map → chunk-555K37A7.js.map} +0 -0
  502. /package/dist/{chunk-EBIVTDEG.js.map → chunk-57L5ZXDS.js.map} +0 -0
  503. /package/dist/{chunk-3L465FBR.js.map → chunk-5IADORIV.js.map} +0 -0
  504. /package/dist/{chunk-PVB4YVDP.js.map → chunk-5Y2O2432.js.map} +0 -0
  505. /package/dist/{chunk-OOOSGPJL.js.map → chunk-6572EFE4.js.map} +0 -0
  506. /package/dist/{chunk-YMI27QPF.js.map → chunk-6BG5HCUP.js.map} +0 -0
  507. /package/dist/{chunk-QRECBCJM.js.map → chunk-6EXFJWII.js.map} +0 -0
  508. /package/dist/{chunk-74CBR5YE.js.map → chunk-6PNRUGOK.js.map} +0 -0
  509. /package/dist/{chunk-PUUEI4W3.js.map → chunk-6RJEY6TC.js.map} +0 -0
  510. /package/dist/{chunk-DLVIRJGK.js.map → chunk-727GL2YY.js.map} +0 -0
  511. /package/dist/{chunk-J2BTILRR.js.map → chunk-7FGYLFW6.js.map} +0 -0
  512. /package/dist/{chunk-MKDFYE2E.js.map → chunk-7IMWTFEG.js.map} +0 -0
  513. /package/dist/{chunk-FER6EVIY.js.map → chunk-7POKH54R.js.map} +0 -0
  514. /package/dist/{chunk-H6BX6WOW.js.map → chunk-7T26IH6W.js.map} +0 -0
  515. /package/dist/{chunk-R33SBMB7.js.map → chunk-7XQRVZZQ.js.map} +0 -0
  516. /package/dist/{chunk-NFCS5WYC.js.map → chunk-A3SPPXMC.js.map} +0 -0
  517. /package/dist/{chunk-DQPIEQGP.js.map → chunk-A7CWPDEH.js.map} +0 -0
  518. /package/dist/{chunk-3PM3M2Q6.js.map → chunk-AGOYVKTI.js.map} +0 -0
  519. /package/dist/{chunk-OBGOLHCP.js.map → chunk-AIQKZUPB.js.map} +0 -0
  520. /package/dist/{chunk-GSCGKJNK.js.map → chunk-AMYDHG3S.js.map} +0 -0
  521. /package/dist/{chunk-U4LTPFD2.js.map → chunk-APJPB6TX.js.map} +0 -0
  522. /package/dist/{chunk-SP44O3OU.js.map → chunk-APLGT5EI.js.map} +0 -0
  523. /package/dist/{chunk-M3HGBO2Y.js.map → chunk-ATNKMGLO.js.map} +0 -0
  524. /package/dist/{chunk-4O2XWOLZ.js.map → chunk-AVX4CZQ3.js.map} +0 -0
  525. /package/dist/{chunk-CXAN2FHF.js.map → chunk-B46MK44K.js.map} +0 -0
  526. /package/dist/{chunk-RMCLFSMX.js.map → chunk-BBKUPEGG.js.map} +0 -0
  527. /package/dist/{chunk-J2WY42FA.js.map → chunk-BES6OQE3.js.map} +0 -0
  528. /package/dist/{chunk-GU7T2S5N.js.map → chunk-BM2N26SH.js.map} +0 -0
  529. /package/dist/{chunk-HEGV4QMS.js.map → chunk-C3NS74PZ.js.map} +0 -0
  530. /package/dist/{chunk-752WXSDN.js.map → chunk-C56ABB5V.js.map} +0 -0
  531. /package/dist/{chunk-77SYIH6O.js.map → chunk-C6MATJQ5.js.map} +0 -0
  532. /package/dist/{chunk-KUE5BOQE.js.map → chunk-CRX47CO6.js.map} +0 -0
  533. /package/dist/{chunk-GTHCHCWW.js.map → chunk-D33KWZQJ.js.map} +0 -0
  534. /package/dist/{chunk-AH3DGOTK.js.map → chunk-D7E3BSCX.js.map} +0 -0
  535. /package/dist/{chunk-OJWDNNW3.js.map → chunk-DFR3TMTZ.js.map} +0 -0
  536. /package/dist/{chunk-WYGTAQMX.js.map → chunk-DICC75CU.js.map} +0 -0
  537. /package/dist/{chunk-736RUNIA.js.map → chunk-DJ2LMKKX.js.map} +0 -0
  538. /package/dist/{chunk-4F3AEJI6.js.map → chunk-DJI4D7PM.js.map} +0 -0
  539. /package/dist/{chunk-LVELUUK6.js.map → chunk-DSZUQL4W.js.map} +0 -0
  540. /package/dist/{chunk-MT2R57SF.js.map → chunk-DVF246BE.js.map} +0 -0
  541. /package/dist/{chunk-OI6VI6SU.js.map → chunk-DVOWBHWN.js.map} +0 -0
  542. /package/dist/{chunk-PZKHST7A.js.map → chunk-E2KPRSA4.js.map} +0 -0
  543. /package/dist/{chunk-EKJHOWTZ.js.map → chunk-E3LMLWEB.js.map} +0 -0
  544. /package/dist/{chunk-QURYQFDN.js.map → chunk-EDC7X7PW.js.map} +0 -0
  545. /package/dist/{chunk-HYEIA25Y.js.map → chunk-EDSMULHU.js.map} +0 -0
  546. /package/dist/{chunk-U6552Q3T.js.map → chunk-EQQOZ6DD.js.map} +0 -0
  547. /package/dist/{chunk-IFSXVU2S.js.map → chunk-ERBDQ2GY.js.map} +0 -0
  548. /package/dist/{chunk-IZXYFWA4.js.map → chunk-EWI73URG.js.map} +0 -0
  549. /package/dist/{chunk-N3FM4BNA.js.map → chunk-EZ6LFN33.js.map} +0 -0
  550. /package/dist/{chunk-4K64EKM7.js.map → chunk-F7YL6DPR.js.map} +0 -0
  551. /package/dist/{chunk-ICAMYP5M.js.map → chunk-FIGFXMUP.js.map} +0 -0
  552. /package/dist/{chunk-54U6ZBEX.js.map → chunk-FJRJK67G.js.map} +0 -0
  553. /package/dist/{chunk-E5KOWRDU.js.map → chunk-FLHB2NZT.js.map} +0 -0
  554. /package/dist/{chunk-D3PTVN2I.js.map → chunk-FUGGM76A.js.map} +0 -0
  555. /package/dist/{chunk-TDTD66BK.js.map → chunk-FXPZAZYT.js.map} +0 -0
  556. /package/dist/{chunk-KO3OHHY2.js.map → chunk-GAGAM4MT.js.map} +0 -0
  557. /package/dist/{chunk-TK5FWVZR.js.map → chunk-GESGH3HY.js.map} +0 -0
  558. /package/dist/{chunk-2VJOSU4H.js.map → chunk-GI4PWKXI.js.map} +0 -0
  559. /package/dist/{chunk-KFNZZ2N6.js.map → chunk-GJTEBAZ7.js.map} +0 -0
  560. /package/dist/{chunk-LTJFV2JI.js.map → chunk-GNCGEW7F.js.map} +0 -0
  561. /package/dist/{chunk-34NV52R3.js.map → chunk-GOMUNPB6.js.map} +0 -0
  562. /package/dist/{chunk-LIJNVIT3.js.map → chunk-GUMUILEI.js.map} +0 -0
  563. /package/dist/{chunk-7NLF35YL.js.map → chunk-GVGNHBFT.js.map} +0 -0
  564. /package/dist/{chunk-K3D7IQQP.js.map → chunk-GW4YI3FB.js.map} +0 -0
  565. /package/dist/{chunk-D5TIVCXG.js.map → chunk-GXKCV7X7.js.map} +0 -0
  566. /package/dist/{chunk-2J77TWGH.js.map → chunk-H467EQA6.js.map} +0 -0
  567. /package/dist/{chunk-3OK7Y6ES.js.map → chunk-HE77VDDR.js.map} +0 -0
  568. /package/dist/{chunk-UO35OEOX.js.map → chunk-HT65RGCX.js.map} +0 -0
  569. /package/dist/{chunk-G6ICCGJ3.js.map → chunk-HVQSFTE7.js.map} +0 -0
  570. /package/dist/{chunk-G5UQBTXY.js.map → chunk-HXJPDC76.js.map} +0 -0
  571. /package/dist/{chunk-GIWFLWXG.js.map → chunk-I6LQW24C.js.map} +0 -0
  572. /package/dist/{chunk-467WDSOK.js.map → chunk-I7A6S5YL.js.map} +0 -0
  573. /package/dist/{chunk-AAS7OWV6.js.map → chunk-IADS4ZYD.js.map} +0 -0
  574. /package/dist/{chunk-Y3XZEKDQ.js.map → chunk-IJWMWCGR.js.map} +0 -0
  575. /package/dist/{chunk-SGH7I7OY.js.map → chunk-IWFO6KOU.js.map} +0 -0
  576. /package/dist/{chunk-GMHIOYB7.js.map → chunk-IYC6QGV2.js.map} +0 -0
  577. /package/dist/{chunk-3NNAC43A.js.map → chunk-J5AODKJO.js.map} +0 -0
  578. /package/dist/{chunk-DIP7YALH.js.map → chunk-JKI3LMLH.js.map} +0 -0
  579. /package/dist/{chunk-IJR6VOLU.js.map → chunk-JSYRWOCE.js.map} +0 -0
  580. /package/dist/{chunk-CEMSIU4Z.js.map → chunk-JTQTWO4D.js.map} +0 -0
  581. /package/dist/{chunk-BASI553K.js.map → chunk-KBTKAAHM.js.map} +0 -0
  582. /package/dist/{chunk-OYOFPNLC.js.map → chunk-KD7VEMWY.js.map} +0 -0
  583. /package/dist/{chunk-3DRLCX5V.js.map → chunk-KPGFGRSA.js.map} +0 -0
  584. /package/dist/{chunk-PLYVGZIN.js.map → chunk-KWFDEJFI.js.map} +0 -0
  585. /package/dist/{chunk-FNXCFIPW.js.map → chunk-KYLEH4OF.js.map} +0 -0
  586. /package/dist/{chunk-WXF2RTS4.js.map → chunk-L7FJTFJN.js.map} +0 -0
  587. /package/dist/{chunk-KI46GKMD.js.map → chunk-L7VVQOSY.js.map} +0 -0
  588. /package/dist/{chunk-O2UPPN5M.js.map → chunk-LKLQVANM.js.map} +0 -0
  589. /package/dist/{chunk-YNTLWCF4.js.map → chunk-LLYEAZ4E.js.map} +0 -0
  590. /package/dist/{chunk-4Z5X7PLC.js.map → chunk-LWM7JUW6.js.map} +0 -0
  591. /package/dist/{chunk-CHU3RDV4.js.map → chunk-LXKV4ND3.js.map} +0 -0
  592. /package/dist/{chunk-AB5IW227.js.map → chunk-LYLICEQO.js.map} +0 -0
  593. /package/dist/{chunk-OTW25A6I.js.map → chunk-M5GRI5K4.js.map} +0 -0
  594. /package/dist/{chunk-X2QJXDE4.js.map → chunk-MF65PKKF.js.map} +0 -0
  595. /package/dist/{chunk-EDDKPIIV.js.map → chunk-MJ4XIOPM.js.map} +0 -0
  596. /package/dist/{chunk-FLWQJDJ5.js.map → chunk-MMPJJQG3.js.map} +0 -0
  597. /package/dist/{chunk-T67LTMSW.js.map → chunk-MOU54FGD.js.map} +0 -0
  598. /package/dist/{chunk-LQKVNREV.js.map → chunk-NAWHQ4IL.js.map} +0 -0
  599. /package/dist/{chunk-ZBHGNE2J.js.map → chunk-NBHBB2VV.js.map} +0 -0
  600. /package/dist/{chunk-U5UGM5XD.js.map → chunk-NMOZDAEZ.js.map} +0 -0
  601. /package/dist/{chunk-D74Z2N4K.js.map → chunk-NZA4R3BE.js.map} +0 -0
  602. /package/dist/{chunk-WRMUXZ7C.js.map → chunk-OB2CX7PJ.js.map} +0 -0
  603. /package/dist/{chunk-YJSCLGAW.js.map → chunk-OB4I4OIT.js.map} +0 -0
  604. /package/dist/{chunk-DWJ6J3YW.js.map → chunk-OKQW2FPL.js.map} +0 -0
  605. /package/dist/{chunk-2GCHGWNE.js.map → chunk-ORLX6A3C.js.map} +0 -0
  606. /package/dist/{chunk-EBTUPRRQ.js.map → chunk-P5N4EYFW.js.map} +0 -0
  607. /package/dist/{chunk-JKL5S7UQ.js.map → chunk-PL4JE3NI.js.map} +0 -0
  608. /package/dist/{chunk-OP2GD6QW.js.map → chunk-PNUHKDY2.js.map} +0 -0
  609. /package/dist/{chunk-MZY3VKKM.js.map → chunk-PWJE7D6V.js.map} +0 -0
  610. /package/dist/{chunk-RISUROBM.js.map → chunk-PYE27I6J.js.map} +0 -0
  611. /package/dist/{chunk-R5QAL43H.js.map → chunk-QIJHK6P4.js.map} +0 -0
  612. /package/dist/{chunk-AJBDAVX3.js.map → chunk-QK3A23NP.js.map} +0 -0
  613. /package/dist/{chunk-CYDXCILL.js.map → chunk-QLWDNAOV.js.map} +0 -0
  614. /package/dist/{chunk-BQYRZIZ7.js.map → chunk-QS6DQBVJ.js.map} +0 -0
  615. /package/dist/{chunk-3PZ3LRPV.js.map → chunk-QSUVFPG3.js.map} +0 -0
  616. /package/dist/{chunk-PYB4BFEC.js.map → chunk-QUC5MLTN.js.map} +0 -0
  617. /package/dist/{chunk-WDASYY4S.js.map → chunk-QVT5AWPI.js.map} +0 -0
  618. /package/dist/{chunk-K4DQS2ML.js.map → chunk-QZC6WCBR.js.map} +0 -0
  619. /package/dist/{chunk-HWVPLFIW.js.map → chunk-RAHNICPP.js.map} +0 -0
  620. /package/dist/{chunk-H6MJFMHZ.js.map → chunk-RME6RGIW.js.map} +0 -0
  621. /package/dist/{chunk-XMBOLFFS.js.map → chunk-RQIB2F53.js.map} +0 -0
  622. /package/dist/{chunk-OXQ2SXVC.js.map → chunk-RUA72NQY.js.map} +0 -0
  623. /package/dist/{chunk-UMX6DZME.js.map → chunk-SCJHWN4X.js.map} +0 -0
  624. /package/dist/{chunk-HTMQGS63.js.map → chunk-SIXBDT5F.js.map} +0 -0
  625. /package/dist/{chunk-ZAX4XQLN.js.map → chunk-SPK3T4JK.js.map} +0 -0
  626. /package/dist/{chunk-WTSQUCHB.js.map → chunk-SSN2YSST.js.map} +0 -0
  627. /package/dist/{chunk-5MIBQ4P5.js.map → chunk-SYJCDX5V.js.map} +0 -0
  628. /package/dist/{chunk-ZR5EKJT6.js.map → chunk-T6276OXI.js.map} +0 -0
  629. /package/dist/{chunk-DEHLWZSI.js.map → chunk-T7OARG4N.js.map} +0 -0
  630. /package/dist/{chunk-77BHKC43.js.map → chunk-TF5L3BEV.js.map} +0 -0
  631. /package/dist/{chunk-GOCODNQS.js.map → chunk-TF6Z7BOP.js.map} +0 -0
  632. /package/dist/{chunk-WIFDNUKD.js.map → chunk-TJDXWZMO.js.map} +0 -0
  633. /package/dist/{chunk-SFIXTOOJ.js.map → chunk-TL5ATBHZ.js.map} +0 -0
  634. /package/dist/{chunk-XZCCEKPW.js.map → chunk-TMOHIOMT.js.map} +0 -0
  635. /package/dist/{chunk-AVXDIRRW.js.map → chunk-UI5X63YC.js.map} +0 -0
  636. /package/dist/{chunk-6QK65ZWM.js.map → chunk-UIY7BDZC.js.map} +0 -0
  637. /package/dist/{chunk-VATYK3JQ.js.map → chunk-UMBFMEO7.js.map} +0 -0
  638. /package/dist/{chunk-UU5FBVRX.js.map → chunk-UU5G7OA4.js.map} +0 -0
  639. /package/dist/{chunk-EGKARC53.js.map → chunk-UZUCYCF4.js.map} +0 -0
  640. /package/dist/{chunk-LPKJ77EK.js.map → chunk-V2A7G7S7.js.map} +0 -0
  641. /package/dist/{chunk-CH4UQ4NO.js.map → chunk-V5G4TKRC.js.map} +0 -0
  642. /package/dist/{chunk-UBRQ3PQD.js.map → chunk-VKAVW34W.js.map} +0 -0
  643. /package/dist/{chunk-JV5ULONH.js.map → chunk-VVLEVNTQ.js.map} +0 -0
  644. /package/dist/{chunk-44JWVYJB.js.map → chunk-VW7X7TWZ.js.map} +0 -0
  645. /package/dist/{chunk-3CDJSKDW.js.map → chunk-VWA2CHSL.js.map} +0 -0
  646. /package/dist/{chunk-IN3VQFKS.js.map → chunk-W43HZPM7.js.map} +0 -0
  647. /package/dist/{chunk-SXGJL7UT.js.map → chunk-WHGD7Q2L.js.map} +0 -0
  648. /package/dist/{chunk-XOIDUM2H.js.map → chunk-WNXKYEVN.js.map} +0 -0
  649. /package/dist/{chunk-TKQL7EDB.js.map → chunk-WSA7UBX4.js.map} +0 -0
  650. /package/dist/{chunk-AJDGP2N4.js.map → chunk-WZ5TQJ3T.js.map} +0 -0
  651. /package/dist/{chunk-FBA2NXYH.js.map → chunk-X3TGNSOG.js.map} +0 -0
  652. /package/dist/{chunk-R4JA5JFI.js.map → chunk-X4WXYI3N.js.map} +0 -0
  653. /package/dist/{chunk-Q5EZNBPI.js.map → chunk-XIQ3AIAJ.js.map} +0 -0
  654. /package/dist/{chunk-S27VZ5DO.js.map → chunk-XWYT4LEL.js.map} +0 -0
  655. /package/dist/{chunk-477DTTMH.js.map → chunk-Y3PU75OC.js.map} +0 -0
  656. /package/dist/{chunk-4JXPLTWV.js.map → chunk-Y5ZWX5YS.js.map} +0 -0
  657. /package/dist/{chunk-4BWMAGJJ.js.map → chunk-YA5PABND.js.map} +0 -0
  658. /package/dist/{chunk-OGU73VUN.js.map → chunk-YBPRR2QS.js.map} +0 -0
  659. /package/dist/{chunk-TNSJFZ6Q.js.map → chunk-YDYR7XQE.js.map} +0 -0
  660. /package/dist/{chunk-GTRAH4FG.js.map → chunk-YG6V2LQH.js.map} +0 -0
  661. /package/dist/{chunk-XVLEBB4Y.js.map → chunk-YUXA7ALE.js.map} +0 -0
  662. /package/dist/{chunk-SN2WENRP.js.map → chunk-YWHQDXPB.js.map} +0 -0
  663. /package/dist/{chunk-BFFNINCC.js.map → chunk-YWRR5R7B.js.map} +0 -0
  664. /package/dist/{chunk-FSDQQQIA.js.map → chunk-YYRK7A4N.js.map} +0 -0
  665. /package/dist/{chunk-MRECRNVU.js.map → chunk-Z26CDLUV.js.map} +0 -0
  666. /package/dist/{chunk-OYCK4JRS.js.map → chunk-Z27EXLMQ.js.map} +0 -0
  667. /package/dist/{chunk-UTRNLNCW.js.map → chunk-Z7GDH7W2.js.map} +0 -0
  668. /package/dist/{chunk-PRT4J2DL.js.map → chunk-ZGVLSAWL.js.map} +0 -0
  669. /package/dist/{chunk-OK7BQMCI.js.map → chunk-ZM6Q5NQN.js.map} +0 -0
  670. /package/dist/{computer-viewer-5LKRCEVQ.js.map → computer-viewer-SROXREYD.js.map} +0 -0
  671. /package/dist/{embedded-new-voice-GHJRY3YL.js.map → embedded-new-voice-EIQY2VBF.js.map} +0 -0
  672. /package/dist/{embedded-voice-ASQXBSTX.js.map → embedded-voice-LMWNH7F7.js.map} +0 -0
  673. /package/dist/{fleet-decision-row-U7LDVBEM.js.map → fleet-decision-row-X2G56ZRA.js.map} +0 -0
  674. /package/dist/{latest-question-RNVF262Q.js.map → latest-question-KA7AQYVI.js.map} +0 -0
  675. /package/dist/{model-policy-picker-menu-E6XKMFTA.js.map → model-policy-picker-menu-SHWPT5VA.js.map} +0 -0
  676. /package/dist/{payment-page-card-DJDKV2LW.js.map → payment-page-card-NNVUISN4.js.map} +0 -0
  677. /package/dist/{platform-activity-row-MSDCSMET.js.map → platform-activity-row-7UDWSAHK.js.map} +0 -0
  678. /package/dist/{queue-surface-implementation-GUAIG6TK.js.map → queue-surface-implementation-BUXSO24N.js.map} +0 -0
  679. /package/dist/{recorder-host-2MYDJPQW.js.map → recorder-host-POX54CFT.js.map} +0 -0
  680. /package/dist/{sandbox-files-W5W2LW4K.js.map → sandbox-files-33QD7DW2.js.map} +0 -0
  681. /package/dist/{session-connect-cards-HPH7JOZP.js.map → session-connect-cards-CXGNVA2A.js.map} +0 -0
  682. /package/dist/{session-realtime-SDTKFFIR.js.map → session-realtime-CVDSEULB.js.map} +0 -0
  683. /package/dist/{timeline-annotation-markers-FNILLWNU.js.map → timeline-annotation-markers-5J5TM5IP.js.map} +0 -0
  684. /package/dist/{timeline-annotation-selection-MBCIDO2Q.js.map → timeline-annotation-selection-WLY7FB7F.js.map} +0 -0
  685. /package/dist/{timeline-annotations-dialog-JPNKLOTE.js.map → timeline-annotations-dialog-67VRFKJU.js.map} +0 -0
@@ -2482,6 +2482,184 @@ export function sessionStatusFromEvents(events: SessionEvent[]): SessionStatus |
2482
2482
  return null;
2483
2483
  }
2484
2484
 
2485
+ /**
2486
+ * A span in which the session's work was paused: by Pause of the chat, of
2487
+ * an ancestor, or of the workspace. An open span (no `endedAt`) is a pause
2488
+ * still in force.
2489
+ */
2490
+ export type TimelinePauseSpan = { startedAt: string; endedAt?: string };
2491
+
2492
+ /**
2493
+ * The host's live view of the session's Pause, from its effective control.
2494
+ * `since` is when the pause in force began, when known. `resumedAt` is when
2495
+ * the host saw the pause end, for a resume whose events have not arrived.
2496
+ */
2497
+ export type TimelineLivePause = {
2498
+ paused: boolean;
2499
+ since?: string | null | undefined;
2500
+ resumedAt?: string | null | undefined;
2501
+ };
2502
+
2503
+ /** Interruption reasons that park a turn for Resume rather than end it. */
2504
+ const PAUSE_INTERRUPTION_REASONS: ReadonlySet<unknown> = new Set([
2505
+ "session_pause",
2506
+ "workspace_pause",
2507
+ ]);
2508
+
2509
+ type LivePauseBlocker = { changedAt?: string | null | undefined };
2510
+
2511
+ /**
2512
+ * The live pause from an effective session control; undefined when it is
2513
+ * unknown. A pause in force since several blockers took hold began with the
2514
+ * earliest of them.
2515
+ */
2516
+ export function timelineLivePause(
2517
+ control:
2518
+ | {
2519
+ state: string;
2520
+ primaryBlocker?: LivePauseBlocker | null | undefined;
2521
+ blockers?: readonly LivePauseBlocker[] | null | undefined;
2522
+ }
2523
+ | null
2524
+ | undefined,
2525
+ ): TimelineLivePause | undefined {
2526
+ if (!control) return undefined;
2527
+ if (control.state !== "paused") return { paused: false };
2528
+ let since: string | null = null;
2529
+ for (const blocker of [control.primaryBlocker, ...(control.blockers ?? [])]) {
2530
+ const changedAt = blocker?.changedAt;
2531
+ if (changedAt && (since === null || Date.parse(changedAt) < Date.parse(since)))
2532
+ since = changedAt;
2533
+ }
2534
+ return { paused: true, since };
2535
+ }
2536
+
2537
+ /** Events that start or end a pause span. */
2538
+ const PAUSE_EVENT_TYPES: ReadonlySet<string> = new Set([
2539
+ "session.control.paused",
2540
+ "session.control.resumed",
2541
+ "turn.recovery.requested",
2542
+ "session.status.changed",
2543
+ "turn.started",
2544
+ ]);
2545
+
2546
+ /**
2547
+ * When the session's work was paused, from its events and (when the host
2548
+ * knows it) its live control.
2549
+ *
2550
+ * Pause parks the running turn for Resume instead of ending it, so the turn
2551
+ * stays open. A direct Pause records `session.control.paused`; a Pause of an
2552
+ * ancestor or of the workspace reaches the chat only as the interruption
2553
+ * (`turn.recovery.requested` with a pause reason) and the parked idle status.
2554
+ * Work resumes with `session.control.resumed`, or when the turn runs again.
2555
+ * A wait that a pause held without interrupting anything has no events at
2556
+ * all, so the live control decides whether a pause is in force now, and
2557
+ * `observed` carries pauses the host saw begin and end only through it.
2558
+ */
2559
+ export function timelinePauseSpans(
2560
+ events: readonly SessionEvent[],
2561
+ live?: TimelineLivePause | null,
2562
+ observed: readonly TimelinePauseSpan[] = [],
2563
+ ): TimelinePauseSpan[] {
2564
+ let latest: SessionEvent | undefined;
2565
+ const relevant: SessionEvent[] = [];
2566
+ for (const event of events) {
2567
+ if (!latest || event.sequence > latest.sequence) latest = event;
2568
+ if (PAUSE_EVENT_TYPES.has(event.type)) relevant.push(event);
2569
+ }
2570
+ relevant.sort((left, right) => left.sequence - right.sequence);
2571
+ const spans: TimelinePauseSpan[] = [];
2572
+ let open: TimelinePauseSpan | null = null;
2573
+ // Cancel also leaves the control paused while the turn winds down; that is
2574
+ // not a pause of the work, which is ending.
2575
+ let cancelling = false;
2576
+ for (const event of relevant) {
2577
+ const payload = asRecord(event.payload);
2578
+ if (
2579
+ (event.type === "session.control.paused" && payload.terminal === true) ||
2580
+ // A parent's Cancel reaches its sub-chats as their status alone.
2581
+ (event.type === "session.status.changed" && payload.status === "cancelled")
2582
+ ) {
2583
+ cancelling = true;
2584
+ continue;
2585
+ }
2586
+ const starts =
2587
+ event.type === "session.control.paused" ||
2588
+ (event.type === "turn.recovery.requested" &&
2589
+ PAUSE_INTERRUPTION_REASONS.has(payload.reason)) ||
2590
+ (event.type === "session.status.changed" &&
2591
+ payload.status === "idle" &&
2592
+ payload.reason === "paused_recovery_settled");
2593
+ if (starts) {
2594
+ open ??= { startedAt: event.occurredAt };
2595
+ continue;
2596
+ }
2597
+ if (
2598
+ event.type === "session.control.resumed" ||
2599
+ event.type === "turn.started" ||
2600
+ (event.type === "session.status.changed" && payload.status === "running")
2601
+ ) {
2602
+ cancelling = false;
2603
+ if (open) {
2604
+ spans.push({ startedAt: open.startedAt, endedAt: event.occurredAt });
2605
+ open = null;
2606
+ }
2607
+ }
2608
+ }
2609
+ const latestAt = latest?.occurredAt;
2610
+ if (live?.paused && !cancelling) {
2611
+ const startedAt = open?.startedAt ?? live.since ?? latestAt;
2612
+ if (startedAt) spans.push({ startedAt });
2613
+ } else if (open) {
2614
+ if (live) {
2615
+ // The host already sees the session running again; its resume events
2616
+ // are still on their way. End the pause when the host saw it end.
2617
+ const endedAt = live.resumedAt ?? latestAt ?? open.startedAt;
2618
+ spans.push({
2619
+ startedAt: open.startedAt,
2620
+ endedAt: Date.parse(endedAt) > Date.parse(open.startedAt) ? endedAt : open.startedAt,
2621
+ });
2622
+ } else {
2623
+ spans.push(open);
2624
+ }
2625
+ }
2626
+ // A pause seen only through the live control, by the host's clock; skip it
2627
+ // where the events record the same pause.
2628
+ const recorded = [...spans];
2629
+ for (const span of observed) {
2630
+ if (!span.endedAt) continue;
2631
+ const start = Date.parse(span.startedAt);
2632
+ const end = Date.parse(span.endedAt);
2633
+ const overlaps = recorded.some(
2634
+ (other) =>
2635
+ Date.parse(other.startedAt) < end &&
2636
+ (other.endedAt === undefined || Date.parse(other.endedAt) > start),
2637
+ );
2638
+ if (!overlaps) spans.push(span);
2639
+ }
2640
+ return spans;
2641
+ }
2642
+
2643
+ /** Total length of the union of intervals, each clipped to `[from, to)`. */
2644
+ function unionLength(
2645
+ intervals: ReadonlyArray<readonly [number, number]>,
2646
+ from: number,
2647
+ to: number,
2648
+ ): number {
2649
+ const clipped = intervals
2650
+ .map(([start, end]) => [Math.max(start, from), Math.min(end, to)] as const)
2651
+ .filter(([start, end]) => Number.isFinite(start) && Number.isFinite(end) && end > start)
2652
+ .sort((left, right) => left[0] - right[0]);
2653
+ let total = 0;
2654
+ let cursor = Number.NEGATIVE_INFINITY;
2655
+ for (const [start, end] of clipped) {
2656
+ const begin = Math.max(start, cursor);
2657
+ if (end > begin) total += end - begin;
2658
+ cursor = Math.max(cursor, end);
2659
+ }
2660
+ return total;
2661
+ }
2662
+
2485
2663
  /* ----------------------------------------------------------------------------
2486
2664
  Visual grouping: consecutive activity items (reasoning / tools / workers /
2487
2665
  sandbox) cluster into collapsible blocks. Once a turn settles, the full
@@ -2549,6 +2727,12 @@ export type GroupTimelineOptions = {
2549
2727
  readableTurns?: boolean;
2550
2728
  /** @deprecated Use readableTurns. Cross-turn exchange folding has been removed. */
2551
2729
  foldExchanges?: boolean;
2730
+ /**
2731
+ * When the session was paused ({@link timelinePauseSpans}). A readable
2732
+ * turn still open under a pause in force reads as paused, and paused time
2733
+ * is not counted as work.
2734
+ */
2735
+ pauses?: readonly TimelinePauseSpan[];
2552
2736
  };
2553
2737
 
2554
2738
  export function groupTimeline(
@@ -2556,7 +2740,8 @@ export function groupTimeline(
2556
2740
  items: TimelineItem[],
2557
2741
  options: GroupTimelineOptions = {},
2558
2742
  ): TimelineGroup[] {
2559
- if (options.readableTurns || options.foldExchanges) return groupReadableTurns(t, items);
2743
+ if (options.readableTurns || options.foldExchanges)
2744
+ return groupReadableTurns(t, items, options.pauses ?? []);
2560
2745
  const groups: TimelineGroup[] = [];
2561
2746
  for (const item of items) {
2562
2747
  // A recovered capacity wait is over; it leaves no warning behind.
@@ -2585,7 +2770,11 @@ export function groupTimeline(
2585
2770
  }
2586
2771
 
2587
2772
  /** Live prose stays primary; settled progress joins its own turn's work history. */
2588
- function groupReadableTurns(t: OpenGeniText, items: TimelineItem[]): TimelineGroup[] {
2773
+ function groupReadableTurns(
2774
+ t: OpenGeniText,
2775
+ items: TimelineItem[],
2776
+ pauses: readonly TimelinePauseSpan[],
2777
+ ): TimelineGroup[] {
2589
2778
  type Work = Extract<TimelineGroup, { kind: "activity" }>;
2590
2779
  let groups: TimelineGroup[] = [];
2591
2780
  const turns = new Map<string, Work>();
@@ -2721,12 +2910,12 @@ function groupReadableTurns(t: OpenGeniText, items: TimelineItem[]): TimelineGro
2721
2910
  group.work!.details.push({ kind: "activity", id: `work-item-${item.id}`, items: [item] });
2722
2911
  delete group.work!.waiting;
2723
2912
  } else if (item.kind === "notice" && item.capacityWait) {
2724
- const pauses = idleSpans.get(key) ?? [];
2725
- pauses.push({
2913
+ const idle = idleSpans.get(key) ?? [];
2914
+ idle.push({
2726
2915
  startedAt: item.occurredAt,
2727
2916
  ...(item.resolvedAt ? { endedAt: item.resolvedAt } : {}),
2728
2917
  });
2729
- idleSpans.set(key, pauses);
2918
+ idleSpans.set(key, idle);
2730
2919
  if (!item.resolvedAt) {
2731
2920
  if (settlements.has(key)) groups.push({ kind: "item", item });
2732
2921
  else {
@@ -2842,6 +3031,7 @@ function groupReadableTurns(t: OpenGeniText, items: TimelineItem[]): TimelineGro
2842
3031
  ? t("timeline.projection.waitingForYou")
2843
3032
  : t("timeline.projection.waiting"),
2844
3033
  since: item.occurredAt,
3034
+ ...(item.approval === true ? { waitingOn: "you" as const } : {}),
2845
3035
  };
2846
3036
  } else if (
2847
3037
  item.kind === "session-status" &&
@@ -2852,6 +3042,7 @@ function groupReadableTurns(t: OpenGeniText, items: TimelineItem[]): TimelineGro
2852
3042
  current.waiting = {
2853
3043
  label: t("timeline.projection.waitingForYou"),
2854
3044
  since: item.occurredAt,
3045
+ waitingOn: "you",
2855
3046
  };
2856
3047
  } else if (
2857
3048
  item.kind === "session-status" &&
@@ -2890,17 +3081,38 @@ function groupReadableTurns(t: OpenGeniText, items: TimelineItem[]): TimelineGro
2890
3081
  untimed: true,
2891
3082
  };
2892
3083
  }
2893
- const pausedMs = (idleSpans.get(key) ?? []).reduce((total, pause) => {
2894
- if (!pause.endedAt) return total;
2895
- const start = Math.max(Date.parse(work.startedAt), Date.parse(pause.startedAt));
2896
- const end = Math.min(
2897
- work.endedAt ? Date.parse(work.endedAt) : Number.POSITIVE_INFINITY,
2898
- Date.parse(pause.endedAt),
2899
- );
2900
- return Number.isFinite(start) && Number.isFinite(end) && end > start
2901
- ? total + end - start
2902
- : total;
2903
- }, 0);
3084
+ const workStart = Date.parse(work.startedAt);
3085
+ const workEnd = work.endedAt ? Date.parse(work.endedAt) : Number.POSITIVE_INFINITY;
3086
+ // A pause still in force over this open turn: the turn is parked for
3087
+ // Resume, so it reads as paused and its clock stops when the pause began.
3088
+ // A wait on the person (an approval, a question) keeps saying so.
3089
+ const openPause =
3090
+ work.endedAt || work.waiting?.waitingOn === "you"
3091
+ ? undefined
3092
+ : pauses.find((pause) => !pause.endedAt && Date.parse(pause.startedAt) < workEnd);
3093
+ const pausedAt = openPause
3094
+ ? Math.max(workStart, Date.parse(openPause.startedAt))
3095
+ : Number.POSITIVE_INFINITY;
3096
+ if (openPause && Number.isFinite(pausedAt)) {
3097
+ work.pausedAt = new Date(pausedAt).toISOString();
3098
+ delete work.waiting;
3099
+ }
3100
+ // Capacity waits, failed-attempt gaps and pauses can overlap; their union
3101
+ // is time the agent was not working. A span still open runs to the end of
3102
+ // the work (a turn cancelled while paused) or to the pause that stopped
3103
+ // its clock; on a turn still running it has no end yet and counts later.
3104
+ const until = Math.min(workEnd, pausedAt);
3105
+ const pausedMs = unionLength(
3106
+ [...(idleSpans.get(key) ?? []), ...pauses].flatMap((span) =>
3107
+ span.endedAt
3108
+ ? [[Date.parse(span.startedAt), Date.parse(span.endedAt)] as const]
3109
+ : Number.isFinite(until)
3110
+ ? [[Date.parse(span.startedAt), until] as const]
3111
+ : [],
3112
+ ),
3113
+ workStart,
3114
+ until,
3115
+ );
2904
3116
  if (pausedMs > 0) work.pausedMs = pausedMs;
2905
3117
  }
2906
3118
  groups = groups.filter((entry) => {
@@ -81,10 +81,11 @@ export type TurnSummaryOptions = Readonly<{
81
81
 
82
82
  /**
83
83
  * Exchange status shown in place of the plain facet line. `working` and
84
- * `waiting` run a live clock from `since`; `worked` shows the settled span.
84
+ * `waiting` run a live clock from `since`; `worked` shows the settled span;
85
+ * `paused` shows the work done before the pause, with its clock stopped.
85
86
  */
86
87
  export type TurnSummaryStatus = Readonly<{
87
- kind: "working" | "waiting" | "worked";
88
+ kind: "working" | "waiting" | "worked" | "paused";
88
89
  /** Replaces the default "Working" / "Waiting" wording. */
89
90
  label?: string | undefined;
90
91
  /** Who the wait is on: `you` when it needs the reader. */
@@ -93,7 +94,7 @@ export type TurnSummaryStatus = Readonly<{
93
94
  updates?: number | undefined;
94
95
  /** Live clock start for `working` and `waiting`. */
95
96
  since?: string | undefined;
96
- /** Settled span for `worked`. */
97
+ /** Settled span for `worked`; work done before the pause for `paused`. */
97
98
  durationMs?: number | undefined;
98
99
  /** Live step preview under the row while it is collapsed. */
99
100
  preview?: ReactNode;
@@ -597,8 +597,9 @@ export function TurnSummary({
597
597
  }
598
598
 
599
599
  /**
600
- * "Working · 2m 14s", "Waiting for 2 agents · 3m 5s", or "Worked for 4m 10s";
601
- * null when a settled span is too short to state.
600
+ * "Working · 2m 14s", "Waiting for 2 agents · 3m 5s", "Paused · 2m 14s" (its
601
+ * clock stopped), or "Worked for 4m 10s"; null when a settled span is too
602
+ * short to state.
602
603
  */
603
604
  function turnSummaryStatusLine(t: OpenGeniText, status: TurnSummaryStatus): ReactNode {
604
605
  if (status.kind === "worked") {
@@ -610,6 +611,18 @@ function turnSummaryStatusLine(t: OpenGeniText, status: TurnSummaryStatus): Reac
610
611
  </span>
611
612
  ) : null;
612
613
  }
614
+ if (status.kind === "paused") {
615
+ return (
616
+ <span data-og-exchange-status="paused">
617
+ {status.label ?? t("timeline.turnSummary.paused")}
618
+ {status.durationMs !== undefined &&
619
+ Number.isFinite(status.durationMs) &&
620
+ status.durationMs >= 1000 ? (
621
+ <span className="tabular-nums">{` · ${formatElapsed(t, status.durationMs)}`}</span>
622
+ ) : null}
623
+ </span>
624
+ );
625
+ }
613
626
  const label =
614
627
  status.label ??
615
628
  (status.kind === "working"
@@ -782,10 +782,16 @@ export type TimelineGroup =
782
782
  /**
783
783
  * Settled time inside this work span in which the agent was not
784
784
  * working: capacity waits, and the gap between a failed attempt and
785
- * the Retry that reopened the turn. The worked duration and the live
786
- * working clock exclude it.
785
+ * the Retry that reopened the turn, and settled pauses. The worked
786
+ * duration and the live working clock exclude it.
787
787
  */
788
788
  pausedMs?: number;
789
+ /**
790
+ * Set while a pause is in force over this still-open turn: when it
791
+ * began. Pause parks the turn for Resume, so it reads as paused with
792
+ * its clock stopped here, not as working.
793
+ */
794
+ pausedAt?: string;
789
795
  details: TimelineGroup[];
790
796
  /**
791
797
  * While the turn is live, its progress notes stay readable above the
@@ -0,0 +1,105 @@
1
+ import type { SessionEvent } from "@opengeni/sdk";
2
+ import { useMemo, useState } from "react";
3
+ import { timelinePauseSpans, type TimelineLivePause, type TimelinePauseSpan } from "./projection";
4
+
5
+ /** At most this many pauses seen only through the live control are kept. */
6
+ const OBSERVED_PAUSE_LIMIT = 20;
7
+
8
+ type LivePauseHistory = {
9
+ sessionId: string | null;
10
+ /** The live pause as last rendered; undefined while it is unknown. */
11
+ live: boolean | undefined;
12
+ /** The last known pause state: a brief unknown does not forget a pause. */
13
+ paused: boolean | undefined;
14
+ /** When the pause in force began, as best known. */
15
+ since: string | null;
16
+ /** When this view saw the latest pause end. */
17
+ resumedAt: string | null;
18
+ /** Pauses this view saw begin and end. */
19
+ observed: TimelinePauseSpan[];
20
+ };
21
+
22
+ function nextHistory(
23
+ previous: LivePauseHistory | null,
24
+ sessionId: string | null,
25
+ paused: boolean | undefined,
26
+ since: string | null,
27
+ now: string,
28
+ ): LivePauseHistory {
29
+ if (!previous || previous.sessionId !== sessionId) {
30
+ return {
31
+ sessionId,
32
+ live: paused,
33
+ paused,
34
+ since: paused ? (since ?? now) : null,
35
+ resumedAt: null,
36
+ observed: [],
37
+ };
38
+ }
39
+ if (paused === undefined) return { ...previous, live: paused };
40
+ if (previous.paused === true && paused === false) {
41
+ return {
42
+ ...previous,
43
+ live: paused,
44
+ paused,
45
+ since: null,
46
+ resumedAt: now,
47
+ observed: [...previous.observed, { startedAt: previous.since ?? now, endedAt: now }].slice(
48
+ -OBSERVED_PAUSE_LIMIT,
49
+ ),
50
+ };
51
+ }
52
+ if (paused === true && previous.paused !== true) {
53
+ return { ...previous, live: paused, paused, since: since ?? now, resumedAt: null };
54
+ }
55
+ return { ...previous, live: paused, paused };
56
+ }
57
+
58
+ /**
59
+ * The session's pause spans for `groupTimeline`, from its events and its live
60
+ * pause (`timelineLivePause(session.effectiveControl)`).
61
+ *
62
+ * A pause that held a waiting turn, or an ancestor's pause of a turn it did
63
+ * not interrupt, leaves no events, so this view remembers the pauses it saw
64
+ * through the live control. It also notes the moment it saw a pause end, so
65
+ * the paused time never counts as work while the resume's events arrive.
66
+ */
67
+ export function useTimelinePauses(
68
+ events: readonly SessionEvent[] | undefined,
69
+ pause: TimelineLivePause | null | undefined,
70
+ enabled = true,
71
+ ): TimelinePauseSpan[] {
72
+ const paused = pause?.paused;
73
+ const since = pause?.since ?? null;
74
+ const sessionId = events?.[0]?.sessionId ?? null;
75
+ const [stored, setStored] = useState<LivePauseHistory | null>(null);
76
+ let history = stored;
77
+ if (!history || history.sessionId !== sessionId || history.live !== paused) {
78
+ // Derived during render so the first render after a flip is already right.
79
+ history = nextHistory(stored, sessionId, paused, since, new Date().toISOString());
80
+ setStored(history);
81
+ }
82
+ // While the control is briefly unknown, the last known pause stays in force.
83
+ const livePaused = paused ?? (history.paused === true ? true : undefined);
84
+ const historySince = history.since;
85
+ const historyResumedAt = history.resumedAt;
86
+ const observed = history.observed;
87
+ const resumedAt = pause?.resumedAt ?? null;
88
+ return useMemo(
89
+ () =>
90
+ enabled
91
+ ? timelinePauseSpans(
92
+ events ?? [],
93
+ livePaused === undefined
94
+ ? undefined
95
+ : {
96
+ paused: livePaused,
97
+ since: since ?? historySince,
98
+ resumedAt: resumedAt ?? historyResumedAt,
99
+ },
100
+ observed,
101
+ )
102
+ : [],
103
+ [enabled, events, livePaused, since, historySince, resumedAt, historyResumedAt, observed],
104
+ );
105
+ }
@@ -92,6 +92,7 @@ export function isPreparingWork(group: ActivityGroup, options: ReadableWorkOptio
92
92
  !options.startupDismissed &&
93
93
  !group.work.endedAt &&
94
94
  !group.work.waiting &&
95
+ !group.work.pausedAt &&
95
96
  phases.length > 0 &&
96
97
  group.items.every(
97
98
  (item) => item.kind === "startup-phase" || (item.kind === "reasoning" && !item.text.trim()),
@@ -132,9 +133,10 @@ export function readableWorkHasDetails(
132
133
  /**
133
134
  * Status of a readable turn's work row, minus the host-rendered live preview.
134
135
  * Time spent waiting for model capacity, or between a failed attempt and its
135
- * Retry, is not work: the worked duration and the live working clock exclude
136
- * it, and a capacity wait itself shows no clock. A
137
- * wait's `detail` is its one quiet secondary line.
136
+ * Retry, or paused, is not work: the worked duration and the live working
137
+ * clock exclude it, and a capacity wait itself shows no clock. A turn parked
138
+ * by a pause still in force reads as paused, its clock stopped where the
139
+ * pause began. A wait's `detail` is its one quiet secondary line.
138
140
  */
139
141
  export function readableWorkStatus(
140
142
  t: OpenGeniText,
@@ -157,8 +159,15 @@ export function readableWorkStatus(
157
159
  durationMs: durationMs === undefined ? undefined : Math.max(0, durationMs - pausedMs),
158
160
  };
159
161
  }
162
+ if (group.work.pausedAt) {
163
+ const durationMs = durationBetween(group.work.startedAt, group.work.pausedAt);
164
+ return {
165
+ kind: "paused",
166
+ durationMs: durationMs === undefined ? undefined : Math.max(0, durationMs - pausedMs),
167
+ };
168
+ }
160
169
  if (group.work.waiting) {
161
- const { untimed, since, ...waiting } = group.work.waiting;
170
+ const { untimed, since, waitingOn: _waitingOn, ...waiting } = group.work.waiting;
162
171
  return { kind: "waiting", ...waiting, ...(untimed ? {} : { since }) };
163
172
  }
164
173
  const started = Date.parse(group.work.startedAt);
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/lib/session-branch-cache.tsx"],"sourcesContent":["import type { Session as SessionDetails } from \"../types\";\nimport type { RailSession as Session } from \"./session-list-entry\";\n\nimport { mergeSessionForRail } from \"./sessions-group\";\n\nexport type SessionBranchPage<T extends Session = SessionDetails> = {\n sessions: T[];\n /** Per-row causal generations for rows returned by accepted branch reads. */\n channelGenerations: ReadonlyMap<string, number>;\n nextCursor: string | null;\n loading: boolean;\n /** Whether this load cycle may paint loading or retry feedback in the tree. */\n feedbackVisible: boolean;\n failed: boolean;\n stale: boolean;\n requestId: number | null;\n retryCursor: string | null;\n};\n\nexport type SessionBranchSummaryDecision = {\n acknowledge: boolean;\n refresh: boolean;\n markStale: boolean;\n};\n\n/**\n * Stable summary of the server-owned descendant facts that make an already\n * loaded branch stale. Child creation changes direct/total counts; lifecycle\n * changes advance the status aggregates. Title/content stays owned by the\n * child page or active route projection.\n */\nexport function sessionBranchSummaryKey(session: Session, readRevision = 0): string {\n const stats = session.treeStats;\n if (!stats) return `${session.id}:${session.updatedAt}:unknown:${readRevision}`;\n return [\n readRevision,\n session.id,\n session.updatedAt,\n stats.directChildren,\n stats.totalDescendants,\n stats.runningDescendants,\n stats.queuedDescendants,\n stats.attentionDescendants,\n stats.pausedDescendants,\n stats.failedDescendants,\n stats.unreadFailedDescendants ?? stats.failedDescendants,\n stats.unreadDescendants ?? 0,\n stats.activelyWorkingDescendants ?? 0,\n stats.attentionSince ?? \"\",\n stats.truncated ? 1 : 0,\n ].join(\":\");\n}\n\n/**\n * Persist a route/lineage child in its already-loaded parent branch. The route\n * owns current lifecycle/content while the cached row retains rail ordering\n * timestamps and may own treeStats.\n */\nexport function upsertSessionBranchChild(\n pages: ReadonlyMap<string, SessionBranchPage<SessionDetails>>,\n child: SessionDetails,\n): ReadonlyMap<string, SessionBranchPage<SessionDetails>>;\nexport function upsertSessionBranchChild<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n child: T,\n): ReadonlyMap<string, SessionBranchPage<T>>;\nexport function upsertSessionBranchChild<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n child: T,\n): ReadonlyMap<string, SessionBranchPage<T>> {\n const parentSessionId = child.parentSessionId;\n if (!parentSessionId) return pages;\n const page = pages.get(parentSessionId);\n const sessions = page?.sessions ?? [];\n const index = sessions.findIndex((session) => session.id === child.id);\n const nextSessions = [...sessions];\n if (index === -1) {\n nextSessions.push(child);\n } else {\n const cached = sessions[index]!;\n const merged = {\n ...mergeSessionForRail(cached, child),\n // Route/detail timestamps can be millisecond-truncated or ahead of the\n // list activity clock. Only a branch-page commit replaces rail ordering.\n createdAt: cached.createdAt,\n updatedAt: cached.updatedAt,\n };\n nextSessions[index] = page?.channelGenerations.has(child.id)\n ? { ...merged, channelId: cached.channelId ?? null }\n : merged;\n }\n return new Map(pages).set(parentSessionId, {\n sessions: nextSessions,\n channelGenerations: page?.channelGenerations ?? new Map(),\n nextCursor: page?.nextCursor ?? null,\n loading: page?.loading ?? false,\n feedbackVisible: page?.feedbackVisible ?? false,\n failed: page?.failed ?? false,\n stale: page?.stale ?? false,\n requestId: page?.requestId ?? null,\n retryCursor: page?.retryCursor ?? null,\n });\n}\n\n/** Mark one exact branch request active without discarding loaded children. */\nexport function beginSessionBranchRequest<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n parentSessionId: string,\n requestId: number,\n cursor?: string,\n options: { feedbackVisible?: boolean | undefined } = {},\n): ReadonlyMap<string, SessionBranchPage<T>> {\n const previous = pages.get(parentSessionId);\n return new Map(pages).set(parentSessionId, {\n sessions: previous?.sessions ?? [],\n channelGenerations: previous?.channelGenerations ?? new Map(),\n nextCursor: previous?.nextCursor ?? null,\n loading: true,\n feedbackVisible: options.feedbackVisible ?? true,\n failed: false,\n stale: false,\n requestId,\n retryCursor: cursor ?? null,\n });\n}\n\n/** Refresh the already-loaded window with bounded, opaque-cursor reads. */\nexport async function readLoadedSessionBranchWindow<T extends Session = SessionDetails>(\n readPage: (cursor?: string) => Promise<{ sessions: T[]; pinned: T[]; nextCursor: string | null }>,\n minimumCount: number,\n initialCursor?: string,\n): Promise<{ sessions: T[]; nextCursor: string | null }> {\n const sessions = new Map<string, T>();\n const seen = new Set<string>();\n let cursor = initialCursor;\n for (let reads = 0; reads <= Math.max(1, minimumCount); reads += 1) {\n const page = await readPage(cursor);\n for (const session of [...page.sessions, ...page.pinned]) sessions.set(session.id, session);\n if (!page.nextCursor || sessions.size >= minimumCount) {\n return { sessions: [...sessions.values()], nextCursor: page.nextCursor };\n }\n if (seen.has(page.nextCursor)) throw new Error(\"Child pagination cursor repeated\");\n seen.add(page.nextCursor);\n cursor = page.nextCursor;\n }\n throw new Error(\"Child pagination made no progress\");\n}\n\n/** Commit one server child page or a fully refreshed loaded window. */\nexport function commitSessionBranchPage(\n pages: ReadonlyMap<string, SessionBranchPage<SessionDetails>>,\n parentSessionId: string,\n input: { sessions: readonly SessionDetails[]; nextCursor: string | null },\n options?: {\n append?: boolean | undefined;\n replaceWindow?: boolean | undefined;\n preserve?: readonly SessionDetails[] | undefined;\n requestId?: number | undefined;\n readGeneration?: number | undefined;\n },\n): ReadonlyMap<string, SessionBranchPage<SessionDetails>>;\nexport function commitSessionBranchPage<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n parentSessionId: string,\n input: { sessions: readonly T[]; nextCursor: string | null },\n options?: {\n append?: boolean | undefined;\n replaceWindow?: boolean | undefined;\n preserve?: readonly T[] | undefined;\n requestId?: number | undefined;\n readGeneration?: number | undefined;\n },\n): ReadonlyMap<string, SessionBranchPage<T>>;\nexport function commitSessionBranchPage<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n parentSessionId: string,\n input: { sessions: readonly T[]; nextCursor: string | null },\n options: {\n append?: boolean | undefined;\n replaceWindow?: boolean | undefined;\n preserve?: readonly T[] | undefined;\n requestId?: number | undefined;\n readGeneration?: number | undefined;\n } = {},\n): ReadonlyMap<string, SessionBranchPage<T>> {\n const previous = pages.get(parentSessionId);\n if (options.requestId !== undefined && previous?.requestId !== options.requestId) return pages;\n const merged = new Map<string, T>();\n const channelGenerations = options.append\n ? new Map(previous?.channelGenerations ?? [])\n : new Map<string, number>();\n if (options.append) {\n for (const session of [\n ...(previous?.sessions ?? []),\n ...(options.preserve ?? []),\n ...input.sessions,\n ]) {\n merged.set(session.id, session);\n }\n } else {\n // A refreshed first page owns the leading order. Retain already-loaded\n // tail entries (including an active child outside the first 50) behind it.\n for (const session of input.sessions) merged.set(session.id, session);\n for (const session of [\n ...(options.replaceWindow ? [] : (previous?.sessions ?? [])),\n ...(options.preserve ?? []),\n ]) {\n if (!merged.has(session.id)) merged.set(session.id, session);\n }\n }\n const readGeneration = options.readGeneration ?? 0;\n if (readGeneration > 0) {\n for (const session of input.sessions) {\n channelGenerations.set(session.id, readGeneration);\n }\n }\n return new Map(pages).set(parentSessionId, {\n sessions: [...merged.values()],\n channelGenerations,\n nextCursor: input.nextCursor,\n loading: false,\n feedbackVisible: false,\n failed: false,\n stale: false,\n requestId: null,\n retryCursor: null,\n });\n}\n\n/** Current branch rows that may own channel filing, with their actual read starts. */\nexport function authoritativeSessionBranchChannels<T extends Session = SessionDetails>(\n page: SessionBranchPage<T>,\n): Array<readonly [session: T, readGeneration: number]> {\n const byId = new Map(page.sessions.map((session) => [session.id, session]));\n const evidence: Array<readonly [session: T, readGeneration: number]> = [];\n for (const [sessionId, readGeneration] of page.channelGenerations) {\n const session = byId.get(sessionId);\n if (session && readGeneration > 0) evidence.push([session, readGeneration]);\n }\n return evidence;\n}\n\n/** Fail only the still-current request and expose its exact retry cursor. */\nexport function failSessionBranchRequest<T extends Session = SessionDetails>(\n pages: ReadonlyMap<string, SessionBranchPage<T>>,\n parentSessionId: string,\n requestId: number,\n): ReadonlyMap<string, SessionBranchPage<T>> {\n const previous = pages.get(parentSessionId);\n if (!previous || previous.requestId !== requestId) return pages;\n return new Map(pages).set(parentSessionId, {\n ...previous,\n loading: false,\n // Background hydration may suppress transient loading feedback, but a\n // failure must become actionable instead of leaving the branch silently\n // incomplete for the rest of the active route.\n feedbackVisible: true,\n failed: true,\n stale: false,\n requestId: null,\n });\n}\n\n/** A fresh cached page already owns the active child's parent branch. */\nexport function sessionBranchNeedsHydration<T extends Session = SessionDetails>(\n page: SessionBranchPage<T> | undefined,\n): boolean {\n return page === undefined || page.failed || page.stale;\n}\n\n/** Decide whether a changed parent summary can be acknowledged right now. */\nexport function sessionBranchSummaryDecision(input: {\n previousKey: string | undefined;\n nextKey: string;\n loading: boolean;\n expanded: boolean;\n stale: boolean;\n}): SessionBranchSummaryDecision {\n if (input.loading) {\n return {\n acknowledge: input.previousKey === input.nextKey,\n refresh: false,\n markStale: false,\n };\n }\n if (input.previousKey === undefined || input.previousKey === input.nextKey) {\n return { acknowledge: true, refresh: false, markStale: false };\n }\n return {\n acknowledge: true,\n refresh: input.expanded,\n markStale: !input.expanded && !input.stale,\n };\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/timeline-annotations.tsx"],"sourcesContent":["import type { TimelineAnnotationSource } from \"@opengeni/sdk\";\nimport { QuoteIcon, XIcon } from \"lucide-react\";\nimport {\n Suspense,\n lazy,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n type RefObject,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n AnnotationAccentRow,\n AnnotationNotePreview,\n AnnotationQuoteSourceButton,\n type TimelineAnnotationLike,\n} from \"./timeline-annotation-chrome\";\nimport { ANNOTATION_CARD_STACK_SCROLL_AT } from \"./timeline-annotation-layout\";\nimport {\n TimelineAnnotationSourceRootContext,\n useTimelineAnnotationSourceRoot,\n} from \"./timeline-annotation-reveal-context\";\nimport {\n annotationDisplayOrdinal,\n annotationHasNote,\n resolveAnnotationRevealRoot,\n} from \"./timeline-annotation-shared\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\nexport type { TimelineAnnotationLike } from \"./timeline-annotation-chrome\";\n\nconst TimelineAnnotationsDialog = lazy(() => import(\"./timeline-annotations-dialog\"));\n\nfunction AnnotationSourceRootBridge({\n triggerRef,\n children,\n}: {\n triggerRef: RefObject<HTMLElement | null>;\n children: ReactNode;\n}) {\n const inheritedRoot = useTimelineAnnotationSourceRoot();\n const conversationRootRef = useRef<HTMLElement | null>(null);\n if (!inheritedRoot) {\n conversationRootRef.current = resolveAnnotationRevealRoot(triggerRef.current);\n }\n useLayoutEffect(() => {\n if (inheritedRoot) return;\n conversationRootRef.current = resolveAnnotationRevealRoot(triggerRef.current);\n });\n if (inheritedRoot) return children;\n return (\n <TimelineAnnotationSourceRootContext.Provider value={conversationRootRef}>\n {children}\n </TimelineAnnotationSourceRootContext.Provider>\n );\n}\n\nexport function TimelineAnnotationCards({\n annotations,\n onRevealSource,\n className,\n}: {\n annotations: readonly TimelineAnnotationLike[];\n onRevealSource?: ((source: TimelineAnnotationSource) => boolean) | undefined;\n className?: string | undefined;\n}) {\n const t = useOpenGeniText();\n const [unavailableId, setUnavailableId] = useState<string | null>(null);\n if (annotations.length === 0) return null;\n return (\n <div\n data-og-annotation-cards=\"\"\n className={cn(\n \"grid gap-2\",\n annotations.length >= ANNOTATION_CARD_STACK_SCROLL_AT &&\n \"max-h-[min(28rem,55vh)] overflow-x-hidden overflow-y-auto overscroll-contain pr-1\",\n className,\n )}\n >\n {annotations.map((annotation, index) => {\n const ordinal = annotationDisplayOrdinal(annotation, index);\n return (\n <section\n key={annotation.id}\n aria-label={t(\"timelineAnnotations.annotationOrdinal\", { ordinal })}\n >\n <AnnotationAccentRow>\n <p className=\"mb-0.5 text-og-xs font-medium tabular-nums text-og-fg-subtle\">\n {t(\"timelineAnnotations.annotationOrdinal\", { ordinal })}\n </p>\n <AnnotationQuoteSourceButton\n annotation={annotation}\n lines={2}\n onRevealSource={onRevealSource}\n onUnavailable={setUnavailableId}\n />\n {unavailableId === annotation.id ? (\n <p role=\"status\" className=\"text-og-xs text-og-status-waiting\">\n {t(\"timelineAnnotations.sourceIsOutsideTheLoaded\")}\n </p>\n ) : null}\n <AnnotationNotePreview\n note={annotation.note}\n annotationId={annotation.id}\n ordinal={ordinal}\n />\n </AnnotationAccentRow>\n </section>\n );\n })}\n </div>\n );\n}\n\nexport function TimelineAnnotationsChip({\n annotations,\n editable = false,\n focusAnnotationId,\n onFocusConsumed,\n onUpdate,\n onRemove,\n onRevealSource,\n className,\n compact = false,\n onCommit,\n}: {\n annotations: readonly TimelineAnnotationLike[];\n editable?: boolean | undefined;\n focusAnnotationId?: string | null | undefined;\n onFocusConsumed?: (() => void) | undefined;\n onUpdate?: ((id: string, note: string) => void) | undefined;\n onRemove?: ((id: string) => void) | undefined;\n /** Return focus to the owning input after all notes are completed with Enter. */\n onCommit?: (() => void) | undefined;\n onRevealSource?: ((source: TimelineAnnotationSource) => boolean) | undefined;\n className?: string | undefined;\n /** Dense trigger for single-line rows such as the compact queue dock. */\n compact?: boolean | undefined;\n}) {\n const t = useOpenGeniText();\n const focusRequested = Boolean(\n focusAnnotationId && annotations.some((item) => item.id === focusAnnotationId),\n );\n const [open, setOpen] = useState(focusRequested);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const openedFocusId = useRef<string | null>(focusRequested ? (focusAnnotationId ?? null) : null);\n\n useEffect(() => {\n if (!focusRequested || !focusAnnotationId) {\n if (!focusRequested) openedFocusId.current = null;\n return;\n }\n if (openedFocusId.current === focusAnnotationId) return;\n openedFocusId.current = focusAnnotationId;\n setOpen(true);\n }, [focusAnnotationId, focusRequested]);\n\n if (annotations.length === 0) return null;\n const countLabel = t(\"counts.annotations\", { count: annotations.length });\n const incomplete = annotations.some((annotation) => !annotationHasNote(annotation.note));\n const canClear = Boolean(editable && onRemove);\n\n const dismiss = (restoreFocus: boolean) => {\n setOpen(false);\n onFocusConsumed?.();\n if (restoreFocus) triggerRef.current?.focus();\n };\n\n return (\n <span className={cn(\"inline-flex max-w-full items-center\", className)}>\n <span\n className={cn(\n \"inline-flex max-w-full items-center rounded-full border bg-og-surface-1 text-og-fg-muted\",\n incomplete ? \"border-og-accent/45 bg-og-accent-soft/50\" : \"border-og-border\",\n )}\n >\n <button\n ref={triggerRef}\n type=\"button\"\n className={cn(\n \"inline-flex min-w-0 max-w-full items-center gap-1.5 rounded-full border-0 bg-transparent font-medium outline-hidden transition hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:min-h-[44px]\",\n compact ? \"min-h-6 py-0.5 text-og-xs\" : \"min-h-8 py-1 text-og-sm\",\n canClear ? \"pr-1 pl-2.5\" : \"px-2.5\",\n )}\n aria-label={t(\"timelineAnnotations.reviewCountlabel\", { countLabel })}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => setOpen((current) => !current)}\n >\n <QuoteIcon className=\"size-3.5 shrink-0 text-og-accent\" aria-hidden=\"true\" />\n <span className=\"min-w-0 truncate\">{countLabel}</span>\n </button>\n {canClear ? (\n <button\n type=\"button\"\n className=\"inline-flex size-7 shrink-0 items-center justify-center rounded-full border-0 bg-transparent text-og-fg-subtle outline-hidden hover:text-og-status-failed focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:size-11\"\n aria-label={t(\"timelineAnnotations.removeAllAnnotations\")}\n onClick={() => {\n for (const annotation of annotations) onRemove?.(annotation.id);\n }}\n >\n <XIcon className=\"size-3.5\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </span>\n {open ? (\n <AnnotationSourceRootBridge triggerRef={triggerRef}>\n <Suspense fallback={null}>\n <TimelineAnnotationsDialog\n annotations={annotations}\n editable={editable}\n focusAnnotationId={focusAnnotationId}\n onFocusConsumed={onFocusConsumed}\n onUpdate={onUpdate}\n onRemove={onRemove}\n onRevealSource={onRevealSource}\n triggerRef={triggerRef}\n countLabel={countLabel}\n onDismiss={dismiss}\n onCommit={() => {\n dismiss(!onCommit);\n onCommit?.();\n }}\n />\n </Suspense>\n </AnnotationSourceRootBridge>\n ) : null}\n </span>\n );\n}\n\nexport default TimelineAnnotationsChip;\n"],"mappings":"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","names":[]}