@opengeni/react 4.5.0 → 4.6.1

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 (530) hide show
  1. package/dist/app/app-state.js +25 -25
  2. package/dist/app/components/Composer.js +25 -25
  3. package/dist/app/components/agent/agent-capability-picker.js +4 -4
  4. package/dist/app/components/artifacts/artifact-library.js +17 -17
  5. package/dist/app/components/artifacts/chat-interactive-block.js +16 -16
  6. package/dist/app/components/artifacts/inline-chat-image.js +29 -29
  7. package/dist/app/components/artifacts/retained-file-preview.js +33 -33
  8. package/dist/app/components/artifacts/retained-text-preview.js +5 -5
  9. package/dist/app/components/artifacts/site-audience.js +4 -4
  10. package/dist/app/components/artifacts/site-conversations.js +20 -20
  11. package/dist/app/components/artifacts/site-data.js +22 -20
  12. package/dist/app/components/artifacts/site-publishing.js +38 -38
  13. package/dist/app/components/artifacts/site-settings.js +47 -47
  14. package/dist/app/components/billing-class-mark.js +5 -5
  15. package/dist/app/components/capabilities/capability-detail-sheet.js +8 -8
  16. package/dist/app/components/capabilities/capability-logo-source.js +12 -12
  17. package/dist/app/components/capabilities/connector-tool-permissions.js +3 -3
  18. package/dist/app/components/capabilities/native-connect-setup.js +15 -15
  19. package/dist/app/components/capabilities/perform-capability-action.js +1 -1
  20. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +15 -15
  21. package/dist/app/components/capabilities/session-capability-card.js +75 -75
  22. package/dist/app/components/capabilities/session-chrome-card.js +36 -36
  23. package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -20
  24. package/dist/app/components/capabilities/session-github-card.js +24 -24
  25. package/dist/app/components/capabilities/session-machine-card.js +35 -35
  26. package/dist/app/components/capabilities/use-capabilities-catalog.js +3 -3
  27. package/dist/app/components/capabilities/use-connection-accounts.js +1 -1
  28. package/dist/app/components/command-menu/chat-status.js +19 -18
  29. package/dist/app/components/command-menu/chat-switcher.js +23 -22
  30. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  31. package/dist/app/components/command-menu/command-menu.js +35 -34
  32. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  33. package/dist/app/components/command-menu/shortcut-sheet.js +16 -16
  34. package/dist/app/components/composer-capabilities-menu-body.js +3 -3
  35. package/dist/app/components/composer-mobile-plus-panel.js +20 -20
  36. package/dist/app/components/composer-mobile-plus.js +1 -1
  37. package/dist/app/components/credit-required-gate.js +1 -1
  38. package/dist/app/components/credit-required-prompt.js +15 -13
  39. package/dist/app/components/credit-required-prompt.js.map +1 -1
  40. package/dist/app/components/credits/credit-refusal-notice.js +5 -3
  41. package/dist/app/components/desktop/app-shots.js +6 -6
  42. package/dist/app/components/desktop/this-computer.js +4 -4
  43. package/dist/app/components/feedback.js +4 -4
  44. package/dist/app/components/follow-up-repository-menu-body.js +8 -6
  45. package/dist/app/components/follow-up-repository-menu-body.js.map +1 -1
  46. package/dist/app/components/follow-up-repository-picker.js +4 -2
  47. package/dist/app/components/github-app-connect-launcher.js +1 -1
  48. package/dist/app/components/knowledge/agent-learning-settings.js +3 -3
  49. package/dist/app/components/machines/connect-machine-dialog.js +18 -18
  50. package/dist/app/components/markdown.js +9 -9
  51. package/dist/app/components/message-context-pills.js +2 -2
  52. package/dist/app/components/models/models-ui.js +8 -8
  53. package/dist/app/components/pickers.js +9 -9
  54. package/dist/app/components/rail/rail-context.js +2 -2
  55. package/dist/app/components/rail/rail-sections.js +63 -62
  56. package/dist/app/components/rail/session-header.js +48 -48
  57. package/dist/app/components/rail/session-list.js +62 -61
  58. package/dist/app/components/rail/session-row-content.js +4 -2
  59. package/dist/app/components/rail/session-row-hover-details.js +25 -24
  60. package/dist/app/components/rail/session-shell.js +100 -99
  61. package/dist/app/components/rail/site-session-group-heading.js +13 -12
  62. package/dist/app/components/repository-picker.js +8 -6
  63. package/dist/app/components/secrets/session-secrets-panel.js +3 -3
  64. package/dist/app/components/session/agent-configuration-panel.js +35 -35
  65. package/dist/app/components/session/artifact-session-page.js +2 -2
  66. package/dist/app/components/session/banners.js +14 -12
  67. package/dist/app/components/session/codex-account-indicator.js +10 -10
  68. package/dist/app/components/session/editable-artifacts-workspace.js +43 -43
  69. package/dist/app/components/session/failed-session-banner.js +10 -10
  70. package/dist/app/components/session/human-input.js +56 -56
  71. package/dist/app/components/session/inspector.js +90 -89
  72. package/dist/app/components/session/inspector.js.map +1 -1
  73. package/dist/app/components/session/message-actions.js +4 -4
  74. package/dist/app/components/session/message-resource-attachments.js +20 -20
  75. package/dist/app/components/session/model-account-indicator.js +9 -9
  76. package/dist/app/components/session/model-context-inspector.js +2 -2
  77. package/dist/app/components/session/model-recovery-notice.js +3 -3
  78. package/dist/app/components/session/new-session-settings-menu.js +11 -11
  79. package/dist/app/components/session/sandbox-switcher.js +14 -14
  80. package/dist/app/components/session/sandbox-workspace.js +73 -73
  81. package/dist/app/components/session/search-markdown-highlight.js +10 -10
  82. package/dist/app/components/session/search-results-view.js +11 -11
  83. package/dist/app/components/session/session-admin-access.js +9 -9
  84. package/dist/app/components/session/session-admission-notice.js +5 -5
  85. package/dist/app/components/session/session-machine-access-notice.js +5 -5
  86. package/dist/app/components/session/session-retention.js +4 -4
  87. package/dist/app/components/session/session-search-dialog.js +11 -11
  88. package/dist/app/components/session/session-skill-reviews.js +1 -1
  89. package/dist/app/components/session/session-tenancy-control.js +22 -22
  90. package/dist/app/components/session/session-usage-limit-section.js +10 -10
  91. package/dist/app/components/session/session-wait-status.js +9 -9
  92. package/dist/app/components/session/subagents.js +16 -16
  93. package/dist/app/components/session-connectors-menu-body.js +5 -5
  94. package/dist/app/components/settings/row-select.js +1 -1
  95. package/dist/app/components/transcription-settings.js +2 -2
  96. package/dist/app/components/ui/destructive-confirm.js +6 -6
  97. package/dist/app/components/usage/usage-entry.js +6 -6
  98. package/dist/app/components/workspace-composer-plus.js +21 -21
  99. package/dist/app/embed/session-app.js +265 -265
  100. package/dist/app/lib/actions/actions-provider.js +13 -13
  101. package/dist/app/lib/codex-usage-query.js +3 -3
  102. package/dist/app/lib/composer-connectors.js +13 -13
  103. package/dist/app/lib/console-text.js +2 -2
  104. package/dist/app/lib/credit-coverage.js +4 -2
  105. package/dist/app/lib/events.js +17 -17
  106. package/dist/app/lib/failed-session-copy.js +3 -3
  107. package/dist/app/lib/format.d.ts +2 -7
  108. package/dist/app/lib/format.js +5 -2
  109. package/dist/app/lib/model-access-onboarding.js +3 -3
  110. package/dist/app/lib/move-chat-to-machine.js +3 -3
  111. package/dist/app/lib/session-branch-cache.js +15 -14
  112. package/dist/app/lib/session-create.js +2 -2
  113. package/dist/app/lib/session-group-pagination.js +15 -14
  114. package/dist/app/lib/session-hover-facts.js +16 -15
  115. package/dist/app/lib/session-model.js +3 -3
  116. package/dist/app/lib/session-rail.js +9 -9
  117. package/dist/app/lib/session-rename.js +3 -3
  118. package/dist/app/lib/sessions-group.js +15 -14
  119. package/dist/app/lib/turn-failure-analytics.js +5 -5
  120. package/dist/app/lib/use-duplicate-site.js +2 -2
  121. package/dist/app/lib/use-follow-up-repositories.js +3 -3
  122. package/dist/app/lib/use-workspace-machines.js +5 -5
  123. package/dist/app/lib/use-workspace-model-catalog.js +5 -5
  124. package/dist/app/lib/use-workspace-rigs.js +4 -4
  125. package/dist/app/lib/workspace-navigation-preference.js +5 -5
  126. package/dist/app/lib/workspace-scope-context.js +4 -4
  127. package/dist/app/routes/artifacts.js +128 -127
  128. package/dist/app/routes/artifacts.js.map +1 -1
  129. package/dist/app/routes/retained-artifact.js +67 -67
  130. package/dist/app/routes/session-unavailable.js +3 -3
  131. package/dist/app/routes/session.js +169 -169
  132. package/dist/app/routes/sessions-index-hydration.js +3 -3
  133. package/dist/app/routes/sessions-index.js +121 -120
  134. package/dist/app/routes/site-view.js +89 -88
  135. package/dist/app/routes/site-view.js.map +1 -1
  136. package/dist/artifacts-document.js +4 -4
  137. package/dist/artifacts-presentation.js +4 -4
  138. package/dist/artifacts-spreadsheet.js +4 -4
  139. package/dist/artifacts.js +39 -39
  140. package/dist/{browser-viewer-QMCNV4RI.js → browser-viewer-YQC6BFMS.js} +7 -7
  141. package/dist/{chat-interactive-block-PMIAUXSO.js → chat-interactive-block-Z22YHDRU.js} +6 -6
  142. package/dist/{chunk-YJPKDRI2.js → chunk-24POWVUY.js} +15 -15
  143. package/dist/{chunk-35BC2FU2.js → chunk-26P7B46A.js} +19 -19
  144. package/dist/{chunk-ZVVT72MT.js → chunk-27EORKJ4.js} +2 -2
  145. package/dist/{chunk-2NC7NZCE.js → chunk-2K27S6LK.js} +6 -6
  146. package/dist/{chunk-2QBYDGWO.js → chunk-2LUO22FR.js} +9 -9
  147. package/dist/{chunk-FSP334UU.js → chunk-2SZ3KC5S.js} +2 -2
  148. package/dist/{chunk-3X5FKDYQ.js → chunk-32HA7DXJ.js} +26 -26
  149. package/dist/{chunk-CFFNT2OY.js → chunk-3GLAPCVI.js} +8 -8
  150. package/dist/{chunk-PCJLH45G.js → chunk-3MQM4ZOC.js} +3 -3
  151. package/dist/{chunk-BXQYAAVE.js → chunk-3XOISKZC.js} +4 -4
  152. package/dist/{chunk-IDXTASGN.js → chunk-3ZZOE4SN.js} +4 -4
  153. package/dist/{chunk-N3ZP4IDU.js → chunk-45WYYFP6.js} +2 -2
  154. package/dist/{chunk-NEK4WB5P.js → chunk-467VRP4E.js} +3 -3
  155. package/dist/{chunk-PCFK7HKD.js → chunk-4BF3DD6R.js} +18 -18
  156. package/dist/{chunk-552UYIQ7.js → chunk-4ICPJZAB.js} +20 -20
  157. package/dist/{chunk-ITX2TB4K.js → chunk-4PC7LIQK.js} +6 -6
  158. package/dist/{chunk-D5OWJZQR.js → chunk-4RY64KQY.js} +2 -2
  159. package/dist/{chunk-PUTS4DYW.js → chunk-4VJOZJDV.js} +2 -2
  160. package/dist/{chunk-7P4AQMGA.js → chunk-4XKT4ENZ.js} +12 -12
  161. package/dist/{chunk-4VK2R5QC.js → chunk-4XO346BW.js} +3 -3
  162. package/dist/{chunk-IBA5FMRE.js → chunk-65K5LV4L.js} +136 -136
  163. package/dist/{chunk-S2U4CDAC.js → chunk-6AFSZKZA.js} +149 -149
  164. package/dist/chunk-6AFSZKZA.js.map +1 -0
  165. package/dist/{chunk-5Y2FPLZE.js → chunk-6JF7C3U3.js} +8 -8
  166. package/dist/{chunk-LQ47YL6E.js → chunk-6K3WNTRI.js} +2 -2
  167. package/dist/{chunk-UUGR3X5I.js → chunk-6MRY2RUZ.js} +5 -5
  168. package/dist/{chunk-CCR33J7L.js → chunk-6N7W3TOV.js} +2 -2
  169. package/dist/chunk-6NXQCOLD.js +71 -0
  170. package/dist/chunk-6NXQCOLD.js.map +1 -0
  171. package/dist/{chunk-ILDOW2IQ.js → chunk-6PQBKMUL.js} +3 -3
  172. package/dist/{chunk-SY2AAZNB.js → chunk-6VITVQ23.js} +4 -4
  173. package/dist/{chunk-AIEXYO2X.js → chunk-6YDXUE5H.js} +2 -2
  174. package/dist/{chunk-GXW2I2M2.js → chunk-72XEFLMD.js} +2 -2
  175. package/dist/{chunk-KEXYBG7Q.js → chunk-74NIHMAT.js} +3 -3
  176. package/dist/{chunk-FTX5CNHA.js → chunk-767WCGAX.js} +4 -4
  177. package/dist/{chunk-5MJHH72T.js → chunk-7EGWIME2.js} +4 -4
  178. package/dist/{chunk-Z7IGO5EA.js → chunk-7H2D4VNU.js} +2 -2
  179. package/dist/{chunk-EJ7WARW7.js → chunk-7J7PZB4S.js} +2 -2
  180. package/dist/{chunk-4SAGYEVB.js → chunk-7JZSFJHB.js} +2 -2
  181. package/dist/{chunk-AJPW3SV4.js → chunk-7OIBLMDP.js} +2 -2
  182. package/dist/{chunk-SM5QX6UK.js → chunk-A2EWJQXX.js} +4 -4
  183. package/dist/{chunk-5YFY4SFC.js → chunk-AJ7PY4FJ.js} +2 -2
  184. package/dist/{chunk-RFLYID6H.js → chunk-AT4K4F6S.js} +4 -4
  185. package/dist/{chunk-YV56F4UP.js → chunk-AW3QEFOF.js} +179 -179
  186. package/dist/chunk-AW3QEFOF.js.map +1 -0
  187. package/dist/{chunk-3ABPIUCK.js → chunk-B254JG72.js} +2 -2
  188. package/dist/{chunk-7TCT7KPQ.js → chunk-BCFHMBMK.js} +228 -228
  189. package/dist/chunk-BCFHMBMK.js.map +1 -0
  190. package/dist/{chunk-TJQDL3JH.js → chunk-BPD4IJBG.js} +2 -2
  191. package/dist/{chunk-S37GP7LX.js → chunk-BQWUXC55.js} +21 -21
  192. package/dist/{chunk-DGLRZMXL.js → chunk-BWKZEW6K.js} +3 -3
  193. package/dist/{chunk-LF5CBAOS.js → chunk-C535KSTY.js} +4 -4
  194. package/dist/{chunk-MOKYT3X3.js → chunk-C6JL6PBL.js} +3 -3
  195. package/dist/{chunk-4XQC7VLT.js → chunk-CA64OZLZ.js} +13 -13
  196. package/dist/{chunk-EQE3MNQN.js → chunk-CEQUNJJY.js} +5 -5
  197. package/dist/{chunk-JO6R5EXF.js → chunk-CKA4SJRK.js} +5 -5
  198. package/dist/{chunk-LHLK7FUA.js → chunk-CPKD2YGK.js} +6 -6
  199. package/dist/{chunk-4GLLWX33.js → chunk-CYO5HL4C.js} +17 -33
  200. package/dist/chunk-CYO5HL4C.js.map +1 -0
  201. package/dist/{chunk-5FEN3KYH.js → chunk-D4QOZXPM.js} +11 -11
  202. package/dist/{chunk-UP7I3W6O.js → chunk-DAQG3C4W.js} +55 -55
  203. package/dist/{chunk-RIYZFKIM.js → chunk-DNLXQUBX.js} +36 -36
  204. package/dist/{chunk-UYNCMZX5.js → chunk-DNWBLT4U.js} +4 -4
  205. package/dist/{chunk-MXLKI7BI.js → chunk-DNYD7AUG.js} +3 -3
  206. package/dist/{chunk-7KIENXRE.js → chunk-DZH2HTTB.js} +1 -1
  207. package/dist/{chunk-CD3MO3IC.js → chunk-E36IC3LU.js} +2 -2
  208. package/dist/{chunk-Z6E6TUAE.js → chunk-EURDMOXZ.js} +2 -2
  209. package/dist/{chunk-22JFMNMF.js → chunk-F2RMKGDQ.js} +4 -4
  210. package/dist/{chunk-62VER7O4.js → chunk-F3NERYBQ.js} +6 -6
  211. package/dist/{chunk-YXA2EKV3.js → chunk-F4B2YYCN.js} +3 -3
  212. package/dist/{chunk-ENS6E4RZ.js → chunk-FH75NNLB.js} +2 -2
  213. package/dist/{chunk-GGV4NSG3.js → chunk-FMATVQFW.js} +8 -8
  214. package/dist/{chunk-7XO7YKPC.js → chunk-FVCLVASD.js} +73 -73
  215. package/dist/{chunk-3RQUWFZT.js → chunk-G3FU2IF7.js} +67 -67
  216. package/dist/{chunk-3RQUWFZT.js.map → chunk-G3FU2IF7.js.map} +1 -1
  217. package/dist/{chunk-HU6JTNWF.js → chunk-GMVKCEBG.js} +2 -2
  218. package/dist/{chunk-SWCLN6JE.js → chunk-GRNE5ANU.js} +2 -2
  219. package/dist/{chunk-FWOBNL2A.js → chunk-GTR2WUBA.js} +1 -1
  220. package/dist/{chunk-BT2MVGHT.js → chunk-GTR5NLVP.js} +2 -2
  221. package/dist/{chunk-J22HD2PB.js → chunk-GUIZDI5T.js} +6 -6
  222. package/dist/{chunk-ULJAOMJA.js → chunk-GXK4CUAB.js} +4 -4
  223. package/dist/{chunk-XN7NSPE6.js → chunk-HCCSAECI.js} +2 -2
  224. package/dist/{chunk-22FFOHPT.js → chunk-HJTTDLF6.js} +11 -11
  225. package/dist/{chunk-YEROLKOA.js → chunk-HSQRYJ4P.js} +15 -15
  226. package/dist/{chunk-73WI7FL2.js → chunk-HTKVYEVB.js} +19 -19
  227. package/dist/{chunk-4RMN4E2Y.js → chunk-HXZIX7MR.js} +11 -11
  228. package/dist/{chunk-DJFTH2DI.js → chunk-I57HZMMA.js} +2 -2
  229. package/dist/{chunk-3GU7AWG7.js → chunk-I74J2UZ2.js} +19 -19
  230. package/dist/{chunk-FDAV72IX.js → chunk-IC7KNOBB.js} +7 -7
  231. package/dist/{chunk-5TLEWXAB.js → chunk-IKQMSROV.js} +1 -13
  232. package/dist/chunk-IKQMSROV.js.map +1 -0
  233. package/dist/{chunk-TIQPKOFW.js → chunk-IWIMIRV3.js} +4 -4
  234. package/dist/{chunk-U6MPB3K6.js → chunk-JI6WPLZB.js} +9 -9
  235. package/dist/{chunk-GT7JFQ4E.js → chunk-JJ7VMIEQ.js} +119 -119
  236. package/dist/{chunk-GDLDBR6B.js → chunk-JQKURO3S.js} +2 -2
  237. package/dist/{chunk-O2SBHS2N.js → chunk-K4FDZVMQ.js} +2 -2
  238. package/dist/{chunk-JXT5QDJC.js → chunk-KNFDWNCH.js} +5 -5
  239. package/dist/{chunk-TLL22FFO.js → chunk-KUO5WFXG.js} +2 -2
  240. package/dist/{chunk-KUNFUSZ7.js → chunk-KVMFT6FN.js} +2 -2
  241. package/dist/{chunk-5W6ZDKRR.js → chunk-KW53DBY7.js} +5 -5
  242. package/dist/{chunk-5DSKMG2I.js → chunk-LEXPBQ56.js} +4 -4
  243. package/dist/{chunk-3RMKPHBL.js → chunk-LG67ZNRU.js} +3 -3
  244. package/dist/{chunk-WKHUZIOW.js → chunk-LJZNHDKI.js} +2 -2
  245. package/dist/{chunk-4YXAQMTD.js → chunk-LR7U3HCD.js} +12 -12
  246. package/dist/{chunk-2FPS5H2D.js → chunk-M5E3CKSE.js} +2 -2
  247. package/dist/{chunk-3PEXVG4D.js → chunk-M7A226EQ.js} +2 -2
  248. package/dist/{chunk-PO3BH3KQ.js → chunk-M7YEZR6X.js} +2 -2
  249. package/dist/{chunk-YYCOSTUU.js → chunk-MB2DTUEG.js} +17 -17
  250. package/dist/{chunk-HQWVDQXW.js → chunk-MDRLP5DO.js} +7 -7
  251. package/dist/{chunk-ACL2V2KE.js → chunk-MHIYYHCL.js} +23 -23
  252. package/dist/{chunk-JQCGPTZ6.js → chunk-MM7OKOTE.js} +9 -9
  253. package/dist/{chunk-5W7KJ5NQ.js → chunk-MY6VZVCP.js} +37 -37
  254. package/dist/{chunk-CMLJSF2F.js → chunk-NF6Q4XTN.js} +11 -11
  255. package/dist/{chunk-EYS4ZOF5.js → chunk-NML44AW2.js} +2 -2
  256. package/dist/{chunk-QFMLAT7L.js → chunk-NPDL4W4Y.js} +183 -183
  257. package/dist/{chunk-TL7BOFFL.js → chunk-NURA4KUR.js} +3 -3
  258. package/dist/{chunk-3STBLX4O.js → chunk-NV5OYV3G.js} +8 -8
  259. package/dist/{chunk-MIECLOQC.js → chunk-NZMQDUOD.js} +7 -7
  260. package/dist/{chunk-SSOO4GWN.js → chunk-O4AWXTZQ.js} +116 -116
  261. package/dist/{chunk-SSOO4GWN.js.map → chunk-O4AWXTZQ.js.map} +1 -1
  262. package/dist/{chunk-CP7ZQHBW.js → chunk-O4DYOSOL.js} +13 -13
  263. package/dist/{chunk-VH5EGTH2.js → chunk-O5UOCMH4.js} +3 -3
  264. package/dist/{chunk-Y5BSA3I7.js → chunk-O73DRA77.js} +5 -5
  265. package/dist/{chunk-GRSODLVO.js → chunk-OANSIX34.js} +4 -4
  266. package/dist/{chunk-RQNZDTKT.js → chunk-OHG2UQ2O.js} +16 -16
  267. package/dist/{chunk-5JHRMUAZ.js → chunk-OLUG4IFF.js} +12 -12
  268. package/dist/{chunk-EPWD4KRA.js → chunk-OOEO4MKY.js} +2 -2
  269. package/dist/{chunk-7NPCEBZE.js → chunk-OWJD3V4V.js} +5 -5
  270. package/dist/{chunk-4HEXNAFI.js → chunk-PEGNFZ3F.js} +19 -19
  271. package/dist/chunk-PEGNFZ3F.js.map +1 -0
  272. package/dist/{chunk-CDEXRJB6.js → chunk-PEKPWK5M.js} +4 -4
  273. package/dist/{chunk-FWYEZ3LE.js → chunk-PQCFW2KT.js} +35 -35
  274. package/dist/{chunk-LMPTC4CX.js → chunk-QLDMF7MH.js} +2 -2
  275. package/dist/{chunk-JM4HQPAI.js → chunk-QZRDCFHI.js} +5 -5
  276. package/dist/{chunk-DYJGYGPB.js → chunk-R5YZ3ROM.js} +2 -2
  277. package/dist/{chunk-I6KIQKU6.js → chunk-RABKQFTA.js} +3 -3
  278. package/dist/{chunk-7FJMRJDG.js → chunk-RNBH5TSM.js} +2 -2
  279. package/dist/{chunk-J7FBBLHF.js → chunk-RXMIXKB3.js} +37 -37
  280. package/dist/{chunk-JFK7NTEA.js → chunk-S6WJ6TUT.js} +7 -1
  281. package/dist/{chunk-JFK7NTEA.js.map → chunk-S6WJ6TUT.js.map} +1 -1
  282. package/dist/{chunk-A4BD4ZVB.js → chunk-S7PVL7XH.js} +4 -4
  283. package/dist/{chunk-4LPA25NQ.js → chunk-SD2K5ZN5.js} +4 -4
  284. package/dist/{chunk-UXXFMF4X.js → chunk-SJPAKWWP.js} +2 -2
  285. package/dist/{chunk-FRP64DEK.js → chunk-SK57RWSA.js} +2 -2
  286. package/dist/{chunk-ZS2UQ3DV.js → chunk-SOXZ4LGS.js} +4 -4
  287. package/dist/{chunk-WSZQNTVN.js → chunk-SSZROOOI.js} +2 -2
  288. package/dist/{chunk-MCTTONOW.js → chunk-TM2ZLY3Q.js} +26 -26
  289. package/dist/{chunk-J5MEDX7C.js → chunk-U47YDYLQ.js} +8 -8
  290. package/dist/{chunk-TV6BWONY.js → chunk-UHMMRQGU.js} +3 -3
  291. package/dist/{chunk-YVBHGMKC.js → chunk-VAIESMPY.js} +4 -4
  292. package/dist/{chunk-WCMG4HYI.js → chunk-W57QFLQD.js} +10 -10
  293. package/dist/{chunk-RYSRFAHN.js → chunk-WLZVXCPZ.js} +20 -20
  294. package/dist/{chunk-PFAUGEV5.js → chunk-WN2MIB4Q.js} +2 -2
  295. package/dist/{chunk-5FA455GR.js → chunk-WNG757ID.js} +4 -4
  296. package/dist/{chunk-G4HQUBO4.js → chunk-WSLPZ43N.js} +12 -12
  297. package/dist/{chunk-QXEDIDBZ.js → chunk-WWM7WVD2.js} +2 -2
  298. package/dist/{chunk-V4QZ7UBK.js → chunk-WYEPUXGL.js} +2 -2
  299. package/dist/{chunk-AX6YJA5U.js → chunk-X7Z4B5GK.js} +2 -2
  300. package/dist/{chunk-GZS37O3G.js → chunk-XDCZBOEY.js} +1 -1
  301. package/dist/{chunk-52WK2GGK.js → chunk-XGE75VPK.js} +8 -8
  302. package/dist/{chunk-XMNUZUUA.js → chunk-Z2DAWUO3.js} +6 -6
  303. package/dist/{chunk-BCM7C3MJ.js → chunk-Z4GJB24B.js} +8 -8
  304. package/dist/{chunk-LT4J7RHI.js → chunk-ZPZYYSHW.js} +12 -12
  305. package/dist/{chunk-GHHM6WN4.js → chunk-ZRB4M3GG.js} +4 -4
  306. package/dist/{chunk-FFNPUSVO.js → chunk-ZWACUOU5.js} +7 -7
  307. package/dist/{chunk-ZEIFJ6PX.js → chunk-ZZUKJ5HQ.js} +7 -7
  308. package/dist/composer.js +13 -13
  309. package/dist/{computer-viewer-25AJIDYA.js → computer-viewer-BWVNDFTO.js} +8 -8
  310. package/dist/connect.js +11 -11
  311. package/dist/desktop.js +2 -2
  312. package/dist/editor.js +2 -2
  313. package/dist/{embedded-new-voice-RZZEJT6M.js → embedded-new-voice-GBXSZ3TO.js} +8 -8
  314. package/dist/{embedded-voice-6OKSSPLW.js → embedded-voice-MGI7EK7C.js} +8 -8
  315. package/dist/{fleet-decision-row-NN2HXDX3.js → fleet-decision-row-35S3GAUN.js} +2 -2
  316. package/dist/index.js +220 -220
  317. package/dist/interaction.js +9 -9
  318. package/dist/{latest-question-2PFWQSSG.js → latest-question-4WDBECXB.js} +2 -2
  319. package/dist/machines.js +4 -4
  320. package/dist/messages/en.d.ts +6 -0
  321. package/dist/messages.js +1 -1
  322. package/dist/{model-policy-picker-menu-VVFGGAI6.js → model-policy-picker-menu-KP53N6UJ.js} +6 -6
  323. package/dist/native-previews.js +3 -3
  324. package/dist/{platform-activity-row-ENQVIFTL.js → platform-activity-row-ISMXR7NJ.js} +2 -2
  325. package/dist/{queue-surface-implementation-4SHOQPQQ.js → queue-surface-implementation-ULW7DDJA.js} +7 -7
  326. package/dist/realtime.js +7 -7
  327. package/dist/{sandbox-files-CCOTGXXA.js → sandbox-files-QYSD4XCZ.js} +10 -10
  328. package/dist/session-agents-model.d.ts +23 -1
  329. package/dist/session-agents-model.js +6 -1
  330. package/dist/session-app.js +265 -265
  331. package/dist/session-list-model.js +2 -2
  332. package/dist/{session-realtime-JNKDSGH7.js → session-realtime-JXRLPNUH.js} +3 -3
  333. package/dist/session-realtime.js +2 -2
  334. package/dist/session-ui.js +68 -68
  335. package/dist/session.js +22 -22
  336. package/dist/sites.js +2 -2
  337. package/dist/terminal.js +2 -2
  338. package/dist/this-computer.js +3 -3
  339. package/dist/{timeline-annotation-markers-KHNYNY2J.js → timeline-annotation-markers-OJYKHBEO.js} +5 -5
  340. package/dist/{timeline-annotation-selection-AXEDJHBP.js → timeline-annotation-selection-6OAZLXFU.js} +7 -7
  341. package/dist/{timeline-annotations-dialog-AV4ZBXRC.js → timeline-annotations-dialog-5M6DP5FX.js} +9 -9
  342. package/dist/timeline-model.js +27 -27
  343. package/dist/ui/access-list.js +20 -20
  344. package/dist/ui/choice-cards.js +2 -2
  345. package/dist/ui/detail-page.js +2 -2
  346. package/dist/ui/detail-sheet.js +2 -2
  347. package/dist/ui/diff-view.js +2 -2
  348. package/dist/ui/disclosure.js +4 -4
  349. package/dist/ui/flush-form-page.js +3 -3
  350. package/dist/ui/form-dialog.js +2 -2
  351. package/dist/ui/list-row.js +5 -5
  352. package/dist/ui/revision-history.js +11 -11
  353. package/dist/ui/role-select.js +6 -6
  354. package/dist/ui/settings-nav.js +3 -3
  355. package/dist/usage.js +2 -2
  356. package/dist/workbench.js +11 -11
  357. package/package.json +4 -4
  358. package/src/app/components/session/subagents.tsx +6 -28
  359. package/src/app/lib/format.tsx +2 -17
  360. package/src/messages/en.ts +6 -0
  361. package/src/session-agents-model.ts +75 -1
  362. package/dist/chunk-4GLLWX33.js.map +0 -1
  363. package/dist/chunk-4HEXNAFI.js.map +0 -1
  364. package/dist/chunk-5TLEWXAB.js.map +0 -1
  365. package/dist/chunk-7TCT7KPQ.js.map +0 -1
  366. package/dist/chunk-IE5YUCOT.js +0 -26
  367. package/dist/chunk-IE5YUCOT.js.map +0 -1
  368. package/dist/chunk-S2U4CDAC.js.map +0 -1
  369. package/dist/chunk-YV56F4UP.js.map +0 -1
  370. /package/dist/{browser-viewer-QMCNV4RI.js.map → browser-viewer-YQC6BFMS.js.map} +0 -0
  371. /package/dist/{chat-interactive-block-PMIAUXSO.js.map → chat-interactive-block-Z22YHDRU.js.map} +0 -0
  372. /package/dist/{chunk-YJPKDRI2.js.map → chunk-24POWVUY.js.map} +0 -0
  373. /package/dist/{chunk-35BC2FU2.js.map → chunk-26P7B46A.js.map} +0 -0
  374. /package/dist/{chunk-ZVVT72MT.js.map → chunk-27EORKJ4.js.map} +0 -0
  375. /package/dist/{chunk-2NC7NZCE.js.map → chunk-2K27S6LK.js.map} +0 -0
  376. /package/dist/{chunk-2QBYDGWO.js.map → chunk-2LUO22FR.js.map} +0 -0
  377. /package/dist/{chunk-FSP334UU.js.map → chunk-2SZ3KC5S.js.map} +0 -0
  378. /package/dist/{chunk-3X5FKDYQ.js.map → chunk-32HA7DXJ.js.map} +0 -0
  379. /package/dist/{chunk-CFFNT2OY.js.map → chunk-3GLAPCVI.js.map} +0 -0
  380. /package/dist/{chunk-PCJLH45G.js.map → chunk-3MQM4ZOC.js.map} +0 -0
  381. /package/dist/{chunk-BXQYAAVE.js.map → chunk-3XOISKZC.js.map} +0 -0
  382. /package/dist/{chunk-IDXTASGN.js.map → chunk-3ZZOE4SN.js.map} +0 -0
  383. /package/dist/{chunk-N3ZP4IDU.js.map → chunk-45WYYFP6.js.map} +0 -0
  384. /package/dist/{chunk-NEK4WB5P.js.map → chunk-467VRP4E.js.map} +0 -0
  385. /package/dist/{chunk-PCFK7HKD.js.map → chunk-4BF3DD6R.js.map} +0 -0
  386. /package/dist/{chunk-552UYIQ7.js.map → chunk-4ICPJZAB.js.map} +0 -0
  387. /package/dist/{chunk-ITX2TB4K.js.map → chunk-4PC7LIQK.js.map} +0 -0
  388. /package/dist/{chunk-D5OWJZQR.js.map → chunk-4RY64KQY.js.map} +0 -0
  389. /package/dist/{chunk-PUTS4DYW.js.map → chunk-4VJOZJDV.js.map} +0 -0
  390. /package/dist/{chunk-7P4AQMGA.js.map → chunk-4XKT4ENZ.js.map} +0 -0
  391. /package/dist/{chunk-4VK2R5QC.js.map → chunk-4XO346BW.js.map} +0 -0
  392. /package/dist/{chunk-IBA5FMRE.js.map → chunk-65K5LV4L.js.map} +0 -0
  393. /package/dist/{chunk-5Y2FPLZE.js.map → chunk-6JF7C3U3.js.map} +0 -0
  394. /package/dist/{chunk-LQ47YL6E.js.map → chunk-6K3WNTRI.js.map} +0 -0
  395. /package/dist/{chunk-UUGR3X5I.js.map → chunk-6MRY2RUZ.js.map} +0 -0
  396. /package/dist/{chunk-CCR33J7L.js.map → chunk-6N7W3TOV.js.map} +0 -0
  397. /package/dist/{chunk-ILDOW2IQ.js.map → chunk-6PQBKMUL.js.map} +0 -0
  398. /package/dist/{chunk-SY2AAZNB.js.map → chunk-6VITVQ23.js.map} +0 -0
  399. /package/dist/{chunk-AIEXYO2X.js.map → chunk-6YDXUE5H.js.map} +0 -0
  400. /package/dist/{chunk-GXW2I2M2.js.map → chunk-72XEFLMD.js.map} +0 -0
  401. /package/dist/{chunk-KEXYBG7Q.js.map → chunk-74NIHMAT.js.map} +0 -0
  402. /package/dist/{chunk-FTX5CNHA.js.map → chunk-767WCGAX.js.map} +0 -0
  403. /package/dist/{chunk-5MJHH72T.js.map → chunk-7EGWIME2.js.map} +0 -0
  404. /package/dist/{chunk-Z7IGO5EA.js.map → chunk-7H2D4VNU.js.map} +0 -0
  405. /package/dist/{chunk-EJ7WARW7.js.map → chunk-7J7PZB4S.js.map} +0 -0
  406. /package/dist/{chunk-4SAGYEVB.js.map → chunk-7JZSFJHB.js.map} +0 -0
  407. /package/dist/{chunk-AJPW3SV4.js.map → chunk-7OIBLMDP.js.map} +0 -0
  408. /package/dist/{chunk-SM5QX6UK.js.map → chunk-A2EWJQXX.js.map} +0 -0
  409. /package/dist/{chunk-5YFY4SFC.js.map → chunk-AJ7PY4FJ.js.map} +0 -0
  410. /package/dist/{chunk-RFLYID6H.js.map → chunk-AT4K4F6S.js.map} +0 -0
  411. /package/dist/{chunk-3ABPIUCK.js.map → chunk-B254JG72.js.map} +0 -0
  412. /package/dist/{chunk-TJQDL3JH.js.map → chunk-BPD4IJBG.js.map} +0 -0
  413. /package/dist/{chunk-S37GP7LX.js.map → chunk-BQWUXC55.js.map} +0 -0
  414. /package/dist/{chunk-DGLRZMXL.js.map → chunk-BWKZEW6K.js.map} +0 -0
  415. /package/dist/{chunk-LF5CBAOS.js.map → chunk-C535KSTY.js.map} +0 -0
  416. /package/dist/{chunk-MOKYT3X3.js.map → chunk-C6JL6PBL.js.map} +0 -0
  417. /package/dist/{chunk-4XQC7VLT.js.map → chunk-CA64OZLZ.js.map} +0 -0
  418. /package/dist/{chunk-EQE3MNQN.js.map → chunk-CEQUNJJY.js.map} +0 -0
  419. /package/dist/{chunk-JO6R5EXF.js.map → chunk-CKA4SJRK.js.map} +0 -0
  420. /package/dist/{chunk-LHLK7FUA.js.map → chunk-CPKD2YGK.js.map} +0 -0
  421. /package/dist/{chunk-5FEN3KYH.js.map → chunk-D4QOZXPM.js.map} +0 -0
  422. /package/dist/{chunk-UP7I3W6O.js.map → chunk-DAQG3C4W.js.map} +0 -0
  423. /package/dist/{chunk-RIYZFKIM.js.map → chunk-DNLXQUBX.js.map} +0 -0
  424. /package/dist/{chunk-UYNCMZX5.js.map → chunk-DNWBLT4U.js.map} +0 -0
  425. /package/dist/{chunk-MXLKI7BI.js.map → chunk-DNYD7AUG.js.map} +0 -0
  426. /package/dist/{chunk-7KIENXRE.js.map → chunk-DZH2HTTB.js.map} +0 -0
  427. /package/dist/{chunk-CD3MO3IC.js.map → chunk-E36IC3LU.js.map} +0 -0
  428. /package/dist/{chunk-Z6E6TUAE.js.map → chunk-EURDMOXZ.js.map} +0 -0
  429. /package/dist/{chunk-22JFMNMF.js.map → chunk-F2RMKGDQ.js.map} +0 -0
  430. /package/dist/{chunk-62VER7O4.js.map → chunk-F3NERYBQ.js.map} +0 -0
  431. /package/dist/{chunk-YXA2EKV3.js.map → chunk-F4B2YYCN.js.map} +0 -0
  432. /package/dist/{chunk-ENS6E4RZ.js.map → chunk-FH75NNLB.js.map} +0 -0
  433. /package/dist/{chunk-GGV4NSG3.js.map → chunk-FMATVQFW.js.map} +0 -0
  434. /package/dist/{chunk-7XO7YKPC.js.map → chunk-FVCLVASD.js.map} +0 -0
  435. /package/dist/{chunk-HU6JTNWF.js.map → chunk-GMVKCEBG.js.map} +0 -0
  436. /package/dist/{chunk-SWCLN6JE.js.map → chunk-GRNE5ANU.js.map} +0 -0
  437. /package/dist/{chunk-FWOBNL2A.js.map → chunk-GTR2WUBA.js.map} +0 -0
  438. /package/dist/{chunk-BT2MVGHT.js.map → chunk-GTR5NLVP.js.map} +0 -0
  439. /package/dist/{chunk-J22HD2PB.js.map → chunk-GUIZDI5T.js.map} +0 -0
  440. /package/dist/{chunk-ULJAOMJA.js.map → chunk-GXK4CUAB.js.map} +0 -0
  441. /package/dist/{chunk-XN7NSPE6.js.map → chunk-HCCSAECI.js.map} +0 -0
  442. /package/dist/{chunk-22FFOHPT.js.map → chunk-HJTTDLF6.js.map} +0 -0
  443. /package/dist/{chunk-YEROLKOA.js.map → chunk-HSQRYJ4P.js.map} +0 -0
  444. /package/dist/{chunk-73WI7FL2.js.map → chunk-HTKVYEVB.js.map} +0 -0
  445. /package/dist/{chunk-4RMN4E2Y.js.map → chunk-HXZIX7MR.js.map} +0 -0
  446. /package/dist/{chunk-DJFTH2DI.js.map → chunk-I57HZMMA.js.map} +0 -0
  447. /package/dist/{chunk-3GU7AWG7.js.map → chunk-I74J2UZ2.js.map} +0 -0
  448. /package/dist/{chunk-FDAV72IX.js.map → chunk-IC7KNOBB.js.map} +0 -0
  449. /package/dist/{chunk-TIQPKOFW.js.map → chunk-IWIMIRV3.js.map} +0 -0
  450. /package/dist/{chunk-U6MPB3K6.js.map → chunk-JI6WPLZB.js.map} +0 -0
  451. /package/dist/{chunk-GT7JFQ4E.js.map → chunk-JJ7VMIEQ.js.map} +0 -0
  452. /package/dist/{chunk-GDLDBR6B.js.map → chunk-JQKURO3S.js.map} +0 -0
  453. /package/dist/{chunk-O2SBHS2N.js.map → chunk-K4FDZVMQ.js.map} +0 -0
  454. /package/dist/{chunk-JXT5QDJC.js.map → chunk-KNFDWNCH.js.map} +0 -0
  455. /package/dist/{chunk-TLL22FFO.js.map → chunk-KUO5WFXG.js.map} +0 -0
  456. /package/dist/{chunk-KUNFUSZ7.js.map → chunk-KVMFT6FN.js.map} +0 -0
  457. /package/dist/{chunk-5W6ZDKRR.js.map → chunk-KW53DBY7.js.map} +0 -0
  458. /package/dist/{chunk-5DSKMG2I.js.map → chunk-LEXPBQ56.js.map} +0 -0
  459. /package/dist/{chunk-3RMKPHBL.js.map → chunk-LG67ZNRU.js.map} +0 -0
  460. /package/dist/{chunk-WKHUZIOW.js.map → chunk-LJZNHDKI.js.map} +0 -0
  461. /package/dist/{chunk-4YXAQMTD.js.map → chunk-LR7U3HCD.js.map} +0 -0
  462. /package/dist/{chunk-2FPS5H2D.js.map → chunk-M5E3CKSE.js.map} +0 -0
  463. /package/dist/{chunk-3PEXVG4D.js.map → chunk-M7A226EQ.js.map} +0 -0
  464. /package/dist/{chunk-PO3BH3KQ.js.map → chunk-M7YEZR6X.js.map} +0 -0
  465. /package/dist/{chunk-YYCOSTUU.js.map → chunk-MB2DTUEG.js.map} +0 -0
  466. /package/dist/{chunk-HQWVDQXW.js.map → chunk-MDRLP5DO.js.map} +0 -0
  467. /package/dist/{chunk-ACL2V2KE.js.map → chunk-MHIYYHCL.js.map} +0 -0
  468. /package/dist/{chunk-JQCGPTZ6.js.map → chunk-MM7OKOTE.js.map} +0 -0
  469. /package/dist/{chunk-5W7KJ5NQ.js.map → chunk-MY6VZVCP.js.map} +0 -0
  470. /package/dist/{chunk-CMLJSF2F.js.map → chunk-NF6Q4XTN.js.map} +0 -0
  471. /package/dist/{chunk-EYS4ZOF5.js.map → chunk-NML44AW2.js.map} +0 -0
  472. /package/dist/{chunk-QFMLAT7L.js.map → chunk-NPDL4W4Y.js.map} +0 -0
  473. /package/dist/{chunk-TL7BOFFL.js.map → chunk-NURA4KUR.js.map} +0 -0
  474. /package/dist/{chunk-3STBLX4O.js.map → chunk-NV5OYV3G.js.map} +0 -0
  475. /package/dist/{chunk-MIECLOQC.js.map → chunk-NZMQDUOD.js.map} +0 -0
  476. /package/dist/{chunk-CP7ZQHBW.js.map → chunk-O4DYOSOL.js.map} +0 -0
  477. /package/dist/{chunk-VH5EGTH2.js.map → chunk-O5UOCMH4.js.map} +0 -0
  478. /package/dist/{chunk-Y5BSA3I7.js.map → chunk-O73DRA77.js.map} +0 -0
  479. /package/dist/{chunk-GRSODLVO.js.map → chunk-OANSIX34.js.map} +0 -0
  480. /package/dist/{chunk-RQNZDTKT.js.map → chunk-OHG2UQ2O.js.map} +0 -0
  481. /package/dist/{chunk-5JHRMUAZ.js.map → chunk-OLUG4IFF.js.map} +0 -0
  482. /package/dist/{chunk-EPWD4KRA.js.map → chunk-OOEO4MKY.js.map} +0 -0
  483. /package/dist/{chunk-7NPCEBZE.js.map → chunk-OWJD3V4V.js.map} +0 -0
  484. /package/dist/{chunk-CDEXRJB6.js.map → chunk-PEKPWK5M.js.map} +0 -0
  485. /package/dist/{chunk-FWYEZ3LE.js.map → chunk-PQCFW2KT.js.map} +0 -0
  486. /package/dist/{chunk-LMPTC4CX.js.map → chunk-QLDMF7MH.js.map} +0 -0
  487. /package/dist/{chunk-JM4HQPAI.js.map → chunk-QZRDCFHI.js.map} +0 -0
  488. /package/dist/{chunk-DYJGYGPB.js.map → chunk-R5YZ3ROM.js.map} +0 -0
  489. /package/dist/{chunk-I6KIQKU6.js.map → chunk-RABKQFTA.js.map} +0 -0
  490. /package/dist/{chunk-7FJMRJDG.js.map → chunk-RNBH5TSM.js.map} +0 -0
  491. /package/dist/{chunk-J7FBBLHF.js.map → chunk-RXMIXKB3.js.map} +0 -0
  492. /package/dist/{chunk-A4BD4ZVB.js.map → chunk-S7PVL7XH.js.map} +0 -0
  493. /package/dist/{chunk-4LPA25NQ.js.map → chunk-SD2K5ZN5.js.map} +0 -0
  494. /package/dist/{chunk-UXXFMF4X.js.map → chunk-SJPAKWWP.js.map} +0 -0
  495. /package/dist/{chunk-FRP64DEK.js.map → chunk-SK57RWSA.js.map} +0 -0
  496. /package/dist/{chunk-ZS2UQ3DV.js.map → chunk-SOXZ4LGS.js.map} +0 -0
  497. /package/dist/{chunk-WSZQNTVN.js.map → chunk-SSZROOOI.js.map} +0 -0
  498. /package/dist/{chunk-MCTTONOW.js.map → chunk-TM2ZLY3Q.js.map} +0 -0
  499. /package/dist/{chunk-J5MEDX7C.js.map → chunk-U47YDYLQ.js.map} +0 -0
  500. /package/dist/{chunk-TV6BWONY.js.map → chunk-UHMMRQGU.js.map} +0 -0
  501. /package/dist/{chunk-YVBHGMKC.js.map → chunk-VAIESMPY.js.map} +0 -0
  502. /package/dist/{chunk-WCMG4HYI.js.map → chunk-W57QFLQD.js.map} +0 -0
  503. /package/dist/{chunk-RYSRFAHN.js.map → chunk-WLZVXCPZ.js.map} +0 -0
  504. /package/dist/{chunk-PFAUGEV5.js.map → chunk-WN2MIB4Q.js.map} +0 -0
  505. /package/dist/{chunk-5FA455GR.js.map → chunk-WNG757ID.js.map} +0 -0
  506. /package/dist/{chunk-G4HQUBO4.js.map → chunk-WSLPZ43N.js.map} +0 -0
  507. /package/dist/{chunk-QXEDIDBZ.js.map → chunk-WWM7WVD2.js.map} +0 -0
  508. /package/dist/{chunk-V4QZ7UBK.js.map → chunk-WYEPUXGL.js.map} +0 -0
  509. /package/dist/{chunk-AX6YJA5U.js.map → chunk-X7Z4B5GK.js.map} +0 -0
  510. /package/dist/{chunk-GZS37O3G.js.map → chunk-XDCZBOEY.js.map} +0 -0
  511. /package/dist/{chunk-52WK2GGK.js.map → chunk-XGE75VPK.js.map} +0 -0
  512. /package/dist/{chunk-XMNUZUUA.js.map → chunk-Z2DAWUO3.js.map} +0 -0
  513. /package/dist/{chunk-BCM7C3MJ.js.map → chunk-Z4GJB24B.js.map} +0 -0
  514. /package/dist/{chunk-LT4J7RHI.js.map → chunk-ZPZYYSHW.js.map} +0 -0
  515. /package/dist/{chunk-GHHM6WN4.js.map → chunk-ZRB4M3GG.js.map} +0 -0
  516. /package/dist/{chunk-FFNPUSVO.js.map → chunk-ZWACUOU5.js.map} +0 -0
  517. /package/dist/{chunk-ZEIFJ6PX.js.map → chunk-ZZUKJ5HQ.js.map} +0 -0
  518. /package/dist/{computer-viewer-25AJIDYA.js.map → computer-viewer-BWVNDFTO.js.map} +0 -0
  519. /package/dist/{embedded-new-voice-RZZEJT6M.js.map → embedded-new-voice-GBXSZ3TO.js.map} +0 -0
  520. /package/dist/{embedded-voice-6OKSSPLW.js.map → embedded-voice-MGI7EK7C.js.map} +0 -0
  521. /package/dist/{fleet-decision-row-NN2HXDX3.js.map → fleet-decision-row-35S3GAUN.js.map} +0 -0
  522. /package/dist/{latest-question-2PFWQSSG.js.map → latest-question-4WDBECXB.js.map} +0 -0
  523. /package/dist/{model-policy-picker-menu-VVFGGAI6.js.map → model-policy-picker-menu-KP53N6UJ.js.map} +0 -0
  524. /package/dist/{platform-activity-row-ENQVIFTL.js.map → platform-activity-row-ISMXR7NJ.js.map} +0 -0
  525. /package/dist/{queue-surface-implementation-4SHOQPQQ.js.map → queue-surface-implementation-ULW7DDJA.js.map} +0 -0
  526. /package/dist/{sandbox-files-CCOTGXXA.js.map → sandbox-files-QYSD4XCZ.js.map} +0 -0
  527. /package/dist/{session-realtime-JNKDSGH7.js.map → session-realtime-JXRLPNUH.js.map} +0 -0
  528. /package/dist/{timeline-annotation-markers-KHNYNY2J.js.map → timeline-annotation-markers-OJYKHBEO.js.map} +0 -0
  529. /package/dist/{timeline-annotation-selection-AXEDJHBP.js.map → timeline-annotation-selection-6OAZLXFU.js.map} +0 -0
  530. /package/dist/{timeline-annotations-dialog-AV4ZBXRC.js.map → timeline-annotations-dialog-5M6DP5FX.js.map} +0 -0
