@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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/queue-surface.tsx","../src/components/session-list.tsx","../src/components/open-geni-chat.tsx","../src/components/session-commands-panel.tsx","../src/hooks/use-session-background-commands.ts","../src/components/session-commands.tsx","../src/timeline/startup-timings.tsx"],"sourcesContent":["import { Loader2Icon } from \"lucide-react\";\nimport { lazy, Suspense, type ComponentType } from \"react\";\n\nimport type { QueueSurfaceProps } from \"./queue-surface-implementation\";\nexport { requestQueueDraftEdit } from \"./queue-draft-policy\";\nimport { EmptyQueueStateSurface } from \"./queue-surface-state\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\nexport type { QueueSurfaceProps } from \"./queue-surface-implementation\";\n\nconst loadQueueSurface = () => import(\"./queue-surface-implementation\");\ntype QueueSurfaceModule = { QueueSurface: ComponentType<QueueSurfaceProps> };\ntype QueueSurfaceLoader = () => Promise<QueueSurfaceModule>;\n\n/** The sole pending-input surface: compact above Goal, Agents, and composer. */\nexport const QueueSurface = createQueueSurface(loadQueueSurface);\n\n/** @internal Deterministic Suspense seam for the QueueSurface regression suite. */\nexport function createQueueSurfaceForTest(loadImplementation: QueueSurfaceLoader) {\n return createQueueSurface(loadImplementation);\n}\n\nfunction createQueueSurface(loadImplementation: QueueSurfaceLoader) {\n const LazyQueueSurface = lazy(async () => ({\n default: (await loadImplementation()).QueueSurface,\n }));\n\n return function QueueSurfaceBoundary(props: QueueSurfaceProps) {\n const { queue } = props;\n if (queue.queue.length + queue.pendingInputs.length === 0) {\n if (!queue.stoppingPreviousAttempt && !queue.error && !queue.mutationError) return null;\n return <EmptyQueueStateSurface queue={queue} />;\n }\n\n return (\n <Suspense fallback={<QueueSurfaceFallback />}>\n <LazyQueueSurface {...props} />\n </Suspense>\n );\n };\n}\n\nfunction QueueSurfaceFallback() {\n const t = useOpenGeniText();\n return (\n <div\n aria-live=\"polite\"\n className=\"og-root mx-auto mb-2 w-full max-w-3xl shrink-0 px-4 sm:px-6\"\n data-testid=\"queue-surface-loading\"\n role=\"status\"\n >\n <div className=\"overflow-hidden rounded-lg border border-border bg-surface/80 shadow-sm\">\n <div className=\"flex items-center gap-2 px-3 py-2 text-og-control text-fg-muted pointer-coarse:min-h-[44px]\">\n <Loader2Icon\n aria-hidden=\"true\"\n className=\"size-3.5 shrink-0 animate-spin motion-reduce:animate-none\"\n />\n {t(\"queueSurface.loadingInputs\")}\n </div>\n </div>\n </div>\n );\n}\n","import { deriveSessionDisplayTitle, type OpenGeniClient, type Session } from \"@opengeni/sdk\";\nimport { ArchiveIcon, PencilIcon, PlusIcon } from \"lucide-react\";\nimport { useEffect, useRef, useState, type FormEvent } from \"react\";\nimport { useClientConfigFlags } from \"../hooks/use-client-config-flags\";\nimport { useWorkspaceSessions } from \"../hooks/use-workspace-sessions\";\nimport { cn } from \"../lib/cn\";\nimport { formatRelativeTime } from \"../lib/format\";\nimport { useErrorMessage } from \"../lib/error-message\";\nimport { useOpenGeni, type ClientOverride } from \"../session-context\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\nexport type SessionListLabels = {\n heading: string;\n newChat: string;\n empty: string;\n loading: string;\n loadMore: string;\n rename: string;\n archive: string;\n save: string;\n cancel: string;\n};\n\nconst DEFAULT_LABELS = (t: OpenGeniText): SessionListLabels => ({\n heading: t(\"sessionList.chats\"),\n newChat: t(\"sessionList.newChat\"),\n empty: t(\"sessionList.noChatsYet\"),\n loading: t(\"sessionList.loadingChats\"),\n loadMore: t(\"sessionList.showMore\"),\n rename: t(\"sessionList.rename\"),\n archive: t(\"sessionList.archive\"),\n save: t(\"sessionList.save\"),\n cancel: t(\"sessionList.cancel\"),\n});\n\nexport type SessionListProps = ClientOverride & {\n selectedSessionId?: string | null | undefined;\n onSelect: (sessionId: string) => void;\n /** Shown as a \"New chat\" button when provided. */\n onNewChat?: (() => void) | undefined;\n /** Allow inline rename (`updateSession`). Defaults to true. */\n rename?: boolean | undefined;\n /**\n * Allow archiving (`updateSessionArchive`). Defaults to true; hidden when the\n * session proxy reports archive disabled (`archive: false`).\n */\n archive?: boolean | undefined;\n /** Called after the selected chat was archived, so the host can move on. */\n onArchived?: ((sessionId: string) => void) | undefined;\n pageSize?: number | undefined;\n /** Change the reference to force a refetch (for example after creating a chat). */\n refreshKey?: unknown;\n labels?: Partial<SessionListLabels> | undefined;\n className?: string | undefined;\n};\n\ntype ArchiveClient = Partial<Pick<OpenGeniClient, \"updateSessionArchive\">>;\n\n/**\n * The workspace's root chats for the current user, newest activity first.\n * Through `createSessionProxyHandler` the list is limited to the chats the\n * resolved user created (or everything they may read, with `sessionList:\n * \"visible\"`); Opengeni enforces visibility either way.\n */\nexport function SessionList({\n client,\n workspaceId,\n selectedSessionId,\n onSelect,\n onNewChat,\n rename = true,\n archive = true,\n onArchived,\n pageSize = 30,\n refreshKey,\n labels: labelOverrides,\n className,\n}: SessionListProps) {\n const t = useOpenGeniText();\n const labels = { ...DEFAULT_LABELS(t), ...labelOverrides };\n const scope = { client, workspaceId };\n const context = useOpenGeni(scope);\n const [limit, setLimit] = useState(pageSize);\n const list = useWorkspaceSessions({\n ...scope,\n parentSessionId: null,\n archiveStatus: \"active\",\n sortBy: \"updatedAt\",\n limit,\n });\n const refresh = list.refresh;\n const firstRefreshKey = useRef(refreshKey);\n useEffect(() => {\n if (Object.is(refreshKey, firstRefreshKey.current)) return;\n firstRefreshKey.current = refreshKey;\n void refresh();\n }, [refresh, refreshKey]);\n const [editing, setEditing] = useState<{ id: string; title: string } | null>(null);\n const [busy, setBusy] = useState<string | null>(null);\n const [error, setError] = useState<{ cause: unknown } | null>(null);\n const formatError = useErrorMessage();\n const archiveClient = context.client as unknown as ArchiveClient;\n // A session proxy with `archive: false` reports it; hide what would fail.\n const config = useClientConfigFlags(context.client as never);\n const canArchive =\n archive && config.archive && typeof archiveClient.updateSessionArchive === \"function\";\n\n const run = async (id: string, action: () => Promise<unknown>) => {\n setBusy(id);\n setError(null);\n try {\n await action();\n await list.refresh();\n } catch (cause) {\n setError({ cause });\n } finally {\n setBusy(null);\n }\n };\n\n const saveTitle = (event: FormEvent) => {\n event.preventDefault();\n const current = editing;\n if (!current) return;\n const title = current.title.trim();\n setEditing(null);\n if (!title) return;\n void run(current.id, () =>\n context.client.updateSession(context.workspaceId, current.id, { title }),\n );\n };\n\n const archiveSession = (session: Session) =>\n void run(session.id, async () => {\n await archiveClient.updateSessionArchive!(context.workspaceId, session.id, {\n archived: true,\n });\n onArchived?.(session.id);\n });\n\n const sessions = list.sessions;\n return (\n <nav\n className={cn(\"flex min-h-0 min-w-0 flex-col gap-1 text-og-fg\", className)}\n aria-label={labels.heading}\n data-og-session-list=\"\"\n >\n <div className=\"flex items-center justify-between gap-2 px-2 pb-1 pt-2\">\n <h2 className=\"text-og-sm font-semibold text-og-fg-muted\">{labels.heading}</h2>\n {onNewChat ? (\n <button\n type=\"button\"\n onClick={onNewChat}\n className=\"inline-flex items-center gap-1 rounded-md px-2 py-1 text-og-control text-og-fg hover:bg-og-surface-2\"\n data-og-new-chat=\"\"\n >\n <PlusIcon className=\"size-3.5\" aria-hidden />\n {labels.newChat}\n </button>\n ) : null}\n </div>\n {error || list.error ? (\n <p role=\"alert\" className=\"px-2 text-og-xs text-og-status-failed\">\n {formatError(error ? error.cause : list.error)}\n </p>\n ) : null}\n <ul className=\"flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto px-1 pb-2\">\n {list.loading && sessions.length === 0 ? (\n <li className=\"px-2 py-2 text-og-xs text-og-fg-subtle\">{labels.loading}</li>\n ) : null}\n {!list.loading && !list.error && sessions.length === 0 ? (\n <li className=\"px-2 py-2 text-og-xs text-og-fg-subtle\">{labels.empty}</li>\n ) : null}\n {sessions.map((session) => {\n const selected = session.id === selectedSessionId;\n const title = deriveSessionDisplayTitle(session);\n if (editing?.id === session.id) {\n return (\n <li key={session.id}>\n <form onSubmit={saveTitle} className=\"flex items-center gap-1 px-1 py-1\">\n <input\n aria-label={labels.rename}\n value={editing.title}\n maxLength={200}\n autoFocus\n onChange={(event) => setEditing({ id: session.id, title: event.target.value })}\n onKeyDown={(event) => {\n if (event.key === \"Escape\") setEditing(null);\n }}\n className=\"min-w-0 flex-1 rounded-md border border-og-border bg-og-bg px-2 py-1 text-og-sm text-og-fg\"\n />\n <button\n type=\"submit\"\n className=\"rounded-md px-2 py-1 text-og-xs text-og-fg hover:bg-og-surface-2\"\n >\n {labels.save}\n </button>\n </form>\n </li>\n );\n }\n return (\n <li key={session.id} className=\"group relative\">\n <button\n type=\"button\"\n onClick={() => onSelect(session.id)}\n aria-current={selected ? \"true\" : undefined}\n disabled={busy === session.id}\n className={cn(\n \"flex w-full min-w-0 flex-col items-start rounded-md px-2 py-1.5 text-left\",\n selected ? \"bg-og-surface-2\" : \"hover:bg-og-surface-1\",\n )}\n data-og-session-row=\"\"\n >\n <span className=\"w-full truncate pr-12 text-og-sm text-og-fg\">{title}</span>\n <span className=\"text-og-xs text-og-fg-subtle\">\n {formatRelativeTime(t, session.updatedAt)}\n </span>\n </button>\n <span className=\"absolute right-1 top-1.5 hidden gap-0.5 group-focus-within:flex group-hover:flex pointer-coarse:flex\">\n {rename ? (\n <button\n type=\"button\"\n aria-label={`${labels.rename}: ${title}`}\n onClick={() => setEditing({ id: session.id, title: session.title ?? title })}\n className=\"rounded p-1 text-og-fg-subtle hover:bg-og-surface-3 hover:text-og-fg\"\n >\n <PencilIcon className=\"size-3.5\" aria-hidden />\n </button>\n ) : null}\n {canArchive ? (\n <button\n type=\"button\"\n aria-label={`${labels.archive}: ${title}`}\n onClick={() => archiveSession(session)}\n className=\"rounded p-1 text-og-fg-subtle hover:bg-og-surface-3 hover:text-og-fg\"\n >\n <ArchiveIcon className=\"size-3.5\" aria-hidden />\n </button>\n ) : null}\n </span>\n </li>\n );\n })}\n {list.nextCursor ? (\n <li>\n <button\n type=\"button\"\n onClick={() => setLimit((current) => current + pageSize)}\n className=\"w-full rounded-md px-2 py-1.5 text-left text-og-xs text-og-fg-muted hover:bg-og-surface-1\"\n >\n {labels.loadMore}\n </button>\n </li>\n ) : null}\n </ul>\n </nav>\n );\n}\n","import { MenuIcon, XIcon } from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState, type CSSProperties } from \"react\";\nimport type {\n CreatedConversation,\n NewConversationCreateOptions,\n} from \"../hooks/use-new-conversation\";\nimport { cn } from \"../lib/cn\";\nimport { notifyObserver } from \"../lib/notify-observer\";\nimport {\n useHostTheme,\n type HostSurfacePreference,\n type HostThemePreference,\n} from \"../lib/host-theme\";\nimport { useOpenGeni, type ClientOverride } from \"../session-context\";\nimport { NewConversation } from \"./new-conversation\";\nimport { useClientConfigFlags } from \"../hooks/use-client-config-flags\";\nimport { SessionConversation, type SessionConversationProps } from \"./session-conversation\";\nimport { SessionList, type SessionListLabels, type SessionListProps } from \"./session-list\";\nimport { SessionProxyScope, type SessionProxyBaseUrl } from \"./session-proxy-scope\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\nexport type OpenGeniChatLabels = SessionListLabels & {\n openChats: string;\n closeChats: string;\n newChatPlaceholder: string;\n /** Heading above the new-chat composer; empty hides it. */\n newChatTitle: string;\n send: string;\n newChatUnavailable: string;\n newChatRetry?: string | undefined;\n newChatPending?: string | undefined;\n newChatFinishingUploads?: string | undefined;\n};\n\nconst DEFAULT_LABELS = (t: OpenGeniText): Omit<OpenGeniChatLabels, keyof SessionListLabels> => ({\n openChats: t(\"openGeniChat.openChats\"),\n closeChats: t(\"openGeniChat.closeChats\"),\n newChatPlaceholder: t(\"openGeniChat.askAnything\"),\n newChatTitle: t(\"openGeniChat.howCanIHelp\"),\n send: t(\"openGeniChat.send\"),\n newChatUnavailable: t(\"openGeniChat.newChatsAreNotEnabled\"),\n});\n\n/** What the first message carries besides its text. */\nexport type OpenGeniChatCreateOptions = NewConversationCreateOptions;\n\nexport type OpenGeniChatProps = ClientOverride &\n SessionProxyBaseUrl & {\n /** Controlled selection. `null` shows the new-chat composer. */\n sessionId?: string | null | undefined;\n /** Initial selection when uncontrolled. Defaults to a new chat. */\n defaultSessionId?: string | null | undefined;\n onSessionChange?: ((sessionId: string | null) => void) | undefined;\n /**\n * Create a chat from its first message. Defaults to `client.createSession`\n * with `{ initialMessage, idempotencyKey }` plus the attached files and any\n * model choice, which `createSessionProxyHandler` accepts when the server\n * supplies a `createSession` hook. Return the new id.\n */\n createSession?:\n | ((\n initialMessage: string,\n idempotencyKey: string,\n options: OpenGeniChatCreateOptions,\n ) => Promise<string>)\n | undefined;\n /**\n * Hide the \"New chat\" entry point. It is also hidden when the session proxy\n * reports chat creation unavailable (no `createSession` hook) and no\n * `createSession` prop is given.\n */\n newChat?: boolean | undefined;\n /**\n * Forwarded to the conversation (message rendering, tool renderers,\n * composer...). `attachments`, `modelPicker`, `modelPickerProps`, and\n * `composerProps` also apply to the new-chat composer.\n */\n conversationProps?: Omit<\n SessionConversationProps,\n \"sessionId\" | \"client\" | \"workspaceId\" | \"baseUrl\" | \"headers\" | \"fetch\"\n >;\n /** Forwarded to the list (rename/archive toggles, page size). */\n listProps?: Pick<SessionListProps, \"rename\" | \"archive\" | \"pageSize\"> | undefined;\n labels?: Partial<OpenGeniChatLabels> | undefined;\n className?: string | undefined;\n /** Defaults to filling the host. */\n height?: CSSProperties[\"height\"];\n /**\n * Light or dark. Defaults to `auto`: follow the host page (an enclosing\n * `data-og-theme`, `class=\"dark\"`/`data-theme` on <html> or <body>, the\n * host's `color-scheme`, then its background), not the OS setting alone.\n */\n theme?: HostThemePreference | undefined;\n /**\n * `host` (default) derives backgrounds and cards from the host background so\n * the chat blends in; `theme` uses the `--og-color-*` surface tokens as they\n * are. Customized surface tokens are always kept.\n */\n surface?: HostSurfacePreference | undefined;\n };\n\n/**\n * A complete chat experience: the user's chat list plus the conversation.\n * The list is a sidebar when the component is wide and a drawer when narrow\n * (container-based, so it adapts inside panels as well as full pages).\n * `<OpenGeniChat baseUrl=\"/api/opengeni\" />` needs no provider: it talks to\n * your session proxy and uses the workspace the proxy resolves.\n */\nexport function OpenGeniChat({ baseUrl, headers, fetch, ...props }: OpenGeniChatProps) {\n if (baseUrl === undefined) return <Chat {...props} />;\n const { client, workspaceId, ...rest } = props;\n return (\n <SessionProxyScope\n baseUrl={baseUrl}\n workspaceId={workspaceId}\n client={client}\n headers={headers}\n fetch={fetch}\n >\n <Chat {...rest} />\n </SessionProxyScope>\n );\n}\n\nfunction Chat({\n client,\n workspaceId,\n sessionId: controlledSessionId,\n defaultSessionId = null,\n onSessionChange,\n createSession,\n newChat = true,\n conversationProps,\n listProps,\n labels: labelOverrides,\n className,\n height = \"100%\",\n theme,\n surface,\n}: Omit<OpenGeniChatProps, \"baseUrl\" | \"headers\" | \"fetch\">) {\n const t = useOpenGeniText();\n const labels = { ...DEFAULT_LABELS(t), ...labelOverrides } as OpenGeniChatLabels;\n const scope = { client, workspaceId };\n const context = useOpenGeni(scope);\n const [uncontrolled, setUncontrolled] = useState<string | null>(defaultSessionId);\n const selected = controlledSessionId !== undefined ? controlledSessionId : uncontrolled;\n const [drawerOpen, setDrawerOpen] = useState(false);\n const [listRevision, setListRevision] = useState(0);\n const [handoff, setHandoff] = useState<CreatedConversation | null>(null);\n const root = useRef<HTMLDivElement>(null);\n const hostTheme = useHostTheme(root, { theme, surface });\n const config = useClientConfigFlags(context.client);\n // A host creator replaces the proxy route; otherwise trust the proxy's report.\n const canCreate = createSession !== undefined || config.sessionCreation;\n\n const select = useCallback(\n (next: string | null) => {\n setHandoff(null);\n if (controlledSessionId === undefined) setUncontrolled(next);\n notifyObserver(onSessionChange, next);\n setDrawerOpen(false);\n },\n [controlledSessionId, onSessionChange],\n );\n\n useEffect(() => {\n if (!handoff) return;\n // The child's native composer captures its seed on mount. Do not seed it\n // again after later navigation; voice keeps its separate one-shot handoff\n // until the lazy control reports consumption.\n if (selected === handoff.sessionId && !handoff.realtimeModel) setHandoff(null);\n else if (selected !== null && selected !== handoff.sessionId) setHandoff(null);\n }, [handoff, selected]);\n\n const list = (\n <SessionList\n {...scope}\n {...listProps}\n labels={labels}\n selectedSessionId={selected}\n onSelect={select}\n onNewChat={newChat && canCreate ? () => select(null) : undefined}\n onArchived={(archivedId) => {\n if (archivedId === selected) select(null);\n }}\n refreshKey={listRevision}\n className=\"h-full\"\n />\n );\n\n return (\n <div\n ref={root}\n className={cn(\n \"og-root og-chat relative flex min-h-0 min-w-0 bg-og-bg text-og-base text-og-fg\",\n className,\n )}\n style={{ ...hostTheme.style, height }}\n data-og-theme={hostTheme.attribute}\n data-og-host-theme=\"\"\n data-og-chat=\"\"\n >\n <aside\n className=\"og-chat-sidebar min-h-0 w-64 shrink-0 flex-col border-r border-og-border\"\n data-og-chat-sidebar=\"\"\n >\n {list}\n </aside>\n {drawerOpen ? (\n <div className=\"og-chat-drawer absolute inset-0 z-30 flex\" data-og-chat-drawer=\"\">\n <div className=\"flex h-full w-[min(20rem,85%)] flex-col border-r border-og-border bg-og-bg shadow-og-lg\">\n <div className=\"flex justify-end p-1\">\n <button\n type=\"button\"\n aria-label={labels.closeChats}\n onClick={() => setDrawerOpen(false)}\n className=\"rounded p-1.5 text-og-fg-muted hover:bg-og-surface-2\"\n >\n <XIcon className=\"size-4\" aria-hidden />\n </button>\n </div>\n <div className=\"min-h-0 flex-1\">{list}</div>\n </div>\n <button\n type=\"button\"\n aria-label={labels.closeChats}\n className=\"flex-1 bg-black/25\"\n onClick={() => setDrawerOpen(false)}\n />\n </div>\n ) : null}\n <main className=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n <div className=\"og-chat-menu flex items-center gap-2 px-2 py-1\">\n <button\n type=\"button\"\n aria-label={labels.openChats}\n aria-expanded={drawerOpen}\n onClick={() => setDrawerOpen(true)}\n className=\"rounded p-1.5 text-og-fg-muted hover:bg-og-surface-2\"\n data-og-chat-menu=\"\"\n >\n <MenuIcon className=\"size-4\" aria-hidden />\n </button>\n <span className=\"text-og-sm font-semibold text-og-fg-muted\">{labels.heading}</span>\n </div>\n <div className=\"og-chat-main min-h-0 flex-1 px-3 pb-3 pt-1\">\n {selected ? (\n <SessionConversation\n {...conversationProps}\n // The first prompt and its startup row show from the first frame.\n {...(handoff?.sessionId === selected && handoff.initialMessage\n ? { pendingPrompt: { text: handoff.initialMessage, sentAt: handoff.sentAt } }\n : {})}\n composerOptions={{\n ...conversationProps?.composerOptions,\n ...(handoff?.sessionId === selected ? { initialDraft: handoff.draft } : {}),\n }}\n realtimeVoiceProps={{\n ...conversationProps?.realtimeVoiceProps,\n ...(handoff?.sessionId === selected && handoff.realtimeModel\n ? {\n realtimeAutostartModel: handoff.realtimeModel,\n onRealtimeAutostartConsumed: () => {\n setHandoff(null);\n notifyObserver(\n conversationProps?.realtimeVoiceProps?.onRealtimeAutostartConsumed,\n );\n },\n }\n : {}),\n }}\n // Sub-agent chats open in place, like a chat from the list.\n onOpenSession={conversationProps?.onOpenSession ?? select}\n {...scope}\n sessionId={selected}\n height=\"100%\"\n />\n ) : (\n <NewConversation\n {...scope}\n attachments={conversationProps?.attachments}\n modelPicker={conversationProps?.modelPicker}\n modelPickerProps={conversationProps?.modelPickerProps}\n composerProps={conversationProps?.composerProps}\n voiceInput={conversationProps?.voiceInput}\n realtimeVoice={conversationProps?.realtimeVoice}\n realtimeVoiceProps={conversationProps?.realtimeVoiceProps}\n labels={{\n ...(labels.newChatRetry ? { retry: labels.newChatRetry } : {}),\n ...(labels.newChatPending ? { pending: labels.newChatPending } : {}),\n ...(labels.newChatFinishingUploads\n ? { finishingUploads: labels.newChatFinishingUploads }\n : {}),\n title: labels.newChatTitle,\n send: labels.send,\n unavailable: labels.newChatUnavailable,\n placeholder:\n labelOverrides?.newChatPlaceholder ??\n conversationProps?.composerProps?.placeholder ??\n labels.newChatPlaceholder,\n }}\n enabled={canCreate}\n createSession={createSession}\n onCreated={(created) => {\n setListRevision((revision) => revision + 1);\n select(created.sessionId);\n setHandoff(created);\n }}\n />\n )}\n </div>\n </main>\n </div>\n );\n}\n","import { ChevronRightIcon, Loader2Icon, SquareIcon } from \"lucide-react\";\nimport { useState, type ReactNode } from \"react\";\nimport type { SessionBackgroundCommand } from \"@opengeni/sdk\";\nimport type { UseSessionBackgroundCommandsResult } from \"../hooks/use-session-background-commands\";\nimport { formatClockTime } from \"../lib/format\";\nimport { useErrorMessage } from \"../lib/error-message\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\n/** The current session's live commands. Settled commands belong to the timeline. */\nexport function SessionCommandsPanel({\n commands: state,\n readOnly = false,\n renderMetadata,\n compact = true,\n}: {\n commands: UseSessionBackgroundCommandsResult;\n readOnly?: boolean;\n renderMetadata?: (command: SessionBackgroundCommand) => ReactNode;\n compact?: boolean;\n}) {\n const t = useOpenGeniText();\n const formatError = useErrorMessage();\n const [pending, setPending] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const active = state.commands.filter(\n (command) => command.state === \"running\" || command.state === \"stopping\",\n );\n const stop = async (id: string) => {\n setPending(id);\n setError(null);\n try {\n await state.cancel(id);\n } catch (cause) {\n setError(formatError(cause));\n } finally {\n setPending(null);\n }\n };\n return (\n <div\n className={`space-y-2 ${compact ? \"text-og-xs\" : \"text-og-sm\"}`}\n data-og-session-commands=\"\"\n >\n {state.loading && active.length === 0 ? (\n <p role=\"status\" className=\"text-og-fg-muted\">\n {t(\"sessionCommandsPanel.loadingCommands\")}\n </p>\n ) : null}\n {state.error ? (\n <div role=\"alert\" className=\"flex items-center justify-between gap-2 text-og-danger\">\n <span>{t(\"sessionCommandsPanel.commandsUnavailable\")}</span>\n <button\n type=\"button\"\n className=\"underline outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n onClick={() => void state.refresh()}\n >\n {t(\"sessionCommandsPanel.retry\")}\n </button>\n </div>\n ) : null}\n {!state.loading && !state.error && active.length === 0 ? (\n <p role=\"status\" className=\"text-og-fg-muted\">\n {t(\"sessionCommandsPanel.noBackgroundCommandsRunning\")}\n </p>\n ) : null}\n {active.length > 0 ? (\n <ul\n className={`${compact ? \"max-h-64 overflow-y-auto overscroll-contain\" : \"\"} divide-y divide-og-border/40`}\n >\n {active.map((command) => (\n <li key={command.id} className=\"flex items-start gap-3 py-2 first:pt-0 last:pb-0\">\n <div className=\"min-w-0 flex-1\">\n {renderMetadata?.(command)}\n <details className=\"group/command\">\n <summary\n className=\"flex cursor-pointer list-none items-center gap-1.5 rounded-og-sm font-mono text-og-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n title={t(\"sessionCommandsPanel.expandCommand\")}\n >\n <ChevronRightIcon className=\"size-3 shrink-0 text-og-fg-subtle transition-transform group-open/command:rotate-90\" />\n <span\n className=\"min-w-0 truncate\"\n title={\n command.commandText ??\n (command.commandPreview || t(\"sessionCommandsPanel.backgroundCommand\"))\n }\n >\n {command.commandText ??\n (command.commandPreview || t(\"sessionCommandsPanel.backgroundCommand\"))}\n </span>\n </summary>\n <div className=\"mt-2 space-y-1\">\n <p className=\"whitespace-pre-wrap break-all font-mono text-og-fg-muted\">\n {command.commandText ??\n (command.commandPreview || t(\"sessionCommandsPanel.backgroundCommand\"))}\n </p>\n <time\n className=\"block text-og-fg-subtle\"\n dateTime={command.startedAt}\n title={new Date(command.startedAt).toLocaleString(t.locale)}\n >\n {t(\"sessionCommandsPanel.startedClocktime\", {\n clockTime: formatClockTime(t, command.startedAt),\n })}\n </time>\n </div>\n </details>\n <p className=\"mt-1 text-og-fg-subtle\">\n {command.observationStatus === \"unavailable\"\n ? command.state === \"stopping\"\n ? t(\"sessionCommandsPanel.stopRequestedStatusUnavailable\")\n : t(\"sessionCommandsPanel.commandStatusUnavailable\")\n : command.state === \"stopping\"\n ? t(\"sessionCommandsPanel.stopping\")\n : t(\"sessionCommandsPanel.running\")}\n </p>\n </div>\n {!readOnly ? (\n <button\n type=\"button\"\n aria-label={t(\"sessionCommandsPanel.stopCommandpreview\", {\n commandPreview:\n command.commandPreview || t(\"sessionCommandsPanel.backgroundCommand2\"),\n })}\n disabled={pending !== null || command.state === \"stopping\"}\n onClick={() => void stop(command.id)}\n className=\"inline-flex min-h-7 shrink-0 items-center gap-1 rounded-og-sm px-2 text-og-fg-muted outline-hidden hover:bg-og-surface-3/70 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:opacity-50 pointer-coarse:min-h-11\"\n >\n {pending === command.id || command.state === \"stopping\" ? (\n <Loader2Icon className=\"size-3 animate-og-spin motion-reduce:animate-none\" />\n ) : (\n <SquareIcon className=\"size-3\" />\n )}\n {t(\"sessionCommandsPanel.stop\")}\n </button>\n ) : null}\n </li>\n ))}\n </ul>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"text-og-danger\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n","import type { SessionBackgroundCommand } from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useRef } from \"react\";\n\nimport { useOpenGeni, type ClientOverride } from \"../provider\";\nimport { usePolledValue } from \"./internal\";\n\nexport type UseSessionBackgroundCommandsOptions = ClientOverride & {\n pollIntervalMs?: number | undefined;\n enabled?: boolean | undefined;\n};\n\nexport type UseSessionBackgroundCommandsResult = {\n commands: SessionBackgroundCommand[];\n loading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n cancel: (commandId: string) => Promise<void>;\n};\n\nexport function useSessionBackgroundCommands(\n sessionId: string | null | undefined,\n options: UseSessionBackgroundCommandsOptions = {},\n): UseSessionBackgroundCommandsResult {\n const { client, workspaceId } = useOpenGeni(options);\n const enabled = (options.enabled ?? true) && Boolean(sessionId);\n const load = useCallback(\n async (signal?: AbortSignal) => {\n if (!sessionId) return { commands: [] };\n if (!client.listSessionBackgroundCommands) {\n throw new Error(\"The configured Opengeni client does not support background commands\");\n }\n return await client.listSessionBackgroundCommands(workspaceId, sessionId, { signal });\n },\n [client, workspaceId, sessionId],\n );\n const state = usePolledValue(load, {\n enabled,\n pollIntervalMs: options.pollIntervalMs,\n });\n const refresh = state.refresh;\n const generation = useRef(0);\n useEffect(() => {\n generation.current += 1;\n return () => {\n generation.current += 1;\n };\n }, [client, workspaceId, sessionId, enabled]);\n const cancel = useCallback(\n async (commandId: string): Promise<void> => {\n if (!sessionId) return;\n if (!client.cancelSessionBackgroundCommand) {\n throw new Error(\"The configured Opengeni client does not support background commands\");\n }\n const ticket = generation.current;\n await client.cancelSessionBackgroundCommand(workspaceId, sessionId, commandId);\n if (enabled && ticket === generation.current) await refresh();\n },\n [client, workspaceId, sessionId, refresh, enabled],\n );\n return {\n commands: state.data?.commands ?? [],\n loading: state.loading,\n error: state.error,\n refresh,\n cancel,\n };\n}\n","import {\n useSessionBackgroundCommands,\n type UseSessionBackgroundCommandsOptions,\n} from \"../hooks/use-session-background-commands\";\nimport { SessionCommandsPanel } from \"./session-commands-panel\";\n\n/** Mount in the open activity panel so closed chrome never polls commands. */\nexport function SessionCommands({\n sessionId,\n readOnly = false,\n ...options\n}: UseSessionBackgroundCommandsOptions & { sessionId: string; readOnly?: boolean }) {\n const commands = useSessionBackgroundCommands(sessionId, {\n pollIntervalMs: 3_000,\n ...options,\n });\n return <SessionCommandsPanel commands={commands} readOnly={readOnly} />;\n}\n","import type { StartupPhaseItem } from \"./types\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\nconst LABELS = (t: OpenGeniText): Record<StartupPhaseItem[\"phase\"], string> => ({\n queue: t(\"timeline.startupTimings.workerQueue\"),\n sandbox: t(\"timeline.startupTimings.sandbox\"),\n rig: t(\"timeline.startupTimings.sandboxEnvironment\"),\n repository: t(\"timeline.startupTimings.repository\"),\n files: t(\"timeline.startupTimings.files\"),\n tools: t(\"timeline.startupTimings.tools\"),\n model_preparation: t(\"timeline.startupTimings.runtimeModelRequest\"),\n provider_first_byte: t(\"timeline.startupTimings.firstModelResponse\"),\n});\n\nexport function StartupTimings({ phases }: { phases: StartupPhaseItem[] }) {\n const t = useOpenGeniText();\n if (!phases.length)\n return (\n <p className=\"text-og-sm text-og-fg-subtle\">\n {t(\"timeline.startupTimings.noStartupTimingsRecordedYet\")}\n </p>\n );\n const byTurn = new Map<string | null, StartupPhaseItem[]>();\n for (const phase of phases) {\n const group = byTurn.get(phase.turnId) ?? [];\n group.push(phase);\n byTurn.set(phase.turnId, group);\n }\n const turns = [...byTurn.entries()]\n .map(([turnId, turnPhases]) => ({\n turnId,\n phases: turnPhases,\n startedAt: turnPhases.reduce(\n (earliest, phase) => (phase.startedAt < earliest ? phase.startedAt : earliest),\n turnPhases[0]!.startedAt,\n ),\n }))\n .sort((a, b) => b.startedAt.localeCompare(a.startedAt));\n return (\n <div className=\"space-y-3\">\n <p className=\"text-og-xs text-og-fg-subtle\">\n {t(\"timeline.startupTimings.eachTurnHasItsOwn\")}\n </p>\n {turns.map((turn, index) => (\n <StartupTurn\n key={turn.turnId ?? \"unassigned\"}\n {...turn}\n latest={index === 0 && turn.turnId !== null}\n />\n ))}\n </div>\n );\n}\n\nfunction StartupTurn({\n turnId,\n phases,\n startedAt,\n latest,\n}: {\n turnId: string | null;\n phases: StartupPhaseItem[];\n startedAt: string;\n latest: boolean;\n}) {\n const t = useOpenGeniText();\n const failed = phases.some((phase) => phase.status === \"failed\");\n const status = failed\n ? t(\"timeline.startupTimings.failed\")\n : phases.some((phase) => phase.status === \"running\")\n ? t(\"timeline.startupTimings.inProgress\")\n : phases.some((phase) => phase.status === \"cancelled\")\n ? t(\"timeline.startupTimings.interrupted\")\n : t(\"timeline.startupTimings.ready\");\n return (\n <details open={latest} className=\"group border-b border-og-border pb-3\">\n <summary className=\"cursor-pointer rounded py-3 text-og-sm text-og-fg-muted focus-visible:outline-2 focus-visible:outline-og-accent\">\n <span className=\"font-medium\">\n {turnId === null\n ? t(\"timeline.startupTimings.unassignedEvents\")\n : latest\n ? t(\"timeline.startupTimings.latestTurn\")\n : t(\"timeline.startupTimings.earlierTurn\")}\n </span>\n <span className=\"ml-2 text-og-xs text-og-fg-subtle\">\n {new Date(startedAt).toLocaleTimeString(t.locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n })}\n </span>\n <span\n className={\n failed ? \"ml-2 text-og-xs text-og-status-failed\" : \"ml-2 text-og-xs text-og-fg-subtle\"\n }\n >\n {status}\n </span>\n <span className=\"mt-1 block break-all pl-4 font-og-mono text-og-xs text-og-fg-subtle\">\n {turnId ?? t(\"timeline.startupTimings.noTurnIdRecorded\")}\n </span>\n </summary>\n <div className=\"pb-2\">\n <p className=\"text-og-xs text-og-fg-subtle\">\n {t(\"timeline.startupTimings.started\")}{\" \"}\n <time dateTime={startedAt}>{new Date(startedAt).toLocaleString(t.locale)}</time>\n </p>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-left text-og-xs\">\n <caption className=\"sr-only\">\n {t(\"timeline.startupTimings.startupPhasesFor\")}{\" \"}\n {turnId ?? t(\"timeline.startupTimings.unassignedEvents2\")}\n </caption>\n <thead>\n <tr className=\"border-b border-og-border text-og-fg-subtle\">\n <th scope=\"col\" className=\"py-2 font-medium\">\n {t(\"timeline.startupTimings.phase\")}\n </th>\n <th scope=\"col\" className=\"px-3 py-2 font-medium\">\n {t(\"timeline.startupTimings.status\")}\n </th>\n <th scope=\"col\" className=\"py-2 text-right font-medium\">\n {t(\"timeline.startupTimings.duration\")}\n </th>\n </tr>\n </thead>\n <tbody>\n {phases.map((phase) => (\n <tr\n key={phase.id}\n className=\"border-b border-og-border/40\"\n title={t(\"timeline.startupTimings.turnTurnidStartedStartedat\", {\n turnId: phase.turnId ?? t(\"timeline.startupTimings.unknownTurn\"),\n startedAt: phase.startedAt,\n })}\n >\n <th scope=\"row\" className=\"py-2.5 font-normal text-og-fg-muted\">\n {LABELS(t)[phase.phase]}\n </th>\n <td\n className={`px-3 py-2.5 ${phase.status === \"failed\" ? \"text-og-status-failed\" : \"text-og-fg-subtle\"}`}\n >\n {phase.status === \"running\"\n ? t(\"timeline.startupTimings.inProgress\")\n : phase.status}\n </td>\n <td className=\"py-2.5 text-right font-og-mono tabular-nums text-og-fg-muted\">\n {phase.durationMs === null\n ? \"—\"\n : phase.durationMs < 1000\n ? t(\"timeline.startupTimings.roundMs\", {\n round: Math.round(phase.durationMs),\n })\n : `${(phase.durationMs / 1000).toFixed(1)} s`}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </details>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","DEFAULT_LABELS","useState","useRef","useEffect","Loader2Icon","useState","jsx","jsxs","useState","Loader2Icon","useCallback","useEffect","useRef","useCallback","useRef","useEffect","jsx","jsx","jsxs"]}
@@ -5,7 +5,14 @@ import { createContext, useContext, useMemo } from "react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  var SESSION_UI_PRESETS = {
7
7
  /** The web app and the desktop app. */
