@opengeni/react 4.4.1 → 4.5.0

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 (700) hide show
  1. package/dist/app/app-state.js +25 -25
  2. package/dist/app/components/Composer.js +27 -27
  3. package/dist/app/components/agent/agent-capability-picker.js +4 -4
  4. package/dist/app/components/artifacts/artifact-browse-controls.js +3 -3
  5. package/dist/app/components/artifacts/artifact-library.js +19 -19
  6. package/dist/app/components/artifacts/artifact-page-chrome.js +2 -2
  7. package/dist/app/components/artifacts/chat-interactive-block.js +15 -15
  8. package/dist/app/components/artifacts/inline-chat-image.js +30 -29
  9. package/dist/app/components/artifacts/retained-file-preview.js +34 -33
  10. package/dist/app/components/artifacts/retained-text-preview.js +5 -5
  11. package/dist/app/components/artifacts/site-audience.js +4 -4
  12. package/dist/app/components/artifacts/site-conversations.js +20 -19
  13. package/dist/app/components/artifacts/site-data.js +18 -18
  14. package/dist/app/components/artifacts/site-publishing.js +39 -39
  15. package/dist/app/components/artifacts/site-settings.js +46 -46
  16. package/dist/app/components/billing-class-mark.js +5 -5
  17. package/dist/app/components/capabilities/capability-detail-sheet.js +8 -8
  18. package/dist/app/components/capabilities/capability-logo-source.js +11 -11
  19. package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
  20. package/dist/app/components/capabilities/native-connect-setup.js +14 -14
  21. package/dist/app/components/capabilities/perform-capability-action.js +1 -1
  22. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +15 -15
  23. package/dist/app/components/capabilities/session-capability-card.js +77 -75
  24. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  25. package/dist/app/components/capabilities/session-chrome-card.js +35 -33
  26. package/dist/app/components/capabilities/session-custom-mcp-card.js +19 -19
  27. package/dist/app/components/capabilities/session-github-card.js +22 -22
  28. package/dist/app/components/capabilities/session-machine-card.js +34 -32
  29. package/dist/app/components/capabilities/use-capabilities-catalog.js +3 -3
  30. package/dist/app/components/capabilities/use-connection-accounts.js +1 -1
  31. package/dist/app/components/command-menu/chat-status.js +15 -14
  32. package/dist/app/components/command-menu/chat-switcher.js +16 -15
  33. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  34. package/dist/app/components/command-menu/command-menu.js +32 -110
  35. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  36. package/dist/app/components/command-menu/shortcut-sheet.js +15 -15
  37. package/dist/app/components/composer-capabilities-menu-body.js +3 -3
  38. package/dist/app/components/composer-mobile-plus-panel.js +17 -17
  39. package/dist/app/components/composer-mobile-plus.js +1 -1
  40. package/dist/app/components/credit-required-gate.js +1 -1
  41. package/dist/app/components/credit-required-prompt.js +9 -9
  42. package/dist/app/components/credits/coupon-redeem.js +2 -2
  43. package/dist/app/components/credits/credit-refusal-notice.js +2 -2
  44. package/dist/app/components/desktop/app-shots.js +6 -6
  45. package/dist/app/components/desktop/this-computer.js +4 -4
  46. package/dist/app/components/feedback.js +4 -4
  47. package/dist/app/components/follow-up-repository-menu-body.js +4 -4
  48. package/dist/app/components/follow-up-repository-picker.js +1 -1
  49. package/dist/app/components/github-app-connect-launcher.js +2 -2
  50. package/dist/app/components/in-app-help-link.js +2 -2
  51. package/dist/app/components/knowledge/agent-learning-settings.js +3 -3
  52. package/dist/app/components/machines/connect-machine-dialog.js +18 -18
  53. package/dist/app/components/markdown.js +8 -8
  54. package/dist/app/components/message-context-pills.js +2 -2
  55. package/dist/app/components/models/models-ui.js +8 -8
  56. package/dist/app/components/new-session-starters.js +2 -2
  57. package/dist/app/components/pickers.js +8 -8
  58. package/dist/app/components/rail/rail-context.js +3 -3
  59. package/dist/app/components/rail/rail-sections.js +65 -62
  60. package/dist/app/components/rail/session-header.js +48 -47
  61. package/dist/app/components/rail/session-list.js +64 -61
  62. package/dist/app/components/rail/session-row-content.d.ts +6 -2
  63. package/dist/app/components/rail/session-row-content.js +1 -1
  64. package/dist/app/components/rail/session-row-hover-details.js +20 -19
  65. package/dist/app/components/rail/session-shell.js +104 -101
  66. package/dist/app/components/rail/site-session-group-heading.d.ts +7 -1
  67. package/dist/app/components/rail/site-session-group-heading.js +20 -3
  68. package/dist/app/components/repository-picker.js +4 -4
  69. package/dist/app/components/secrets/session-secrets-panel.js +3 -3
  70. package/dist/app/components/session/agent-configuration-panel.js +33 -33
  71. package/dist/app/components/session/artifact-link-boundary.js +2 -2
  72. package/dist/app/components/session/artifact-session-page.js +5 -5
  73. package/dist/app/components/session/banners.js +10 -10
  74. package/dist/app/components/session/codex-account-indicator.js +11 -11
  75. package/dist/app/components/session/editable-artifacts-workspace.js +44 -44
  76. package/dist/app/components/session/failed-session-banner.js +10 -10
  77. package/dist/app/components/session/human-input.js +57 -53
  78. package/dist/app/components/session/inspector.js +94 -90
  79. package/dist/app/components/session/inspector.js.map +1 -1
  80. package/dist/app/components/session/message-actions.js +4 -4
  81. package/dist/app/components/session/message-resource-attachments.js +20 -19
  82. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  83. package/dist/app/components/session/model-account-indicator.js +11 -11
  84. package/dist/app/components/session/model-context-inspector.js +2 -2
  85. package/dist/app/components/session/model-recovery-notice.js +3 -3
  86. package/dist/app/components/session/new-session-settings-menu.js +9 -9
  87. package/dist/app/components/session/sandbox-switcher.js +16 -16
  88. package/dist/app/components/session/sandbox-workspace.js +81 -77
  89. package/dist/app/components/session/search-markdown-highlight.js +9 -9
  90. package/dist/app/components/session/search-results-view.js +10 -10
  91. package/dist/app/components/session/session-admin-access.js +8 -8
  92. package/dist/app/components/session/session-admission-notice.js +6 -6
  93. package/dist/app/components/session/session-machine-access-notice.js +6 -6
  94. package/dist/app/components/session/session-retention.js +4 -4
  95. package/dist/app/components/session/session-search-dialog.js +11 -11
  96. package/dist/app/components/session/session-skill-reviews.js +1 -1
  97. package/dist/app/components/session/session-tenancy-control.d.ts +2 -0
  98. package/dist/app/components/session/session-tenancy-control.js +40 -25
  99. package/dist/app/components/session/session-tenancy-control.js.map +1 -1
  100. package/dist/app/components/session/session-usage-limit-section.js +11 -11
  101. package/dist/app/components/session/session-wait-status.js +9 -8
  102. package/dist/app/components/session/session-wait-status.js.map +1 -1
  103. package/dist/app/components/session/site-origin-link.d.ts +1 -0
  104. package/dist/app/components/session/site-origin-link.js +2 -2
  105. package/dist/app/components/session/subagents.js +16 -15
  106. package/dist/app/components/session-connectors-menu-body.js +5 -5
  107. package/dist/app/components/settings/row-select.js +3 -3
  108. package/dist/app/components/transcription-settings.js +4 -4
  109. package/dist/app/components/ui/destructive-confirm.js +6 -6
  110. package/dist/app/components/usage/usage-entry.js +8 -8
  111. package/dist/app/components/workspace-composer-plus.js +21 -21
  112. package/dist/app/embed/memory-navigation.js +2 -2
  113. package/dist/app/embed/session-app.js +256 -250
  114. package/dist/app/lib/actions/actions-provider.js +15 -15
  115. package/dist/app/lib/actions/held-modifier.d.ts +11 -0
  116. package/dist/app/lib/app-surfaces.js +2 -2
  117. package/dist/app/lib/codex-usage-query.js +6 -6
  118. package/dist/app/lib/composer-connectors.js +12 -12
  119. package/dist/app/lib/console-site.d.ts +6 -0
  120. package/dist/app/lib/console-site.js +14 -0
  121. package/dist/app/lib/console-text.js +2 -2
  122. package/dist/app/lib/events.js +17 -16
  123. package/dist/app/lib/failed-session-copy.js +3 -3
  124. package/dist/app/lib/model-access-onboarding.js +3 -3
  125. package/dist/app/lib/move-chat-to-machine.js +3 -3
  126. package/dist/app/lib/navigation.d.ts +5 -0
  127. package/dist/app/lib/navigation.js +1 -1
  128. package/dist/app/lib/routes.d.ts +17 -0
  129. package/dist/app/lib/routes.js +9 -3
  130. package/dist/app/lib/session-branch-cache.js +13 -12
  131. package/dist/app/lib/session-deep-link.js +2 -2
  132. package/dist/app/lib/session-failure-toasts.d.ts +8 -0
  133. package/dist/app/lib/session-group-pagination.js +13 -12
  134. package/dist/app/lib/session-hover-facts.js +14 -13
  135. package/dist/app/lib/session-model.js +3 -3
  136. package/dist/app/lib/session-rail.js +9 -8
  137. package/dist/app/lib/session-rename.js +3 -3
  138. package/dist/app/lib/session-ui-features.d.ts +6 -1
  139. package/dist/app/lib/session-ui-features.js +1 -1
  140. package/dist/app/lib/sessions-group.d.ts +43 -3
  141. package/dist/app/lib/sessions-group.js +21 -14
  142. package/dist/app/lib/shared-query.js +3 -3
  143. package/dist/app/lib/site-opened.d.ts +6 -0
  144. package/dist/app/lib/site-opened.js +10 -0
  145. package/dist/app/lib/turn-failure-analytics.js +4 -4
  146. package/dist/app/lib/use-duplicate-site.js +3 -3
  147. package/dist/app/lib/use-follow-up-repositories.js +4 -4
  148. package/dist/app/lib/use-session-list-hint-refresh.d.ts +20 -2
  149. package/dist/app/lib/use-session-list-hint-refresh.js +5 -1
  150. package/dist/app/lib/use-workspace-machines.js +6 -6
  151. package/dist/app/lib/use-workspace-model-catalog.js +7 -7
  152. package/dist/app/lib/use-workspace-rigs.js +8 -8
  153. package/dist/app/lib/workspace-navigation-preference.js +5 -5
  154. package/dist/app/lib/workspace-scope-context.js +4 -4
  155. package/dist/app/routes/artifacts.js +132 -149
  156. package/dist/app/routes/artifacts.js.map +1 -1
  157. package/dist/app/routes/retained-artifact.js +63 -62
  158. package/dist/app/routes/retained-artifact.js.map +1 -1
  159. package/dist/app/routes/session-unavailable.js +7 -5
  160. package/dist/app/routes/session.js +170 -166
  161. package/dist/app/routes/sessions-index.js +110 -108
  162. package/dist/app/routes/site-view.d.ts +11 -0
  163. package/dist/app/routes/site-view.js +597 -0
  164. package/dist/app/routes/site-view.js.map +1 -0
  165. package/dist/artifacts-document.js +4 -4
  166. package/dist/artifacts-presentation.js +4 -4
  167. package/dist/artifacts-spreadsheet.js +4 -4
  168. package/dist/artifacts.js +39 -39
  169. package/dist/{browser-viewer-RYYQSRTC.js → browser-viewer-QMCNV4RI.js} +9 -7
  170. package/dist/{chat-interactive-block-ABCRKXJ4.js → chat-interactive-block-PMIAUXSO.js} +6 -6
  171. package/dist/{chunk-TGVVEGZG.js → chunk-22FFOHPT.js} +9 -9
  172. package/dist/chunk-22GTC4MZ.js +15 -0
  173. package/dist/chunk-22GTC4MZ.js.map +1 -0
  174. package/dist/{chunk-Z5WMLJKI.js → chunk-22JFMNMF.js} +92 -4
  175. package/dist/chunk-22JFMNMF.js.map +1 -0
  176. package/dist/{chunk-UHFWF6ZU.js → chunk-2FPS5H2D.js} +2 -2
  177. package/dist/{chunk-NAWXARTY.js → chunk-2KO2G3RI.js} +72 -6
  178. package/dist/chunk-2KO2G3RI.js.map +1 -0
  179. package/dist/{chunk-5POTDNQT.js → chunk-2NC7NZCE.js} +6 -6
  180. package/dist/{chunk-ZKYYZH6L.js → chunk-2QBYDGWO.js} +9 -9
  181. package/dist/{chunk-TWXIFWBD.js → chunk-34EU25RL.js} +2 -2
  182. package/dist/{chunk-R63QEVPK.js → chunk-35BC2FU2.js} +16 -16
  183. package/dist/{chunk-PTGRFAMH.js → chunk-3ABPIUCK.js} +2 -2
  184. package/dist/{chunk-S4SC5SSV.js → chunk-3GU7AWG7.js} +18 -18
  185. package/dist/{chunk-722UO6YQ.js → chunk-3PEXVG4D.js} +2 -2
  186. package/dist/{chunk-63VGE4OH.js → chunk-3RMKPHBL.js} +3 -3
  187. package/dist/{chunk-6JKZILLF.js → chunk-3RQUWFZT.js} +67 -67
  188. package/dist/{chunk-6JKZILLF.js.map → chunk-3RQUWFZT.js.map} +1 -1
  189. package/dist/{chunk-RQDFYQHA.js → chunk-3STBLX4O.js} +9 -9
  190. package/dist/{chunk-S4EZ3JUB.js → chunk-3X5FKDYQ.js} +23 -23
  191. package/dist/{chunk-KTRKZRID.js → chunk-4GLLWX33.js} +11 -11
  192. package/dist/{chunk-ROQOVH4N.js → chunk-4HEXNAFI.js} +20 -20
  193. package/dist/chunk-4HEXNAFI.js.map +1 -0
  194. package/dist/{chunk-SD2K5ZN5.js → chunk-4LPA25NQ.js} +4 -4
  195. package/dist/{chunk-KWKGBGAF.js → chunk-4RMN4E2Y.js} +9 -9
  196. package/dist/{chunk-X7ASQHR6.js → chunk-4SAGYEVB.js} +2 -2
  197. package/dist/{chunk-HTT3FB7T.js → chunk-4VK2R5QC.js} +3 -3
  198. package/dist/{chunk-DDK4WFJ3.js → chunk-4XQC7VLT.js} +9 -9
  199. package/dist/{chunk-IVOA3DXA.js → chunk-4YXAQMTD.js} +12 -12
  200. package/dist/{chunk-HOJGAJAB.js → chunk-52WK2GGK.js} +8 -8
  201. package/dist/{chunk-NYZQ7LO7.js → chunk-552UYIQ7.js} +20 -20
  202. package/dist/{chunk-LEXPBQ56.js → chunk-5DSKMG2I.js} +4 -4
  203. package/dist/{chunk-WNG757ID.js → chunk-5FA455GR.js} +4 -4
  204. package/dist/{chunk-HWDGJFM4.js → chunk-5FEN3KYH.js} +11 -11
  205. package/dist/{chunk-OSVHU2WU.js → chunk-5JHRMUAZ.js} +12 -12
  206. package/dist/{chunk-PM3OSANE.js → chunk-5MJHH72T.js} +14 -3
  207. package/dist/chunk-5MJHH72T.js.map +1 -0
  208. package/dist/{chunk-RKB2Z457.js → chunk-5VGJXWQ2.js} +2 -2
  209. package/dist/{chunk-GFUUFM2O.js → chunk-5W6ZDKRR.js} +6 -6
  210. package/dist/{chunk-6PQNLL4E.js → chunk-5W7KJ5NQ.js} +37 -37
  211. package/dist/{chunk-Q35YZVDZ.js → chunk-5Y2FPLZE.js} +9 -9
  212. package/dist/{chunk-6W3LF3DB.js → chunk-5YFY4SFC.js} +2 -12
  213. package/dist/chunk-5YFY4SFC.js.map +1 -0
  214. package/dist/{chunk-F3NERYBQ.js → chunk-62VER7O4.js} +6 -6
  215. package/dist/{chunk-FBMU3VK5.js → chunk-6DCEDIF6.js} +2 -2
  216. package/dist/{chunk-LE2EDBXU.js → chunk-73WI7FL2.js} +18 -18
  217. package/dist/chunk-756MKA2J.js +45 -0
  218. package/dist/chunk-756MKA2J.js.map +1 -0
  219. package/dist/{chunk-ZRJCGBVV.js → chunk-7FJMRJDG.js} +2 -2
  220. package/dist/{chunk-7KGKDWWR.js → chunk-7HFLYNWN.js} +2 -2
  221. package/dist/{chunk-72J6C2AJ.js → chunk-7KIENXRE.js} +2 -2
  222. package/dist/{chunk-CBY5CXBD.js → chunk-7NPCEBZE.js} +5 -5
  223. package/dist/{chunk-46VBQG2D.js → chunk-7P4AQMGA.js} +13 -13
  224. package/dist/{chunk-X7L4H4VG.js → chunk-7TCT7KPQ.js} +742 -644
  225. package/dist/chunk-7TCT7KPQ.js.map +1 -0
  226. package/dist/{chunk-CVG4FILQ.js → chunk-7XO7YKPC.js} +280 -1035
  227. package/dist/chunk-7XO7YKPC.js.map +1 -0
  228. package/dist/{chunk-S7PVL7XH.js → chunk-A4BD4ZVB.js} +4 -4
  229. package/dist/{chunk-EF5SYXAY.js → chunk-ACL2V2KE.js} +30 -22
  230. package/dist/chunk-ACL2V2KE.js.map +1 -0
  231. package/dist/{chunk-73SOCVLS.js → chunk-AIEXYO2X.js} +3 -3
  232. package/dist/{chunk-U7TC2XJQ.js → chunk-AJPW3SV4.js} +3 -3
  233. package/dist/{chunk-HRJQAFKR.js → chunk-AX6YJA5U.js} +2 -2
  234. package/dist/{chunk-P5WABK2H.js → chunk-BCM7C3MJ.js} +9 -9
  235. package/dist/{chunk-DT7BORXG.js → chunk-BMJTNPWK.js} +2 -2
  236. package/dist/{chunk-HIHO2QE7.js → chunk-BT2MVGHT.js} +2 -2
  237. package/dist/{chunk-3XOISKZC.js → chunk-BXQYAAVE.js} +4 -4
  238. package/dist/{chunk-IBTXYLBW.js → chunk-CCFWY4GF.js} +2 -2
  239. package/dist/{chunk-ZOC3OP6F.js → chunk-CCR33J7L.js} +2 -2
  240. package/dist/{chunk-GTQ3SNEI.js → chunk-CD3MO3IC.js} +2 -2
  241. package/dist/{chunk-WSMYOLHG.js → chunk-CDEXRJB6.js} +5 -5
  242. package/dist/{chunk-3GLAPCVI.js → chunk-CFFNT2OY.js} +8 -8
  243. package/dist/{chunk-HO5Y2OOX.js → chunk-CMLJSF2F.js} +10 -10
  244. package/dist/{chunk-RA3FNMWF.js → chunk-CP7ZQHBW.js} +10 -10
  245. package/dist/{chunk-IOKSNX74.js → chunk-D5OWJZQR.js} +2 -2
  246. package/dist/{chunk-SQGXMHJO.js → chunk-DGLRZMXL.js} +3 -3
  247. package/dist/{chunk-GNEHAPKV.js → chunk-DJFTH2DI.js} +3 -3
  248. package/dist/{chunk-HQG4SLTE.js → chunk-DYJGYGPB.js} +2 -2
  249. package/dist/{chunk-4EAF3HSD.js → chunk-EJ7WARW7.js} +2 -2
  250. package/dist/{chunk-3AA6RNGE.js → chunk-ENS6E4RZ.js} +2 -2
  251. package/dist/{chunk-OOEO4MKY.js → chunk-EPWD4KRA.js} +2 -2
  252. package/dist/{chunk-PN66T6JA.js → chunk-EQE3MNQN.js} +5 -5
  253. package/dist/{chunk-TSBE4KOQ.js → chunk-EWL6NDOO.js} +3 -3
  254. package/dist/{chunk-OO2T63BY.js → chunk-EYS4ZOF5.js} +2 -2
  255. package/dist/{chunk-7CZTKBTI.js → chunk-FDAV72IX.js} +5 -5
  256. package/dist/{chunk-AG7VGUIW.js → chunk-FFNPUSVO.js} +7 -7
  257. package/dist/{chunk-P5T36BA3.js → chunk-FRP64DEK.js} +2 -2
  258. package/dist/{chunk-KBF3SE7G.js → chunk-FSP334UU.js} +2 -2
  259. package/dist/{chunk-BSX2R4CW.js → chunk-FTX5CNHA.js} +4 -4
  260. package/dist/{chunk-O756O2I7.js → chunk-FWOBNL2A.js} +1 -1
  261. package/dist/{chunk-6NIB2KGJ.js → chunk-FWYEZ3LE.js} +33 -33
  262. package/dist/{chunk-DLOYMWUQ.js → chunk-G4HQUBO4.js} +7 -7
  263. package/dist/{chunk-CSHBR2IZ.js → chunk-GDLDBR6B.js} +2 -2
  264. package/dist/chunk-GGV4NSG3.js +792 -0
  265. package/dist/chunk-GGV4NSG3.js.map +1 -0
  266. package/dist/{chunk-U36PO27Q.js → chunk-GHHM6WN4.js} +3 -3
  267. package/dist/{chunk-OANSIX34.js → chunk-GRSODLVO.js} +4 -4
  268. package/dist/{chunk-4R3JCVID.js → chunk-GT7JFQ4E.js} +410 -153
  269. package/dist/chunk-GT7JFQ4E.js.map +1 -0
  270. package/dist/{chunk-EU6XSQFM.js → chunk-GXW2I2M2.js} +2 -2
  271. package/dist/{chunk-5JEIDFPD.js → chunk-GZS37O3G.js} +1 -1
  272. package/dist/{chunk-XFNLU7EW.js → chunk-H5M33DAL.js} +15 -6
  273. package/dist/chunk-H5M33DAL.js.map +1 -0
  274. package/dist/{chunk-HNYJEAES.js → chunk-HQWVDQXW.js} +7 -7
  275. package/dist/{chunk-YXOKAG66.js → chunk-HU6JTNWF.js} +2 -2
  276. package/dist/{chunk-QRVNI5V6.js → chunk-I6KIQKU6.js} +3 -3
  277. package/dist/{chunk-APU42QDI.js → chunk-IBA5FMRE.js} +115 -111
  278. package/dist/chunk-IBA5FMRE.js.map +1 -0
  279. package/dist/{chunk-BNUPYHHZ.js → chunk-IDXTASGN.js} +4 -4
  280. package/dist/{chunk-KF3MF6FP.js → chunk-IECRGM6K.js} +3 -2
  281. package/dist/chunk-IECRGM6K.js.map +1 -0
  282. package/dist/chunk-IJYL5BZM.js +38 -0
  283. package/dist/chunk-IJYL5BZM.js.map +1 -0
  284. package/dist/{chunk-L6RXRRN3.js → chunk-ILDOW2IQ.js} +3 -3
  285. package/dist/{chunk-VUHPA3XQ.js → chunk-ITX2TB4K.js} +6 -6
  286. package/dist/{chunk-BXRIQZAH.js → chunk-J22HD2PB.js} +5 -5
  287. package/dist/{chunk-U47YDYLQ.js → chunk-J5MEDX7C.js} +8 -8
  288. package/dist/{chunk-F6LBGYS6.js → chunk-J7FBBLHF.js} +35 -35
  289. package/dist/{chunk-5JZYPZ72.js → chunk-JFK7NTEA.js} +4 -4
  290. package/dist/chunk-JFK7NTEA.js.map +1 -0
  291. package/dist/{chunk-QZRDCFHI.js → chunk-JM4HQPAI.js} +5 -5
  292. package/dist/{chunk-PIVGX42P.js → chunk-JNY5MT3I.js} +2 -2
  293. package/dist/{chunk-XWWXIZFP.js → chunk-JO6R5EXF.js} +7 -7
  294. package/dist/{chunk-NWZW2WHN.js → chunk-JQCGPTZ6.js} +9 -9
  295. package/dist/chunk-JRSNCSZN.js +37 -0
  296. package/dist/chunk-JRSNCSZN.js.map +1 -0
  297. package/dist/{chunk-OR37STQZ.js → chunk-KEXYBG7Q.js} +3 -3
  298. package/dist/{chunk-AZVANYMB.js → chunk-KUNFUSZ7.js} +2 -2
  299. package/dist/{chunk-DXZNDKQD.js → chunk-LEEJBZ5B.js} +2 -2
  300. package/dist/{chunk-STUCI6QA.js → chunk-LEKBNKLD.js} +1 -1
  301. package/dist/{chunk-STUCI6QA.js.map → chunk-LEKBNKLD.js.map} +1 -1
  302. package/dist/{chunk-AOLE4IRZ.js → chunk-LF5CBAOS.js} +5 -5
  303. package/dist/{chunk-BJIZ7PL7.js → chunk-LHLK7FUA.js} +145 -29
  304. package/dist/chunk-LHLK7FUA.js.map +1 -0
  305. package/dist/{chunk-RIMKJBCD.js → chunk-LMPTC4CX.js} +2 -2
  306. package/dist/{chunk-3KVWXKD6.js → chunk-LQ47YL6E.js} +2 -2
  307. package/dist/{chunk-RSNYGEVZ.js → chunk-LT4J7RHI.js} +13 -13
  308. package/dist/{chunk-U3HSFCON.js → chunk-MCTTONOW.js} +28 -28
  309. package/dist/{chunk-7DU35P5J.js → chunk-MIECLOQC.js} +9 -9
  310. package/dist/{chunk-FM4OUCC2.js → chunk-MOKYT3X3.js} +3 -3
  311. package/dist/{chunk-GZ64CASI.js → chunk-MVZYNZXE.js} +5 -4
  312. package/dist/chunk-MVZYNZXE.js.map +1 -0
  313. package/dist/{chunk-L7YURQI2.js → chunk-MXLKI7BI.js} +3 -3
  314. package/dist/{chunk-XRRSFQEV.js → chunk-NAZZLAWX.js} +2 -2
  315. package/dist/{chunk-UWJ5P5CU.js → chunk-NEK4WB5P.js} +3 -3
  316. package/dist/{chunk-6L7U46Y2.js → chunk-NKNVIO66.js} +2 -2
  317. package/dist/{chunk-JKUICTLM.js → chunk-NLAFNMPK.js} +2 -2
  318. package/dist/{chunk-4LKNIGHB.js → chunk-O2SBHS2N.js} +2 -2
  319. package/dist/{chunk-DWPOQ3S5.js → chunk-OTMWHZBY.js} +2 -2
  320. package/dist/{chunk-JTN3T4QN.js → chunk-PCFK7HKD.js} +14 -14
  321. package/dist/{chunk-VVCDB2T7.js → chunk-PCJLH45G.js} +3 -3
  322. package/dist/{chunk-PZ24CYDO.js → chunk-PFAUGEV5.js} +2 -2
  323. package/dist/{chunk-HGMWMK5K.js → chunk-PO3BH3KQ.js} +2 -2
  324. package/dist/{chunk-B74GSYR6.js → chunk-PUTS4DYW.js} +2 -2
  325. package/dist/{chunk-JSIDLTTG.js → chunk-PZ2V2XIK.js} +2 -2
  326. package/dist/{chunk-TMEQPODK.js → chunk-PZ37VDB5.js} +2 -2
  327. package/dist/{chunk-Q35DT6I6.js → chunk-QFMLAT7L.js} +234 -225
  328. package/dist/chunk-QFMLAT7L.js.map +1 -0
  329. package/dist/{chunk-LVONK3YQ.js → chunk-QRKTESVE.js} +2 -2
  330. package/dist/{chunk-HT5WSUC7.js → chunk-QXEDIDBZ.js} +3 -3
  331. package/dist/{chunk-WURSS6MP.js → chunk-R66YMYJU.js} +2 -2
  332. package/dist/{chunk-HDHK3SXK.js → chunk-RFLYID6H.js} +5 -5
  333. package/dist/{chunk-ADJJQSYC.js → chunk-RIYZFKIM.js} +39 -37
  334. package/dist/chunk-RIYZFKIM.js.map +1 -0
  335. package/dist/{chunk-JK7C5A4I.js → chunk-RQNZDTKT.js} +19 -19
  336. package/dist/{chunk-EHCUFCXM.js → chunk-RYSRFAHN.js} +32 -22
  337. package/dist/chunk-RYSRFAHN.js.map +1 -0
  338. package/dist/{chunk-I6VUUEXH.js → chunk-S2U4CDAC.js} +150 -150
  339. package/dist/chunk-S2U4CDAC.js.map +1 -0
  340. package/dist/{chunk-ST22GONV.js → chunk-S37GP7LX.js} +19 -19
  341. package/dist/{chunk-A2EWJQXX.js → chunk-SM5QX6UK.js} +4 -4
  342. package/dist/{chunk-FBE6AIIW.js → chunk-SOKNCW5U.js} +2 -2
  343. package/dist/{chunk-4W7VISE7.js → chunk-SSOO4GWN.js} +193 -194
  344. package/dist/chunk-SSOO4GWN.js.map +1 -0
  345. package/dist/{chunk-UP4BE32Y.js → chunk-SY2AAZNB.js} +5 -5
  346. package/dist/{chunk-33TPANCR.js → chunk-TFK4KFKA.js} +4 -4
  347. package/dist/{chunk-4432A3HQ.js → chunk-TIQPKOFW.js} +4 -4
  348. package/dist/{chunk-HPPKLBTJ.js → chunk-TJQDL3JH.js} +2 -2
  349. package/dist/chunk-TL7BOFFL.js +89 -0
  350. package/dist/chunk-TL7BOFFL.js.map +1 -0
  351. package/dist/{chunk-FD4Q5KFL.js → chunk-TLL22FFO.js} +2 -2
  352. package/dist/{chunk-QM5H4FPT.js → chunk-TV6BWONY.js} +3 -3
  353. package/dist/{chunk-4VKA5O7T.js → chunk-U6MPB3K6.js} +4 -4
  354. package/dist/{chunk-XOFUXMPP.js → chunk-ULJAOMJA.js} +2 -2
  355. package/dist/chunk-ULYQEFNH.js +529 -0
  356. package/dist/chunk-ULYQEFNH.js.map +1 -0
  357. package/dist/{chunk-H5EVWF6L.js → chunk-UNNJUJVD.js} +2 -2
  358. package/dist/{chunk-RGW24ZZM.js → chunk-UP7I3W6O.js} +51 -49
  359. package/dist/chunk-UP7I3W6O.js.map +1 -0
  360. package/dist/{chunk-5MZTJMZ3.js → chunk-UUGR3X5I.js} +17 -11
  361. package/dist/chunk-UUGR3X5I.js.map +1 -0
  362. package/dist/{chunk-Z6DKXQG7.js → chunk-UXXFMF4X.js} +2 -2
  363. package/dist/{chunk-OBQVTCTW.js → chunk-UYNCMZX5.js} +4 -4
  364. package/dist/{chunk-RGPYMHKI.js → chunk-V3K4RQO7.js} +9 -3
  365. package/dist/chunk-V3K4RQO7.js.map +1 -0
  366. package/dist/{chunk-KZHW27BV.js → chunk-V4QZ7UBK.js} +2 -2
  367. package/dist/{chunk-SUVEDKE2.js → chunk-VH5EGTH2.js} +3 -3
  368. package/dist/{chunk-MYNUBDU7.js → chunk-VYKW6TB2.js} +1 -1
  369. package/dist/chunk-VYKW6TB2.js.map +1 -0
  370. package/dist/{chunk-QEJTQTF5.js → chunk-W6T5HR3Z.js} +3 -3
  371. package/dist/{chunk-VP62LPLW.js → chunk-WCMG4HYI.js} +10 -10
  372. package/dist/{chunk-GZLLDA6P.js → chunk-WEFN327U.js} +2 -2
  373. package/dist/{chunk-7BST7BA6.js → chunk-WKHUZIOW.js} +1 -1
  374. package/dist/{chunk-ANHUMDJX.js → chunk-WNDTLK44.js} +2 -2
  375. package/dist/{chunk-2DS4UOYQ.js → chunk-WSZQNTVN.js} +2 -2
  376. package/dist/{chunk-GALB2G3W.js → chunk-X2AH4DRF.js} +2 -2
  377. package/dist/{chunk-Z2DAWUO3.js → chunk-XMNUZUUA.js} +6 -6
  378. package/dist/{chunk-GAIM5RNE.js → chunk-XN7NSPE6.js} +3 -3
  379. package/dist/chunk-XV6ZYRHK.js +59 -0
  380. package/dist/chunk-XV6ZYRHK.js.map +1 -0
  381. package/dist/{chunk-FLGUVRR7.js → chunk-Y5BSA3I7.js} +5 -5
  382. package/dist/{chunk-WRLWLGEF.js → chunk-Y5E3XQ2S.js} +25 -2
  383. package/dist/{chunk-WRLWLGEF.js.map → chunk-Y5E3XQ2S.js.map} +1 -1
  384. package/dist/{chunk-QCD5Y7K5.js → chunk-YEROLKOA.js} +16 -16
  385. package/dist/{chunk-NDF3SH3X.js → chunk-YJPKDRI2.js} +15 -15
  386. package/dist/{chunk-TQGJN5UZ.js → chunk-YV56F4UP.js} +318 -700
  387. package/dist/chunk-YV56F4UP.js.map +1 -0
  388. package/dist/{chunk-VAIESMPY.js → chunk-YVBHGMKC.js} +4 -4
  389. package/dist/{chunk-AD22P5X3.js → chunk-YXA2EKV3.js} +3 -3
  390. package/dist/{chunk-FDNJVZRE.js → chunk-YYCOSTUU.js} +17 -17
  391. package/dist/{chunk-NLMTNEWW.js → chunk-Z6E6TUAE.js} +2 -2
  392. package/dist/{chunk-BJW7G6EF.js → chunk-Z7IGO5EA.js} +3 -3
  393. package/dist/{chunk-NCX5SAQY.js → chunk-ZEIFJ6PX.js} +5 -5
  394. package/dist/{chunk-JRXHSVD5.js → chunk-ZS2UQ3DV.js} +65 -8
  395. package/dist/chunk-ZS2UQ3DV.js.map +1 -0
  396. package/dist/{chunk-4EONHNJU.js → chunk-ZVVT72MT.js} +2 -2
  397. package/dist/components/browser-viewer.d.ts +1 -1
  398. package/dist/composer.js +13 -13
  399. package/dist/{computer-viewer-KEDVLD42.js → computer-viewer-25AJIDYA.js} +9 -9
  400. package/dist/connect.js +10 -10
  401. package/dist/desktop.js +2 -2
  402. package/dist/editor.js +2 -2
  403. package/dist/{embedded-new-voice-LFHWWYD2.js → embedded-new-voice-RZZEJT6M.js} +7 -7
  404. package/dist/{embedded-voice-6QS4ANNX.js → embedded-voice-6OKSSPLW.js} +7 -7
  405. package/dist/{fleet-decision-row-QNSTP3VX.js → fleet-decision-row-NN2HXDX3.js} +2 -2
  406. package/dist/hooks/internal.d.ts +38 -0
  407. package/dist/hooks/use-client-config-flags.d.ts +12 -0
  408. package/dist/hooks/use-workspace-sessions.d.ts +10 -1
  409. package/dist/index.js +233 -227
  410. package/dist/interaction.js +11 -9
  411. package/dist/interaction.js.map +1 -1
  412. package/dist/{latest-question-AW3PPDUM.js → latest-question-2PFWQSSG.js} +4 -3
  413. package/dist/{latest-question-AW3PPDUM.js.map → latest-question-2PFWQSSG.js.map} +1 -1
  414. package/dist/machines.js +5 -5
  415. package/dist/messages/en.d.ts +3 -3
  416. package/dist/messages.js +1 -1
  417. package/dist/{model-policy-picker-menu-CURJ247L.js → model-policy-picker-menu-VVFGGAI6.js} +6 -6
  418. package/dist/native-previews.js +3 -3
  419. package/dist/{platform-activity-row-BMXXNZKX.js → platform-activity-row-ENQVIFTL.js} +2 -2
  420. package/dist/{queue-surface-implementation-2X5AXB6I.js → queue-surface-implementation-4SHOQPQQ.js} +10 -8
  421. package/dist/{queue-surface-implementation-2X5AXB6I.js.map → queue-surface-implementation-4SHOQPQQ.js.map} +1 -1
  422. package/dist/realtime.js +6 -6
  423. package/dist/{sandbox-files-4FBG3GS2.js → sandbox-files-CCOTGXXA.js} +11 -11
  424. package/dist/sandbox-files-CCOTGXXA.js.map +1 -0
  425. package/dist/session-app.js +258 -252
  426. package/dist/session-list-model.d.ts +1 -0
  427. package/dist/session-list-model.js +8 -2
  428. package/dist/{session-realtime-2XIB254N.js → session-realtime-JNKDSGH7.js} +3 -3
  429. package/dist/session-realtime-JNKDSGH7.js.map +1 -0
  430. package/dist/session-realtime.js +2 -2
  431. package/dist/session-ui.js +76 -71
  432. package/dist/session.js +24 -22
  433. package/dist/sites.js +2 -2
  434. package/dist/terminal.js +2 -2
  435. package/dist/this-computer.js +3 -3
  436. package/dist/timeline/invoked-tool.d.ts +5 -0
  437. package/dist/timeline/tool-display-name.d.ts +2 -2
  438. package/dist/timeline/tool-icon.d.ts +14 -0
  439. package/dist/timeline/tool-presentation.d.ts +8 -3
  440. package/dist/{timeline-annotation-markers-X4K2IEOO.js → timeline-annotation-markers-KHNYNY2J.js} +5 -5
  441. package/dist/{timeline-annotation-selection-MEHBW676.js → timeline-annotation-selection-AXEDJHBP.js} +7 -7
  442. package/dist/{timeline-annotations-dialog-U2FPQ3UY.js → timeline-annotations-dialog-AV4ZBXRC.js} +9 -9
  443. package/dist/timeline-model.js +25 -23
  444. package/dist/ui/access-list.js +18 -18
  445. package/dist/ui/cadence-picker.js +2 -2
  446. package/dist/ui/choice-cards.js +2 -2
  447. package/dist/ui/detail-page.js +2 -2
  448. package/dist/ui/detail-sheet.js +2 -2
  449. package/dist/ui/diff-view.js +2 -2
  450. package/dist/ui/disclosure.js +4 -4
  451. package/dist/ui/flush-form-page.js +3 -3
  452. package/dist/ui/form-dialog.js +2 -2
  453. package/dist/ui/list-row.js +4 -4
  454. package/dist/ui/revision-history.js +11 -11
  455. package/dist/ui/role-select.js +7 -7
  456. package/dist/ui/select-menu.js +2 -2
  457. package/dist/ui/settings-nav.js +3 -3
  458. package/dist/usage.js +3 -3
  459. package/dist/workbench.js +11 -11
  460. package/package.json +4 -4
  461. package/src/app/app-state.tsx +3 -1
  462. package/src/app/components/capabilities/session-machine-card.tsx +9 -2
  463. package/src/app/components/rail/session-list.tsx +254 -44
  464. package/src/app/components/rail/session-row-content.tsx +24 -2
  465. package/src/app/components/rail/session-shell.tsx +14 -9
  466. package/src/app/components/rail/site-session-group-heading.tsx +59 -20
  467. package/src/app/components/session/session-tenancy-control.tsx +18 -0
  468. package/src/app/components/session/site-origin-link.test.tsx +73 -0
  469. package/src/app/components/session/site-origin-link.tsx +4 -2
  470. package/src/app/embed/memory-navigation.tsx +1 -0
  471. package/src/app/lib/actions/held-modifier.test.ts +101 -0
  472. package/src/app/lib/actions/held-modifier.ts +108 -0
  473. package/src/app/lib/console-site.tsx +38 -0
  474. package/src/app/lib/navigation.tsx +4 -0
  475. package/src/app/lib/routes.tsx +42 -0
  476. package/src/app/lib/session-failure-toasts.ts +26 -0
  477. package/src/app/lib/session-ui-features.tsx +18 -4
  478. package/src/app/lib/sessions-group.tsx +219 -30
  479. package/src/app/lib/site-opened.tsx +48 -0
  480. package/src/app/lib/site-session-groups.test.ts +173 -6
  481. package/src/app/lib/site-view-routes.test.ts +55 -0
  482. package/src/app/lib/use-session-list-hint-refresh.tsx +44 -4
  483. package/src/app/routes/artifacts.tsx +2 -29
  484. package/src/app/routes/session-transient-failures.test.tsx +343 -0
  485. package/src/app/routes/session-unavailable.tsx +74 -3
  486. package/src/app/routes/session.tsx +4 -13
  487. package/src/app/routes/sessions-index.tsx +13 -9
  488. package/src/app/routes/site-view.test.tsx +476 -0
  489. package/src/app/routes/site-view.tsx +583 -0
  490. package/src/components/browser-viewer.tsx +16 -2
  491. package/src/hooks/internal.ts +129 -6
  492. package/src/hooks/use-client-config-flags.ts +8 -0
  493. package/src/hooks/use-session-events.ts +83 -9
  494. package/src/hooks/use-workspace-sessions.ts +21 -1
  495. package/src/messages/en.ts +3 -3
  496. package/src/session-list-model.ts +4 -0
  497. package/src/timeline/activity-rail.tsx +3 -2
  498. package/src/timeline/invoked-tool.ts +14 -4
  499. package/src/timeline/projection.ts +11 -6
  500. package/src/timeline/rolling-activity.tsx +6 -2
  501. package/src/timeline/tool-display-name.ts +2 -2
  502. package/src/timeline/tool-icon.tsx +165 -0
  503. package/src/timeline/tool-presentation.ts +207 -48
  504. package/src/timeline/tool-renderers.tsx +1 -70
  505. package/styles/compiled.css +38 -0
  506. package/dist/chunk-22ZBT6CN.js +0 -50
  507. package/dist/chunk-22ZBT6CN.js.map +0 -1
  508. package/dist/chunk-4R3JCVID.js.map +0 -1
  509. package/dist/chunk-4W7VISE7.js.map +0 -1
  510. package/dist/chunk-5JZYPZ72.js.map +0 -1
  511. package/dist/chunk-5MZTJMZ3.js.map +0 -1
  512. package/dist/chunk-6W3LF3DB.js.map +0 -1
  513. package/dist/chunk-ADJJQSYC.js.map +0 -1
  514. package/dist/chunk-APU42QDI.js.map +0 -1
  515. package/dist/chunk-BJIZ7PL7.js.map +0 -1
  516. package/dist/chunk-CVG4FILQ.js.map +0 -1
  517. package/dist/chunk-EF5SYXAY.js.map +0 -1
  518. package/dist/chunk-EHCUFCXM.js.map +0 -1
  519. package/dist/chunk-GZ64CASI.js.map +0 -1
  520. package/dist/chunk-I6VUUEXH.js.map +0 -1
  521. package/dist/chunk-JRXHSVD5.js.map +0 -1
  522. package/dist/chunk-KF3MF6FP.js.map +0 -1
  523. package/dist/chunk-MYNUBDU7.js.map +0 -1
  524. package/dist/chunk-NAWXARTY.js.map +0 -1
  525. package/dist/chunk-PM3OSANE.js.map +0 -1
  526. package/dist/chunk-Q35DT6I6.js.map +0 -1
  527. package/dist/chunk-R25ZKOZR.js +0 -24
  528. package/dist/chunk-R25ZKOZR.js.map +0 -1
  529. package/dist/chunk-RGPYMHKI.js.map +0 -1
  530. package/dist/chunk-RGW24ZZM.js.map +0 -1
  531. package/dist/chunk-ROQOVH4N.js.map +0 -1
  532. package/dist/chunk-TQGJN5UZ.js.map +0 -1
  533. package/dist/chunk-X7L4H4VG.js.map +0 -1
  534. package/dist/chunk-XFNLU7EW.js.map +0 -1
  535. package/dist/chunk-Z5WMLJKI.js.map +0 -1
  536. /package/dist/{browser-viewer-RYYQSRTC.js.map → app/lib/console-site.js.map} +0 -0
  537. /package/dist/{chat-interactive-block-ABCRKXJ4.js.map → app/lib/site-opened.js.map} +0 -0
  538. /package/dist/{computer-viewer-KEDVLD42.js.map → browser-viewer-QMCNV4RI.js.map} +0 -0
  539. /package/dist/{embedded-new-voice-LFHWWYD2.js.map → chat-interactive-block-PMIAUXSO.js.map} +0 -0
  540. /package/dist/{chunk-TGVVEGZG.js.map → chunk-22FFOHPT.js.map} +0 -0
  541. /package/dist/{chunk-UHFWF6ZU.js.map → chunk-2FPS5H2D.js.map} +0 -0
  542. /package/dist/{chunk-5POTDNQT.js.map → chunk-2NC7NZCE.js.map} +0 -0
  543. /package/dist/{chunk-ZKYYZH6L.js.map → chunk-2QBYDGWO.js.map} +0 -0
  544. /package/dist/{chunk-TWXIFWBD.js.map → chunk-34EU25RL.js.map} +0 -0
  545. /package/dist/{chunk-R63QEVPK.js.map → chunk-35BC2FU2.js.map} +0 -0
  546. /package/dist/{chunk-PTGRFAMH.js.map → chunk-3ABPIUCK.js.map} +0 -0
  547. /package/dist/{chunk-S4SC5SSV.js.map → chunk-3GU7AWG7.js.map} +0 -0
  548. /package/dist/{chunk-722UO6YQ.js.map → chunk-3PEXVG4D.js.map} +0 -0
  549. /package/dist/{chunk-63VGE4OH.js.map → chunk-3RMKPHBL.js.map} +0 -0
  550. /package/dist/{chunk-RQDFYQHA.js.map → chunk-3STBLX4O.js.map} +0 -0
  551. /package/dist/{chunk-S4EZ3JUB.js.map → chunk-3X5FKDYQ.js.map} +0 -0
  552. /package/dist/{chunk-KTRKZRID.js.map → chunk-4GLLWX33.js.map} +0 -0
  553. /package/dist/{chunk-SD2K5ZN5.js.map → chunk-4LPA25NQ.js.map} +0 -0
  554. /package/dist/{chunk-KWKGBGAF.js.map → chunk-4RMN4E2Y.js.map} +0 -0
  555. /package/dist/{chunk-X7ASQHR6.js.map → chunk-4SAGYEVB.js.map} +0 -0
  556. /package/dist/{chunk-HTT3FB7T.js.map → chunk-4VK2R5QC.js.map} +0 -0
  557. /package/dist/{chunk-DDK4WFJ3.js.map → chunk-4XQC7VLT.js.map} +0 -0
  558. /package/dist/{chunk-IVOA3DXA.js.map → chunk-4YXAQMTD.js.map} +0 -0
  559. /package/dist/{chunk-HOJGAJAB.js.map → chunk-52WK2GGK.js.map} +0 -0
  560. /package/dist/{chunk-NYZQ7LO7.js.map → chunk-552UYIQ7.js.map} +0 -0
  561. /package/dist/{chunk-LEXPBQ56.js.map → chunk-5DSKMG2I.js.map} +0 -0
  562. /package/dist/{chunk-WNG757ID.js.map → chunk-5FA455GR.js.map} +0 -0
  563. /package/dist/{chunk-HWDGJFM4.js.map → chunk-5FEN3KYH.js.map} +0 -0
  564. /package/dist/{chunk-OSVHU2WU.js.map → chunk-5JHRMUAZ.js.map} +0 -0
  565. /package/dist/{chunk-RKB2Z457.js.map → chunk-5VGJXWQ2.js.map} +0 -0
  566. /package/dist/{chunk-GFUUFM2O.js.map → chunk-5W6ZDKRR.js.map} +0 -0
  567. /package/dist/{chunk-6PQNLL4E.js.map → chunk-5W7KJ5NQ.js.map} +0 -0
  568. /package/dist/{chunk-Q35YZVDZ.js.map → chunk-5Y2FPLZE.js.map} +0 -0
  569. /package/dist/{chunk-F3NERYBQ.js.map → chunk-62VER7O4.js.map} +0 -0
  570. /package/dist/{chunk-FBMU3VK5.js.map → chunk-6DCEDIF6.js.map} +0 -0
  571. /package/dist/{chunk-LE2EDBXU.js.map → chunk-73WI7FL2.js.map} +0 -0
  572. /package/dist/{chunk-ZRJCGBVV.js.map → chunk-7FJMRJDG.js.map} +0 -0
  573. /package/dist/{chunk-7KGKDWWR.js.map → chunk-7HFLYNWN.js.map} +0 -0
  574. /package/dist/{chunk-72J6C2AJ.js.map → chunk-7KIENXRE.js.map} +0 -0
  575. /package/dist/{chunk-CBY5CXBD.js.map → chunk-7NPCEBZE.js.map} +0 -0
  576. /package/dist/{chunk-46VBQG2D.js.map → chunk-7P4AQMGA.js.map} +0 -0
  577. /package/dist/{chunk-S7PVL7XH.js.map → chunk-A4BD4ZVB.js.map} +0 -0
  578. /package/dist/{chunk-73SOCVLS.js.map → chunk-AIEXYO2X.js.map} +0 -0
  579. /package/dist/{chunk-U7TC2XJQ.js.map → chunk-AJPW3SV4.js.map} +0 -0
  580. /package/dist/{chunk-HRJQAFKR.js.map → chunk-AX6YJA5U.js.map} +0 -0
  581. /package/dist/{chunk-P5WABK2H.js.map → chunk-BCM7C3MJ.js.map} +0 -0
  582. /package/dist/{chunk-DT7BORXG.js.map → chunk-BMJTNPWK.js.map} +0 -0
  583. /package/dist/{chunk-HIHO2QE7.js.map → chunk-BT2MVGHT.js.map} +0 -0
  584. /package/dist/{chunk-3XOISKZC.js.map → chunk-BXQYAAVE.js.map} +0 -0
  585. /package/dist/{chunk-IBTXYLBW.js.map → chunk-CCFWY4GF.js.map} +0 -0
  586. /package/dist/{chunk-ZOC3OP6F.js.map → chunk-CCR33J7L.js.map} +0 -0
  587. /package/dist/{chunk-GTQ3SNEI.js.map → chunk-CD3MO3IC.js.map} +0 -0
  588. /package/dist/{chunk-WSMYOLHG.js.map → chunk-CDEXRJB6.js.map} +0 -0
  589. /package/dist/{chunk-3GLAPCVI.js.map → chunk-CFFNT2OY.js.map} +0 -0
  590. /package/dist/{chunk-HO5Y2OOX.js.map → chunk-CMLJSF2F.js.map} +0 -0
  591. /package/dist/{chunk-RA3FNMWF.js.map → chunk-CP7ZQHBW.js.map} +0 -0
  592. /package/dist/{chunk-IOKSNX74.js.map → chunk-D5OWJZQR.js.map} +0 -0
  593. /package/dist/{chunk-SQGXMHJO.js.map → chunk-DGLRZMXL.js.map} +0 -0
  594. /package/dist/{chunk-GNEHAPKV.js.map → chunk-DJFTH2DI.js.map} +0 -0
  595. /package/dist/{chunk-HQG4SLTE.js.map → chunk-DYJGYGPB.js.map} +0 -0
  596. /package/dist/{chunk-4EAF3HSD.js.map → chunk-EJ7WARW7.js.map} +0 -0
  597. /package/dist/{chunk-3AA6RNGE.js.map → chunk-ENS6E4RZ.js.map} +0 -0
  598. /package/dist/{chunk-OOEO4MKY.js.map → chunk-EPWD4KRA.js.map} +0 -0
  599. /package/dist/{chunk-PN66T6JA.js.map → chunk-EQE3MNQN.js.map} +0 -0
  600. /package/dist/{chunk-TSBE4KOQ.js.map → chunk-EWL6NDOO.js.map} +0 -0
  601. /package/dist/{chunk-OO2T63BY.js.map → chunk-EYS4ZOF5.js.map} +0 -0
  602. /package/dist/{chunk-7CZTKBTI.js.map → chunk-FDAV72IX.js.map} +0 -0
  603. /package/dist/{chunk-AG7VGUIW.js.map → chunk-FFNPUSVO.js.map} +0 -0
  604. /package/dist/{chunk-P5T36BA3.js.map → chunk-FRP64DEK.js.map} +0 -0
  605. /package/dist/{chunk-KBF3SE7G.js.map → chunk-FSP334UU.js.map} +0 -0
  606. /package/dist/{chunk-BSX2R4CW.js.map → chunk-FTX5CNHA.js.map} +0 -0
  607. /package/dist/{chunk-O756O2I7.js.map → chunk-FWOBNL2A.js.map} +0 -0
  608. /package/dist/{chunk-6NIB2KGJ.js.map → chunk-FWYEZ3LE.js.map} +0 -0
  609. /package/dist/{chunk-DLOYMWUQ.js.map → chunk-G4HQUBO4.js.map} +0 -0
  610. /package/dist/{chunk-CSHBR2IZ.js.map → chunk-GDLDBR6B.js.map} +0 -0
  611. /package/dist/{chunk-U36PO27Q.js.map → chunk-GHHM6WN4.js.map} +0 -0
  612. /package/dist/{chunk-OANSIX34.js.map → chunk-GRSODLVO.js.map} +0 -0
  613. /package/dist/{chunk-EU6XSQFM.js.map → chunk-GXW2I2M2.js.map} +0 -0
  614. /package/dist/{chunk-5JEIDFPD.js.map → chunk-GZS37O3G.js.map} +0 -0
  615. /package/dist/{chunk-HNYJEAES.js.map → chunk-HQWVDQXW.js.map} +0 -0
  616. /package/dist/{chunk-YXOKAG66.js.map → chunk-HU6JTNWF.js.map} +0 -0
  617. /package/dist/{chunk-QRVNI5V6.js.map → chunk-I6KIQKU6.js.map} +0 -0
  618. /package/dist/{chunk-BNUPYHHZ.js.map → chunk-IDXTASGN.js.map} +0 -0
  619. /package/dist/{chunk-L6RXRRN3.js.map → chunk-ILDOW2IQ.js.map} +0 -0
  620. /package/dist/{chunk-VUHPA3XQ.js.map → chunk-ITX2TB4K.js.map} +0 -0
  621. /package/dist/{chunk-BXRIQZAH.js.map → chunk-J22HD2PB.js.map} +0 -0
  622. /package/dist/{chunk-U47YDYLQ.js.map → chunk-J5MEDX7C.js.map} +0 -0
  623. /package/dist/{chunk-F6LBGYS6.js.map → chunk-J7FBBLHF.js.map} +0 -0
  624. /package/dist/{chunk-QZRDCFHI.js.map → chunk-JM4HQPAI.js.map} +0 -0
  625. /package/dist/{chunk-PIVGX42P.js.map → chunk-JNY5MT3I.js.map} +0 -0
  626. /package/dist/{chunk-XWWXIZFP.js.map → chunk-JO6R5EXF.js.map} +0 -0
  627. /package/dist/{chunk-NWZW2WHN.js.map → chunk-JQCGPTZ6.js.map} +0 -0
  628. /package/dist/{chunk-OR37STQZ.js.map → chunk-KEXYBG7Q.js.map} +0 -0
  629. /package/dist/{chunk-AZVANYMB.js.map → chunk-KUNFUSZ7.js.map} +0 -0
  630. /package/dist/{chunk-DXZNDKQD.js.map → chunk-LEEJBZ5B.js.map} +0 -0
  631. /package/dist/{chunk-AOLE4IRZ.js.map → chunk-LF5CBAOS.js.map} +0 -0
  632. /package/dist/{chunk-RIMKJBCD.js.map → chunk-LMPTC4CX.js.map} +0 -0
  633. /package/dist/{chunk-3KVWXKD6.js.map → chunk-LQ47YL6E.js.map} +0 -0
  634. /package/dist/{chunk-RSNYGEVZ.js.map → chunk-LT4J7RHI.js.map} +0 -0
  635. /package/dist/{chunk-U3HSFCON.js.map → chunk-MCTTONOW.js.map} +0 -0
  636. /package/dist/{chunk-7DU35P5J.js.map → chunk-MIECLOQC.js.map} +0 -0
  637. /package/dist/{chunk-FM4OUCC2.js.map → chunk-MOKYT3X3.js.map} +0 -0
  638. /package/dist/{chunk-L7YURQI2.js.map → chunk-MXLKI7BI.js.map} +0 -0
  639. /package/dist/{chunk-XRRSFQEV.js.map → chunk-NAZZLAWX.js.map} +0 -0
  640. /package/dist/{chunk-UWJ5P5CU.js.map → chunk-NEK4WB5P.js.map} +0 -0
  641. /package/dist/{chunk-6L7U46Y2.js.map → chunk-NKNVIO66.js.map} +0 -0
  642. /package/dist/{chunk-JKUICTLM.js.map → chunk-NLAFNMPK.js.map} +0 -0
  643. /package/dist/{chunk-4LKNIGHB.js.map → chunk-O2SBHS2N.js.map} +0 -0
  644. /package/dist/{chunk-DWPOQ3S5.js.map → chunk-OTMWHZBY.js.map} +0 -0
  645. /package/dist/{chunk-JTN3T4QN.js.map → chunk-PCFK7HKD.js.map} +0 -0
  646. /package/dist/{chunk-VVCDB2T7.js.map → chunk-PCJLH45G.js.map} +0 -0
  647. /package/dist/{chunk-PZ24CYDO.js.map → chunk-PFAUGEV5.js.map} +0 -0
  648. /package/dist/{chunk-HGMWMK5K.js.map → chunk-PO3BH3KQ.js.map} +0 -0
  649. /package/dist/{chunk-B74GSYR6.js.map → chunk-PUTS4DYW.js.map} +0 -0
  650. /package/dist/{chunk-JSIDLTTG.js.map → chunk-PZ2V2XIK.js.map} +0 -0
  651. /package/dist/{chunk-TMEQPODK.js.map → chunk-PZ37VDB5.js.map} +0 -0
  652. /package/dist/{chunk-LVONK3YQ.js.map → chunk-QRKTESVE.js.map} +0 -0
  653. /package/dist/{chunk-HT5WSUC7.js.map → chunk-QXEDIDBZ.js.map} +0 -0
  654. /package/dist/{chunk-WURSS6MP.js.map → chunk-R66YMYJU.js.map} +0 -0
  655. /package/dist/{chunk-HDHK3SXK.js.map → chunk-RFLYID6H.js.map} +0 -0
  656. /package/dist/{chunk-JK7C5A4I.js.map → chunk-RQNZDTKT.js.map} +0 -0
  657. /package/dist/{chunk-ST22GONV.js.map → chunk-S37GP7LX.js.map} +0 -0
  658. /package/dist/{chunk-A2EWJQXX.js.map → chunk-SM5QX6UK.js.map} +0 -0
  659. /package/dist/{chunk-FBE6AIIW.js.map → chunk-SOKNCW5U.js.map} +0 -0
  660. /package/dist/{chunk-UP4BE32Y.js.map → chunk-SY2AAZNB.js.map} +0 -0
  661. /package/dist/{chunk-33TPANCR.js.map → chunk-TFK4KFKA.js.map} +0 -0
  662. /package/dist/{chunk-4432A3HQ.js.map → chunk-TIQPKOFW.js.map} +0 -0
  663. /package/dist/{chunk-HPPKLBTJ.js.map → chunk-TJQDL3JH.js.map} +0 -0
  664. /package/dist/{chunk-FD4Q5KFL.js.map → chunk-TLL22FFO.js.map} +0 -0
  665. /package/dist/{chunk-QM5H4FPT.js.map → chunk-TV6BWONY.js.map} +0 -0
  666. /package/dist/{chunk-4VKA5O7T.js.map → chunk-U6MPB3K6.js.map} +0 -0
  667. /package/dist/{chunk-XOFUXMPP.js.map → chunk-ULJAOMJA.js.map} +0 -0
  668. /package/dist/{chunk-H5EVWF6L.js.map → chunk-UNNJUJVD.js.map} +0 -0
  669. /package/dist/{chunk-Z6DKXQG7.js.map → chunk-UXXFMF4X.js.map} +0 -0
  670. /package/dist/{chunk-OBQVTCTW.js.map → chunk-UYNCMZX5.js.map} +0 -0
  671. /package/dist/{chunk-KZHW27BV.js.map → chunk-V4QZ7UBK.js.map} +0 -0
  672. /package/dist/{chunk-SUVEDKE2.js.map → chunk-VH5EGTH2.js.map} +0 -0
  673. /package/dist/{chunk-QEJTQTF5.js.map → chunk-W6T5HR3Z.js.map} +0 -0
  674. /package/dist/{chunk-VP62LPLW.js.map → chunk-WCMG4HYI.js.map} +0 -0
  675. /package/dist/{chunk-GZLLDA6P.js.map → chunk-WEFN327U.js.map} +0 -0
  676. /package/dist/{chunk-7BST7BA6.js.map → chunk-WKHUZIOW.js.map} +0 -0
  677. /package/dist/{chunk-ANHUMDJX.js.map → chunk-WNDTLK44.js.map} +0 -0
  678. /package/dist/{chunk-2DS4UOYQ.js.map → chunk-WSZQNTVN.js.map} +0 -0
  679. /package/dist/{chunk-GALB2G3W.js.map → chunk-X2AH4DRF.js.map} +0 -0
  680. /package/dist/{chunk-Z2DAWUO3.js.map → chunk-XMNUZUUA.js.map} +0 -0
  681. /package/dist/{chunk-GAIM5RNE.js.map → chunk-XN7NSPE6.js.map} +0 -0
  682. /package/dist/{chunk-FLGUVRR7.js.map → chunk-Y5BSA3I7.js.map} +0 -0
  683. /package/dist/{chunk-QCD5Y7K5.js.map → chunk-YEROLKOA.js.map} +0 -0
  684. /package/dist/{chunk-NDF3SH3X.js.map → chunk-YJPKDRI2.js.map} +0 -0
  685. /package/dist/{chunk-VAIESMPY.js.map → chunk-YVBHGMKC.js.map} +0 -0
  686. /package/dist/{chunk-AD22P5X3.js.map → chunk-YXA2EKV3.js.map} +0 -0
  687. /package/dist/{chunk-FDNJVZRE.js.map → chunk-YYCOSTUU.js.map} +0 -0
  688. /package/dist/{chunk-NLMTNEWW.js.map → chunk-Z6E6TUAE.js.map} +0 -0
  689. /package/dist/{chunk-BJW7G6EF.js.map → chunk-Z7IGO5EA.js.map} +0 -0
  690. /package/dist/{chunk-NCX5SAQY.js.map → chunk-ZEIFJ6PX.js.map} +0 -0
  691. /package/dist/{chunk-4EONHNJU.js.map → chunk-ZVVT72MT.js.map} +0 -0
  692. /package/dist/{embedded-voice-6QS4ANNX.js.map → computer-viewer-25AJIDYA.js.map} +0 -0
  693. /package/dist/{model-policy-picker-menu-CURJ247L.js.map → embedded-new-voice-RZZEJT6M.js.map} +0 -0
  694. /package/dist/{sandbox-files-4FBG3GS2.js.map → embedded-voice-6OKSSPLW.js.map} +0 -0
  695. /package/dist/{fleet-decision-row-QNSTP3VX.js.map → fleet-decision-row-NN2HXDX3.js.map} +0 -0
  696. /package/dist/{session-realtime-2XIB254N.js.map → model-policy-picker-menu-VVFGGAI6.js.map} +0 -0
  697. /package/dist/{platform-activity-row-BMXXNZKX.js.map → platform-activity-row-ENQVIFTL.js.map} +0 -0
  698. /package/dist/{timeline-annotation-markers-X4K2IEOO.js.map → timeline-annotation-markers-KHNYNY2J.js.map} +0 -0
  699. /package/dist/{timeline-annotation-selection-MEHBW676.js.map → timeline-annotation-selection-AXEDJHBP.js.map} +0 -0
  700. /package/dist/{timeline-annotations-dialog-U2FPQ3UY.js.map → timeline-annotations-dialog-AV4ZBXRC.js.map} +0 -0