@@ -3,12 +3,12 @@ import {
3
3
  FLUSH_DETAIL_PAGE_CLASS,
4
4
  FLUSH_FORM_PAGE_CLASS,
5
5
  FlushFormPage
6
- } from "../chunk-EPWD4KRA.js";
7
- import "../chunk-A4BD4ZVB.js";
6
+ } from "../chunk-OOEO4MKY.js";
7
+ import "../chunk-S7PVL7XH.js";
8
8
  import "../chunk-WHWUWN2X.js";
9
9
  import "../chunk-ZMBJPN4T.js";
10
- import "../chunk-HY7EYWIG.js";
11
10
  import "../chunk-L4OF77LE.js";
11
+ import "../chunk-HY7EYWIG.js";
12
12
  import "../chunk-WLEDGIVS.js";
13
13
  import "../chunk-HMU5IELG.js";
14
14
  import "../chunk-J3BHDXQQ.js";
@@ -7,11 +7,11 @@ import {
7
7
  FormPage,
8
8
  firstFormField,
9
9
  useFormOverlay
10
- } from "../chunk-A4BD4ZVB.js";
10
+ } from "../chunk-S7PVL7XH.js";
11
11
  import "../chunk-WHWUWN2X.js";
12
12
  import "../chunk-ZMBJPN4T.js";