8
- app: { chatList: true, dock: true, adminAccess: true, keyboardShortcuts: true, brand: true },
8
+ app: {
9
+ chatList: true,
10
+ dock: true,
11
+ adminAccess: true,
12
+ keyboardShortcuts: true,
13
+ brand: true,
14
+ starters: true
15
+ },
9
16
  /**
10
17
  * First-party side panes (the Excel add-in): everything but admin access and
11
18
  * page-wide keyboard shortcuts.
@@ -15,19 +22,21 @@ var SESSION_UI_PRESETS = {
15
22
  dock: true,
16
23
  adminAccess: false,
17
24
  keyboardShortcuts: false,
18
- brand: true
25
+ brand: true,
26
+ starters: true
19
27
  },
20
28
  /**
21
29
  * A customer product page (the default): the chat list, chats and composer,
22
- * without Opengeni's brand, the session panel, admin access or page-wide
23
- * shortcuts until the host turns them on.
30
+ * without Opengeni's brand and suggested tasks, the session panel, admin
31
+ * access or page-wide shortcuts until the host turns them on.
24
32
  */
25
33
  embed: {
26
34
  chatList: true,
27
35
  dock: false,
28
36
  adminAccess: false,
29
37
  keyboardShortcuts: false,
30
- brand: false
38
+ brand: false,
39
+ starters: false
31
40
  }
