@opengeni/react 4.2.1-canary.39642758903001 → 4.3.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 (693) hide show
  1. package/dist/app/app-state.js +27 -27
  2. package/dist/app/components/Composer.js +27 -26
  3. package/dist/app/components/agent/agent-capability-picker.js +5 -5
  4. package/dist/app/components/artifacts/artifact-library.js +19 -19
  5. package/dist/app/components/artifacts/chat-interactive-block.js +16 -16
  6. package/dist/app/components/artifacts/inline-chat-image.js +31 -30
  7. package/dist/app/components/artifacts/retained-file-preview.js +35 -34
  8. package/dist/app/components/artifacts/retained-text-preview.js +5 -5
  9. package/dist/app/components/artifacts/site-audience.js +5 -5
  10. package/dist/app/components/artifacts/site-conversations.js +24 -22
  11. package/dist/app/components/artifacts/site-data.js +20 -20
  12. package/dist/app/components/artifacts/site-publishing.js +39 -39
  13. package/dist/app/components/artifacts/site-settings.js +48 -48
  14. package/dist/app/components/billing-class-mark.js +5 -5
  15. package/dist/app/components/capabilities/capability-detail-sheet.js +9 -9
  16. package/dist/app/components/capabilities/capability-logo-source.js +13 -12
  17. package/dist/app/components/capabilities/connection-account-picker.js +2 -2
  18. package/dist/app/components/capabilities/connector-tool-permissions.js +5 -5
  19. package/dist/app/components/capabilities/native-connect-setup.js +14 -13
  20. package/dist/app/components/capabilities/native-connect-setup.js.map +1 -1
  21. package/dist/app/components/capabilities/perform-capability-action.js +3 -3
  22. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +15 -14
  23. package/dist/app/components/capabilities/session-capability-card.js +78 -77
  24. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  25. package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -19
  26. package/dist/app/components/capabilities/session-github-card.js +25 -24
  27. package/dist/app/components/capabilities/session-machine-card.js +38 -38
  28. package/dist/app/components/capabilities/use-capabilities-catalog.js +3 -3
  29. package/dist/app/components/capabilities/use-connection-accounts.js +1 -1
  30. package/dist/app/components/command-menu/chat-switcher.d.ts +12 -0
  31. package/dist/app/components/command-menu/chat-switcher.js +142 -0
  32. package/dist/app/components/command-menu/chat-switcher.js.map +1 -0
  33. package/dist/app/components/command-menu/command-menu.d.ts +15 -0
  34. package/dist/app/components/command-menu/command-menu.js +812 -0
  35. package/dist/app/components/command-menu/command-menu.js.map +1 -0
  36. package/dist/app/components/command-menu/keycaps.d.ts +21 -0
  37. package/dist/app/components/command-menu/keycaps.js +12 -0
  38. package/dist/app/components/command-menu/shortcut-sheet.d.ts +12 -0
  39. package/dist/app/components/command-menu/shortcut-sheet.js +150 -0
  40. package/dist/app/components/command-menu/shortcut-sheet.js.map +1 -0
  41. package/dist/app/components/composer-capabilities-menu-body.js +3 -3
  42. package/dist/app/components/composer-mobile-plus-panel.js +21 -21
  43. package/dist/app/components/composer-mobile-plus.js +3 -3
  44. package/dist/app/components/credit-required-gate.js +1 -1
  45. package/dist/app/components/credit-required-prompt.js +16 -16
  46. package/dist/app/components/credits/coupon-redeem.js +2 -2
  47. package/dist/app/components/credits/credit-refusal-notice.d.ts +18 -0
  48. package/dist/app/components/credits/credit-refusal-notice.js +17 -0
  49. package/dist/app/components/cross-slot-deep-link-recovery.js +1 -1
  50. package/dist/app/components/desktop/app-shots.js +6 -6
  51. package/dist/app/components/desktop/this-computer.js +4 -4
  52. package/dist/app/components/feedback.js +5 -5
  53. package/dist/app/components/follow-up-repository-menu-body.js +7 -7
  54. package/dist/app/components/follow-up-repository-picker.js +3 -3
  55. package/dist/app/components/github-app-connect-launcher.js +1 -1
  56. package/dist/app/components/knowledge/agent-learning-settings.js +6 -6
  57. package/dist/app/components/machines/connect-machine-dialog.js +18 -18
  58. package/dist/app/components/manual-repository-editor.js +2 -2
  59. package/dist/app/components/markdown.js +10 -9
  60. package/dist/app/components/message-context-pills.js +2 -2
  61. package/dist/app/components/models/models-ui.js +10 -10
  62. package/dist/app/components/pickers.js +10 -10
  63. package/dist/app/components/rail/rail-context.d.ts +6 -0
  64. package/dist/app/components/rail/rail-context.js +3 -3
  65. package/dist/app/components/rail/rail-sections.js +61 -55
  66. package/dist/app/components/rail/session-browse-order-controls.js +2 -2
  67. package/dist/app/components/rail/session-header.js +50 -36
  68. package/dist/app/components/rail/session-list.js +59 -52
  69. package/dist/app/components/rail/session-row-hover-details.js +25 -23
  70. package/dist/app/components/rail/session-shell.js +96 -91
  71. package/dist/app/components/repository-picker.js +7 -7
  72. package/dist/app/components/secrets/session-secrets-panel.js +4 -4
  73. package/dist/app/components/session/agent-configuration-panel.js +34 -34
  74. package/dist/app/components/session/banners.js +12 -11
  75. package/dist/app/components/session/codex-account-indicator.js +12 -12
  76. package/dist/app/components/session/composer-menu-radio.js +2 -2
  77. package/dist/app/components/session/conversation-find.js +1 -1
  78. package/dist/app/components/session/editable-artifacts-workspace.js +45 -45
  79. package/dist/app/components/session/failed-session-banner.js +12 -12
  80. package/dist/app/components/session/human-input.js +48 -47
  81. package/dist/app/components/session/inspector.js +80 -79
  82. package/dist/app/components/session/inspector.js.map +1 -1
  83. package/dist/app/components/session/message-actions.js +5 -5
  84. package/dist/app/components/session/message-resource-attachments.js +21 -20
  85. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  86. package/dist/app/components/session/model-account-indicator.js +11 -11
  87. package/dist/app/components/session/model-context-inspector.js +2 -2
  88. package/dist/app/components/session/model-recovery-notice.js +3 -3
  89. package/dist/app/components/session/new-session-settings-menu.js +13 -13
  90. package/dist/app/components/session/sandbox-switcher.js +16 -16
  91. package/dist/app/components/session/sandbox-workspace.js +68 -67
  92. package/dist/app/components/session/search-markdown-highlight.js +11 -10
  93. package/dist/app/components/session/search-results-view.js +12 -11
  94. package/dist/app/components/session/session-admin-access.js +11 -11
  95. package/dist/app/components/session/session-retention.js +4 -4
  96. package/dist/app/components/session/session-search-dialog.d.ts +5 -0
  97. package/dist/app/components/session/session-search-dialog.js +22 -12
  98. package/dist/app/components/session/session-search-dialog.js.map +1 -1
  99. package/dist/app/components/session/session-skill-reviews.js +3 -3
  100. package/dist/app/components/session/session-tenancy-control.js +25 -25
  101. package/dist/app/components/session/session-usage-limit-section.js +9 -9
  102. package/dist/app/components/session/session-wait-status.js +11 -9
  103. package/dist/app/components/session/session-wait-status.js.map +1 -1
  104. package/dist/app/components/session/subagents.js +17 -15
  105. package/dist/app/components/session/subscription-account-menu.js +2 -2
  106. package/dist/app/components/session-connectors-menu-body.js +6 -6
  107. package/dist/app/components/settings/row-select.js +1 -1
  108. package/dist/app/components/transcription-settings.js +2 -2
  109. package/dist/app/components/ui/destructive-confirm.js +8 -8
  110. package/dist/app/components/usage/usage-entry.js +6 -6
  111. package/dist/app/components/workspace-composer-plus.js +22 -21
  112. package/dist/app/embed/session-app.js +264 -258
  113. package/dist/app/lib/actions/actions-provider.d.ts +30 -0
  114. package/dist/app/lib/actions/actions-provider.js +32 -0
  115. package/dist/app/lib/actions/chat-directory.d.ts +30 -0
  116. package/dist/app/lib/actions/chat-operations.d.ts +11 -0
  117. package/dist/app/lib/actions/chat-switcher.d.ts +31 -0
  118. package/dist/app/lib/actions/chords.d.ts +40 -0
  119. package/dist/app/lib/actions/events.d.ts +6 -0
  120. package/dist/app/lib/actions/rank.d.ts +17 -0
  121. package/dist/app/lib/actions/registry.d.ts +71 -0
  122. package/dist/app/lib/codex-usage-query.js +3 -3
  123. package/dist/app/lib/composer-connectors.js +14 -13
  124. package/dist/app/lib/console-text.js +2 -2
  125. package/dist/app/lib/credit-coverage.d.ts +21 -0
  126. package/dist/app/lib/credit-coverage.js +15 -0
  127. package/dist/app/lib/deployment-free-model.js +2 -2
  128. package/dist/app/lib/events.js +19 -18
  129. package/dist/app/lib/failed-session-copy.js +5 -5
  130. package/dist/app/lib/free-credit-gap.d.ts +9 -0
  131. package/dist/app/lib/free-credit-gap.js +4 -2
  132. package/dist/app/lib/integration-connect-analytics.d.ts +1 -1
  133. package/dist/app/lib/integration-connect-analytics.js +1 -1
  134. package/dist/app/lib/integration-connect-redirect.js +1 -1
  135. package/dist/app/lib/model-access-onboarding.js +4 -4
  136. package/dist/app/lib/model-policy.js +1 -1
  137. package/dist/app/lib/models-route.d.ts +6 -2
  138. package/dist/app/lib/models-route.js +6 -3
  139. package/dist/app/lib/models-route.js.map +1 -1
  140. package/dist/app/lib/move-chat-to-machine.js +3 -3
  141. package/dist/app/lib/session-branch-cache.js +15 -13
  142. package/dist/app/lib/session-create.js +2 -2
  143. package/dist/app/lib/session-group-pagination.js +15 -13
  144. package/dist/app/lib/session-hover-facts.js +16 -14
  145. package/dist/app/lib/session-model.js +3 -3
  146. package/dist/app/lib/session-rail.js +11 -9
  147. package/dist/app/lib/session-rename.js +3 -3
  148. package/dist/app/lib/session-search-route.d.ts +1 -1
  149. package/dist/app/lib/session-search-route.js +1 -1
  150. package/dist/app/lib/session-ui-features.d.ts +11 -3
  151. package/dist/app/lib/session-ui-features.js +1 -1
  152. package/dist/app/lib/sessions-group.js +15 -13
  153. package/dist/app/lib/turn-failure-analytics.js +7 -7
  154. package/dist/app/lib/unavailable-session-model.js +2 -2
  155. package/dist/app/lib/use-duplicate-site.js +2 -2
  156. package/dist/app/lib/use-follow-up-repositories.js +3 -3
  157. package/dist/app/lib/use-workspace-machines.js +8 -8
  158. package/dist/app/lib/use-workspace-model-catalog.js +6 -6
  159. package/dist/app/lib/use-workspace-rigs.js +4 -4
  160. package/dist/app/lib/workspace-navigation-preference.js +5 -5
  161. package/dist/app/lib/workspace-scope-context.js +4 -4
  162. package/dist/app/routes/artifacts.js +124 -122
  163. package/dist/app/routes/artifacts.js.map +1 -1
  164. package/dist/app/routes/retained-artifact.js +69 -68
  165. package/dist/app/routes/retained-artifact.js.map +1 -1
  166. package/dist/app/routes/session-unavailable.js +3 -3
  167. package/dist/app/routes/session.js +168 -166
  168. package/dist/app/routes/sessions-index-hydration.js +3 -3
  169. package/dist/app/routes/sessions-index.js +122 -116
  170. package/dist/artifacts-document.js +4 -4
  171. package/dist/artifacts-presentation.js +4 -4
  172. package/dist/artifacts-spreadsheet.js +4 -4
  173. package/dist/artifacts.js +39 -39
  174. package/dist/{browser-viewer-ZRFZX3VN.js → browser-viewer-HPUMK7UP.js} +7 -7
  175. package/dist/{chat-interactive-block-HUMYWVCK.js → chat-interactive-block-22PPECCT.js} +6 -6
  176. package/dist/{chunk-GVIQ7H62.js → chunk-2LUBBDZV.js} +5 -5
  177. package/dist/{chunk-SWWYYGQO.js → chunk-325C2TCI.js} +5 -2
  178. package/dist/chunk-325C2TCI.js.map +1 -0
  179. package/dist/{chunk-XMMVIY7B.js → chunk-3CCJWHQY.js} +2 -2
  180. package/dist/{chunk-XS2FZ6DX.js → chunk-3F5ZPIWI.js} +2 -2
  181. package/dist/{chunk-72US6QNB.js → chunk-3J2YZRY5.js} +2 -2
  182. package/dist/{chunk-D4YQF4E3.js → chunk-3SMJ2BIQ.js} +2 -2
  183. package/dist/{chunk-TBJINQXA.js → chunk-3WCYK36X.js} +17 -17
  184. package/dist/{chunk-WPCF34V6.js → chunk-3WG3CRL7.js} +14 -14
  185. package/dist/{chunk-JI5BYQKO.js → chunk-3X46PNBX.js} +14 -14
  186. package/dist/{chunk-UO36FC3S.js → chunk-46I7MMAL.js} +6 -2
  187. package/dist/chunk-46I7MMAL.js.map +1 -0
  188. package/dist/{chunk-PBK44WJC.js → chunk-4GJ37O6G.js} +2 -2
  189. package/dist/chunk-4IWBQUQU.js +152 -0
  190. package/dist/chunk-4IWBQUQU.js.map +1 -0
  191. package/dist/{chunk-LEXPBQ56.js → chunk-4SKJX3C4.js} +6 -6
  192. package/dist/{chunk-ZA6YD2LW.js → chunk-57SYK776.js} +2 -2
  193. package/dist/{chunk-22LBKJDE.js → chunk-5DIAN5GQ.js} +12 -12
  194. package/dist/{chunk-LJ3TDK2L.js → chunk-5FA455GR.js} +4 -4
  195. package/dist/{chunk-N2BEUKXT.js → chunk-5FBZDEHE.js} +228 -228
  196. package/dist/chunk-5FBZDEHE.js.map +1 -0
  197. package/dist/{chunk-YPR5INHV.js → chunk-5X3E2Z3D.js} +4 -4
  198. package/dist/{chunk-OXNWZTEU.js → chunk-5ZJCL6X4.js} +5 -5
  199. package/dist/{chunk-62OAZ4LO.js → chunk-6C5GQQMC.js} +12 -12
  200. package/dist/{chunk-VGITH57T.js → chunk-6ERTXDZM.js} +4 -4
  201. package/dist/{chunk-ZQ7XQZCF.js → chunk-6FX73Y4I.js} +8 -8
  202. package/dist/{chunk-QZO2KK2F.js → chunk-6P44NG6Y.js} +2 -2
  203. package/dist/{chunk-N2DDJLTM.js → chunk-6T7Y33JA.js} +3 -3
  204. package/dist/{chunk-RBAGC2MJ.js → chunk-75VE5QUS.js} +22 -22
  205. package/dist/{chunk-MRXOGI3O.js → chunk-77CUDSHG.js} +9 -9
  206. package/dist/{chunk-F2GXK2Z6.js → chunk-7G446JFO.js} +431 -348
  207. package/dist/chunk-7G446JFO.js.map +1 -0
  208. package/dist/{chunk-GZ65XQR5.js → chunk-7T7FHSGS.js} +3 -3
  209. package/dist/{chunk-YGAH34CD.js → chunk-A3S26JSP.js} +8 -8
  210. package/dist/{chunk-GYPAO6RS.js → chunk-A664GSDM.js} +8 -8
  211. package/dist/{chunk-JSZSNMDR.js → chunk-ASUYLXKO.js} +2 -2
  212. package/dist/{chunk-RTK7SUPL.js → chunk-AUUJLVA3.js} +7 -7
  213. package/dist/{chunk-OOTBYSCA.js → chunk-BBWKPNJB.js} +5 -5
  214. package/dist/{chunk-BGZIMIUU.js → chunk-BCUYWOQU.js} +2 -2
  215. package/dist/{chunk-EKN4N4LS.js → chunk-BDFMNJZJ.js} +2 -2
  216. package/dist/{chunk-YZKGOWCC.js → chunk-BIDXQAGO.js} +2 -2
  217. package/dist/{chunk-Q2UUANHF.js → chunk-BIKAJ4DY.js} +5 -5
  218. package/dist/{chunk-5IQBF2X3.js → chunk-BJPJ2OUX.js} +3 -3
  219. package/dist/{chunk-EY2EMHZW.js → chunk-BPM2OTYK.js} +8 -8
  220. package/dist/{chunk-MT4TBRQB.js → chunk-BSWS2RUZ.js} +2 -2
  221. package/dist/{chunk-T7YD3VGK.js → chunk-C52MNKXU.js} +12 -12
  222. package/dist/{chunk-THNW33K7.js → chunk-CEUDV4OA.js} +18 -18
  223. package/dist/{chunk-GRLPRM56.js → chunk-CFEFYPNR.js} +8 -2
  224. package/dist/chunk-CFEFYPNR.js.map +1 -0
  225. package/dist/{chunk-LHGIS6SZ.js → chunk-CVK74BH7.js} +2 -2
  226. package/dist/{chunk-DFO2UCYG.js → chunk-CW5I65ZX.js} +11 -11
  227. package/dist/chunk-DKNTQDVL.js +86 -0
  228. package/dist/chunk-DKNTQDVL.js.map +1 -0
  229. package/dist/{chunk-SKRLKQEG.js → chunk-DOSC2HRQ.js} +79 -79
  230. package/dist/{chunk-KVB6XDLP.js → chunk-DPJ2CWVN.js} +2 -2
  231. package/dist/{chunk-4J6V4DH7.js → chunk-DXMRO2MU.js} +3 -3
  232. package/dist/{chunk-42I4O4WQ.js → chunk-EE55IDDR.js} +26 -26
  233. package/dist/{chunk-2RA6XABP.js → chunk-EEERTLFF.js} +12 -12
  234. package/dist/{chunk-PTOTKUKO.js → chunk-EEO744XR.js} +8 -8
  235. package/dist/{chunk-LD3HVI2J.js → chunk-EMFGBAQL.js} +6 -6
  236. package/dist/{chunk-FQGUK4ST.js → chunk-ENPJKVMN.js} +38 -38
  237. package/dist/{chunk-HDHK3SXK.js → chunk-EU6RLHMP.js} +4 -4
  238. package/dist/{chunk-G7VLL3PG.js → chunk-F2YABPRJ.js} +13 -4
  239. package/dist/chunk-F2YABPRJ.js.map +1 -0
  240. package/dist/{chunk-MRUWRQBX.js → chunk-FET6XHGS.js} +2 -2
  241. package/dist/{chunk-M6KUY3YH.js → chunk-FIICQA55.js} +2 -2
  242. package/dist/{chunk-NLWLCYCT.js → chunk-FTZXCPE3.js} +19 -19
  243. package/dist/{chunk-FN2KA3MJ.js → chunk-FUS76DO4.js} +3 -3
  244. package/dist/{chunk-AM4IIPWI.js → chunk-G7N5NPRJ.js} +2 -2
  245. package/dist/{chunk-CCQ7YKOD.js → chunk-GBYZ6653.js} +2 -2
  246. package/dist/{chunk-SOOWLNC5.js → chunk-GJUPLSC5.js} +330 -109
  247. package/dist/chunk-GJUPLSC5.js.map +1 -0
  248. package/dist/{chunk-YKKVIJVX.js → chunk-GQDSC6QZ.js} +5 -5
  249. package/dist/chunk-GQGNRL2L.js +53 -0
  250. package/dist/chunk-GQGNRL2L.js.map +1 -0
  251. package/dist/{chunk-5X6JP75Q.js → chunk-GRSODLVO.js} +4 -4
  252. package/dist/{chunk-73YP3R5X.js → chunk-GSESCQFY.js} +4 -4
  253. package/dist/{chunk-KWB5U3ZT.js → chunk-GWRW4N3T.js} +199 -137
  254. package/dist/chunk-GWRW4N3T.js.map +1 -0
  255. package/dist/{chunk-RTR7RNG4.js → chunk-GYRU4PNM.js} +9 -7
  256. package/dist/{chunk-RTR7RNG4.js.map → chunk-GYRU4PNM.js.map} +1 -1
  257. package/dist/{chunk-MZLEBFUZ.js → chunk-GZD6VBIK.js} +3 -3
  258. package/dist/{chunk-IZR2QRFF.js → chunk-H3HH5AHS.js} +4 -4
  259. package/dist/{chunk-DN3TKURW.js → chunk-H3LIIAGE.js} +4 -54
  260. package/dist/chunk-H3LIIAGE.js.map +1 -0
  261. package/dist/{chunk-NPLEQMNM.js → chunk-H5GWAG4I.js} +7 -5
  262. package/dist/{chunk-NPLEQMNM.js.map → chunk-H5GWAG4I.js.map} +1 -1
  263. package/dist/{chunk-OJPUVUB6.js → chunk-HAOZCLLA.js} +3 -3
  264. package/dist/{chunk-ZBHDGAYL.js → chunk-HEFE4OZJ.js} +2 -2
  265. package/dist/{chunk-WTG34JVA.js → chunk-HI75UTI6.js} +2 -2
  266. package/dist/{chunk-OMBIG3NC.js → chunk-HM633ROV.js} +14 -14
  267. package/dist/{chunk-WDFZWSKD.js → chunk-HRIP4M6H.js} +3 -3
  268. package/dist/{chunk-A2BCW6CQ.js → chunk-HU2DRFFI.js} +3 -3
  269. package/dist/{chunk-PO35PBAB.js → chunk-HVH7FFJH.js} +2 -2
  270. package/dist/{chunk-EG7KNUF7.js → chunk-HYTXTKST.js} +18 -18
  271. package/dist/{chunk-TFHG75A4.js → chunk-I4XMDFUJ.js} +7 -7
  272. package/dist/{chunk-IZHVZZQA.js → chunk-ICAUYWSL.js} +9 -9
  273. package/dist/{chunk-ZSERYHHT.js → chunk-IDMXEPHL.js} +150 -150
  274. package/dist/chunk-IDMXEPHL.js.map +1 -0
  275. package/dist/{chunk-DCLPWYP3.js → chunk-IEVPJ3G6.js} +2 -2
  276. package/dist/{chunk-EVWZHDSF.js → chunk-IKH3VTA4.js} +2 -2
  277. package/dist/{chunk-L5UCO2UV.js → chunk-ILBSBZGC.js} +13 -4
  278. package/dist/chunk-ILBSBZGC.js.map +1 -0
  279. package/dist/{chunk-IO6K6UYJ.js → chunk-IQ64BNAG.js} +4 -2
  280. package/dist/chunk-IQ64BNAG.js.map +1 -0
  281. package/dist/{chunk-TYHLEFD2.js → chunk-IZJNMRIR.js} +9 -9
  282. package/dist/{chunk-D2SR3TEB.js → chunk-J243WGUA.js} +2 -2
  283. package/dist/{chunk-QGSGIYE3.js → chunk-J2C6LB6W.js} +4 -4
  284. package/dist/{chunk-MT6TRTXF.js → chunk-J5MEDX7C.js} +9 -9
  285. package/dist/{chunk-6QHUKBJP.js → chunk-J7SKOO44.js} +2 -2
  286. package/dist/{chunk-W2QK7PYS.js → chunk-JAAST75A.js} +11 -11
  287. package/dist/{chunk-NQCMS4AJ.js → chunk-JQCGPTZ6.js} +9 -9
  288. package/dist/chunk-JRJUSKDY.js +832 -0
  289. package/dist/chunk-JRJUSKDY.js.map +1 -0
  290. package/dist/{chunk-CMUXJHGH.js → chunk-JRSCWQMC.js} +9 -9
  291. package/dist/{chunk-Q4OHNGGB.js → chunk-JRXHSVD5.js} +4 -4
  292. package/dist/{chunk-SD2K5ZN5.js → chunk-JXYLDT6X.js} +4 -4
  293. package/dist/{chunk-S3M5WCZW.js → chunk-KA4LV7G6.js} +35 -50
  294. package/dist/chunk-KA4LV7G6.js.map +1 -0
  295. package/dist/{chunk-IXX6ZOL2.js → chunk-KGTMHEAP.js} +7 -7
  296. package/dist/{chunk-22OBGVEJ.js → chunk-KOXVGPW4.js} +3 -3
  297. package/dist/{chunk-NOZ5CGZE.js → chunk-L5GPPMUB.js} +2 -2
  298. package/dist/{chunk-KIHYJM5F.js → chunk-LXJT4WAW.js} +58 -58
  299. package/dist/{chunk-KIHYJM5F.js.map → chunk-LXJT4WAW.js.map} +1 -1
  300. package/dist/{chunk-4FOOHMTU.js → chunk-LY6727IF.js} +1 -1
  301. package/dist/{chunk-PT7MTXRE.js → chunk-MAOCN7J6.js} +2 -2
  302. package/dist/{chunk-4K2JSJNX.js → chunk-MB5LZVDO.js} +2 -2
  303. package/dist/chunk-MF464AKA.js +139 -0
  304. package/dist/chunk-MF464AKA.js.map +1 -0
  305. package/dist/{chunk-UYSZKDQY.js → chunk-MK54JLE4.js} +1 -1
  306. package/dist/chunk-MK54JLE4.js.map +1 -0
  307. package/dist/{chunk-5LES64PP.js → chunk-MKOQAVOE.js} +21 -21
  308. package/dist/{chunk-BMV2SNYX.js → chunk-MUPWNSEJ.js} +18 -18
  309. package/dist/{chunk-Y5TRG22C.js → chunk-NRXIECWC.js} +2 -2
  310. package/dist/{chunk-GOE7G5JX.js → chunk-NWSAF6P5.js} +2 -2
  311. package/dist/chunk-OB3YGXHQ.js +158 -0
  312. package/dist/chunk-OB3YGXHQ.js.map +1 -0
  313. package/dist/{chunk-DUM363VS.js → chunk-OFZQJNF6.js} +5 -5
  314. package/dist/{chunk-CKN5QPEL.js → chunk-OMF7POEY.js} +2 -2
  315. package/dist/{chunk-MVXKO2BD.js → chunk-OXD6ET34.js} +1 -1
  316. package/dist/{chunk-47JUEVME.js → chunk-PALX6HWV.js} +21 -21
  317. package/dist/{chunk-B6OGSG7I.js → chunk-PE3BLBDT.js} +3 -3
  318. package/dist/{chunk-RVISSNVE.js → chunk-PMZKJOG6.js} +15 -15
  319. package/dist/{chunk-CESAMXWX.js → chunk-PQUTMG3S.js} +2 -2
  320. package/dist/{chunk-7VFCOKPG.js → chunk-PWBGODZU.js} +3 -3
  321. package/dist/{chunk-MOPAXD2H.js → chunk-QCADUTYX.js} +2 -2
  322. package/dist/{chunk-CT5FBO7E.js → chunk-RPOUJI25.js} +1 -1
  323. package/dist/{chunk-VE3FKXJ7.js → chunk-RUSXEE7X.js} +35 -32
  324. package/dist/chunk-RUSXEE7X.js.map +1 -0
  325. package/dist/{chunk-WKHYOS72.js → chunk-RW4GFE56.js} +3 -3
  326. package/dist/{chunk-FH4GO7HO.js → chunk-RYLVVDR7.js} +1 -1
  327. package/dist/{chunk-QZRDCFHI.js → chunk-S66SBBFQ.js} +5 -5
  328. package/dist/{chunk-CQJFIPAH.js → chunk-S7TNV2I7.js} +14 -14
  329. package/dist/{chunk-ZBQSIGGR.js → chunk-SC773IMJ.js} +13 -13
  330. package/dist/{chunk-RZV7SXED.js → chunk-SF3M27AN.js} +37 -12
  331. package/dist/chunk-SF3M27AN.js.map +1 -0
  332. package/dist/{chunk-FBJ2HK7A.js → chunk-SGPJ3YS2.js} +20 -20
  333. package/dist/{chunk-A2EWJQXX.js → chunk-SM5QX6UK.js} +4 -4
  334. package/dist/chunk-SWCLN6JE.js +40 -0
  335. package/dist/chunk-SWCLN6JE.js.map +1 -0
  336. package/dist/{chunk-OS3EQOIS.js → chunk-T4F5TW2X.js} +29 -24
  337. package/dist/chunk-T4F5TW2X.js.map +1 -0
  338. package/dist/{chunk-RKZWCTXV.js → chunk-TAEKDMEF.js} +2 -2
  339. package/dist/{chunk-6AVCAUGL.js → chunk-TASEV25T.js} +3 -3
  340. package/dist/{chunk-3XOISKZC.js → chunk-TLGDPMUX.js} +6 -6
  341. package/dist/{chunk-MOF3XSUM.js → chunk-TREHTIBD.js} +3 -2
  342. package/dist/chunk-TREHTIBD.js.map +1 -0
  343. package/dist/{chunk-HUQHJSPV.js → chunk-TTPXGD5S.js} +68 -33
  344. package/dist/chunk-TTPXGD5S.js.map +1 -0
  345. package/dist/{chunk-NFCYIZHX.js → chunk-TXIIBNCA.js} +7 -3
  346. package/dist/{chunk-NFCYIZHX.js.map → chunk-TXIIBNCA.js.map} +1 -1
  347. package/dist/{chunk-5IUW34PG.js → chunk-TY3QYPJ6.js} +7 -7
  348. package/dist/{chunk-VQFR4EU4.js → chunk-U3JK5VJV.js} +2 -2
  349. package/dist/{chunk-2AWMJO54.js → chunk-U42P3RMZ.js} +5 -5
  350. package/dist/{chunk-2RIUMV7S.js → chunk-UBIJBLUK.js} +234 -234
  351. package/dist/chunk-UBIJBLUK.js.map +1 -0
  352. package/dist/{chunk-GUU75DES.js → chunk-UEJTOPLW.js} +8 -8
  353. package/dist/{chunk-QWCTYLMD.js → chunk-URDONAEJ.js} +240 -204
  354. package/dist/chunk-URDONAEJ.js.map +1 -0
  355. package/dist/{chunk-OZOEWLGR.js → chunk-UT6JAORE.js} +4 -4
  356. package/dist/{chunk-5TELOQA6.js → chunk-UTHPUINA.js} +3 -3
  357. package/dist/{chunk-SOV7DTTU.js → chunk-V6HZ2HJZ.js} +67 -67
  358. package/dist/{chunk-SOV7DTTU.js.map → chunk-V6HZ2HJZ.js.map} +1 -1
  359. package/dist/{chunk-26RQ6JBR.js → chunk-VBVCNH6D.js} +5 -5
  360. package/dist/{chunk-P646DND6.js → chunk-VCMQPCME.js} +2 -2
  361. package/dist/{chunk-LV7FMIMM.js → chunk-VGUHAHHV.js} +2 -2
  362. package/dist/{chunk-GYVXARCY.js → chunk-VIBPFVU4.js} +41 -41
  363. package/dist/{chunk-KHPOKZ6Z.js → chunk-VMAC66JX.js} +6 -6
  364. package/dist/{chunk-SHKRS6I5.js → chunk-VRPNETPK.js} +3 -3
  365. package/dist/{chunk-6U4J6RVS.js → chunk-WCHW4XN7.js} +14 -14
  366. package/dist/{chunk-CJH6QUQJ.js → chunk-WD3UXNJV.js} +3 -3
  367. package/dist/{chunk-H5EVWF6L.js → chunk-WR67FJMX.js} +4 -4
  368. package/dist/{chunk-XLIJ36RG.js → chunk-WRMQ7EX4.js} +5 -5
  369. package/dist/{chunk-VVFWOBAM.js → chunk-WTJUKYB2.js} +15 -16
  370. package/dist/chunk-WTJUKYB2.js.map +1 -0
  371. package/dist/{chunk-7KLCFJ5G.js → chunk-X4PPGXQG.js} +2 -2
  372. package/dist/{chunk-ZE2JTVCQ.js → chunk-X5BMQXFD.js} +11 -11
  373. package/dist/{chunk-OYJY4Y4A.js → chunk-XFNLU7EW.js} +14 -7
  374. package/dist/chunk-XFNLU7EW.js.map +1 -0
  375. package/dist/{chunk-UECU6LZI.js → chunk-XXRBOSWV.js} +3 -3
  376. package/dist/{chunk-SPKAIDWX.js → chunk-XZEFCPBL.js} +2 -2
  377. package/dist/{chunk-EZ5NYRHK.js → chunk-YL6N7QLA.js} +5 -5
  378. package/dist/{chunk-Q2ZJOECN.js → chunk-YMVTIV5L.js} +19 -19
  379. package/dist/chunk-YMVTIV5L.js.map +1 -0
  380. package/dist/{chunk-VAIESMPY.js → chunk-YVBHGMKC.js} +4 -4
  381. package/dist/{chunk-AR62NQXE.js → chunk-Z2S5VQG7.js} +2 -2
  382. package/dist/{chunk-2MXUB3ZO.js → chunk-Z5OGTWMZ.js} +15 -2
  383. package/dist/chunk-Z5OGTWMZ.js.map +1 -0
  384. package/dist/{chunk-7UQJEADK.js → chunk-ZL2O4BYP.js} +2 -2
  385. package/dist/{chunk-FOOITLHR.js → chunk-ZZHBT5WQ.js} +2 -2
  386. package/dist/{chunk-X6VJQJYY.js → chunk-ZZWHKC6A.js} +3 -3
  387. package/dist/components/timeline-annotation-shared.d.ts +1 -9
  388. package/dist/composer-messages.js +2 -2
  389. package/dist/composer.js +15 -15
  390. package/dist/{computer-viewer-D4NHQB5D.js → computer-viewer-S6TE6TN7.js} +8 -8
  391. package/dist/connect.js +12 -11
  392. package/dist/desktop.js +2 -2
  393. package/dist/editor.js +2 -2
  394. package/dist/{embedded-new-voice-X4ZW6SY4.js → embedded-new-voice-ZDZPGX25.js} +8 -8
  395. package/dist/{embedded-voice-4OD6Z3HU.js → embedded-voice-FKCUXSJO.js} +8 -8
  396. package/dist/{fleet-decision-row-5UCJXTDP.js → fleet-decision-row-VCGWYJAV.js} +2 -2
  397. package/dist/hooks/page-wake.d.ts +21 -0
  398. package/dist/hooks/use-session-events.d.ts +1 -0
  399. package/dist/index.js +206 -205
  400. package/dist/interaction.js +9 -9
  401. package/dist/{latest-question-VGVNUGAU.js → latest-question-SINEV4U6.js} +3 -3
  402. package/dist/lib/format.d.ts +3 -2
  403. package/dist/machines.js +6 -6
  404. package/dist/messages/en.d.ts +12 -3
  405. package/dist/messages.js +1 -1
  406. package/dist/model-picker-model.js +2 -2
  407. package/dist/{model-policy-picker-menu-XOPYY6YA.js → model-policy-picker-menu-66JPM3G5.js} +6 -6
  408. package/dist/model-policy-picker-menu-66JPM3G5.js.map +1 -0
  409. package/dist/model-policy.js +1 -1
  410. package/dist/native-previews.js +3 -3
  411. package/dist/{platform-activity-row-56XOVTRA.js → platform-activity-row-LU5WABI2.js} +2 -2
  412. package/dist/{queue-surface-implementation-OZDOBJ6W.js → queue-surface-implementation-Y4OUVS7N.js} +8 -7
  413. package/dist/{queue-surface-implementation-OZDOBJ6W.js.map → queue-surface-implementation-Y4OUVS7N.js.map} +1 -1
  414. package/dist/realtime.js +7 -7
  415. package/dist/{sandbox-files-LJCR437H.js → sandbox-files-NBIVKVCZ.js} +11 -11
  416. package/dist/sandbox-files-NBIVKVCZ.js.map +1 -0
  417. package/dist/session-app.js +266 -260
  418. package/dist/session-list-model.js +3 -3
  419. package/dist/{session-realtime-UISLBZ4A.js → session-realtime-3PALSNMJ.js} +3 -3
  420. package/dist/session-realtime-3PALSNMJ.js.map +1 -0
  421. package/dist/session-realtime.js +2 -2
  422. package/dist/session-ui.js +62 -61
  423. package/dist/session.d.ts +1 -1
  424. package/dist/session.js +17 -17
  425. package/dist/sites.js +2 -2
  426. package/dist/terminal.js +2 -2
  427. package/dist/this-computer.js +3 -3
  428. package/dist/timeline/annotation-model.d.ts +48 -0
  429. package/dist/{timeline-annotation-markers-ACT7XRMW.js → timeline-annotation-markers-6526H2NM.js} +11 -9
  430. package/dist/{timeline-annotation-markers-ACT7XRMW.js.map → timeline-annotation-markers-6526H2NM.js.map} +1 -1
  431. package/dist/{timeline-annotation-selection-2IA7T5VR.js → timeline-annotation-selection-KV5SM6TA.js} +16 -62
  432. package/dist/timeline-annotation-selection-KV5SM6TA.js.map +1 -0
  433. package/dist/{timeline-annotations-dialog-W5B2HMYY.js → timeline-annotations-dialog-7CDHWC7Y.js} +12 -10
  434. package/dist/{timeline-annotations-dialog-W5B2HMYY.js.map → timeline-annotations-dialog-7CDHWC7Y.js.map} +1 -1
  435. package/dist/timeline-model.d.ts +3 -0
  436. package/dist/timeline-model.js +40 -14
  437. package/dist/ui/access-list.js +24 -24
  438. package/dist/ui/choice-cards.js +2 -2
  439. package/dist/ui/composer-menu-action.js +2 -2
  440. package/dist/ui/context-menu.d.ts +3 -1
  441. package/dist/ui/context-menu.js +3 -1
  442. package/dist/ui/detail-page.js +3 -3
  443. package/dist/ui/detail-sheet.js +3 -3
  444. package/dist/ui/diff-view.js +3 -3
  445. package/dist/ui/disclosure.js +5 -5
  446. package/dist/ui/dropdown-menu.js +1 -1
  447. package/dist/ui/flush-form-page.js +5 -5
  448. package/dist/ui/form-dialog.js +4 -4
  449. package/dist/ui/list-row.js +5 -5
  450. package/dist/ui/load-failure.js +3 -3
  451. package/dist/ui/page-actions.js +3 -3
  452. package/dist/ui/revision-history.js +11 -11
  453. package/dist/ui/role-select.js +8 -8
  454. package/dist/ui/segmented-control.js +1 -1
  455. package/dist/ui/settings-nav.js +3 -3
  456. package/dist/ui/toolbar.js +3 -3
  457. package/dist/usage.js +2 -2
  458. package/dist/workbench.js +11 -11
  459. package/package.json +4 -4
  460. package/src/app/app-state.tsx +2 -1
  461. package/src/app/components/command-menu/chat-switcher.tsx +135 -0
  462. package/src/app/components/command-menu/command-menu.tsx +840 -0
  463. package/src/app/components/command-menu/keycaps.tsx +56 -0
  464. package/src/app/components/command-menu/shortcut-sheet.tsx +155 -0
  465. package/src/app/components/credits/credit-refusal-notice.test.tsx +132 -0
  466. package/src/app/components/credits/credit-refusal-notice.tsx +92 -0
  467. package/src/app/components/rail/rail-context.tsx +28 -5
  468. package/src/app/components/rail/rail-sections.tsx +3 -5
  469. package/src/app/components/rail/session-header-mute.test.tsx +23 -1
  470. package/src/app/components/rail/session-header.test.tsx +21 -2
  471. package/src/app/components/rail/session-header.tsx +31 -1
  472. package/src/app/components/rail/session-list.tsx +89 -16
  473. package/src/app/components/rail/session-shell.tsx +0 -14
  474. package/src/app/components/session/session-search-dialog.tsx +12 -1
  475. package/src/app/embed/session-app.tsx +6 -3
  476. package/src/app/lib/actions/actions-provider.tsx +486 -0
  477. package/src/app/lib/actions/actions.test.ts +249 -0
  478. package/src/app/lib/actions/chat-directory.ts +231 -0
  479. package/src/app/lib/actions/chat-operations.ts +145 -0
  480. package/src/app/lib/actions/chat-switcher.ts +62 -0
  481. package/src/app/lib/actions/chords.ts +185 -0
  482. package/src/app/lib/actions/events.ts +10 -0
  483. package/src/app/lib/actions/rank.ts +119 -0
  484. package/src/app/lib/actions/registry.ts +333 -0
  485. package/src/app/lib/credit-coverage.test.ts +83 -0
  486. package/src/app/lib/credit-coverage.tsx +48 -0
  487. package/src/app/lib/free-credit-gap.test.ts +32 -1
  488. package/src/app/lib/free-credit-gap.tsx +32 -2
  489. package/src/app/lib/integration-connect-analytics.test.ts +1 -0
  490. package/src/app/lib/integration-connect-analytics.tsx +4 -0
  491. package/src/app/lib/models-route.test.ts +18 -0
  492. package/src/app/lib/models-route.tsx +26 -4
  493. package/src/app/lib/session-search-route.tsx +6 -1
  494. package/src/app/lib/session-ui-features.tsx +28 -9
  495. package/src/app/routes/session.tsx +74 -16
  496. package/src/app/routes/sessions-index.tsx +83 -4
  497. package/src/components/timeline-annotation-selection.tsx +9 -64
  498. package/src/components/timeline-annotation-shared.ts +9 -57
  499. package/src/hooks/page-wake.ts +80 -0
  500. package/src/hooks/use-session-events.ts +309 -81
  501. package/src/lib/format.ts +3 -2
  502. package/src/messages/en.ts +13 -3
  503. package/src/model-picker-model.ts +3 -0
  504. package/src/model-policy.ts +9 -1
  505. package/src/session.ts +1 -0
  506. package/src/timeline/annotation-model.ts +217 -0
  507. package/src/timeline/projection.ts +27 -21
  508. package/src/timeline-model.ts +14 -0
  509. package/src/ui/context-menu.tsx +16 -0
  510. package/src/ui/dropdown-menu.tsx +4 -1
  511. package/src/ui/segmented-control.tsx +3 -0
  512. package/styles/compiled.css +92 -0
  513. package/dist/app/lib/keyboard-shortcuts.d.ts +0 -51
  514. package/dist/app/lib/keyboard-shortcuts.js +0 -16
  515. package/dist/chunk-2MXUB3ZO.js.map +0 -1
  516. package/dist/chunk-2RIUMV7S.js.map +0 -1
  517. package/dist/chunk-53IXIUYP.js +0 -39
  518. package/dist/chunk-53IXIUYP.js.map +0 -1
  519. package/dist/chunk-DN3TKURW.js.map +0 -1
  520. package/dist/chunk-F2GXK2Z6.js.map +0 -1
  521. package/dist/chunk-G7VLL3PG.js.map +0 -1
  522. package/dist/chunk-GRLPRM56.js.map +0 -1
  523. package/dist/chunk-HUQHJSPV.js.map +0 -1
  524. package/dist/chunk-IO6K6UYJ.js.map +0 -1
  525. package/dist/chunk-KWB5U3ZT.js.map +0 -1
  526. package/dist/chunk-L5UCO2UV.js.map +0 -1
  527. package/dist/chunk-MOF3XSUM.js.map +0 -1
  528. package/dist/chunk-N2BEUKXT.js.map +0 -1
  529. package/dist/chunk-OS3EQOIS.js.map +0 -1
  530. package/dist/chunk-OYJY4Y4A.js.map +0 -1
  531. package/dist/chunk-Q2ZJOECN.js.map +0 -1
  532. package/dist/chunk-QWCTYLMD.js.map +0 -1
  533. package/dist/chunk-RZV7SXED.js.map +0 -1
  534. package/dist/chunk-S3M5WCZW.js.map +0 -1
  535. package/dist/chunk-SOOWLNC5.js.map +0 -1
  536. package/dist/chunk-SWWYYGQO.js.map +0 -1
  537. package/dist/chunk-UO36FC3S.js.map +0 -1
  538. package/dist/chunk-UYSZKDQY.js.map +0 -1
  539. package/dist/chunk-VE3FKXJ7.js.map +0 -1
  540. package/dist/chunk-VVFWOBAM.js.map +0 -1
  541. package/dist/chunk-ZSERYHHT.js.map +0 -1
  542. package/dist/timeline-annotation-selection-2IA7T5VR.js.map +0 -1
  543. package/src/app/lib/keyboard-shortcuts.test.ts +0 -47
  544. package/src/app/lib/keyboard-shortcuts.tsx +0 -58
  545. /package/dist/app/{lib/keyboard-shortcuts.js.map → components/command-menu/keycaps.js.map} +0 -0
  546. /package/dist/{browser-viewer-ZRFZX3VN.js.map → app/components/credits/credit-refusal-notice.js.map} +0 -0
  547. /package/dist/{chat-interactive-block-HUMYWVCK.js.map → app/lib/actions/actions-provider.js.map} +0 -0
  548. /package/dist/{computer-viewer-D4NHQB5D.js.map → app/lib/credit-coverage.js.map} +0 -0
  549. /package/dist/{embedded-new-voice-X4ZW6SY4.js.map → browser-viewer-HPUMK7UP.js.map} +0 -0
  550. /package/dist/{embedded-voice-4OD6Z3HU.js.map → chat-interactive-block-22PPECCT.js.map} +0 -0
  551. /package/dist/{chunk-GVIQ7H62.js.map → chunk-2LUBBDZV.js.map} +0 -0
  552. /package/dist/{chunk-XMMVIY7B.js.map → chunk-3CCJWHQY.js.map} +0 -0
  553. /package/dist/{chunk-XS2FZ6DX.js.map → chunk-3F5ZPIWI.js.map} +0 -0
  554. /package/dist/{chunk-72US6QNB.js.map → chunk-3J2YZRY5.js.map} +0 -0
  555. /package/dist/{chunk-D4YQF4E3.js.map → chunk-3SMJ2BIQ.js.map} +0 -0
  556. /package/dist/{chunk-TBJINQXA.js.map → chunk-3WCYK36X.js.map} +0 -0
  557. /package/dist/{chunk-WPCF34V6.js.map → chunk-3WG3CRL7.js.map} +0 -0
  558. /package/dist/{chunk-JI5BYQKO.js.map → chunk-3X46PNBX.js.map} +0 -0
  559. /package/dist/{chunk-PBK44WJC.js.map → chunk-4GJ37O6G.js.map} +0 -0
  560. /package/dist/{chunk-LEXPBQ56.js.map → chunk-4SKJX3C4.js.map} +0 -0
  561. /package/dist/{chunk-ZA6YD2LW.js.map → chunk-57SYK776.js.map} +0 -0
  562. /package/dist/{chunk-22LBKJDE.js.map → chunk-5DIAN5GQ.js.map} +0 -0
  563. /package/dist/{chunk-LJ3TDK2L.js.map → chunk-5FA455GR.js.map} +0 -0
  564. /package/dist/{chunk-YPR5INHV.js.map → chunk-5X3E2Z3D.js.map} +0 -0
  565. /package/dist/{chunk-OXNWZTEU.js.map → chunk-5ZJCL6X4.js.map} +0 -0
  566. /package/dist/{chunk-62OAZ4LO.js.map → chunk-6C5GQQMC.js.map} +0 -0
  567. /package/dist/{chunk-VGITH57T.js.map → chunk-6ERTXDZM.js.map} +0 -0
  568. /package/dist/{chunk-ZQ7XQZCF.js.map → chunk-6FX73Y4I.js.map} +0 -0
  569. /package/dist/{chunk-QZO2KK2F.js.map → chunk-6P44NG6Y.js.map} +0 -0
  570. /package/dist/{chunk-N2DDJLTM.js.map → chunk-6T7Y33JA.js.map} +0 -0
  571. /package/dist/{chunk-RBAGC2MJ.js.map → chunk-75VE5QUS.js.map} +0 -0
  572. /package/dist/{chunk-MRXOGI3O.js.map → chunk-77CUDSHG.js.map} +0 -0
  573. /package/dist/{chunk-GZ65XQR5.js.map → chunk-7T7FHSGS.js.map} +0 -0
  574. /package/dist/{chunk-YGAH34CD.js.map → chunk-A3S26JSP.js.map} +0 -0
  575. /package/dist/{chunk-GYPAO6RS.js.map → chunk-A664GSDM.js.map} +0 -0
  576. /package/dist/{chunk-JSZSNMDR.js.map → chunk-ASUYLXKO.js.map} +0 -0
  577. /package/dist/{chunk-RTK7SUPL.js.map → chunk-AUUJLVA3.js.map} +0 -0
  578. /package/dist/{chunk-OOTBYSCA.js.map → chunk-BBWKPNJB.js.map} +0 -0
  579. /package/dist/{chunk-BGZIMIUU.js.map → chunk-BCUYWOQU.js.map} +0 -0
  580. /package/dist/{chunk-EKN4N4LS.js.map → chunk-BDFMNJZJ.js.map} +0 -0
  581. /package/dist/{chunk-YZKGOWCC.js.map → chunk-BIDXQAGO.js.map} +0 -0
  582. /package/dist/{chunk-Q2UUANHF.js.map → chunk-BIKAJ4DY.js.map} +0 -0
  583. /package/dist/{chunk-5IQBF2X3.js.map → chunk-BJPJ2OUX.js.map} +0 -0
  584. /package/dist/{chunk-EY2EMHZW.js.map → chunk-BPM2OTYK.js.map} +0 -0
  585. /package/dist/{chunk-MT4TBRQB.js.map → chunk-BSWS2RUZ.js.map} +0 -0
  586. /package/dist/{chunk-T7YD3VGK.js.map → chunk-C52MNKXU.js.map} +0 -0
  587. /package/dist/{chunk-THNW33K7.js.map → chunk-CEUDV4OA.js.map} +0 -0
  588. /package/dist/{chunk-LHGIS6SZ.js.map → chunk-CVK74BH7.js.map} +0 -0
  589. /package/dist/{chunk-DFO2UCYG.js.map → chunk-CW5I65ZX.js.map} +0 -0
  590. /package/dist/{chunk-SKRLKQEG.js.map → chunk-DOSC2HRQ.js.map} +0 -0
  591. /package/dist/{chunk-KVB6XDLP.js.map → chunk-DPJ2CWVN.js.map} +0 -0
  592. /package/dist/{chunk-4J6V4DH7.js.map → chunk-DXMRO2MU.js.map} +0 -0
  593. /package/dist/{chunk-42I4O4WQ.js.map → chunk-EE55IDDR.js.map} +0 -0
  594. /package/dist/{chunk-2RA6XABP.js.map → chunk-EEERTLFF.js.map} +0 -0
  595. /package/dist/{chunk-PTOTKUKO.js.map → chunk-EEO744XR.js.map} +0 -0
  596. /package/dist/{chunk-LD3HVI2J.js.map → chunk-EMFGBAQL.js.map} +0 -0
  597. /package/dist/{chunk-FQGUK4ST.js.map → chunk-ENPJKVMN.js.map} +0 -0
  598. /package/dist/{chunk-HDHK3SXK.js.map → chunk-EU6RLHMP.js.map} +0 -0
  599. /package/dist/{chunk-MRUWRQBX.js.map → chunk-FET6XHGS.js.map} +0 -0
  600. /package/dist/{chunk-M6KUY3YH.js.map → chunk-FIICQA55.js.map} +0 -0
  601. /package/dist/{chunk-NLWLCYCT.js.map → chunk-FTZXCPE3.js.map} +0 -0
  602. /package/dist/{chunk-FN2KA3MJ.js.map → chunk-FUS76DO4.js.map} +0 -0
  603. /package/dist/{chunk-AM4IIPWI.js.map → chunk-G7N5NPRJ.js.map} +0 -0
  604. /package/dist/{chunk-CCQ7YKOD.js.map → chunk-GBYZ6653.js.map} +0 -0
  605. /package/dist/{chunk-YKKVIJVX.js.map → chunk-GQDSC6QZ.js.map} +0 -0
  606. /package/dist/{chunk-5X6JP75Q.js.map → chunk-GRSODLVO.js.map} +0 -0
  607. /package/dist/{chunk-73YP3R5X.js.map → chunk-GSESCQFY.js.map} +0 -0
  608. /package/dist/{chunk-MZLEBFUZ.js.map → chunk-GZD6VBIK.js.map} +0 -0
  609. /package/dist/{chunk-IZR2QRFF.js.map → chunk-H3HH5AHS.js.map} +0 -0
  610. /package/dist/{chunk-OJPUVUB6.js.map → chunk-HAOZCLLA.js.map} +0 -0
  611. /package/dist/{chunk-ZBHDGAYL.js.map → chunk-HEFE4OZJ.js.map} +0 -0
  612. /package/dist/{chunk-WTG34JVA.js.map → chunk-HI75UTI6.js.map} +0 -0
  613. /package/dist/{chunk-OMBIG3NC.js.map → chunk-HM633ROV.js.map} +0 -0
  614. /package/dist/{chunk-WDFZWSKD.js.map → chunk-HRIP4M6H.js.map} +0 -0
  615. /package/dist/{chunk-A2BCW6CQ.js.map → chunk-HU2DRFFI.js.map} +0 -0
  616. /package/dist/{chunk-PO35PBAB.js.map → chunk-HVH7FFJH.js.map} +0 -0
  617. /package/dist/{chunk-EG7KNUF7.js.map → chunk-HYTXTKST.js.map} +0 -0
  618. /package/dist/{chunk-TFHG75A4.js.map → chunk-I4XMDFUJ.js.map} +0 -0
  619. /package/dist/{chunk-IZHVZZQA.js.map → chunk-ICAUYWSL.js.map} +0 -0
  620. /package/dist/{chunk-DCLPWYP3.js.map → chunk-IEVPJ3G6.js.map} +0 -0
  621. /package/dist/{chunk-EVWZHDSF.js.map → chunk-IKH3VTA4.js.map} +0 -0
  622. /package/dist/{chunk-TYHLEFD2.js.map → chunk-IZJNMRIR.js.map} +0 -0
  623. /package/dist/{chunk-D2SR3TEB.js.map → chunk-J243WGUA.js.map} +0 -0
  624. /package/dist/{chunk-QGSGIYE3.js.map → chunk-J2C6LB6W.js.map} +0 -0
  625. /package/dist/{chunk-MT6TRTXF.js.map → chunk-J5MEDX7C.js.map} +0 -0
  626. /package/dist/{chunk-6QHUKBJP.js.map → chunk-J7SKOO44.js.map} +0 -0
  627. /package/dist/{chunk-W2QK7PYS.js.map → chunk-JAAST75A.js.map} +0 -0
  628. /package/dist/{chunk-NQCMS4AJ.js.map → chunk-JQCGPTZ6.js.map} +0 -0
  629. /package/dist/{chunk-CMUXJHGH.js.map → chunk-JRSCWQMC.js.map} +0 -0
  630. /package/dist/{chunk-Q4OHNGGB.js.map → chunk-JRXHSVD5.js.map} +0 -0
  631. /package/dist/{chunk-SD2K5ZN5.js.map → chunk-JXYLDT6X.js.map} +0 -0
  632. /package/dist/{chunk-IXX6ZOL2.js.map → chunk-KGTMHEAP.js.map} +0 -0
  633. /package/dist/{chunk-22OBGVEJ.js.map → chunk-KOXVGPW4.js.map} +0 -0
  634. /package/dist/{chunk-NOZ5CGZE.js.map → chunk-L5GPPMUB.js.map} +0 -0
  635. /package/dist/{chunk-4FOOHMTU.js.map → chunk-LY6727IF.js.map} +0 -0
  636. /package/dist/{chunk-PT7MTXRE.js.map → chunk-MAOCN7J6.js.map} +0 -0
  637. /package/dist/{chunk-4K2JSJNX.js.map → chunk-MB5LZVDO.js.map} +0 -0
  638. /package/dist/{chunk-5LES64PP.js.map → chunk-MKOQAVOE.js.map} +0 -0
  639. /package/dist/{chunk-BMV2SNYX.js.map → chunk-MUPWNSEJ.js.map} +0 -0
  640. /package/dist/{chunk-Y5TRG22C.js.map → chunk-NRXIECWC.js.map} +0 -0
  641. /package/dist/{chunk-GOE7G5JX.js.map → chunk-NWSAF6P5.js.map} +0 -0
  642. /package/dist/{chunk-DUM363VS.js.map → chunk-OFZQJNF6.js.map} +0 -0
  643. /package/dist/{chunk-CKN5QPEL.js.map → chunk-OMF7POEY.js.map} +0 -0
  644. /package/dist/{chunk-MVXKO2BD.js.map → chunk-OXD6ET34.js.map} +0 -0
  645. /package/dist/{chunk-47JUEVME.js.map → chunk-PALX6HWV.js.map} +0 -0
  646. /package/dist/{chunk-B6OGSG7I.js.map → chunk-PE3BLBDT.js.map} +0 -0
  647. /package/dist/{chunk-RVISSNVE.js.map → chunk-PMZKJOG6.js.map} +0 -0
  648. /package/dist/{chunk-CESAMXWX.js.map → chunk-PQUTMG3S.js.map} +0 -0
  649. /package/dist/{chunk-7VFCOKPG.js.map → chunk-PWBGODZU.js.map} +0 -0
  650. /package/dist/{chunk-MOPAXD2H.js.map → chunk-QCADUTYX.js.map} +0 -0
  651. /package/dist/{chunk-CT5FBO7E.js.map → chunk-RPOUJI25.js.map} +0 -0
  652. /package/dist/{chunk-WKHYOS72.js.map → chunk-RW4GFE56.js.map} +0 -0
  653. /package/dist/{chunk-FH4GO7HO.js.map → chunk-RYLVVDR7.js.map} +0 -0
  654. /package/dist/{chunk-QZRDCFHI.js.map → chunk-S66SBBFQ.js.map} +0 -0
  655. /package/dist/{chunk-CQJFIPAH.js.map → chunk-S7TNV2I7.js.map} +0 -0
  656. /package/dist/{chunk-ZBQSIGGR.js.map → chunk-SC773IMJ.js.map} +0 -0
  657. /package/dist/{chunk-FBJ2HK7A.js.map → chunk-SGPJ3YS2.js.map} +0 -0
  658. /package/dist/{chunk-A2EWJQXX.js.map → chunk-SM5QX6UK.js.map} +0 -0
  659. /package/dist/{chunk-RKZWCTXV.js.map → chunk-TAEKDMEF.js.map} +0 -0
  660. /package/dist/{chunk-6AVCAUGL.js.map → chunk-TASEV25T.js.map} +0 -0
  661. /package/dist/{chunk-3XOISKZC.js.map → chunk-TLGDPMUX.js.map} +0 -0
  662. /package/dist/{chunk-5IUW34PG.js.map → chunk-TY3QYPJ6.js.map} +0 -0
  663. /package/dist/{chunk-VQFR4EU4.js.map → chunk-U3JK5VJV.js.map} +0 -0
  664. /package/dist/{chunk-2AWMJO54.js.map → chunk-U42P3RMZ.js.map} +0 -0
  665. /package/dist/{chunk-GUU75DES.js.map → chunk-UEJTOPLW.js.map} +0 -0
  666. /package/dist/{chunk-OZOEWLGR.js.map → chunk-UT6JAORE.js.map} +0 -0
  667. /package/dist/{chunk-5TELOQA6.js.map → chunk-UTHPUINA.js.map} +0 -0
  668. /package/dist/{chunk-26RQ6JBR.js.map → chunk-VBVCNH6D.js.map} +0 -0
  669. /package/dist/{chunk-P646DND6.js.map → chunk-VCMQPCME.js.map} +0 -0
  670. /package/dist/{chunk-LV7FMIMM.js.map → chunk-VGUHAHHV.js.map} +0 -0
  671. /package/dist/{chunk-GYVXARCY.js.map → chunk-VIBPFVU4.js.map} +0 -0
  672. /package/dist/{chunk-KHPOKZ6Z.js.map → chunk-VMAC66JX.js.map} +0 -0
  673. /package/dist/{chunk-SHKRS6I5.js.map → chunk-VRPNETPK.js.map} +0 -0
  674. /package/dist/{chunk-6U4J6RVS.js.map → chunk-WCHW4XN7.js.map} +0 -0
  675. /package/dist/{chunk-CJH6QUQJ.js.map → chunk-WD3UXNJV.js.map} +0 -0
  676. /package/dist/{chunk-H5EVWF6L.js.map → chunk-WR67FJMX.js.map} +0 -0
  677. /package/dist/{chunk-XLIJ36RG.js.map → chunk-WRMQ7EX4.js.map} +0 -0
  678. /package/dist/{chunk-7KLCFJ5G.js.map → chunk-X4PPGXQG.js.map} +0 -0
  679. /package/dist/{chunk-ZE2JTVCQ.js.map → chunk-X5BMQXFD.js.map} +0 -0
  680. /package/dist/{chunk-UECU6LZI.js.map → chunk-XXRBOSWV.js.map} +0 -0
  681. /package/dist/{chunk-SPKAIDWX.js.map → chunk-XZEFCPBL.js.map} +0 -0
  682. /package/dist/{chunk-EZ5NYRHK.js.map → chunk-YL6N7QLA.js.map} +0 -0
  683. /package/dist/{chunk-VAIESMPY.js.map → chunk-YVBHGMKC.js.map} +0 -0
  684. /package/dist/{chunk-AR62NQXE.js.map → chunk-Z2S5VQG7.js.map} +0 -0
  685. /package/dist/{chunk-7UQJEADK.js.map → chunk-ZL2O4BYP.js.map} +0 -0
  686. /package/dist/{chunk-FOOITLHR.js.map → chunk-ZZHBT5WQ.js.map} +0 -0
  687. /package/dist/{chunk-X6VJQJYY.js.map → chunk-ZZWHKC6A.js.map} +0 -0
  688. /package/dist/{model-policy-picker-menu-XOPYY6YA.js.map → computer-viewer-S6TE6TN7.js.map} +0 -0
  689. /package/dist/{sandbox-files-LJCR437H.js.map → embedded-new-voice-ZDZPGX25.js.map} +0 -0
  690. /package/dist/{session-realtime-UISLBZ4A.js.map → embedded-voice-FKCUXSJO.js.map} +0 -0
  691. /package/dist/{fleet-decision-row-5UCJXTDP.js.map → fleet-decision-row-VCGWYJAV.js.map} +0 -0
  692. /package/dist/{latest-question-VGVNUGAU.js.map → latest-question-SINEV4U6.js.map} +0 -0
  693. /package/dist/{platform-activity-row-56XOVTRA.js.map → platform-activity-row-LU5WABI2.js.map} +0 -0