@@ -1,15 +1,12 @@
1
1
  "use client";
2
2
  import {
3
3
  ModelContextInspectorPane
4
- } from "../../../chunk-SD2K5ZN5.js";
4
+ } from "../../../chunk-4LPA25NQ.js";
5
5
  import "../../../chunk-7OQZ2F3U.js";
6
6
  import {
7
7
  PreferenceToggleRow
8
- } from "../../../chunk-DWPOQ3S5.js";
9
- import "../../../chunk-GALB2G3W.js";
10
- import {
11
- withOccurrenceKeys
12
- } from "../../../chunk-ZYPF22ZI.js";
8
+ } from "../../../chunk-OTMWHZBY.js";
9
+ import "../../../chunk-X2AH4DRF.js";
13
10
  import {
14
11
  retainSessionRestartAttemptAfterFailure,
15
12
  sessionRestartOperationController
@@ -17,175 +14,182 @@ import {
17
14
  import {
18
15
  classifySessionTenancyFailure
19
16
  } from "../../../chunk-ENGJ3OT6.js";
17
+ import {
18
+ withOccurrenceKeys
19
+ } from "../../../chunk-ZYPF22ZI.js";
20
+ import {
21
+ ScrollArea
22
+ } from "../../../chunk-YIMK2UZR.js";
20
23
  import {
21
24
  Tabs,
22
25
  TabsContent,
23
26
  TabsList,
24
27
  TabsTrigger
25
28
  } from "../../../chunk-A4SQGGM5.js";
26
- import {
27
- ScrollArea
28
- } from "../../../chunk-YIMK2UZR.js";
29
29
  import {
30
30
  Select
31
31
  } from "../../../chunk-IANYC4M4.js";
32
- import "../../../chunk-33TPANCR.js";
33
- import "../../../chunk-46VBQG2D.js";
32
+ import "../../../chunk-TFK4KFKA.js";
33
+ import "../../../chunk-7P4AQMGA.js";
34
34
  import {
35
35
  eventDisplayLabel,
36
36
  isTerminalSessionStatus
37
- } from "../../../chunk-63VGE4OH.js";
37
+ } from "../../../chunk-3RMKPHBL.js";
38
38
  import "../../../chunk-IIFO2H3P.js";
39
39
  import "../../../chunk-Z2S5VQG7.js";
40
+ import "../../../chunk-J4OPEWC3.js";
40
41
  import {
41
42
  useWorkspaceRigs
42
- } from "../../../chunk-PIVGX42P.js";
43
- import "../../../chunk-J4OPEWC3.js";
43
+ } from "../../../chunk-JNY5MT3I.js";
44
44
  import {
45
45
  useWorkspaceMachines
46
- } from "../../../chunk-722UO6YQ.js";
47
- import {
48
- formatTimestamp
49
- } from "../../../chunk-5TLEWXAB.js";
46
+ } from "../../../chunk-3PEXVG4D.js";
50
47
  import {
51
48
  ConnectionPill,
52
49
  CopyableMono,
53
50
  InfoRow,
54
51
  InspectorSection
55
52
  } from "../../../chunk-G46333YC.js";
