@opengeni/react 4.4.1 → 4.5.1-canary.39832248373001

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 (654) hide show
  1. package/dist/app/app-state.js +15 -15
  2. package/dist/app/components/Composer.js +19 -19
  3. package/dist/app/components/artifacts/artifact-browse-controls.js +3 -3
  4. package/dist/app/components/artifacts/artifact-library.js +9 -9
  5. package/dist/app/components/artifacts/artifact-page-chrome.js +2 -2
  6. package/dist/app/components/artifacts/chat-interactive-block.js +14 -14
  7. package/dist/app/components/artifacts/inline-chat-image.js +22 -21
  8. package/dist/app/components/artifacts/retained-file-preview.js +24 -23
  9. package/dist/app/components/artifacts/retained-text-preview.js +2 -2
  10. package/dist/app/components/artifacts/site-audience.js +2 -2
  11. package/dist/app/components/artifacts/site-conversations.js +14 -13
  12. package/dist/app/components/artifacts/site-data.js +4 -4
  13. package/dist/app/components/artifacts/site-publishing.js +20 -20
  14. package/dist/app/components/artifacts/site-settings.js +25 -25
  15. package/dist/app/components/billing-class-mark.js +3 -3
  16. package/dist/app/components/capabilities/capability-detail-sheet.js +6 -6
  17. package/dist/app/components/capabilities/capability-logo-source.js +8 -8
  18. package/dist/app/components/capabilities/connector-tool-permissions.js +3 -3
  19. package/dist/app/components/capabilities/native-connect-setup.js +8 -8
  20. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +10 -10
  21. package/dist/app/components/capabilities/session-capability-card.js +43 -41
  22. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  23. package/dist/app/components/capabilities/session-chrome-card.js +20 -18
  24. package/dist/app/components/capabilities/session-custom-mcp-card.js +11 -11
  25. package/dist/app/components/capabilities/session-github-card.js +13 -13
  26. package/dist/app/components/capabilities/session-machine-card.js +19 -17
  27. package/dist/app/components/command-menu/chat-status.js +16 -15
  28. package/dist/app/components/command-menu/chat-switcher.js +19 -18
  29. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  30. package/dist/app/components/command-menu/command-menu.js +29 -107
  31. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  32. package/dist/app/components/command-menu/shortcut-sheet.js +9 -9
  33. package/dist/app/components/composer-mobile-plus-panel.js +9 -9
  34. package/dist/app/components/composer-mobile-plus.js +1 -1
  35. package/dist/app/components/credit-required-gate.js +1 -1
  36. package/dist/app/components/credit-required-prompt.js +5 -5
  37. package/dist/app/components/credits/coupon-redeem.js +2 -2
  38. package/dist/app/components/credits/credit-refusal-notice.js +2 -2
  39. package/dist/app/components/desktop/app-shots.js +7 -7
  40. package/dist/app/components/desktop/this-computer.js +4 -4
  41. package/dist/app/components/feedback.js +3 -3
  42. package/dist/app/components/follow-up-repository-menu-body.js +2 -2
  43. package/dist/app/components/follow-up-repository-picker.js +1 -1
  44. package/dist/app/components/github-app-connect-launcher.js +2 -2
  45. package/dist/app/components/in-app-help-link.js +2 -2
  46. package/dist/app/components/machines/connect-machine-dialog.js +3 -3
  47. package/dist/app/components/markdown.js +5 -5
  48. package/dist/app/components/models/models-ui.js +3 -3
  49. package/dist/app/components/new-session-starters.js +2 -2
  50. package/dist/app/components/pickers.js +6 -6
  51. package/dist/app/components/rail/rail-context.js +3 -3
  52. package/dist/app/components/rail/rail-sections.js +51 -48
  53. package/dist/app/components/rail/session-header.js +29 -28
  54. package/dist/app/components/rail/session-list.js +50 -47
  55. package/dist/app/components/rail/session-row-content.d.ts +6 -2
  56. package/dist/app/components/rail/session-row-content.js +1 -1
  57. package/dist/app/components/rail/session-row-hover-details.js +17 -16
  58. package/dist/app/components/rail/session-shell.js +78 -75
  59. package/dist/app/components/rail/site-session-group-heading.d.ts +7 -1
  60. package/dist/app/components/rail/site-session-group-heading.js +20 -3
  61. package/dist/app/components/repository-picker.js +2 -2
  62. package/dist/app/components/session/agent-configuration-panel.js +18 -18
  63. package/dist/app/components/session/artifact-link-boundary.js +2 -2
  64. package/dist/app/components/session/artifact-session-page.js +5 -5
  65. package/dist/app/components/session/banners.js +7 -7
  66. package/dist/app/components/session/codex-account-indicator.js +10 -10
  67. package/dist/app/components/session/editable-artifacts-workspace.js +24 -24
  68. package/dist/app/components/session/failed-session-banner.js +6 -6
  69. package/dist/app/components/session/human-input.js +41 -37
  70. package/dist/app/components/session/inspector.js +61 -57
  71. package/dist/app/components/session/inspector.js.map +1 -1
  72. package/dist/app/components/session/message-actions.js +3 -3
  73. package/dist/app/components/session/message-resource-attachments.js +12 -11
  74. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  75. package/dist/app/components/session/model-account-indicator.js +9 -9
  76. package/dist/app/components/session/model-recovery-notice.js +3 -3
  77. package/dist/app/components/session/new-session-settings-menu.js +8 -8
  78. package/dist/app/components/session/sandbox-switcher.js +12 -12
  79. package/dist/app/components/session/sandbox-workspace.js +58 -54
  80. package/dist/app/components/session/search-markdown-highlight.js +6 -6
  81. package/dist/app/components/session/search-results-view.js +7 -7
  82. package/dist/app/components/session/session-admin-access.js +3 -3
  83. package/dist/app/components/session/session-admission-notice.js +5 -5
  84. package/dist/app/components/session/session-machine-access-notice.js +5 -5
  85. package/dist/app/components/session/session-search-dialog.js +8 -8
  86. package/dist/app/components/session/session-tenancy-control.d.ts +2 -0
  87. package/dist/app/components/session/session-tenancy-control.js +26 -11
  88. package/dist/app/components/session/session-tenancy-control.js.map +1 -1
  89. package/dist/app/components/session/session-usage-limit-section.js +4 -4
  90. package/dist/app/components/session/session-wait-status.js +8 -7
  91. package/dist/app/components/session/session-wait-status.js.map +1 -1
  92. package/dist/app/components/session/site-origin-link.d.ts +1 -0
  93. package/dist/app/components/session/site-origin-link.js +2 -2
  94. package/dist/app/components/session/subagents.js +13 -12
  95. package/dist/app/components/settings/row-select.js +3 -3
  96. package/dist/app/components/transcription-settings.js +4 -4
  97. package/dist/app/components/usage/usage-entry.js +5 -5
  98. package/dist/app/components/workspace-composer-plus.js +12 -12
  99. package/dist/app/embed/memory-navigation.js +2 -2
  100. package/dist/app/embed/session-app.js +196 -190
  101. package/dist/app/lib/actions/actions-provider.js +9 -9
  102. package/dist/app/lib/actions/held-modifier.d.ts +11 -0
  103. package/dist/app/lib/app-surfaces.js +2 -2
  104. package/dist/app/lib/codex-usage-query.js +6 -6
  105. package/dist/app/lib/composer-connectors.js +9 -9
  106. package/dist/app/lib/console-site.d.ts +6 -0
  107. package/dist/app/lib/console-site.js +14 -0
  108. package/dist/app/lib/console-text.js +2 -2
  109. package/dist/app/lib/events.js +13 -12
  110. package/dist/app/lib/failed-session-copy.js +3 -3
  111. package/dist/app/lib/model-access-onboarding.js +3 -3
  112. package/dist/app/lib/move-chat-to-machine.js +3 -3
  113. package/dist/app/lib/navigation.d.ts +5 -0
  114. package/dist/app/lib/navigation.js +1 -1
  115. package/dist/app/lib/routes.d.ts +17 -0
  116. package/dist/app/lib/routes.js +9 -3
  117. package/dist/app/lib/session-branch-cache.js +12 -11
  118. package/dist/app/lib/session-create.js +2 -2
  119. package/dist/app/lib/session-deep-link.js +2 -2
  120. package/dist/app/lib/session-failure-toasts.d.ts +8 -0
  121. package/dist/app/lib/session-group-pagination.js +12 -11
  122. package/dist/app/lib/session-hover-facts.js +12 -11
  123. package/dist/app/lib/session-model.js +2 -2
  124. package/dist/app/lib/session-rail.js +8 -7
  125. package/dist/app/lib/session-rename.js +2 -2
  126. package/dist/app/lib/session-ui-features.d.ts +6 -1
  127. package/dist/app/lib/session-ui-features.js +1 -1
  128. package/dist/app/lib/sessions-group.d.ts +43 -3
  129. package/dist/app/lib/sessions-group.js +19 -12
  130. package/dist/app/lib/shared-query.js +3 -3
  131. package/dist/app/lib/site-opened.d.ts +6 -0
  132. package/dist/app/lib/site-opened.js +10 -0
  133. package/dist/app/lib/turn-failure-analytics.js +5 -5
  134. package/dist/app/lib/use-duplicate-site.js +2 -2
  135. package/dist/app/lib/use-follow-up-repositories.js +2 -2
  136. package/dist/app/lib/use-session-list-hint-refresh.d.ts +20 -2
  137. package/dist/app/lib/use-session-list-hint-refresh.js +5 -1
  138. package/dist/app/lib/use-workspace-machines.js +5 -5
  139. package/dist/app/lib/use-workspace-model-catalog.js +7 -7
  140. package/dist/app/lib/use-workspace-rigs.js +7 -7
  141. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  142. package/dist/app/lib/workspace-scope-context.js +3 -3
  143. package/dist/app/routes/artifacts.js +70 -87
  144. package/dist/app/routes/artifacts.js.map +1 -1
  145. package/dist/app/routes/retained-artifact.js +36 -35
  146. package/dist/app/routes/retained-artifact.js.map +1 -1
  147. package/dist/app/routes/session-unavailable.js +6 -4
  148. package/dist/app/routes/session.js +127 -123
  149. package/dist/app/routes/sessions-index-hydration.js +3 -3
  150. package/dist/app/routes/sessions-index.js +96 -94
  151. package/dist/app/routes/site-view.d.ts +11 -0
  152. package/dist/app/routes/site-view.js +597 -0
  153. package/dist/app/routes/site-view.js.map +1 -0
  154. package/dist/artifacts-document.js +4 -4
  155. package/dist/artifacts-presentation.js +4 -4
  156. package/dist/artifacts-spreadsheet.js +4 -4
  157. package/dist/artifacts.js +13 -13
  158. package/dist/{browser-viewer-RYYQSRTC.js → browser-viewer-VPK3CV2H.js} +7 -5
  159. package/dist/{chat-interactive-block-ABCRKXJ4.js → chat-interactive-block-AMDSW656.js} +5 -5
  160. package/dist/chunk-22GTC4MZ.js +15 -0
  161. package/dist/chunk-22GTC4MZ.js.map +1 -0
  162. package/dist/{chunk-RQDFYQHA.js → chunk-25LWDG5D.js} +6 -6
  163. package/dist/{chunk-U3HSFCON.js → chunk-2CKVVAGP.js} +15 -15
  164. package/dist/{chunk-F6LBGYS6.js → chunk-2DL6NJP5.js} +15 -15
  165. package/dist/{chunk-UHFWF6ZU.js → chunk-2FPS5H2D.js} +2 -2
  166. package/dist/{chunk-NAWXARTY.js → chunk-2KO2G3RI.js} +72 -6
  167. package/dist/chunk-2KO2G3RI.js.map +1 -0
  168. package/dist/{chunk-TWXIFWBD.js → chunk-34EU25RL.js} +2 -2
  169. package/dist/{chunk-PTGRFAMH.js → chunk-3ABPIUCK.js} +2 -2
  170. package/dist/{chunk-722UO6YQ.js → chunk-3PEXVG4D.js} +2 -2
  171. package/dist/{chunk-N3ZP4IDU.js → chunk-45WYYFP6.js} +2 -2
  172. package/dist/{chunk-HOJGAJAB.js → chunk-4MQLGMV2.js} +5 -5
  173. package/dist/{chunk-L7YURQI2.js → chunk-4U4GXWXS.js} +3 -3
  174. package/dist/{chunk-63VGE4OH.js → chunk-5HIOVXOX.js} +3 -3
  175. package/dist/{chunk-GFUUFM2O.js → chunk-5M23GZA2.js} +3 -3
  176. package/dist/{chunk-PM3OSANE.js → chunk-5MJHH72T.js} +14 -3
  177. package/dist/chunk-5MJHH72T.js.map +1 -0
  178. package/dist/{chunk-RKB2Z457.js → chunk-5VGJXWQ2.js} +2 -2
  179. package/dist/{chunk-6W3LF3DB.js → chunk-5YFY4SFC.js} +2 -12
  180. package/dist/chunk-5YFY4SFC.js.map +1 -0
  181. package/dist/{chunk-I6VUUEXH.js → chunk-6AFSZKZA.js} +3 -3
  182. package/dist/{chunk-FBMU3VK5.js → chunk-6DCEDIF6.js} +2 -2
  183. package/dist/{chunk-5MZTJMZ3.js → chunk-6MRY2RUZ.js} +13 -7
  184. package/dist/chunk-6MRY2RUZ.js.map +1 -0
  185. package/dist/{chunk-4EONHNJU.js → chunk-6O4VWKSO.js} +2 -2
  186. package/dist/chunk-756MKA2J.js +45 -0
  187. package/dist/chunk-756MKA2J.js.map +1 -0
  188. package/dist/{chunk-BSX2R4CW.js → chunk-767WCGAX.js} +6 -6
  189. package/dist/{chunk-7KGKDWWR.js → chunk-7HFLYNWN.js} +2 -2
  190. package/dist/{chunk-OSVHU2WU.js → chunk-7IYAHFPE.js} +2 -2
  191. package/dist/{chunk-4EAF3HSD.js → chunk-7J7PZB4S.js} +2 -2
  192. package/dist/{chunk-ADJJQSYC.js → chunk-7PUFAH4I.js} +34 -32
  193. package/dist/chunk-7PUFAH4I.js.map +1 -0
  194. package/dist/{chunk-OR37STQZ.js → chunk-7R2JQHBX.js} +3 -3
  195. package/dist/{chunk-QM5H4FPT.js → chunk-7VN6VC3D.js} +3 -3
  196. package/dist/{chunk-HWDGJFM4.js → chunk-A2E3ZF6N.js} +4 -4
  197. package/dist/{chunk-RGW24ZZM.js → chunk-A6CK4ENG.js} +19 -17
  198. package/dist/chunk-A6CK4ENG.js.map +1 -0
  199. package/dist/{chunk-4432A3HQ.js → chunk-A6T4FGE7.js} +4 -4
  200. package/dist/{chunk-73SOCVLS.js → chunk-AIEXYO2X.js} +3 -3
  201. package/dist/{chunk-U7TC2XJQ.js → chunk-AJPW3SV4.js} +3 -3
  202. package/dist/{chunk-46VBQG2D.js → chunk-AOUCHCSB.js} +5 -5
  203. package/dist/{chunk-HDHK3SXK.js → chunk-AT4K4F6S.js} +2 -2
  204. package/dist/{chunk-TQGJN5UZ.js → chunk-AW3QEFOF.js} +140 -522
  205. package/dist/chunk-AW3QEFOF.js.map +1 -0
  206. package/dist/{chunk-HRJQAFKR.js → chunk-AX6YJA5U.js} +2 -2
  207. package/dist/{chunk-HO5Y2OOX.js → chunk-BLPXOHG6.js} +6 -6
  208. package/dist/{chunk-DT7BORXG.js → chunk-BMJTNPWK.js} +2 -2
  209. package/dist/{chunk-HIHO2QE7.js → chunk-BT2MVGHT.js} +2 -2
  210. package/dist/{chunk-AOLE4IRZ.js → chunk-C535KSTY.js} +2 -2
  211. package/dist/{chunk-IVOA3DXA.js → chunk-CB574ERL.js} +4 -4
  212. package/dist/{chunk-IBTXYLBW.js → chunk-CCFWY4GF.js} +2 -2
  213. package/dist/{chunk-ZOC3OP6F.js → chunk-CCR33J7L.js} +2 -2
  214. package/dist/{chunk-NYZQ7LO7.js → chunk-CDUDKETD.js} +2 -2
  215. package/dist/{chunk-JTN3T4QN.js → chunk-D3RK3NGM.js} +4 -4
  216. package/dist/{chunk-IOKSNX74.js → chunk-D5OWJZQR.js} +2 -2
  217. package/dist/{chunk-BJIZ7PL7.js → chunk-D64Z4V26.js} +145 -29
  218. package/dist/chunk-D64Z4V26.js.map +1 -0
  219. package/dist/{chunk-XWWXIZFP.js → chunk-DFXZYNTX.js} +7 -7
  220. package/dist/{chunk-SQGXMHJO.js → chunk-DGLRZMXL.js} +3 -3
  221. package/dist/{chunk-GNEHAPKV.js → chunk-DJFTH2DI.js} +3 -3
  222. package/dist/{chunk-KWKGBGAF.js → chunk-DKCX643S.js} +11 -11
  223. package/dist/{chunk-HQG4SLTE.js → chunk-DYJGYGPB.js} +2 -2
  224. package/dist/{chunk-GTQ3SNEI.js → chunk-E36IC3LU.js} +2 -2
  225. package/dist/{chunk-CVG4FILQ.js → chunk-ECHYJP63.js} +253 -1008
  226. package/dist/chunk-ECHYJP63.js.map +1 -0
  227. package/dist/{chunk-Q35DT6I6.js → chunk-EH7TTYE6.js} +179 -170
  228. package/dist/chunk-EH7TTYE6.js.map +1 -0
  229. package/dist/{chunk-72J6C2AJ.js → chunk-EMCB6XKU.js} +2 -2
  230. package/dist/{chunk-3AA6RNGE.js → chunk-ENS6E4RZ.js} +2 -2
  231. package/dist/{chunk-AG7VGUIW.js → chunk-ERG355NM.js} +3 -3
  232. package/dist/{chunk-TSBE4KOQ.js → chunk-EWL6NDOO.js} +3 -3
  233. package/dist/{chunk-Z5WMLJKI.js → chunk-F2RMKGDQ.js} +89 -1
  234. package/dist/chunk-F2RMKGDQ.js.map +1 -0
  235. package/dist/{chunk-X7L4H4VG.js → chunk-F33EDYS7.js} +524 -426
  236. package/dist/chunk-F33EDYS7.js.map +1 -0
  237. package/dist/{chunk-HTT3FB7T.js → chunk-F3FN6DO6.js} +2 -2
  238. package/dist/{chunk-ST22GONV.js → chunk-FB3B45FP.js} +11 -11
  239. package/dist/{chunk-P5T36BA3.js → chunk-FRP64DEK.js} +2 -2
  240. package/dist/{chunk-KBF3SE7G.js → chunk-FSP334UU.js} +2 -2
  241. package/dist/{chunk-4VKA5O7T.js → chunk-FVL4B552.js} +9 -9
  242. package/dist/{chunk-VP62LPLW.js → chunk-G2BX56CN.js} +5 -5
  243. package/dist/{chunk-CSHBR2IZ.js → chunk-GDLDBR6B.js} +2 -2
  244. package/dist/{chunk-PN66T6JA.js → chunk-GFSOXB2K.js} +2 -2
  245. package/dist/{chunk-S4EZ3JUB.js → chunk-GZGQHQI7.js} +29 -29
  246. package/dist/chunk-H4IE2PYF.js +792 -0
  247. package/dist/chunk-H4IE2PYF.js.map +1 -0
  248. package/dist/{chunk-XFNLU7EW.js → chunk-H5M33DAL.js} +15 -6
  249. package/dist/chunk-H5M33DAL.js.map +1 -0
  250. package/dist/{chunk-BXRIQZAH.js → chunk-HNNM2GDN.js} +3 -3
  251. package/dist/{chunk-EU6XSQFM.js → chunk-HPB4KSV3.js} +2 -2
  252. package/dist/{chunk-QCD5Y7K5.js → chunk-HSQRYJ4P.js} +5 -5
  253. package/dist/{chunk-YXOKAG66.js → chunk-HUXDGWAN.js} +2 -2
  254. package/dist/{chunk-VUHPA3XQ.js → chunk-I66ZB6KD.js} +3 -3
  255. package/dist/{chunk-7CZTKBTI.js → chunk-IC7KNOBB.js} +5 -5
  256. package/dist/{chunk-KF3MF6FP.js → chunk-IECRGM6K.js} +3 -2
  257. package/dist/chunk-IECRGM6K.js.map +1 -0
  258. package/dist/{chunk-HGMWMK5K.js → chunk-IIO2MR3B.js} +2 -2
  259. package/dist/chunk-IJYL5BZM.js +38 -0
  260. package/dist/chunk-IJYL5BZM.js.map +1 -0
  261. package/dist/{chunk-L6RXRRN3.js → chunk-ILDOW2IQ.js} +3 -3
  262. package/dist/{chunk-O756O2I7.js → chunk-IPPVX5GF.js} +1 -1
  263. package/dist/{chunk-X7ASQHR6.js → chunk-IUK5QGP5.js} +2 -2
  264. package/dist/{chunk-5JZYPZ72.js → chunk-JFK7NTEA.js} +4 -4
  265. package/dist/chunk-JFK7NTEA.js.map +1 -0
  266. package/dist/{chunk-PIVGX42P.js → chunk-JNY5MT3I.js} +2 -2
  267. package/dist/chunk-JRSNCSZN.js +37 -0
  268. package/dist/chunk-JRSNCSZN.js.map +1 -0
  269. package/dist/{chunk-DDK4WFJ3.js → chunk-JWN7SLTO.js} +9 -9
  270. package/dist/{chunk-Q35YZVDZ.js → chunk-KFWVBTUH.js} +3 -3
  271. package/dist/{chunk-JXT5QDJC.js → chunk-KNFDWNCH.js} +5 -5
  272. package/dist/{chunk-AZVANYMB.js → chunk-KUNFUSZ7.js} +2 -2
  273. package/dist/{chunk-DXZNDKQD.js → chunk-LEEJBZ5B.js} +2 -2
  274. package/dist/{chunk-STUCI6QA.js → chunk-LEKBNKLD.js} +1 -1
  275. package/dist/{chunk-STUCI6QA.js.map → chunk-LEKBNKLD.js.map} +1 -1
  276. package/dist/{chunk-RSNYGEVZ.js → chunk-LKJ2C7PH.js} +8 -8
  277. package/dist/{chunk-RIMKJBCD.js → chunk-LMPTC4CX.js} +2 -2
  278. package/dist/{chunk-3KVWXKD6.js → chunk-LQ47YL6E.js} +2 -2
  279. package/dist/{chunk-GAIM5RNE.js → chunk-MJQBC7C5.js} +3 -3
  280. package/dist/{chunk-NWZW2WHN.js → chunk-MM7OKOTE.js} +6 -6
  281. package/dist/{chunk-FM4OUCC2.js → chunk-MOKYT3X3.js} +3 -3
  282. package/dist/{chunk-GZ64CASI.js → chunk-MVZYNZXE.js} +5 -4
  283. package/dist/chunk-MVZYNZXE.js.map +1 -0
  284. package/dist/{chunk-XRRSFQEV.js → chunk-NAZZLAWX.js} +2 -2
  285. package/dist/{chunk-XOFUXMPP.js → chunk-ND2WCWXI.js} +4 -4
  286. package/dist/{chunk-6L7U46Y2.js → chunk-NKNVIO66.js} +2 -2
  287. package/dist/{chunk-JKUICTLM.js → chunk-NLAFNMPK.js} +2 -2
  288. package/dist/{chunk-OO2T63BY.js → chunk-NML44AW2.js} +2 -2
  289. package/dist/chunk-NQQKOJDI.js +89 -0
  290. package/dist/chunk-NQQKOJDI.js.map +1 -0
  291. package/dist/{chunk-4LKNIGHB.js → chunk-O2SBHS2N.js} +2 -2
  292. package/dist/{chunk-RA3FNMWF.js → chunk-O4DYOSOL.js} +5 -5
  293. package/dist/{chunk-ZKYYZH6L.js → chunk-OFB6TUDC.js} +4 -4
  294. package/dist/{chunk-DWPOQ3S5.js → chunk-OTMWHZBY.js} +2 -2
  295. package/dist/{chunk-VVCDB2T7.js → chunk-PCJLH45G.js} +3 -3
  296. package/dist/{chunk-WSMYOLHG.js → chunk-PEKPWK5M.js} +2 -2
  297. package/dist/{chunk-PZ24CYDO.js → chunk-PFAUGEV5.js} +2 -2
  298. package/dist/{chunk-KTRKZRID.js → chunk-PKEKZ2VA.js} +5 -5
  299. package/dist/{chunk-6JKZILLF.js → chunk-PMD7V4N7.js} +3 -3
  300. package/dist/{chunk-B74GSYR6.js → chunk-PUTS4DYW.js} +2 -2
  301. package/dist/{chunk-ZRJCGBVV.js → chunk-PVR5EELP.js} +2 -2
  302. package/dist/{chunk-JSIDLTTG.js → chunk-PZ2V2XIK.js} +2 -2
  303. package/dist/{chunk-TMEQPODK.js → chunk-PZ37VDB5.js} +2 -2
  304. package/dist/{chunk-FLGUVRR7.js → chunk-QBADR2FO.js} +6 -6
  305. package/dist/{chunk-TGVVEGZG.js → chunk-QLIDZGPV.js} +6 -6
  306. package/dist/{chunk-LVONK3YQ.js → chunk-QRKTESVE.js} +2 -2
  307. package/dist/{chunk-HT5WSUC7.js → chunk-QXEDIDBZ.js} +3 -3
  308. package/dist/{chunk-WURSS6MP.js → chunk-R66YMYJU.js} +2 -2
  309. package/dist/{chunk-6PQNLL4E.js → chunk-R7XCJWCD.js} +11 -11
  310. package/dist/{chunk-4R3JCVID.js → chunk-RAMZTZOB.js} +360 -103
  311. package/dist/chunk-RAMZTZOB.js.map +1 -0
  312. package/dist/{chunk-QRVNI5V6.js → chunk-SCNEQFIW.js} +3 -3
  313. package/dist/{chunk-BNUPYHHZ.js → chunk-SD4PPZFB.js} +4 -4
  314. package/dist/{chunk-ROQOVH4N.js → chunk-SFAU5R5S.js} +3 -3
  315. package/dist/{chunk-R63QEVPK.js → chunk-SJORXXLV.js} +6 -6
  316. package/dist/{chunk-FBE6AIIW.js → chunk-SOKNCW5U.js} +2 -2
  317. package/dist/{chunk-JRXHSVD5.js → chunk-SOXZ4LGS.js} +68 -11
  318. package/dist/chunk-SOXZ4LGS.js.map +1 -0
  319. package/dist/{chunk-EF5SYXAY.js → chunk-SQDPHCK2.js} +22 -14
  320. package/dist/chunk-SQDPHCK2.js.map +1 -0
  321. package/dist/{chunk-NDF3SH3X.js → chunk-TDIOBPLA.js} +5 -5
  322. package/dist/{chunk-EHCUFCXM.js → chunk-TEPPPAJI.js} +17 -7
  323. package/dist/chunk-TEPPPAJI.js.map +1 -0
  324. package/dist/{chunk-33TPANCR.js → chunk-TFK4KFKA.js} +4 -4
  325. package/dist/{chunk-6NIB2KGJ.js → chunk-THVIT3PW.js} +22 -22
  326. package/dist/{chunk-HPPKLBTJ.js → chunk-TJQDL3JH.js} +2 -2
  327. package/dist/{chunk-FD4Q5KFL.js → chunk-TLL22FFO.js} +2 -2
  328. package/dist/{chunk-7DU35P5J.js → chunk-TN5T5HRZ.js} +7 -7
  329. package/dist/{chunk-JK7C5A4I.js → chunk-TR4HIKJ2.js} +8 -8
  330. package/dist/{chunk-HNYJEAES.js → chunk-UGEWCWVV.js} +3 -3
  331. package/dist/chunk-ULYQEFNH.js +529 -0
  332. package/dist/chunk-ULYQEFNH.js.map +1 -0
  333. package/dist/{chunk-H5EVWF6L.js → chunk-UNNJUJVD.js} +2 -2
  334. package/dist/{chunk-AD22P5X3.js → chunk-UUSAOIJR.js} +3 -3
  335. package/dist/{chunk-Z6DKXQG7.js → chunk-UXXFMF4X.js} +2 -2
  336. package/dist/{chunk-RGPYMHKI.js → chunk-V3K4RQO7.js} +9 -3
  337. package/dist/chunk-V3K4RQO7.js.map +1 -0
  338. package/dist/{chunk-UP4BE32Y.js → chunk-VO6RVVP7.js} +5 -5
  339. package/dist/{chunk-S4SC5SSV.js → chunk-VPNXQUUS.js} +11 -11
  340. package/dist/{chunk-7BST7BA6.js → chunk-VW3BBTMA.js} +1 -1
  341. package/dist/{chunk-CBY5CXBD.js → chunk-VWSFA4LJ.js} +2 -2
  342. package/dist/{chunk-MYNUBDU7.js → chunk-VYKW6TB2.js} +1 -1
  343. package/dist/chunk-VYKW6TB2.js.map +1 -0
  344. package/dist/{chunk-QEJTQTF5.js → chunk-W6T5HR3Z.js} +3 -3
  345. package/dist/{chunk-5JEIDFPD.js → chunk-WBPQ7OPC.js} +1 -1
  346. package/dist/{chunk-GZLLDA6P.js → chunk-WEFN327U.js} +2 -2
  347. package/dist/{chunk-ANHUMDJX.js → chunk-WNDTLK44.js} +2 -2
  348. package/dist/{chunk-DLOYMWUQ.js → chunk-WSLPZ43N.js} +7 -7
  349. package/dist/{chunk-2DS4UOYQ.js → chunk-WSZQNTVN.js} +2 -2
  350. package/dist/{chunk-LE2EDBXU.js → chunk-WUHB422G.js} +5 -5
  351. package/dist/{chunk-BJW7G6EF.js → chunk-WVX5AQXS.js} +3 -3
  352. package/dist/{chunk-5POTDNQT.js → chunk-WWOHORRO.js} +3 -3
  353. package/dist/{chunk-4W7VISE7.js → chunk-WYDZP5F2.js} +93 -94
  354. package/dist/chunk-WYDZP5F2.js.map +1 -0
  355. package/dist/{chunk-KZHW27BV.js → chunk-WYEPUXGL.js} +2 -2
  356. package/dist/{chunk-GALB2G3W.js → chunk-X2AH4DRF.js} +2 -2
  357. package/dist/{chunk-NCX5SAQY.js → chunk-XN6CALYY.js} +9 -9
  358. package/dist/{chunk-SUVEDKE2.js → chunk-XNACICAB.js} +3 -3
  359. package/dist/{chunk-FDNJVZRE.js → chunk-XU4I47IP.js} +4 -4
  360. package/dist/chunk-XV6ZYRHK.js +59 -0
  361. package/dist/chunk-XV6ZYRHK.js.map +1 -0
  362. package/dist/{chunk-WRLWLGEF.js → chunk-Y5E3XQ2S.js} +25 -2
  363. package/dist/{chunk-WRLWLGEF.js.map → chunk-Y5E3XQ2S.js.map} +1 -1
  364. package/dist/{chunk-U36PO27Q.js → chunk-YG3IJCM2.js} +3 -3
  365. package/dist/{chunk-UWJ5P5CU.js → chunk-YGSJWWT3.js} +3 -3
  366. package/dist/{chunk-APU42QDI.js → chunk-YO64YVYL.js} +105 -101
  367. package/dist/chunk-YO64YVYL.js.map +1 -0
  368. package/dist/{chunk-P5WABK2H.js → chunk-Z4GJB24B.js} +2 -2
  369. package/dist/{chunk-NLMTNEWW.js → chunk-Z6E6TUAE.js} +2 -2
  370. package/dist/{chunk-OBQVTCTW.js → chunk-ZX5H7LWD.js} +2 -2
  371. package/dist/components/browser-viewer.d.ts +1 -1
  372. package/dist/composer.js +8 -8
  373. package/dist/{computer-viewer-KEDVLD42.js → computer-viewer-VA5JONUH.js} +6 -6
  374. package/dist/connect.js +7 -7
  375. package/dist/desktop.js +2 -2
  376. package/dist/editor.js +2 -2
  377. package/dist/{embedded-new-voice-LFHWWYD2.js → embedded-new-voice-6BILAOUG.js} +6 -6
  378. package/dist/{embedded-voice-6QS4ANNX.js → embedded-voice-UDE4JRKB.js} +6 -6
  379. package/dist/{fleet-decision-row-QNSTP3VX.js → fleet-decision-row-NN2HXDX3.js} +2 -2
  380. package/dist/hooks/internal.d.ts +38 -0
  381. package/dist/hooks/use-client-config-flags.d.ts +12 -0
  382. package/dist/hooks/use-workspace-sessions.d.ts +10 -1
  383. package/dist/index.js +86 -80
  384. package/dist/interaction.js +8 -6
  385. package/dist/interaction.js.map +1 -1
  386. package/dist/{latest-question-AW3PPDUM.js → latest-question-4WDBECXB.js} +4 -3
  387. package/dist/{latest-question-AW3PPDUM.js.map → latest-question-4WDBECXB.js.map} +1 -1
  388. package/dist/machines.js +4 -4
  389. package/dist/messages/en.d.ts +3 -3
  390. package/dist/messages.js +1 -1
  391. package/dist/{model-policy-picker-menu-CURJ247L.js → model-policy-picker-menu-NRTO6FRP.js} +4 -4
  392. package/dist/{platform-activity-row-BMXXNZKX.js → platform-activity-row-ENQVIFTL.js} +2 -2
  393. package/dist/{queue-surface-implementation-2X5AXB6I.js → queue-surface-implementation-H4XSNHZE.js} +8 -6
  394. package/dist/{queue-surface-implementation-2X5AXB6I.js.map → queue-surface-implementation-H4XSNHZE.js.map} +1 -1
  395. package/dist/realtime.js +5 -5
  396. package/dist/{sandbox-files-4FBG3GS2.js → sandbox-files-IEHODU35.js} +9 -9
  397. package/dist/sandbox-files-IEHODU35.js.map +1 -0
  398. package/dist/session-app.js +198 -192
  399. package/dist/session-list-model.d.ts +1 -0
  400. package/dist/session-list-model.js +7 -1
  401. package/dist/{session-realtime-2XIB254N.js → session-realtime-JNKDSGH7.js} +3 -3
  402. package/dist/session-realtime-JNKDSGH7.js.map +1 -0
  403. package/dist/session-realtime.js +2 -2
  404. package/dist/session-ui.js +48 -43
  405. package/dist/session.js +20 -18
  406. package/dist/sites.js +2 -2
  407. package/dist/terminal.js +2 -2
  408. package/dist/this-computer.js +3 -3
  409. package/dist/timeline/invoked-tool.d.ts +5 -0
  410. package/dist/timeline/tool-display-name.d.ts +2 -2
  411. package/dist/timeline/tool-icon.d.ts +14 -0
  412. package/dist/timeline/tool-presentation.d.ts +8 -3
  413. package/dist/{timeline-annotation-markers-X4K2IEOO.js → timeline-annotation-markers-ZSOFW7PG.js} +2 -2
  414. package/dist/{timeline-annotation-selection-MEHBW676.js → timeline-annotation-selection-YWV2UC34.js} +2 -2
  415. package/dist/{timeline-annotations-dialog-U2FPQ3UY.js → timeline-annotations-dialog-ZWQVX2HI.js} +3 -3
  416. package/dist/timeline-model.js +16 -14
  417. package/dist/ui/access-list.js +7 -7
  418. package/dist/ui/cadence-picker.js +2 -2
  419. package/dist/ui/list-row.js +3 -3
  420. package/dist/ui/revision-history.js +2 -2
  421. package/dist/ui/role-select.js +3 -3
  422. package/dist/ui/select-menu.js +2 -2
  423. package/dist/usage.js +3 -3
  424. package/dist/workbench.js +4 -4
  425. package/package.json +4 -4
  426. package/src/app/app-state.tsx +3 -1
  427. package/src/app/components/capabilities/session-machine-card.tsx +9 -2
  428. package/src/app/components/rail/session-list.tsx +254 -44
  429. package/src/app/components/rail/session-row-content.tsx +24 -2
  430. package/src/app/components/rail/session-shell.tsx +14 -9
  431. package/src/app/components/rail/site-session-group-heading.tsx +59 -20
  432. package/src/app/components/session/session-tenancy-control.tsx +18 -0
  433. package/src/app/components/session/site-origin-link.test.tsx +73 -0
  434. package/src/app/components/session/site-origin-link.tsx +4 -2
  435. package/src/app/embed/memory-navigation.tsx +1 -0
  436. package/src/app/lib/actions/held-modifier.test.ts +101 -0
  437. package/src/app/lib/actions/held-modifier.ts +108 -0
  438. package/src/app/lib/console-site.tsx +38 -0
  439. package/src/app/lib/navigation.tsx +4 -0
  440. package/src/app/lib/routes.tsx +42 -0
  441. package/src/app/lib/session-failure-toasts.ts +26 -0
  442. package/src/app/lib/session-ui-features.tsx +18 -4
  443. package/src/app/lib/sessions-group.tsx +219 -30
  444. package/src/app/lib/site-opened.tsx +48 -0
  445. package/src/app/lib/site-session-groups.test.ts +173 -6
  446. package/src/app/lib/site-view-routes.test.ts +55 -0
  447. package/src/app/lib/use-session-list-hint-refresh.tsx +44 -4
  448. package/src/app/routes/artifacts.tsx +2 -29
  449. package/src/app/routes/session-transient-failures.test.tsx +343 -0
  450. package/src/app/routes/session-unavailable.tsx +74 -3
  451. package/src/app/routes/session.tsx +4 -13
  452. package/src/app/routes/sessions-index.tsx +13 -9
  453. package/src/app/routes/site-view.test.tsx +476 -0
  454. package/src/app/routes/site-view.tsx +583 -0
  455. package/src/components/browser-viewer.tsx +16 -2
  456. package/src/hooks/internal.ts +129 -6
  457. package/src/hooks/use-client-config-flags.ts +8 -0
  458. package/src/hooks/use-session-events.ts +83 -9
  459. package/src/hooks/use-workspace-sessions.ts +21 -1
  460. package/src/messages/en.ts +3 -3
  461. package/src/session-list-model.ts +4 -0
  462. package/src/timeline/activity-rail.tsx +3 -2
  463. package/src/timeline/invoked-tool.ts +14 -4
  464. package/src/timeline/projection.ts +11 -6
  465. package/src/timeline/rolling-activity.tsx +6 -2
  466. package/src/timeline/tool-display-name.ts +2 -2
  467. package/src/timeline/tool-icon.tsx +165 -0
  468. package/src/timeline/tool-presentation.ts +207 -48
  469. package/src/timeline/tool-renderers.tsx +1 -70
  470. package/styles/compiled.css +38 -0
  471. package/dist/chunk-22ZBT6CN.js +0 -50
  472. package/dist/chunk-22ZBT6CN.js.map +0 -1
  473. package/dist/chunk-4R3JCVID.js.map +0 -1
  474. package/dist/chunk-4W7VISE7.js.map +0 -1
  475. package/dist/chunk-5JZYPZ72.js.map +0 -1
  476. package/dist/chunk-5MZTJMZ3.js.map +0 -1
  477. package/dist/chunk-6W3LF3DB.js.map +0 -1
  478. package/dist/chunk-ADJJQSYC.js.map +0 -1
  479. package/dist/chunk-APU42QDI.js.map +0 -1
  480. package/dist/chunk-BJIZ7PL7.js.map +0 -1
  481. package/dist/chunk-CVG4FILQ.js.map +0 -1
  482. package/dist/chunk-EF5SYXAY.js.map +0 -1
  483. package/dist/chunk-EHCUFCXM.js.map +0 -1
  484. package/dist/chunk-GZ64CASI.js.map +0 -1
  485. package/dist/chunk-JRXHSVD5.js.map +0 -1
  486. package/dist/chunk-KF3MF6FP.js.map +0 -1
  487. package/dist/chunk-MYNUBDU7.js.map +0 -1
  488. package/dist/chunk-NAWXARTY.js.map +0 -1
  489. package/dist/chunk-PM3OSANE.js.map +0 -1
  490. package/dist/chunk-Q35DT6I6.js.map +0 -1
  491. package/dist/chunk-R25ZKOZR.js +0 -24
  492. package/dist/chunk-R25ZKOZR.js.map +0 -1
  493. package/dist/chunk-RGPYMHKI.js.map +0 -1
  494. package/dist/chunk-RGW24ZZM.js.map +0 -1
  495. package/dist/chunk-TQGJN5UZ.js.map +0 -1
  496. package/dist/chunk-X7L4H4VG.js.map +0 -1
  497. package/dist/chunk-XFNLU7EW.js.map +0 -1
  498. package/dist/chunk-Z5WMLJKI.js.map +0 -1
  499. /package/dist/{browser-viewer-RYYQSRTC.js.map → app/lib/console-site.js.map} +0 -0
  500. /package/dist/{chat-interactive-block-ABCRKXJ4.js.map → app/lib/site-opened.js.map} +0 -0
  501. /package/dist/{computer-viewer-KEDVLD42.js.map → browser-viewer-VPK3CV2H.js.map} +0 -0
  502. /package/dist/{embedded-new-voice-LFHWWYD2.js.map → chat-interactive-block-AMDSW656.js.map} +0 -0
  503. /package/dist/{chunk-RQDFYQHA.js.map → chunk-25LWDG5D.js.map} +0 -0
  504. /package/dist/{chunk-U3HSFCON.js.map → chunk-2CKVVAGP.js.map} +0 -0
  505. /package/dist/{chunk-F6LBGYS6.js.map → chunk-2DL6NJP5.js.map} +0 -0
  506. /package/dist/{chunk-UHFWF6ZU.js.map → chunk-2FPS5H2D.js.map} +0 -0
  507. /package/dist/{chunk-TWXIFWBD.js.map → chunk-34EU25RL.js.map} +0 -0
  508. /package/dist/{chunk-PTGRFAMH.js.map → chunk-3ABPIUCK.js.map} +0 -0
  509. /package/dist/{chunk-722UO6YQ.js.map → chunk-3PEXVG4D.js.map} +0 -0
  510. /package/dist/{chunk-N3ZP4IDU.js.map → chunk-45WYYFP6.js.map} +0 -0
  511. /package/dist/{chunk-HOJGAJAB.js.map → chunk-4MQLGMV2.js.map} +0 -0
  512. /package/dist/{chunk-L7YURQI2.js.map → chunk-4U4GXWXS.js.map} +0 -0
  513. /package/dist/{chunk-63VGE4OH.js.map → chunk-5HIOVXOX.js.map} +0 -0
  514. /package/dist/{chunk-GFUUFM2O.js.map → chunk-5M23GZA2.js.map} +0 -0
  515. /package/dist/{chunk-RKB2Z457.js.map → chunk-5VGJXWQ2.js.map} +0 -0
  516. /package/dist/{chunk-I6VUUEXH.js.map → chunk-6AFSZKZA.js.map} +0 -0
  517. /package/dist/{chunk-FBMU3VK5.js.map → chunk-6DCEDIF6.js.map} +0 -0
  518. /package/dist/{chunk-4EONHNJU.js.map → chunk-6O4VWKSO.js.map} +0 -0
  519. /package/dist/{chunk-BSX2R4CW.js.map → chunk-767WCGAX.js.map} +0 -0
  520. /package/dist/{chunk-7KGKDWWR.js.map → chunk-7HFLYNWN.js.map} +0 -0
  521. /package/dist/{chunk-OSVHU2WU.js.map → chunk-7IYAHFPE.js.map} +0 -0
  522. /package/dist/{chunk-4EAF3HSD.js.map → chunk-7J7PZB4S.js.map} +0 -0
  523. /package/dist/{chunk-OR37STQZ.js.map → chunk-7R2JQHBX.js.map} +0 -0
  524. /package/dist/{chunk-QM5H4FPT.js.map → chunk-7VN6VC3D.js.map} +0 -0
  525. /package/dist/{chunk-HWDGJFM4.js.map → chunk-A2E3ZF6N.js.map} +0 -0
  526. /package/dist/{chunk-4432A3HQ.js.map → chunk-A6T4FGE7.js.map} +0 -0
  527. /package/dist/{chunk-73SOCVLS.js.map → chunk-AIEXYO2X.js.map} +0 -0
  528. /package/dist/{chunk-U7TC2XJQ.js.map → chunk-AJPW3SV4.js.map} +0 -0
  529. /package/dist/{chunk-46VBQG2D.js.map → chunk-AOUCHCSB.js.map} +0 -0
  530. /package/dist/{chunk-HDHK3SXK.js.map → chunk-AT4K4F6S.js.map} +0 -0
  531. /package/dist/{chunk-HRJQAFKR.js.map → chunk-AX6YJA5U.js.map} +0 -0
  532. /package/dist/{chunk-HO5Y2OOX.js.map → chunk-BLPXOHG6.js.map} +0 -0
  533. /package/dist/{chunk-DT7BORXG.js.map → chunk-BMJTNPWK.js.map} +0 -0
  534. /package/dist/{chunk-HIHO2QE7.js.map → chunk-BT2MVGHT.js.map} +0 -0
  535. /package/dist/{chunk-AOLE4IRZ.js.map → chunk-C535KSTY.js.map} +0 -0
  536. /package/dist/{chunk-IVOA3DXA.js.map → chunk-CB574ERL.js.map} +0 -0
  537. /package/dist/{chunk-IBTXYLBW.js.map → chunk-CCFWY4GF.js.map} +0 -0
  538. /package/dist/{chunk-ZOC3OP6F.js.map → chunk-CCR33J7L.js.map} +0 -0
  539. /package/dist/{chunk-NYZQ7LO7.js.map → chunk-CDUDKETD.js.map} +0 -0
  540. /package/dist/{chunk-JTN3T4QN.js.map → chunk-D3RK3NGM.js.map} +0 -0
  541. /package/dist/{chunk-IOKSNX74.js.map → chunk-D5OWJZQR.js.map} +0 -0
  542. /package/dist/{chunk-XWWXIZFP.js.map → chunk-DFXZYNTX.js.map} +0 -0
  543. /package/dist/{chunk-SQGXMHJO.js.map → chunk-DGLRZMXL.js.map} +0 -0
  544. /package/dist/{chunk-GNEHAPKV.js.map → chunk-DJFTH2DI.js.map} +0 -0
  545. /package/dist/{chunk-KWKGBGAF.js.map → chunk-DKCX643S.js.map} +0 -0
  546. /package/dist/{chunk-HQG4SLTE.js.map → chunk-DYJGYGPB.js.map} +0 -0
  547. /package/dist/{chunk-GTQ3SNEI.js.map → chunk-E36IC3LU.js.map} +0 -0
  548. /package/dist/{chunk-72J6C2AJ.js.map → chunk-EMCB6XKU.js.map} +0 -0
  549. /package/dist/{chunk-3AA6RNGE.js.map → chunk-ENS6E4RZ.js.map} +0 -0
  550. /package/dist/{chunk-AG7VGUIW.js.map → chunk-ERG355NM.js.map} +0 -0
  551. /package/dist/{chunk-TSBE4KOQ.js.map → chunk-EWL6NDOO.js.map} +0 -0
  552. /package/dist/{chunk-HTT3FB7T.js.map → chunk-F3FN6DO6.js.map} +0 -0
  553. /package/dist/{chunk-ST22GONV.js.map → chunk-FB3B45FP.js.map} +0 -0
  554. /package/dist/{chunk-P5T36BA3.js.map → chunk-FRP64DEK.js.map} +0 -0
  555. /package/dist/{chunk-KBF3SE7G.js.map → chunk-FSP334UU.js.map} +0 -0
  556. /package/dist/{chunk-4VKA5O7T.js.map → chunk-FVL4B552.js.map} +0 -0
  557. /package/dist/{chunk-VP62LPLW.js.map → chunk-G2BX56CN.js.map} +0 -0
  558. /package/dist/{chunk-CSHBR2IZ.js.map → chunk-GDLDBR6B.js.map} +0 -0
  559. /package/dist/{chunk-PN66T6JA.js.map → chunk-GFSOXB2K.js.map} +0 -0
  560. /package/dist/{chunk-S4EZ3JUB.js.map → chunk-GZGQHQI7.js.map} +0 -0
  561. /package/dist/{chunk-BXRIQZAH.js.map → chunk-HNNM2GDN.js.map} +0 -0
  562. /package/dist/{chunk-EU6XSQFM.js.map → chunk-HPB4KSV3.js.map} +0 -0
  563. /package/dist/{chunk-QCD5Y7K5.js.map → chunk-HSQRYJ4P.js.map} +0 -0
  564. /package/dist/{chunk-YXOKAG66.js.map → chunk-HUXDGWAN.js.map} +0 -0
  565. /package/dist/{chunk-VUHPA3XQ.js.map → chunk-I66ZB6KD.js.map} +0 -0
  566. /package/dist/{chunk-7CZTKBTI.js.map → chunk-IC7KNOBB.js.map} +0 -0
  567. /package/dist/{chunk-HGMWMK5K.js.map → chunk-IIO2MR3B.js.map} +0 -0
  568. /package/dist/{chunk-L6RXRRN3.js.map → chunk-ILDOW2IQ.js.map} +0 -0
  569. /package/dist/{chunk-O756O2I7.js.map → chunk-IPPVX5GF.js.map} +0 -0
  570. /package/dist/{chunk-X7ASQHR6.js.map → chunk-IUK5QGP5.js.map} +0 -0
  571. /package/dist/{chunk-PIVGX42P.js.map → chunk-JNY5MT3I.js.map} +0 -0
  572. /package/dist/{chunk-DDK4WFJ3.js.map → chunk-JWN7SLTO.js.map} +0 -0
  573. /package/dist/{chunk-Q35YZVDZ.js.map → chunk-KFWVBTUH.js.map} +0 -0
  574. /package/dist/{chunk-JXT5QDJC.js.map → chunk-KNFDWNCH.js.map} +0 -0
  575. /package/dist/{chunk-AZVANYMB.js.map → chunk-KUNFUSZ7.js.map} +0 -0
  576. /package/dist/{chunk-DXZNDKQD.js.map → chunk-LEEJBZ5B.js.map} +0 -0
  577. /package/dist/{chunk-RSNYGEVZ.js.map → chunk-LKJ2C7PH.js.map} +0 -0
  578. /package/dist/{chunk-RIMKJBCD.js.map → chunk-LMPTC4CX.js.map} +0 -0
  579. /package/dist/{chunk-3KVWXKD6.js.map → chunk-LQ47YL6E.js.map} +0 -0
  580. /package/dist/{chunk-GAIM5RNE.js.map → chunk-MJQBC7C5.js.map} +0 -0
  581. /package/dist/{chunk-NWZW2WHN.js.map → chunk-MM7OKOTE.js.map} +0 -0
  582. /package/dist/{chunk-FM4OUCC2.js.map → chunk-MOKYT3X3.js.map} +0 -0
  583. /package/dist/{chunk-XRRSFQEV.js.map → chunk-NAZZLAWX.js.map} +0 -0
  584. /package/dist/{chunk-XOFUXMPP.js.map → chunk-ND2WCWXI.js.map} +0 -0
  585. /package/dist/{chunk-6L7U46Y2.js.map → chunk-NKNVIO66.js.map} +0 -0
  586. /package/dist/{chunk-JKUICTLM.js.map → chunk-NLAFNMPK.js.map} +0 -0
  587. /package/dist/{chunk-OO2T63BY.js.map → chunk-NML44AW2.js.map} +0 -0
  588. /package/dist/{chunk-4LKNIGHB.js.map → chunk-O2SBHS2N.js.map} +0 -0
  589. /package/dist/{chunk-RA3FNMWF.js.map → chunk-O4DYOSOL.js.map} +0 -0
  590. /package/dist/{chunk-ZKYYZH6L.js.map → chunk-OFB6TUDC.js.map} +0 -0
  591. /package/dist/{chunk-DWPOQ3S5.js.map → chunk-OTMWHZBY.js.map} +0 -0
  592. /package/dist/{chunk-VVCDB2T7.js.map → chunk-PCJLH45G.js.map} +0 -0
  593. /package/dist/{chunk-WSMYOLHG.js.map → chunk-PEKPWK5M.js.map} +0 -0
  594. /package/dist/{chunk-PZ24CYDO.js.map → chunk-PFAUGEV5.js.map} +0 -0
  595. /package/dist/{chunk-KTRKZRID.js.map → chunk-PKEKZ2VA.js.map} +0 -0
  596. /package/dist/{chunk-6JKZILLF.js.map → chunk-PMD7V4N7.js.map} +0 -0
  597. /package/dist/{chunk-B74GSYR6.js.map → chunk-PUTS4DYW.js.map} +0 -0
  598. /package/dist/{chunk-ZRJCGBVV.js.map → chunk-PVR5EELP.js.map} +0 -0
  599. /package/dist/{chunk-JSIDLTTG.js.map → chunk-PZ2V2XIK.js.map} +0 -0
  600. /package/dist/{chunk-TMEQPODK.js.map → chunk-PZ37VDB5.js.map} +0 -0
  601. /package/dist/{chunk-FLGUVRR7.js.map → chunk-QBADR2FO.js.map} +0 -0
  602. /package/dist/{chunk-TGVVEGZG.js.map → chunk-QLIDZGPV.js.map} +0 -0
  603. /package/dist/{chunk-LVONK3YQ.js.map → chunk-QRKTESVE.js.map} +0 -0
  604. /package/dist/{chunk-HT5WSUC7.js.map → chunk-QXEDIDBZ.js.map} +0 -0
  605. /package/dist/{chunk-WURSS6MP.js.map → chunk-R66YMYJU.js.map} +0 -0
  606. /package/dist/{chunk-6PQNLL4E.js.map → chunk-R7XCJWCD.js.map} +0 -0
  607. /package/dist/{chunk-QRVNI5V6.js.map → chunk-SCNEQFIW.js.map} +0 -0
  608. /package/dist/{chunk-BNUPYHHZ.js.map → chunk-SD4PPZFB.js.map} +0 -0
  609. /package/dist/{chunk-ROQOVH4N.js.map → chunk-SFAU5R5S.js.map} +0 -0
  610. /package/dist/{chunk-R63QEVPK.js.map → chunk-SJORXXLV.js.map} +0 -0
  611. /package/dist/{chunk-FBE6AIIW.js.map → chunk-SOKNCW5U.js.map} +0 -0
  612. /package/dist/{chunk-NDF3SH3X.js.map → chunk-TDIOBPLA.js.map} +0 -0
  613. /package/dist/{chunk-33TPANCR.js.map → chunk-TFK4KFKA.js.map} +0 -0
  614. /package/dist/{chunk-6NIB2KGJ.js.map → chunk-THVIT3PW.js.map} +0 -0
  615. /package/dist/{chunk-HPPKLBTJ.js.map → chunk-TJQDL3JH.js.map} +0 -0
  616. /package/dist/{chunk-FD4Q5KFL.js.map → chunk-TLL22FFO.js.map} +0 -0
  617. /package/dist/{chunk-7DU35P5J.js.map → chunk-TN5T5HRZ.js.map} +0 -0
  618. /package/dist/{chunk-JK7C5A4I.js.map → chunk-TR4HIKJ2.js.map} +0 -0
  619. /package/dist/{chunk-HNYJEAES.js.map → chunk-UGEWCWVV.js.map} +0 -0
  620. /package/dist/{chunk-H5EVWF6L.js.map → chunk-UNNJUJVD.js.map} +0 -0
  621. /package/dist/{chunk-AD22P5X3.js.map → chunk-UUSAOIJR.js.map} +0 -0
  622. /package/dist/{chunk-Z6DKXQG7.js.map → chunk-UXXFMF4X.js.map} +0 -0
  623. /package/dist/{chunk-UP4BE32Y.js.map → chunk-VO6RVVP7.js.map} +0 -0
  624. /package/dist/{chunk-S4SC5SSV.js.map → chunk-VPNXQUUS.js.map} +0 -0
  625. /package/dist/{chunk-7BST7BA6.js.map → chunk-VW3BBTMA.js.map} +0 -0
  626. /package/dist/{chunk-CBY5CXBD.js.map → chunk-VWSFA4LJ.js.map} +0 -0
  627. /package/dist/{chunk-QEJTQTF5.js.map → chunk-W6T5HR3Z.js.map} +0 -0
  628. /package/dist/{chunk-5JEIDFPD.js.map → chunk-WBPQ7OPC.js.map} +0 -0
  629. /package/dist/{chunk-GZLLDA6P.js.map → chunk-WEFN327U.js.map} +0 -0
  630. /package/dist/{chunk-ANHUMDJX.js.map → chunk-WNDTLK44.js.map} +0 -0
  631. /package/dist/{chunk-DLOYMWUQ.js.map → chunk-WSLPZ43N.js.map} +0 -0
  632. /package/dist/{chunk-2DS4UOYQ.js.map → chunk-WSZQNTVN.js.map} +0 -0
  633. /package/dist/{chunk-LE2EDBXU.js.map → chunk-WUHB422G.js.map} +0 -0
  634. /package/dist/{chunk-BJW7G6EF.js.map → chunk-WVX5AQXS.js.map} +0 -0
  635. /package/dist/{chunk-5POTDNQT.js.map → chunk-WWOHORRO.js.map} +0 -0
  636. /package/dist/{chunk-KZHW27BV.js.map → chunk-WYEPUXGL.js.map} +0 -0
  637. /package/dist/{chunk-GALB2G3W.js.map → chunk-X2AH4DRF.js.map} +0 -0
  638. /package/dist/{chunk-NCX5SAQY.js.map → chunk-XN6CALYY.js.map} +0 -0
  639. /package/dist/{chunk-SUVEDKE2.js.map → chunk-XNACICAB.js.map} +0 -0
  640. /package/dist/{chunk-FDNJVZRE.js.map → chunk-XU4I47IP.js.map} +0 -0
  641. /package/dist/{chunk-U36PO27Q.js.map → chunk-YG3IJCM2.js.map} +0 -0
  642. /package/dist/{chunk-UWJ5P5CU.js.map → chunk-YGSJWWT3.js.map} +0 -0
  643. /package/dist/{chunk-P5WABK2H.js.map → chunk-Z4GJB24B.js.map} +0 -0
  644. /package/dist/{chunk-NLMTNEWW.js.map → chunk-Z6E6TUAE.js.map} +0 -0
  645. /package/dist/{chunk-OBQVTCTW.js.map → chunk-ZX5H7LWD.js.map} +0 -0
  646. /package/dist/{embedded-voice-6QS4ANNX.js.map → computer-viewer-VA5JONUH.js.map} +0 -0
  647. /package/dist/{model-policy-picker-menu-CURJ247L.js.map → embedded-new-voice-6BILAOUG.js.map} +0 -0
  648. /package/dist/{sandbox-files-4FBG3GS2.js.map → embedded-voice-UDE4JRKB.js.map} +0 -0
  649. /package/dist/{fleet-decision-row-QNSTP3VX.js.map → fleet-decision-row-NN2HXDX3.js.map} +0 -0
  650. /package/dist/{session-realtime-2XIB254N.js.map → model-policy-picker-menu-NRTO6FRP.js.map} +0 -0
  651. /package/dist/{platform-activity-row-BMXXNZKX.js.map → platform-activity-row-ENQVIFTL.js.map} +0 -0
  652. /package/dist/{timeline-annotation-markers-X4K2IEOO.js.map → timeline-annotation-markers-ZSOFW7PG.js.map} +0 -0
  653. /package/dist/{timeline-annotation-selection-MEHBW676.js.map → timeline-annotation-selection-YWV2UC34.js.map} +0 -0
  654. /package/dist/{timeline-annotations-dialog-U2FPQ3UY.js.map → timeline-annotations-dialog-ZWQVX2HI.js.map} +0 -0
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-CM7LVUKC.js";
5
5
 
