@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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/components/session/site-origin-link.tsx"],"sourcesContent":["import { Link } from \"../../lib/navigation\";\nimport { PanelsTopLeftIcon } from \"lucide-react\";\nimport { sessionSiteOrigin } from \"../../lib/session-site-origin\";\nimport type { RailSession as Session } from \"../../lib/session-list-entry\";\nexport function SiteOriginLink({\n session,\n compact = false,\n}: {\n session: Session;\n compact?: boolean | undefined;\n}) {\n const origin = sessionSiteOrigin(session);\n if (!origin) return null;\n return (\n <Link\n to=\"/workspaces/$workspaceId/artifacts/$artifactId\"\n params={{ workspaceId: session.workspaceId, artifactId: origin.siteId }}\n title={`Created through ${origin.title}`}\n aria-label={`Created through ${origin.title}. Open Site`}\n className=\"inline-flex shrink-0 items-center gap-1 rounded px-1 py-1 text-xs text-fg-muted hover:bg-surface-2 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <PanelsTopLeftIcon aria-hidden=\"true\" className=\"size-3.5\" />\n {!compact && <span className=\"max-w-40 truncate\">{origin.title}</span>}\n </Link>\n );\n}\n"],"mappings":";;;;;;;;;AACA,SAAS,yBAAyB;AAa9B,SAOE,KAPF;AAVG,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,UAAU;AACZ,GAGG;AACD,QAAM,SAAS,kBAAkB,OAAO;AACxC,MAAI,CAAC,OAAQ,QAAO;AACpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,QAAQ,EAAE,aAAa,QAAQ,aAAa,YAAY,OAAO,OAAO;AAAA,MACtE,OAAO,mBAAmB,OAAO,KAAK;AAAA,MACtC,cAAY,mBAAmB,OAAO,KAAK;AAAA,MAC3C,WAAU;AAAA,MAEV;AAAA,4BAAC,qBAAkB,eAAY,QAAO,WAAU,YAAW;AAAA,QAC1D,CAAC,WAAW,oBAAC,UAAK,WAAU,qBAAqB,iBAAO,OAAM;AAAA;AAAA;AAAA,EACjE;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/routes/session-unavailable.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\n\nimport { LoadingPanel, ProblemPanel } from \"../components/common\";\nimport { Button } from \"../../ui/button\";\nimport { CrossSlotDeepLinkRecovery } from \"../components/cross-slot-deep-link-recovery\";\nimport { useAppContext } from \"../app-context\";\nimport {\n authorizedSessionReadWorkspaceIds,\n canonicalSessionDeepLinkTarget,\n resolveAuthorizedSessionWorkspace,\n} from \"../lib/session-deep-link\";\nimport { workspaceSessionsPath } from \"../lib/routes\";\nimport { usePage } from \"../lib/navigation\";\n\nexport function SessionUnavailableRoute(props: { workspaceId: string; sessionId: string }) {\n const page = usePage();\n const context = useAppContext();\n const [state, setState] = useState<\"resolving\" | \"not-found\" | \"error\">(\"resolving\");\n const sessionWorkspaceIds = useMemo(\n () => authorizedSessionReadWorkspaceIds(context.accessContext, context.workspaces),\n [context.accessContext, context.workspaces],\n );\n const backWorkspaceId = sessionWorkspaceIds.includes(props.workspaceId)\n ? props.workspaceId\n : (sessionWorkspaceIds.find(\n (workspaceId) => workspaceId === context.accessContext.defaultWorkspaceId,\n ) ??\n sessionWorkspaceIds[0] ??\n null);\n\n useEffect(() => {\n let cancelled = false;\n setState(\"resolving\");\n void resolveAuthorizedSessionWorkspace(\n context.client,\n context.accessContext.workspaceGrants,\n props.sessionId,\n {\n authorizedWorkspaceIds: sessionWorkspaceIds,\n excludeWorkspaceId: props.workspaceId,\n },\n ).then((resolution) => {\n if (cancelled) return;\n if (resolution.status === \"resolved\") {\n page.assign(\n canonicalSessionDeepLinkTarget(\n resolution.workspaceId,\n props.sessionId,\n new URL(page.href()),\n ),\n { replace: true },\n );\n return;\n }\n setState(resolution.status === \"error\" ? \"error\" : \"not-found\");\n });\n return () => {\n cancelled = true;\n };\n }, [\n page,\n context.accessContext.workspaceGrants,\n context.client,\n sessionWorkspaceIds,\n props.sessionId,\n props.workspaceId,\n ]);\n\n if (state === \"resolving\") return <LoadingPanel label=\"Looking for this session\" />;\n const unavailable = (\n <ProblemPanel\n title={state === \"error\" ? \"Session unavailable\" : \"Session not found\"}\n description={\n state === \"error\"\n ? \"We couldn't verify another authorized workspace right now. Try again in a moment.\"\n : \"This session doesn't exist or isn't available in any workspace you can access.\"\n }\n action={\n backWorkspaceId ? (\n <Button asChild type=\"button\" variant=\"outline\">\n <a href={workspaceSessionsPath(backWorkspaceId)}>Back to sessions</a>\n </Button>\n ) : undefined\n }\n />\n );\n return state === \"not-found\" ? (\n <CrossSlotDeepLinkRecovery path={new URL(page.href()).pathname} fallback={unavailable} />\n ) : (\n unavailable\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,WAAW,SAAS,gBAAgB;AAoET;AAtD7B,SAAS,wBAAwB,OAAmD;AACzF,QAAM,OAAO,QAAQ;AACrB,QAAM,UAAU,cAAc;AAC9B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA8C,WAAW;AACnF,QAAM,sBAAsB;AAAA,IAC1B,MAAM,kCAAkC,QAAQ,eAAe,QAAQ,UAAU;AAAA,IACjF,CAAC,QAAQ,eAAe,QAAQ,UAAU;AAAA,EAC5C;AACA,QAAM,kBAAkB,oBAAoB,SAAS,MAAM,WAAW,IAClE,MAAM,cACL,oBAAoB;AAAA,IACnB,CAAC,gBAAgB,gBAAgB,QAAQ,cAAc;AAAA,EACzD,KACA,oBAAoB,CAAC,KACrB;AAEJ,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,aAAS,WAAW;AACpB,SAAK;AAAA,MACH,QAAQ;AAAA,MACR,QAAQ,cAAc;AAAA,MACtB,MAAM;AAAA,MACN;AAAA,QACE,wBAAwB;AAAA,QACxB,oBAAoB,MAAM;AAAA,MAC5B;AAAA,IACF,EAAE,KAAK,CAAC,eAAe;AACrB,UAAI,UAAW;AACf,UAAI,WAAW,WAAW,YAAY;AACpC,aAAK;AAAA,UACH;AAAA,YACE,WAAW;AAAA,YACX,MAAM;AAAA,YACN,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,UACrB;AAAA,UACA,EAAE,SAAS,KAAK;AAAA,QAClB;AACA;AAAA,MACF;AACA,eAAS,WAAW,WAAW,UAAU,UAAU,WAAW;AAAA,IAChE,CAAC;AACD,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA,QAAQ,cAAc;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR,CAAC;AAED,MAAI,UAAU,YAAa,QAAO,oBAAC,gBAAa,OAAM,4BAA2B;AACjF,QAAM,cACJ;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,UAAU,UAAU,wBAAwB;AAAA,MACnD,aACE,UAAU,UACN,sFACA;AAAA,MAEN,QACE,kBACE,oBAAC,UAAO,SAAO,MAAC,MAAK,UAAS,SAAQ,WACpC,8BAAC,OAAE,MAAM,sBAAsB,eAAe,GAAG,8BAAgB,GACnE,IACE;AAAA;AAAA,EAER;AAEF,SAAO,UAAU,cACf,oBAAC,6BAA0B,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC,EAAE,UAAU,UAAU,aAAa,IAEvF;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/embed/memory-navigation.tsx"],"sourcesContent":["// Navigation for an embedded session app: the location lives in memory, so the\n// host page's URL and history stay untouched. Session routes render in place;\n// app-only pages (settings, billing, schedules) open the full web app beside\n// the host page.\nimport { createElement, useMemo, useState, useSyncExternalStore, type MouseEvent } from \"react\";\n\nimport type {\n LinkProps,\n NavigateOptions,\n NavigationHistoryState,\n NavigationHost,\n NavigationLocation,\n NavigationParams,\n NavigationSearch,\n NavigationState,\n NavigationUpdater,\n PageHost,\n} from \"../lib/navigation\";\nimport { openBlankTab } from \"../lib/navigation\";\n\nexport type MemoryNavigationOptions = Readonly<{\n /** The first location, such as `/workspaces/<id>/sessions`. */\n initialPath: string;\n /** The web app origin that app paths open against when they leave the embed. */\n consoleOrigin: string;\n /** Whether a path renders inside the embed; anything else leaves through `openUrl`. */\n handles: (pathname: string) => boolean;\n /** Opens a URL outside the embed. Defaults to a new browser tab. */\n openUrl?: ((url: string) => void) | undefined;\n /** An empty tab opened inside a click, or null to leave through `openUrl`. */\n openTab?: (() => Window | null) | undefined;\n /** Called after every in-embed location change. */\n onLocationChange?: ((location: NavigationLocation) => void) | undefined;\n}>;\n\ntype Listener = () => void;\n\nfunction resolveUpdater<T>(update: NavigationUpdater<T> | undefined, current: T, empty: T): T {\n if (update === undefined) return empty;\n if (update === true) return current;\n if (typeof update === \"function\") return (update as (previous: T) => T)(current);\n return update;\n}\n\n/** TanStack's search encoding: strings stay bare unless they would parse as JSON. */\nexport function stringifyMemorySearch(search: NavigationSearch): string {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(search)) {\n if (value === undefined) continue;\n if (typeof value === \"string\") {\n let json = false;\n try {\n JSON.parse(value);\n json = true;\n } catch {\n json = false;\n }\n query.set(key, json ? JSON.stringify(value) : value);\n } else {\n query.set(key, JSON.stringify(value));\n }\n }\n const text = query.toString();\n return text ? `?${text}` : \"\";\n}\n\nfunction parseMemorySearch(searchStr: string): NavigationSearch {\n const search: NavigationSearch = {};\n for (const [key, value] of new URLSearchParams(searchStr)) {\n try {\n search[key] = JSON.parse(value);\n } catch {\n search[key] = value;\n }\n }\n return search;\n}\n\nconst ROUTE_PARAMS = /^\\/workspaces\\/([^/]+)(?:\\/sessions(?:\\/([^/]+))?)?/u;\n\nfunction paramsOf(pathname: string): NavigationParams {\n const match = ROUTE_PARAMS.exec(pathname);\n if (!match) return {};\n return {\n workspaceId: decodeURIComponent(match[1]!),\n ...(match[2] ? { sessionId: decodeURIComponent(match[2]) } : {}),\n };\n}\n\nfunction fillPath(to: string, params: NavigationParams): string {\n return to.replace(/\\$([A-Za-z_][A-Za-z0-9_]*)/gu, (_, name: string) =>\n encodeURIComponent(params[name] ?? \"\"),\n );\n}\n\nfunction locationFor(\n pathname: string,\n search: NavigationSearch,\n hash: string,\n state: NavigationHistoryState,\n): NavigationLocation {\n const searchStr = stringifyMemorySearch(search);\n return {\n pathname,\n search,\n searchStr,\n hash,\n href: `${pathname}${searchStr}${hash ? `#${hash}` : \"\"}`,\n state,\n };\n}\n\nfunction initialLocation(path: string): NavigationLocation {\n const url = new URL(path, \"http://embed.invalid\");\n return locationFor(url.pathname, parseMemorySearch(url.search), url.hash.slice(1), {});\n}\n\nfunction isPlainClick(event: MouseEvent<HTMLAnchorElement>): boolean {\n return event.button === 0 && !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey;\n}\n\nfunction createMemoryNavigation(options: MemoryNavigationOptions): NavigationHost {\n let location = initialLocation(options.initialPath);\n const listeners = new Set<Listener>();\n const subscribe = (listener: Listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const snapshot = () => location;\n const openUrl =\n options.openUrl ??\n ((url: string) => {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n });\n const absolute = (path: string) => new URL(path, options.consoleOrigin).toString();\n\n const target = (navigation: NavigateOptions): NavigationLocation => {\n if (navigation.href !== undefined) return initialLocation(navigation.href);\n const currentParams = paramsOf(location.pathname);\n const params = resolveUpdater(navigation.params, currentParams, currentParams);\n const pathname =\n navigation.to === undefined || navigation.to === \".\"\n ? location.pathname\n : fillPath(navigation.to, params);\n return locationFor(\n pathname,\n resolveUpdater(navigation.search, location.search, {}),\n resolveUpdater(navigation.hash, location.hash, \"\"),\n resolveUpdater(navigation.state, location.state, {}),\n );\n };\n\n const commit = (next: NavigationLocation) => {\n if (!options.handles(next.pathname)) {\n openUrl(absolute(next.href));\n return;\n }\n location = next;\n for (const listener of listeners) listener();\n options.onLocationChange?.(next);\n };\n\n const navigate = async (navigation: NavigateOptions) => commit(target(navigation));\n\n const useLocation = () => useSyncExternalStore(subscribe, snapshot, snapshot);\n\n const Link = ({\n to,\n from: _from,\n params,\n search,\n hash,\n state,\n replace: _replace,\n resetScroll: _resetScroll,\n ignoreBlocker: _ignoreBlocker,\n reloadDocument: _reloadDocument,\n href: hrefOption,\n preload: _preload,\n disabled,\n children,\n onClick,\n ref,\n target: linkTarget,\n ...anchor\n }: LinkProps) => {\n const current = useLocation();\n const next = target({ to, params, search, hash, state, href: hrefOption });\n const internal = options.handles(next.pathname);\n const isActive = next.pathname === current.pathname;\n return createElement(\n \"a\",\n {\n ...anchor,\n ref,\n href: internal ? next.href : absolute(next.href),\n target: internal ? linkTarget : \"_blank\",\n rel: internal ? anchor.rel : \"noopener noreferrer\",\n \"aria-disabled\": disabled || undefined,\n \"data-status\": isActive ? \"active\" : undefined,\n onClick: (event: MouseEvent<HTMLAnchorElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n if (disabled) event.preventDefault();\n return;\n }\n if (!isPlainClick(event)) return;\n if (!internal) {\n // Leaves through the host (the Office pane opens its own browser window).\n event.preventDefault();\n openUrl(absolute(next.href));\n return;\n }\n if (linkTarget === \"_blank\") return;\n event.preventDefault();\n commit(next);\n },\n },\n typeof children === \"function\" ? children({ isActive, isTransitioning: false }) : children,\n );\n };\n\n const page: PageHost = {\n href: () => absolute(location.href),\n origin: () => new URL(options.consoleOrigin).origin,\n readQuery: () => new URLSearchParams(location.searchStr),\n replaceQuery: (query, replaceOptions) => {\n location = locationFor(\n location.pathname,\n parseMemorySearch(query.toString()),\n location.hash,\n replaceOptions?.keepHistoryState ? location.state : {},\n );\n for (const listener of listeners) listener();\n },\n assign: (url) => {\n const resolved = new URL(url, options.consoleOrigin);\n const consoleOrigin = new URL(options.consoleOrigin).origin;\n if (resolved.origin === consoleOrigin && options.handles(resolved.pathname)) {\n commit(initialLocation(`${resolved.pathname}${resolved.search}${resolved.hash}`));\n return;\n }\n openUrl(resolved.toString());\n },\n opensBeside: true,\n open: (url) => openUrl(new URL(url, options.consoleOrigin).toString()),\n openTab: () => (options.openTab ?? openBlankTab)(),\n };\n\n return {\n useNavigate: () => navigate,\n useLocation,\n useRouterState: <T,>({ select }: { select: (state: NavigationState) => T }) =>\n select({ location: useLocation() }),\n useRouter: () => ({\n get state() {\n return { location };\n },\n }),\n useSearch: () => useLocation().search,\n Link,\n stringifySearch: stringifyMemorySearch,\n page,\n };\n}\n\n/**\n * A navigation host whose location lives in memory. Created once per mount;\n * later option changes keep the first location.\n */\nexport function useMemoryNavigation(options: MemoryNavigationOptions): NavigationHost {\n const [latest] = useState(() => ({ current: options }));\n latest.current = options;\n return useMemo(\n () =>\n createMemoryNavigation({\n initialPath: options.initialPath,\n consoleOrigin: options.consoleOrigin,\n handles: (pathname) => latest.current.handles(pathname),\n openUrl: (url) =>\n latest.current.openUrl\n ? latest.current.openUrl(url)\n : void window.open(url, \"_blank\", \"noopener,noreferrer\"),\n openTab: () => (latest.current.openTab ?? openBlankTab)(),\n onLocationChange: (location) => latest.current.onLocationChange?.(location),\n }),\n // oxlint-disable-next-line react-hooks/exhaustive-deps -- one history per mount\n [],\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/lib/navigation.tsx"],"sourcesContent":["// Navigation for the session UI, independent of any one router. The web app\n// backs it with its TanStack router (see `configurePageAppHost`), so links,\n// history and URLs there are exactly the router's own. An embed backs it with\n// its own routing or in-memory state.\nimport type { AnchorHTMLAttributes, ComponentType, ReactNode, Ref } from \"react\";\n\nimport { useAppHost } from \"./app-host\";\n\n/** History state the session UI writes and reads. */\nexport type NavigationHistoryState = {\n /** Set only on the Settings \"Back to sessions\" link that reopens this session. */\n restoredSessionId?: string | undefined;\n [key: string]: unknown;\n};\n\nexport type NavigationLocation = Readonly<{\n pathname: string;\n search: Record<string, unknown>;\n searchStr: string;\n hash: string;\n href: string;\n state: NavigationHistoryState;\n}>;\n\nexport type NavigationState = Readonly<{ location: NavigationLocation }>;\n\nexport type NavigationSearch = Record<string, unknown>;\nexport type NavigationParams = Record<string, string>;\n\n/** A value, `(previous) => next`, or `true` to keep the current one. */\nexport type NavigationUpdater<T> = true | T | ((previous: T) => T);\n\nexport type NavigateOptions = {\n /** A route path such as `/workspaces/$workspaceId`, filled from `params`. */\n to?: string | undefined;\n from?: string | undefined;\n params?: NavigationUpdater<NavigationParams> | undefined;\n search?: NavigationUpdater<NavigationSearch> | undefined;\n hash?: NavigationUpdater<string> | undefined;\n state?: NavigationUpdater<NavigationHistoryState> | undefined;\n replace?: boolean | undefined;\n resetScroll?: boolean | undefined;\n ignoreBlocker?: boolean | undefined;\n reloadDocument?: boolean | undefined;\n href?: string | undefined;\n};\n\nexport type NavigateFunction = (options: NavigateOptions) => Promise<void>;\n\nexport type LinkProps = NavigateOptions &\n Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"children\"> & {\n children?:\n | ReactNode\n | ((state: { isActive: boolean; isTransitioning: boolean }) => ReactNode)\n | undefined;\n preload?: false | \"intent\" | \"viewport\" | \"render\" | undefined;\n disabled?: boolean | undefined;\n ref?: Ref<HTMLAnchorElement> | undefined;\n };\n\n/**\n * The page around the session UI, for flows that leave it or return to it\n * (provider authorization, checkout, connect returns). The web app maps these\n * to `window.location` and `history`; an embed keeps the host page untouched.\n */\nexport type PageHost = Readonly<{\n /** Absolute URL of the console page being shown. */\n href: () => string;\n /** The console origin that app paths (`/workspaces/...`) resolve against. */\n origin: () => string;\n /** The page's query, where authorization and connect returns land. */\n readQuery: () => URLSearchParams;\n /** Replaces the page's query after handling a return, without a navigation. */\n replaceQuery: (query: URLSearchParams, options?: { keepHistoryState?: boolean }) => void;\n /**\n * Leaves for a URL: an external flow, or an app page outside the session UI.\n * An embed opens it beside the host page instead of replacing it.\n */\n assign: (url: string, options?: { replace?: boolean }) => void;\n /**\n * True when `assign` opens outside URLs beside the page rather than leaving\n * it (an embed), so a flow that leaves for checkout stays here and waits.\n */\n opensBeside: boolean;\n /** Opens a URL beside the page (a file, an image, a provider page). */\n open: (url: string) => void;\n /**\n * Opens an empty tab inside a click, for a URL known only after an await\n * (checkout, a freshly signed link). Null when the browser blocks it or the\n * host shows URLs its own way; the caller then leaves through `assign`.\n */\n openTab: () => Window | null;\n}>;\n\nexport type NavigationHost = Readonly<{\n useNavigate: () => NavigateFunction;\n useLocation: () => NavigationLocation;\n useRouterState: <T>(options: { select: (state: NavigationState) => T }) => T;\n /** Live, non-reactive read for event handlers. */\n useRouter: () => { readonly state: NavigationState };\n useSearch: (options: { strict: false }) => NavigationSearch;\n Link: ComponentType<LinkProps>;\n stringifySearch: (search: NavigationSearch) => string;\n page: PageHost;\n}>;\n\n/**\n * The browser window as the page: the default when nothing scopes another one,\n * and what a host that owns the URL (the web app) passes as its `page`.\n */\nexport const browserPage: PageHost = {\n href: () => window.location.href,\n origin: () => window.location.origin,\n readQuery: () => new URLSearchParams(window.location.search),\n replaceQuery: (query, options) =>\n window.history.replaceState(\n options?.keepHistoryState ? window.history.state : null,\n \"\",\n `${window.location.pathname}${query.size ? `?${query}` : \"\"}`,\n ),\n assign: (url, options) =>\n options?.replace ? window.location.replace(url) : window.location.assign(url),\n opensBeside: false,\n open: (url) => void window.open(url, \"_blank\", \"noopener,noreferrer\"),\n openTab: openBlankTab,\n};\n\n/** An empty new tab with no handle back to this page, or null when blocked. */\nexport function openBlankTab(): Window | null {\n let tab: Window | null = null;\n try {\n tab = window.open(\"\", \"_blank\");\n } catch {\n return null;\n }\n if (tab) tab.opener = null;\n return tab;\n}\n\nfunction useNavigationHost(): NavigationHost {\n const host = useAppHost().navigation;\n if (!host) throw new Error(\"Opengeni navigation is not configured\");\n return host;\n}\n\nexport function useNavigate(): NavigateFunction {\n return useNavigationHost().useNavigate();\n}\n\nexport function useLocation(): NavigationLocation {\n return useNavigationHost().useLocation();\n}\n\nexport function useRouterState<T>(options: { select: (state: NavigationState) => T }): T {\n return useNavigationHost().useRouterState(options);\n}\n\nexport function useRouter(): { readonly state: NavigationState } {\n return useNavigationHost().useRouter();\n}\n\nexport function useSearch(options: { strict: false }): NavigationSearch {\n return useNavigationHost().useSearch(options);\n}\n\nexport function Link(props: LinkProps) {\n const HostLink = useNavigationHost().Link;\n return <HostLink {...props} />;\n}\n\n/** The page around the session UI; the browser window unless a host scopes another. */\nexport function usePage(): PageHost {\n return useAppHost().navigation?.page ?? browserPage;\n}\n\n/** The host's search serializer (`?a=1&b=%22x%22`), for hrefs built outside `Link`. */\nexport function useStringifySearch(): (search: NavigationSearch) => string {\n return useNavigationHost().stringifySearch;\n}\n"],"mappings":";;;;;;AAuKS;AAzDF,IAAM,cAAwB;AAAA,EACnC,MAAM,MAAM,OAAO,SAAS;AAAA,EAC5B,QAAQ,MAAM,OAAO,SAAS;AAAA,EAC9B,WAAW,MAAM,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAAA,EAC3D,cAAc,CAAC,OAAO,YACpB,OAAO,QAAQ;AAAA,IACb,SAAS,mBAAmB,OAAO,QAAQ,QAAQ;AAAA,IACnD;AAAA,IACA,GAAG,OAAO,SAAS,QAAQ,GAAG,MAAM,OAAO,IAAI,KAAK,KAAK,EAAE;AAAA,EAC7D;AAAA,EACF,QAAQ,CAAC,KAAK,YACZ,SAAS,UAAU,OAAO,SAAS,QAAQ,GAAG,IAAI,OAAO,SAAS,OAAO,GAAG;AAAA,EAC9E,aAAa;AAAA,EACb,MAAM,CAAC,QAAQ,KAAK,OAAO,KAAK,KAAK,UAAU,qBAAqB;AAAA,EACpE,SAAS;AACX;AAGO,SAAS,eAA8B;AAC5C,MAAI,MAAqB;AACzB,MAAI;AACF,UAAM,OAAO,KAAK,IAAI,QAAQ;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,IAAK,KAAI,SAAS;AACtB,SAAO;AACT;AAEA,SAAS,oBAAoC;AAC3C,QAAM,OAAO,WAAW,EAAE;AAC1B,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,uCAAuC;AAClE,SAAO;AACT;AAEO,SAAS,cAAgC;AAC9C,SAAO,kBAAkB,EAAE,YAAY;AACzC;AAEO,SAAS,cAAkC;AAChD,SAAO,kBAAkB,EAAE,YAAY;AACzC;AAEO,SAAS,eAAkB,SAAuD;AACvF,SAAO,kBAAkB,EAAE,eAAe,OAAO;AACnD;AAEO,SAAS,YAAiD;AAC/D,SAAO,kBAAkB,EAAE,UAAU;AACvC;AAEO,SAAS,UAAU,SAA8C;AACtE,SAAO,kBAAkB,EAAE,UAAU,OAAO;AAC9C;AAEO,SAAS,KAAK,OAAkB;AACrC,QAAM,WAAW,kBAAkB,EAAE;AACrC,SAAO,oBAAC,YAAU,GAAG,OAAO;AAC9B;AAGO,SAAS,UAAoB;AAClC,SAAO,WAAW,EAAE,YAAY,QAAQ;AAC1C;AAGO,SAAS,qBAA2D;AACzE,SAAO,kBAAkB,EAAE;AAC7B;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/internal.ts"],"sourcesContent":["import { 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 * Shared fetch + optional polling loop for the list/read hooks. Stale\n * responses (superseded by a newer load or an unmount) are dropped.\n */\nexport function usePolledValue<T>(\n load: (signal?: AbortSignal) => Promise<T>,\n options: { pollIntervalMs?: number | undefined; enabled?: boolean | undefined } = {},\n): AsyncListState<T> {\n const enabled = options.enabled ?? true;\n const pollIntervalMs = options.pollIntervalMs;\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 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 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 setError(normalizeError(cause));\n setLoading(false);\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 }, [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 if (!enabled || !pageLive) {\n setLoading(false);\n generation.current += 1;\n requestAbortRef.current?.abort();\n inFlightRef.current = null;\n trailingRefreshRef.current = null;\n return;\n }\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 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 generation.current += 1;\n requestAbortRef.current?.abort();\n inFlightRef.current = null;\n trailingRefreshRef.current = null;\n };\n }, [run, enabled, pageLive, pollIntervalMs]);\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":[]}
@@ -1 +0,0 @@
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 creator,\n quickActionSlots = 0,\n}: {\n summary: RailAggregateStatus;\n scheduled?: boolean | undefined;\n relativeTime?: 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 (!scheduled && !hasStatusMarker && !hasRelativeTime && !hasMonogram && !quickActionSlots)\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 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 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 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 creator={creator}\n />\n </>\n );\n}\n"],"mappings":"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","names":[]}