32
41
  };
33
42
  var SessionUiFeaturesContext = createContext(SESSION_UI_PRESETS.app);
@@ -52,4 +61,4 @@ export {
52
61
  SessionUiFeaturesProvider,
53
62
  useSessionUiFeature
54
63
  };
55
- //# sourceMappingURL=chunk-XFNLU7EW.js.map
64
+ //# sourceMappingURL=chunk-H5M33DAL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/lib/session-ui-features.tsx"],"sourcesContent":["// Which parts of the session UI a surface shows. The web app shows everything;\n// an embed picks a preset and switches single features on or off. A feature\n// also needs the server and the person's permissions to allow it, which the\n// components check themselves; a switch can only hide, never grant.\nimport { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\nexport type SessionUiFeatures = Readonly<{\n /** The chat list: search, filters, projects, pins, archive, subagent rows. */\n chatList: boolean;\n /**\n * The session panel beside the chat: files, terminal, desktop, browser and\n * computer viewers, artifacts, the agent inspector. Loaded on demand.\n */\n dock: boolean;\n /** The workspace-admin access indicator and grant dialog in the header. */\n adminAccess: boolean;\n /**\n * Page-wide keyboard shortcuts and the ⌘K command menu (⌘/Ctrl+⇧O for a new\n * chat, ⌘/Ctrl+K, next and previous chat, the shortcut sheet).\n */\n keyboardShortcuts: boolean;\n /** The Opengeni logo and wordmark at the top of the chat list and the mobile header. */\n brand: boolean;\n /**\n * Opengeni's suggested first tasks under the new-chat composer (connect\n * Slack, GitHub or Linear, schedule a brief, and so on).\n */\n starters: boolean;\n}>;\n\nexport type SessionUiPreset = \"app\" | \"companion\" | \"embed\";\n\nexport const SESSION_UI_PRESETS: Readonly<Record<SessionUiPreset, SessionUiFeatures>> = {\n /** The web app and the desktop app. */\n app: {\n chatList: true,\n dock: true,\n adminAccess: true,\n keyboardShortcuts: true,\n brand: true,\n starters: true,\n },\n /**\n * First-party side panes (the Excel add-in): everything but admin access and\n * page-wide keyboard shortcuts.\n */\n companion: {\n chatList: true,\n dock: true,\n adminAccess: false,\n keyboardShortcuts: false,\n brand: true,\n starters: true,\n },\n /**\n * A customer product page (the default): the chat list, chats and composer,\n * without Opengeni's brand and suggested tasks, the session panel, admin\n * access or page-wide shortcuts until the host turns them on.\n */\n embed: {\n chatList: true,\n dock: false,\n adminAccess: false,\n keyboardShortcuts: false,\n brand: false,\n starters: false,\n },\n};\n\nconst SessionUiFeaturesContext = createContext<SessionUiFeatures>(SESSION_UI_PRESETS.app);\n\n/** Feature switches a host may pass, including names from earlier releases. */\nexport type SessionUiFeatureOverrides = Partial<SessionUiFeatures> & {\n /** @deprecated Use `keyboardShortcuts`. */\n newChatShortcut?: boolean | undefined;\n};\n\nexport function SessionUiFeaturesProvider(props: {\n preset?: SessionUiPreset | undefined;\n features?: SessionUiFeatureOverrides | undefined;\n children?: ReactNode;\n}) {\n const preset = props.preset ?? \"app\";\n const { newChatShortcut, ...current } = props.features ?? {};\n const overrides: Partial<SessionUiFeatures> =\n newChatShortcut === undefined || current.keyboardShortcuts !== undefined\n ? current\n : { ...current, keyboardShortcuts: newChatShortcut };\n const value = useMemo(\n () => ({ ...SESSION_UI_PRESETS[preset], ...overrides }),\n // Hosts often pass an inline object; compare by content.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [preset, JSON.stringify(overrides)],\n );\n return (\n <SessionUiFeaturesContext.Provider value={value}>\n {props.children}\n </SessionUiFeaturesContext.Provider>\n );\n}\n\n/** Whether this surface shows a feature. Without a provider: the web app's full UI. */\nexport function useSessionUiFeature(feature: keyof SessionUiFeatures): boolean {\n return useContext(SessionUiFeaturesContext)[feature];\n}\n"],"mappings":";;;AAIA,SAAS,eAAe,YAAY,eAA+B;AA2F/D;AA/DG,IAAM,qBAA2E;AAAA;AAAA,EAEtF,KAAK;AAAA,IACH,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AAAA,IACT,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACF;AAEA,IAAM,2BAA2B,cAAiC,mBAAmB,GAAG;AAQjF,SAAS,0BAA0B,OAIvC;AACD,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,EAAE,iBAAiB,GAAG,QAAQ,IAAI,MAAM,YAAY,CAAC;AAC3D,QAAM,YACJ,oBAAoB,UAAa,QAAQ,sBAAsB,SAC3D,UACA,EAAE,GAAG,SAAS,mBAAmB,gBAAgB;AACvD,QAAM,QAAQ;AAAA,IACZ,OAAO,EAAE,GAAG,mBAAmB,MAAM,GAAG,GAAG,UAAU;AAAA;AAAA;AAAA,IAGrD,CAAC,QAAQ,KAAK,UAAU,SAAS,CAAC;AAAA,EACpC;AACA,SACE,oBAAC,yBAAyB,UAAzB,EAAkC,OAChC,gBAAM,UACT;AAEJ;AAGO,SAAS,oBAAoB,SAA2C;AAC7E,SAAO,WAAW,wBAAwB,EAAE,OAAO;AACrD;","names":[]}
@@ -22,10 +22,10 @@ import {
22
22
  import {
23
23
  rememberedMachineFolder,
24
24
  workspaceDefaultRigOptionLabel
25
- } from "./chunk-JXT5QDJC.js";
25
+ } from "./chunk-KNFDWNCH.js";
26
26
  import {
27
27
  t
28
- } from "./chunk-HPPKLBTJ.js";
28
+ } from "./chunk-TJQDL3JH.js";
29
29
  import {
30
30
  DropdownMenuItem
31
31
  } from "./chunk-TREHTIBD.js";