53
+ import {
54
+ formatTimestamp
55
+ } from "../../../chunk-5TLEWXAB.js";
56
56
  import "../../../chunk-A3MTTRCX.js";
57
57
  import "../../../chunk-ECNX3UOI.js";
58
58
  import "../../../chunk-IZMUUUYD.js";
59
+ import "../../../chunk-XSOPQZGH.js";
60
+ import "../../../chunk-O2LGEYG4.js";
59
61
  import {
60
62
  Collapsible,
61
63
  CollapsibleContent,
62
64
  CollapsibleTrigger
63
65
  } from "../../../chunk-T6KM63FZ.js";
64
- import "../../../chunk-O2LGEYG4.js";
65
- import "../../../chunk-XSOPQZGH.js";
66
- import {
67
- t
68
- } from "../../../chunk-HPPKLBTJ.js";
66
+ import "../../../chunk-TREHTIBD.js";
67
+ import "../../../chunk-XNTW77T6.js";
69
68
  import {
70
69
  repositoryDisplayName
71
70
  } from "../../../chunk-L6Y4ALSM.js";
72
- import "../../../chunk-FIDD34ZF.js";
73
- import "../../../chunk-74JEZLLQ.js";
71
+ import {
72
+ t
73
+ } from "../../../chunk-TJQDL3JH.js";
74
74
  import {
75
75
  toast
76
76
  } from "../../../chunk-YG6NARQY.js";