6
6
  // src/hooks/internal.ts
7
- import { observedSessionSequence } from "@opengeni/sdk";
7
+ import { isTransientRequestError, observedSessionSequence } from "@opengeni/sdk";
8
8
  import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
9
9
  var HIDDEN_STREAM_GRACE_MS = 2e3;
10
10
  function usePageLiveActivity(hiddenGraceMs = HIDDEN_STREAM_GRACE_MS) {
@@ -40,9 +40,31 @@ function usePageLiveActivity(hiddenGraceMs = HIDDEN_STREAM_GRACE_MS) {
40
40
  }, [hiddenGraceMs]);
41
41
  return active;
42
42
  }
43
+ var DEFAULT_TRANSIENT_READ_RETRY = Object.freeze({
44
+ quietWindowMs: 2e4,
45
+ initialDelayMs: 1e3,
46
+ maxDelayMs: 4e3,
47
+ backgroundDelayMs: 15e3
48
+ });
49
+ function jittered(delayMs) {
50
+ return Math.round(delayMs * (0.8 + Math.random() * 0.4));
51
+ }
52
+ function transientReadRetryStep(streak, now, policy) {
53
+ streak.attempts += 1;
54
+ const quiet = now - streak.since < policy.quietWindowMs;
55
+ const delayMs = quiet ? Math.min(policy.maxDelayMs, policy.initialDelayMs * 2 ** (streak.attempts - 1)) : policy.backgroundDelayMs;
56
+ return { quiet, delayMs: Math.max(0, jittered(delayMs)) };
57
+ }
43
58
  function usePolledValue(load, options = {}) {
44
59
  const enabled = options.enabled ?? true;
45
60
  const pollIntervalMs = options.pollIntervalMs;
61
+ const transientRetryRef = useRef(null);
62
+ transientRetryRef.current = options.transientRetry === false ? null : {
63
+ quietWindowMs: options.transientRetry?.quietWindowMs ?? DEFAULT_TRANSIENT_READ_RETRY.quietWindowMs,
64
+ initialDelayMs: options.transientRetry?.initialDelayMs ?? DEFAULT_TRANSIENT_READ_RETRY.initialDelayMs,
65
+ maxDelayMs: options.transientRetry?.maxDelayMs ?? DEFAULT_TRANSIENT_READ_RETRY.maxDelayMs,
66
+ backgroundDelayMs: options.transientRetry?.backgroundDelayMs ?? DEFAULT_TRANSIENT_READ_RETRY.backgroundDelayMs
67
+ };
46
68
  const pageLive = usePageLiveActivity();
47
69
  const [data, setData] = useState(null);
48
70
  const [loading, setLoading] = useState(enabled);
@@ -55,6 +77,15 @@ function usePolledValue(load, options = {}) {
55
77
  const requestAbortRef = useRef(null);
56
78
  const inFlightRef = useRef(null);
57
79
  const trailingRefreshRef = useRef(null);
80
+ const transientStreakRef = useRef(null);
81
+ const transientRetryTimerRef = useRef(null);
82
+ const retryLiveRef = useRef(false);
83
+ const cancelTransientRetry = useCallback(() => {
84
+ if (transientRetryTimerRef.current !== null) {
85
+ clearTimeout(transientRetryTimerRef.current);
86
+ transientRetryTimerRef.current = null;
87
+ }
88
+ }, []);
58
89
  const [stateIdentity, setStateIdentity] = useState(() => ({ load }));
59
90
  useEffect(() => {
60
91
  if (stateIdentity.load !== load) {
@@ -75,14 +106,39 @@ function usePolledValue(load, options = {}) {
75
106
  try {
76
107
  const result = await load(requestAbort.signal);
77
108
  if (ticket === generation.current && activeLoadRef.current === load && !requestAbort.signal.aborted) {
109
+ transientStreakRef.current = null;
110
+ cancelTransientRetry();
78
111
  setData(result);
79
112
  setError(null);
80
113
  setLoading(false);
81
114
  }
82
115
  } catch (cause) {
83
116
  if (ticket === generation.current && activeLoadRef.current === load && !requestAbort.signal.aborted) {
84
- setError(normalizeError(cause));
85
- setLoading(false);
117
+ const policy = transientRetryRef.current;
118
+ if (policy && retryLiveRef.current && isTransientRequestError(cause)) {
119
+ const now = Date.now();
120
+ const streak = transientStreakRef.current ??= {
121
+ since: now,
122
+ attempts: 0,
123
+ surfaced: false
124
+ };
125
+ const step = transientReadRetryStep(streak, now, policy);
126
+ if (!step.quiet) {
127
+ if (!streak.surfaced) setError(normalizeError(cause));
128
+ streak.surfaced = true;
129
+ setLoading(false);
130
+ }
131
+ cancelTransientRetry();
132
+ transientRetryTimerRef.current = setTimeout(() => {
133
+ transientRetryTimerRef.current = null;
134
+ if (retryLiveRef.current) void run();
135
+ }, step.delayMs);
136
+ } else {
137
+ transientStreakRef.current = null;
138
+ cancelTransientRetry();
139
+ setError(normalizeError(cause));
140
+ setLoading(false);
141
+ }
86
142
  }
87
143
  } finally {
88
144
  if (requestAbortRef.current === requestAbort) requestAbortRef.current = null;
@@ -91,7 +147,7 @@ function usePolledValue(load, options = {}) {
91
147
  })();
92
148
  inFlightRef.current = { load, promise };
93
149
  return promise;
94
- }, [load]);
150
+ }, [cancelTransientRetry, load]);
95
151
  const refresh = useCallback(() => {
96
152
  const existing = inFlightRef.current;
97
153
  if (existing?.load !== load) return run();
@@ -108,7 +164,10 @@ function usePolledValue(load, options = {}) {
108
164
  return promise;
109
165
  }, [load, run]);
110
166
  useEffect(() => {
167
+ transientStreakRef.current = null;
168
+ cancelTransientRetry();
111
169
  if (!enabled || !pageLive) {
170
+ retryLiveRef.current = false;
112
171
  setLoading(false);
113
172
  generation.current += 1;
114
173
  requestAbortRef.current?.abort();
@@ -116,6 +175,7 @@ function usePolledValue(load, options = {}) {
116
175
  trailingRefreshRef.current = null;
117
176
  return;
118
177
  }
178
+ retryLiveRef.current = true;
119
179
  setLoading(true);
120
180
  let cancelled = false;
121
181
  let timer = null;
@@ -130,6 +190,8 @@ function usePolledValue(load, options = {}) {
130
190
  if (pollIntervalMs === void 0 || pollIntervalMs <= 0) {
131
191
  return () => {
132
192
  cancelled = true;
193
+ retryLiveRef.current = false;
194
+ cancelTransientRetry();
133
195
  generation.current += 1;
134
196
  requestAbortRef.current?.abort();
135
197
  inFlightRef.current = null;
@@ -139,12 +201,14 @@ function usePolledValue(load, options = {}) {
139
201
  return () => {
140
202
  cancelled = true;
141
203
  if (timer !== null) clearTimeout(timer);
204
+ retryLiveRef.current = false;
205
+ cancelTransientRetry();
142
206
  generation.current += 1;
143
207
  requestAbortRef.current?.abort();
144
208
  inFlightRef.current = null;
145
209
  trailingRefreshRef.current = null;
146
210
  };
147
- }, [run, enabled, pageLive, pollIntervalMs]);
211
+ }, [run, enabled, pageLive, pollIntervalMs, cancelTransientRetry]);
148
212
  const identityMatches = stateIdentity.load === load;
149
213
  return {
150
214
  data: identityMatches ? data : null,
@@ -378,10 +442,12 @@ function useDebouncedCallback(callback, delayMs = 150) {
378
442
 
379
443
  export {
380
444
  usePageLiveActivity,
445
+ DEFAULT_TRANSIENT_READ_RETRY,
446
+ transientReadRetryStep,
381
447
  usePolledValue,
382
448
  useMutationRunner,
383
449
  projectionReadThrough,
384
450
  useSessionEventTrigger,
385
451
  useDebouncedCallback
386
452
  };
387
- //# sourceMappingURL=chunk-NAWXARTY.js.map
453
+ //# sourceMappingURL=chunk-2KO2G3RI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/internal.ts"],"sourcesContent":["import { isTransientRequestError, observedSessionSequence, type SessionEvent } from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { EmbeddedSessionEventClientLike } from \"../client\";\nimport { normalizeError } from \"../lib/error-message\";\n\nconst HIDDEN_STREAM_GRACE_MS = 2_000;\n\n/**\n * Keep live browser work active while the page is visible, then suspend it\n * after a short hidden-tab grace period. Returning to the page re-enables the\n * caller, which must reconcile durable state before resuming live delivery.\n */\nexport function usePageLiveActivity(hiddenGraceMs = HIDDEN_STREAM_GRACE_MS): boolean {\n // Keep the server and initial browser render identical; the effect applies\n // visibility after mount and preserves the intentional hidden-tab grace.\n const [active, setActive] = useState(true);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n let hiddenTimer: ReturnType<typeof setTimeout> | null = null;\n const cancelHiddenTimer = () => {\n if (hiddenTimer !== null) {\n clearTimeout(hiddenTimer);\n hiddenTimer = null;\n }\n };\n const sync = () => {\n cancelHiddenTimer();\n if (document.visibilityState !== \"hidden\") {\n setActive(true);\n return;\n }\n hiddenTimer = setTimeout(() => {\n hiddenTimer = null;\n if (document.visibilityState === \"hidden\") setActive(false);\n }, hiddenGraceMs);\n };\n document.addEventListener(\"visibilitychange\", sync);\n window.addEventListener(\"pageshow\", sync);\n sync();\n return () => {\n cancelHiddenTimer();\n document.removeEventListener(\"visibilitychange\", sync);\n window.removeEventListener(\"pageshow\", sync);\n };\n }, [hiddenGraceMs]);\n\n return active;\n}\n\nexport type AsyncListState<T> = {\n data: T | null;\n loading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n};\n\n/**\n * How a read hook rides out transient failures (a transport error or a\n * 502/503/504, as during an API rolling deploy). While the failures last less\n * than `quietWindowMs`, the hook keeps its loading state or its last data and\n * retries with backoff; after that it surfaces the error but keeps retrying\n * every `backgroundDelayMs`, and clears the error when a read succeeds.\n * Definitive errors (401, 403, 404, other statuses) surface immediately.\n */\nexport type TransientReadRetryOptions = {\n quietWindowMs?: number | undefined;\n initialDelayMs?: number | undefined;\n maxDelayMs?: number | undefined;\n backgroundDelayMs?: number | undefined;\n};\n\nexport type TransientReadRetryPolicy = {\n quietWindowMs: number;\n initialDelayMs: number;\n maxDelayMs: number;\n backgroundDelayMs: number;\n};\n\nexport const DEFAULT_TRANSIENT_READ_RETRY: Readonly<TransientReadRetryPolicy> = Object.freeze({\n quietWindowMs: 20_000,\n initialDelayMs: 1_000,\n maxDelayMs: 4_000,\n backgroundDelayMs: 15_000,\n});\n\ntype TransientReadStreak = { since: number; attempts: number; surfaced: boolean };\n\nfunction jittered(delayMs: number): number {\n return Math.round(delayMs * (0.8 + Math.random() * 0.4));\n}\n\n/**\n * The decision for one transient read failure: stay quiet and retry soon, or\n * surface the error (once per streak) and keep retrying in the background.\n */\nexport function transientReadRetryStep(\n streak: TransientReadStreak,\n now: number,\n policy: TransientReadRetryPolicy,\n): { quiet: boolean; delayMs: number } {\n streak.attempts += 1;\n const quiet = now - streak.since < policy.quietWindowMs;\n const delayMs = quiet\n ? Math.min(policy.maxDelayMs, policy.initialDelayMs * 2 ** (streak.attempts - 1))\n : policy.backgroundDelayMs;\n return { quiet, delayMs: Math.max(0, jittered(delayMs)) };\n}\n\n/**\n * Shared fetch + optional polling loop for the list/read hooks. Stale\n * responses (superseded by a newer load or an unmount) are dropped.\n * Transient failures are retried quietly (see {@link TransientReadRetryOptions}).\n */\nexport function usePolledValue<T>(\n load: (signal?: AbortSignal) => Promise<T>,\n options: {\n pollIntervalMs?: number | undefined;\n enabled?: boolean | undefined;\n /** Quiet retry of transient failures; on by default, `false` surfaces them at once. */\n transientRetry?: TransientReadRetryOptions | false | undefined;\n } = {},\n): AsyncListState<T> {\n const enabled = options.enabled ?? true;\n const pollIntervalMs = options.pollIntervalMs;\n const transientRetryRef = useRef<TransientReadRetryPolicy | null>(null);\n transientRetryRef.current =\n options.transientRetry === false\n ? null\n : {\n quietWindowMs:\n options.transientRetry?.quietWindowMs ?? DEFAULT_TRANSIENT_READ_RETRY.quietWindowMs,\n initialDelayMs:\n options.transientRetry?.initialDelayMs ?? DEFAULT_TRANSIENT_READ_RETRY.initialDelayMs,\n maxDelayMs: options.transientRetry?.maxDelayMs ?? DEFAULT_TRANSIENT_READ_RETRY.maxDelayMs,\n backgroundDelayMs:\n options.transientRetry?.backgroundDelayMs ??\n DEFAULT_TRANSIENT_READ_RETRY.backgroundDelayMs,\n };\n const pageLive = usePageLiveActivity();\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(enabled);\n const [error, setError] = useState<Error | null>(null);\n const generation = useRef(0);\n const activeLoadRef = useRef(load);\n useLayoutEffect(() => {\n activeLoadRef.current = load;\n }, [load]);\n const requestAbortRef = useRef<AbortController | null>(null);\n const inFlightRef = useRef<{ load: typeof load; promise: Promise<void> } | null>(null);\n const trailingRefreshRef = useRef<{ load: typeof load; promise: Promise<void> } | null>(null);\n // The current run of consecutive transient failures, and its pending retry.\n const transientStreakRef = useRef<TransientReadStreak | null>(null);\n const transientRetryTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Retries run only while the query is enabled and the page is live.\n const retryLiveRef = useRef(false);\n const cancelTransientRetry = useCallback(() => {\n if (transientRetryTimerRef.current !== null) {\n clearTimeout(transientRetryTimerRef.current);\n transientRetryTimerRef.current = null;\n }\n }, []);\n const [stateIdentity, setStateIdentity] = useState<{ load: typeof load }>(() => ({ load }));\n\n // A new loader identity means a new query (different session/workspace/...):\n // drop the previous result instead of showing it as the new query's data.\n useEffect(() => {\n if (stateIdentity.load !== load) {\n setStateIdentity({ load });\n setData(null);\n setError(null);\n }\n }, [load, stateIdentity.load]);\n\n const run = useCallback((): Promise<void> => {\n // A callback retained by a completed mutation from the previous query must\n // not supersede or settle the current query's request.\n if (activeLoadRef.current !== load) return Promise.resolve();\n const existing = inFlightRef.current;\n if (existing?.load === load) return existing.promise;\n const ticket = ++generation.current;\n const requestAbort = new AbortController();\n requestAbortRef.current = requestAbort;\n let promise!: Promise<void>;\n promise = (async () => {\n try {\n const result = await load(requestAbort.signal);\n if (\n ticket === generation.current &&\n activeLoadRef.current === load &&\n !requestAbort.signal.aborted\n ) {\n transientStreakRef.current = null;\n cancelTransientRetry();\n setData(result);\n setError(null);\n setLoading(false);\n }\n } catch (cause) {\n if (\n ticket === generation.current &&\n activeLoadRef.current === load &&\n !requestAbort.signal.aborted\n ) {\n const policy = transientRetryRef.current;\n if (policy && retryLiveRef.current && isTransientRequestError(cause)) {\n // Keep the loading state or the last data on screen while a\n // deploy or network blip passes; retry, and surface the error\n // only once it outlasts the quiet window.\n const now = Date.now();\n const streak = (transientStreakRef.current ??= {\n since: now,\n attempts: 0,\n surfaced: false,\n });\n const step = transientReadRetryStep(streak, now, policy);\n if (!step.quiet) {\n // One stable error per streak: background retries that fail\n // the same way must not re-announce it.\n if (!streak.surfaced) setError(normalizeError(cause));\n streak.surfaced = true;\n setLoading(false);\n }\n cancelTransientRetry();\n transientRetryTimerRef.current = setTimeout(() => {\n transientRetryTimerRef.current = null;\n if (retryLiveRef.current) void run();\n }, step.delayMs);\n } else {\n transientStreakRef.current = null;\n cancelTransientRetry();\n setError(normalizeError(cause));\n setLoading(false);\n }\n }\n } finally {\n if (requestAbortRef.current === requestAbort) requestAbortRef.current = null;\n if (inFlightRef.current?.promise === promise) inFlightRef.current = null;\n }\n })();\n inFlightRef.current = { load, promise };\n return promise;\n }, [cancelTransientRetry, load]);\n\n const refresh = useCallback((): Promise<void> => {\n const existing = inFlightRef.current;\n if (existing?.load !== load) return run();\n const trailing = trailingRefreshRef.current;\n if (trailing?.load === load) return trailing.promise;\n let promise!: Promise<void>;\n promise = existing.promise.then(async () => {\n if (trailingRefreshRef.current?.promise === promise) {\n trailingRefreshRef.current = null;\n }\n if (activeLoadRef.current === load) await run();\n });\n trailingRefreshRef.current = { load, promise };\n return promise;\n }, [load, run]);\n\n useEffect(() => {\n // Every (re)start begins a fresh streak; a pending retry belongs to the\n // previous query or visibility period.\n transientStreakRef.current = null;\n cancelTransientRetry();\n if (!enabled || !pageLive) {\n retryLiveRef.current = false;\n setLoading(false);\n generation.current += 1;\n requestAbortRef.current?.abort();\n inFlightRef.current = null;\n trailingRefreshRef.current = null;\n return;\n }\n retryLiveRef.current = true;\n setLoading(true);\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const schedule = () => {\n if (cancelled || pollIntervalMs === undefined || pollIntervalMs <= 0) return;\n timer = setTimeout(() => {\n timer = null;\n void run().finally(schedule);\n }, pollIntervalMs);\n };\n void run().finally(schedule);\n if (pollIntervalMs === undefined || pollIntervalMs <= 0) {\n return () => {\n cancelled = true;\n retryLiveRef.current = false;\n cancelTransientRetry();\n generation.current += 1;\n requestAbortRef.current?.abort();\n inFlightRef.current = null;\n trailingRefreshRef.current = null;\n };\n }\n return () => {\n cancelled = true;\n if (timer !== null) clearTimeout(timer);\n retryLiveRef.current = false;\n cancelTransientRetry();\n generation.current += 1;\n requestAbortRef.current?.abort();\n inFlightRef.current = null;\n trailingRefreshRef.current = null;\n };\n }, [run, enabled, pageLive, pollIntervalMs, cancelTransientRetry]);\n\n const identityMatches = stateIdentity.load === load;\n return {\n data: identityMatches ? data : null,\n loading: identityMatches ? loading : enabled,\n error: identityMatches ? error : null,\n refresh,\n };\n}\n\nexport type MutationState = {\n mutating: boolean;\n mutationError: Error | null;\n clearMutationError: () => void;\n};\n\n/**\n * Shared async mutation runner for the write hooks. `run` resolves with the\n * operation's value, or `null` after capturing the error in `mutationError`\n * (callers then roll back optimistic state).\n */\nexport function useMutationRunner(identity: unknown = undefined): MutationState & {\n run: <T>(operation: () => Promise<T>) => Promise<T | null>;\n} {\n const [mutating, setMutating] = useState(false);\n const [mutationError, setMutationError] = useState<Error | null>(null);\n const [stateIdentity, setStateIdentity] = useState<unknown>(() => identity);\n const inFlight = useRef(0);\n const generation = useRef(0);\n const identityRef = useRef(identity);\n useLayoutEffect(() => {\n if (Object.is(identityRef.current, identity)) return;\n identityRef.current = identity;\n generation.current += 1;\n inFlight.current = 0;\n }, [identity]);\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n useEffect(() => {\n if (!Object.is(stateIdentity, identity)) {\n setStateIdentity(() => identity);\n setMutating(false);\n setMutationError(null);\n }\n }, [identity, stateIdentity]);\n const run = useCallback(\n async <T>(operation: () => Promise<T>): Promise<T | null> => {\n const ownedIdentity = identity;\n const ownedGeneration = generation.current;\n if (!Object.is(identityRef.current, ownedIdentity)) return null;\n inFlight.current += 1;\n if (mounted.current) {\n setMutating(true);\n setMutationError(null);\n }\n try {\n const result = await operation();\n if (\n !mounted.current ||\n generation.current !== ownedGeneration ||\n !Object.is(identityRef.current, ownedIdentity)\n ) {\n return null;\n }\n return result;\n } catch (cause) {\n if (\n mounted.current &&\n generation.current === ownedGeneration &&\n Object.is(identityRef.current, ownedIdentity)\n ) {\n setMutationError(normalizeError(cause));\n }\n return null;\n } finally {\n if (\n generation.current === ownedGeneration &&\n Object.is(identityRef.current, ownedIdentity)\n ) {\n inFlight.current -= 1;\n if (mounted.current && inFlight.current === 0) {\n setMutating(false);\n }\n }\n }\n },\n [identity],\n );\n const identityMatches = Object.is(stateIdentity, identity);\n return {\n mutating: identityMatches && mutating,\n mutationError: identityMatches ? mutationError : null,\n clearMutationError: useCallback(() => {\n if (Object.is(identityRef.current, identity)) setMutationError(null);\n }, [identity]),\n run,\n };\n}\n\nexport type SessionEventFeedOptions = {\n /**\n * Share an existing event log (from `useSessionEvents`) instead of opening\n * a second stream. When omitted the hook tails the session's event stream\n * itself, starting at the current `lastSequence`.\n */\n events?: SessionEvent[] | undefined;\n enabled?: boolean | undefined;\n};\n\n/**\n * What a read hook's authoritative value reflects, for {@link useSessionEventTrigger}:\n *\n * - a number: every session event at or below this sequence (the session\n * detail's `lastSequence`, or a projection's `observedSessionSequence`);\n * - `\"reading\"`: the first read for this conversation is still in flight;\n * - `null` (or omitted): unknown, so every matching event refreshes.\n */\nexport type SessionReadThrough = number | \"reading\" | null;\n\n/** The sequence a projection read reflects, as {@link SessionReadThrough}. */\nexport function projectionReadThrough(\n value: unknown,\n firstReadInFlight: boolean,\n): SessionReadThrough {\n if (value === null || value === undefined) return firstReadInFlight ? \"reading\" : null;\n return observedSessionSequence(value) ?? null;\n}\n\nexport type SessionEventTriggerOptions = SessionEventFeedOptions & {\n /**\n * Shared-feed mode: deliver an event only when the hook's own read does not\n * already reflect it. While the first read is in flight, matching events\n * wait for it and the newest is delivered once if the read predates it.\n */\n readThrough?: SessionReadThrough | undefined;\n /**\n * Re-read the hook's projection. Called instead of delivering an event when\n * the feed's window starts after the sequence the read reflects, so events\n * between them (which could have changed the projection) were never seen.\n */\n refresh?: (() => void) | undefined;\n};\n\ntype HeldBatch = { latestMatch: SessionEvent | undefined; windowStart: number };\n\n/**\n * Invoke `onEvent` for every session event matching `match` — the live-update\n * primitive behind `useTurnQueue` and `useGoal`. Either watches a shared\n * `events` log or tails the stream directly (reconnect handled by the SDK).\n */\nexport function useSessionEventTrigger(\n client: EmbeddedSessionEventClientLike,\n workspaceId: string,\n sessionId: string | null | undefined,\n match: (event: SessionEvent) => boolean,\n onEvent: (event: SessionEvent) => void,\n options: SessionEventTriggerOptions = {},\n reconcileBeforeLive?: (() => void | Promise<void>) | undefined,\n): void {\n const enabled = options.enabled ?? true;\n const pageLive = usePageLiveActivity();\n const liveEnabled = enabled && pageLive;\n const events = options.events;\n const sharedFeed = events !== undefined;\n const readThrough = options.readThrough ?? null;\n const matchRef = useRef(match);\n const onEventRef = useRef(onEvent);\n const reconcileBeforeLiveRef = useRef(reconcileBeforeLive);\n const readThroughRef = useRef(readThrough);\n const refreshRef = useRef(options.refresh);\n useLayoutEffect(() => {\n matchRef.current = match;\n onEventRef.current = onEvent;\n reconcileBeforeLiveRef.current = reconcileBeforeLive;\n readThroughRef.current = readThrough;\n refreshRef.current = options.refresh;\n }, [match, onEvent, reconcileBeforeLive, readThrough, options.refresh]);\n const consumedRef = useRef(0);\n const feedKeyRef = useRef<string | null>(null);\n const sharedFeedHasEventsRef = useRef(false);\n // The newest matching event that arrived while the first read was in flight,\n // and the latest window start the feed reported meanwhile.\n const awaitingReadRef = useRef<HeldBatch | null>(null);\n const deliverBatch = useCallback((batch: HeldBatch) => {\n const through = readThroughRef.current;\n if (through === \"reading\") {\n const waiting = awaitingReadRef.current;\n const latest =\n waiting?.latestMatch &&\n (!batch.latestMatch || waiting.latestMatch.sequence > batch.latestMatch.sequence)\n ? waiting.latestMatch\n : batch.latestMatch;\n awaitingReadRef.current = {\n latestMatch: latest,\n windowStart: Math.max(waiting?.windowStart ?? 0, batch.windowStart),\n };\n return;\n }\n if (typeof through === \"number\") {\n // Events between the read and the window's first event were never seen.\n if (batch.windowStart > through + 1 && refreshRef.current) {\n refreshRef.current();\n return;\n }\n if (batch.latestMatch && batch.latestMatch.sequence > through) {\n onEventRef.current(batch.latestMatch);\n }\n return;\n }\n if (batch.latestMatch) onEventRef.current(batch.latestMatch);\n }, []);\n const deliver = useCallback(\n (event: SessionEvent) => deliverBatch({ latestMatch: event, windowStart: 0 }),\n [deliverBatch],\n );\n // The first read landed: settle what waited for it against what it reflects.\n useEffect(() => {\n if (readThrough === \"reading\") return;\n const waiting = awaitingReadRef.current;\n awaitingReadRef.current = null;\n if (waiting && sharedFeed && liveEnabled) deliverBatch(waiting);\n }, [deliverBatch, liveEnabled, readThrough, sharedFeed]);\n\n // Shared-log mode: scan only the unseen tail on every append.\n useEffect(() => {\n if (!sharedFeed || !liveEnabled || !sessionId) {\n return;\n }\n const feedKey = `${workspaceId}\\u0000${sessionId}`;\n const firstSequence = events[0]?.sequence ?? 0;\n if (feedKeyRef.current !== feedKey) {\n feedKeyRef.current = feedKey;\n awaitingReadRef.current = null;\n sharedFeedHasEventsRef.current = events.length > 0;\n // The caller has already loaded its authoritative initial projection.\n // Seed from the shared log's current tail so mounting a large historical\n // session cannot replay every old event as a new live trigger.\n consumedRef.current = events.at(-1)?.sequence ?? 0;\n return;\n }\n const firstNonEmptyBatch = !sharedFeedHasEventsRef.current && events.length > 0;\n if (firstNonEmptyBatch || firstSequence > consumedRef.current + 1) {\n // The usual shared feed mounts empty, then receives a historical tail.\n // A later discontinuity can likewise replace the retained browser\n // window. In either case, reconcile once from the latest relevant event\n // instead of replaying the whole retained window as live traffic.\n sharedFeedHasEventsRef.current = events.length > 0;\n consumedRef.current = events.at(-1)?.sequence ?? consumedRef.current;\n let latestMatch: SessionEvent | undefined;\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event && matchRef.current(event)) {\n latestMatch = event;\n break;\n }\n }\n deliverBatch({ latestMatch, windowStart: firstSequence });\n return;\n }\n sharedFeedHasEventsRef.current ||= events.length > 0;\n for (const event of events) {\n if (event.sequence <= consumedRef.current) {\n continue;\n }\n consumedRef.current = event.sequence;\n if (matchRef.current(event)) {\n deliver(event);\n }\n }\n }, [sharedFeed, liveEnabled, events, workspaceId, sessionId, deliver, deliverBatch]);\n\n // Self-stream mode: tail from the session's current lastSequence.\n useEffect(() => {\n if (sharedFeed || !liveEnabled || !sessionId) {\n return;\n }\n const controller = new AbortController();\n void (async () => {\n try {\n const session = await client.getSession(workspaceId, sessionId);\n if (controller.signal.aborted) {\n return;\n }\n const stream = client.streamEvents(workspaceId, sessionId, {\n after: session.lastSequence,\n signal: controller.signal,\n onOpen: () => {\n // Start reconciliation without delaying consumption of live SSE.\n void Promise.resolve()\n .then(() => reconcileBeforeLiveRef.current?.())\n .catch(() => undefined);\n },\n });\n for await (const event of stream) {\n if (matchRef.current(event)) {\n onEventRef.current(event);\n }\n }\n } catch {\n // Live updates are best-effort: the read hooks still expose refresh()\n // and the initial load already populated state.\n }\n })();\n return () => {\n controller.abort();\n };\n }, [sharedFeed, liveEnabled, client, workspaceId, sessionId]);\n}\n\n/** Debounce rapid event bursts into one trailing call (default 150ms). */\nexport function useDebouncedCallback(callback: () => void, delayMs = 150): () => void {\n const callbackRef = useRef(callback);\n useLayoutEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n return useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n callbackRef.current();\n }, delayMs);\n }, [delayMs]);\n}\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  invalidateSharedQueries,
4
4
  peekSharedQuery,
5
5
  sharedQueryWriter
6
- } from "./chunk-JKUICTLM.js";
6
+ } from "./chunk-NLAFNMPK.js";
7
7
 
8
8
  // src/hooks/session-view-cache.ts
9
9
  import { OpenGeniApiError } from "@opengeni/sdk";
@@ -99,4 +99,4 @@ export {
99
99
  deniesRetainedView,
100
100
  useRetainedSessionView
101
101
  };
102
- //# sourceMappingURL=chunk-TWXIFWBD.js.map
102
+ //# sourceMappingURL=chunk-34EU25RL.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  ProviderRecoveryNotice
4
- } from "./chunk-P5T36BA3.js";
4
+ } from "./chunk-FRP64DEK.js";
5
5
 
6
6
  // src/app/components/session/model-recovery-notice.tsx
7
7
  import { jsx } from "react/jsx-runtime";
@@ -12,4 +12,4 @@ function ModelRecoveryNotice({ recovery }) {
12
12
  export {
13
13
  ModelRecoveryNotice
14
14
  };
15
- //# sourceMappingURL=chunk-PTGRFAMH.js.map
15
+ //# sourceMappingURL=chunk-3ABPIUCK.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-W6KAUGXO.js";
8
8
  import {
9
9
  useMachines
10
- } from "./chunk-HT5WSUC7.js";
10
+ } from "./chunk-QXEDIDBZ.js";
11
11
  import {
12
12
  useOpenGeni
13
13
  } from "./chunk-TVQCDDSZ.js";
@@ -53,4 +53,4 @@ function useWorkspaceMachines(options = {}) {
53
53
  export {
54
54
  useWorkspaceMachines
55
55
  };
56
- //# sourceMappingURL=chunk-722UO6YQ.js.map
56
+ //# sourceMappingURL=chunk-3PEXVG4D.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  rememberedProjectCompute
4
- } from "./chunk-JXT5QDJC.js";
4
+ } from "./chunk-KNFDWNCH.js";
5
5
 
6
6
  // src/app/routes/sessions-index-hydration.tsx
7
7
  function initialNewSessionProjectLaunchIntent(launchChannelId) {
@@ -53,4 +53,4 @@ export {
53
53
  resolveHydratedNewSessionProjectSelection,
54
54
  hydratedNewSessionProjectProvenancePresent
55
55
  };
56
- //# sourceMappingURL=chunk-N3ZP4IDU.js.map
56
+ //# sourceMappingURL=chunk-45WYYFP6.js.map
@@ -4,16 +4,16 @@ import {
4
4
  } from "./chunk-XVVJBNUQ.js";
5
5
  import {
6
6
  scheduledTaskIdOf
7
- } from "./chunk-BJIZ7PL7.js";
7
+ } from "./chunk-D64Z4V26.js";
8
8
  import {
9
9
  sessionSiteOrigin
10
10
  } from "./chunk-K3TJNJSU.js";
11
11
  import {
12
12
  sessionStatusLabel
13
- } from "./chunk-GTQ3SNEI.js";
13
+ } from "./chunk-E36IC3LU.js";
14
14
  import {
15
15
  t
16
- } from "./chunk-HPPKLBTJ.js";
16
+ } from "./chunk-TJQDL3JH.js";
17
17
  import {
18
18
  formatAbsoluteTime,
19
19
  inSentence
@@ -21,7 +21,7 @@ import {
21
21
  import {
22
22
  sessionHasUpcomingSchedule,
23
23
  sessionInputWait
24
- } from "./chunk-Z5WMLJKI.js";
24
+ } from "./chunk-F2RMKGDQ.js";
25
25
  import {
26
26
  sessionAdmissionBlocked,
27
27
  sessionDisplayStatus
@@ -196,4 +196,4 @@ export {
196
196
  sessionHoverFacts,
197
197
  sessionHoverDescription
198
198
  };
199
- //# sourceMappingURL=chunk-HOJGAJAB.js.map
199
+ //# sourceMappingURL=chunk-4MQLGMV2.js.map
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import {
3
3
  useTimelineSearchReveal
4
- } from "./chunk-R63QEVPK.js";
4
+ } from "./chunk-SJORXXLV.js";
5
5
  import {
6
6
  cn
7
7
  } from "./chunk-TXS65BB2.js";
8
8
  import {
9
9
  useOpenGeniText
10
- } from "./chunk-5JZYPZ72.js";
10
+ } from "./chunk-JFK7NTEA.js";
11
11
 
12
12
  // src/components/user-message-body.tsx
13
13
  import {
@@ -396,4 +396,4 @@ export {
396
396
  userMessageLikelyNeedsDisclosure,
397
397
  UserMessageBody
398
398
  };
399
- //# sourceMappingURL=chunk-L7YURQI2.js.map
399
+ //# sourceMappingURL=chunk-4U4GXWXS.js.map
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-IIFO2H3P.js";
5
5
  import {
6
6
  t
7
- } from "./chunk-HPPKLBTJ.js";
7
+ } from "./chunk-TJQDL3JH.js";
8
8
  import {
9
9
  buildTimeline
10
- } from "./chunk-5MZTJMZ3.js";
10
+ } from "./chunk-6MRY2RUZ.js";
11
11
  import {
12
12
  presentFailure
13
13
  } from "./chunk-SJGAHTY5.js";