13
- import "../chunk-HY7EYWIG.js";
14
13
  import "../chunk-L4OF77LE.js";
14
+ import "../chunk-HY7EYWIG.js";
15
15
  import "../chunk-WLEDGIVS.js";
16
16
  import "../chunk-HMU5IELG.js";
17
17
  import "../chunk-J3BHDXQQ.js";
@@ -5,14 +5,14 @@ import {
5
5
  RowIndicator,
6
6
  RowList,
7
7
  useRowListVariant
8
- } from "../chunk-JQCGPTZ6.js";
9
- import "../chunk-TREHTIBD.js";
8
+ } from "../chunk-MM7OKOTE.js";
10
9
  import "../chunk-FQQEZUSN.js";
11
- import "../chunk-5OTQA7CM.js";
12
- import "../chunk-XG57V2BN.js";
13
- import "../chunk-KS57MLGE.js";
14
10
  import "../chunk-ZMBJPN4T.js";
15
11
  import "../chunk-HY7EYWIG.js";
12
+ import "../chunk-XG57V2BN.js";
13
+ import "../chunk-KS57MLGE.js";
14
+ import "../chunk-TREHTIBD.js";
15
+ import "../chunk-5OTQA7CM.js";
16
16
  import "../chunk-J3BHDXQQ.js";