77
77
  import {
78
78
  useNavigate
79
- } from "../../../chunk-MYNUBDU7.js";
79
+ } from "../../../chunk-VYKW6TB2.js";
80
80
  import "../../../chunk-IZUAIHR4.js";
81
- import "../../../chunk-L4OF77LE.js";
81
+ import "../../../chunk-FIDD34ZF.js";
82
+ import "../../../chunk-74JEZLLQ.js";
82
83
  import {
83
84
  useAppContext
84
85
  } from "../../../chunk-W6KAUGXO.js";
85
- import "../../../chunk-TREHTIBD.js";
86
86
  import "../../../chunk-5OTQA7CM.js";
87
- import "../../../chunk-XNTW77T6.js";
88
87
  import "../../../chunk-KS57MLGE.js";
88
+ import "../../../chunk-L4OF77LE.js";
89
+ import "../../../chunk-NRP4REXE.js";
89
90
  import "../../../chunk-A3KMTJZS.js";
90
- import "../../../chunk-LVONK3YQ.js";
91
- import "../../../chunk-2DS4UOYQ.js";
91
+ import "../../../chunk-QRKTESVE.js";
92
+ import "../../../chunk-WSZQNTVN.js";
92
93
  import "../../../chunk-UBK725RK.js";
93
- import "../../../chunk-VUHPA3XQ.js";
94
+ import "../../../chunk-ITX2TB4K.js";
94
95
  import "../../../chunk-WLEDGIVS.js";