@@ -493,4 +493,4 @@ export {
493
493
  VisibilityMenuBody,
494
494
  UsageLimitMenuBody
495
495
  };
496
- //# sourceMappingURL=chunk-BXRIQZAH.js.map
496
+ //# sourceMappingURL=chunk-HNNM2GDN.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  mergeSessionForRail
4
- } from "./chunk-BJIZ7PL7.js";
4
+ } from "./chunk-D64Z4V26.js";
5
5
 
6
6
  // src/app/lib/session-branch-cache.tsx
7
7
  function sessionBranchSummaryKey(session, readRevision = 0) {
@@ -183,4 +183,4 @@ export {
183
183
  sessionBranchNeedsHydration,
184
184
  sessionBranchSummaryDecision
185
185
  };
186
- //# sourceMappingURL=chunk-EU6XSQFM.js.map
186
+ //# sourceMappingURL=chunk-HPB4KSV3.js.map
@@ -3,7 +3,7 @@ import {
3
3
  ListRow,
4
4
  ListRowSkeleton,
5
5
  RowList
6
- } from "./chunk-NWZW2WHN.js";
6
+ } from "./chunk-MM7OKOTE.js";
7
7
  import {
8
8
  Toolbar,
9
9
  ToolbarGroup,
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-BBWKPNJB.js";
12
12
  import {
13
13
  sessionStateLabel
14
- } from "./chunk-GTQ3SNEI.js";
14
+ } from "./chunk-E36IC3LU.js";
15
15
  import {
16
16
  EmptyState
17
17
  } from "./chunk-5CIUQX6D.js";