17
17
  import "../chunk-TXS65BB2.js";
18
18
  export {
@@ -2,30 +2,30 @@
2
2
  import {
3
3
  DiffView,
4
4
  failedLoadParts
5
- } from "../chunk-BXQYAAVE.js";
5
+ } from "../chunk-3XOISKZC.js";
6
6
  import {
7
7
  InlineDisabledReason
8
8
  } from "../chunk-TFK4KFKA.js";
9
9
  import {
10
10
  MetaChip
11
11
  } from "../chunk-SS3N75VI.js";
12
- import "../chunk-XNTW77T6.js";
13
- import "../chunk-X6WZOHBI.js";
14
- import "../chunk-5OTQA7CM.js";
15
- import {
16
- RelativeTime
17
- } from "../chunk-XG57V2BN.js";
18
- import {
19
- DisabledReason
20
- } from "../chunk-KS57MLGE.js";
21
12
  import {
22
13
  ErrorMessage
23
14
  } from "../chunk-WHWUWN2X.js";
24
15
  import "../chunk-ZMBJPN4T.js";
16
+ import "../chunk-X6WZOHBI.js";
17
+ import "../chunk-L4OF77LE.js";
18
+ import "../chunk-XNTW77T6.js";
25
19
  import {
26
20
  Skeleton
27
21
  } from "../chunk-HY7EYWIG.js";