95
96
  import {
96
97
  Button
97
98
  } from "../../../chunk-HMU5IELG.js";
98
- import "../../../chunk-FM4OUCC2.js";
99
99
  import {
100
100
  StartupTimings
101
- } from "../../../chunk-CVG4FILQ.js";
102
- import "../../../chunk-6W3LF3DB.js";
103
- import "../../../chunk-P5T36BA3.js";
104
- import "../../../chunk-L7YURQI2.js";
101
+ } from "../../../chunk-GGV4NSG3.js";
102
+ import "../../../chunk-5YFY4SFC.js";
103
+ import "../../../chunk-V3K4RQO7.js";
104
+ import "../../../chunk-7XO7YKPC.js";
105
+ import "../../../chunk-22GTC4MZ.js";
106
+ import "../../../chunk-FRP64DEK.js";
105
107
  import "../../../chunk-KDQAWRYZ.js";
108
+ import "../../../chunk-MXLKI7BI.js";
106
109
  import {
107
110
  SessionStatus
108
- } from "../../../chunk-3AA6RNGE.js";
109
- import "../../../chunk-RGPYMHKI.js";
110
- import "../../../chunk-AD22P5X3.js";
111
- import "../../../chunk-BNUPYHHZ.js";
112
- import "../../../chunk-RIMKJBCD.js";
113
- import "../../../chunk-XWWXIZFP.js";
111
+ } from "../../../chunk-ENS6E4RZ.js";
112
+ import "../../../chunk-YXA2EKV3.js";
113
+ import "../../../chunk-IDXTASGN.js";
114
+ import "../../../chunk-LMPTC4CX.js";
115
+ import "../../../chunk-JO6R5EXF.js";
114
116
  import {
115
117
  setStartupDetails,
116
118
  useStartupDetails
117
- } from "../../../chunk-X7L4H4VG.js";
119
+ } from "../../../chunk-7TCT7KPQ.js";
118
120
  import "../../../chunk-B27E3V37.js";
119
- import "../../../chunk-3KVWXKD6.js";
120
- import "../../../chunk-4W7VISE7.js";
121
- import "../../../chunk-TWXIFWBD.js";
122
- import "../../../chunk-EMIVOS73.js";
123
- import "../../../chunk-I6FIXEL4.js";
124
- import "../../../chunk-CPLCSM6K.js";
125
- import "../../../chunk-UD2PSIIX.js";
126
- import {
127
- buildTimeline
128
- } from "../../../chunk-5MZTJMZ3.js";
129
- import "../../../chunk-ZOARMQY2.js";
130
- import "../../../chunk-JKUICTLM.js";
131
- import "../../../chunk-IGVL3ELX.js";
132
- import {
133
- MACHINES_SESSION_POLL_MS
134
- } from "../../../chunk-HT5WSUC7.js";
135
- import "../../../chunk-MK2TQO4Y.js";
136
- import "../../../chunk-R63QEVPK.js";
121
+ import "../../../chunk-LQ47YL6E.js";
122
+ import "../../../chunk-35BC2FU2.js";
137
123
  import "../../../chunk-OYQQJL3J.js";
138
124
  import "../../../chunk-H3LIIAGE.js";
139
125
  import "../../../chunk-RZLBICR5.js";
140
126
  import "../../../chunk-VHB3E6PT.js";
141
127
  import "../../../chunk-7N5AD2TC.js";
142
- import "../../../chunk-4U7SHFQ2.js";
143
- import "../../../chunk-ZOC3OP6F.js";
144
- import "../../../chunk-4LKNIGHB.js";
145
- import "../../../chunk-C5ZCSVZ7.js";
128
+ import "../../../chunk-YSRBFJMQ.js";
129
+ import "../../../chunk-O2SBHS2N.js";
146
130
  import {
147
131
  sessionSandboxLabel
148
132
  } from "../../../chunk-BOG2FED3.js";
149
- import "../../../chunk-YSRBFJMQ.js";
150
- import "../../../chunk-I6VUUEXH.js";
151
- import "../../../chunk-LJUMYUBO.js";
152
- import "../../../chunk-TQGJN5UZ.js";
153
- import "../../../chunk-HEVQKE27.js";
154
- import "../../../chunk-ANHUMDJX.js";
155
- import "../../../chunk-IZV5FTJC.js";
156
- import "../../../chunk-STUCI6QA.js";
157
- import "../../../chunk-DNJ23AWQ.js";
158
- import "../../../chunk-OB3YGXHQ.js";
159
- import "../../../chunk-DHXKEJBH.js";
160
- import "../../../chunk-UNJPZGNK.js";
161
- import "../../../chunk-PEHTX3V7.js";
162
- import "../../../chunk-NRP4REXE.js";
163
- import "../../../chunk-FDNJVZRE.js";
133
+ import "../../../chunk-YYCOSTUU.js";
164
134
  import "../../../chunk-3IWPC6O3.js";
165
- import "../../../chunk-GNEHAPKV.js";
166
- import "../../../chunk-7RRMTSCI.js";
135
+ import "../../../chunk-UYNCMZX5.js";
167
136
  import "../../../chunk-6F34IWSA.js";
168
- import "../../../chunk-AG7VGUIW.js";
137
+ import "../../../chunk-FFNPUSVO.js";
169
138
  import "../../../chunk-PNNTR6KP.js";
170
139
  import {
171
140
  ModelName
172
141
  } from "../../../chunk-WJPMYXKZ.js";
173
142
  import "../../../chunk-VYT4POBH.js";
174
- import "../../../chunk-IQ64BNAG.js";
175
- import "../../../chunk-OBQVTCTW.js";
176
143
  import "../../../chunk-J3BHDXQQ.js";
144
+ import "../../../chunk-N7S72EXK.js";
145
+ import "../../../chunk-IQ64BNAG.js";
146
+ import "../../../chunk-XEA5BCMA.js";
147
+ import "../../../chunk-MOKYT3X3.js";
148
+ import "../../../chunk-SSOO4GWN.js";
149
+ import "../../../chunk-EMIVOS73.js";
150
+ import "../../../chunk-34EU25RL.js";
151
+ import "../../../chunk-I6FIXEL4.js";
152
+ import "../../../chunk-CPLCSM6K.js";
153
+ import "../../../chunk-UD2PSIIX.js";
154
+ import {
155
+ buildTimeline
156
+ } from "../../../chunk-UUGR3X5I.js";
157
+ import "../../../chunk-ZOARMQY2.js";
158
+ import "../../../chunk-NLAFNMPK.js";
159
+ import {
160
+ MACHINES_SESSION_POLL_MS
161
+ } from "../../../chunk-QXEDIDBZ.js";
162
+ import "../../../chunk-DJFTH2DI.js";
177
163
  import {
178
164
  labelReasoningEffort
179
165
  } from "../../../chunk-CFEFYPNR.js";
180
- import "../../../chunk-N7S72EXK.js";
181
- import "../../../chunk-XEA5BCMA.js";
182
- import "../../../chunk-NAWXARTY.js";
166
+ import "../../../chunk-7RRMTSCI.js";
167
+ import "../../../chunk-4U7SHFQ2.js";
168
+ import "../../../chunk-C5ZCSVZ7.js";
169
+ import "../../../chunk-PEHTX3V7.js";
170
+ import "../../../chunk-XV6ZYRHK.js";
171
+ import "../../../chunk-IGVL3ELX.js";
172
+ import "../../../chunk-2KO2G3RI.js";
183
173
  import "../../../chunk-CM7LVUKC.js";
184
174
  import "../../../chunk-TVQCDDSZ.js";
175
+ import "../../../chunk-UNJPZGNK.js";
176
+ import "../../../chunk-MK2TQO4Y.js";
177
+ import "../../../chunk-S2U4CDAC.js";
178
+ import "../../../chunk-LJUMYUBO.js";
179
+ import "../../../chunk-YV56F4UP.js";
180
+ import "../../../chunk-HEVQKE27.js";
181
+ import "../../../chunk-WNDTLK44.js";
182
+ import "../../../chunk-DNJ23AWQ.js";
183
+ import "../../../chunk-OB3YGXHQ.js";
184
+ import "../../../chunk-DHXKEJBH.js";
185
+ import "../../../chunk-IZV5FTJC.js";
186
+ import "../../../chunk-ULYQEFNH.js";
187
+ import "../../../chunk-LEKBNKLD.js";
185
188
  import "../../../chunk-SJGAHTY5.js";
186
189
  import "../../../chunk-4NHJ6EXL.js";
190
+ import "../../../chunk-CCR33J7L.js";
187
191
  import "../../../chunk-TXS65BB2.js";
188
- import "../../../chunk-5JZYPZ72.js";
192
+ import "../../../chunk-JFK7NTEA.js";
189
193
 
190
194
  // src/app/components/session/inspector.tsx