@@ -26,7 +26,7 @@ import {
26
26
  } from "./chunk-YG6NARQY.js";
27
27
  import {
28
28
  useNavigate
29
- } from "./chunk-MYNUBDU7.js";
29
+ } from "./chunk-VYKW6TB2.js";
30
30
  import {
31
31
  userErrorText
32
32
  } from "./chunk-L4OF77LE.js";
@@ -41,7 +41,7 @@ import {
41
41
  } from "./chunk-HMU5IELG.js";
42
42
  import {
43
43
  sessionDisplayTitle
44
- } from "./chunk-Z5WMLJKI.js";
44
+ } from "./chunk-F2RMKGDQ.js";
45
45
 
46
46
  // src/app/components/artifacts/site-conversations.tsx
47
47
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -248,4 +248,4 @@ export {
248
248
  SiteConversations,
249
249
  SiteConversationsPanel
250
250
  };
251
- //# sourceMappingURL=chunk-QCD5Y7K5.js.map
251
+ //# sourceMappingURL=chunk-HSQRYJ4P.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-A3MTTRCX.js";
8
8
  import {
9
9
  Markdown
10
- } from "./chunk-R63QEVPK.js";
10
+ } from "./chunk-SJORXXLV.js";
11
11
 
12
12
  // src/app/components/markdown.tsx