@@ -298,4 +298,4 @@ export {
298
298
  sandboxProvisionInFlight,
299
299
  eventLabel
300
300
  };
301
- //# sourceMappingURL=chunk-63VGE4OH.js.map
301
+ //# sourceMappingURL=chunk-5HIOVXOX.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-PRJUHXST.js";
5
5
  import {
6
6
  t
7
- } from "./chunk-HPPKLBTJ.js";
7
+ } from "./chunk-TJQDL3JH.js";
8
8
  import {
9
9
  userErrorText
10
10
  } from "./chunk-L4OF77LE.js";
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  invalidateSharedQueries,
16
16
  useSharedQuery
17
- } from "./chunk-JKUICTLM.js";
17
+ } from "./chunk-NLAFNMPK.js";
18
18
  import {
19
19
  projectPickerRows,
20
20
  sortPickerRows
@@ -68,4 +68,4 @@ function useWorkspaceModelCatalog(workspaceId, fundingRevision) {
68
68
  export {
69
69
  useWorkspaceModelCatalog
70
70
  };
71
- //# sourceMappingURL=chunk-GFUUFM2O.js.map
71
+ //# sourceMappingURL=chunk-5M23GZA2.js.map
@@ -93,6 +93,7 @@ function RailTrailingMetadata({
93
93
  summary,
94
94
  scheduled = false,
95
95
  relativeTime,
96
+ jumpKey,
96
97
  creator,
97
98
  quickActionSlots = 0
98
99
  }) {
@@ -100,7 +101,7 @@ function RailTrailingMetadata({
100
101
  const hasRelativeTime = Boolean(relativeTime);
101
102
  const hasMonogram = creator ? creatorInitials(creator) !== null : false;
102
103
  const waitingFor = summary.kind === "needs_attention" && summary.attentionSince ? formatWaitingSince(summary.attentionSince) : "";
103
- if (!scheduled && !hasStatusMarker && !hasRelativeTime && !hasMonogram && !quickActionSlots)
104
+ if (!scheduled && !hasStatusMarker && !hasRelativeTime && !jumpKey && !hasMonogram && !quickActionSlots)
104
105
  return null;
105
106
  const items = Children.toArray([
106
107
  scheduled ? /* @__PURE__ */ jsx(
@@ -123,7 +124,15 @@ function RailTrailingMetadata({
123
124
  "waiting"
124
125
  ) : null,
125
126
  hasStatusMarker ? /* @__PURE__ */ jsx("span", { className: "flex size-3 items-center justify-center", title: summary.label, children: /* @__PURE__ */ jsx(RailAggregateDot, { summary }) }, "status") : null,
126
- hasRelativeTime ? /* @__PURE__ */ jsx(
127
+ jumpKey ? /* @__PURE__ */ jsx(
128
+ "kbd",
129
+ {
130
+ "data-session-row-jump-key": true,
131
+ className: "inline-flex h-4.5 min-w-9 shrink-0 items-center justify-center rounded-[4px] border border-border bg-surface-2 px-1 font-sans text-2xs leading-none font-medium whitespace-nowrap text-fg-muted",
132
+ children: jumpKey
133
+ },
134
+ "time"
135
+ ) : hasRelativeTime ? /* @__PURE__ */ jsx(
127
136
  "span",
128
137
  {
129
138
  className: "min-w-9 shrink-0 whitespace-nowrap text-right text-2xs tabular-nums text-fg",
@@ -165,6 +174,7 @@ function SessionRowContent({
165
174
  summary,
166
175
  scheduled = false,
167
176
  relativeTime,
177
+ jumpKey,
168
178
  creator,
169
179
  quickActionSlots = 0
170
180
  }) {
@@ -191,6 +201,7 @@ function SessionRowContent({
191
201
  summary,
192
202
  scheduled,
193
203
  relativeTime,
204
+ jumpKey,
194
205
  creator
195
206
  }
196
207
  )
@@ -203,4 +214,4 @@ export {
203
214
  RailTrailingMetadata,
204
215
  SessionRowContent
205
216
  };
206
- //# sourceMappingURL=chunk-PM3OSANE.js.map
217
+ //# sourceMappingURL=chunk-5MJHH72T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/components/rail/session-row-content.tsx"],"sourcesContent":["import {\n CalendarClockIcon,\n Clock3Icon,\n HourglassIcon,\n Loader2Icon,\n TriangleAlertIcon,\n} from \"lucide-react\";\nimport { Children, isValidElement, useId } from \"react\";\n\nimport { CreatorMonogram } from \"../creator-monogram\";\nimport { type CreatorRef, creatorAnnouncement, creatorInitials } from \"../../lib/creator-initials\";\nimport { formatWaitingSince } from \"../../lib/format\";\nimport { cn } from \"../../lib/utils\";\nimport type { RailAggregateStatus } from \"../../lib/sessions-group\";\n\nexport function ActiveWorkMark({ className }: { className?: string | undefined }) {\n const maskId = `active-work-${useId().replaceAll(\":\", \"\")}`;\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 108 108\"\n className={cn(\"size-2.5 shrink-0 text-session-update\", className)}\n >\n <defs>\n <mask id={maskId} maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"108\" height=\"108\">\n <circle cx=\"54\" cy=\"54\" r=\"48\" fill=\"white\" />\n <g fill=\"none\" stroke=\"black\" strokeWidth=\"21\" strokeLinecap=\"round\">\n <path d=\"M-8 43 C35 40 71 29 116 16\" />\n <path d=\"M-8 86 C35 83 71 72 116 59\" />\n </g>\n </mask>\n </defs>\n <circle cx=\"54\" cy=\"54\" r=\"48\" fill=\"currentColor\" mask={`url(#${maskId})`} />\n <circle cx=\"54\" cy=\"54\" r=\"48\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" />\n </svg>\n );\n}\n\n/** The one descendant-aware status marker shared by rows and section headers. */\nfunction RailAggregateDot({ summary }: { summary: RailAggregateStatus }) {\n if (summary.kind === \"neutral\") return null;\n if (summary.kind === \"active\") {\n return (\n <Loader2Icon\n aria-hidden=\"true\"\n className=\"size-3 shrink-0 animate-spin text-fg-subtle motion-reduce:animate-none\"\n style={{ animationDuration: \"1.333333s\" }}\n />\n );\n }\n if (summary.kind === \"queued\") {\n return <Clock3Icon aria-hidden=\"true\" className=\"size-3 shrink-0 text-fg-subtle\" />;\n }\n if (summary.kind === \"waiting\") {\n // Parked until input or its wake-up time: nothing is executing, so no spinner.\n return <HourglassIcon aria-hidden=\"true\" className=\"size-3 shrink-0 text-fg-subtle\" />;\n }\n if (summary.kind === \"active_work\") {\n return <ActiveWorkMark />;\n }\n if (summary.kind === \"send_failed\") {\n return (\n <TriangleAlertIcon aria-hidden=\"true\" className=\"size-3.5 shrink-0 text-status-failed\" />\n );\n }\n const tone =\n summary.kind === \"needs_attention\"\n ? \"bg-status-waiting\"\n : summary.kind === \"failed\"\n ? \"bg-status-failed\"\n : \"bg-session-update\";\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\"relative inline-flex size-2 shrink-0 rounded-full\", tone)}\n />\n );\n}\n\n/**\n * The row's announced name.\n *\n * `aria-label` replaces name-from-content, so this string is the whole of what\n * a screen reader hears for the row: the creator chip is `aria-hidden`, and\n * even the sr-only state line inside the link is inert for it. Every fact a\n * sighted user reads off the row belongs here, and in exactly one place.\n */\nexport function sessionRowAccessibleName({\n title,\n stateLabel,\n pinned,\n statusLabel,\n spawnedLabel,\n creator,\n}: {\n title: string;\n stateLabel: string;\n pinned: boolean;\n statusLabel: string;\n spawnedLabel?: string | null | undefined;\n creator?: CreatorRef | null | undefined;\n}): string {\n const spokenCreator = creatorAnnouncement(creator ?? null);\n return `Open ${title}. ${stateLabel}${pinned ? \". Pinned\" : \"\"}. ${statusLabel}${\n spawnedLabel ? `. ${spawnedLabel}` : \"\"\n }${spokenCreator ? `. Created by ${spokenCreator}` : \"\"}`;\n}\n\nexport function RailTrailingMetadata({\n summary,\n scheduled = false,\n relativeTime,\n jumpKey,\n creator,\n quickActionSlots = 0,\n}: {\n summary: RailAggregateStatus;\n scheduled?: boolean | undefined;\n relativeTime?: string | undefined;\n /** The key that opens this row (\"⌘3\"), shown in place of the time while ⌘ is held. */\n jumpKey?: string | undefined;\n /** Rightmost items replaced in place by the row's desktop quick actions. */\n quickActionSlots?: number | undefined;\n /**\n * Session creator for a top-level row, else null; callers decide which rows\n * are roots. A chip is its own reason to render this block: a mobile root row\n * can have no status marker and no time and still name who started it.\n */\n creator?: CreatorRef | null | undefined;\n}) {\n const hasStatusMarker = summary.kind !== \"neutral\";\n const hasRelativeTime = Boolean(relativeTime);\n const hasMonogram = creator ? creatorInitials(creator) !== null : false;\n // How long the longest-waiting session behind a \"needs you\" marker has been\n // blocked on a human. A collapsed parent with a child parked for ten hours\n // must say so, not hide it behind a dot.\n const waitingFor =\n summary.kind === \"needs_attention\" && summary.attentionSince\n ? formatWaitingSince(summary.attentionSince)\n : \"\";\n if (\n !scheduled &&\n !hasStatusMarker &&\n !hasRelativeTime &&\n !jumpKey &&\n !hasMonogram &&\n !quickActionSlots\n )\n return null;\n const items = Children.toArray([\n scheduled ? (\n <CalendarClockIcon\n key=\"schedule\"\n aria-label=\"Scheduled task\"\n className=\"size-3.5 shrink-0 text-fg-subtle\"\n />\n ) : null,\n hasMonogram && creator ? (\n <CreatorMonogram key=\"creator\" createdBy={creator} showTitle={false} />\n ) : null,\n waitingFor ? (\n <span\n key=\"waiting\"\n data-session-row-waiting\n title={summary.label}\n className=\"shrink-0 whitespace-nowrap text-2xs tabular-nums text-status-waiting\"\n >\n {waitingFor}\n </span>\n ) : null,\n hasStatusMarker ? (\n <span key=\"status\" className=\"flex size-3 items-center justify-center\" title={summary.label}>\n <RailAggregateDot summary={summary} />\n </span>\n ) : null,\n jumpKey ? (\n <kbd\n key=\"time\"\n data-session-row-jump-key\n className=\"inline-flex h-4.5 min-w-9 shrink-0 items-center justify-center rounded-[4px] border border-border bg-surface-2 px-1 font-sans text-2xs leading-none font-medium whitespace-nowrap text-fg-muted\"\n >\n {jumpKey}\n </kbd>\n ) : hasRelativeTime ? (\n <span\n key=\"time\"\n className=\"min-w-9 shrink-0 whitespace-nowrap text-right text-2xs tabular-nums text-fg\"\n >\n {relativeTime}\n </span>\n ) : null,\n ]).filter(isValidElement);\n if (!quickActionSlots) {\n return (\n <span\n data-session-row-metadata\n className=\"inline-flex shrink-0 items-center justify-end gap-1\"\n >\n {items}\n </span>\n );\n }\n // Empty rows still reserve their action footprint. Visibility (never display\n // or padding) swaps the last items, keeping every other box stationary.\n while (items.length < quickActionSlots) items.unshift(<span key={`empty-${items.length}`} />);\n return (\n <span data-session-row-metadata className=\"inline-flex shrink-0 items-center justify-end\">\n {items.map((item, index) => (\n <span\n key={item.key}\n data-session-row-slot\n className={cn(\n \"inline-flex min-w-6 shrink-0 items-center justify-center last:min-w-10\",\n index >= items.length - quickActionSlots &&\n \"pointer-fine:group-hover:invisible pointer-fine:group-focus-within:invisible\",\n )}\n >\n {item}\n </span>\n ))}\n </span>\n );\n}\n\nexport function SessionRowContent({\n title,\n stateLabel,\n depthLabel,\n descendantLabel,\n mobile,\n summary,\n scheduled = false,\n relativeTime,\n jumpKey,\n creator,\n quickActionSlots = 0,\n}: {\n title: string;\n stateLabel: string;\n depthLabel?: string | null | undefined;\n descendantLabel?: string | null | undefined;\n mobile: boolean;\n summary: RailAggregateStatus;\n scheduled?: boolean | undefined;\n relativeTime?: string | undefined;\n /** See RailTrailingMetadata. */\n jumpKey?: string | undefined;\n quickActionSlots?: number | undefined;\n /** Session creator for a top-level row, else null. See RailTrailingMetadata. */\n creator?: CreatorRef | null | undefined;\n}) {\n return (\n <>\n {/* Inert for the row's accessible name, which its `aria-label` owns -\n including the creator. Kept as-is so this change regresses nothing. */}\n <span className=\"sr-only\">{stateLabel}. </span>\n <span className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span data-session-row-title className=\"block min-w-0 overflow-hidden whitespace-nowrap\">\n {title}\n </span>\n {mobile ? (\n <span\n data-session-row-state\n className=\"mt-0.5 truncate text-2xs font-normal text-fg-muted\"\n >\n {[stateLabel, depthLabel, descendantLabel, relativeTime].filter(Boolean).join(\" · \")}\n </span>\n ) : null}\n </span>\n <RailTrailingMetadata\n quickActionSlots={quickActionSlots}\n summary={summary}\n scheduled={scheduled}\n relativeTime={relativeTime}\n jumpKey={jumpKey}\n creator={creator}\n />\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  useMutationRunner,
4
4
  usePolledValue
5
- } from "./chunk-NAWXARTY.js";
5
+ } from "./chunk-2KO2G3RI.js";
6
6
  import {
7
7
  useOpenGeni
8
8
  } from "./chunk-TVQCDDSZ.js";
@@ -164,4 +164,4 @@ function useChannels(options = {}) {
164
164
  export {
165
165
  useChannels
166
166
  };
167
- //# sourceMappingURL=chunk-RKB2Z457.js.map
167
+ //# sourceMappingURL=chunk-5VGJXWQ2.js.map
@@ -4,16 +4,7 @@ import {
4
4
  } from "./chunk-CM7LVUKC.js";
5
5
  import {
6
6
  useOpenGeniText
7
- } from "./chunk-5JZYPZ72.js";
8
-
9
- // src/components/queue-draft-policy.ts
10
- function requestQueueDraftEdit(composer, confirmReplacement, editImmediately) {
11
- if (composer.hasDraftContent()) {
12
- confirmReplacement();
13
- } else {
14
- editImmediately();
15
- }
16
- }
7
+ } from "./chunk-JFK7NTEA.js";
17
8
 
18
9
  // src/components/queue-surface-state.tsx
19
10
  import { Loader2Icon, RotateCwIcon } from "lucide-react";
@@ -105,9 +96,8 @@ function QueueErrorAlert({
105
96
  }
106
97
 
107
98
  export {
108
- requestQueueDraftEdit,
109
99
  EmptyQueueStateSurface,
110
100
  QueueStoppingStatus,
111
101
  QueueErrorAlert
112
102
  };
113
- //# sourceMappingURL=chunk-6W3LF3DB.js.map
103
+ //# sourceMappingURL=chunk-5YFY4SFC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/queue-surface-state.tsx"],"sourcesContent":["import { Loader2Icon, RotateCwIcon } from \"lucide-react\";\n\nimport type { UseTurnQueueResult } from \"../hooks/use-turn-queue\";\nimport { useErrorMessage } from \"../lib/error-message\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\ntype QueueStateProps = {\n queue: UseTurnQueueResult;\n};\n\nexport function EmptyQueueStateSurface({ queue }: QueueStateProps) {\n const hasError = Boolean(queue.error || queue.mutationError);\n return (\n <div\n className=\"og-root mx-auto mb-2 w-full max-w-3xl shrink-0 px-4 sm:px-6\"\n data-testid=\"queue-surface\"\n >\n <div className=\"overflow-hidden rounded-lg border border-border bg-surface/80 shadow-sm\">\n {queue.stoppingPreviousAttempt ? (\n <QueueStoppingStatus queue={queue} dividerAfter={hasError} />\n ) : null}\n {hasError ? <QueueErrorAlert queue={queue} /> : null}\n </div>\n </div>\n );\n}\n\nexport function QueueStoppingStatus({\n queue,\n dividerAfter = false,\n}: QueueStateProps & { dividerAfter?: boolean }) {\n const t = useOpenGeniText();\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={`flex min-h-11 items-center gap-2.5 bg-status-waiting/[0.07] px-3 py-2 text-og-control text-fg ${\n dividerAfter ? \"border-b border-status-waiting/20\" : \"\"\n }`}\n data-testid=\"stopping-previous-attempt\"\n >\n <Loader2Icon\n aria-hidden=\"true\"\n className=\"size-3.5 shrink-0 animate-spin text-status-waiting motion-reduce:animate-none\"\n />\n <span className=\"min-w-0\">\n <span className=\"font-medium\">\n {queue.effectiveControl?.state === \"paused\"\n ? t(\"queueSurfaceState.stoppingCurrentAttempt\")\n : t(\"queueSurfaceState.stoppingPreviousAttempt\")}\n </span>{\" \"}\n <span className=\"text-fg-muted\">\n {queue.effectiveControl?.state === \"paused\"\n ? t(\"queueSurfaceState.queuedWorkStaysSavedUntil\")\n : t(\"queueSurfaceState.queuedWorkIsSavedAnd\")}\n </span>\n </span>\n </div>\n );\n}\n\nexport function QueueErrorAlert({\n queue,\n dividerBefore = false,\n}: QueueStateProps & { dividerBefore?: boolean }) {\n const t = useOpenGeniText();\n const formatError = useErrorMessage();\n return (\n <div className={`${dividerBefore ? \"border-t border-border\" : \"\"} p-2`}>\n <div\n role=\"alert\"\n className=\"flex min-w-0 max-w-full flex-wrap items-start gap-2 rounded-md bg-status-failed/10 px-2 py-1.5 text-og-control text-status-failed\"\n >\n <span\n role=\"region\"\n aria-label={t(\"queueSurfaceState.queueErrorDetails\")}\n tabIndex={0}\n className=\"max-h-[min(5rem,20dvh)] min-w-0 max-w-full flex-[1_1_5rem] overflow-auto overscroll-contain whitespace-pre-wrap rounded-sm outline-hidden [overflow-wrap:anywhere] [unicode-bidi:plaintext] focus-visible:ring-2 focus-visible:ring-ring/40\"\n data-testid=\"queue-error-message\"\n dir=\"auto\"\n >\n {formatError(queue.mutationError ?? queue.error)}\n </span>\n <button\n type=\"button\"\n onClick={() => {\n queue.clearMutationError();\n void queue.refresh();\n }}\n aria-label={t(\"queueSurfaceState.dismissQueueErrorAndRetry\")}\n title={t(\"queueSurfaceState.retryLoadingTheQueue\")}\n className=\"ms-auto inline-flex size-7 shrink-0 items-center justify-center self-start rounded-md outline-hidden transition-colors hover:bg-surface-3 focus-visible:ring-2 focus-visible:ring-ring/40 motion-reduce:transition-none pointer-coarse:size-[44px]\"\n >\n <RotateCwIcon className=\"size-3.5\" />\n </button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAAA,SAAS,aAAa,oBAAoB;AAiBpC,SAEI,KAFJ;AAPC,SAAS,uBAAuB,EAAE,MAAM,GAAoB;AACjE,QAAM,WAAW,QAAQ,MAAM,SAAS,MAAM,aAAa;AAC3D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAY;AAAA,MAEZ,+BAAC,SAAI,WAAU,2EACZ;AAAA,cAAM,0BACL,oBAAC,uBAAoB,OAAc,cAAc,UAAU,IACzD;AAAA,QACH,WAAW,oBAAC,mBAAgB,OAAc,IAAK;AAAA,SAClD;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA,eAAe;AACjB,GAAiD;AAC/C,QAAM,IAAI,gBAAgB;AAC1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,WAAW,iGACT,eAAe,sCAAsC,EACvD;AAAA,MACA,eAAY;AAAA,MAEZ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACZ;AAAA,QACA,qBAAC,UAAK,WAAU,WACd;AAAA,8BAAC,UAAK,WAAU,eACb,gBAAM,kBAAkB,UAAU,WAC/B,EAAE,0CAA0C,IAC5C,EAAE,2CAA2C,GACnD;AAAA,UAAQ;AAAA,UACR,oBAAC,UAAK,WAAU,iBACb,gBAAM,kBAAkB,UAAU,WAC/B,EAAE,6CAA6C,IAC/C,EAAE,wCAAwC,GAChD;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,gBAAgB;AAClB,GAAkD;AAChD,QAAM,IAAI,gBAAgB;AAC1B,QAAM,cAAc,gBAAgB;AACpC,SACE,oBAAC,SAAI,WAAW,GAAG,gBAAgB,2BAA2B,EAAE,QAC9D;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MAEV;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,EAAE,qCAAqC;AAAA,YACnD,UAAU;AAAA,YACV,WAAU;AAAA,YACV,eAAY;AAAA,YACZ,KAAI;AAAA,YAEH,sBAAY,MAAM,iBAAiB,MAAM,KAAK;AAAA;AAAA,QACjD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AACb,oBAAM,mBAAmB;AACzB,mBAAK,MAAM,QAAQ;AAAA,YACrB;AAAA,YACA,cAAY,EAAE,6CAA6C;AAAA,YAC3D,OAAO,EAAE,wCAAwC;AAAA,YACjD,WAAU;AAAA,YAEV,8BAAC,gBAAa,WAAU,YAAW;AAAA;AAAA,QACrC;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import {
3
3
  formatElapsed
4
- } from "./chunk-TQGJN5UZ.js";
4
+ } from "./chunk-AW3QEFOF.js";
5
5
  import {
6
6
  timelineGroupContainsPresentedImage
7
- } from "./chunk-ANHUMDJX.js";
7
+ } from "./chunk-WNDTLK44.js";
8
8
  import {
9
9
  formatClockTime
10
10
  } from "./chunk-SJGAHTY5.js";
@@ -410,4 +410,4 @@ export {
410
410
  timelineGroupSequences,
411
411
  timelineGroupIndexAtSequence
412
412
  };
413
- //# sourceMappingURL=chunk-I6VUUEXH.js.map
413
+ //# sourceMappingURL=chunk-6AFSZKZA.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  workspaceSessionPath
4
- } from "./chunk-WRLWLGEF.js";
4
+ } from "./chunk-Y5E3XQ2S.js";
5
5
 
6
6
  // src/app/lib/session-deep-link.tsx
7
7
  var SESSION_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -71,4 +71,4 @@ export {
71
71
  canonicalSessionDeepLinkTarget,
72
72
  shouldRedirectSessionDeepLink
73
73
  };
74
- //# sourceMappingURL=chunk-FBMU3VK5.js.map
74
+ //# sourceMappingURL=chunk-6DCEDIF6.js.map
@@ -1,8 +1,11 @@
1
1
  "use client";
2
+ import {
3
+ invokedTool
4
+ } from "./chunk-ULYQEFNH.js";
2
5
  import {
3
6
  mcpToolLeaf,
4
7
  toolMatchesLeaf
5
- } from "./chunk-STUCI6QA.js";
8
+ } from "./chunk-LEKBNKLD.js";
6
9
  import {
7
10
  CREDIT_EXHAUSTION_MESSAGE,
8
11
  isCreditExhaustion,
@@ -1058,18 +1061,21 @@ function buildTimeline(t, events, options = {}) {
1058
1061
  if (callId && humanInputToolCallIds.has(callId)) {
1059
1062
  break;
1060
1063
  }
1061
- if (toolMatchesLeaf(name, WORKER_SPAWN_TOOL) || toolMatchesLeaf(name, WORKER_MESSAGE_TOOL)) {
1062
- const spawn = toolMatchesLeaf(name, WORKER_SPAWN_TOOL);
1063
- const title = spawn ? workerTitle(args) : null;
1064
+ const invoked = invokedTool(name, args);
1065
+ const workerName = invoked?.name ?? name;
1066
+ const workerArgs = invoked ? invoked.arguments : args;
1067
+ if (toolMatchesLeaf(workerName, WORKER_SPAWN_TOOL) || toolMatchesLeaf(workerName, WORKER_MESSAGE_TOOL)) {
1068
+ const spawn = toolMatchesLeaf(workerName, WORKER_SPAWN_TOOL);
1069
+ const title = spawn ? workerTitle(workerArgs) : null;
1064
1070
  const item2 = {
1065
1071
  kind: "worker",
1066
1072
  id: event.id,
1067
1073
  turnId,
1068
1074
  callId,
1069
1075
  action: spawn ? "spawn" : "message",
1070
- prompt: workerPrompt(args),
1076
+ prompt: workerPrompt(workerArgs),
1071
1077
  ...title ? { title } : {},
1072
- workerSessionId: extractSessionRef(args),
1078
+ workerSessionId: extractSessionRef(workerArgs),
1073
1079
  failure: null,
1074
1080
  status: "running",
1075
1081
  occurredAt: event.occurredAt
@@ -3444,4 +3450,4 @@ export {
3444
3450
  isTurnExecutionEvidence,
3445
3451
  extractSessionRef
3446
3452
  };
3447
- //# sourceMappingURL=chunk-5MZTJMZ3.js.map
3453
+ //# sourceMappingURL=chunk-6MRY2RUZ.js.map