191
195
  import { CopyIcon, FileJsonIcon, Loader2Icon, RotateCcwIcon } from "lucide-react";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/components/session/inspector.tsx"],"sourcesContent":["import { t } from \"../../lib/console-text\";\nimport { useWorkspaceRigs } from \"../../lib/use-workspace-rigs\";\nimport { useWorkspaceMachines } from \"../../lib/use-workspace-machines\";\nimport { StartupTimings, useStartupDetails, setStartupDetails } from \"../../../session-ui\";\nimport { buildTimeline } from \"../../../timeline\";\nimport { labelReasoningEffort } from \"../../../model-policy\";\nimport { ModelName } from \"../../../components/model-mark\";\nimport { PreferenceToggleRow } from \"../transcription-settings\";\nimport { SessionStatus as SessionStatusBadge } from \"../../../components/session-status\";\nimport type { SessionEventsConnectionState } from \"../../../hooks/use-session-events\";\nimport { MACHINES_SESSION_POLL_MS } from \"../../../machines\";\nimport { useNavigate } from \"../../lib/navigation\";\nimport { CopyIcon, FileJsonIcon, Loader2Icon, RotateCcwIcon } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { toast } from \"../../lib/toast\";\n\nimport { ConnectionPill, CopyableMono, InfoRow, InspectorSection } from \"../common\";\nimport { ModelContextInspectorPane } from \"./model-context-inspector\";\nimport { sessionSandboxLabel } from \"./sandbox-switcher\";\nimport { Button } from \"../../../ui/button\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../../../ui/collapsible\";\nimport { ScrollArea } from \"../../../ui/scroll-area\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../../ui/tabs\";\nimport { Select } from \"../../../ui/select\";\nimport { useAppContext } from \"../../app-context\";\nimport { eventDisplayLabel, isTerminalSessionStatus } from \"../../lib/events\";\nimport { formatTimestamp } from \"../../lib/format\";\nimport { withOccurrenceKeys } from \"../../lib/react-key\";\nimport {\n retainSessionRestartAttemptAfterFailure,\n sessionRestartOperationController,\n} from \"../../lib/session-restart-operation-controller\";\nimport { classifySessionTenancyFailure } from \"../../lib/session-tenancy\";\nimport { repositoryDisplayName } from \"../../lib/session-tools\";\nimport type { Session, SessionEvent } from \"../../types\";\n\nexport function SessionInspector(props: {\n session: Session;\n events: SessionEvent[];\n connectionState: SessionEventsConnectionState;\n onReloadSession: () => Promise<void>;\n}) {\n const startupDetails = useStartupDetails();\n const startupPhases = useMemo(\n () => buildTimeline(t, props.events).filter((item) => item.kind === \"startup-phase\"),\n [props.events],\n );\n const context = useAppContext();\n const navigate = useNavigate();\n const rigs = useWorkspaceRigs({ workspaceId: props.session.workspaceId });\n const [selectedRigId, setSelectedRigId] = useState(props.session.rigId ?? \"\");\n const [restarting, setRestarting] = useState(false);\n const [runtimeFailure, setRuntimeFailure] = useState<string | null>(null);\n const restartScope = useMemo(\n () => ({\n principalId: `${context.accessContext.subjectId}:${context.accessKeyVersion}`,\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n }),\n [\n context.accessContext.subjectId,\n context.accessKeyVersion,\n props.session.id,\n props.session.workspaceId,\n ],\n );\n const pendingRestartAttempt = sessionRestartOperationController.snapshot(restartScope);\n useEffect(() => {\n setSelectedRigId(props.session.rigId ?? \"\");\n }, [props.session.id, props.session.rigId]);\n const restartWithSetup = async () => {\n if (!props.session.tenancy) return;\n const attempt = sessionRestartOperationController.prepare(\n restartScope,\n {\n visibility: props.session.tenancy.visibility,\n rigId: selectedRigId || null,\n },\n () => crypto.randomUUID(),\n );\n setRestarting(true);\n setRuntimeFailure(null);\n let receiptConfirmed = false;\n try {\n const result = await context.client.forkSession(props.session.workspaceId, props.session.id, {\n idempotencyKey: attempt.idempotencyKey,\n visibility: attempt.visibility,\n workspaceSharedAcknowledged: false,\n rigId: attempt.rigId,\n });\n receiptConfirmed = true;\n const destination = await context.client.getSession(result.workspaceId, result.sessionId, {\n fresh: true,\n });\n if (destination.workspaceId !== result.workspaceId || destination.id !== result.sessionId) {\n throw new Error(\"The restart receipt did not resolve to the expected session.\");\n }\n sessionRestartOperationController.settle(restartScope, attempt);\n toast.success(\"Restarted with new setup\", {\n description: \"The original session and sandbox were left unchanged.\",\n });\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId: result.workspaceId, sessionId: result.sessionId },\n });\n } catch (error) {\n const classified = classifySessionTenancyFailure(error);\n if (!retainSessionRestartAttemptAfterFailure(error, receiptConfirmed)) {\n sessionRestartOperationController.settle(restartScope, attempt);\n }\n const message = classified.message;\n setRuntimeFailure(message);\n toast.error(\"Session could not be restarted\", { description: message });\n } finally {\n setRestarting(false);\n }\n };\n const terminalSession = isTerminalSessionStatus(props.session.status);\n // The session's ACTIVE compute, not its home backend: when a connected machine\n // is active (live-swapped or targeted at create) show the machine name, so the\n // inspector agrees with the \"Run on\" header instead of reading \"modal\" while a\n // selfhosted box runs the turn. Degrades to the home backend when no machine is\n // active (or selfhosted is disabled → the fleet 404s to empty).\n const fleet = useWorkspaceMachines({\n sessionId: props.session.id,\n pollIntervalMs: MACHINES_SESSION_POLL_MS,\n });\n const activeMachine =\n fleet.machines.find((machine) => machine.active && machine.kind === \"selfhosted\") ?? null;\n // Compute context, honestly: don't fall back to the home backend while the\n // fleet is still resolving - that reads \"Cloud sandbox\" even when a machine\n // runs the turn. Show a loading/unavailable note until we actually know. The\n // home box uses the neutral label, never its hosting vendor.\n const computeUnknown = fleet.machines.length === 0 && (fleet.loading || Boolean(fleet.error));\n const computeLabel = activeMachine ? \"Machine\" : \"Sandbox\";\n const computeValue = activeMachine\n ? activeMachine.name\n : computeUnknown\n ? fleet.loading\n ? \"Checking…\"\n : \"Unavailable\"\n : sessionSandboxLabel(t, props.session.sandboxBackend);\n const displayEvents = props.events;\n const sortedEvents = [...displayEvents].sort((a, b) => b.sequence - a.sequence);\n const lifecycleEvents = [...displayEvents]\n .filter((event) => !event.type.endsWith(\".delta\"))\n .sort((a, b) => b.sequence - a.sequence);\n const repositories = props.session.resources.filter((resource) => resource.kind === \"repository\");\n\n return (\n <div className=\"flex h-full min-h-[28rem] w-full min-w-0 flex-col overflow-hidden\">\n <div className=\"flex min-w-0 items-center justify-between gap-3 border-b border-border px-3 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <FileJsonIcon className=\"size-4 shrink-0 text-brand\" />\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium\">\n {terminalSession ? \"Archived debug\" : \"Debug\"}\n </div>\n <div className=\"truncate text-xs text-fg-subtle\">{props.events.length} events</div>\n </div>\n </div>\n <ConnectionPill state={props.connectionState} />\n </div>\n\n <Tabs defaultValue=\"overview\" className=\"min-h-0 min-w-0 flex-1 gap-0 overflow-hidden\">\n <div className=\"min-w-0 border-b border-border px-2 py-2\">\n <TabsList className=\"flex !h-auto w-full min-w-0 flex-wrap justify-start gap-1 rounded-md bg-bg p-1\">\n <TabsTrigger value=\"overview\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Overview\n </TabsTrigger>\n <TabsTrigger value=\"context\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Context\n </TabsTrigger>\n <TabsTrigger value=\"events\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Events\n </TabsTrigger>\n <TabsTrigger value=\"timeline\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Timeline\n </TabsTrigger>\n <TabsTrigger value=\"startup\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Startup\n </TabsTrigger>\n <TabsTrigger value=\"raw\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Raw\n </TabsTrigger>\n </TabsList>\n </div>\n\n <TabsContent value=\"startup\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <ScrollArea className=\"h-full min-w-0\">\n <div className=\"space-y-5 p-3\">\n <PreferenceToggleRow\n label=\"Show startup details in chat\"\n description=\"Remembered in this browser. Timings are always recorded.\"\n checked={startupDetails}\n onToggle={() => setStartupDetails(!startupDetails)}\n wrapDescription\n />\n <StartupTimings phases={startupPhases} />\n </div>\n </ScrollArea>\n </TabsContent>\n <TabsContent value=\"overview\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <ScrollArea className=\"h-full min-w-0\">\n <div className=\"min-w-0 space-y-4 p-3\">\n <InspectorSection title=\"Session\">\n <InfoRow label=\"ID\" value={<CopyableMono value={props.session.id} />} />\n <InfoRow\n label=\"Status\"\n value={<SessionStatusBadge status={props.session.status} />}\n />\n <InfoRow\n label=\"Workflow\"\n value={\n props.session.temporalWorkflowId ? (\n <CopyableMono value={props.session.temporalWorkflowId} />\n ) : (\n \"none\"\n )\n }\n />\n <InfoRow\n label=\"Active turn\"\n value={\n props.session.activeTurnId ? (\n <CopyableMono value={props.session.activeTurnId} />\n ) : (\n \"none\"\n )\n }\n />\n <InfoRow label=\"Last seq\" value={String(props.session.lastSequence)} />\n <InfoRow label=\"Created\" value={formatTimestamp(props.session.createdAt)} />\n <InfoRow label=\"Updated\" value={formatTimestamp(props.session.updatedAt)} />\n </InspectorSection>\n\n <InspectorSection title=\"Runtime\">\n <InfoRow\n label=\"Model\"\n value={<ModelName model={props.session.model} markClassName=\"text-fg-muted\" />}\n />\n <InfoRow\n label=\"Effort\"\n value={labelReasoningEffort(t, props.session.reasoningEffort)}\n />\n <InfoRow label={computeLabel} value={computeValue} />\n <InfoRow label=\"Sandbox Environment\" value={props.session.rigId ?? \"none\"} />\n {props.session.tenancy ? (\n <div className=\"space-y-2 rounded-md border border-border bg-bg/35 p-2\">\n <div className=\"text-xs font-medium\">Restart with sandbox environment</div>\n <Select\n value={selectedRigId}\n disabled={restarting || Boolean(pendingRestartAttempt)}\n onChange={(event) => setSelectedRigId(event.target.value)}\n className=\"h-8 w-full text-xs\"\n >\n <option value=\"\">No sandbox environment</option>\n {rigs.rigs.map((rig) => (\n <option key={rig.id} value={rig.id}>\n {rig.name}\n {rig.activeVersion ? ` (v${rig.activeVersion.version})` : \"\"}\n </option>\n ))}\n </Select>\n <p className=\"text-2xs text-fg-subtle\">\n Sandbox Environment setup is immutable for a live sandbox. Restart creates an\n independent history fork with a fresh sandbox and leaves this session\n unchanged.\n </p>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={restarting}\n onClick={() => void restartWithSetup()}\n >\n {restarting ? <Loader2Icon className=\"animate-spin\" /> : <RotateCcwIcon />}\n {pendingRestartAttempt ? \"Retry restart\" : \"Restart with setup\"}\n </Button>\n </div>\n ) : null}\n {runtimeFailure ? (\n <p className=\"text-2xs text-status-waiting\">{runtimeFailure}</p>\n ) : null}\n <InfoRow label=\"Stream\" value={props.connectionState} />\n </InspectorSection>\n\n <InspectorSection title=\"Repositories\">\n {repositories.length === 0 ? (\n <p className=\"text-xs text-fg-subtle\">\n No repositories selected for this session.\n </p>\n ) : (\n <div className=\"min-w-0 space-y-2\">\n {withOccurrenceKeys(repositories, (resource) => JSON.stringify(resource)).map(\n ({ key, item: resource }) => (\n <div\n key={key}\n className=\"min-w-0 rounded-md border border-border bg-bg/35 p-2\"\n >\n <div className=\"min-w-0 truncate text-xs font-medium\">\n {repositoryDisplayName(resource)}\n </div>\n <div className=\"mt-1 min-w-0 truncate font-mono text-2xs text-fg-subtle\">\n {resource.uri}\n </div>\n <div className=\"mt-2 flex min-w-0 flex-wrap gap-1.5 text-2xs text-fg-subtle\">\n <span className=\"max-w-full truncate rounded border border-border px-1.5 py-0.5\">\n ref {resource.ref}\n </span>\n {resource.mountPath ? (\n <span className=\"max-w-full truncate rounded border border-border px-1.5 py-0.5\">\n {resource.mountPath}\n </span>\n ) : null}\n </div>\n </div>\n ),\n )}\n </div>\n )}\n </InspectorSection>\n </div>\n </ScrollArea>\n </TabsContent>\n\n <TabsContent value=\"context\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <ModelContextInspectorPane\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n events={displayEvents}\n isRunning={props.session.status === \"running\"}\n />\n </TabsContent>\n\n <TabsContent value=\"events\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <ScrollArea className=\"h-full min-w-0\">\n <div className=\"min-w-0 space-y-2 p-3\">\n {sortedEvents.map((event) => (\n <EventDebugRow key={event.id} event={event} />\n ))}\n </div>\n </ScrollArea>\n </TabsContent>\n\n <TabsContent value=\"timeline\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <ScrollArea className=\"h-full min-w-0\">\n <div className=\"min-w-0 space-y-2 p-3\">\n {lifecycleEvents.map((event) => (\n <div key={event.id} className=\"rounded-md border border-border bg-bg/35 p-2\">\n <div className=\"flex items-center justify-between gap-2 text-xs\">\n <span className=\"truncate font-medium\">{eventDisplayLabel(event)}</span>\n <span className=\"shrink-0 font-mono text-2xs text-fg-subtle\">\n #{event.sequence}\n </span>\n </div>\n <div className=\"mt-1 text-2xs text-fg-subtle\">\n {formatTimestamp(event.occurredAt)}\n </div>\n </div>\n ))}\n </div>\n </ScrollArea>\n </TabsContent>\n\n <TabsContent value=\"raw\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <RawJsonPane value={{ session: props.session, events: displayEvents }} />\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n\nfunction EventDebugRow({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n return (\n <Collapsible\n open={open}\n onOpenChange={setOpen}\n className=\"min-w-0 overflow-hidden rounded-md border border-border bg-bg/35\"\n >\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n className=\"flex w-full min-w-0 items-center justify-between gap-2 p-2 text-left\"\n >\n <div className=\"min-w-0\">\n <div className=\"truncate text-xs font-medium\">{eventDisplayLabel(event)}</div>\n <div className=\"mt-1 truncate font-mono text-2xs text-fg-subtle\">\n {event.turnId ?? event.id}\n </div>\n </div>\n <div className=\"shrink-0 text-right\">\n <div className=\"font-mono text-2xs text-fg-muted\">#{event.sequence}</div>\n <div className=\"mt-1 text-2xs text-fg-subtle\">{formatTimestamp(event.occurredAt)}</div>\n </div>\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <pre className=\"max-h-72 max-w-full overflow-auto border-t border-border p-2 text-2xs leading-5 text-fg-muted\">\n {JSON.stringify(event.payload, null, 2)}\n </pre>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nfunction RawJsonPane({ value }: { value: unknown }) {\n const json = JSON.stringify(value, null, 2);\n return (\n <div className=\"flex h-full min-h-0 min-w-0 flex-col overflow-hidden\">\n <div className=\"flex items-center justify-end border-b border-border p-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n onClick={() => {\n void navigator.clipboard.writeText(json);\n toast.success(\"Copied raw JSON\");\n }}\n >\n <CopyIcon className=\"size-3\" />\n Copy\n </Button>\n </div>\n <ScrollArea className=\"min-h-0 min-w-0 flex-1\">\n <pre className=\"max-w-full overflow-auto p-3 text-2xs leading-5 text-fg-muted\">{json}</pre>\n </ScrollArea>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/app/components/session/inspector.tsx"],"sourcesContent":["import { t } from \"../../lib/console-text\";\nimport { useWorkspaceRigs } from \"../../lib/use-workspace-rigs\";\nimport { useWorkspaceMachines } from \"../../lib/use-workspace-machines\";\nimport { StartupTimings, useStartupDetails, setStartupDetails } from \"../../../session-ui\";\nimport { buildTimeline } from \"../../../timeline\";\nimport { labelReasoningEffort } from \"../../../model-policy\";\nimport { ModelName } from \"../../../components/model-mark\";\nimport { PreferenceToggleRow } from \"../transcription-settings\";\nimport { SessionStatus as SessionStatusBadge } from \"../../../components/session-status\";\nimport type { SessionEventsConnectionState } from \"../../../hooks/use-session-events\";\nimport { MACHINES_SESSION_POLL_MS } from \"../../../machines\";\nimport { useNavigate } from \"../../lib/navigation\";\nimport { CopyIcon, FileJsonIcon, Loader2Icon, RotateCcwIcon } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { toast } from \"../../lib/toast\";\n\nimport { ConnectionPill, CopyableMono, InfoRow, InspectorSection } from \"../common\";\nimport { ModelContextInspectorPane } from \"./model-context-inspector\";\nimport { sessionSandboxLabel } from \"./sandbox-switcher\";\nimport { Button } from \"../../../ui/button\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../../../ui/collapsible\";\nimport { ScrollArea } from \"../../../ui/scroll-area\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../../ui/tabs\";\nimport { Select } from \"../../../ui/select\";\nimport { useAppContext } from \"../../app-context\";\nimport { eventDisplayLabel, isTerminalSessionStatus } from \"../../lib/events\";\nimport { formatTimestamp } from \"../../lib/format\";\nimport { withOccurrenceKeys } from \"../../lib/react-key\";\nimport {\n retainSessionRestartAttemptAfterFailure,\n sessionRestartOperationController,\n} from \"../../lib/session-restart-operation-controller\";\nimport { classifySessionTenancyFailure } from \"../../lib/session-tenancy\";\nimport { repositoryDisplayName } from \"../../lib/session-tools\";\nimport type { Session, SessionEvent } from \"../../types\";\n\nexport function SessionInspector(props: {\n session: Session;\n events: SessionEvent[];\n connectionState: SessionEventsConnectionState;\n onReloadSession: () => Promise<void>;\n}) {\n const startupDetails = useStartupDetails();\n const startupPhases = useMemo(\n () => buildTimeline(t, props.events).filter((item) => item.kind === \"startup-phase\"),\n [props.events],\n );\n const context = useAppContext();\n const navigate = useNavigate();\n const rigs = useWorkspaceRigs({ workspaceId: props.session.workspaceId });\n const [selectedRigId, setSelectedRigId] = useState(props.session.rigId ?? \"\");\n const [restarting, setRestarting] = useState(false);\n const [runtimeFailure, setRuntimeFailure] = useState<string | null>(null);\n const restartScope = useMemo(\n () => ({\n principalId: `${context.accessContext.subjectId}:${context.accessKeyVersion}`,\n workspaceId: props.session.workspaceId,\n sessionId: props.session.id,\n }),\n [\n context.accessContext.subjectId,\n context.accessKeyVersion,\n props.session.id,\n props.session.workspaceId,\n ],\n );\n const pendingRestartAttempt = sessionRestartOperationController.snapshot(restartScope);\n useEffect(() => {\n setSelectedRigId(props.session.rigId ?? \"\");\n }, [props.session.id, props.session.rigId]);\n const restartWithSetup = async () => {\n if (!props.session.tenancy) return;\n const attempt = sessionRestartOperationController.prepare(\n restartScope,\n {\n visibility: props.session.tenancy.visibility,\n rigId: selectedRigId || null,\n },\n () => crypto.randomUUID(),\n );\n setRestarting(true);\n setRuntimeFailure(null);\n let receiptConfirmed = false;\n try {\n const result = await context.client.forkSession(props.session.workspaceId, props.session.id, {\n idempotencyKey: attempt.idempotencyKey,\n visibility: attempt.visibility,\n workspaceSharedAcknowledged: false,\n rigId: attempt.rigId,\n });\n receiptConfirmed = true;\n const destination = await context.client.getSession(result.workspaceId, result.sessionId, {\n fresh: true,\n });\n if (destination.workspaceId !== result.workspaceId || destination.id !== result.sessionId) {\n throw new Error(\"The restart receipt did not resolve to the expected session.\");\n }\n sessionRestartOperationController.settle(restartScope, attempt);\n toast.success(\"Restarted with new setup\", {\n description: \"The original session and sandbox were left unchanged.\",\n });\n void navigate({\n to: \"/workspaces/$workspaceId/sessions/$sessionId\",\n params: { workspaceId: result.workspaceId, sessionId: result.sessionId },\n });\n } catch (error) {\n const classified = classifySessionTenancyFailure(error);\n if (!retainSessionRestartAttemptAfterFailure(error, receiptConfirmed)) {\n sessionRestartOperationController.settle(restartScope, attempt);\n }\n const message = classified.message;\n setRuntimeFailure(message);\n toast.error(\"Session could not be restarted\", { description: message });\n } finally {\n setRestarting(false);\n }\n };\n const terminalSession = isTerminalSessionStatus(props.session.status);\n // The session's ACTIVE compute, not its home backend: when a connected machine\n // is active (live-swapped or targeted at create) show the machine name, so the\n // inspector agrees with the \"Run on\" header instead of reading \"modal\" while a\n // selfhosted box runs the turn. Degrades to the home backend when no machine is\n // active (or selfhosted is disabled → the fleet 404s to empty).\n const fleet = useWorkspaceMachines({\n sessionId: props.session.id,\n pollIntervalMs: MACHINES_SESSION_POLL_MS,\n });\n const activeMachine =\n fleet.machines.find((machine) => machine.active && machine.kind === \"selfhosted\") ?? null;\n // Compute context, honestly: don't fall back to the home backend while the\n // fleet is still resolving - that reads \"Cloud sandbox\" even when a machine\n // runs the turn. Show a loading/unavailable note until we actually know. The\n // home box uses the neutral label, never its hosting vendor.\n const computeUnknown = fleet.machines.length === 0 && (fleet.loading || Boolean(fleet.error));\n const computeLabel = activeMachine ? \"Machine\" : \"Sandbox\";\n const computeValue = activeMachine\n ? activeMachine.name\n : computeUnknown\n ? fleet.loading\n ? \"Checking…\"\n : \"Unavailable\"\n : sessionSandboxLabel(t, props.session.sandboxBackend);\n const displayEvents = props.events;\n const sortedEvents = [...displayEvents].sort((a, b) => b.sequence - a.sequence);\n const lifecycleEvents = [...displayEvents]\n .filter((event) => !event.type.endsWith(\".delta\"))\n .sort((a, b) => b.sequence - a.sequence);\n const repositories = props.session.resources.filter((resource) => resource.kind === \"repository\");\n\n return (\n <div className=\"flex h-full min-h-[28rem] w-full min-w-0 flex-col overflow-hidden\">\n <div className=\"flex min-w-0 items-center justify-between gap-3 border-b border-border px-3 py-3\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <FileJsonIcon className=\"size-4 shrink-0 text-brand\" />\n <div className=\"min-w-0\">\n <div className=\"text-sm font-medium\">\n {terminalSession ? \"Archived debug\" : \"Debug\"}\n </div>\n <div className=\"truncate text-xs text-fg-subtle\">{props.events.length} events</div>\n </div>\n </div>\n <ConnectionPill state={props.connectionState} />\n </div>\n\n <Tabs defaultValue=\"overview\" className=\"min-h-0 min-w-0 flex-1 gap-0 overflow-hidden\">\n <div className=\"min-w-0 border-b border-border px-2 py-2\">\n <TabsList className=\"flex !h-auto w-full min-w-0 flex-wrap justify-start gap-1 rounded-md bg-bg p-1\">\n <TabsTrigger value=\"overview\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Overview\n </TabsTrigger>\n <TabsTrigger value=\"context\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Context\n </TabsTrigger>\n <TabsTrigger value=\"events\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Events\n </TabsTrigger>\n <TabsTrigger value=\"timeline\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Timeline\n </TabsTrigger>\n <TabsTrigger value=\"startup\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Startup\n </TabsTrigger>\n <TabsTrigger value=\"raw\" className=\"h-7 min-w-max flex-none rounded px-2 text-2xs\">\n Raw\n </TabsTrigger>\n </TabsList>\n </div>\n\n <TabsContent value=\"startup\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <ScrollArea className=\"h-full min-w-0\">\n <div className=\"space-y-5 p-3\">\n <PreferenceToggleRow\n label=\"Show startup details in chat\"\n description=\"Remembered in this browser. Timings are always recorded.\"\n checked={startupDetails}\n onToggle={() => setStartupDetails(!startupDetails)}\n wrapDescription\n />\n <StartupTimings phases={startupPhases} />\n </div>\n </ScrollArea>\n </TabsContent>\n <TabsContent value=\"overview\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <ScrollArea className=\"h-full min-w-0\">\n <div className=\"min-w-0 space-y-4 p-3\">\n <InspectorSection title=\"Session\">\n <InfoRow label=\"ID\" value={<CopyableMono value={props.session.id} />} />\n <InfoRow\n label=\"Status\"\n value={<SessionStatusBadge status={props.session.status} />}\n />\n <InfoRow\n label=\"Workflow\"\n value={\n props.session.temporalWorkflowId ? (\n <CopyableMono value={props.session.temporalWorkflowId} />\n ) : (\n \"none\"\n )\n }\n />\n <InfoRow\n label=\"Active turn\"\n value={\n props.session.activeTurnId ? (\n <CopyableMono value={props.session.activeTurnId} />\n ) : (\n \"none\"\n )\n }\n />\n <InfoRow label=\"Last seq\" value={String(props.session.lastSequence)} />\n <InfoRow label=\"Created\" value={formatTimestamp(props.session.createdAt)} />\n <InfoRow label=\"Updated\" value={formatTimestamp(props.session.updatedAt)} />\n </InspectorSection>\n\n <InspectorSection title=\"Runtime\">\n <InfoRow\n label=\"Model\"\n value={<ModelName model={props.session.model} markClassName=\"text-fg-muted\" />}\n />\n <InfoRow\n label=\"Effort\"\n value={labelReasoningEffort(t, props.session.reasoningEffort)}\n />\n <InfoRow label={computeLabel} value={computeValue} />\n <InfoRow label=\"Sandbox Environment\" value={props.session.rigId ?? \"none\"} />\n {props.session.tenancy ? (\n <div className=\"space-y-2 rounded-md border border-border bg-bg/35 p-2\">\n <div className=\"text-xs font-medium\">Restart with sandbox environment</div>\n <Select\n value={selectedRigId}\n disabled={restarting || Boolean(pendingRestartAttempt)}\n onChange={(event) => setSelectedRigId(event.target.value)}\n className=\"h-8 w-full text-xs\"\n >\n <option value=\"\">No sandbox environment</option>\n {rigs.rigs.map((rig) => (\n <option key={rig.id} value={rig.id}>\n {rig.name}\n {rig.activeVersion ? ` (v${rig.activeVersion.version})` : \"\"}\n </option>\n ))}\n </Select>\n <p className=\"text-2xs text-fg-subtle\">\n Sandbox Environment setup is immutable for a live sandbox. Restart creates an\n independent history fork with a fresh sandbox and leaves this session\n unchanged.\n </p>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={restarting}\n onClick={() => void restartWithSetup()}\n >\n {restarting ? <Loader2Icon className=\"animate-spin\" /> : <RotateCcwIcon />}\n {pendingRestartAttempt ? \"Retry restart\" : \"Restart with setup\"}\n </Button>\n </div>\n ) : null}\n {runtimeFailure ? (\n <p className=\"text-2xs text-status-waiting\">{runtimeFailure}</p>\n ) : null}\n <InfoRow label=\"Stream\" value={props.connectionState} />\n </InspectorSection>\n\n <InspectorSection title=\"Repositories\">\n {repositories.length === 0 ? (\n <p className=\"text-xs text-fg-subtle\">\n No repositories selected for this session.\n </p>\n ) : (\n <div className=\"min-w-0 space-y-2\">\n {withOccurrenceKeys(repositories, (resource) => JSON.stringify(resource)).map(\n ({ key, item: resource }) => (\n <div\n key={key}\n className=\"min-w-0 rounded-md border border-border bg-bg/35 p-2\"\n >\n <div className=\"min-w-0 truncate text-xs font-medium\">\n {repositoryDisplayName(resource)}\n </div>\n <div className=\"mt-1 min-w-0 truncate font-mono text-2xs text-fg-subtle\">\n {resource.uri}\n </div>\n <div className=\"mt-2 flex min-w-0 flex-wrap gap-1.5 text-2xs text-fg-subtle\">\n <span className=\"max-w-full truncate rounded border border-border px-1.5 py-0.5\">\n ref {resource.ref}\n </span>\n {resource.mountPath ? (\n <span className=\"max-w-full truncate rounded border border-border px-1.5 py-0.5\">\n {resource.mountPath}\n </span>\n ) : null}\n </div>\n </div>\n ),\n )}\n </div>\n )}\n </InspectorSection>\n </div>\n </ScrollArea>\n </TabsContent>\n\n <TabsContent value=\"context\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <ModelContextInspectorPane\n workspaceId={props.session.workspaceId}\n sessionId={props.session.id}\n events={displayEvents}\n isRunning={props.session.status === \"running\"}\n />\n </TabsContent>\n\n <TabsContent value=\"events\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <ScrollArea className=\"h-full min-w-0\">\n <div className=\"min-w-0 space-y-2 p-3\">\n {sortedEvents.map((event) => (\n <EventDebugRow key={event.id} event={event} />\n ))}\n </div>\n </ScrollArea>\n </TabsContent>\n\n <TabsContent value=\"timeline\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <ScrollArea className=\"h-full min-w-0\">\n <div className=\"min-w-0 space-y-2 p-3\">\n {lifecycleEvents.map((event) => (\n <div key={event.id} className=\"rounded-md border border-border bg-bg/35 p-2\">\n <div className=\"flex items-center justify-between gap-2 text-xs\">\n <span className=\"truncate font-medium\">{eventDisplayLabel(event)}</span>\n <span className=\"shrink-0 font-mono text-2xs text-fg-subtle\">\n #{event.sequence}\n </span>\n </div>\n <div className=\"mt-1 text-2xs text-fg-subtle\">\n {formatTimestamp(event.occurredAt)}\n </div>\n </div>\n ))}\n </div>\n </ScrollArea>\n </TabsContent>\n\n <TabsContent value=\"raw\" className=\"min-h-0 min-w-0 overflow-hidden\">\n <RawJsonPane value={{ session: props.session, events: displayEvents }} />\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n\nfunction EventDebugRow({ event }: { event: SessionEvent }) {\n const [open, setOpen] = useState(false);\n return (\n <Collapsible\n open={open}\n onOpenChange={setOpen}\n className=\"min-w-0 overflow-hidden rounded-md border border-border bg-bg/35\"\n >\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n className=\"flex w-full min-w-0 items-center justify-between gap-2 p-2 text-left\"\n >\n <div className=\"min-w-0\">\n <div className=\"truncate text-xs font-medium\">{eventDisplayLabel(event)}</div>\n <div className=\"mt-1 truncate font-mono text-2xs text-fg-subtle\">\n {event.turnId ?? event.id}\n </div>\n </div>\n <div className=\"shrink-0 text-right\">\n <div className=\"font-mono text-2xs text-fg-muted\">#{event.sequence}</div>\n <div className=\"mt-1 text-2xs text-fg-subtle\">{formatTimestamp(event.occurredAt)}</div>\n </div>\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <pre className=\"max-h-72 max-w-full overflow-auto border-t border-border p-2 text-2xs leading-5 text-fg-muted\">\n {JSON.stringify(event.payload, null, 2)}\n </pre>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n\nfunction RawJsonPane({ value }: { value: unknown }) {\n const json = JSON.stringify(value, null, 2);\n return (\n <div className=\"flex h-full min-h-0 min-w-0 flex-col overflow-hidden\">\n <div className=\"flex items-center justify-end border-b border-border p-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n onClick={() => {\n void navigator.clipboard.writeText(json);\n toast.success(\"Copied raw JSON\");\n }}\n >\n <CopyIcon className=\"size-3\" />\n Copy\n </Button>\n </div>\n <ScrollArea className=\"min-h-0 min-w-0 flex-1\">\n <pre className=\"max-w-full overflow-auto p-3 text-2xs leading-5 text-fg-muted\">{json}</pre>\n </ScrollArea>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,18 +1,18 @@
1
1
  "use client";
2
2
  import {
3
3
  SessionFeedback
4
- } from "../../../chunk-CBY5CXBD.js";
4
+ } from "../../../chunk-7NPCEBZE.js";
5
5
  import "../../../chunk-QAWWQS4L.js";