@@ -1,121 +1,13 @@
1
1
  "use client";
2
2
  import {
3
3
  formatElapsed
4
- } from "./chunk-2RIUMV7S.js";
4
+ } from "./chunk-UBIJBLUK.js";
5
5
  import {
6
6
  timelineGroupContainsPresentedImage
7
7
  } from "./chunk-ANHUMDJX.js";
8
8
  import {
9
9
  formatClockTime
10
- } from "./chunk-UYSZKDQY.js";
11
-
12
- // src/timeline/work-presentation.ts
13
- function durationBetween(startedAt, endedAt) {
14
- const started = Date.parse(startedAt);
15
- const ended = Date.parse(endedAt);
16
- if (!Number.isFinite(started) || !Number.isFinite(ended) || ended < started) {
17
- return void 0;
18
- }
19
- return ended - started;
20
- }
21
- function compactedLandmarkCount(groups) {
22
- return groups.filter(
23
- (group) => group.kind === "item" && group.item.kind === "context-compaction" && group.item.phase === "compacted"
24
- ).length;
25
- }
26
- function clusterIsSettled(group) {
27
- return group.items.every((item) => {
28
- if (item.kind === "reasoning" || item.kind === "agent-message") {
29
- return !item.streaming;
30
- }
31
- if (item.kind === "memory" || item.kind === "fleet-decision") {
32
- return true;
33
- }
34
- return item.status !== "running";
35
- });
36
- }
37
- function flattenActivityItems(groups) {
38
- const items = [];
39
- for (const group of groups) {
40
- if (group.kind === "activity") {
41
- items.push(...flattenActivityItems(group.work?.details ?? []), ...group.items);
42
- } else if (group.kind === "turn") {
43
- items.push(...flattenActivityItems(group.groups));
44
- }
45
- }
46
- return items;
47
- }
48
- function isPreparingWork(group, options) {
49
- if (!group.work) return false;
50
- if (group.work.steps && group.work.steps.state !== "complete") return false;
51
- const phases = group.items.filter((item) => item.kind === "startup-phase");
52
- return !options.startupDetails && !options.startupDismissed && !group.work.endedAt && !group.work.waiting && phases.length > 0 && group.items.every(
53
- (item) => item.kind === "startup-phase" || item.kind === "reasoning" && !item.text.trim()
54
- ) && !phases.some((item) => item.status === "failed" || item.status === "cancelled");
55
- }
56
- function readableWorkHasDetails(group, options) {
57
- if (group.work.steps && group.work.steps.state !== "complete") return true;
58
- return group.work.details.some(
59
- (detail) => options.startupDetails || detail.kind !== "activity" || Boolean(detail.work) || !detail.items.every(
60
- (item) => item.kind === "startup-phase" && item.status !== "failed" && item.status !== "cancelled" || item.kind === "reasoning" && !item.text.trim()
61
- )
62
- );
63
- }
64
- function readableWorkStatus(t, group) {
65
- const end = group.work.endedAt;
66
- const pausedMs = group.work.pausedMs ?? 0;
67
- if (end) {
68
- const durationMs = durationBetween(group.work.startedAt, end);
69
- const cycles = group.work.cycles;
70
- if (cycles)
71
- return {
72
- kind: "worked",
73
- label: t("timeline.workPresentation.countUpdatesOver", { count: cycles.count }),
74
- durationMs
75
- };
76
- return {
77
- kind: "worked",
78
- durationMs: durationMs === void 0 ? void 0 : Math.max(0, durationMs - pausedMs)
79
- };
80
- }
81
- if (group.work.waiting) {
82
- const { untimed, since, ...waiting } = group.work.waiting;
83
- return { kind: "waiting", ...waiting, ...untimed ? {} : { since } };
84
- }
85
- const started = Date.parse(group.work.startedAt);
86
- return {
87
- kind: "working",
88
- since: pausedMs > 0 && Number.isFinite(started) ? new Date(started + pausedMs).toISOString() : group.work.startedAt
89
- };
90
- }
91
- function readableWorkDefaultOpen(group) {
92
- return timelineGroupContainsPresentedImage(group) || group.outcome === "failed" || group.items.some(
93
- (item) => item.kind === "startup-phase" && (item.status === "failed" || // A cancelled phase with a blocked reason is an expected wait (for
94
- // example compacting the conversation first), not an interruption.
95
- item.status === "cancelled" && !item.blockedReason)
96
- ) ? true : void 0;
97
- }
98
- function readableWorkShowsPreview(group) {
99
- return !timelineGroupContainsPresentedImage(group);
100
- }
101
- function rollingActivityItem(items, previousItem, mounted = true) {
102
- const work = items.filter(
103
- (item2) => item2.kind !== "startup-phase" && item2.kind !== "agent-message"
104
- );
105
- const active = work.filter(
106
- (item2) => item2.kind === "reasoning" ? item2.streaming : "status" in item2 && item2.status === "running"
107
- );
108
- const item = !mounted && previousItem && previousItem.kind !== "agent-message" ? previousItem : work.at(-1);
109
- if (!item) return null;
110
- return {
111
- item,
112
- running: active.some((entry) => entry.id === item.id),
113
- earlierCount: Math.max(
114
- 0,
115
- work.findIndex((entry) => entry.id === item.id)
116
- )
117
- };
118
- }
10
+ } from "./chunk-MK54JLE4.js";
119
11
 