13
13
  import { jsx } from "react/jsx-runtime";
@@ -44,4 +44,4 @@ function MarkdownText({
44
44
  export {
45
45
  MarkdownText
46
46
  };
47
- //# sourceMappingURL=chunk-YXOKAG66.js.map
47
+ //# sourceMappingURL=chunk-HUXDGWAN.js.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-HMU5IELG.js";
8
8
  import {
9
9
  useSessionStart
10
- } from "./chunk-FM4OUCC2.js";
10
+ } from "./chunk-MOKYT3X3.js";
11
11
  import {
12
12
  personalMachineCopy,
13
13
  sessionAdmissionCopy,
@@ -20,7 +20,7 @@ import {
20
20
  } from "./chunk-BOG2FED3.js";
21
21
  import {
22
22
  useOpenGeniText
23
- } from "./chunk-5JZYPZ72.js";
23
+ } from "./chunk-JFK7NTEA.js";
24
24
 
25
25
  // src/components/session-admission-notice.tsx
26
26
  import { useEffect, useId, useRef, useState } from "react";
@@ -249,4 +249,4 @@ export {
249
249
  SessionMachineChoices,
250
250
  SessionStartNotice
251
251
  };
252
- //# sourceMappingURL=chunk-VUHPA3XQ.js.map
252
+ //# sourceMappingURL=chunk-I66ZB6KD.js.map
@@ -1,18 +1,18 @@
1
1
  "use client";
2
2
  import {
3
3
  InlineDisabledReason
4
- } from "./chunk-33TPANCR.js";
4
+ } from "./chunk-TFK4KFKA.js";
5
5
  import {
6
6
  FormDialog
7
7
  } from "./chunk-S7PVL7XH.js";
8
+ import {
9
+ ReasonTooltip
10
+ } from "./chunk-KS57MLGE.js";
8
11
  import {
9
12
  MENU_CHECK_CLASS,
10
13
  MENU_SEPARATOR_CLASS,
11
14
  MENU_SURFACE_CLASS
12
15
  } from "./chunk-5OTQA7CM.js";
13
- import {
14
- ReasonTooltip
15
- } from "./chunk-KS57MLGE.js";
16
16
  import {
17
17
  containedPortal
18
18
  } from "./chunk-J3BHDXQQ.js";
@@ -387,4 +387,4 @@ export {
387
387
  needsEscalationConfirm,
388
388
  RoleSelect
389
389
  };
390
- //# sourceMappingURL=chunk-7CZTKBTI.js.map
390
+ //# sourceMappingURL=chunk-IC7KNOBB.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  openBlankTab
4
- } from "./chunk-MYNUBDU7.js";
4
+ } from "./chunk-VYKW6TB2.js";
5
5
 
6
6
  // src/app/embed/memory-navigation.tsx
7
7
  import { createElement, useMemo, useState, useSyncExternalStore } from "react";