6
6
  import "../../../chunk-WMSCYECP.js";
7
7
  import "../../../chunk-HZUL2CUH.js";
8
- import "../../../chunk-HPPKLBTJ.js";
8
+ import "../../../chunk-TJQDL3JH.js";
9
9
  import "../../../chunk-L4OF77LE.js";
10
+ import "../../../chunk-LRNZ5F2R.js";
10
11
  import "../../../chunk-A3KMTJZS.js";
11
12
  import "../../../chunk-HMU5IELG.js";
12
- import "../../../chunk-LRNZ5F2R.js";
13
13
  import "../../../chunk-J3BHDXQQ.js";
14
14
  import "../../../chunk-TXS65BB2.js";
15
- import "../../../chunk-5JZYPZ72.js";
15
+ import "../../../chunk-JFK7NTEA.js";
16
16
 
17
17
  // src/app/components/session/message-actions.tsx
18
18
  import { GitForkIcon } from "lucide-react";
@@ -12,42 +12,43 @@ import {
12
12
  } from "../../../chunk-YG6NARQY.js";
13
13
  import {
14
14
  usePage
15
- } from "../../../chunk-MYNUBDU7.js";
15
+ } from "../../../chunk-VYKW6TB2.js";
16
16
  import "../../../chunk-IZUAIHR4.js";
17
- import {
18
- userErrorText
19
- } from "../../../chunk-L4OF77LE.js";
20
17
  import {
21
18
  useAppContext
22
19
  } from "../../../chunk-W6KAUGXO.js";
23
- import "../../../chunk-X7L4H4VG.js";
20
+ import {
21
+ userErrorText
22
+ } from "../../../chunk-L4OF77LE.js";
23
+ import "../../../chunk-7TCT7KPQ.js";
24
24
  import "../../../chunk-B27E3V37.js";
25
- import "../../../chunk-3KVWXKD6.js";
26
- import "../../../chunk-UD2PSIIX.js";
27
- import "../../../chunk-5MZTJMZ3.js";
28
- import "../../../chunk-R63QEVPK.js";
25
+ import "../../../chunk-LQ47YL6E.js";
26
+ import "../../../chunk-35BC2FU2.js";
29
27
  import "../../../chunk-OYQQJL3J.js";
30
28
  import "../../../chunk-H3LIIAGE.js";
31
29
  import "../../../chunk-RZLBICR5.js";
32
30
  import "../../../chunk-VHB3E6PT.js";
33
31
  import "../../../chunk-YSRBFJMQ.js";
34
- import "../../../chunk-TQGJN5UZ.js";
35
- import "../../../chunk-HEVQKE27.js";
36
- import "../../../chunk-ANHUMDJX.js";
37
- import "../../../chunk-STUCI6QA.js";
38
- import "../../../chunk-DNJ23AWQ.js";
39
- import "../../../chunk-OB3YGXHQ.js";
40
- import "../../../chunk-UNJPZGNK.js";
41
- import "../../../chunk-PEHTX3V7.js";
42
32
  import {
43
33
  useLightboxOptional
44
- } from "../../../chunk-OBQVTCTW.js";
34
+ } from "../../../chunk-UYNCMZX5.js";
45
35
  import "../../../chunk-J3BHDXQQ.js";
46
36
  import "../../../chunk-XEA5BCMA.js";
37
+ import "../../../chunk-UD2PSIIX.js";
38
+ import "../../../chunk-UUGR3X5I.js";
39
+ import "../../../chunk-PEHTX3V7.js";
40
+ import "../../../chunk-UNJPZGNK.js";
41
+ import "../../../chunk-YV56F4UP.js";
42
+ import "../../../chunk-HEVQKE27.js";
43
+ import "../../../chunk-WNDTLK44.js";
44
+ import "../../../chunk-DNJ23AWQ.js";
45
+ import "../../../chunk-OB3YGXHQ.js";
46
+ import "../../../chunk-ULYQEFNH.js";
47
+ import "../../../chunk-LEKBNKLD.js";
47
48
  import "../../../chunk-SJGAHTY5.js";
48
49
  import "../../../chunk-4NHJ6EXL.js";
49
50
  import "../../../chunk-TXS65BB2.js";
50
- import "../../../chunk-5JZYPZ72.js";
51
+ import "../../../chunk-JFK7NTEA.js";
51
52
 
52
53
  // src/app/components/session/message-resource-attachments.tsx