28
- import "../chunk-L4OF77LE.js";
22
+ import {
23
+ RelativeTime
24
+ } from "../chunk-XG57V2BN.js";
25
+ import {
26
+ DisabledReason
27
+ } from "../chunk-KS57MLGE.js";
28
+ import "../chunk-5OTQA7CM.js";
29
29
  import {
30
30
  Button
31
31
  } from "../chunk-HMU5IELG.js";
@@ -4,16 +4,16 @@ import {
4
4
  RoleSelect,
5
5
  needsEscalationConfirm,
6
6
  roleLabel
7
- } from "../chunk-FDAV72IX.js";
7
+ } from "../chunk-IC7KNOBB.js";
8
8
  import "../chunk-TFK4KFKA.js";
9
- import "../chunk-XNTW77T6.js";
10
- import "../chunk-5OTQA7CM.js";
11
- import "../chunk-KS57MLGE.js";
12
- import "../chunk-A4BD4ZVB.js";
9
+ import "../chunk-S7PVL7XH.js";
13
10
  import "../chunk-WHWUWN2X.js";
14
11
  import "../chunk-ZMBJPN4T.js";
15
- import "../chunk-HY7EYWIG.js";
16
12
  import "../chunk-L4OF77LE.js";
13
+ import "../chunk-XNTW77T6.js";
14
+ import "../chunk-HY7EYWIG.js";
15
+ import "../chunk-KS57MLGE.js";
16
+ import "../chunk-5OTQA7CM.js";
17
17
  import "../chunk-WLEDGIVS.js";
18
18
  import "../chunk-HMU5IELG.js";
19
19
  import "../chunk-J3BHDXQQ.js";
@@ -5,12 +5,12 @@ import {
5
5
  TooltipProvider,
6
6
  TooltipTrigger
7
7
  } from "../chunk-OLTGED2Q.js";
8
- import {
9
- ReasonTooltip
10
- } from "../chunk-KS57MLGE.js";
11
8
  import {
12
9
  Skeleton
13
10
  } from "../chunk-HY7EYWIG.js";
11
+ import {
12
+ ReasonTooltip
13
+ } from "../chunk-KS57MLGE.js";
14
14
  import "../chunk-J3BHDXQQ.js";