@@ -123,6 +123,7 @@ function createMemoryNavigation(options) {
123
123
  reloadDocument: _reloadDocument,
124
124
  href: hrefOption,
125
125
  preload: _preload,
126
+ activeOptions: _activeOptions,
126
127
  disabled,
127
128
  children,
128
129
  onClick,
@@ -226,4 +227,4 @@ export {
226
227
  stringifyMemorySearch,
227
228
  useMemoryNavigation
228
229
  };
229
- //# sourceMappingURL=chunk-KF3MF6FP.js.map
230
+ //# sourceMappingURL=chunk-IECRGM6K.js.map
@@ -0,0 +1 @@
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 activeOptions: _activeOptions,\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":";;;;;;AAIA,SAAS,eAAe,SAAS,UAAU,4BAA6C;AAiCxF,SAAS,eAAkB,QAA0C,SAAY,OAAa;AAC5F,MAAI,WAAW,OAAW,QAAO;AACjC,MAAI,WAAW,KAAM,QAAO;AAC5B,MAAI,OAAO,WAAW,WAAY,QAAQ,OAA8B,OAAO;AAC/E,SAAO;AACT;AAGO,SAAS,sBAAsB,QAAkC;AACtE,QAAM,QAAQ,IAAI,gBAAgB;AAClC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,OAAW;AACzB,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,OAAO;AACX,UAAI;AACF,aAAK,MAAM,KAAK;AAChB,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AACA,YAAM,IAAI,KAAK,OAAO,KAAK,UAAU,KAAK,IAAI,KAAK;AAAA,IACrD,OAAO;AACL,YAAM,IAAI,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IACtC;AAAA,EACF;AACA,QAAM,OAAO,MAAM,SAAS;AAC5B,SAAO,OAAO,IAAI,IAAI,KAAK;AAC7B;AAEA,SAAS,kBAAkB,WAAqC;AAC9D,QAAM,SAA2B,CAAC;AAClC,aAAW,CAAC,KAAK,KAAK,KAAK,IAAI,gBAAgB,SAAS,GAAG;AACzD,QAAI;AACF,aAAO,GAAG,IAAI,KAAK,MAAM,KAAK;AAAA,IAChC,QAAQ;AACN,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,eAAe;AAErB,SAAS,SAAS,UAAoC;AACpD,QAAM,QAAQ,aAAa,KAAK,QAAQ;AACxC,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,SAAO;AAAA,IACL,aAAa,mBAAmB,MAAM,CAAC,CAAE;AAAA,IACzC,GAAI,MAAM,CAAC,IAAI,EAAE,WAAW,mBAAmB,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EAChE;AACF;AAEA,SAAS,SAAS,IAAY,QAAkC;AAC9D,SAAO,GAAG;AAAA,IAAQ;AAAA,IAAgC,CAAC,GAAG,SACpD,mBAAmB,OAAO,IAAI,KAAK,EAAE;AAAA,EACvC;AACF;AAEA,SAAS,YACP,UACA,QACA,MACA,OACoB;AACpB,QAAM,YAAY,sBAAsB,MAAM;AAC9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,IAAI,IAAI,KAAK,EAAE;AAAA,IACtD;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAAkC;AACzD,QAAM,MAAM,IAAI,IAAI,MAAM,sBAAsB;AAChD,SAAO,YAAY,IAAI,UAAU,kBAAkB,IAAI,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC;AACvF;AAEA,SAAS,aAAa,OAA+C;AACnE,SAAO,MAAM,WAAW,KAAK,CAAC,MAAM,WAAW,CAAC,MAAM,WAAW,CAAC,MAAM,YAAY,CAAC,MAAM;AAC7F;AAEA,SAAS,uBAAuB,SAAkD;AAChF,MAAI,WAAW,gBAAgB,QAAQ,WAAW;AAClD,QAAM,YAAY,oBAAI,IAAc;AACpC,QAAM,YAAY,CAAC,aAAuB;AACxC,cAAU,IAAI,QAAQ;AACtB,WAAO,MAAM,UAAU,OAAO,QAAQ;AAAA,EACxC;AACA,QAAM,WAAW,MAAM;AACvB,QAAM,UACJ,QAAQ,YACP,CAAC,QAAgB;AAChB,WAAO,KAAK,KAAK,UAAU,qBAAqB;AAAA,EAClD;AACF,QAAM,WAAW,CAAC,SAAiB,IAAI,IAAI,MAAM,QAAQ,aAAa,EAAE,SAAS;AAEjF,QAAM,SAAS,CAAC,eAAoD;AAClE,QAAI,WAAW,SAAS,OAAW,QAAO,gBAAgB,WAAW,IAAI;AACzE,UAAM,gBAAgB,SAAS,SAAS,QAAQ;AAChD,UAAM,SAAS,eAAe,WAAW,QAAQ,eAAe,aAAa;AAC7E,UAAM,WACJ,WAAW,OAAO,UAAa,WAAW,OAAO,MAC7C,SAAS,WACT,SAAS,WAAW,IAAI,MAAM;AACpC,WAAO;AAAA,MACL;AAAA,MACA,eAAe,WAAW,QAAQ,SAAS,QAAQ,CAAC,CAAC;AAAA,MACrD,eAAe,WAAW,MAAM,SAAS,MAAM,EAAE;AAAA,MACjD,eAAe,WAAW,OAAO,SAAS,OAAO,CAAC,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,SAA6B;AAC3C,QAAI,CAAC,QAAQ,QAAQ,KAAK,QAAQ,GAAG;AACnC,cAAQ,SAAS,KAAK,IAAI,CAAC;AAC3B;AAAA,IACF;AACA,eAAW;AACX,eAAW,YAAY,UAAW,UAAS;AAC3C,YAAQ,mBAAmB,IAAI;AAAA,EACjC;AAEA,QAAM,WAAW,OAAO,eAAgC,OAAO,OAAO,UAAU,CAAC;AAEjF,QAAM,cAAc,MAAM,qBAAqB,WAAW,UAAU,QAAQ;AAE5E,QAAM,OAAO,CAAC;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,MAAiB;AACf,UAAM,UAAU,YAAY;AAC5B,UAAM,OAAO,OAAO,EAAE,IAAI,QAAQ,QAAQ,MAAM,OAAO,MAAM,WAAW,CAAC;AACzE,UAAM,WAAW,QAAQ,QAAQ,KAAK,QAAQ;AAC9C,UAAM,WAAW,KAAK,aAAa,QAAQ;AAC3C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH;AAAA,QACA,MAAM,WAAW,KAAK,OAAO,SAAS,KAAK,IAAI;AAAA,QAC/C,QAAQ,WAAW,aAAa;AAAA,QAChC,KAAK,WAAW,OAAO,MAAM;AAAA,QAC7B,iBAAiB,YAAY;AAAA,QAC7B,eAAe,WAAW,WAAW;AAAA,QACrC,SAAS,CAAC,UAAyC;AACjD,oBAAU,KAAK;AACf,cAAI,MAAM,oBAAoB,UAAU;AACtC,gBAAI,SAAU,OAAM,eAAe;AACnC;AAAA,UACF;AACA,cAAI,CAAC,aAAa,KAAK,EAAG;AAC1B,cAAI,CAAC,UAAU;AAEb,kBAAM,eAAe;AACrB,oBAAQ,SAAS,KAAK,IAAI,CAAC;AAC3B;AAAA,UACF;AACA,cAAI,eAAe,SAAU;AAC7B,gBAAM,eAAe;AACrB,iBAAO,IAAI;AAAA,QACb;AAAA,MACF;AAAA,MACA,OAAO,aAAa,aAAa,SAAS,EAAE,UAAU,iBAAiB,MAAM,CAAC,IAAI;AAAA,IACpF;AAAA,EACF;AAEA,QAAM,OAAiB;AAAA,IACrB,MAAM,MAAM,SAAS,SAAS,IAAI;AAAA,IAClC,QAAQ,MAAM,IAAI,IAAI,QAAQ,aAAa,EAAE;AAAA,IAC7C,WAAW,MAAM,IAAI,gBAAgB,SAAS,SAAS;AAAA,IACvD,cAAc,CAAC,OAAO,mBAAmB;AACvC,iBAAW;AAAA,QACT,SAAS;AAAA,QACT,kBAAkB,MAAM,SAAS,CAAC;AAAA,QAClC,SAAS;AAAA,QACT,gBAAgB,mBAAmB,SAAS,QAAQ,CAAC;AAAA,MACvD;AACA,iBAAW,YAAY,UAAW,UAAS;AAAA,IAC7C;AAAA,IACA,QAAQ,CAAC,QAAQ;AACf,YAAM,WAAW,IAAI,IAAI,KAAK,QAAQ,aAAa;AACnD,YAAM,gBAAgB,IAAI,IAAI,QAAQ,aAAa,EAAE;AACrD,UAAI,SAAS,WAAW,iBAAiB,QAAQ,QAAQ,SAAS,QAAQ,GAAG;AAC3E,eAAO,gBAAgB,GAAG,SAAS,QAAQ,GAAG,SAAS,MAAM,GAAG,SAAS,IAAI,EAAE,CAAC;AAChF;AAAA,MACF;AACA,cAAQ,SAAS,SAAS,CAAC;AAAA,IAC7B;AAAA,IACA,aAAa;AAAA,IACb,MAAM,CAAC,QAAQ,QAAQ,IAAI,IAAI,KAAK,QAAQ,aAAa,EAAE,SAAS,CAAC;AAAA,IACrE,SAAS,OAAO,QAAQ,WAAW,cAAc;AAAA,EACnD;AAEA,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB;AAAA,IACA,gBAAgB,CAAK,EAAE,OAAO,MAC5B,OAAO,EAAE,UAAU,YAAY,EAAE,CAAC;AAAA,IACpC,WAAW,OAAO;AAAA,MAChB,IAAI,QAAQ;AACV,eAAO,EAAE,SAAS;AAAA,MACpB;AAAA,IACF;AAAA,IACA,WAAW,MAAM,YAAY,EAAE;AAAA,IAC/B;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,EACF;AACF;AAMO,SAAS,oBAAoB,SAAkD;AACpF,QAAM,CAAC,MAAM,IAAI,SAAS,OAAO,EAAE,SAAS,QAAQ,EAAE;AACtD,SAAO,UAAU;AACjB,SAAO;AAAA,IACL,MACE,uBAAuB;AAAA,MACrB,aAAa,QAAQ;AAAA,MACrB,eAAe,QAAQ;AAAA,MACvB,SAAS,CAAC,aAAa,OAAO,QAAQ,QAAQ,QAAQ;AAAA,MACtD,SAAS,CAAC,QACR,OAAO,QAAQ,UACX,OAAO,QAAQ,QAAQ,GAAG,IAC1B,KAAK,OAAO,KAAK,KAAK,UAAU,qBAAqB;AAAA,MAC3D,SAAS,OAAO,OAAO,QAAQ,WAAW,cAAc;AAAA,MACxD,kBAAkB,CAAC,aAAa,OAAO,QAAQ,mBAAmB,QAAQ;AAAA,IAC5E,CAAC;AAAA;AAAA,IAEH,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-Z63GB7JI.js";
5
5
  import {
6
6
  BillingClassMark
7
- } from "./chunk-AG7VGUIW.js";
7
+ } from "./chunk-ERG355NM.js";
8
8
 
9
9
  // src/app/components/billing-class-mark.tsx
10
10
  import { jsx } from "react/jsx-runtime";
@@ -30,4 +30,4 @@ export {
30
30
  openGeniGroupPresentation,
31
31
  BillingClassMark2 as BillingClassMark
32
32
  };