53
54
  import { AppWindowIcon, DownloadIcon, FileJsonIcon, ImageIcon } from "lucide-react";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/components/session/message-resource-attachments.tsx"],"sourcesContent":["import { AppWindowIcon, DownloadIcon, FileJsonIcon, ImageIcon } from \"lucide-react\";\nimport { useLightboxOptional } from \"../../../timeline\";\nimport { useEffect, useState } from \"react\";\nimport { toast } from \"../../lib/toast\";\nimport { useAppContext } from \"../../app-context\";\nimport { usePage } from \"../../lib/navigation\";\nimport { userErrorText } from \"../../../ui/api-error\";\nimport { cn } from \"../../lib/utils\";\nimport type { FileAsset, ResourceRef } from \"../../types\";\nimport { MessageFileSkeletons, MessageRepositoryChips } from \"./message-resource-placeholders\";\ntype FileResource = Extract<ResourceRef, { kind: \"file\" }>;\n\nexport default function MessageResourceAttachments({\n workspaceId,\n sessionId,\n resources,\n}: {\n workspaceId: string;\n sessionId?: string | undefined;\n resources: ResourceRef[];\n}) {\n const fileResources = resources.filter(\n (resource): resource is FileResource => resource.kind === \"file\",\n );\n const { assets, ready } = useFileAssets(workspaceId, fileResources, sessionId);\n const filesPending = fileResources.length > 0 && !ready;\n const imageResources = filesPending\n ? []\n : fileResources.filter((resource) => isImageAsset(assets.get(resource.fileId)));\n const otherFileResources = filesPending\n ? []\n : fileResources.filter((resource) => !isImageAsset(assets.get(resource.fileId)));\n const hasChips =\n otherFileResources.length > 0 || resources.some((resource) => resource.kind === \"repository\");\n return (\n <>\n {filesPending ? <MessageFileSkeletons resources={resources} /> : null}\n {imageResources.length > 0 ? (\n <div\n className={cn(\n \"mb-2\",\n imageResources.length === 1 ? \"max-w-md\" : \"grid grid-cols-2 gap-2\",\n )}\n >\n {imageResources.map((resource) => (\n <MessageImagePreview\n key={`${resource.fileId}:${resource.mountPath ?? \"\"}`}\n workspaceId={workspaceId}\n sessionId={sessionId}\n resource={resource}\n asset={assets.get(resource.fileId) as FileAsset}\n grid={imageResources.length > 1}\n />\n ))}\n </div>\n ) : null}\n {hasChips ? (\n <div className=\"mb-2 flex flex-wrap gap-1.5\">\n {otherFileResources.map((resource) => (\n <MessageFileAttachment\n key={`${resource.fileId}:${resource.mountPath ?? \"\"}`}\n workspaceId={workspaceId}\n sessionId={sessionId}\n resource={resource}\n asset={assets.get(resource.fileId) ?? undefined}\n />\n ))}\n <MessageRepositoryChips resources={resources} />\n </div>\n ) : null}\n </>\n );\n}\n\n/** Fetch metadata as one batch; never flash an image as a file chip first. */\nfunction useFileAssets(\n workspaceId: string,\n resources: FileResource[],\n sessionId?: string,\n): { assets: Map<string, FileAsset | null>; ready: boolean } {\n const { client } = useAppContext();\n // The map remembers WHICH id-key it was fetched for: when the attachments\n // change, the stale map must not masquerade as this message's metadata while\n // the new fetch is in flight (previews briefly showed the previous message's\n // files). `ready` is key-matched, never inferred from map size.\n const [loaded, setLoaded] = useState<{ key: string; assets: Map<string, FileAsset | null> }>({\n key: \"\",\n assets: new Map(),\n });\n const fileIdsKey = resources.map((resource) => resource.fileId).join(\",\");\n const key = `${sessionId ?? \"\"}:${fileIdsKey}`;\n useEffect(() => {\n let mounted = true;\n const ids = fileIdsKey ? fileIdsKey.split(\",\") : [];\n if (ids.length === 0) {\n setLoaded({ key, assets: new Map() });\n return;\n }\n void Promise.all(\n ids.map(async (id): Promise<readonly [string, FileAsset | null]> => {\n try {\n return [id, await client.getFile(workspaceId, id, { sessionId })] as const;\n } catch {\n return [id, null] as const;\n }\n }),\n ).then((entries) => {\n if (mounted) {\n setLoaded({ key, assets: new Map(entries) });\n }\n });\n return () => {\n mounted = false;\n };\n }, [client, workspaceId, sessionId, fileIdsKey, key]);\n return { assets: loaded.key === key ? loaded.assets : new Map(), ready: loaded.key === key };\n}\n\nfunction isImageAsset(asset: FileAsset | null | undefined): boolean {\n return Boolean(asset?.contentType.startsWith(\"image/\"));\n}\n\n/** Signed image preview with lightbox and download; failures become file chips. */\nfunction MessageImagePreview({\n workspaceId,\n sessionId,\n resource,\n asset,\n grid,\n}: {\n workspaceId: string;\n sessionId?: string | undefined;\n resource: FileResource;\n asset: FileAsset;\n grid: boolean;\n}) {\n const { client } = useAppContext();\n const page = usePage();\n const lightbox = useLightboxOptional();\n const [url, setUrl] = useState<string | null>(null);\n const [failed, setFailed] = useState(false);\n const [loaded, setLoaded] = useState(false);\n\n useEffect(() => {\n let mounted = true;\n // Same mounted instance, new file (virtualized/reused rows): the previous\n // attachment's url/failed/loaded must never bleed into this one.\n setUrl(null);\n setFailed(false);\n setLoaded(false);\n void client\n .createFileDownloadUrl(workspaceId, resource.fileId, { sessionId })\n .then((signed) => {\n if (mounted) {\n setUrl(signed.url);\n }\n })\n .catch(() => {\n if (mounted) {\n setFailed(true);\n }\n });\n return () => {\n mounted = false;\n };\n }, [client, workspaceId, sessionId, resource.fileId]);\n\n // A dead/expired signed URL degrades to the plain file card — never a broken image.\n if (failed) {\n return (\n <MessageFileAttachment\n workspaceId={workspaceId}\n sessionId={sessionId}\n resource={resource}\n asset={asset}\n />\n );\n }\n\n // An app-shot names the window it shows rather than the screenshot's file.\n const appShot = asset.appShot;\n const appShotCaption = appShot\n ? [appShot.app, appShot.title.trim()].filter(Boolean).join(\" · \")\n : \"\";\n\n const openFull = () => {\n if (!url) {\n return;\n }\n if (lightbox) {\n lightbox.open(url, asset.filename);\n } else {\n page.open(url);\n }\n };\n\n async function download() {\n try {\n const signed = await client.createFileDownloadUrl(workspaceId, resource.fileId, {\n sessionId,\n });\n page.open(signed.url);\n } catch (error) {\n toast.error(\"Couldn't download the image\", {\n description: userErrorText(error),\n });\n }\n }\n\n return (\n <figure className=\"m-0 min-w-0\">\n <button\n type=\"button\"\n onClick={openFull}\n aria-label={`Open ${asset.filename}`}\n className=\"block w-full overflow-hidden rounded-lg border border-border bg-surface outline-hidden focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {url ? (\n <img\n src={url}\n alt={asset.filename}\n loading=\"lazy\"\n onLoad={() => setLoaded(true)}\n onError={() => setFailed(true)}\n className={cn(\n \"w-full transition-opacity duration-200\",\n grid ? \"h-36 object-cover\" : \"max-h-80 object-contain\",\n loaded ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n ) : (\n <div className={cn(\"w-full animate-pulse bg-surface-2\", grid ? \"h-36\" : \"h-40\")} />\n )}\n </button>\n <figcaption className=\"mt-1 flex items-center gap-1.5 px-0.5 text-2xs text-fg-subtle\">\n {appShot ? (\n <>\n <AppWindowIcon className=\"size-3 shrink-0\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate\" title={appShotCaption}>\n <span className=\"sr-only\">App-shot: </span>\n {appShotCaption}\n </span>\n </>\n ) : (\n <>\n <ImageIcon className=\"size-3 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\" title={asset.filename}>\n {asset.filename}\n </span>\n </>\n )}\n <button\n type=\"button\"\n onClick={() => void download()}\n aria-label={`Download ${asset.filename}`}\n className=\"inline-flex shrink-0 items-center justify-center rounded p-0.5 outline-hidden transition-colors hover:text-fg focus-visible:ring-1 focus-visible:ring-ring pointer-coarse:size-10\"\n >\n <DownloadIcon className=\"size-3\" />\n </button>\n </figcaption>\n </figure>\n );\n}\n\n/** File chip with the download-url affordance (signed URL on click). */\nfunction MessageFileAttachment({\n workspaceId,\n sessionId,\n resource,\n asset: preloaded,\n}: {\n workspaceId: string;\n sessionId?: string | undefined;\n resource: FileResource;\n /** When the parent already fetched the asset, skip the redundant lookup. */\n asset?: FileAsset | undefined;\n}) {\n const { client } = useAppContext();\n const page = usePage();\n const [file, setFile] = useState<FileAsset | null>(preloaded ?? null);\n const [busy, setBusy] = useState(false);\n\n useEffect(() => {\n if (preloaded) {\n setFile(preloaded);\n return;\n }\n let mounted = true;\n void client\n .getFile(workspaceId, resource.fileId, { sessionId })\n .then((asset) => {\n if (mounted) {\n setFile(asset);\n }\n })\n .catch(() => undefined);\n return () => {\n mounted = false;\n };\n }, [client, workspaceId, sessionId, resource.fileId, preloaded]);\n\n async function openFile() {\n setBusy(true);\n try {\n const signed = await client.createFileDownloadUrl(workspaceId, resource.fileId, {\n sessionId,\n });\n page.open(signed.url);\n } catch (error) {\n toast.error(\"Couldn't open the file\", {\n description: userErrorText(error),\n });\n } finally {\n setBusy(false);\n }\n }\n\n const isImage = file?.contentType.startsWith(\"image/\");\n return (\n <button\n type=\"button\"\n onClick={() => void openFile()}\n disabled={busy}\n className=\"inline-flex max-w-full items-center gap-1.5 rounded-md border border-border bg-surface px-2 py-1 text-xs text-fg-muted hover:text-fg disabled:opacity-60 pointer-coarse:min-h-10\"\n >\n {isImage ? (\n <ImageIcon className=\"size-3.5 shrink-0\" />\n ) : (\n <FileJsonIcon className=\"size-3.5 shrink-0\" />\n )}\n <span className=\"truncate\">{file?.filename ?? resource.fileId}</span>\n <DownloadIcon className=\"size-3 shrink-0\" />\n </button>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/app/components/session/message-resource-attachments.tsx"],"sourcesContent":["import { AppWindowIcon, DownloadIcon, FileJsonIcon, ImageIcon } from \"lucide-react\";\nimport { useLightboxOptional } from \"../../../timeline\";\nimport { useEffect, useState } from \"react\";\nimport { toast } from \"../../lib/toast\";\nimport { useAppContext } from \"../../app-context\";\nimport { usePage } from \"../../lib/navigation\";\nimport { userErrorText } from \"../../../ui/api-error\";\nimport { cn } from \"../../lib/utils\";\nimport type { FileAsset, ResourceRef } from \"../../types\";\nimport { MessageFileSkeletons, MessageRepositoryChips } from \"./message-resource-placeholders\";\ntype FileResource = Extract<ResourceRef, { kind: \"file\" }>;\n\nexport default function MessageResourceAttachments({\n workspaceId,\n sessionId,\n resources,\n}: {\n workspaceId: string;\n sessionId?: string | undefined;\n resources: ResourceRef[];\n}) {\n const fileResources = resources.filter(\n (resource): resource is FileResource => resource.kind === \"file\",\n );\n const { assets, ready } = useFileAssets(workspaceId, fileResources, sessionId);\n const filesPending = fileResources.length > 0 && !ready;\n const imageResources = filesPending\n ? []\n : fileResources.filter((resource) => isImageAsset(assets.get(resource.fileId)));\n const otherFileResources = filesPending\n ? []\n : fileResources.filter((resource) => !isImageAsset(assets.get(resource.fileId)));\n const hasChips =\n otherFileResources.length > 0 || resources.some((resource) => resource.kind === \"repository\");\n return (\n <>\n {filesPending ? <MessageFileSkeletons resources={resources} /> : null}\n {imageResources.length > 0 ? (\n <div\n className={cn(\n \"mb-2\",\n imageResources.length === 1 ? \"max-w-md\" : \"grid grid-cols-2 gap-2\",\n )}\n >\n {imageResources.map((resource) => (\n <MessageImagePreview\n key={`${resource.fileId}:${resource.mountPath ?? \"\"}`}\n workspaceId={workspaceId}\n sessionId={sessionId}\n resource={resource}\n asset={assets.get(resource.fileId) as FileAsset}\n grid={imageResources.length > 1}\n />\n ))}\n </div>\n ) : null}\n {hasChips ? (\n <div className=\"mb-2 flex flex-wrap gap-1.5\">\n {otherFileResources.map((resource) => (\n <MessageFileAttachment\n key={`${resource.fileId}:${resource.mountPath ?? \"\"}`}\n workspaceId={workspaceId}\n sessionId={sessionId}\n resource={resource}\n asset={assets.get(resource.fileId) ?? undefined}\n />\n ))}\n <MessageRepositoryChips resources={resources} />\n </div>\n ) : null}\n </>\n );\n}\n\n/** Fetch metadata as one batch; never flash an image as a file chip first. */\nfunction useFileAssets(\n workspaceId: string,\n resources: FileResource[],\n sessionId?: string,\n): { assets: Map<string, FileAsset | null>; ready: boolean } {\n const { client } = useAppContext();\n // The map remembers WHICH id-key it was fetched for: when the attachments\n // change, the stale map must not masquerade as this message's metadata while\n // the new fetch is in flight (previews briefly showed the previous message's\n // files). `ready` is key-matched, never inferred from map size.\n const [loaded, setLoaded] = useState<{ key: string; assets: Map<string, FileAsset | null> }>({\n key: \"\",\n assets: new Map(),\n });\n const fileIdsKey = resources.map((resource) => resource.fileId).join(\",\");\n const key = `${sessionId ?? \"\"}:${fileIdsKey}`;\n useEffect(() => {\n let mounted = true;\n const ids = fileIdsKey ? fileIdsKey.split(\",\") : [];\n if (ids.length === 0) {\n setLoaded({ key, assets: new Map() });\n return;\n }\n void Promise.all(\n ids.map(async (id): Promise<readonly [string, FileAsset | null]> => {\n try {\n return [id, await client.getFile(workspaceId, id, { sessionId })] as const;\n } catch {\n return [id, null] as const;\n }\n }),\n ).then((entries) => {\n if (mounted) {\n setLoaded({ key, assets: new Map(entries) });\n }\n });\n return () => {\n mounted = false;\n };\n }, [client, workspaceId, sessionId, fileIdsKey, key]);\n return { assets: loaded.key === key ? loaded.assets : new Map(), ready: loaded.key === key };\n}\n\nfunction isImageAsset(asset: FileAsset | null | undefined): boolean {\n return Boolean(asset?.contentType.startsWith(\"image/\"));\n}\n\n/** Signed image preview with lightbox and download; failures become file chips. */\nfunction MessageImagePreview({\n workspaceId,\n sessionId,\n resource,\n asset,\n grid,\n}: {\n workspaceId: string;\n sessionId?: string | undefined;\n resource: FileResource;\n asset: FileAsset;\n grid: boolean;\n}) {\n const { client } = useAppContext();\n const page = usePage();\n const lightbox = useLightboxOptional();\n const [url, setUrl] = useState<string | null>(null);\n const [failed, setFailed] = useState(false);\n const [loaded, setLoaded] = useState(false);\n\n useEffect(() => {\n let mounted = true;\n // Same mounted instance, new file (virtualized/reused rows): the previous\n // attachment's url/failed/loaded must never bleed into this one.\n setUrl(null);\n setFailed(false);\n setLoaded(false);\n void client\n .createFileDownloadUrl(workspaceId, resource.fileId, { sessionId })\n .then((signed) => {\n if (mounted) {\n setUrl(signed.url);\n }\n })\n .catch(() => {\n if (mounted) {\n setFailed(true);\n }\n });\n return () => {\n mounted = false;\n };\n }, [client, workspaceId, sessionId, resource.fileId]);\n\n // A dead/expired signed URL degrades to the plain file card — never a broken image.\n if (failed) {\n return (\n <MessageFileAttachment\n workspaceId={workspaceId}\n sessionId={sessionId}\n resource={resource}\n asset={asset}\n />\n );\n }\n\n // An app-shot names the window it shows rather than the screenshot's file.\n const appShot = asset.appShot;\n const appShotCaption = appShot\n ? [appShot.app, appShot.title.trim()].filter(Boolean).join(\" · \")\n : \"\";\n\n const openFull = () => {\n if (!url) {\n return;\n }\n if (lightbox) {\n lightbox.open(url, asset.filename);\n } else {\n page.open(url);\n }\n };\n\n async function download() {\n try {\n const signed = await client.createFileDownloadUrl(workspaceId, resource.fileId, {\n sessionId,\n });\n page.open(signed.url);\n } catch (error) {\n toast.error(\"Couldn't download the image\", {\n description: userErrorText(error),\n });\n }\n }\n\n return (\n <figure className=\"m-0 min-w-0\">\n <button\n type=\"button\"\n onClick={openFull}\n aria-label={`Open ${asset.filename}`}\n className=\"block w-full overflow-hidden rounded-lg border border-border bg-surface outline-hidden focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {url ? (\n <img\n src={url}\n alt={asset.filename}\n loading=\"lazy\"\n onLoad={() => setLoaded(true)}\n onError={() => setFailed(true)}\n className={cn(\n \"w-full transition-opacity duration-200\",\n grid ? \"h-36 object-cover\" : \"max-h-80 object-contain\",\n loaded ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n ) : (\n <div className={cn(\"w-full animate-pulse bg-surface-2\", grid ? \"h-36\" : \"h-40\")} />\n )}\n </button>\n <figcaption className=\"mt-1 flex items-center gap-1.5 px-0.5 text-2xs text-fg-subtle\">\n {appShot ? (\n <>\n <AppWindowIcon className=\"size-3 shrink-0\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate\" title={appShotCaption}>\n <span className=\"sr-only\">App-shot: </span>\n {appShotCaption}\n </span>\n </>\n ) : (\n <>\n <ImageIcon className=\"size-3 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\" title={asset.filename}>\n {asset.filename}\n </span>\n </>\n )}\n <button\n type=\"button\"\n onClick={() => void download()}\n aria-label={`Download ${asset.filename}`}\n className=\"inline-flex shrink-0 items-center justify-center rounded p-0.5 outline-hidden transition-colors hover:text-fg focus-visible:ring-1 focus-visible:ring-ring pointer-coarse:size-10\"\n >\n <DownloadIcon className=\"size-3\" />\n </button>\n </figcaption>\n </figure>\n );\n}\n\n/** File chip with the download-url affordance (signed URL on click). */\nfunction MessageFileAttachment({\n workspaceId,\n sessionId,\n resource,\n asset: preloaded,\n}: {\n workspaceId: string;\n sessionId?: string | undefined;\n resource: FileResource;\n /** When the parent already fetched the asset, skip the redundant lookup. */\n asset?: FileAsset | undefined;\n}) {\n const { client } = useAppContext();\n const page = usePage();\n const [file, setFile] = useState<FileAsset | null>(preloaded ?? null);\n const [busy, setBusy] = useState(false);\n\n useEffect(() => {\n if (preloaded) {\n setFile(preloaded);\n return;\n }\n let mounted = true;\n void client\n .getFile(workspaceId, resource.fileId, { sessionId })\n .then((asset) => {\n if (mounted) {\n setFile(asset);\n }\n })\n .catch(() => undefined);\n return () => {\n mounted = false;\n };\n }, [client, workspaceId, sessionId, resource.fileId, preloaded]);\n\n async function openFile() {\n setBusy(true);\n try {\n const signed = await client.createFileDownloadUrl(workspaceId, resource.fileId, {\n sessionId,\n });\n page.open(signed.url);\n } catch (error) {\n toast.error(\"Couldn't open the file\", {\n description: userErrorText(error),\n });\n } finally {\n setBusy(false);\n }\n }\n\n const isImage = file?.contentType.startsWith(\"image/\");\n return (\n <button\n type=\"button\"\n onClick={() => void openFile()}\n disabled={busy}\n className=\"inline-flex max-w-full items-center gap-1.5 rounded-md border border-border bg-surface px-2 py-1 text-xs text-fg-muted hover:text-fg disabled:opacity-60 pointer-coarse:min-h-10\"\n >\n {isImage ? (\n <ImageIcon className=\"size-3.5 shrink-0\" />\n ) : (\n <FileJsonIcon className=\"size-3.5 shrink-0\" />\n )}\n <span className=\"truncate\">{file?.filename ?? resource.fileId}</span>\n <DownloadIcon className=\"size-3 shrink-0\" />\n </button>\n );\n}\n"],"mappings":"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","names":[]}