15
15
  import {
16
16
  cn
package/dist/usage.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  summarizeUsage,
14
14
  usagePercentLabel,
15
15
  useUsage
16
- } from "./chunk-AJPW3SV4.js";
16
+ } from "./chunk-7OIBLMDP.js";
17
17
  import {
18
18
  DEFAULT_ALLOWANCE_LABELS,
19
19
  DEFAULT_SESSION_USAGE_LIMIT_LABELS,
@@ -30,7 +30,7 @@ import "./chunk-2KO2G3RI.js";
30
30
  import "./chunk-CM7LVUKC.js";
31
31
  import "./chunk-TVQCDDSZ.js";
32
32
  import "./chunk-TXS65BB2.js";
33
- import "./chunk-JFK7NTEA.js";
33
+ import "./chunk-S6WJ6TUT.js";
34
34
  export {
35
35
  DEFAULT_ALLOWANCE_LABELS,
36
36
  DEFAULT_SESSION_USAGE_LIMIT_LABELS,
package/dist/workbench.js CHANGED
@@ -3,24 +3,24 @@ import {
3
3
  enablePierreDiffs
4
4
  } from "./chunk-4WPVEPZF.js";
5
5
  import {
6
- enableSandboxTerminal
7
- } from "./chunk-FPS7ARET.js";
8
- import "./chunk-4VK2R5QC.js";
9
- import "./chunk-QV3DJVRZ.js";
6
+ enableCodeEditor
7
+ } from "./chunk-TOTNIUZK.js";
8
+ import "./chunk-YSRBFJMQ.js";
9
+ import "./chunk-SJPAKWWP.js";
10
10
  import {
11
11
  enableDesktopViewer
12
12
  } from "./chunk-QIOARE4I.js";
13
- import {
14
- enableCodeEditor
15
- } from "./chunk-TOTNIUZK.js";
16
- import "./chunk-UXXFMF4X.js";
17
- import "./chunk-PFAUGEV5.js";
13
+ import "./chunk-WN2MIB4Q.js";
18
14
  import "./chunk-ZUWF4NF7.js";
15
+ import {
16
+ enableSandboxTerminal
17
+ } from "./chunk-FPS7ARET.js";
18
+ import "./chunk-4XO346BW.js";
19
+ import "./chunk-QV3DJVRZ.js";
19
20
  import "./chunk-TNEZNMSN.js";
20
21
  import "./chunk-5I4VRWBB.js";
21
- import "./chunk-YSRBFJMQ.js";
22
22
  import "./chunk-TXS65BB2.js";
23
- import "./chunk-JFK7NTEA.js";
23
+ import "./chunk-S6WJ6TUT.js";
24
24
 
25
25
  // src/workbench.ts
26
26
  function enableWorkbench() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeni/react",
3
- "version": "4.5.0",
3
+ "version": "4.6.1",
4
4
  "description": "React hooks and styled components for Opengeni: live session streaming, chat composer, message timeline, session status, and fleet views — token-themed (CSS variables), dark-first, built on Tailwind v4 + Radix + Motion.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -251,9 +251,9 @@
251
251
  "@dnd-kit/utilities": "3.2.2",
252
252
  "@fontsource-variable/noto-sans-arabic": "5.2.10",
253
253
  "@fontsource-variable/noto-sans-jp": "5.2.10",
254
- "@opengeni/connect": "4.5.0",
255
- "@opengeni/contracts": "4.5.0",
256
- "@opengeni/sdk": "4.5.0",
254
+ "@opengeni/connect": "4.6.1",
255
+ "@opengeni/contracts": "4.6.1",
256
+ "@opengeni/sdk": "4.6.1",
257
257
  "@tanstack/react-virtual": "^3.14.11",
258
258
  "class-variance-authority": "^0.7.1",
259
259
  "clsx": "^2.1.1",
@@ -16,18 +16,14 @@
16
16
  // active, …) never leak into a rendered string.
17
17
  import { t } from "../../lib/console-text";
18
18
  import { formatRelativeTime } from "../../../lib/format";
19
- import {
20
- sessionAdmissionBlocked,
21
- sessionDisplayStatus,
22
- type SessionDisplayStatus,
23
- } from "../../../timeline-model";
19
+ import { sessionDisplayStatus, type SessionDisplayStatus } from "../../../timeline-model";
20
+ import { sessionAgentAttention } from "../../../session-agents-model";
24
21
  import type { LineageNode, SessionStatus, SessionSummary } from "@opengeni/sdk";
25
22
  import { Link } from "../../lib/navigation";
26
23
  import { BotIcon, ChevronRightIcon, EllipsisIcon } from "lucide-react";
27
24
  import { useState, type ReactNode } from "react";
28
25
 
29
26
  import { STATUS_META, StatusDot, type StatusTone } from "../../../ui/status-dot";
30
- import { formatWaitingSince } from "../../lib/format";
31
27
  import { sessionDisplayTitle } from "../../lib/session-rename";
32
28
  import {
33
29
  DropdownMenu,
@@ -53,28 +49,10 @@ export function subagentAttentionHint(
53
49
  paused: boolean,
54
50
  now: Date = new Date(),
55
51
  ): { word: string; waitingFor: string; title?: string | undefined } | null {
56
- if (session.status === "failed") return { word: "Failed", waitingFor: "" };
57
- // The runtime could not start its next step: loud, but not a request of you.
58
- if (sessionAdmissionBlocked(session)) {
59
- return {
60
- word: "Stuck",
61
- waitingFor: "",
62
- title: "Could not start its next step",
63
- };
64
- }
65
- if (session.status === "requires_action") {
66
- const since = session.requiresActionSince ?? null;
67
- const waitingFor = since ? formatWaitingSince(since, now) : "";
68
- return {
69
- word: `Needs you${waitingFor ? ` · ${waitingFor}` : ""}`,
70
- waitingFor,
71
- ...(since
72
- ? { title: `Waiting for your input since ${new Date(since).toLocaleString()}` }
73
- : {}),
74
- };
75
- }
76
- if (paused) return { word: "Paused", waitingFor: "" };
77
- return null;
52
+ const attention = sessionAgentAttention(t, session, paused, now);
53
+ if (!attention) return null;
54
+ const { tone: _tone, ...hint } = attention;
55
+ return hint;
78
56
  }
79
57
 
80
58
  /** Map a session lifecycle status onto the six-tone status language. */
@@ -69,23 +69,8 @@ export function formatBytes(bytes: number): string {
69
69
  return `${bytes} B`;
70
70
  }
71
71
 
72
- /**
73
- * Compact "waiting for" duration since `iso`, e.g. "<1m", "5m", "10h", "3d".
74
- * Unlike the rail's relative-time label it never collapses to "now" or a
75
- * calendar date: a session can wait for input for weeks and the wait should
76
- * keep reading as a duration. Empty for an unparseable timestamp.
77
- */
78
- export function formatWaitingSince(iso: string, now: Date = new Date()): string {
79
- const since = Date.parse(iso);
80
- if (Number.isNaN(since)) return "";
81
- const seconds = Math.max(0, Math.floor((now.getTime() - since) / 1000));
82
- if (seconds < 60) return "<1m";
83
- const minutes = Math.floor(seconds / 60);
84
- if (minutes < 60) return `${minutes}m`;
85
- const hours = Math.floor(minutes / 60);
86
- if (hours < 48) return `${hours}h`;
87
- return `${Math.floor(hours / 24)}d`;
88
- }
72
+ /** Shared with the phone app's sub-agent sheet. */
73
+ export { formatWaitingSince } from "../../session-agents-model";
89
74
 
90
75
  /** Compact elapsed-time label, e.g. "4s", "2m 13s", "1h 04m". */
91
76
  export function formatElapsedSeconds(totalSeconds: number): string {
@@ -2769,8 +2769,14 @@ export const englishMessages = {
2769
2769
  "sessionAdmission.tryAgain": "Try again",
2770
2770
  "sessionAgentsModel.active": "Active",
2771
2771
  "sessionAgentsModel.completed": "Completed",
2772
+ "sessionAgentsModel.couldNotStartItsNextStep": "Could not start its next step",
2773
+ "sessionAgentsModel.failed": "Failed",
2772
2774
  "sessionAgentsModel.idle": "Idle",
2775
+ "sessionAgentsModel.needsYou": "Needs you",
2776
+ "sessionAgentsModel.needsYouFor": "Needs you · {duration}",
2773
2777
  "sessionAgentsModel.paused": "Paused",
2778
+ "sessionAgentsModel.stuck": "Stuck",
2779
+ "sessionAgentsModel.waitingForYourInputSince": "Waiting for your input since {time}",
2774
2780
  "sessionAuthRecommendation.reconnectThisIntegrationToUse":
2775
2781
  "Reconnect this integration to use its tools in this conversation.",
2776
2782
  "sessionAuthRecommendation.reviewPermissionToUseYour":
@@ -1,5 +1,6 @@
1
- import type { LineageNode, SessionGoal } from "@opengeni/sdk";
1
+ import type { LineageNode, SessionGoal, SessionSummary } from "@opengeni/sdk";
2
2
  import { type OpenGeniText } from "./messages/runtime";
3
+ import { sessionAdmissionBlocked } from "./session-status-model";
3
4
 
4
5
  /* Renderer-neutral session chrome signals shared by the web dock and native
5
6
  apps: the sub-agents chip and the goal chip. */
@@ -38,3 +39,76 @@ export function sessionGoalStateLabel(t: OpenGeniText, goal: Pick<SessionGoal, "
38
39
  if (goal.status === "paused") return t("sessionAgentsModel.paused");
39
40
  return t("sessionAgentsModel.active");
40
41
  }
42
+
43
+ /**
44
+ * Compact "waiting for" duration since `iso`, e.g. "<1m", "5m", "10h", "3d".
45
+ * Unlike the rail's relative-time label it never collapses to "now" or a
46
+ * calendar date: a session can wait for input for weeks and the wait should
47
+ * keep reading as a duration. Empty for an unparseable timestamp.
48
+ */
49
+ export function formatWaitingSince(iso: string, now: Date = new Date()): string {
50
+ const since = Date.parse(iso);
51
+ if (Number.isNaN(since)) return "";
52
+ const seconds = Math.max(0, Math.floor((now.getTime() - since) / 1000));
53
+ if (seconds < 60) return "<1m";
54
+ const minutes = Math.floor(seconds / 60);
55
+ if (minutes < 60) return `${minutes}m`;
56
+ const hours = Math.floor(minutes / 60);
57
+ if (hours < 48) return `${hours}h`;
58
+ return `${Math.floor(hours / 24)}d`;
59
+ }
60
+
61
+ /** A sub-agent row's loud trailing word, and the status tone it reads in. */
62
+ export type SessionAgentAttention = {
63
+ word: string;
64
+ /** How long it has waited on you ("10h"), or empty. */
65
+ waitingFor: string;
66
+ tone: "failed" | "waiting";
67
+ title?: string | undefined;
68
+ };
69
+
70
+ /**
71
+ * The word a manager must act on in a sub-agent list, shared by the web panel
72
+ * and the phone sheet: a failed agent, one the runtime could not start, one
73
+ * waiting on you (and for how long, from the server's `requiresActionSince`),
74
+ * or a paused one. Null for calm rows, which show their last update instead.
75
+ */
76
+ export function sessionAgentAttention(
77
+ t: OpenGeniText,
78
+ session: Pick<SessionSummary, "status" | "requiresActionSince" | "admissionBlock">,
79
+ paused: boolean,
80
+ now: Date = new Date(),
81
+ ): SessionAgentAttention | null {
82
+ if (session.status === "failed") {
83
+ return { word: t("sessionAgentsModel.failed"), waitingFor: "", tone: "failed" };
84
+ }
85
+ // The runtime could not start its next step: loud, but not a request of you.
86
+ if (sessionAdmissionBlocked(session)) {
87
+ return {
88
+ word: t("sessionAgentsModel.stuck"),
89
+ waitingFor: "",
90
+ tone: "failed",
91
+ title: t("sessionAgentsModel.couldNotStartItsNextStep"),
92
+ };
93
+ }
94
+ if (session.status === "requires_action") {
95
+ const since = session.requiresActionSince ?? null;
96
+ const waitingFor = since ? formatWaitingSince(since, now) : "";
97
+ return {
98
+ word: waitingFor
99
+ ? t("sessionAgentsModel.needsYouFor", { duration: waitingFor })
100
+ : t("sessionAgentsModel.needsYou"),
101
+ waitingFor,
102
+ tone: "waiting",
103
+ ...(since
104
+ ? {
105
+ title: t("sessionAgentsModel.waitingForYourInputSince", {
106
+ time: new Date(since).toLocaleString(),
107
+ }),
108
+ }
109
+ : {}),
110
+ };
111
+ }
112
+ if (paused) return { word: t("sessionAgentsModel.paused"), waitingFor: "", tone: "waiting" };
113
+ return null;
114
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/components/session/subagents.tsx"],"sourcesContent":["// The subagent-lineage surface: the shared pieces that render a session's\n// spawned workers. It is deliberately DECOUPLED from goals — a session's agent\n// tree is orthogonal to whether it carries a goal. One compact tree component\n// ({@link SubagentTree}) backs its single home:\n// - SessionChrome agents segment (production) — host passes SubagentTree as\n// `agentsPanel`; the dock chip opens that panel in-place.\n// SpawnedByBreadcrumb is the inverse link a child session shows back to the\n// manager that spawned it.\n//\n// Design language: one dense line per agent — a single status-tone dot + a\n// truncated title + a quiet relative-time hint — the whole row a hover-lit\n// deep-link. Grandchildren thread off a hairline rail (one level, expandable),\n// never boxes. Calm at rest; the chevron affordance lifts on hover.\n//\n// Copy doctrine: human language only. Internal status slugs (requires_action,\n// active, …) never leak into a rendered string.\nimport { t } from \"../../lib/console-text\";\nimport { formatRelativeTime } from \"../../../lib/format\";\nimport {\n sessionAdmissionBlocked,\n sessionDisplayStatus,\n type SessionDisplayStatus,\n} from \"../../../timeline-model\";\nimport type { LineageNode, SessionStatus, SessionSummary } from \"@opengeni/sdk\";\nimport { Link } from \"../../lib/navigation\";\nimport { BotIcon, ChevronRightIcon, EllipsisIcon } from \"lucide-react\";\nimport { useState, type ReactNode } from \"react\";\n\nimport { STATUS_META, StatusDot, type StatusTone } from \"../../../ui/status-dot\";\nimport { formatWaitingSince } from \"../../lib/format\";\nimport { sessionDisplayTitle } from \"../../lib/session-rename\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../../../ui/dropdown-menu\";\nimport { cn } from \"../../lib/utils\";\nimport { sessionControlPaused } from \"../../lib/session-rail\";\n\n/** Children (depth 0) plus one level of grandchildren (depth 1) — the tree goes\n exactly one level deeper, so a depth-1 row never draws its own expander. */\nconst MAX_DEPTH = 1;\n\n/**\n * The loud trailing word for a row a manager must act on. A child waiting on a\n * human also says for HOW LONG (\"Needs you · 10h\", from the server's\n * `requiresActionSince`), so a parked child is visible at a glance and the row\n * links straight to where the human answers. Null for calm rows.\n */\nexport function subagentAttentionHint(\n session: Pick<SessionSummary, \"status\" | \"requiresActionSince\" | \"admissionBlock\">,\n paused: boolean,\n now: Date = new Date(),\n): { word: string; waitingFor: string; title?: string | undefined } | null {\n if (session.status === \"failed\") return { word: \"Failed\", waitingFor: \"\" };\n // The runtime could not start its next step: loud, but not a request of you.\n if (sessionAdmissionBlocked(session)) {\n return {\n word: \"Stuck\",\n waitingFor: \"\",\n title: \"Could not start its next step\",\n };\n }\n if (session.status === \"requires_action\") {\n const since = session.requiresActionSince ?? null;\n const waitingFor = since ? formatWaitingSince(since, now) : \"\";\n return {\n word: `Needs you${waitingFor ? ` · ${waitingFor}` : \"\"}`,\n waitingFor,\n ...(since\n ? { title: `Waiting for your input since ${new Date(since).toLocaleString()}` }\n : {}),\n };\n }\n if (paused) return { word: \"Paused\", waitingFor: \"\" };\n return null;\n}\n\n/** Map a session lifecycle status onto the six-tone status language. */\nexport function sessionStatusTone(status: SessionDisplayStatus): StatusTone {\n switch (status) {\n case \"requires_action\":\n return \"waiting\";\n case \"blocked\":\n return \"failed\";\n case \"running\":\n return \"running\";\n case \"queued\":\n return \"queued\";\n case \"failed\":\n return \"failed\";\n case \"cancelled\":\n return \"cancelled\";\n default:\n return \"idle\";\n }\n}\n\nfunction isLiveStatus(status: SessionStatus): boolean {\n return status === \"running\";\n}\n\n/* --- the shared compact tree ------------------------------------------------ */\n\n/** The lineage tree, shared verbatim by the chip popover and the dock tab. */\nexport function SubagentTree({\n workspaceId,\n nodes,\n onNavigate,\n}: {\n workspaceId: string;\n nodes: LineageNode[];\n onNavigate?: (() => void) | undefined;\n}) {\n // Flat fleets (no grandchildren) skip the expander gutter so chrome stays dense.\n const showLead = nodes.some((node) => node.children.length > 0);\n return (\n <ul className=\"flex flex-col gap-px\">\n {nodes.map((node) => (\n <SubagentRow\n key={node.session.id}\n node={node}\n workspaceId={workspaceId}\n depth={0}\n showLead={showLead}\n onNavigate={onNavigate}\n />\n ))}\n </ul>\n );\n}\n\nfunction SubagentRow({\n node,\n workspaceId,\n depth,\n showLead,\n onNavigate,\n}: {\n node: LineageNode;\n workspaceId: string;\n depth: number;\n showLead: boolean;\n onNavigate?: (() => void) | undefined;\n}) {\n const [open, setOpen] = useState(false);\n const title = sessionDisplayTitle(node.session);\n const paused = sessionControlPaused(node.session);\n const tone = paused ? \"waiting\" : sessionStatusTone(sessionDisplayStatus(node.session));\n const live = !paused && isLiveStatus(node.session.status);\n const canExpand = depth < MAX_DEPTH && node.children.length > 0;\n\n // The trailing hint stays calm and compact for the common case (relative\n // time), and turns loud ONLY for the two rows a manager must act on: a failed\n // agent and one waiting on you spell the word out in their own status tone, so\n // they don't hide behind a color dot in a long list.\n const attention = subagentAttentionHint(node.session, paused);\n const attentionWord = attention?.word ?? null;\n const hint = attentionWord ?? formatRelativeTime(t, node.session.updatedAt);\n const hintClass = attentionWord ? cn(STATUS_META[tone].text, \"font-medium\") : \"text-fg-subtle\";\n const hintTitle = attention?.title;\n const waitingFor = attention?.waitingFor ?? \"\";\n\n return (\n <li>\n {/* The container owns the hover wash + focus ring so the WHOLE row lights\n as one target; the Link inside covers dot→title→hint (the nav hit\n area), the chevron toggles without navigating. */}\n <div className=\"group/row flex h-7 items-center gap-1.5 rounded-md pr-1.5 transition-colors hover:bg-surface-2 has-[a:focus-visible]:bg-surface-2 max-sm:h-11\">\n {/* Lead cluster: expand chevron + child-count. Omitted entirely for\n flat fleets so the chrome agents panel stays dense. */}\n {showLead ? (\n <span className=\"flex w-7 shrink-0 items-center gap-0.5\">\n {canExpand ? (\n <>\n <button\n type=\"button\"\n aria-label={open ? \"Collapse\" : \"Expand\"}\n onClick={() => setOpen((prev) => !prev)}\n className=\"inline-flex size-4 shrink-0 items-center justify-center rounded text-fg-subtle/50 outline-hidden transition-colors hover:text-fg group-hover/row:text-fg-subtle focus-visible:text-fg max-sm:size-11\"\n >\n <ChevronRightIcon\n className={cn(\"size-3 transition-transform\", open && \"rotate-90\")}\n />\n </button>\n <span className=\"text-2xs leading-none tabular-nums text-fg-subtle/60\">\n {node.children.length}\n </span>\n </>\n ) : null}\n </span>\n ) : null}\n <Link\n to=\"/workspaces/$workspaceId/sessions/$sessionId\"\n params={{ workspaceId, sessionId: node.session.id }}\n onClick={() => onNavigate?.()}\n title={title}\n className=\"flex h-full min-w-0 flex-1 items-center gap-2 text-xs text-fg-muted outline-hidden group-hover/row:text-fg\"\n >\n <StatusDot tone={tone} pulse={live} className=\"size-1.5 shrink-0\" />\n <span className=\"min-w-0 flex-1 truncate\">{title}</span>\n {hint ? (\n <span\n className={cn(\"shrink-0 text-2xs tabular-nums\", hintClass)}\n title={hintTitle}\n data-subagent-waiting={waitingFor || undefined}\n >\n {hint}\n </span>\n ) : null}\n </Link>\n </div>\n {canExpand && open ? (\n // Grandchildren thread off a hairline rail aligned under the parent's\n // chevron column — a descending line, not a box.\n <ul className=\"ml-2 mt-px flex flex-col gap-px border-l border-border/60 pl-2.5\">\n {node.children.map((child) => (\n <SubagentRow\n key={child.session.id}\n node={child}\n workspaceId={workspaceId}\n depth={depth + 1}\n showLead={showLead}\n onNavigate={onNavigate}\n />\n ))}\n </ul>\n ) : null}\n </li>\n );\n}\n\n/** The quiet section label both homes wear above the tree. */\nexport function SubagentsLabel({ count }: { count: number }) {\n return (\n <div className=\"flex items-center gap-1.5 px-1.5 pt-1 text-xs leading-4.5 font-medium text-fg-muted\">\n <BotIcon className=\"size-3.5\" />\n Agents\n {count > 0 ? <span className=\"tabular-nums\">· {count}</span> : null}\n </div>\n );\n}\n\n/* --- \"spawned by\" breadcrumb (child sessions link back to their parent) ----- */\n\nexport function SessionAncestryBreadcrumb({\n workspaceId,\n parentSessionId,\n ancestors,\n loading,\n error,\n}: {\n workspaceId: string;\n /** Known from the current session even before the lineage request settles. */\n parentSessionId: string | null;\n /** Root-to-direct-parent order. */\n ancestors: SessionSummary[];\n loading?: boolean | undefined;\n error?: Error | null | undefined;\n}): ReactNode {\n if (parentSessionId && (loading || error)) {\n const state = error ? \"unavailable\" : \"loading\";\n return (\n <nav\n aria-label=\"Session ancestry\"\n className=\"flex min-w-0 items-center text-2xs text-fg-muted\"\n >\n <Link\n to=\"/workspaces/$workspaceId/sessions/$sessionId\"\n params={{ workspaceId, sessionId: parentSessionId }}\n aria-label={`Back to parent session; ancestry ${state}`}\n className=\"inline-flex min-w-0 max-w-full items-center gap-1 outline-hidden transition-colors hover:text-fg focus-visible:text-fg\"\n >\n <ChevronRightIcon className=\"size-3 shrink-0 rotate-180\" />\n <span className={error ? \"truncate text-status-failed\" : \"truncate\"}>\n Back · Parent {state}\n </span>\n </Link>\n </nav>\n );\n }\n if (error) {\n return <span className=\"text-2xs text-status-failed\">Session ancestry unavailable</span>;\n }\n if (ancestors.length === 0) {\n return null;\n }\n const parent = ancestors.at(-1)!;\n const parentLabel = lineageLabel(parent);\n const middle = ancestors.slice(1, -1);\n return (\n <nav aria-label=\"Session ancestry\" className=\"flex min-w-0 items-center text-2xs text-fg-muted\">\n <Link\n to=\"/workspaces/$workspaceId/sessions/$sessionId\"\n params={{ workspaceId, sessionId: parent.id }}\n aria-label={`Back to ${parentLabel}`}\n className=\"inline-flex min-w-0 max-w-full items-center gap-1 outline-hidden transition-colors hover:text-fg focus-visible:text-fg sm:hidden\"\n >\n <ChevronRightIcon className=\"size-3 shrink-0 rotate-180\" />\n <span className=\"shrink-0 font-medium text-fg\">Back ·</span>\n <bdi dir=\"auto\" className=\"min-w-0 truncate\">\n {parentLabel}\n </bdi>\n </Link>\n <div className=\"hidden min-w-0 items-center sm:flex\">\n <BreadcrumbLink workspaceId={workspaceId} session={ancestors[0]!} />\n {middle.length > 0 ? (\n <>\n <ChevronRightIcon className=\"mx-0.5 size-3 shrink-0 text-fg-subtle\" />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className=\"inline-flex size-5 items-center justify-center rounded text-fg-subtle hover:bg-surface-2 hover:text-fg\"\n aria-label={`${middle.length} intermediate ancestor sessions`}\n >\n <EllipsisIcon className=\"size-3\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"max-w-80\">\n {middle.map((session) => (\n <DropdownMenuItem key={session.id} asChild>\n <Link\n to=\"/workspaces/$workspaceId/sessions/$sessionId\"\n params={{ workspaceId, sessionId: session.id }}\n dir=\"auto\"\n className=\"min-w-0\"\n >\n {lineageLabel(session)}\n </Link>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n ) : null}\n {ancestors.length > 1 ? (\n <>\n <ChevronRightIcon className=\"mx-0.5 size-3 shrink-0 text-fg-subtle\" />\n <BreadcrumbLink workspaceId={workspaceId} session={parent} />\n </>\n ) : null}\n </div>\n </nav>\n );\n}\n\nfunction BreadcrumbLink({\n workspaceId,\n session,\n}: {\n workspaceId: string;\n session: SessionSummary;\n}) {\n const label = lineageLabel(session);\n return (\n <Link\n to=\"/workspaces/$workspaceId/sessions/$sessionId\"\n params={{ workspaceId, sessionId: session.id }}\n title={label}\n dir=\"auto\"\n className=\"inline-flex max-w-40 items-center truncate outline-hidden transition-colors hover:text-fg focus-visible:text-fg max-sm:min-h-11\"\n >\n {label}\n </Link>\n );\n}\n\nfunction lineageLabel(session: SessionSummary): string {\n return sessionDisplayTitle(session);\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/interaction-errors.ts","../src/hooks/use-interaction-interventions.ts","../src/hooks/use-interaction-invalidation.ts","../src/components/interaction-intervention-banner.tsx","../src/components/use-viewer-menu-dismiss.ts"],"sourcesContent":["import { OpenGeniApiError } from \"@opengeni/sdk\";\nimport { interactionControlFailureFromError } from \"@opengeni/sdk/interaction\";\n\n/** Media can remain live when the independent control service is unavailable.\n * A target refusal or an uncertain mutation does not establish a service outage. */\nexport function isInteractionControlUnavailable(\n error: unknown,\n request: \"control\" | \"observation\" = \"control\",\n): error is OpenGeniApiError {\n if (!(error instanceof OpenGeniApiError)) return false;\n const failure = interactionControlFailureFromError(error);\n if (failure) return failure.code === \"agent_offline\" || failure.code === \"draining\";\n return (\n request === \"control\" && !error.outcomeUnknown && (error.status >= 500 || error.status === 0)\n );\n}\n\nexport function isNonRetryableInteractionError(error: unknown): error is OpenGeniApiError {\n return error instanceof OpenGeniApiError && error.retryable === false;\n}\n\nexport function isSourcePlacementChangedError(\n error: unknown,\n resource: \"browser_session\" | \"computer_session\",\n): error is OpenGeniApiError {\n return (\n isNonRetryableInteractionError(error) &&\n error.status === 409 &&\n error.details?.interactionResource === resource &&\n error.details?.interactionFailureCode === \"source_placement_changed\" &&\n error.details?.interactionLifecycle === \"lost\"\n );\n}\n","import type {\n CreateInteractionInterventionRequest,\n InteractionIntervention,\n InteractionInterventionMutationResponse,\n ResolveInteractionInterventionRequest,\n} from \"@opengeni/sdk/interaction\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { EmbeddedInterventionClientLike } from \"../client\";\nimport {\n type EmbeddedInterventionClientOverride,\n useEmbeddedInterventions,\n} from \"../session-context\";\nimport { useInteractionInvalidation } from \"./use-interaction-invalidation\";\n\nexport type UseInteractionInterventionsOptions = EmbeddedInterventionClientOverride & {\n enabled?: boolean | undefined;\n resourceKind?: \"browser_session\" | \"computer_session\" | undefined;\n resourceId?: string | null | undefined;\n includeSettled?: boolean | undefined;\n pollIntervalMs?: number | undefined;\n};\n\nexport type UseInteractionInterventionsResult = {\n interventions: InteractionIntervention[];\n loading: boolean;\n refreshing: boolean;\n mutating: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n create: (\n request: Omit<CreateInteractionInterventionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<InteractionInterventionMutationResponse>;\n resolve: (\n interventionId: string,\n request: Omit<ResolveInteractionInterventionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ) => Promise<InteractionInterventionMutationResponse>;\n};\n\n/** Human-action bridge shared by Browser and Computer surfaces. */\nexport function useInteractionInterventions(\n options: UseInteractionInterventionsOptions = {},\n): UseInteractionInterventionsResult {\n const { client, workspaceId, workspaceInteractionEvent, workspaceInteractionConnectionState } =\n useEmbeddedInterventions(options);\n const enabled = (options.enabled ?? true) && options.resourceId !== null;\n const resourceKind = options.resourceKind;\n const resourceId = options.resourceId ?? undefined;\n const includeSettled = options.includeSettled ?? false;\n const key = `${workspaceId}:${resourceKind ?? \"*\"}:${resourceId ?? \"*\"}:${includeSettled}`;\n const [state, setState] = useState(() => emptyState(key, enabled));\n const [mutationCount, setMutationCount] = useState(0);\n const requestRef = useRef<{ id: number; controller: AbortController | null }>({\n id: 0,\n controller: null,\n });\n const mountedRef = useRef(true);\n const visible = state.key === key ? state : emptyState(key, enabled);\n\n const cancelLoad = useCallback(() => {\n requestRef.current.controller?.abort();\n requestRef.current = { id: requestRef.current.id + 1, controller: null };\n }, []);\n\n const load = useCallback(\n async (foreground: boolean, replace = true): Promise<void> => {\n if (!enabled) return;\n if (requestRef.current.controller && !replace) return;\n const id = requestRef.current.id + 1;\n requestRef.current.controller?.abort();\n const controller = new AbortController();\n requestRef.current = { id, controller };\n if (foreground || replace) {\n setState((current) => ({\n ...(current.key === key ? current : emptyState(key, true)),\n loading: foreground,\n refreshing: !foreground,\n error: foreground ? null : current.error,\n }));\n }\n try {\n const response = await client.listInteractionInterventions(workspaceId, {\n ...(resourceKind ? { resourceKind } : {}),\n ...(resourceId ? { resourceId } : {}),\n includeSettled,\n signal: controller.signal,\n });\n if (!mountedRef.current || requestRef.current.id !== id) return;\n setState({\n key,\n interventions: sortInterventions(response.interventions),\n loading: false,\n refreshing: false,\n error: null,\n });\n } catch (cause) {\n if (controller.signal.aborted || !mountedRef.current || requestRef.current.id !== id)\n return;\n setState((current) => ({\n ...(current.key === key ? current : emptyState(key, true)),\n loading: false,\n refreshing: false,\n error: asError(cause),\n }));\n } finally {\n if (requestRef.current.id === id) requestRef.current = { id, controller: null };\n }\n },\n [client, enabled, includeSettled, key, resourceId, resourceKind, workspaceId],\n );\n\n const refresh = useCallback(async () => await load(false, true), [load]);\n\n useEffect(() => {\n mountedRef.current = true;\n if (!enabled) {\n cancelLoad();\n setState(emptyState(key, false));\n return;\n }\n void load(true);\n return () => {\n mountedRef.current = false;\n cancelLoad();\n };\n }, [cancelLoad, enabled, key, load]);\n\n useInteractionInvalidation({\n workspaceId,\n key,\n enabled,\n event: workspaceInteractionEvent,\n connectionState: workspaceInteractionConnectionState,\n refresh,\n fallbackPollIntervalMs: options.pollIntervalMs ?? 2_000,\n });\n\n const mutate = useCallback(async <T>(operation: () => Promise<T>): Promise<T> => {\n setMutationCount((count) => count + 1);\n try {\n return await operation();\n } finally {\n if (mountedRef.current) setMutationCount((count) => Math.max(0, count - 1));\n }\n }, []);\n\n const merge = useCallback(\n (intervention: InteractionIntervention) => {\n setState((current) => {\n if (current.key !== key) return current;\n const interventions = current.interventions.filter(\n (candidate) => candidate.id !== intervention.id,\n );\n const matches =\n (!resourceKind || intervention.resourceKind === resourceKind) &&\n (!resourceId || intervention.resourceId === resourceId);\n if (matches && (includeSettled || intervention.status === \"open\")) {\n interventions.push(intervention);\n }\n return {\n ...current,\n interventions: sortInterventions(interventions),\n error: null,\n };\n });\n },\n [includeSettled, key, resourceId, resourceKind],\n );\n\n const create = useCallback(\n async (\n request: Omit<CreateInteractionInterventionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<InteractionInterventionMutationResponse> =>\n await mutate(async () => {\n const response = await client.createInteractionIntervention(workspaceId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n merge(response.intervention);\n return response;\n }),\n [client, merge, mutate, workspaceId],\n );\n\n const resolve = useCallback(\n async (\n interventionId: string,\n request: Omit<ResolveInteractionInterventionRequest, \"operationId\"> & {\n operationId?: string;\n },\n ): Promise<InteractionInterventionMutationResponse> =>\n await mutate(async () => {\n const response = await client.resolveInteractionIntervention(workspaceId, interventionId, {\n ...request,\n operationId: request.operationId ?? crypto.randomUUID(),\n });\n merge(response.intervention);\n return response;\n }),\n [client, merge, mutate, workspaceId],\n );\n\n return {\n interventions: visible.interventions,\n loading: visible.loading,\n refreshing: visible.refreshing,\n mutating: mutationCount > 0,\n error: visible.error,\n refresh,\n create,\n resolve,\n };\n}\n\nfunction emptyState(key: string, loading: boolean) {\n return {\n key,\n interventions: [] as InteractionIntervention[],\n loading,\n refreshing: false,\n error: null as Error | null,\n };\n}\n\nfunction sortInterventions(\n interventions: readonly InteractionIntervention[],\n): InteractionIntervention[] {\n return [...interventions].sort(\n (left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt),\n );\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause));\n}\n\nexport type InteractionInterventionsClient = EmbeddedInterventionClientLike;\n","import type { StreamConnectionState, WorkspaceInteractionRevisionEvent } from \"@opengeni/sdk\";\nimport { useEffect, useRef } from \"react\";\nimport { usePageLiveActivity } from \"./internal\";\n\nexport type InteractionInvalidationOptions = {\n workspaceId: string;\n /** Distinguishes filtered projections of the same workspace catalog. */\n key: string;\n enabled: boolean;\n event: WorkspaceInteractionRevisionEvent | null;\n connectionState: StreamConnectionState | \"idle\" | \"error\";\n /** Catalog responses carry the workspace revision; live-state lists do not. */\n knownRevision?: number | undefined;\n refresh: () => Promise<void>;\n fallbackPollIntervalMs?: number | undefined;\n};\n\n/**\n * Refetch authoritative lists on the shared latest-revision stream. Poll only\n * while that stream is unavailable, preserving standalone-hook degradation\n * without multiplying healthy-provider traffic.\n */\nexport function useInteractionInvalidation(options: InteractionInvalidationOptions): void {\n const {\n workspaceId,\n key,\n enabled,\n event,\n connectionState,\n knownRevision,\n refresh,\n fallbackPollIntervalMs,\n } = options;\n const pageLive = usePageLiveActivity();\n const lastUnversionedEvent = useRef<{ key: string; sequence: number }>({\n key,\n sequence: 0,\n });\n const eventSequence = event?.workspaceId === workspaceId ? event.sequence : 0;\n\n useEffect(() => {\n if (!enabled || eventSequence <= 0) return;\n if (knownRevision !== undefined) {\n if (eventSequence > knownRevision) void refresh();\n return;\n }\n if (lastUnversionedEvent.current.key !== key) {\n lastUnversionedEvent.current = { key, sequence: 0 };\n }\n if (eventSequence <= lastUnversionedEvent.current.sequence) return;\n lastUnversionedEvent.current = { key, sequence: eventSequence };\n void refresh();\n }, [enabled, eventSequence, key, knownRevision, refresh]);\n\n useEffect(() => {\n if (!enabled || !pageLive || connectionState === \"live\") return;\n const interval = boundedPollInterval(fallbackPollIntervalMs ?? 3_000);\n const timer = setInterval(() => void refresh(), interval);\n return () => clearInterval(timer);\n }, [connectionState, enabled, fallbackPollIntervalMs, pageLive, refresh]);\n}\n\nfunction boundedPollInterval(value: number): number {\n if (!Number.isFinite(value)) return 3_000;\n return Math.min(60_000, Math.max(1_000, Math.floor(value)));\n}\n","import type { InteractionIntervention } from \"@opengeni/sdk/interaction\";\nimport { CheckIcon, CircleAlertIcon, LoaderCircleIcon, XIcon } from \"lucide-react\";\nimport { cn } from \"../lib/cn\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\nexport type InteractionInterventionBannerProps = {\n interventions: InteractionIntervention[];\n activeTargetId?: string | null | undefined;\n mutating?: boolean | undefined;\n className?: string | undefined;\n onOpen?: ((intervention: InteractionIntervention) => void) | undefined;\n onResolve: (intervention: InteractionIntervention, outcome: \"completed\" | \"dismissed\") => void;\n};\n\n/** Compact durable human-action prompt shared by Browser and Computer viewers. */\nexport function InteractionInterventionBanner({\n interventions,\n activeTargetId,\n mutating = false,\n className,\n onOpen,\n onResolve,\n}: InteractionInterventionBannerProps) {\n const t = useOpenGeniText();\n const intervention = interventions[0];\n if (!intervention) return null;\n const targetOpen = activeTargetId === undefined || activeTargetId === intervention.targetId;\n return (\n <div\n className={cn(\n \"flex shrink-0 items-center gap-2 border-b border-og-status-waiting/25 bg-og-status-waiting/[0.07] px-3 py-2\",\n className,\n )}\n role=\"status\"\n >\n <span className=\"grid size-7 shrink-0 place-items-center rounded-og-sm bg-og-status-waiting/10 text-og-status-waiting\">\n <CircleAlertIcon className=\"size-3.5\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex items-center gap-1.5 text-og-control font-medium text-og-fg\">\n {interventionTitle(t, intervention.kind)}\n {interventions.length > 1 ? (\n <span className=\"rounded-full bg-og-surface-2 px-1.5 py-0.5 text-[10px] font-normal text-og-muted\">\n +{interventions.length - 1}\n </span>\n ) : null}\n </span>\n <span className=\"block truncate text-og-xs text-og-muted\">{intervention.reason}</span>\n </span>\n {!targetOpen && onOpen ? (\n <button\n type=\"button\"\n onClick={() => onOpen(intervention)}\n disabled={mutating}\n className=\"h-7 shrink-0 rounded-og-sm border border-og-primary-border bg-og-primary px-2.5 text-og-control font-medium text-og-primary-fg transition hover:bg-og-primary-hover disabled:opacity-50\"\n >\n {t(\"interactionInterventionBanner.open\")}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => onResolve(intervention, \"completed\")}\n disabled={mutating}\n className=\"inline-flex h-7 shrink-0 items-center gap-1 rounded-og-sm border border-og-primary-border bg-og-primary text-og-primary-fg px-2.5 text-og-control font-medium transition hover:bg-og-primary-hover disabled:opacity-50\"\n >\n {mutating ? (\n <LoaderCircleIcon className=\"size-3 animate-spin\" />\n ) : (\n <CheckIcon className=\"size-3\" />\n )}\n {t(\"interactionInterventionBanner.done\")}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onResolve(intervention, \"dismissed\")}\n disabled={mutating}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-muted transition hover:bg-og-surface-2 hover:text-og-fg disabled:opacity-50\"\n aria-label={t(\"interactionInterventionBanner.cancelRequest\")}\n title={t(\"interactionInterventionBanner.cancelRequest\")}\n >\n <XIcon className=\"size-3.5\" />\n </button>\n </div>\n );\n}\n\nfunction interventionTitle(t: OpenGeniText, kind: InteractionIntervention[\"kind\"]): string {\n switch (kind) {\n case \"manual_login\":\n return t(\"interactionInterventionBanner.signInNeeded\");\n case \"mfa\":\n return t(\"interactionInterventionBanner.verificationNeeded\");\n case \"external_action\":\n return t(\"interactionInterventionBanner.actionNeeded\");\n case \"confirmation\":\n return t(\"interactionInterventionBanner.confirmationNeeded\");\n case \"other\":\n return t(\"interactionInterventionBanner.agentNeedsYourHelp\");\n }\n}\n","import { useEffect, useRef } from \"react\";\n\n/** Keep native details menus dismissible without letting Escape close the dock. */\nexport function useViewerMenuDismiss(enabled = true) {\n const ref = useRef<HTMLDetailsElement | null>(null);\n useEffect(() => {\n const menu = ref.current;\n if (!enabled || !menu) return;\n const document = menu.ownerDocument;\n const pointerDown = (event: PointerEvent) => {\n if (menu.open && !event.composedPath().includes(menu)) menu.open = false;\n };\n const focusIn = (event: FocusEvent) => {\n if (menu.open && !event.composedPath().includes(menu)) menu.open = false;\n };\n const keyDown = (event: KeyboardEvent) => {\n if (!menu.open || event.key !== \"Escape\" || !event.composedPath().includes(menu)) return;\n event.preventDefault();\n event.stopPropagation();\n menu.open = false;\n menu.querySelector(\"summary\")?.focus();\n };\n document.addEventListener(\"pointerdown\", pointerDown, true);\n document.addEventListener(\"focusin\", focusIn, true);\n document.addEventListener(\"keydown\", keyDown, true);\n return () => {\n document.removeEventListener(\"pointerdown\", pointerDown, true);\n document.removeEventListener(\"focusin\", focusIn, true);\n document.removeEventListener(\"keydown\", keyDown, true);\n };\n }, [enabled]);\n return ref;\n}\n"],"mappings":"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","names":["useEffect","useRef","useRef","useEffect","useEffect","useRef"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/lib/format.tsx"],"sourcesContent":["// Shared formatting helpers for the console.\nimport type { EntitlementValue, Entitlements } from \"../types\";\n\nexport function formatTimestamp(value: string): string {\n const timestamp = new Date(value);\n return Number.isNaN(timestamp.getTime()) ? value : timestamp.toLocaleString();\n}\n\nexport function localDateTimeValue(date: Date): string {\n const pad = (value: number) => String(value).padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;\n}\n\nexport function formatMoneyMicros(amountMicros: number, currency: string): string {\n return new Intl.NumberFormat(undefined, {\n style: \"currency\",\n currency: currency.toUpperCase(),\n // \"$10.00\", never \"US$10.00\" in non-US locales.\n currencyDisplay: \"narrowSymbol\",\n }).format(amountMicros / 1_000_000);\n}\n\nexport function validTopupAmount(value: string): boolean {\n const amount = Number(value);\n return (\n Number.isFinite(amount) &&\n amount >= 5 &&\n amount <= 10_000 &&\n Math.abs(amount - Math.round(amount * 100) / 100) < 1e-9\n );\n}\n\n/** Human label for an entitlement value (`true` reads as \"enabled\", not \"true\"). */\nexport function formatEntitlementValue(value: EntitlementValue): string {\n if (typeof value === \"boolean\") {\n return value ? \"enabled\" : \"disabled\";\n }\n if (Array.isArray(value)) {\n return value.length > 0 ? value.join(\", \") : \"none\";\n }\n return String(value);\n}\n\n/** Stable, render-ready rows for the account's entitlements map. */\nexport function entitlementEntries(\n entitlements: Entitlements,\n): Array<{ name: string; value: string }> {\n return Object.entries(entitlements)\n .map(([name, value]) => ({ name, value: formatEntitlementValue(value) }))\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function repoCountLabel(count: number): string {\n return `${count} ${count === 1 ? \"repo\" : \"repos\"}`;\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\"] as const;\n let value = bytes / 1024;\n for (const unit of units) {\n if (value < 1024 || unit === \"GB\") {\n return `${value.toFixed(value < 10 ? 1 : 0)} ${unit}`;\n }\n value /= 1024;\n }\n return `${bytes} B`;\n}\n\n/**\n * Compact \"waiting for\" duration since `iso`, e.g. \"<1m\", \"5m\", \"10h\", \"3d\".\n * Unlike the rail's relative-time label it never collapses to \"now\" or a\n * calendar date: a session can wait for input for weeks and the wait should\n * keep reading as a duration. Empty for an unparseable timestamp.\n */\nexport function formatWaitingSince(iso: string, now: Date = new Date()): string {\n const since = Date.parse(iso);\n if (Number.isNaN(since)) return \"\";\n const seconds = Math.max(0, Math.floor((now.getTime() - since) / 1000));\n if (seconds < 60) return \"<1m\";\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n if (hours < 48) return `${hours}h`;\n return `${Math.floor(hours / 24)}d`;\n}\n\n/** Compact elapsed-time label, e.g. \"4s\", \"2m 13s\", \"1h 04m\". */\nexport function formatElapsedSeconds(totalSeconds: number): string {\n const seconds = Math.max(0, Math.floor(totalSeconds));\n if (seconds < 60) {\n return `${seconds}s`;\n }\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes}m ${String(seconds % 60).padStart(2, \"0\")}s`;\n }\n const hours = Math.floor(minutes / 60);\n return `${hours}h ${String(minutes % 60).padStart(2, \"0\")}m`;\n}\n"],"mappings":"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","names":[]}