33
- //# sourceMappingURL=chunk-HGMWMK5K.js.map
33
+ //# sourceMappingURL=chunk-IIO2MR3B.js.map
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import {
3
+ useOpenGeni
4
+ } from "./chunk-TVQCDDSZ.js";
5
+
6
+ // src/app/lib/use-session-list-hint-refresh.tsx
7
+ import { useEffect, useRef } from "react";
8
+ function hintChangesOrdinaryLists(hint) {
9
+ return hint.sessionIds === null || hint.sessionIds.length > 0;
10
+ }
11
+ function hintChangesSiteConversationLists(hint) {
12
+ return hint.sessionIds === null || (hint.siteSessionIds?.length ?? 0) > 0;
13
+ }
14
+ function useSessionListHintRefresh(refresh, error, options = {}) {
15
+ const { workspaceId, workspaceSessionListEvent: hint, workspaceControlEvent } = useOpenGeni();
16
+ const available = hint?.workspaceId === workspaceId && hint.available;
17
+ const seen = useRef({ hint, workspaceControlEvent });
18
+ const siteConversations = options.siteConversations === true;
19
+ useEffect(() => {
20
+ const previous = seen.current;
21
+ seen.current = { hint, workspaceControlEvent };
22
+ const irrelevant = hint !== previous.hint && workspaceControlEvent === previous.workspaceControlEvent && hint !== null && hint !== void 0 && !(siteConversations ? hintChangesSiteConversationLists(hint) : hintChangesOrdinaryLists(hint));
23
+ if (irrelevant) return;
24
+ if (available && document.visibilityState !== "hidden") void refresh();
25
+ }, [available, hint, workspaceControlEvent, refresh, siteConversations]);
26
+ useEffect(() => {
27
+ if (!available || !error || document.visibilityState === "hidden") return;
28
+ const timer = window.setTimeout(() => void refresh(), 15e3);
29
+ return () => window.clearTimeout(timer);
30
+ }, [available, error, refresh]);
31
+ }
32
+
33
+ export {
34
+ hintChangesOrdinaryLists,
35
+ hintChangesSiteConversationLists,
36
+ useSessionListHintRefresh
37
+ };
38
+ //# sourceMappingURL=chunk-IJYL5BZM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/lib/use-session-list-hint-refresh.tsx"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport type { WorkspaceSessionListEvent } from \"@opengeni/sdk\";\nimport { useOpenGeni } from \"../../session-context\";\n\n/**\n * Whether a hint can change an ordinary (non-Site-row) list. A hint with an\n * empty `sessionIds` only carries Site conversations, which those lists omit.\n */\nexport function hintChangesOrdinaryLists(hint: WorkspaceSessionListEvent): boolean {\n return hint.sessionIds === null || hint.sessionIds.length > 0;\n}\n\n/**\n * Whether a hint can change a list of Site conversations: a workspace-wide\n * hint, or one naming Site conversations (`siteSessionIds`).\n */\nexport function hintChangesSiteConversationLists(hint: WorkspaceSessionListEvent): boolean {\n return hint.sessionIds === null || (hint.siteSessionIds?.length ?? 0) > 0;\n}\n\n/**\n * Small unpaged lists reconcile on any authorized hint; the rail scopes its own\n * pages. A list of ordinary sessions skips hints that only name Site\n * conversations; a list of Site conversations (`siteConversations`) skips\n * hints that name none.\n */\nexport function useSessionListHintRefresh(\n refresh: () => Promise<void>,\n error: Error | null,\n options: { siteConversations?: boolean | undefined } = {},\n) {\n const { workspaceId, workspaceSessionListEvent: hint, workspaceControlEvent } = useOpenGeni();\n const available = hint?.workspaceId === workspaceId && hint.available;\n const seen = useRef({ hint, workspaceControlEvent });\n const siteConversations = options.siteConversations === true;\n useEffect(() => {\n const previous = seen.current;\n seen.current = { hint, workspaceControlEvent };\n // A new hint that names nothing this list shows changes nothing here.\n const irrelevant =\n hint !== previous.hint &&\n workspaceControlEvent === previous.workspaceControlEvent &&\n hint !== null &&\n hint !== undefined &&\n !(siteConversations\n ? hintChangesSiteConversationLists(hint)\n : hintChangesOrdinaryLists(hint));\n if (irrelevant) return;\n if (available && document.visibilityState !== \"hidden\") void refresh();\n }, [available, hint, workspaceControlEvent, refresh, siteConversations]);\n useEffect(() => {\n if (!available || !error || document.visibilityState === \"hidden\") return;\n const timer = window.setTimeout(() => void refresh(), 15_000);\n return () => window.clearTimeout(timer);\n }, [available, error, refresh]);\n}\n"],"mappings":";;;;;;AAAA,SAAS,WAAW,cAAc;AAQ3B,SAAS,yBAAyB,MAA0C;AACjF,SAAO,KAAK,eAAe,QAAQ,KAAK,WAAW,SAAS;AAC9D;AAMO,SAAS,iCAAiC,MAA0C;AACzF,SAAO,KAAK,eAAe,SAAS,KAAK,gBAAgB,UAAU,KAAK;AAC1E;AAQO,SAAS,0BACd,SACA,OACA,UAAuD,CAAC,GACxD;AACA,QAAM,EAAE,aAAa,2BAA2B,MAAM,sBAAsB,IAAI,YAAY;AAC5F,QAAM,YAAY,MAAM,gBAAgB,eAAe,KAAK;AAC5D,QAAM,OAAO,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACnD,QAAM,oBAAoB,QAAQ,sBAAsB;AACxD,YAAU,MAAM;AACd,UAAM,WAAW,KAAK;AACtB,SAAK,UAAU,EAAE,MAAM,sBAAsB;AAE7C,UAAM,aACJ,SAAS,SAAS,QAClB,0BAA0B,SAAS,yBACnC,SAAS,QACT,SAAS,UACT,EAAE,oBACE,iCAAiC,IAAI,IACrC,yBAAyB,IAAI;AACnC,QAAI,WAAY;AAChB,QAAI,aAAa,SAAS,oBAAoB,SAAU,MAAK,QAAQ;AAAA,EACvE,GAAG,CAAC,WAAW,MAAM,uBAAuB,SAAS,iBAAiB,CAAC;AACvE,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,CAAC,SAAS,SAAS,oBAAoB,SAAU;AACnE,UAAM,QAAQ,OAAO,WAAW,MAAM,KAAK,QAAQ,GAAG,IAAM;AAC5D,WAAO,MAAM,OAAO,aAAa,KAAK;AAAA,EACxC,GAAG,CAAC,WAAW,OAAO,OAAO,CAAC;AAChC;","names":[]}
@@ -5,10 +5,10 @@ import {
5
5
  } from "./chunk-CUUJROYT.js";
6
6
  import {
7
7
  SessionCapabilityFrame
8
- } from "./chunk-HRJQAFKR.js";
8
+ } from "./chunk-AX6YJA5U.js";
9
9
  import {
10
10
  useOpenGeniText
11
- } from "./chunk-5JZYPZ72.js";
11
+ } from "./chunk-JFK7NTEA.js";
12
12
 
13
13
  // src/hooks/use-connect.ts
14
14
  import { useMemo, useSyncExternalStore } from "react";
@@ -549,4 +549,4 @@ export {
549
549
  SessionMcpCapabilityCard,
550
550
  McpConnectionCard
551
551
  };
552
- //# sourceMappingURL=chunk-L6RXRRN3.js.map
552
+ //# sourceMappingURL=chunk-ILDOW2IQ.js.map
@@ -133,4 +133,4 @@ function ComposerMobilePlus(props) {
133
133
  export {
134
134
  ComposerMobilePlus
135
135
  };
136
- //# sourceMappingURL=chunk-O756O2I7.js.map
136
+ //# sourceMappingURL=chunk-IPPVX5GF.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  capabilityLogoSource
4
- } from "./chunk-ZRJCGBVV.js";
4
+ } from "./chunk-PVR5EELP.js";
5
5
  import {
6
6
  connectionHealth
7
7
  } from "./chunk-22NENBA3.js";
@@ -96,4 +96,4 @@ export {
96
96
  followWorkspaceConnectorPolicy,
97
97
  newSessionConnectorCustomizeState
98
98
  };
99
- //# sourceMappingURL=chunk-X7ASQHR6.js.map
99
+ //# sourceMappingURL=chunk-IUK5QGP5.js.map
@@ -341,7 +341,7 @@ var englishMessages = {
341
341
  "browserViewer.inputFailed": "Input failed",
342
342
  "browserViewer.inputResultUnknown": "Input result unknown",
343
343
  "browserViewer.inspectThePageBeforeContinuing": "Inspect the page before continuing.",
344
- "browserViewer.installTheOpengeniBrowserExtension": "Install the Opengeni Browser extension in the profile you want to use.",
344
+ "browserViewer.installTheOpengeniBrowserExtension": "Install the {extensionName} extension in the profile you want to use.",
345
345
  "browserViewer.interactiveBrowserPage": "Interactive browser page",
346
346
  "browserViewer.itsPrivateStateIsSaved": "Its private state is saved. Opening it creates a fresh, isolated browser process.",
347
347
  "browserViewer.itStoppedAfterItWent": "It stopped after it went unused.",
@@ -3470,8 +3470,8 @@ var englishMessages = {
3470
3470
  "timeline.toolStep.shareFile.running": "Sharing a file",
3471
3471
  "timeline.toolStep.signIn.done": "Signed in",
3472
3472
  "timeline.toolStep.signIn.running": "Signing in",
3473
- "timeline.toolStep.startHelper.done": "Got help from another assistant",
3474
- "timeline.toolStep.startHelper.running": "Getting help from another assistant",
3473
+ "timeline.toolStep.startHelper.done": "Started a worker",
3474
+ "timeline.toolStep.startHelper.running": "Starting a worker",
3475
3475
  "timeline.toolStep.switchComputer.done": "Switched computers",
3476
3476
  "timeline.toolStep.switchComputer.running": "Switching computers",
3477
3477
  "timeline.toolStep.syncPosts.done": "Synced posts",
@@ -3864,4 +3864,4 @@ export {
3864
3864
  SingleSendWording,
3865
3865
  useOpenGeniLocale
3866
3866
  };
3867
- //# sourceMappingURL=chunk-5JZYPZ72.js.map
3867
+ //# sourceMappingURL=chunk-JFK7NTEA.js.map