120
12
  // src/human-input-model.ts
121
13
  var SAVE_TO_IN_SENTENCE = (t) => ({
@@ -313,30 +205,6 @@ function secretAnswerLabel(t, result, messageOverrides = {}) {
313
205
  return messages.secretSaved(result.vaultName, result.itemName);
314
206
  }
315
207
 
316
- // src/timeline/notice-presentation.ts
317
- function noticeIsResolvedApproval(item) {
318
- return Boolean(item.resolvedAt && item.approval);
319
- }
320
- function noticeDisplayText(t, item) {
321
- return noticeIsResolvedApproval(item) ? t("timeline.noticePresentation.youRespondedToThisApproval") : item.text;
322
- }
323
- function noticeTone(item) {
324
- return item.tone === "failed" ? "failed" : item.tone === "waiting" && !item.resolvedAt ? "waiting" : "neutral";
325
- }
326
- function recordedWaitSummaryText(t, item, now = /* @__PURE__ */ new Date()) {
327
- const agents = item.waitingAgents ?? 0;
328
- const waitedMs = item.waitEndedAt ? durationBetween(item.occurredAt, item.waitEndedAt) : void 0;
329
- if (waitedMs !== void 0) {
330
- const elapsed = formatElapsed(t, waitedMs);
331
- return agents > 0 ? t("timeline.noticePresentation.waitedForAgentsElapsed", { count: agents, elapsed }) : t("timeline.noticePresentation.waitedElapsed", { elapsed });
332
- }
333
- const started = new Date(item.occurredAt);
334
- const since = started.toDateString() === now.toDateString() ? formatClockTime(t, item.occurredAt) : started.toLocaleString(t.locale, { dateStyle: "medium", timeStyle: "short" });
335
- if (item.waitEndedAt)
336
- return agents > 0 ? t("timeline.noticePresentation.waitedForAgentsSince", { count: agents, since }) : t("timeline.noticePresentation.waitedSince", { since });
337
- return agents > 0 ? t("timeline.noticePresentation.waitingForAgentsSince", { count: agents, since }) : t("timeline.noticePresentation.waitingSince", { since });
338
- }
339
-
340
208
  // src/timeline/question-nav-model.ts
341
209
  var QUESTION_NAV_HIDDEN_PX = 24;
342
210
  var QUESTION_NAV_MARGIN_PX = 12;
@@ -372,17 +240,139 @@ function timelineGroupIndexAtSequence(groups, sequence) {
372
240
  return landing;
373
241
  }
374
242
 
243
+ // src/timeline/work-presentation.ts
244
+ function durationBetween(startedAt, endedAt) {
245
+ const started = Date.parse(startedAt);
246
+ const ended = Date.parse(endedAt);
247
+ if (!Number.isFinite(started) || !Number.isFinite(ended) || ended < started) {
248
+ return void 0;
249
+ }
250
+ return ended - started;
251
+ }
252
+ function compactedLandmarkCount(groups) {
253
+ return groups.filter(
254
+ (group) => group.kind === "item" && group.item.kind === "context-compaction" && group.item.phase === "compacted"
255
+ ).length;
256
+ }
257
+ function clusterIsSettled(group) {
258
+ return group.items.every((item) => {
259
+ if (item.kind === "reasoning" || item.kind === "agent-message") {
260
+ return !item.streaming;
261
+ }
262
+ if (item.kind === "memory" || item.kind === "fleet-decision") {
263
+ return true;
264
+ }
265
+ return item.status !== "running";
266
+ });
267
+ }
268
+ function flattenActivityItems(groups) {
269
+ const items = [];
270
+ for (const group of groups) {
271
+ if (group.kind === "activity") {
272
+ items.push(...flattenActivityItems(group.work?.details ?? []), ...group.items);
273
+ } else if (group.kind === "turn") {
274
+ items.push(...flattenActivityItems(group.groups));
275
+ }
276
+ }
277
+ return items;
278
+ }
279
+ function isPreparingWork(group, options) {
280
+ if (!group.work) return false;
281
+ if (group.work.steps && group.work.steps.state !== "complete") return false;
282
+ const phases = group.items.filter((item) => item.kind === "startup-phase");
283
+ return !options.startupDetails && !options.startupDismissed && !group.work.endedAt && !group.work.waiting && phases.length > 0 && group.items.every(
284
+ (item) => item.kind === "startup-phase" || item.kind === "reasoning" && !item.text.trim()
285
+ ) && !phases.some((item) => item.status === "failed" || item.status === "cancelled");
286
+ }
287
+ function readableWorkHasDetails(group, options) {
288
+ if (group.work.steps && group.work.steps.state !== "complete") return true;
289
+ return group.work.details.some(
290
+ (detail) => options.startupDetails || detail.kind !== "activity" || Boolean(detail.work) || !detail.items.every(
291
+ (item) => item.kind === "startup-phase" && item.status !== "failed" && item.status !== "cancelled" || item.kind === "reasoning" && !item.text.trim()
292
+ )
293
+ );
294
+ }
295
+ function readableWorkStatus(t, group) {
296
+ const end = group.work.endedAt;
297
+ const pausedMs = group.work.pausedMs ?? 0;
298
+ if (end) {
299
+ const durationMs = durationBetween(group.work.startedAt, end);
300
+ const cycles = group.work.cycles;
301
+ if (cycles)
302
+ return {
303
+ kind: "worked",
304
+ label: t("timeline.workPresentation.countUpdatesOver", { count: cycles.count }),
305
+ durationMs
306
+ };
307
+ return {
308
+ kind: "worked",
309
+ durationMs: durationMs === void 0 ? void 0 : Math.max(0, durationMs - pausedMs)
310
+ };
311
+ }
312
+ if (group.work.waiting) {
313
+ const { untimed, since, ...waiting } = group.work.waiting;
314
+ return { kind: "waiting", ...waiting, ...untimed ? {} : { since } };
315
+ }
316
+ const started = Date.parse(group.work.startedAt);
317
+ return {
318
+ kind: "working",
319
+ since: pausedMs > 0 && Number.isFinite(started) ? new Date(started + pausedMs).toISOString() : group.work.startedAt
320
+ };
321
+ }
322
+ function readableWorkDefaultOpen(group) {
323
+ return timelineGroupContainsPresentedImage(group) || group.outcome === "failed" || group.items.some(
324
+ (item) => item.kind === "startup-phase" && (item.status === "failed" || // A cancelled phase with a blocked reason is an expected wait (for
325
+ // example compacting the conversation first), not an interruption.
326
+ item.status === "cancelled" && !item.blockedReason)
327
+ ) ? true : void 0;
328
+ }
329
+ function readableWorkShowsPreview(group) {
330
+ return !timelineGroupContainsPresentedImage(group);
331
+ }
332
+ function rollingActivityItem(items, previousItem, mounted = true) {
333
+ const work = items.filter(
334
+ (item2) => item2.kind !== "startup-phase" && item2.kind !== "agent-message"
335
+ );
336
+ const active = work.filter(
337
+ (item2) => item2.kind === "reasoning" ? item2.streaming : "status" in item2 && item2.status === "running"
338
+ );
339
+ const item = !mounted && previousItem && previousItem.kind !== "agent-message" ? previousItem : work.at(-1);
340
+ if (!item) return null;
341
+ return {
342
+ item,
343
+ running: active.some((entry) => entry.id === item.id),
344
+ earlierCount: Math.max(
345
+ 0,
346
+ work.findIndex((entry) => entry.id === item.id)
347
+ )
348
+ };
349
+ }
350
+
351
+ // src/timeline/notice-presentation.ts
352
+ function noticeIsResolvedApproval(item) {
353
+ return Boolean(item.resolvedAt && item.approval);
354
+ }
355
+ function noticeDisplayText(t, item) {
356
+ return noticeIsResolvedApproval(item) ? t("timeline.noticePresentation.youRespondedToThisApproval") : item.text;
357
+ }
358
+ function noticeTone(item) {
359
+ return item.tone === "failed" ? "failed" : item.tone === "waiting" && !item.resolvedAt ? "waiting" : "neutral";
360
+ }
361
+ function recordedWaitSummaryText(t, item, now = /* @__PURE__ */ new Date()) {
362
+ const agents = item.waitingAgents ?? 0;
363
+ const waitedMs = item.waitEndedAt ? durationBetween(item.occurredAt, item.waitEndedAt) : void 0;
364
+ if (waitedMs !== void 0) {
365
+ const elapsed = formatElapsed(t, waitedMs);
366
+ return agents > 0 ? t("timeline.noticePresentation.waitedForAgentsElapsed", { count: agents, elapsed }) : t("timeline.noticePresentation.waitedElapsed", { elapsed });
367
+ }
368
+ const started = new Date(item.occurredAt);
369
+ const since = started.toDateString() === now.toDateString() ? formatClockTime(t, item.occurredAt) : started.toLocaleString(t.locale, { dateStyle: "medium", timeStyle: "short" });
370
+ if (item.waitEndedAt)
371
+ return agents > 0 ? t("timeline.noticePresentation.waitedForAgentsSince", { count: agents, since }) : t("timeline.noticePresentation.waitedSince", { since });
372
+ return agents > 0 ? t("timeline.noticePresentation.waitingForAgentsSince", { count: agents, since }) : t("timeline.noticePresentation.waitingSince", { since });
373
+ }
374
+
375
375
  export {
376
- durationBetween,
377
- compactedLandmarkCount,
378
- clusterIsSettled,
379
- flattenActivityItems,
380
- isPreparingWork,
381
- readableWorkHasDetails,
382
- readableWorkStatus,
383
- readableWorkDefaultOpen,
384
- readableWorkShowsPreview,
385
- rollingActivityItem,
386
376
  defaultHumanInputFormMessages,
387
377
  answersFromDrafts,
388
378
  initialDrafts,
@@ -400,14 +390,24 @@ export {
400
390
  secretPatternMismatch,
401
391
  secretAnswerFromReading,
402
392
  secretAnswerLabel,
403
- noticeIsResolvedApproval,
404
- noticeDisplayText,
405
- noticeTone,
406
- recordedWaitSummaryText,
407
393
  QUESTION_NAV_HIDDEN_PX,
408
394
  QUESTION_NAV_MARGIN_PX,
409
395
  questionNavTarget,
410
396
  timelineGroupSequences,
411
- timelineGroupIndexAtSequence
397
+ timelineGroupIndexAtSequence,
398
+ durationBetween,
399
+ compactedLandmarkCount,
400
+ clusterIsSettled,
401
+ flattenActivityItems,
402
+ isPreparingWork,
403
+ readableWorkHasDetails,
404
+ readableWorkStatus,
405
+ readableWorkDefaultOpen,
406
+ readableWorkShowsPreview,
407
+ rollingActivityItem,
408
+ noticeIsResolvedApproval,
409
+ noticeDisplayText,
410
+ noticeTone,
411
+ recordedWaitSummaryText
412
412
  };
413
- //# sourceMappingURL=chunk-ZSERYHHT.js.map
413
+ //# sourceMappingURL=chunk-IDMXEPHL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/human-input-model.ts","../src/timeline/question-nav-model.ts","../src/timeline/focus-sequence.ts","../src/timeline/work-presentation.ts","../src/timeline/notice-presentation.ts"],"sourcesContent":["import type {\n GeneratePasswordSpec,\n HumanInputAnswer,\n HumanInputQuestion,\n HumanInputSecretAnswer,\n HumanInputSecretAnswerResult,\n HumanInputSecretSaveTo,\n HumanInputSecretSpec,\n} from \"@opengeni/sdk\";\nimport { type OpenGeniText } from \"./messages/runtime\";\n\n/* Pure drafting and validation rules for structured human-input requests,\n shared by the web HumanInputForm and non-DOM renderers. */\n\nexport type HumanInputAnswerDraft = {\n values: string[];\n other: string;\n otherSelected: boolean;\n};\n\nexport type HumanInputFormMessages = {\n title: string;\n description: string;\n submit: string;\n skip: string;\n submitting: string;\n other: string;\n deadlineLabel: string;\n formatDeadline: (value: string) => string;\n required: string;\n otherRequired: string;\n minSelections: (count: number) => string;\n maxSelections: (count: number) => string;\n optional: string;\n /** Shown when the question list overflows the card and more content is below. */\n moreBelow: string;\n questionCount: (count: number) => string;\n collapse: string;\n expand: string;\n selectionHint: (min: number | null | undefined, max: number | null | undefined) => string | null;\n /** Secret questions (`kind: \"secret\"`). */\n secretShow: string;\n secretHide: string;\n secretGenerate: string;\n /** Shown in place of the input when the server will generate the value. */\n secretWillGenerate: string;\n secretUndo: string;\n secretSaveTo: string;\n secretSaveToOptions: Record<HumanInputSecretSaveTo, string>;\n /** One line under Save to: where the value goes. `vault` is the agent's named vault, if any. */\n secretVaultHint: (saveTo: HumanInputSecretSaveTo, vault: string | null) => string;\n /** The requested Save to is not allowed for this person. */\n secretSaveToDowngraded: (\n requested: HumanInputSecretSaveTo,\n actual: HumanInputSecretSaveTo,\n ) => string;\n secretLooksLike: (example: string) => string;\n /** Soft warning only: the value does not match the agent's pattern. */\n secretPatternWarning: (looksLike: string | null) => string;\n /** The answered chip: \"Saved to Private › GitHub\". */\n secretSaved: (vaultName: string, itemName: string) => string;\n};\n\nconst SAVE_TO_IN_SENTENCE = (t: OpenGeniText): Record<HumanInputSecretSaveTo, string> => ({\n user: t(\"humanInputModel.onlyMe\"),\n task: t(\"humanInputModel.thisTask\"),\n workspace: t(\"humanInputModel.thisWorkspace\"),\n});\n\nexport const defaultHumanInputFormMessages = (t: OpenGeniText): HumanInputFormMessages => ({\n title: t(\"humanInputModel.inputRequired\"),\n /** Multi-question chrome has no default subtitle; hosts may still override. */\n description: \"\",\n submit: t(\"humanInputModel.sendAnswers\"),\n skip: t(\"humanInputModel.skip\"),\n submitting: t(\"humanInputModel.submitting\"),\n other: t(\"humanInputModel.other\"),\n deadlineLabel: t(\"humanInputModel.expires\"),\n formatDeadline: (value) => formatDeadline(t, value),\n required: t(\"humanInputModel.thisQuestionIsRequired\"),\n otherRequired: t(\"humanInputModel.enterAValueForOther\"),\n minSelections: (count) => t(\"humanInputModel.chooseAtLeastOptions\", { count }),\n maxSelections: (count) => t(\"humanInputModel.chooseNoMoreThanOptions\", { count }),\n optional: t(\"humanInputModel.optional\"),\n moreBelow: t(\"humanInputModel.moreBelow\"),\n questionCount: (count) => `${count} questions`,\n collapse: t(\"humanInputModel.collapse\"),\n expand: t(\"humanInputModel.expand\"),\n selectionHint: (min, max) => {\n if (min != null && max != null) return t(\"humanInputModel.chooseMinMax\", { min, max });\n if (min != null) return t(\"humanInputModel.chooseAtLeastMin\", { min });\n if (max != null) return t(\"humanInputModel.chooseUpToMax\", { max });\n return null;\n },\n secretShow: t(\"humanInputModel.show\"),\n secretHide: t(\"humanInputModel.hide\"),\n secretGenerate: t(\"humanInputModel.generate\"),\n secretWillGenerate: t(\"humanInputModel.aStrongPasswordWillBe\"),\n secretUndo: t(\"humanInputModel.undo\"),\n secretSaveTo: t(\"humanInputModel.saveTo\"),\n secretSaveToOptions: {\n user: t(\"humanInputModel.onlyMe\"),\n task: t(\"humanInputModel.thisTask2\"),\n workspace: t(\"humanInputModel.thisWorkspace2\"),\n },\n secretVaultHint: (saveTo, vault) =>\n vault\n ? t(\"humanInputModel.savesToTheVaultVault\", { vault })\n : saveTo === \"user\"\n ? t(\"humanInputModel.savesToYourPrivateVault\")\n : saveTo === \"task\"\n ? t(\"humanInputModel.savesToThisTask\")\n : t(\"humanInputModel.savesToTheWorkspaceVault\"),\n secretSaveToDowngraded: (requested, actual) =>\n t(\"humanInputModel.youCanTSaveTo\", {\n requested: SAVE_TO_IN_SENTENCE(t)[requested],\n actual: SAVE_TO_IN_SENTENCE(t)[actual],\n }),\n secretLooksLike: (example) => t(\"humanInputModel.looksLikeExample\", { example }),\n secretPatternWarning: (looksLike) =>\n looksLike\n ? t(\"humanInputModel.thisDoesnTLookLike\", { looksLike })\n : t(\"humanInputModel.thisDoesnTMatchThe\"),\n secretSaved: (vaultName, itemName) =>\n t(\"humanInputModel.savedToVaultnameItemname\", { vaultName, itemName }),\n});\n\n/**\n * Text, single- and multi-select drafts. Secret questions are not drafted:\n * their value lives only in an uncontrolled input and is collected with\n * {@link secretAnswerFromReading} at submit time.\n */\nexport function answersFromDrafts(\n t: OpenGeniText,\n questions: HumanInputQuestion[],\n drafts: Record<string, HumanInputAnswerDraft>,\n messageOverrides: Partial<HumanInputFormMessages> = {},\n): { answers: HumanInputAnswer[]; errors: Record<string, string> } {\n const messages = { ...defaultHumanInputFormMessages(t), ...messageOverrides };\n const answers: HumanInputAnswer[] = [];\n const errors: Record<string, string> = {};\n for (const question of questions) {\n if (question.kind === \"secret\") continue;\n const draft = drafts[question.id] ?? emptyDraft();\n const values = question.kind === \"text\" ? draft.values.filter(Boolean) : draft.values;\n const other = draft.otherSelected ? draft.other : \"\";\n const hasOther = Boolean(other.trim());\n const supplied = values.length + (hasOther ? 1 : 0);\n\n // Other-selected-but-empty must win over generic \"required\" — otherwise the\n // user sees the wrong diagnosis next to a clearly selected control.\n if (question.kind !== \"text\" && draft.otherSelected && !hasOther) {\n errors[question.id] = messages.otherRequired;\n continue;\n }\n\n if (question.required && supplied === 0) {\n errors[question.id] = messages.required;\n continue;\n }\n if (question.kind !== \"text\") {\n const min = question.validation?.minSelections;\n const max = question.kind === \"single_select\" ? 1 : question.validation?.maxSelections;\n if (min != null && supplied < min) {\n errors[question.id] = messages.minSelections(min);\n continue;\n }\n if (max != null && supplied > max) {\n errors[question.id] = messages.maxSelections(max);\n continue;\n }\n }\n if (supplied > 0) {\n answers.push({\n questionId: question.id,\n values,\n ...(hasOther ? { other } : {}),\n });\n }\n }\n return { answers, errors };\n}\n\nexport function initialDrafts(\n questions: HumanInputQuestion[],\n): Record<string, HumanInputAnswerDraft> {\n return Object.fromEntries(questions.map((question) => [question.id, emptyDraft()]));\n}\n\nexport function emptyDraft(): HumanInputAnswerDraft {\n return { values: [], other: \"\", otherSelected: false };\n}\n\nexport function formatDeadline(t: OpenGeniText, value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n const ms = date.getTime() - Date.now();\n if (ms <= 0) return t(\"humanInputModel.deadlinePassed\");\n const minutes = Math.round(ms / 60_000);\n if (minutes < 1) return t(\"humanInputModel.inUnderAMinute\");\n if (minutes < 60) return `in ${minutes}m`;\n const hours = Math.round(minutes / 60);\n if (hours < 48) return `in ${hours}h`;\n return date.toLocaleString(t.locale);\n}\n\n/** The form heading: a single question leads with its own label/prompt. */\nexport function humanInputHeading(\n questions: readonly HumanInputQuestion[],\n messages: Pick<HumanInputFormMessages, \"title\" | \"description\">,\n): { title: string; description: string | null } {\n const single = questions.length === 1 ? questions[0]! : null;\n return {\n title: single ? (single.label ?? single.prompt) : messages.title,\n description: single\n ? single.label\n ? single.prompt\n : (single.helpText ?? null)\n : messages.description || null,\n };\n}\n\n/* ---- secret questions ------------------------------------------------------ */\n\nexport const SECRET_SAVE_TO_ORDER: readonly HumanInputSecretSaveTo[] = [\n \"user\",\n \"task\",\n \"workspace\",\n];\n\nexport type SecretAutocomplete = \"current-password\" | \"new-password\" | \"one-time-code\" | \"off\";\n\n/**\n * The `autocomplete` token for the secret input. The contract defaults\n * `autocomplete` to \"current-password\", so that value is treated as \"not\n * chosen\": a TOTP field asks for a one-time code, and a field the person may\n * generate is a new password (password managers offer to create and save it).\n */\nexport function secretAutocomplete(spec: HumanInputSecretSpec): SecretAutocomplete {\n if (spec.autocomplete && spec.autocomplete !== \"current-password\") return spec.autocomplete;\n if (spec.fieldKind === \"totp\") return \"one-time-code\";\n if (spec.allowGenerate || spec.generate) return \"new-password\";\n return \"current-password\";\n}\n\n/** Digits keyboard on phones for one-time codes. */\nexport function secretInputMode(spec: HumanInputSecretSpec): \"numeric\" | undefined {\n return secretAutocomplete(spec) === \"one-time-code\" ? \"numeric\" : undefined;\n}\n\n/** A plain-text field kind is not concealed (no show/hide). */\nexport function secretConcealed(spec: HumanInputSecretSpec): boolean {\n return spec.fieldKind !== \"text\";\n}\n\n/** Generate is offered for concealed values the agent allows to be generated. */\nexport function secretCanGenerate(spec: HumanInputSecretSpec): boolean {\n return Boolean(spec.allowGenerate || spec.generate) && spec.fieldKind !== \"totp\";\n}\n\n/** The input's label: \"Password\", \"API key\", \"One-time code\", or the field name. */\nexport function secretFieldLabel(t: OpenGeniText, spec: HumanInputSecretSpec): string {\n const field = spec.field?.trim() || \"password\";\n if (spec.fieldKind === \"totp\" && field.toLowerCase() === \"password\")\n return t(\"humanInputModel.oneTimeCode\");\n if (spec.itemType === \"api_key\" && field.toLowerCase() === \"password\")\n return t(\"humanInputModel.apiKey\");\n if (spec.itemType === \"note\" && field.toLowerCase() === \"password\")\n return t(\"humanInputModel.note\");\n const words = field.replace(/[_-]+/g, \" \").replace(/\\s+/g, \" \").trim();\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\nexport type SecretSaveToChoice = {\n /** What the agent asked for (contract default: \"user\"). */\n requested: HumanInputSecretSaveTo;\n /** The initial selection: the request, or the best allowed target. */\n initial: HumanInputSecretSaveTo;\n /** True when the request is not allowed and was replaced. */\n downgraded: boolean;\n /** Allowed choices in display order. */\n options: HumanInputSecretSaveTo[];\n};\n\n/**\n * Filter Save to by what this person may write. A request that is not allowed\n * falls back to the most private allowed target (Only me, then This task).\n */\nexport function resolveSecretSaveTo(\n spec: HumanInputSecretSpec,\n allowed: readonly HumanInputSecretSaveTo[] = SECRET_SAVE_TO_ORDER,\n): SecretSaveToChoice {\n const requested = spec.saveTo ?? \"user\";\n const options = SECRET_SAVE_TO_ORDER.filter((target) => allowed.includes(target));\n if (options.includes(requested)) {\n return { requested, initial: requested, downgraded: false, options };\n }\n // Nothing allowed is a host error; keep the request so the server decides.\n if (options.length === 0) {\n return { requested, initial: requested, downgraded: false, options: [requested] };\n }\n return { requested, initial: options[0]!, downgraded: true, options };\n}\n\n/** The vault the agent named applies only to the scope it asked for. */\nexport function secretVaultForTarget(\n spec: HumanInputSecretSpec,\n saveTo: HumanInputSecretSaveTo,\n): string | null {\n return spec.vault && saveTo === (spec.saveTo ?? \"user\") ? spec.vault : null;\n}\n\n/**\n * Soft check against the agent's `pattern` (a regular expression searched in\n * the value, not anchored). Never blocks submit; an invalid pattern is ignored.\n */\nexport function secretPatternMismatch(pattern: string | null | undefined, value: string): boolean {\n if (!pattern || !value) return false;\n let expression: RegExp;\n try {\n expression = new RegExp(pattern, \"u\");\n } catch {\n try {\n expression = new RegExp(pattern);\n } catch {\n return false;\n }\n }\n return !expression.test(value);\n}\n\n/** What a secret field holds at submit time. `value` exists only for this call. */\nexport type SecretFieldReading = {\n value: string | null;\n generate: GeneratePasswordSpec | null;\n username: string | null;\n saveTo: HumanInputSecretSaveTo;\n};\n\n/**\n * Build the write-only `secretAnswers` entry and the public answer for one\n * secret question. The public answer has no values: the server adds the\n * saved reference. Returns null for an unanswered optional question.\n */\nexport function secretAnswerFromReading(\n t: OpenGeniText,\n question: HumanInputQuestion,\n reading: SecretFieldReading,\n messageOverrides: Partial<HumanInputFormMessages> = {},\n): { answer: HumanInputAnswer; secretAnswer: HumanInputSecretAnswer } | { error: string } | null {\n const messages = { ...defaultHumanInputFormMessages(t), ...messageOverrides };\n const value = reading.generate ? null : reading.value || null;\n if (!reading.generate && value === null) {\n return question.required ? { error: messages.required } : null;\n }\n const username = reading.username?.trim() || null;\n const secretAnswer: HumanInputSecretAnswer = {\n questionId: question.id,\n ...(reading.generate ? { generate: reading.generate } : { value: value! }),\n ...(username ? { username } : {}),\n saveTo: reading.saveTo,\n };\n return { answer: { questionId: question.id, values: [] }, secretAnswer };\n}\n\n/** The answered chip label, never a value. */\nexport function secretAnswerLabel(\n t: OpenGeniText,\n result: HumanInputSecretAnswerResult,\n messageOverrides: Partial<HumanInputFormMessages> = {},\n): string {\n const messages = { ...defaultHumanInputFormMessages(t), ...messageOverrides };\n return messages.secretSaved(result.vaultName, result.itemName);\n}\n","/**\n * \"Back to your message\": which prompt the reader is reading the answer to, and\n * whether that prompt has scrolled out of view. Renderer-neutral geometry so\n * the web timeline (DOM rects) and native timelines (layout offsets) agree.\n */\n\n/** How far above the viewport a prompt must be before the pill appears. */\nexport const QUESTION_NAV_HIDDEN_PX = 24;\n/** Breathing room above the question when the reader jumps back to it. */\nexport const QUESTION_NAV_MARGIN_PX = 12;\n\nexport type QuestionNavPrompt = { key: string; top: number; bottom: number };\n\n/**\n * The last prompt before the reading position (the viewport's middle) owns the\n * response in view; it is a target only once it has scrolled fully above the\n * viewport. Prompts are in document order; coordinates share one axis.\n */\nexport function questionNavTarget(\n prompts: readonly QuestionNavPrompt[],\n view: { top: number; height: number },\n): string | null {\n const middle = view.top + view.height / 2;\n const prompt = [...prompts].reverse().find((candidate) => candidate.top <= middle);\n if (!prompt) return null;\n if (prompt.top >= view.top - QUESTION_NAV_HIDDEN_PX || prompt.bottom > view.top) return null;\n return prompt.key;\n}\n","import type { TimelineGroup, TimelineItem } from \"./types\";\n\n/*\n * Landing on a moment in a session: an inbox item or a phone notification\n * points at the durable event that raised it, and the timeline opens on the\n * row that holds that moment. Events that render no row of their own (an\n * agent's notification, a goal change) land on the nearest row before them.\n */\n\nfunction itemSequences(item: TimelineItem): number[] {\n const sources =\n item.sourceEvents ??\n (\"annotationSource\" in item && item.annotationSource ? [item.annotationSource] : []);\n return sources.map((source) => source.sequence);\n}\n\n/** Every durable event sequence a group renders, nested work included. */\nexport function timelineGroupSequences(group: TimelineGroup): number[] {\n if (group.kind === \"item\") return itemSequences(group.item);\n if (group.kind === \"turn\") return group.groups.flatMap(timelineGroupSequences);\n return [\n ...group.items.flatMap((item) => itemSequences(item)),\n ...(group.work?.details.flatMap(timelineGroupSequences) ?? []),\n ];\n}\n\n/**\n * The index of the group to land on for `sequence`: the group that holds it,\n * else the last group that starts before it. -1 when every loaded group is\n * later (the moment is in older history) or nothing is loaded.\n */\nexport function timelineGroupIndexAtSequence(\n groups: readonly TimelineGroup[],\n sequence: number,\n): number {\n let landing = -1;\n for (let index = 0; index < groups.length; index += 1) {\n const sequences = timelineGroupSequences(groups[index]!);\n if (sequences.length === 0) continue;\n if (sequences.includes(sequence)) return index;\n if (Math.min(...sequences) <= sequence) landing = index;\n }\n return landing;\n}\n","// Pure presentation decisions for a timeline turn's work, shared by the web and native\n// timelines. Every function here is extracted verbatim from the web MessageTimeline so both\n// renderers decide identically what a turn shows (preparing, working, waiting, worked).\nimport { timelineGroupContainsPresentedImage } from \"./presented-image\";\nimport type { TurnSummaryStatus } from \"./turn-summary-model\";\nimport type { ActivityItem, TimelineGroup, ToolCallItem } from \"./types\";\nimport { type OpenGeniText } from \"../messages/runtime\";\n\nexport type ActivityGroup = Extract<TimelineGroup, { kind: \"activity\" }>;\nexport type TurnGroup = Extract<TimelineGroup, { kind: \"turn\" }>;\n\nexport function durationBetween(startedAt: string, endedAt: string): number | undefined {\n const started = Date.parse(startedAt);\n const ended = Date.parse(endedAt);\n if (!Number.isFinite(started) || !Number.isFinite(ended) || ended < started) {\n return undefined;\n }\n return ended - started;\n}\n\n/** Compaction landmarks among a fold's groups (secondary summary facet). */\nexport function compactedLandmarkCount(groups: readonly TimelineGroup[]): number {\n return groups.filter(\n (group) =>\n group.kind === \"item\" &&\n group.item.kind === \"context-compaction\" &&\n group.item.phase === \"compacted\",\n ).length;\n}\n\nexport function clusterIsSettled(group: ActivityGroup): boolean {\n return group.items.every((item) => {\n if (item.kind === \"reasoning\" || item.kind === \"agent-message\") {\n return !item.streaming;\n }\n // Memory writes and fleet observations are discrete, already-settled events.\n if (item.kind === \"memory\" || item.kind === \"fleet-decision\") {\n return true;\n }\n return item.status !== \"running\";\n });\n}\n\nexport function flattenActivityItems(groups: readonly TimelineGroup[]): ActivityItem[] {\n const items: ActivityItem[] = [];\n for (const group of groups) {\n if (group.kind === \"activity\") {\n items.push(...flattenActivityItems(group.work?.details ?? []), ...group.items);\n } else if (group.kind === \"turn\") {\n items.push(...flattenActivityItems(group.groups));\n }\n }\n return items;\n}\n\nexport type ReadableWorkOptions = {\n /** Host shows startup phases as ordinary details (web: startup-details context). */\n startupDetails: boolean;\n /** Startup chrome was dismissed by the reader. */\n startupDismissed: boolean;\n};\n\n/**\n * A readable turn whose only work so far is environment preparation renders as one quiet\n * preparation surface instead of a \"Working\" fold.\n */\nexport function isPreparingWork(group: ActivityGroup, options: ReadableWorkOptions): boolean {\n if (!group.work) return false;\n // Steps not loaded yet are work the reader can open, not preparation.\n if (group.work.steps && group.work.steps.state !== \"complete\") return false;\n const phases = group.items.filter((item) => item.kind === \"startup-phase\");\n return (\n !options.startupDetails &&\n !options.startupDismissed &&\n !group.work.endedAt &&\n !group.work.waiting &&\n phases.length > 0 &&\n group.items.every(\n (item) => item.kind === \"startup-phase\" || (item.kind === \"reasoning\" && !item.text.trim()),\n ) &&\n !phases.some((item) => item.status === \"failed\" || item.status === \"cancelled\")\n );\n}\n\n/**\n * Whether a readable turn's work row has anything to reveal when expanded.\n * Unless the host shows startup phases as details, the work row's rail only\n * renders failed or cancelled preparation steps, so a detail made only of\n * completed or still-running steps (for example the queue phase before a turn\n * was parked on a usage limit) renders nothing and does not make the row\n * expandable.\n */\nexport function readableWorkHasDetails(\n group: ActivityGroup & { work: NonNullable<ActivityGroup[\"work\"]> },\n options: Pick<ReadableWorkOptions, \"startupDetails\">,\n): boolean {\n // Steps not loaded yet are revealed (and loaded) by opening the row.\n if (group.work.steps && group.work.steps.state !== \"complete\") return true;\n return group.work.details.some(\n (detail) =>\n options.startupDetails ||\n detail.kind !== \"activity\" ||\n Boolean(detail.work) ||\n !detail.items.every(\n (item) =>\n (item.kind === \"startup-phase\" &&\n item.status !== \"failed\" &&\n item.status !== \"cancelled\") ||\n (item.kind === \"reasoning\" && !item.text.trim()),\n ),\n );\n}\n\n/**\n * Status of a readable turn's work row, minus the host-rendered live preview.\n * Time spent waiting for model capacity is not work: the worked duration and\n * the live working clock exclude it, and the wait itself shows no clock. A\n * wait's `detail` is its one quiet secondary line.\n */\nexport function readableWorkStatus(\n t: OpenGeniText,\n group: ActivityGroup & { work: NonNullable<ActivityGroup[\"work\"]> },\n): Omit<TurnSummaryStatus, \"preview\"> & { detail?: string | undefined } {\n const end = group.work.endedAt;\n const pausedMs = group.work.pausedMs ?? 0;\n if (end) {\n const durationMs = durationBetween(group.work.startedAt, end);\n const cycles = group.work.cycles;\n // Folded quiet cycles report their wall-clock span: waits are the point.\n if (cycles)\n return {\n kind: \"worked\",\n label: t(\"timeline.workPresentation.countUpdatesOver\", { count: cycles.count }),\n durationMs,\n };\n return {\n kind: \"worked\",\n durationMs: durationMs === undefined ? undefined : Math.max(0, durationMs - pausedMs),\n };\n }\n if (group.work.waiting) {\n const { untimed, since, ...waiting } = group.work.waiting;\n return { kind: \"waiting\", ...waiting, ...(untimed ? {} : { since }) };\n }\n const started = Date.parse(group.work.startedAt);\n return {\n kind: \"working\",\n since:\n pausedMs > 0 && Number.isFinite(started)\n ? new Date(started + pausedMs).toISOString()\n : group.work.startedAt,\n };\n}\n\n/** Whether a readable turn's work fold starts expanded. */\nexport function readableWorkDefaultOpen(group: ActivityGroup): true | undefined {\n return timelineGroupContainsPresentedImage(group) ||\n group.outcome === \"failed\" ||\n group.items.some(\n (item) =>\n item.kind === \"startup-phase\" &&\n (item.status === \"failed\" ||\n // A cancelled phase with a blocked reason is an expected wait (for\n // example compacting the conversation first), not an interruption.\n (item.status === \"cancelled\" && !item.blockedReason)),\n )\n ? true\n : undefined;\n}\n\n/** Whether the live preview should show (images stay primary output instead). */\nexport function readableWorkShowsPreview(group: ActivityGroup): boolean {\n return !timelineGroupContainsPresentedImage(group);\n}\n\n/**\n * The step a rolling preview shows: steps advance with event order (progress notes and\n * startup phases have their own surfaces). Mirrors the web RollingActivity selection.\n */\nexport function rollingActivityItem(\n items: readonly ActivityItem[],\n previousItem?: ActivityItem,\n mounted = true,\n): { item: ActivityItem; running: boolean; earlierCount: number } | null {\n const work = items.filter(\n (item) => item.kind !== \"startup-phase\" && item.kind !== \"agent-message\",\n );\n const active = work.filter((item) =>\n item.kind === \"reasoning\" ? item.streaming : \"status\" in item && item.status === \"running\",\n );\n const item =\n !mounted && previousItem && previousItem.kind !== \"agent-message\" ? previousItem : work.at(-1);\n if (!item) return null;\n return {\n item,\n running: active.some((entry) => entry.id === item.id),\n earlierCount: Math.max(\n 0,\n work.findIndex((entry) => entry.id === item.id),\n ),\n };\n}\n\nexport function isToolCall(item: ActivityItem): item is ToolCallItem {\n return item.kind === \"tool-call\";\n}\n","import { formatClockTime } from \"../lib/format\";\nimport { formatElapsed } from \"./turn-summary-model\";\nimport type { NoticeItem } from \"./types\";\nimport { durationBetween } from \"./work-presentation\";\nimport { type OpenGeniText } from \"../messages/runtime\";\n\n/** An approval notice the person has since answered. */\nexport function noticeIsResolvedApproval(\n item: Pick<NoticeItem, \"approval\" | \"resolvedAt\">,\n): boolean {\n return Boolean(item.resolvedAt && item.approval);\n}\n\n/** A resolved approval notice reads as history. */\nexport function noticeDisplayText(\n t: OpenGeniText,\n item: Pick<NoticeItem, \"text\" | \"approval\" | \"resolvedAt\">,\n): string {\n return noticeIsResolvedApproval(item)\n ? t(\"timeline.noticePresentation.youRespondedToThisApproval\")\n : item.text;\n}\n\n/** Notice pill tone: failures stay red, an open wait keeps the waiting hue. */\nexport function noticeTone(\n item: Pick<NoticeItem, \"tone\" | \"resolvedAt\">,\n): \"failed\" | \"waiting\" | \"neutral\" {\n return item.tone === \"failed\"\n ? \"failed\"\n : item.tone === \"waiting\" && !item.resolvedAt\n ? \"waiting\"\n : \"neutral\";\n}\n\n/**\n * Plain-text summary of a recorded agent wait, as web's quiet disclosure reads\n * it: \"Waited for 2 agents · 3m 5s\" once later input ended the wait, otherwise\n * \"Waiting · since 10:32\" (with the date on a later day).\n */\nexport function recordedWaitSummaryText(\n t: OpenGeniText,\n item: Pick<NoticeItem, \"occurredAt\" | \"waitingAgents\" | \"waitEndedAt\">,\n now: Date = new Date(),\n): string {\n const agents = item.waitingAgents ?? 0;\n const waitedMs = item.waitEndedAt\n ? durationBetween(item.occurredAt, item.waitEndedAt)\n : undefined;\n if (waitedMs !== undefined) {\n const elapsed = formatElapsed(t, waitedMs);\n return agents > 0\n ? t(\"timeline.noticePresentation.waitedForAgentsElapsed\", { count: agents, elapsed })\n : t(\"timeline.noticePresentation.waitedElapsed\", { elapsed });\n }\n const started = new Date(item.occurredAt);\n const since =\n started.toDateString() === now.toDateString()\n ? formatClockTime(t, item.occurredAt)\n : started.toLocaleString(t.locale, { dateStyle: \"medium\", timeStyle: \"short\" });\n if (item.waitEndedAt)\n return agents > 0\n ? t(\"timeline.noticePresentation.waitedForAgentsSince\", { count: agents, since })\n : t(\"timeline.noticePresentation.waitedSince\", { since });\n return agents > 0\n ? t(\"timeline.noticePresentation.waitingForAgentsSince\", { count: agents, since })\n : t(\"timeline.noticePresentation.waitingSince\", { since });\n}\n"],"mappings":"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","names":["item"]}
@@ -19,7 +19,7 @@ import {
19
19
  } from "./chunk-TXS65BB2.js";
20
20
  import {
21
21
  useOpenGeniText
22
- } from "./chunk-G7VLL3PG.js";
22
+ } from "./chunk-F2YABPRJ.js";
23
23
 
24
24
  // src/hooks/use-usage.ts
25
25
  import {
@@ -1184,4 +1184,4 @@ export {
1184
1184
  UsageMemberList,
1185
1185
  SessionUsageLimitNotice
1186
1186
  };
1187
- //# sourceMappingURL=chunk-DCLPWYP3.js.map
1187
+ //# sourceMappingURL=chunk-IEVPJ3G6.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-72VDQKH4.js";
5
5
  import {
6
6
  MarkdownText
7
- } from "./chunk-RKZWCTXV.js";
7
+ } from "./chunk-TAEKDMEF.js";
8
8
 
9
9
  // src/app/components/session/search-markdown-highlight.tsx
10
10
  import { useLayoutEffect, useRef, useState } from "react";
@@ -131,4 +131,4 @@ export {
131
131
  selectedFormattedMessage,
132
132
  SearchMarkdown
133
133
  };
134
- //# sourceMappingURL=chunk-EVWZHDSF.js.map
134
+ //# sourceMappingURL=chunk-IKH3VTA4.js.map
@@ -3,22 +3,30 @@ import {
3
3
  coerceReasoningEffortForModel,
4
4
  findPickerRow,
5
5
  runnableLatencyModesForModel
6
- } from "./chunk-GRLPRM56.js";
6
+ } from "./chunk-CFEFYPNR.js";
7
7
 
8
8
  // src/app/lib/free-credit-gap.tsx
9
+ import { modelDisplayName } from "@opengeni/sdk/model-display";
9
10
  function freeCreditGap(rows, model, options = {}) {
10
11
  const current = findPickerRow(rows, model);
11
12
  if (current?.catalog.creditFunding !== "unavailable") return null;
13
+ const gap = creditCoverageGap(rows, model, current.label, options);
14
+ return gap.covered.length > 0 ? gap : null;
15
+ }
16
+ function creditRefusalGap(rows, model, options = {}) {
17
+ const label = findPickerRow(rows, model)?.label ?? modelDisplayName(model);
18
+ return creditCoverageGap(rows, model, label, options);
19
+ }
20
+ function creditCoverageGap(rows, model, modelLabel, options) {
12
21
  const covered = rows.filter(
13
22
  (row) => row.id !== model && row.selectable && row.catalog.creditFunding === "promotional"
14
23
  );
15
- if (covered.length === 0) return null;
16
24
  const { selectedModel, preferredModel } = options;
17
25
  const preferred = preferredModel ? covered.findIndex((row) => row.id === preferredModel) : -1;
18
26
  if (preferred > 0) covered.unshift(...covered.splice(preferred, 1));
19
27
  const selected = selectedModel && selectedModel !== model ? findPickerRow(rows, selectedModel) : null;
20
28
  return {
21
- modelLabel: current.label,
29
+ modelLabel,
22
30
  covered: covered.map((row) => ({ id: row.id, label: row.label })),
23
31
  selectionUsable: Boolean(
24
32
  selected?.selectable && selected.catalog.creditFunding !== "unavailable"
@@ -43,7 +51,8 @@ function coveredModelChoice(row, effort, latencyMode) {
43
51
 
44
52
  export {
45
53
  freeCreditGap,
54
+ creditRefusalGap,
46
55
  freeCreditGapReason,
47
56
  coveredModelChoice
48
57
  };
49
- //# sourceMappingURL=chunk-L5UCO2UV.js.map
58
+ //# sourceMappingURL=chunk-ILBSBZGC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/lib/free-credit-gap.tsx"],"sourcesContent":["import type { LatencyMode, ReasoningEffort } from \"@opengeni/sdk\";\nimport { modelDisplayName } from \"@opengeni/sdk/model-display\";\nimport {\n coerceReasoningEffortForModel,\n findPickerRow,\n runnableLatencyModesForModel,\n type PickerModelRow,\n} from \"./model-policy\";\n\n/**\n * The session's model has no usable credit while free (promotional) credit\n * still covers other models. Funding comes from the workspace model catalog,\n * which the server computes from the organization balance.\n */\nexport type FreeCreditGap = {\n /** Label of the model the free credits don't cover. */\n modelLabel: string;\n /** Selectable models the remaining free credits cover, preferred first. */\n covered: { id: string; label: string }[];\n /**\n * The composer already selects another model that can run: a covered or\n * credit-funded model, or one paid another way (connected, subscription, free).\n */\n selectionUsable: boolean;\n};\n\nexport function freeCreditGap(\n rows: PickerModelRow[],\n model: string,\n options: {\n selectedModel?: string | null | undefined;\n preferredModel?: string | null | undefined;\n } = {},\n): FreeCreditGap | null {\n const current = findPickerRow(rows, model);\n if (current?.catalog.creditFunding !== \"unavailable\") return null;\n const gap = creditCoverageGap(rows, model, current.label, options);\n return gap.covered.length > 0 ? gap : null;\n}\n\n/**\n * The API refused a Send or a new chat because no credit pays for its model.\n * The refusal is authoritative even while the catalog still reports older\n * funding, so the gap is named whether or not other models are covered.\n */\nexport function creditRefusalGap(\n rows: PickerModelRow[],\n model: string,\n options: {\n selectedModel?: string | null | undefined;\n preferredModel?: string | null | undefined;\n } = {},\n): FreeCreditGap {\n const label = findPickerRow(rows, model)?.label ?? modelDisplayName(model);\n return creditCoverageGap(rows, model, label, options);\n}\n\nfunction creditCoverageGap(\n rows: PickerModelRow[],\n model: string,\n modelLabel: string,\n options: {\n selectedModel?: string | null | undefined;\n preferredModel?: string | null | undefined;\n },\n): FreeCreditGap {\n const covered = rows.filter(\n (row) => row.id !== model && row.selectable && row.catalog.creditFunding === \"promotional\",\n );\n const { selectedModel, preferredModel } = options;\n const preferred = preferredModel ? covered.findIndex((row) => row.id === preferredModel) : -1;\n if (preferred > 0) covered.unshift(...covered.splice(preferred, 1));\n const selected =\n selectedModel && selectedModel !== model ? findPickerRow(rows, selectedModel) : null;\n return {\n modelLabel,\n covered: covered.map((row) => ({ id: row.id, label: row.label })),\n selectionUsable: Boolean(\n selected?.selectable && selected.catalog.creditFunding !== \"unavailable\",\n ),\n };\n}\n\n/** Headline for a credit stop that free credits could avoid on another model. */\nexport function freeCreditGapReason(gap: FreeCreditGap): string {\n const subject = `Your free credits don't cover ${gap.modelLabel}.`;\n if (gap.selectionUsable) return `${subject} Send a message to continue with the selected model.`;\n const [first, second] = gap.covered;\n const examples = second ? `${first!.label} or ${second.label}` : first!.label;\n return `${subject} Switch to a model they cover, such as ${examples}, or add credits.`;\n}\n\n/**\n * The banner's one-click switch, with the picker's coercion: keep the effort\n * and speed when the new model runs them, otherwise fall back to its default\n * effort and standard speed so the composer policy stays sendable.\n */\nexport function coveredModelChoice(\n row: PickerModelRow,\n effort: ReasoningEffort,\n latencyMode: LatencyMode,\n): { model: string; effort: ReasoningEffort; latencyMode: LatencyMode | null } | null {\n if (!row.selectable) return null;\n return {\n model: row.id,\n effort: coerceReasoningEffortForModel(row.catalog, effort),\n latencyMode:\n latencyMode !== \"standard\" && !runnableLatencyModesForModel(row.catalog).includes(latencyMode)\n ? \"standard\"\n : null,\n };\n}\n"],"mappings":";;;;;;;;AACA,SAAS,wBAAwB;AAyB1B,SAAS,cACd,MACA,OACA,UAGI,CAAC,GACiB;AACtB,QAAM,UAAU,cAAc,MAAM,KAAK;AACzC,MAAI,SAAS,QAAQ,kBAAkB,cAAe,QAAO;AAC7D,QAAM,MAAM,kBAAkB,MAAM,OAAO,QAAQ,OAAO,OAAO;AACjE,SAAO,IAAI,QAAQ,SAAS,IAAI,MAAM;AACxC;AAOO,SAAS,iBACd,MACA,OACA,UAGI,CAAC,GACU;AACf,QAAM,QAAQ,cAAc,MAAM,KAAK,GAAG,SAAS,iBAAiB,KAAK;AACzE,SAAO,kBAAkB,MAAM,OAAO,OAAO,OAAO;AACtD;AAEA,SAAS,kBACP,MACA,OACA,YACA,SAIe;AACf,QAAM,UAAU,KAAK;AAAA,IACnB,CAAC,QAAQ,IAAI,OAAO,SAAS,IAAI,cAAc,IAAI,QAAQ,kBAAkB;AAAA,EAC/E;AACA,QAAM,EAAE,eAAe,eAAe,IAAI;AAC1C,QAAM,YAAY,iBAAiB,QAAQ,UAAU,CAAC,QAAQ,IAAI,OAAO,cAAc,IAAI;AAC3F,MAAI,YAAY,EAAG,SAAQ,QAAQ,GAAG,QAAQ,OAAO,WAAW,CAAC,CAAC;AAClE,QAAM,WACJ,iBAAiB,kBAAkB,QAAQ,cAAc,MAAM,aAAa,IAAI;AAClF,SAAO;AAAA,IACL;AAAA,IACA,SAAS,QAAQ,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,IAAI,OAAO,IAAI,MAAM,EAAE;AAAA,IAChE,iBAAiB;AAAA,MACf,UAAU,cAAc,SAAS,QAAQ,kBAAkB;AAAA,IAC7D;AAAA,EACF;AACF;AAGO,SAAS,oBAAoB,KAA4B;AAC9D,QAAM,UAAU,iCAAiC,IAAI,UAAU;AAC/D,MAAI,IAAI,gBAAiB,QAAO,GAAG,OAAO;AAC1C,QAAM,CAAC,OAAO,MAAM,IAAI,IAAI;AAC5B,QAAM,WAAW,SAAS,GAAG,MAAO,KAAK,OAAO,OAAO,KAAK,KAAK,MAAO;AACxE,SAAO,GAAG,OAAO,0CAA0C,QAAQ;AACrE;AAOO,SAAS,mBACd,KACA,QACA,aACoF;AACpF,MAAI,CAAC,IAAI,WAAY,QAAO;AAC5B,SAAO;AAAA,IACL,OAAO,IAAI;AAAA,IACX,QAAQ,8BAA8B,IAAI,SAAS,MAAM;AAAA,IACzD,aACE,gBAAgB,cAAc,CAAC,6BAA6B,IAAI,OAAO,EAAE,SAAS,WAAW,IACzF,aACA;AAAA,EACR;AACF;","names":[]}
@@ -8,7 +8,7 @@ import {
8
8
  projectClientModelRows,
9
9
  runnableLatencyModesForModel,
10
10
  scopedBillingClassLabel
11
- } from "./chunk-GRLPRM56.js";
11
+ } from "./chunk-CFEFYPNR.js";
12
12
 
13
13
  // src/model-picker-model.ts
14
14
  var defaultModelPolicyPickerMessages = (t) => ({
@@ -56,6 +56,8 @@ function billingClassForMissingSelection(modelId) {
56
56
  if (modelId.startsWith("workspace-anthropic/")) return "byok";
57
57
  if (modelId.startsWith("organization-claude-subscription/")) return "claude_subscription";
58
58
  if (modelId.startsWith("organization-anthropic/")) return "organization_byok";
59
+ if (modelId.startsWith("organization-openai/")) return "organization_byok";
60
+ if (modelId.startsWith("organization-azure-openai/")) return "organization_byok";
59
61
  if (modelId.startsWith("workspace-gateway/")) return "byok";
60
62
  if (modelId.startsWith("workspace-openrouter/")) return "byok";
61
63
  if (modelId.startsWith("workspace-opper/")) return "byok";
@@ -199,4 +201,4 @@ export {
199
201
  modelPickerChoice,
200
202
  compactEffortLabel
201
203
  };
202
- //# sourceMappingURL=chunk-IO6K6UYJ.js.map
204
+ //# sourceMappingURL=chunk-IQ64BNAG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/model-picker-model.ts"],"sourcesContent":["/**\n * The model picker's presentation logic, free of any renderer: which rows show,\n * how they group and filter, and which thinking/latency controls apply. The web\n * menu and native sheets both render from this.\n */\nimport type { ClientModel, LatencyMode, ReasoningEffort } from \"@opengeni/sdk\";\nimport {\n coerceReasoningEffortForModel,\n effortOptionsForModel,\n findPickerRow,\n groupPickerRowsByBillingClass,\n payerSummaryForModel,\n projectClientModelRows,\n runnableLatencyModesForModel,\n scopedBillingClassLabel,\n type PickerBillingClass,\n type PickerModelRow,\n} from \"./model-policy\";\nimport { type OpenGeniText } from \"./messages/runtime\";\n\ntype ClientPickerModelRow = PickerModelRow<ClientModel>;\n\nexport type ModelPolicyPickerMessages = {\n label: string;\n loading: string;\n noModels: string;\n connectTitle: string;\n connectBody: string;\n connectAction: string;\n thinking: string;\n fast: string;\n fastRateHint: string;\n /** Label for the Standard/Fast/Ultrafast choice shown when a model offers Ultrafast. */\n speed?: string;\n standard?: string;\n ultrafast?: string;\n /** How Ultrafast counts against a ChatGPT/Codex plan's usage limits. */\n ultrafastUsageHint?: string;\n codexOnly: string;\n searchLabel?: string;\n searchPlaceholder?: string;\n currentModel?: string;\n noMatches?: string;\n unsupportedAttachments?: string;\n thinkingEffort?: string;\n selected?: string;\n free?: string;\n\n billingHints: Record<PickerBillingClass, string>;\n};\n\nexport const defaultModelPolicyPickerMessages = (t: OpenGeniText): ModelPolicyPickerMessages => ({\n label: t(\"modelPickerModel.modelAndEffort\"),\n loading: t(\"modelPickerModel.loadingModelCatalog\"),\n noModels: t(\"modelPickerModel.noModelsAvailable\"),\n connectTitle: t(\"modelPickerModel.connectAModel\"),\n connectBody: t(\"modelPickerModel.useASubscriptionOrA\"),\n connectAction: t(\"modelPickerModel.openModels\"),\n thinking: t(\"modelPickerModel.thinking\"),\n fast: t(\"modelPickerModel.fast\"),\n fastRateHint: \"2× rate\",\n speed: t(\"modelPickerModel.speed\"),\n standard: t(\"modelPolicy.standard\"),\n ultrafast: t(\"modelPolicy.ultrafast\"),\n ultrafastUsageHint: \"8× usage\",\n codexOnly: t(\"modelPickerModel.codexOnlySession\"),\n searchLabel: t(\"modelPickerModel.searchModelsOrProviders\"),\n searchPlaceholder: t(\"modelPickerModel.searchModelsOrProviders2\"),\n currentModel: t(\"modelPickerModel.currentModel\"),\n noMatches: t(\"modelPickerModel.noMatchingModelsTryA\"),\n unsupportedAttachments: t(\"modelPickerModel.thisModelCannotViewThe\"),\n thinkingEffort: t(\"modelPickerModel.thinkingEffort\"),\n selected: t(\"modelPickerModel.selected\"),\n free: t(\"modelPickerModel.free\"),\n\n billingHints: {\n opengeni_credits: t(\"modelPickerModel.providedByOpengeni\"),\n external: t(\"modelPickerModel.providerTermsAndLimitsApply\"),\n codex_subscription: t(\"modelPickerModel.chatgptCodexPlan\"),\n supergrok_subscription: t(\"modelPickerModel.supergrokXaiPlan\"),\n claude_subscription: t(\"modelPickerModel.claudePlan\"),\n byok: t(\"modelPickerModel.billedToTheConnectedProvider\"),\n organization_byok: t(\"modelPickerModel.billedToTheConnectedProvider\"),\n },\n});\n\n/** Host branding for one payment group; the icon type belongs to the renderer. */\nexport type ModelPickerGroupBranding<TIcon = unknown> = {\n label?: string | undefined;\n /** Omit to preserve the default; null hides the supporting text. */\n description?: string | null | undefined;\n /** Decorative, non-interactive content. Omit for the default; null hides it. */\n icon?: TIcon | undefined;\n};\n\nexport type ModelPickerGroupPresentation<TIcon = unknown> = Partial<\n Record<PickerBillingClass, ModelPickerGroupBranding<TIcon>>\n>;\n\n/** The renderer-neutral inputs every picker surface shares. */\nexport type ModelPickerInput<TIcon = unknown> = {\n groupPresentation?: ModelPickerGroupPresentation<TIcon> | undefined;\n models?: ClientModel[] | undefined;\n rows?: PickerModelRow[] | undefined;\n hasImageAttachments?: boolean | undefined;\n model: string;\n effort: ReasoningEffort;\n latencyMode: LatencyMode;\n codexOnly?: boolean | undefined;\n collapseScopes?: boolean | undefined;\n allowLatencyMode?: boolean | undefined;\n messages?: Partial<ModelPolicyPickerMessages> | undefined;\n};\n\n/** Models settings keeps naming who is billed for a key. */\nexport const SCOPED_BILLING_HINTS = (\n t: OpenGeniText,\n): Partial<Record<PickerBillingClass, string>> => ({\n byok: t(\"modelPickerModel.billedToTheWorkspaceProvider\"),\n organization_byok: t(\"modelPickerModel.billedToTheOrganizationProvider\"),\n});\n\nexport function isCodexPickerModel(model: ClientModel): boolean {\n return model.id.startsWith(\"codex/\") || model.source === \"codex\";\n}\n\n/** The payment group a selection the catalog no longer lists most likely belonged to. */\nexport function billingClassForMissingSelection(modelId: string): PickerBillingClass {\n if (modelId.startsWith(\"workspace-claude-subscription/\")) return \"claude_subscription\";\n if (modelId.startsWith(\"workspace-anthropic/\")) return \"byok\";\n if (modelId.startsWith(\"organization-claude-subscription/\")) return \"claude_subscription\";\n if (modelId.startsWith(\"organization-anthropic/\")) return \"organization_byok\";\n // Every organization OpenAI or Azure OpenAI id is an organization-paid model.\n if (modelId.startsWith(\"organization-openai/\")) return \"organization_byok\";\n if (modelId.startsWith(\"organization-azure-openai/\")) return \"organization_byok\";\n if (modelId.startsWith(\"workspace-gateway/\")) return \"byok\";\n if (modelId.startsWith(\"workspace-openrouter/\")) return \"byok\";\n if (modelId.startsWith(\"workspace-opper/\")) return \"byok\";\n // A deployment OpenRouter or Opper ID does not encode its workspace-facing cost.\n // Missing rows therefore use the credits-safe rail instead of falsely\n // claiming that an unknown former selection was externally funded.\n if (modelId.startsWith(\"openrouter/\")) return \"opengeni_credits\";\n if (modelId.startsWith(\"opper/\")) return \"opengeni_credits\";\n if (modelId.startsWith(\"codex/\")) return \"codex_subscription\";\n if (modelId.startsWith(\"supergrok/\")) return \"supergrok_subscription\";\n return \"opengeni_credits\";\n}\n\nfunction applyCodexOnly(\n rows: ClientPickerModelRow[],\n codexOnly: boolean,\n unavailableReason: string,\n): ClientPickerModelRow[] {\n if (!codexOnly) return rows;\n return rows.map((row) =>\n isCodexPickerModel(row.catalog)\n ? row\n : {\n ...row,\n selectable: false,\n unavailableReason: row.unavailableReason ?? unavailableReason,\n },\n );\n}\n\n/**\n * Host branding for a payment group. While scopes are collapsed, API keys are\n * one group, so either API-key presentation serves both.\n */\nexport function groupPresentationFor<TIcon>(\n props: {\n groupPresentation?: ModelPickerGroupPresentation<TIcon> | undefined;\n collapseScopes?: boolean | undefined;\n },\n billingClass: PickerBillingClass,\n): ModelPickerGroupBranding<TIcon> | undefined {\n const own = props.groupPresentation?.[billingClass];\n if (own !== undefined || props.collapseScopes === false) return own;\n if (billingClass === \"byok\") return props.groupPresentation?.organization_byok;\n if (billingClass === \"organization_byok\") return props.groupPresentation?.byok;\n return undefined;\n}\n\nexport function effectiveRows<TIcon>(\n t: OpenGeniText,\n props: ModelPickerInput<TIcon>,\n): ClientPickerModelRow[] {\n const rows =\n props.rows !== undefined ? props.rows : projectClientModelRows(t, props.models ?? []);\n const messages = { ...defaultModelPolicyPickerMessages(t), ...props.messages };\n return applyCodexOnly(rows, props.codexOnly === true, messages.codexOnly).map((row) => {\n const scoped =\n props.collapseScopes === false\n ? {\n ...row,\n label: row.catalog.label,\n billingClassLabel: scopedBillingClassLabel(t, row.billingClass),\n }\n : row;\n if (props.collapseScopes === false) {\n if (row.catalog.shortLabel) scoped.shortLabel = row.catalog.shortLabel;\n else delete scoped.shortLabel;\n }\n const label = groupPresentationFor(props, row.billingClass)?.label;\n return label === undefined ? scoped : { ...scoped, billingClassLabel: label };\n });\n}\n\nexport type ModelPickerMenuGroup = {\n billingClass: PickerBillingClass;\n label: string;\n description: string | null;\n rows: ClientPickerModelRow[];\n};\n\nexport type ModelPickerThinking = {\n efforts: ReasoningEffort[];\n value: ReasoningEffort;\n showThinking: boolean;\n /** The single Fast toggle; false when `speeds` replaces it. */\n showFast: boolean;\n /**\n * The speed choice for models that offer more than one faster mode\n * (Standard, Fast, Ultrafast), or null when the Fast toggle (or nothing) applies.\n */\n speeds: ModelPickerSpeed[] | null;\n /** The selected row cannot run, so its controls are read-only. */\n disabled: boolean;\n};\n\nexport type ModelPickerSpeed = {\n id: LatencyMode;\n label: string;\n /** What the speed costs relative to Standard, or null for Standard. */\n hint: string | null;\n};\n\nexport type ModelPickerMenuView = {\n messages: ModelPolicyPickerMessages;\n rows: ClientPickerModelRow[];\n selected: ClientPickerModelRow | null;\n /** Any row can run; otherwise the surface offers to connect models instead. */\n anySelectable: boolean;\n /** Whether the query is non-empty (decides \"no matches\" versus \"no models\"). */\n searching: boolean;\n groups: ModelPickerMenuGroup[];\n matchCount: number;\n /** Thinking and Fast controls for the selected model, or null when it has none. */\n thinking: ModelPickerThinking | null;\n /** The selected model cannot view images the draft carries. */\n unsupportedAttachments: boolean;\n};\n\n/** Everything a picker menu shows for this input and search query. */\nexport function modelPickerMenuView<TIcon>(\n t: OpenGeniText,\n props: ModelPickerInput<TIcon>,\n query: string,\n): ModelPickerMenuView {\n const messages = { ...defaultModelPolicyPickerMessages(t), ...props.messages };\n const rows = effectiveRows(t, props);\n const selected = findPickerRow(rows, props.model);\n const words = query.toLowerCase().trim().split(/\\s+/).filter(Boolean);\n const filtered = rows.filter((row) => {\n const description = groupPresentationFor(props, row.billingClass)?.description;\n const text =\n `${row.label} ${row.id} ${row.providerLabel} ${row.billingClassLabel} ${description === undefined ? payerSummaryForModel(t, row.catalog) : (description ?? \"\")}`.toLowerCase();\n return words.every((word) => text.includes(word));\n });\n const matchingIds = new Set(filtered.map((row) => row.id));\n const groups = groupPickerRowsByBillingClass(t, rows, {\n codexOnly: props.codexOnly === true,\n selectedId: props.model,\n collapseScopes: props.collapseScopes !== false,\n })\n .map((group) => {\n const presentation = groupPresentationFor(props, group.billingClass);\n const override = presentation?.description;\n const defaultHint =\n props.collapseScopes === false &&\n messages.billingHints[group.billingClass] ===\n defaultModelPolicyPickerMessages(t).billingHints[group.billingClass]\n ? (SCOPED_BILLING_HINTS(t)[group.billingClass] ??\n messages.billingHints[group.billingClass])\n : messages.billingHints[group.billingClass];\n return {\n billingClass: group.billingClass,\n label: presentation?.label ?? group.label,\n rows: group.rows.filter((row) => matchingIds.has(row.id)),\n description:\n override === undefined\n ? group.billingClass === \"opengeni_credits\"\n ? null\n : defaultHint\n : override,\n };\n })\n .filter((group) => group.rows.length > 0);\n const anySelectable = rows.some((row) => row.selectable);\n const unsupportedAttachments =\n props.hasImageAttachments === true &&\n selected?.catalog.capabilities?.inputModalities.includes(\"image\") === false;\n return {\n messages,\n rows,\n selected,\n anySelectable,\n searching: words.length > 0,\n groups,\n matchCount: filtered.length,\n thinking: selected ? modelPickerThinking(props, selected, messages) : null,\n unsupportedAttachments,\n };\n}\n\nfunction modelPickerThinking(\n props: Pick<ModelPickerInput, \"effort\" | \"allowLatencyMode\">,\n selected: ClientPickerModelRow,\n messages: ModelPolicyPickerMessages,\n): ModelPickerThinking | null {\n const efforts = effortOptionsForModel(selected.catalog);\n const showThinking =\n efforts.length > 1 && selected.catalog.capabilities?.reasoning.runnable !== false;\n const runnable =\n props.allowLatencyMode === false ? [] : runnableLatencyModesForModel(selected.catalog);\n const speeds = runnable.includes(\"ultrafast\") ? speedOptions(selected, runnable, messages) : null;\n const showFast = speeds === null && runnable.includes(\"fast\");\n if (!showThinking && !showFast && !speeds) return null;\n return {\n efforts,\n value: coerceReasoningEffortForModel(selected.catalog, props.effort),\n showThinking,\n showFast,\n speeds,\n disabled: !selected.selectable,\n };\n}\n\nfunction speedOptions(\n selected: ClientPickerModelRow,\n runnable: readonly LatencyMode[],\n messages: ModelPolicyPickerMessages,\n): ModelPickerSpeed[] {\n const speeds: ModelPickerSpeed[] = [\n { id: \"standard\", label: messages.standard ?? \"Standard\", hint: null },\n ];\n if (runnable.includes(\"fast\")) {\n speeds.push({ id: \"fast\", label: messages.fast, hint: messages.fastRateHint });\n }\n speeds.push({\n id: \"ultrafast\",\n label: messages.ultrafast ?? \"Ultrafast\",\n hint: ultrafastHint(selected, messages),\n });\n return speeds;\n}\n\n/** Plans count Ultrafast against usage limits; metered routes bill a multiple of the rate. */\nfunction ultrafastHint(\n selected: ClientPickerModelRow,\n messages: ModelPolicyPickerMessages,\n): string | null {\n if (selected.billingClass === \"codex_subscription\") return messages.ultrafastUsageHint ?? null;\n const bps = selected.catalog.capabilities?.latencyModes.find(\n (mode) => mode.id === \"ultrafast\",\n )?.billingMultiplierBps;\n return bps && bps > 10_000 ? `${bps / 10_000}× rate` : null;\n}\n\nexport type ModelPickerChoice = {\n /** The new model, or null when the row is already selected. */\n model: string | null;\n /** Always reported, so hosts can commit model and effort together. */\n effort: ReasoningEffort;\n /** Fast falls back to standard when the new model cannot run it. */\n latencyMode: LatencyMode | null;\n};\n\n/** What choosing a row changes, or null when the row cannot be chosen. */\nexport function modelPickerChoice(\n props: Pick<ModelPickerInput, \"model\" | \"effort\" | \"latencyMode\">,\n row: ClientPickerModelRow,\n): ModelPickerChoice | null {\n if (!row.selectable) return null;\n return {\n model: row.id === props.model ? null : row.id,\n effort: coerceReasoningEffortForModel(row.catalog, props.effort),\n latencyMode:\n props.latencyMode !== \"standard\" &&\n !runnableLatencyModesForModel(row.catalog).includes(props.latencyMode)\n ? \"standard\"\n : null,\n };\n}\n\n/** The web segmented control's short labels (\"X-high\" fits a phone row). */\nexport function compactEffortLabel(\n t: OpenGeniText,\n effort: ReasoningEffort,\n label: string,\n): string {\n return effort === \"xhigh\" ? t(\"modelPickerModel.xHigh\") : label;\n}\n"],"mappings":"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","names":[]}
@@ -1,16 +1,19 @@
1
1
  "use client";
2
2
  import {
3
3
  PierreFile
4
- } from "./chunk-KVB6XDLP.js";
4
+ } from "./chunk-DPJ2CWVN.js";
5
+ import {
6
+ sandboxAcceptsLiveIo
7
+ } from "./chunk-QV3DJVRZ.js";
8
+ import {
9
+ CodeEditor
10
+ } from "./chunk-ZZHBT5WQ.js";
5
11
  import {
6
12
  useThemeType
7
13
  } from "./chunk-B27E3V37.js";
8
14
  import {
9
15
  prefersReducedMotion
10
16
  } from "./chunk-OYQQJL3J.js";
11
- import {
12
- CodeEditor
13
- } from "./chunk-FOOITLHR.js";
14
17
  import {
15
18
  MENU_BUTTON_CLASS,
16
19
  MENU_SEPARATOR_CLASS,
@@ -26,16 +29,13 @@ import {
26
29
  import {
27
30
  useOpenGeni
28
31
  } from "./chunk-TVQCDDSZ.js";
29
- import {
30
- sandboxAcceptsLiveIo
31
- } from "./chunk-QV3DJVRZ.js";
32
32
  import {
33
33
  cn
34
34
  } from "./chunk-TXS65BB2.js";
35
35
  import {
36
36
  createOpenGeniText,
37
37
  useOpenGeniText
38
- } from "./chunk-G7VLL3PG.js";
38
+ } from "./chunk-F2YABPRJ.js";
39
39
 
40
40
  // src/components/sandbox-files.tsx
41
41
  import { FileCode2Icon, FileWarningIcon, LoaderCircleIcon } from "lucide-react";
@@ -3061,4 +3061,4 @@ export {
3061
3061
  FileBrowser,
3062
3062
  SandboxFiles
3063
3063
  };
3064
- //# sourceMappingURL=chunk-TYHLEFD2.js.map
3064
+ //# sourceMappingURL=chunk-IZJNMRIR.js.map