@opengeni/react 4.3.3-canary.39786771332001 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (710) hide show
  1. package/dist/app/app-state.js +29 -29
  2. package/dist/app/components/Composer.js +27 -27
  3. package/dist/app/components/agent/agent-capability-picker.js +4 -4
  4. package/dist/app/components/artifacts/artifact-browse-controls.js +2 -2
  5. package/dist/app/components/artifacts/artifact-library.js +19 -19
  6. package/dist/app/components/artifacts/artifact-page-chrome.js +2 -2
  7. package/dist/app/components/artifacts/chat-interactive-block.js +16 -16
  8. package/dist/app/components/artifacts/inline-chat-image.js +31 -30
  9. package/dist/app/components/artifacts/retained-file-preview.js +35 -34
  10. package/dist/app/components/artifacts/retained-text-preview.js +5 -5
  11. package/dist/app/components/artifacts/site-audience.js +4 -4
  12. package/dist/app/components/artifacts/site-conversations.js +22 -21
  13. package/dist/app/components/artifacts/site-data.js +19 -19
  14. package/dist/app/components/artifacts/site-publishing.js +41 -41
  15. package/dist/app/components/artifacts/site-settings.js +50 -50
  16. package/dist/app/components/billing-class-mark.js +5 -5
  17. package/dist/app/components/capabilities/capability-detail-sheet.js +9 -9
  18. package/dist/app/components/capabilities/capability-logo-source.js +12 -12
  19. package/dist/app/components/capabilities/connector-tool-permissions.js +3 -3
  20. package/dist/app/components/capabilities/native-connect-setup.js +14 -14
  21. package/dist/app/components/capabilities/perform-capability-action.js +1 -1
  22. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +16 -16
  23. package/dist/app/components/capabilities/session-capability-card.js +94 -76
  24. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  25. package/dist/app/components/capabilities/session-chrome-card.css +1023 -0
  26. package/dist/app/components/capabilities/session-chrome-card.css.map +1 -0
  27. package/dist/app/components/capabilities/session-chrome-card.d.ts +18 -0
  28. package/dist/app/components/capabilities/session-chrome-card.js +72 -0
  29. package/dist/app/components/capabilities/session-custom-mcp-card.js +20 -20
  30. package/dist/app/components/capabilities/session-github-card.js +24 -24
  31. package/dist/app/components/capabilities/session-machine-card.d.ts +27 -1
  32. package/dist/app/components/capabilities/session-machine-card.js +40 -36
  33. package/dist/app/components/capabilities/use-capabilities-catalog.js +3 -3
  34. package/dist/app/components/capabilities/use-connection-accounts.js +1 -1
  35. package/dist/app/components/command-menu/chat-status.js +18 -17
  36. package/dist/app/components/command-menu/chat-switcher.js +19 -18
  37. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  38. package/dist/app/components/command-menu/command-menu.js +36 -114
  39. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  40. package/dist/app/components/command-menu/shortcut-sheet.js +17 -17
  41. package/dist/app/components/composer-capabilities-menu-body.js +3 -3
  42. package/dist/app/components/composer-mobile-plus-panel.js +20 -20
  43. package/dist/app/components/composer-mobile-plus.js +1 -1
  44. package/dist/app/components/credit-required-gate.js +1 -1
  45. package/dist/app/components/credit-required-prompt.js +12 -12
  46. package/dist/app/components/credits/coupon-redeem.js +2 -2
  47. package/dist/app/components/credits/credit-refusal-notice.js +2 -2
  48. package/dist/app/components/desktop/app-shots.js +7 -7
  49. package/dist/app/components/desktop/this-computer.js +4 -4
  50. package/dist/app/components/feedback.js +4 -4
  51. package/dist/app/components/follow-up-repository-menu-body.js +5 -5
  52. package/dist/app/components/follow-up-repository-picker.js +1 -1
  53. package/dist/app/components/github-app-connect-launcher.js +2 -2
  54. package/dist/app/components/in-app-help-link.js +2 -2
  55. package/dist/app/components/knowledge/agent-learning-settings.js +3 -3
  56. package/dist/app/components/machines/connect-machine-dialog.js +18 -18
  57. package/dist/app/components/markdown.js +9 -9
  58. package/dist/app/components/message-context-pills.js +2 -2
  59. package/dist/app/components/models/models-ui.js +8 -8
  60. package/dist/app/components/new-session-starters.js +2 -2
  61. package/dist/app/components/pickers.js +9 -9
  62. package/dist/app/components/rail/rail-context.js +2 -2
  63. package/dist/app/components/rail/rail-sections.js +69 -66
  64. package/dist/app/components/rail/session-header.js +49 -48
  65. package/dist/app/components/rail/session-list.js +68 -65
  66. package/dist/app/components/rail/session-row-content.d.ts +6 -2
  67. package/dist/app/components/rail/session-row-content.js +1 -1
  68. package/dist/app/components/rail/session-row-hover-details.js +24 -23
  69. package/dist/app/components/rail/session-shell.js +107 -104
  70. package/dist/app/components/rail/site-session-group-heading.d.ts +7 -1
  71. package/dist/app/components/rail/site-session-group-heading.js +20 -3
  72. package/dist/app/components/repository-picker.js +5 -5
  73. package/dist/app/components/secrets/session-secrets-panel.js +3 -3
  74. package/dist/app/components/session/agent-configuration-panel.js +38 -38
  75. package/dist/app/components/session/artifact-link-boundary.js +2 -2
  76. package/dist/app/components/session/artifact-session-page.js +4 -4
  77. package/dist/app/components/session/banners.js +11 -11
  78. package/dist/app/components/session/codex-account-indicator.js +12 -12
  79. package/dist/app/components/session/editable-artifacts-workspace.js +45 -45
  80. package/dist/app/components/session/failed-session-banner.js +11 -11
  81. package/dist/app/components/session/human-input.js +59 -55
  82. package/dist/app/components/session/inspector.js +91 -87
  83. package/dist/app/components/session/inspector.js.map +1 -1
  84. package/dist/app/components/session/message-actions.js +4 -4
  85. package/dist/app/components/session/message-resource-attachments.js +21 -20
  86. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  87. package/dist/app/components/session/model-account-indicator.js +11 -11
  88. package/dist/app/components/session/model-context-inspector.js +2 -2
  89. package/dist/app/components/session/model-recovery-notice.js +3 -3
  90. package/dist/app/components/session/new-session-settings-menu.js +12 -12
  91. package/dist/app/components/session/sandbox-switcher.js +16 -16
  92. package/dist/app/components/session/sandbox-workspace.js +83 -79
  93. package/dist/app/components/session/search-markdown-highlight.js +10 -10
  94. package/dist/app/components/session/search-results-view.js +11 -11
  95. package/dist/app/components/session/session-admin-access.js +9 -9
  96. package/dist/app/components/session/session-admission-notice.js +6 -6
  97. package/dist/app/components/session/session-machine-access-notice.js +6 -6
  98. package/dist/app/components/session/session-retention.js +4 -4
  99. package/dist/app/components/session/session-search-dialog.js +12 -12
  100. package/dist/app/components/session/session-skill-reviews.js +1 -1
  101. package/dist/app/components/session/session-tenancy-control.d.ts +2 -0
  102. package/dist/app/components/session/session-tenancy-control.js +41 -26
  103. package/dist/app/components/session/session-tenancy-control.js.map +1 -1
  104. package/dist/app/components/session/session-usage-limit-section.js +11 -11
  105. package/dist/app/components/session/session-wait-status.js +10 -9
  106. package/dist/app/components/session/session-wait-status.js.map +1 -1
  107. package/dist/app/components/session/site-origin-link.d.ts +1 -0
  108. package/dist/app/components/session/site-origin-link.js +2 -2
  109. package/dist/app/components/session/subagents.js +17 -16
  110. package/dist/app/components/session-connectors-menu-body.js +5 -5
  111. package/dist/app/components/settings/row-select.js +1 -1
  112. package/dist/app/components/transcription-settings.js +2 -2
  113. package/dist/app/components/ui/destructive-confirm.js +6 -6
  114. package/dist/app/components/usage/usage-entry.js +8 -8
  115. package/dist/app/components/workspace-composer-plus.js +22 -22
  116. package/dist/app/embed/memory-navigation.js +2 -2
  117. package/dist/app/embed/session-app.js +275 -269
  118. package/dist/app/lib/actions/actions-provider.js +14 -14
  119. package/dist/app/lib/actions/held-modifier.d.ts +11 -0
  120. package/dist/app/lib/app-surfaces.js +2 -2
  121. package/dist/app/lib/codex-usage-query.js +6 -6
  122. package/dist/app/lib/composer-connectors.js +13 -13
  123. package/dist/app/lib/console-site.d.ts +6 -0
  124. package/dist/app/lib/console-site.js +14 -0
  125. package/dist/app/lib/console-text.js +2 -2
  126. package/dist/app/lib/events.js +18 -17
  127. package/dist/app/lib/failed-session-copy.js +3 -3
  128. package/dist/app/lib/model-access-onboarding.js +3 -3
  129. package/dist/app/lib/move-chat-to-machine.js +3 -3
  130. package/dist/app/lib/navigation.d.ts +5 -0
  131. package/dist/app/lib/navigation.js +1 -1
  132. package/dist/app/lib/routes.d.ts +17 -0
  133. package/dist/app/lib/routes.js +9 -3
  134. package/dist/app/lib/session-branch-cache.js +14 -13
  135. package/dist/app/lib/session-create.js +2 -2
  136. package/dist/app/lib/session-deep-link.js +2 -2
  137. package/dist/app/lib/session-failure-toasts.d.ts +8 -0
  138. package/dist/app/lib/session-group-pagination.js +14 -13
  139. package/dist/app/lib/session-hover-facts.js +15 -14
  140. package/dist/app/lib/session-model.js +3 -3
  141. package/dist/app/lib/session-rail.js +10 -9
  142. package/dist/app/lib/session-rename.js +3 -3
  143. package/dist/app/lib/session-ui-features.d.ts +6 -1
  144. package/dist/app/lib/session-ui-features.js +1 -1
  145. package/dist/app/lib/sessions-group.d.ts +43 -3
  146. package/dist/app/lib/sessions-group.js +22 -15
  147. package/dist/app/lib/shared-query.js +3 -3
  148. package/dist/app/lib/site-opened.d.ts +6 -0
  149. package/dist/app/lib/site-opened.js +10 -0
  150. package/dist/app/lib/turn-failure-analytics.js +5 -5
  151. package/dist/app/lib/use-duplicate-site.js +3 -3
  152. package/dist/app/lib/use-follow-up-repositories.js +4 -4
  153. package/dist/app/lib/use-session-list-hint-refresh.d.ts +20 -2
  154. package/dist/app/lib/use-session-list-hint-refresh.js +5 -1
  155. package/dist/app/lib/use-workspace-machines.js +6 -6
  156. package/dist/app/lib/use-workspace-model-catalog.js +8 -8
  157. package/dist/app/lib/use-workspace-rigs.js +8 -8
  158. package/dist/app/lib/workspace-navigation-preference.js +5 -5
  159. package/dist/app/lib/workspace-scope-context.js +4 -4
  160. package/dist/app/routes/artifacts.js +136 -153
  161. package/dist/app/routes/artifacts.js.map +1 -1
  162. package/dist/app/routes/retained-artifact.js +63 -62
  163. package/dist/app/routes/retained-artifact.js.map +1 -1
  164. package/dist/app/routes/session-unavailable.js +7 -5
  165. package/dist/app/routes/session.js +177 -173
  166. package/dist/app/routes/sessions-index-hydration.js +3 -3
  167. package/dist/app/routes/sessions-index.js +123 -121
  168. package/dist/app/routes/site-view.d.ts +11 -0
  169. package/dist/app/routes/site-view.js +597 -0
  170. package/dist/app/routes/site-view.js.map +1 -0
  171. package/dist/artifacts-document.js +4 -4
  172. package/dist/artifacts-presentation.js +4 -4
  173. package/dist/artifacts-spreadsheet.js +4 -4
  174. package/dist/artifacts.js +39 -39
  175. package/dist/{browser-viewer-RYYQSRTC.js → browser-viewer-QMCNV4RI.js} +9 -7
  176. package/dist/{chat-interactive-block-ABCRKXJ4.js → chat-interactive-block-PMIAUXSO.js} +6 -6
  177. package/dist/{chunk-GIZGNFIX.js → chunk-22FFOHPT.js} +11 -11
  178. package/dist/chunk-22GTC4MZ.js +15 -0
  179. package/dist/chunk-22GTC4MZ.js.map +1 -0
  180. package/dist/{chunk-Z5WMLJKI.js → chunk-22JFMNMF.js} +92 -4
  181. package/dist/chunk-22JFMNMF.js.map +1 -0
  182. package/dist/{chunk-UHFWF6ZU.js → chunk-2FPS5H2D.js} +2 -2
  183. package/dist/{chunk-NAWXARTY.js → chunk-2KO2G3RI.js} +72 -6
  184. package/dist/chunk-2KO2G3RI.js.map +1 -0
  185. package/dist/{chunk-5POTDNQT.js → chunk-2NC7NZCE.js} +6 -6
  186. package/dist/{chunk-ZKYYZH6L.js → chunk-2QBYDGWO.js} +9 -9
  187. package/dist/{chunk-TWXIFWBD.js → chunk-34EU25RL.js} +2 -2
  188. package/dist/{chunk-LQKKSUCR.js → chunk-35BC2FU2.js} +19 -19
  189. package/dist/{chunk-PTGRFAMH.js → chunk-3ABPIUCK.js} +2 -2
  190. package/dist/{chunk-S4SC5SSV.js → chunk-3GU7AWG7.js} +18 -18
  191. package/dist/{chunk-722UO6YQ.js → chunk-3PEXVG4D.js} +2 -2
  192. package/dist/{chunk-OQAAI33Y.js → chunk-3RMKPHBL.js} +3 -3
  193. package/dist/{chunk-6JKZILLF.js → chunk-3RQUWFZT.js} +67 -67
  194. package/dist/{chunk-6JKZILLF.js.map → chunk-3RQUWFZT.js.map} +1 -1
  195. package/dist/{chunk-GCGTYXJJ.js → chunk-3STBLX4O.js} +9 -9
  196. package/dist/{chunk-YXIW7H4N.js → chunk-3X5FKDYQ.js} +28 -28
  197. package/dist/{chunk-KTRKZRID.js → chunk-4GLLWX33.js} +11 -11
  198. package/dist/{chunk-ROQOVH4N.js → chunk-4HEXNAFI.js} +20 -20
  199. package/dist/chunk-4HEXNAFI.js.map +1 -0
  200. package/dist/{chunk-SD2K5ZN5.js → chunk-4LPA25NQ.js} +4 -4
  201. package/dist/{chunk-DKCX643S.js → chunk-4RMN4E2Y.js} +13 -13
  202. package/dist/{chunk-E5FCEDMU.js → chunk-4SAGYEVB.js} +2 -2
  203. package/dist/{chunk-HTT3FB7T.js → chunk-4VK2R5QC.js} +3 -3
  204. package/dist/{chunk-CKG2EG62.js → chunk-4XQC7VLT.js} +14 -14
  205. package/dist/{chunk-IVOA3DXA.js → chunk-4YXAQMTD.js} +12 -12
  206. package/dist/{chunk-HOJGAJAB.js → chunk-52WK2GGK.js} +8 -8
  207. package/dist/{chunk-NYZQ7LO7.js → chunk-552UYIQ7.js} +20 -20
  208. package/dist/{chunk-LEXPBQ56.js → chunk-5DSKMG2I.js} +4 -4
  209. package/dist/{chunk-WNG757ID.js → chunk-5FA455GR.js} +4 -4
  210. package/dist/{chunk-MNWQAYY3.js → chunk-5FEN3KYH.js} +11 -11
  211. package/dist/{chunk-OSVHU2WU.js → chunk-5JHRMUAZ.js} +12 -12
  212. package/dist/{chunk-PM3OSANE.js → chunk-5MJHH72T.js} +14 -3
  213. package/dist/chunk-5MJHH72T.js.map +1 -0
  214. package/dist/{chunk-RKB2Z457.js → chunk-5VGJXWQ2.js} +2 -2
  215. package/dist/{chunk-GFUUFM2O.js → chunk-5W6ZDKRR.js} +6 -6
  216. package/dist/{chunk-NDETTZQA.js → chunk-5W7KJ5NQ.js} +37 -37
  217. package/dist/{chunk-Q35YZVDZ.js → chunk-5Y2FPLZE.js} +9 -9
  218. package/dist/{chunk-6W3LF3DB.js → chunk-5YFY4SFC.js} +2 -12
  219. package/dist/chunk-5YFY4SFC.js.map +1 -0
  220. package/dist/{chunk-F3NERYBQ.js → chunk-62VER7O4.js} +6 -6
  221. package/dist/{chunk-FBMU3VK5.js → chunk-6DCEDIF6.js} +2 -2
  222. package/dist/{chunk-WUHB422G.js → chunk-73WI7FL2.js} +18 -18
  223. package/dist/chunk-756MKA2J.js +45 -0
  224. package/dist/chunk-756MKA2J.js.map +1 -0
  225. package/dist/{chunk-QECZVL7S.js → chunk-7FJMRJDG.js} +2 -2
  226. package/dist/{chunk-7KGKDWWR.js → chunk-7HFLYNWN.js} +2 -2
  227. package/dist/{chunk-XVM566II.js → chunk-7KIENXRE.js} +2 -2
  228. package/dist/{chunk-CBY5CXBD.js → chunk-7NPCEBZE.js} +5 -5
  229. package/dist/{chunk-46VBQG2D.js → chunk-7P4AQMGA.js} +13 -13
  230. package/dist/{chunk-CKZW7A5S.js → chunk-7TCT7KPQ.js} +742 -644
  231. package/dist/chunk-7TCT7KPQ.js.map +1 -0
  232. package/dist/{chunk-O77Q4NG2.js → chunk-7XO7YKPC.js} +283 -1038
  233. package/dist/chunk-7XO7YKPC.js.map +1 -0
  234. package/dist/{chunk-S7PVL7XH.js → chunk-A4BD4ZVB.js} +4 -4
  235. package/dist/{chunk-VSQHDBHU.js → chunk-ACL2V2KE.js} +68 -35
  236. package/dist/chunk-ACL2V2KE.js.map +1 -0
  237. package/dist/{chunk-73SOCVLS.js → chunk-AIEXYO2X.js} +3 -3
  238. package/dist/{chunk-U7TC2XJQ.js → chunk-AJPW3SV4.js} +3 -3
  239. package/dist/{chunk-HRJQAFKR.js → chunk-AX6YJA5U.js} +2 -2
  240. package/dist/{chunk-P5WABK2H.js → chunk-BCM7C3MJ.js} +9 -9
  241. package/dist/{chunk-DT7BORXG.js → chunk-BMJTNPWK.js} +2 -2
  242. package/dist/{chunk-HIHO2QE7.js → chunk-BT2MVGHT.js} +2 -2
  243. package/dist/{chunk-3XOISKZC.js → chunk-BXQYAAVE.js} +4 -4
  244. package/dist/{chunk-IBTXYLBW.js → chunk-CCFWY4GF.js} +2 -2
  245. package/dist/{chunk-ZOC3OP6F.js → chunk-CCR33J7L.js} +2 -2
  246. package/dist/{chunk-GTQ3SNEI.js → chunk-CD3MO3IC.js} +2 -2
  247. package/dist/{chunk-WSMYOLHG.js → chunk-CDEXRJB6.js} +5 -5
  248. package/dist/{chunk-3GLAPCVI.js → chunk-CFFNT2OY.js} +8 -8
  249. package/dist/{chunk-FUSFVUIJ.js → chunk-CMLJSF2F.js} +12 -12
  250. package/dist/{chunk-O4DYOSOL.js → chunk-CP7ZQHBW.js} +13 -13
  251. package/dist/{chunk-IOKSNX74.js → chunk-D5OWJZQR.js} +2 -2
  252. package/dist/{chunk-SQGXMHJO.js → chunk-DGLRZMXL.js} +3 -3
  253. package/dist/{chunk-GNEHAPKV.js → chunk-DJFTH2DI.js} +3 -3
  254. package/dist/{chunk-HQG4SLTE.js → chunk-DYJGYGPB.js} +2 -2
  255. package/dist/{chunk-4EAF3HSD.js → chunk-EJ7WARW7.js} +2 -2
  256. package/dist/{chunk-3AA6RNGE.js → chunk-ENS6E4RZ.js} +2 -2
  257. package/dist/{chunk-OOEO4MKY.js → chunk-EPWD4KRA.js} +2 -2
  258. package/dist/{chunk-V5RJAWRP.js → chunk-EQE3MNQN.js} +5 -5
  259. package/dist/{chunk-TSBE4KOQ.js → chunk-EWL6NDOO.js} +3 -3
  260. package/dist/{chunk-OO2T63BY.js → chunk-EYS4ZOF5.js} +2 -2
  261. package/dist/{chunk-IC7KNOBB.js → chunk-FDAV72IX.js} +7 -7
  262. package/dist/{chunk-AG7VGUIW.js → chunk-FFNPUSVO.js} +7 -7
  263. package/dist/{chunk-P5T36BA3.js → chunk-FRP64DEK.js} +2 -2
  264. package/dist/{chunk-KBF3SE7G.js → chunk-FSP334UU.js} +2 -2
  265. package/dist/{chunk-ZHFKMMOT.js → chunk-FTX5CNHA.js} +6 -6
  266. package/dist/{chunk-KYBALSWW.js → chunk-FWOBNL2A.js} +1 -1
  267. package/dist/{chunk-HJ5XWW62.js → chunk-FWYEZ3LE.js} +34 -34
  268. package/dist/{chunk-WSLPZ43N.js → chunk-G4HQUBO4.js} +12 -12
  269. package/dist/{chunk-CSHBR2IZ.js → chunk-GDLDBR6B.js} +2 -2
  270. package/dist/chunk-GGV4NSG3.js +792 -0
  271. package/dist/chunk-GGV4NSG3.js.map +1 -0
  272. package/dist/{chunk-G3S2F35T.js → chunk-GHHM6WN4.js} +3 -3
  273. package/dist/{chunk-OANSIX34.js → chunk-GRSODLVO.js} +4 -4
  274. package/dist/{chunk-DDIBZA4X.js → chunk-GT7JFQ4E.js} +405 -148
  275. package/dist/chunk-GT7JFQ4E.js.map +1 -0
  276. package/dist/{chunk-EU6XSQFM.js → chunk-GXW2I2M2.js} +2 -2
  277. package/dist/{chunk-4246UYVG.js → chunk-GZS37O3G.js} +1 -1
  278. package/dist/{chunk-XFNLU7EW.js → chunk-H5M33DAL.js} +15 -6
  279. package/dist/chunk-H5M33DAL.js.map +1 -0
  280. package/dist/{chunk-Y7WMW74G.js → chunk-HQWVDQXW.js} +7 -7
  281. package/dist/{chunk-YTZQV2DD.js → chunk-HU6JTNWF.js} +2 -2
  282. package/dist/{chunk-QRVNI5V6.js → chunk-I6KIQKU6.js} +3 -3
  283. package/dist/{chunk-Q262Y2YX.js → chunk-IBA5FMRE.js} +141 -137
  284. package/dist/chunk-IBA5FMRE.js.map +1 -0
  285. package/dist/{chunk-BNUPYHHZ.js → chunk-IDXTASGN.js} +4 -4
  286. package/dist/{chunk-KF3MF6FP.js → chunk-IECRGM6K.js} +3 -2
  287. package/dist/chunk-IECRGM6K.js.map +1 -0
  288. package/dist/chunk-IJYL5BZM.js +38 -0
  289. package/dist/chunk-IJYL5BZM.js.map +1 -0
  290. package/dist/{chunk-L6RXRRN3.js → chunk-ILDOW2IQ.js} +3 -3
  291. package/dist/{chunk-VUHPA3XQ.js → chunk-ITX2TB4K.js} +6 -6
  292. package/dist/{chunk-ETCB6SUJ.js → chunk-J22HD2PB.js} +6 -6
  293. package/dist/{chunk-U47YDYLQ.js → chunk-J5MEDX7C.js} +8 -8
  294. package/dist/{chunk-6VQTHC4W.js → chunk-J7FBBLHF.js} +36 -36
  295. package/dist/{chunk-5JZYPZ72.js → chunk-JFK7NTEA.js} +4 -4
  296. package/dist/chunk-JFK7NTEA.js.map +1 -0
  297. package/dist/{chunk-QZRDCFHI.js → chunk-JM4HQPAI.js} +5 -5
  298. package/dist/{chunk-PIVGX42P.js → chunk-JNY5MT3I.js} +2 -2
  299. package/dist/{chunk-XWWXIZFP.js → chunk-JO6R5EXF.js} +7 -7
  300. package/dist/{chunk-MM7OKOTE.js → chunk-JQCGPTZ6.js} +9 -9
  301. package/dist/chunk-JRSNCSZN.js +37 -0
  302. package/dist/chunk-JRSNCSZN.js.map +1 -0
  303. package/dist/{chunk-KNFDWNCH.js → chunk-JXT5QDJC.js} +5 -5
  304. package/dist/{chunk-OR37STQZ.js → chunk-KEXYBG7Q.js} +3 -3
  305. package/dist/{chunk-AZVANYMB.js → chunk-KUNFUSZ7.js} +2 -2
  306. package/dist/{chunk-DXZNDKQD.js → chunk-LEEJBZ5B.js} +2 -2
  307. package/dist/{chunk-STUCI6QA.js → chunk-LEKBNKLD.js} +1 -1
  308. package/dist/{chunk-STUCI6QA.js.map → chunk-LEKBNKLD.js.map} +1 -1
  309. package/dist/{chunk-C535KSTY.js → chunk-LF5CBAOS.js} +4 -4
  310. package/dist/{chunk-BJIZ7PL7.js → chunk-LHLK7FUA.js} +145 -29
  311. package/dist/chunk-LHLK7FUA.js.map +1 -0
  312. package/dist/{chunk-RIMKJBCD.js → chunk-LMPTC4CX.js} +2 -2
  313. package/dist/{chunk-3KVWXKD6.js → chunk-LQ47YL6E.js} +2 -2
  314. package/dist/{chunk-H5WGWAYX.js → chunk-LT4J7RHI.js} +13 -13
  315. package/dist/{chunk-DSGMYES6.js → chunk-MCTTONOW.js} +28 -28
  316. package/dist/{chunk-IGHELZI7.js → chunk-MIECLOQC.js} +9 -9
  317. package/dist/{chunk-FM4OUCC2.js → chunk-MOKYT3X3.js} +3 -3
  318. package/dist/{chunk-GZ64CASI.js → chunk-MVZYNZXE.js} +5 -4
  319. package/dist/chunk-MVZYNZXE.js.map +1 -0
  320. package/dist/{chunk-RKILMLA7.js → chunk-MXLKI7BI.js} +3 -3
  321. package/dist/{chunk-45WYYFP6.js → chunk-N3ZP4IDU.js} +2 -2
  322. package/dist/{chunk-XRRSFQEV.js → chunk-NAZZLAWX.js} +2 -2
  323. package/dist/{chunk-UWJ5P5CU.js → chunk-NEK4WB5P.js} +3 -3
  324. package/dist/{chunk-6L7U46Y2.js → chunk-NKNVIO66.js} +2 -2
  325. package/dist/{chunk-JKUICTLM.js → chunk-NLAFNMPK.js} +2 -2
  326. package/dist/{chunk-4LKNIGHB.js → chunk-O2SBHS2N.js} +2 -2
  327. package/dist/{chunk-D3RK3NGM.js → chunk-PCFK7HKD.js} +17 -17
  328. package/dist/{chunk-VVCDB2T7.js → chunk-PCJLH45G.js} +3 -3
  329. package/dist/{chunk-PZ24CYDO.js → chunk-PFAUGEV5.js} +2 -2
  330. package/dist/{chunk-HGMWMK5K.js → chunk-PO3BH3KQ.js} +2 -2
  331. package/dist/{chunk-B74GSYR6.js → chunk-PUTS4DYW.js} +2 -2
  332. package/dist/{chunk-JSIDLTTG.js → chunk-PZ2V2XIK.js} +2 -2
  333. package/dist/{chunk-TMEQPODK.js → chunk-PZ37VDB5.js} +2 -2
  334. package/dist/{chunk-QIYBOFUV.js → chunk-QFMLAT7L.js} +246 -237
  335. package/dist/chunk-QFMLAT7L.js.map +1 -0
  336. package/dist/{chunk-LVONK3YQ.js → chunk-QRKTESVE.js} +2 -2
  337. package/dist/{chunk-HT5WSUC7.js → chunk-QXEDIDBZ.js} +3 -3
  338. package/dist/{chunk-WURSS6MP.js → chunk-R66YMYJU.js} +2 -2
  339. package/dist/{chunk-HDHK3SXK.js → chunk-RFLYID6H.js} +5 -5
  340. package/dist/{chunk-V77JK73U.js → chunk-RIYZFKIM.js} +37 -35
  341. package/dist/chunk-RIYZFKIM.js.map +1 -0
  342. package/dist/{chunk-VMFID36H.js → chunk-RQNZDTKT.js} +19 -19
  343. package/dist/{chunk-EHCUFCXM.js → chunk-RYSRFAHN.js} +32 -22
  344. package/dist/chunk-RYSRFAHN.js.map +1 -0
  345. package/dist/{chunk-I6VUUEXH.js → chunk-S2U4CDAC.js} +150 -150
  346. package/dist/chunk-S2U4CDAC.js.map +1 -0
  347. package/dist/chunk-S37GP7LX.js +204 -0
  348. package/dist/chunk-S37GP7LX.js.map +1 -0
  349. package/dist/{chunk-A2EWJQXX.js → chunk-SM5QX6UK.js} +4 -4
  350. package/dist/{chunk-FBE6AIIW.js → chunk-SOKNCW5U.js} +2 -2
  351. package/dist/{chunk-Q4NM77K7.js → chunk-SSOO4GWN.js} +193 -194
  352. package/dist/chunk-SSOO4GWN.js.map +1 -0
  353. package/dist/{chunk-PFKTGZKE.js → chunk-SY2AAZNB.js} +2 -2
  354. package/dist/{chunk-DFZMKCVP.js → chunk-TIQPKOFW.js} +4 -4
  355. package/dist/{chunk-HPPKLBTJ.js → chunk-TJQDL3JH.js} +2 -2
  356. package/dist/chunk-TL7BOFFL.js +89 -0
  357. package/dist/chunk-TL7BOFFL.js.map +1 -0
  358. package/dist/{chunk-FD4Q5KFL.js → chunk-TLL22FFO.js} +2 -2
  359. package/dist/{chunk-QM5H4FPT.js → chunk-TV6BWONY.js} +3 -3
  360. package/dist/{chunk-EDFJBX3V.js → chunk-U6MPB3K6.js} +9 -9
  361. package/dist/{chunk-TZD3U2S5.js → chunk-ULJAOMJA.js} +4 -4
  362. package/dist/chunk-ULYQEFNH.js +529 -0
  363. package/dist/chunk-ULYQEFNH.js.map +1 -0
  364. package/dist/{chunk-H5EVWF6L.js → chunk-UNNJUJVD.js} +2 -2
  365. package/dist/{chunk-324X6T6G.js → chunk-UP7I3W6O.js} +57 -55
  366. package/dist/chunk-UP7I3W6O.js.map +1 -0
  367. package/dist/{chunk-VU2EWALC.js → chunk-UUGR3X5I.js} +19 -12
  368. package/dist/chunk-UUGR3X5I.js.map +1 -0
  369. package/dist/{chunk-Z6DKXQG7.js → chunk-UXXFMF4X.js} +2 -2
  370. package/dist/{chunk-OBQVTCTW.js → chunk-UYNCMZX5.js} +4 -4
  371. package/dist/{chunk-RGPYMHKI.js → chunk-V3K4RQO7.js} +9 -3
  372. package/dist/chunk-V3K4RQO7.js.map +1 -0
  373. package/dist/{chunk-KZHW27BV.js → chunk-V4QZ7UBK.js} +2 -2
  374. package/dist/{chunk-NEVRLD77.js → chunk-VH5EGTH2.js} +3 -3
  375. package/dist/{chunk-MYNUBDU7.js → chunk-VYKW6TB2.js} +1 -1
  376. package/dist/chunk-VYKW6TB2.js.map +1 -0
  377. package/dist/{chunk-QEJTQTF5.js → chunk-W6T5HR3Z.js} +3 -3
  378. package/dist/{chunk-H6WWEKEV.js → chunk-WCMG4HYI.js} +10 -10
  379. package/dist/{chunk-GZLLDA6P.js → chunk-WEFN327U.js} +2 -2
  380. package/dist/{chunk-VW3BBTMA.js → chunk-WKHUZIOW.js} +1 -1
  381. package/dist/{chunk-ANHUMDJX.js → chunk-WNDTLK44.js} +2 -2
  382. package/dist/{chunk-2DS4UOYQ.js → chunk-WSZQNTVN.js} +2 -2
  383. package/dist/{chunk-Z2DAWUO3.js → chunk-XMNUZUUA.js} +6 -6
  384. package/dist/{chunk-GAIM5RNE.js → chunk-XN7NSPE6.js} +3 -3
  385. package/dist/chunk-XV6ZYRHK.js +59 -0
  386. package/dist/chunk-XV6ZYRHK.js.map +1 -0
  387. package/dist/{chunk-FLGUVRR7.js → chunk-Y5BSA3I7.js} +5 -5
  388. package/dist/{chunk-WRLWLGEF.js → chunk-Y5E3XQ2S.js} +25 -2
  389. package/dist/{chunk-WRLWLGEF.js.map → chunk-Y5E3XQ2S.js.map} +1 -1
  390. package/dist/{chunk-QILLL4JE.js → chunk-YEROLKOA.js} +16 -16
  391. package/dist/{chunk-NDF3SH3X.js → chunk-YJPKDRI2.js} +15 -15
  392. package/dist/{chunk-TQGJN5UZ.js → chunk-YV56F4UP.js} +318 -700
  393. package/dist/chunk-YV56F4UP.js.map +1 -0
  394. package/dist/{chunk-VAIESMPY.js → chunk-YVBHGMKC.js} +4 -4
  395. package/dist/{chunk-AD22P5X3.js → chunk-YXA2EKV3.js} +3 -3
  396. package/dist/{chunk-FDNJVZRE.js → chunk-YYCOSTUU.js} +17 -17
  397. package/dist/{chunk-NLMTNEWW.js → chunk-Z6E6TUAE.js} +2 -2
  398. package/dist/{chunk-BJW7G6EF.js → chunk-Z7IGO5EA.js} +3 -3
  399. package/dist/{chunk-N7JKT4ZU.js → chunk-ZEIFJ6PX.js} +7 -7
  400. package/dist/{chunk-Q4OHNGGB.js → chunk-ZS2UQ3DV.js} +68 -11
  401. package/dist/chunk-ZS2UQ3DV.js.map +1 -0
  402. package/dist/{chunk-VRGOOVDB.js → chunk-ZVVT72MT.js} +2 -2
  403. package/dist/components/browser-viewer.d.ts +1 -1
  404. package/dist/composer.js +14 -14
  405. package/dist/{computer-viewer-KEDVLD42.js → computer-viewer-25AJIDYA.js} +9 -9
  406. package/dist/connect.js +11 -11
  407. package/dist/desktop.js +2 -2
  408. package/dist/editor.js +2 -2
  409. package/dist/{embedded-new-voice-5PYRDZ6T.js → embedded-new-voice-RZZEJT6M.js} +8 -8
  410. package/dist/{embedded-voice-PABC5NBD.js → embedded-voice-6OKSSPLW.js} +8 -8
  411. package/dist/{fleet-decision-row-QNSTP3VX.js → fleet-decision-row-NN2HXDX3.js} +2 -2
  412. package/dist/hooks/internal.d.ts +38 -0
  413. package/dist/hooks/use-client-config-flags.d.ts +12 -0
  414. package/dist/hooks/use-workspace-sessions.d.ts +10 -1
  415. package/dist/index.js +233 -227
  416. package/dist/interaction.js +11 -9
  417. package/dist/interaction.js.map +1 -1
  418. package/dist/{latest-question-5LIRVG4G.js → latest-question-2PFWQSSG.js} +4 -3
  419. package/dist/{latest-question-5LIRVG4G.js.map → latest-question-2PFWQSSG.js.map} +1 -1
  420. package/dist/machines.js +5 -5
  421. package/dist/messages/en.d.ts +3 -3
  422. package/dist/messages.js +1 -1
  423. package/dist/{model-policy-picker-menu-CURJ247L.js → model-policy-picker-menu-VVFGGAI6.js} +6 -6
  424. package/dist/model-policy-picker-menu-VVFGGAI6.js.map +1 -0
  425. package/dist/native-previews.js +3 -3
  426. package/dist/{platform-activity-row-BMXXNZKX.js → platform-activity-row-ENQVIFTL.js} +2 -2
  427. package/dist/{queue-surface-implementation-2X5AXB6I.js → queue-surface-implementation-4SHOQPQQ.js} +10 -8
  428. package/dist/{queue-surface-implementation-2X5AXB6I.js.map → queue-surface-implementation-4SHOQPQQ.js.map} +1 -1
  429. package/dist/realtime.js +7 -7
  430. package/dist/{sandbox-files-4FBG3GS2.js → sandbox-files-CCOTGXXA.js} +11 -11
  431. package/dist/sandbox-files-CCOTGXXA.js.map +1 -0
  432. package/dist/session-app.js +277 -271
  433. package/dist/session-list-model.d.ts +1 -0
  434. package/dist/session-list-model.js +8 -2
  435. package/dist/{session-realtime-2XIB254N.js → session-realtime-JNKDSGH7.js} +3 -3
  436. package/dist/session-realtime-JNKDSGH7.js.map +1 -0
  437. package/dist/session-realtime.js +2 -2
  438. package/dist/session-ui.js +77 -72
  439. package/dist/session.js +27 -25
  440. package/dist/sites.js +2 -2
  441. package/dist/terminal.js +2 -2
  442. package/dist/this-computer.js +3 -3
  443. package/dist/timeline/invoked-tool.d.ts +5 -0
  444. package/dist/timeline/tool-display-name.d.ts +2 -2
  445. package/dist/timeline/tool-icon.d.ts +14 -0
  446. package/dist/timeline/tool-presentation.d.ts +8 -3
  447. package/dist/timeline/types.d.ts +2 -0
  448. package/dist/{timeline-annotation-markers-X4K2IEOO.js → timeline-annotation-markers-KHNYNY2J.js} +5 -5
  449. package/dist/{timeline-annotation-selection-MEHBW676.js → timeline-annotation-selection-AXEDJHBP.js} +7 -7
  450. package/dist/{timeline-annotations-dialog-U2FPQ3UY.js → timeline-annotations-dialog-AV4ZBXRC.js} +9 -9
  451. package/dist/timeline-model.js +28 -26
  452. package/dist/ui/access-list.js +20 -20
  453. package/dist/ui/choice-cards.js +2 -2
  454. package/dist/ui/detail-page.js +2 -2
  455. package/dist/ui/detail-sheet.js +2 -2
  456. package/dist/ui/diff-view.js +2 -2
  457. package/dist/ui/disclosure.js +4 -4
  458. package/dist/ui/flush-form-page.js +3 -3
  459. package/dist/ui/form-dialog.js +2 -2
  460. package/dist/ui/list-row.js +5 -5
  461. package/dist/ui/revision-history.js +11 -11
  462. package/dist/ui/role-select.js +6 -6
  463. package/dist/ui/settings-nav.js +3 -3
  464. package/dist/usage.js +3 -3
  465. package/dist/workbench.js +11 -11
  466. package/package.json +4 -4
  467. package/src/app/app-state.tsx +3 -1
  468. package/src/app/components/capabilities/session-capability-card.tsx +14 -1
  469. package/src/app/components/capabilities/session-chrome-card.dom-fixture.tsx +377 -0
  470. package/src/app/components/capabilities/session-chrome-card.test.tsx +18 -0
  471. package/src/app/components/capabilities/session-chrome-card.tsx +243 -0
  472. package/src/app/components/capabilities/session-machine-card.dom-fixture.tsx +2 -0
  473. package/src/app/components/capabilities/session-machine-card.tsx +74 -16
  474. package/src/app/components/rail/session-list.tsx +254 -44
  475. package/src/app/components/rail/session-row-content.tsx +24 -2
  476. package/src/app/components/rail/session-shell.tsx +14 -9
  477. package/src/app/components/rail/site-session-group-heading.tsx +59 -20
  478. package/src/app/components/session/session-tenancy-control.tsx +18 -0
  479. package/src/app/components/session/site-origin-link.test.tsx +73 -0
  480. package/src/app/components/session/site-origin-link.tsx +4 -2
  481. package/src/app/embed/memory-navigation.tsx +1 -0
  482. package/src/app/lib/actions/held-modifier.test.ts +101 -0
  483. package/src/app/lib/actions/held-modifier.ts +108 -0
  484. package/src/app/lib/console-site.tsx +38 -0
  485. package/src/app/lib/navigation.tsx +4 -0
  486. package/src/app/lib/routes.tsx +42 -0
  487. package/src/app/lib/session-failure-toasts.ts +26 -0
  488. package/src/app/lib/session-ui-features.tsx +18 -4
  489. package/src/app/lib/sessions-group.tsx +219 -30
  490. package/src/app/lib/site-opened.tsx +48 -0
  491. package/src/app/lib/site-session-groups.test.ts +173 -6
  492. package/src/app/lib/site-view-routes.test.ts +55 -0
  493. package/src/app/lib/use-session-list-hint-refresh.tsx +44 -4
  494. package/src/app/routes/artifacts.tsx +2 -29
  495. package/src/app/routes/session-transient-failures.test.tsx +343 -0
  496. package/src/app/routes/session-unavailable.tsx +74 -3
  497. package/src/app/routes/session.tsx +4 -13
  498. package/src/app/routes/sessions-index.tsx +13 -9
  499. package/src/app/routes/site-view.test.tsx +476 -0
  500. package/src/app/routes/site-view.tsx +583 -0
  501. package/src/components/browser-viewer.tsx +16 -2
  502. package/src/hooks/internal.ts +129 -6
  503. package/src/hooks/use-client-config-flags.ts +8 -0
  504. package/src/hooks/use-session-events.ts +83 -9
  505. package/src/hooks/use-workspace-sessions.ts +21 -1
  506. package/src/messages/en.ts +3 -3
  507. package/src/session-list-model.ts +4 -0
  508. package/src/timeline/activity-rail.tsx +3 -2
  509. package/src/timeline/invoked-tool.ts +14 -4
  510. package/src/timeline/projection.ts +15 -8
  511. package/src/timeline/rolling-activity.tsx +6 -2
  512. package/src/timeline/tool-display-name.ts +2 -2
  513. package/src/timeline/tool-icon.tsx +165 -0
  514. package/src/timeline/tool-presentation.ts +207 -48
  515. package/src/timeline/tool-renderers.tsx +1 -70
  516. package/src/timeline/types.ts +2 -0
  517. package/styles/compiled.css +38 -0
  518. package/dist/chunk-22ZBT6CN.js +0 -50
  519. package/dist/chunk-22ZBT6CN.js.map +0 -1
  520. package/dist/chunk-324X6T6G.js.map +0 -1
  521. package/dist/chunk-5JZYPZ72.js.map +0 -1
  522. package/dist/chunk-6W3LF3DB.js.map +0 -1
  523. package/dist/chunk-BJIZ7PL7.js.map +0 -1
  524. package/dist/chunk-CKZW7A5S.js.map +0 -1
  525. package/dist/chunk-DDIBZA4X.js.map +0 -1
  526. package/dist/chunk-EHCUFCXM.js.map +0 -1
  527. package/dist/chunk-GZ64CASI.js.map +0 -1
  528. package/dist/chunk-I6VUUEXH.js.map +0 -1
  529. package/dist/chunk-KF3MF6FP.js.map +0 -1
  530. package/dist/chunk-MYNUBDU7.js.map +0 -1
  531. package/dist/chunk-NAWXARTY.js.map +0 -1
  532. package/dist/chunk-O77Q4NG2.js.map +0 -1
  533. package/dist/chunk-PM3OSANE.js.map +0 -1
  534. package/dist/chunk-Q262Y2YX.js.map +0 -1
  535. package/dist/chunk-Q4NM77K7.js.map +0 -1
  536. package/dist/chunk-Q4OHNGGB.js.map +0 -1
  537. package/dist/chunk-QIYBOFUV.js.map +0 -1
  538. package/dist/chunk-R25ZKOZR.js +0 -24
  539. package/dist/chunk-R25ZKOZR.js.map +0 -1
  540. package/dist/chunk-RGPYMHKI.js.map +0 -1
  541. package/dist/chunk-ROQOVH4N.js.map +0 -1
  542. package/dist/chunk-TQGJN5UZ.js.map +0 -1
  543. package/dist/chunk-V77JK73U.js.map +0 -1
  544. package/dist/chunk-VSQHDBHU.js.map +0 -1
  545. package/dist/chunk-VU2EWALC.js.map +0 -1
  546. package/dist/chunk-XFNLU7EW.js.map +0 -1
  547. package/dist/chunk-Z5WMLJKI.js.map +0 -1
  548. /package/dist/{browser-viewer-RYYQSRTC.js.map → app/components/capabilities/session-chrome-card.js.map} +0 -0
  549. /package/dist/{chat-interactive-block-ABCRKXJ4.js.map → app/lib/console-site.js.map} +0 -0
  550. /package/dist/{computer-viewer-KEDVLD42.js.map → app/lib/site-opened.js.map} +0 -0
  551. /package/dist/{embedded-new-voice-5PYRDZ6T.js.map → browser-viewer-QMCNV4RI.js.map} +0 -0
  552. /package/dist/{embedded-voice-PABC5NBD.js.map → chat-interactive-block-PMIAUXSO.js.map} +0 -0
  553. /package/dist/{chunk-GIZGNFIX.js.map → chunk-22FFOHPT.js.map} +0 -0
  554. /package/dist/{chunk-UHFWF6ZU.js.map → chunk-2FPS5H2D.js.map} +0 -0
  555. /package/dist/{chunk-5POTDNQT.js.map → chunk-2NC7NZCE.js.map} +0 -0
  556. /package/dist/{chunk-ZKYYZH6L.js.map → chunk-2QBYDGWO.js.map} +0 -0
  557. /package/dist/{chunk-TWXIFWBD.js.map → chunk-34EU25RL.js.map} +0 -0
  558. /package/dist/{chunk-LQKKSUCR.js.map → chunk-35BC2FU2.js.map} +0 -0
  559. /package/dist/{chunk-PTGRFAMH.js.map → chunk-3ABPIUCK.js.map} +0 -0
  560. /package/dist/{chunk-S4SC5SSV.js.map → chunk-3GU7AWG7.js.map} +0 -0
  561. /package/dist/{chunk-722UO6YQ.js.map → chunk-3PEXVG4D.js.map} +0 -0
  562. /package/dist/{chunk-OQAAI33Y.js.map → chunk-3RMKPHBL.js.map} +0 -0
  563. /package/dist/{chunk-GCGTYXJJ.js.map → chunk-3STBLX4O.js.map} +0 -0
  564. /package/dist/{chunk-YXIW7H4N.js.map → chunk-3X5FKDYQ.js.map} +0 -0
  565. /package/dist/{chunk-KTRKZRID.js.map → chunk-4GLLWX33.js.map} +0 -0
  566. /package/dist/{chunk-SD2K5ZN5.js.map → chunk-4LPA25NQ.js.map} +0 -0
  567. /package/dist/{chunk-DKCX643S.js.map → chunk-4RMN4E2Y.js.map} +0 -0
  568. /package/dist/{chunk-E5FCEDMU.js.map → chunk-4SAGYEVB.js.map} +0 -0
  569. /package/dist/{chunk-HTT3FB7T.js.map → chunk-4VK2R5QC.js.map} +0 -0
  570. /package/dist/{chunk-CKG2EG62.js.map → chunk-4XQC7VLT.js.map} +0 -0
  571. /package/dist/{chunk-IVOA3DXA.js.map → chunk-4YXAQMTD.js.map} +0 -0
  572. /package/dist/{chunk-HOJGAJAB.js.map → chunk-52WK2GGK.js.map} +0 -0
  573. /package/dist/{chunk-NYZQ7LO7.js.map → chunk-552UYIQ7.js.map} +0 -0
  574. /package/dist/{chunk-LEXPBQ56.js.map → chunk-5DSKMG2I.js.map} +0 -0
  575. /package/dist/{chunk-WNG757ID.js.map → chunk-5FA455GR.js.map} +0 -0
  576. /package/dist/{chunk-MNWQAYY3.js.map → chunk-5FEN3KYH.js.map} +0 -0
  577. /package/dist/{chunk-OSVHU2WU.js.map → chunk-5JHRMUAZ.js.map} +0 -0
  578. /package/dist/{chunk-RKB2Z457.js.map → chunk-5VGJXWQ2.js.map} +0 -0
  579. /package/dist/{chunk-GFUUFM2O.js.map → chunk-5W6ZDKRR.js.map} +0 -0
  580. /package/dist/{chunk-NDETTZQA.js.map → chunk-5W7KJ5NQ.js.map} +0 -0
  581. /package/dist/{chunk-Q35YZVDZ.js.map → chunk-5Y2FPLZE.js.map} +0 -0
  582. /package/dist/{chunk-F3NERYBQ.js.map → chunk-62VER7O4.js.map} +0 -0
  583. /package/dist/{chunk-FBMU3VK5.js.map → chunk-6DCEDIF6.js.map} +0 -0
  584. /package/dist/{chunk-WUHB422G.js.map → chunk-73WI7FL2.js.map} +0 -0
  585. /package/dist/{chunk-QECZVL7S.js.map → chunk-7FJMRJDG.js.map} +0 -0
  586. /package/dist/{chunk-7KGKDWWR.js.map → chunk-7HFLYNWN.js.map} +0 -0
  587. /package/dist/{chunk-XVM566II.js.map → chunk-7KIENXRE.js.map} +0 -0
  588. /package/dist/{chunk-CBY5CXBD.js.map → chunk-7NPCEBZE.js.map} +0 -0
  589. /package/dist/{chunk-46VBQG2D.js.map → chunk-7P4AQMGA.js.map} +0 -0
  590. /package/dist/{chunk-S7PVL7XH.js.map → chunk-A4BD4ZVB.js.map} +0 -0
  591. /package/dist/{chunk-73SOCVLS.js.map → chunk-AIEXYO2X.js.map} +0 -0
  592. /package/dist/{chunk-U7TC2XJQ.js.map → chunk-AJPW3SV4.js.map} +0 -0
  593. /package/dist/{chunk-HRJQAFKR.js.map → chunk-AX6YJA5U.js.map} +0 -0
  594. /package/dist/{chunk-P5WABK2H.js.map → chunk-BCM7C3MJ.js.map} +0 -0
  595. /package/dist/{chunk-DT7BORXG.js.map → chunk-BMJTNPWK.js.map} +0 -0
  596. /package/dist/{chunk-HIHO2QE7.js.map → chunk-BT2MVGHT.js.map} +0 -0
  597. /package/dist/{chunk-3XOISKZC.js.map → chunk-BXQYAAVE.js.map} +0 -0
  598. /package/dist/{chunk-IBTXYLBW.js.map → chunk-CCFWY4GF.js.map} +0 -0
  599. /package/dist/{chunk-ZOC3OP6F.js.map → chunk-CCR33J7L.js.map} +0 -0
  600. /package/dist/{chunk-GTQ3SNEI.js.map → chunk-CD3MO3IC.js.map} +0 -0
  601. /package/dist/{chunk-WSMYOLHG.js.map → chunk-CDEXRJB6.js.map} +0 -0
  602. /package/dist/{chunk-3GLAPCVI.js.map → chunk-CFFNT2OY.js.map} +0 -0
  603. /package/dist/{chunk-FUSFVUIJ.js.map → chunk-CMLJSF2F.js.map} +0 -0
  604. /package/dist/{chunk-O4DYOSOL.js.map → chunk-CP7ZQHBW.js.map} +0 -0
  605. /package/dist/{chunk-IOKSNX74.js.map → chunk-D5OWJZQR.js.map} +0 -0
  606. /package/dist/{chunk-SQGXMHJO.js.map → chunk-DGLRZMXL.js.map} +0 -0
  607. /package/dist/{chunk-GNEHAPKV.js.map → chunk-DJFTH2DI.js.map} +0 -0
  608. /package/dist/{chunk-HQG4SLTE.js.map → chunk-DYJGYGPB.js.map} +0 -0
  609. /package/dist/{chunk-4EAF3HSD.js.map → chunk-EJ7WARW7.js.map} +0 -0
  610. /package/dist/{chunk-3AA6RNGE.js.map → chunk-ENS6E4RZ.js.map} +0 -0
  611. /package/dist/{chunk-OOEO4MKY.js.map → chunk-EPWD4KRA.js.map} +0 -0
  612. /package/dist/{chunk-V5RJAWRP.js.map → chunk-EQE3MNQN.js.map} +0 -0
  613. /package/dist/{chunk-TSBE4KOQ.js.map → chunk-EWL6NDOO.js.map} +0 -0
  614. /package/dist/{chunk-OO2T63BY.js.map → chunk-EYS4ZOF5.js.map} +0 -0
  615. /package/dist/{chunk-IC7KNOBB.js.map → chunk-FDAV72IX.js.map} +0 -0
  616. /package/dist/{chunk-AG7VGUIW.js.map → chunk-FFNPUSVO.js.map} +0 -0
  617. /package/dist/{chunk-P5T36BA3.js.map → chunk-FRP64DEK.js.map} +0 -0
  618. /package/dist/{chunk-KBF3SE7G.js.map → chunk-FSP334UU.js.map} +0 -0
  619. /package/dist/{chunk-ZHFKMMOT.js.map → chunk-FTX5CNHA.js.map} +0 -0
  620. /package/dist/{chunk-KYBALSWW.js.map → chunk-FWOBNL2A.js.map} +0 -0
  621. /package/dist/{chunk-HJ5XWW62.js.map → chunk-FWYEZ3LE.js.map} +0 -0
  622. /package/dist/{chunk-WSLPZ43N.js.map → chunk-G4HQUBO4.js.map} +0 -0
  623. /package/dist/{chunk-CSHBR2IZ.js.map → chunk-GDLDBR6B.js.map} +0 -0
  624. /package/dist/{chunk-G3S2F35T.js.map → chunk-GHHM6WN4.js.map} +0 -0
  625. /package/dist/{chunk-OANSIX34.js.map → chunk-GRSODLVO.js.map} +0 -0
  626. /package/dist/{chunk-EU6XSQFM.js.map → chunk-GXW2I2M2.js.map} +0 -0
  627. /package/dist/{chunk-4246UYVG.js.map → chunk-GZS37O3G.js.map} +0 -0
  628. /package/dist/{chunk-Y7WMW74G.js.map → chunk-HQWVDQXW.js.map} +0 -0
  629. /package/dist/{chunk-YTZQV2DD.js.map → chunk-HU6JTNWF.js.map} +0 -0
  630. /package/dist/{chunk-QRVNI5V6.js.map → chunk-I6KIQKU6.js.map} +0 -0
  631. /package/dist/{chunk-BNUPYHHZ.js.map → chunk-IDXTASGN.js.map} +0 -0
  632. /package/dist/{chunk-L6RXRRN3.js.map → chunk-ILDOW2IQ.js.map} +0 -0
  633. /package/dist/{chunk-VUHPA3XQ.js.map → chunk-ITX2TB4K.js.map} +0 -0
  634. /package/dist/{chunk-ETCB6SUJ.js.map → chunk-J22HD2PB.js.map} +0 -0
  635. /package/dist/{chunk-U47YDYLQ.js.map → chunk-J5MEDX7C.js.map} +0 -0
  636. /package/dist/{chunk-6VQTHC4W.js.map → chunk-J7FBBLHF.js.map} +0 -0
  637. /package/dist/{chunk-QZRDCFHI.js.map → chunk-JM4HQPAI.js.map} +0 -0
  638. /package/dist/{chunk-PIVGX42P.js.map → chunk-JNY5MT3I.js.map} +0 -0
  639. /package/dist/{chunk-XWWXIZFP.js.map → chunk-JO6R5EXF.js.map} +0 -0
  640. /package/dist/{chunk-MM7OKOTE.js.map → chunk-JQCGPTZ6.js.map} +0 -0
  641. /package/dist/{chunk-KNFDWNCH.js.map → chunk-JXT5QDJC.js.map} +0 -0
  642. /package/dist/{chunk-OR37STQZ.js.map → chunk-KEXYBG7Q.js.map} +0 -0
  643. /package/dist/{chunk-AZVANYMB.js.map → chunk-KUNFUSZ7.js.map} +0 -0
  644. /package/dist/{chunk-DXZNDKQD.js.map → chunk-LEEJBZ5B.js.map} +0 -0
  645. /package/dist/{chunk-C535KSTY.js.map → chunk-LF5CBAOS.js.map} +0 -0
  646. /package/dist/{chunk-RIMKJBCD.js.map → chunk-LMPTC4CX.js.map} +0 -0
  647. /package/dist/{chunk-3KVWXKD6.js.map → chunk-LQ47YL6E.js.map} +0 -0
  648. /package/dist/{chunk-H5WGWAYX.js.map → chunk-LT4J7RHI.js.map} +0 -0
  649. /package/dist/{chunk-DSGMYES6.js.map → chunk-MCTTONOW.js.map} +0 -0
  650. /package/dist/{chunk-IGHELZI7.js.map → chunk-MIECLOQC.js.map} +0 -0
  651. /package/dist/{chunk-FM4OUCC2.js.map → chunk-MOKYT3X3.js.map} +0 -0
  652. /package/dist/{chunk-RKILMLA7.js.map → chunk-MXLKI7BI.js.map} +0 -0
  653. /package/dist/{chunk-45WYYFP6.js.map → chunk-N3ZP4IDU.js.map} +0 -0
  654. /package/dist/{chunk-XRRSFQEV.js.map → chunk-NAZZLAWX.js.map} +0 -0
  655. /package/dist/{chunk-UWJ5P5CU.js.map → chunk-NEK4WB5P.js.map} +0 -0
  656. /package/dist/{chunk-6L7U46Y2.js.map → chunk-NKNVIO66.js.map} +0 -0
  657. /package/dist/{chunk-JKUICTLM.js.map → chunk-NLAFNMPK.js.map} +0 -0
  658. /package/dist/{chunk-4LKNIGHB.js.map → chunk-O2SBHS2N.js.map} +0 -0
  659. /package/dist/{chunk-D3RK3NGM.js.map → chunk-PCFK7HKD.js.map} +0 -0
  660. /package/dist/{chunk-VVCDB2T7.js.map → chunk-PCJLH45G.js.map} +0 -0
  661. /package/dist/{chunk-PZ24CYDO.js.map → chunk-PFAUGEV5.js.map} +0 -0
  662. /package/dist/{chunk-HGMWMK5K.js.map → chunk-PO3BH3KQ.js.map} +0 -0
  663. /package/dist/{chunk-B74GSYR6.js.map → chunk-PUTS4DYW.js.map} +0 -0
  664. /package/dist/{chunk-JSIDLTTG.js.map → chunk-PZ2V2XIK.js.map} +0 -0
  665. /package/dist/{chunk-TMEQPODK.js.map → chunk-PZ37VDB5.js.map} +0 -0
  666. /package/dist/{chunk-LVONK3YQ.js.map → chunk-QRKTESVE.js.map} +0 -0
  667. /package/dist/{chunk-HT5WSUC7.js.map → chunk-QXEDIDBZ.js.map} +0 -0
  668. /package/dist/{chunk-WURSS6MP.js.map → chunk-R66YMYJU.js.map} +0 -0
  669. /package/dist/{chunk-HDHK3SXK.js.map → chunk-RFLYID6H.js.map} +0 -0
  670. /package/dist/{chunk-VMFID36H.js.map → chunk-RQNZDTKT.js.map} +0 -0
  671. /package/dist/{chunk-A2EWJQXX.js.map → chunk-SM5QX6UK.js.map} +0 -0
  672. /package/dist/{chunk-FBE6AIIW.js.map → chunk-SOKNCW5U.js.map} +0 -0
  673. /package/dist/{chunk-PFKTGZKE.js.map → chunk-SY2AAZNB.js.map} +0 -0
  674. /package/dist/{chunk-DFZMKCVP.js.map → chunk-TIQPKOFW.js.map} +0 -0
  675. /package/dist/{chunk-HPPKLBTJ.js.map → chunk-TJQDL3JH.js.map} +0 -0
  676. /package/dist/{chunk-FD4Q5KFL.js.map → chunk-TLL22FFO.js.map} +0 -0
  677. /package/dist/{chunk-QM5H4FPT.js.map → chunk-TV6BWONY.js.map} +0 -0
  678. /package/dist/{chunk-EDFJBX3V.js.map → chunk-U6MPB3K6.js.map} +0 -0
  679. /package/dist/{chunk-TZD3U2S5.js.map → chunk-ULJAOMJA.js.map} +0 -0
  680. /package/dist/{chunk-H5EVWF6L.js.map → chunk-UNNJUJVD.js.map} +0 -0
  681. /package/dist/{chunk-Z6DKXQG7.js.map → chunk-UXXFMF4X.js.map} +0 -0
  682. /package/dist/{chunk-OBQVTCTW.js.map → chunk-UYNCMZX5.js.map} +0 -0
  683. /package/dist/{chunk-KZHW27BV.js.map → chunk-V4QZ7UBK.js.map} +0 -0
  684. /package/dist/{chunk-NEVRLD77.js.map → chunk-VH5EGTH2.js.map} +0 -0
  685. /package/dist/{chunk-QEJTQTF5.js.map → chunk-W6T5HR3Z.js.map} +0 -0
  686. /package/dist/{chunk-H6WWEKEV.js.map → chunk-WCMG4HYI.js.map} +0 -0
  687. /package/dist/{chunk-GZLLDA6P.js.map → chunk-WEFN327U.js.map} +0 -0
  688. /package/dist/{chunk-VW3BBTMA.js.map → chunk-WKHUZIOW.js.map} +0 -0
  689. /package/dist/{chunk-ANHUMDJX.js.map → chunk-WNDTLK44.js.map} +0 -0
  690. /package/dist/{chunk-2DS4UOYQ.js.map → chunk-WSZQNTVN.js.map} +0 -0
  691. /package/dist/{chunk-Z2DAWUO3.js.map → chunk-XMNUZUUA.js.map} +0 -0
  692. /package/dist/{chunk-GAIM5RNE.js.map → chunk-XN7NSPE6.js.map} +0 -0
  693. /package/dist/{chunk-FLGUVRR7.js.map → chunk-Y5BSA3I7.js.map} +0 -0
  694. /package/dist/{chunk-QILLL4JE.js.map → chunk-YEROLKOA.js.map} +0 -0
  695. /package/dist/{chunk-NDF3SH3X.js.map → chunk-YJPKDRI2.js.map} +0 -0
  696. /package/dist/{chunk-VAIESMPY.js.map → chunk-YVBHGMKC.js.map} +0 -0
  697. /package/dist/{chunk-AD22P5X3.js.map → chunk-YXA2EKV3.js.map} +0 -0
  698. /package/dist/{chunk-FDNJVZRE.js.map → chunk-YYCOSTUU.js.map} +0 -0
  699. /package/dist/{chunk-NLMTNEWW.js.map → chunk-Z6E6TUAE.js.map} +0 -0
  700. /package/dist/{chunk-BJW7G6EF.js.map → chunk-Z7IGO5EA.js.map} +0 -0
  701. /package/dist/{chunk-N7JKT4ZU.js.map → chunk-ZEIFJ6PX.js.map} +0 -0
  702. /package/dist/{chunk-VRGOOVDB.js.map → chunk-ZVVT72MT.js.map} +0 -0
  703. /package/dist/{model-policy-picker-menu-CURJ247L.js.map → computer-viewer-25AJIDYA.js.map} +0 -0
  704. /package/dist/{sandbox-files-4FBG3GS2.js.map → embedded-new-voice-RZZEJT6M.js.map} +0 -0
  705. /package/dist/{session-realtime-2XIB254N.js.map → embedded-voice-6OKSSPLW.js.map} +0 -0
  706. /package/dist/{fleet-decision-row-QNSTP3VX.js.map → fleet-decision-row-NN2HXDX3.js.map} +0 -0
  707. /package/dist/{platform-activity-row-BMXXNZKX.js.map → platform-activity-row-ENQVIFTL.js.map} +0 -0
  708. /package/dist/{timeline-annotation-markers-X4K2IEOO.js.map → timeline-annotation-markers-KHNYNY2J.js.map} +0 -0
  709. /package/dist/{timeline-annotation-selection-MEHBW676.js.map → timeline-annotation-selection-AXEDJHBP.js.map} +0 -0
  710. /package/dist/{timeline-annotations-dialog-U2FPQ3UY.js.map → timeline-annotations-dialog-AV4ZBXRC.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/components/session/site-origin-link.tsx"],"sourcesContent":["import { Link } from \"../../lib/navigation\";\nimport { PanelsTopLeftIcon } from \"lucide-react\";\nimport { sessionSiteOrigin } from \"../../lib/session-site-origin\";\nimport type { RailSession as Session } from \"../../lib/session-list-entry\";\nexport function SiteOriginLink({\n session,\n compact = false,\n}: {\n session: Session;\n compact?: boolean | undefined;\n}) {\n const origin = sessionSiteOrigin(session);\n if (!origin) return null;\n return (\n <Link\n to=\"/workspaces/$workspaceId/artifacts/$artifactId\"\n params={{ workspaceId: session.workspaceId, artifactId: origin.siteId }}\n title={`Created through ${origin.title}`}\n aria-label={`Created through ${origin.title}. Open Site`}\n className=\"inline-flex shrink-0 items-center gap-1 rounded px-1 py-1 text-xs text-fg-muted hover:bg-surface-2 hover:text-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent\"\n >\n <PanelsTopLeftIcon aria-hidden=\"true\" className=\"size-3.5\" />\n {!compact && <span className=\"max-w-40 truncate\">{origin.title}</span>}\n </Link>\n );\n}\n"],"mappings":";;;;;;;;;AACA,SAAS,yBAAyB;AAa9B,SAOE,KAPF;AAVG,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,UAAU;AACZ,GAGG;AACD,QAAM,SAAS,kBAAkB,OAAO;AACxC,MAAI,CAAC,OAAQ,QAAO;AACpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,QAAQ,EAAE,aAAa,QAAQ,aAAa,YAAY,OAAO,OAAO;AAAA,MACtE,OAAO,mBAAmB,OAAO,KAAK;AAAA,MACtC,cAAY,mBAAmB,OAAO,KAAK;AAAA,MAC3C,WAAU;AAAA,MAEV;AAAA,4BAAC,qBAAkB,eAAY,QAAO,WAAU,YAAW;AAAA,QAC1D,CAAC,WAAW,oBAAC,UAAK,WAAU,qBAAqB,iBAAO,OAAM;AAAA;AAAA;AAAA,EACjE;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/timeline/work-presentation.ts","../src/human-input-model.ts","../src/timeline/notice-presentation.ts","../src/timeline/question-nav-model.ts","../src/timeline/focus-sequence.ts"],"sourcesContent":["// 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 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","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","/**\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"],"mappings":"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","names":["item"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/embed/memory-navigation.tsx"],"sourcesContent":["// Navigation for an embedded session app: the location lives in memory, so the\n// host page's URL and history stay untouched. Session routes render in place;\n// app-only pages (settings, billing, schedules) open the full web app beside\n// the host page.\nimport { createElement, useMemo, useState, useSyncExternalStore, type MouseEvent } from \"react\";\n\nimport type {\n LinkProps,\n NavigateOptions,\n NavigationHistoryState,\n NavigationHost,\n NavigationLocation,\n NavigationParams,\n NavigationSearch,\n NavigationState,\n NavigationUpdater,\n PageHost,\n} from \"../lib/navigation\";\nimport { openBlankTab } from \"../lib/navigation\";\n\nexport type MemoryNavigationOptions = Readonly<{\n /** The first location, such as `/workspaces/<id>/sessions`. */\n initialPath: string;\n /** The web app origin that app paths open against when they leave the embed. */\n consoleOrigin: string;\n /** Whether a path renders inside the embed; anything else leaves through `openUrl`. */\n handles: (pathname: string) => boolean;\n /** Opens a URL outside the embed. Defaults to a new browser tab. */\n openUrl?: ((url: string) => void) | undefined;\n /** An empty tab opened inside a click, or null to leave through `openUrl`. */\n openTab?: (() => Window | null) | undefined;\n /** Called after every in-embed location change. */\n onLocationChange?: ((location: NavigationLocation) => void) | undefined;\n}>;\n\ntype Listener = () => void;\n\nfunction resolveUpdater<T>(update: NavigationUpdater<T> | undefined, current: T, empty: T): T {\n if (update === undefined) return empty;\n if (update === true) return current;\n if (typeof update === \"function\") return (update as (previous: T) => T)(current);\n return update;\n}\n\n/** TanStack's search encoding: strings stay bare unless they would parse as JSON. */\nexport function stringifyMemorySearch(search: NavigationSearch): string {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(search)) {\n if (value === undefined) continue;\n if (typeof value === \"string\") {\n let json = false;\n try {\n JSON.parse(value);\n json = true;\n } catch {\n json = false;\n }\n query.set(key, json ? JSON.stringify(value) : value);\n } else {\n query.set(key, JSON.stringify(value));\n }\n }\n const text = query.toString();\n return text ? `?${text}` : \"\";\n}\n\nfunction parseMemorySearch(searchStr: string): NavigationSearch {\n const search: NavigationSearch = {};\n for (const [key, value] of new URLSearchParams(searchStr)) {\n try {\n search[key] = JSON.parse(value);\n } catch {\n search[key] = value;\n }\n }\n return search;\n}\n\nconst ROUTE_PARAMS = /^\\/workspaces\\/([^/]+)(?:\\/sessions(?:\\/([^/]+))?)?/u;\n\nfunction paramsOf(pathname: string): NavigationParams {\n const match = ROUTE_PARAMS.exec(pathname);\n if (!match) return {};\n return {\n workspaceId: decodeURIComponent(match[1]!),\n ...(match[2] ? { sessionId: decodeURIComponent(match[2]) } : {}),\n };\n}\n\nfunction fillPath(to: string, params: NavigationParams): string {\n return to.replace(/\\$([A-Za-z_][A-Za-z0-9_]*)/gu, (_, name: string) =>\n encodeURIComponent(params[name] ?? \"\"),\n );\n}\n\nfunction locationFor(\n pathname: string,\n search: NavigationSearch,\n hash: string,\n state: NavigationHistoryState,\n): NavigationLocation {\n const searchStr = stringifyMemorySearch(search);\n return {\n pathname,\n search,\n searchStr,\n hash,\n href: `${pathname}${searchStr}${hash ? `#${hash}` : \"\"}`,\n state,\n };\n}\n\nfunction initialLocation(path: string): NavigationLocation {\n const url = new URL(path, \"http://embed.invalid\");\n return locationFor(url.pathname, parseMemorySearch(url.search), url.hash.slice(1), {});\n}\n\nfunction isPlainClick(event: MouseEvent<HTMLAnchorElement>): boolean {\n return event.button === 0 && !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey;\n}\n\nfunction createMemoryNavigation(options: MemoryNavigationOptions): NavigationHost {\n let location = initialLocation(options.initialPath);\n const listeners = new Set<Listener>();\n const subscribe = (listener: Listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const snapshot = () => location;\n const openUrl =\n options.openUrl ??\n ((url: string) => {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n });\n const absolute = (path: string) => new URL(path, options.consoleOrigin).toString();\n\n const target = (navigation: NavigateOptions): NavigationLocation => {\n if (navigation.href !== undefined) return initialLocation(navigation.href);\n const currentParams = paramsOf(location.pathname);\n const params = resolveUpdater(navigation.params, currentParams, currentParams);\n const pathname =\n navigation.to === undefined || navigation.to === \".\"\n ? location.pathname\n : fillPath(navigation.to, params);\n return locationFor(\n pathname,\n resolveUpdater(navigation.search, location.search, {}),\n resolveUpdater(navigation.hash, location.hash, \"\"),\n resolveUpdater(navigation.state, location.state, {}),\n );\n };\n\n const commit = (next: NavigationLocation) => {\n if (!options.handles(next.pathname)) {\n openUrl(absolute(next.href));\n return;\n }\n location = next;\n for (const listener of listeners) listener();\n options.onLocationChange?.(next);\n };\n\n const navigate = async (navigation: NavigateOptions) => commit(target(navigation));\n\n const useLocation = () => useSyncExternalStore(subscribe, snapshot, snapshot);\n\n const Link = ({\n to,\n from: _from,\n params,\n search,\n hash,\n state,\n replace: _replace,\n resetScroll: _resetScroll,\n ignoreBlocker: _ignoreBlocker,\n reloadDocument: _reloadDocument,\n href: hrefOption,\n preload: _preload,\n disabled,\n children,\n onClick,\n ref,\n target: linkTarget,\n ...anchor\n }: LinkProps) => {\n const current = useLocation();\n const next = target({ to, params, search, hash, state, href: hrefOption });\n const internal = options.handles(next.pathname);\n const isActive = next.pathname === current.pathname;\n return createElement(\n \"a\",\n {\n ...anchor,\n ref,\n href: internal ? next.href : absolute(next.href),\n target: internal ? linkTarget : \"_blank\",\n rel: internal ? anchor.rel : \"noopener noreferrer\",\n \"aria-disabled\": disabled || undefined,\n \"data-status\": isActive ? \"active\" : undefined,\n onClick: (event: MouseEvent<HTMLAnchorElement>) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled) {\n if (disabled) event.preventDefault();\n return;\n }\n if (!isPlainClick(event)) return;\n if (!internal) {\n // Leaves through the host (the Office pane opens its own browser window).\n event.preventDefault();\n openUrl(absolute(next.href));\n return;\n }\n if (linkTarget === \"_blank\") return;\n event.preventDefault();\n commit(next);\n },\n },\n typeof children === \"function\" ? children({ isActive, isTransitioning: false }) : children,\n );\n };\n\n const page: PageHost = {\n href: () => absolute(location.href),\n origin: () => new URL(options.consoleOrigin).origin,\n readQuery: () => new URLSearchParams(location.searchStr),\n replaceQuery: (query, replaceOptions) => {\n location = locationFor(\n location.pathname,\n parseMemorySearch(query.toString()),\n location.hash,\n replaceOptions?.keepHistoryState ? location.state : {},\n );\n for (const listener of listeners) listener();\n },\n assign: (url) => {\n const resolved = new URL(url, options.consoleOrigin);\n const consoleOrigin = new URL(options.consoleOrigin).origin;\n if (resolved.origin === consoleOrigin && options.handles(resolved.pathname)) {\n commit(initialLocation(`${resolved.pathname}${resolved.search}${resolved.hash}`));\n return;\n }\n openUrl(resolved.toString());\n },\n opensBeside: true,\n open: (url) => openUrl(new URL(url, options.consoleOrigin).toString()),\n openTab: () => (options.openTab ?? openBlankTab)(),\n };\n\n return {\n useNavigate: () => navigate,\n useLocation,\n useRouterState: <T,>({ select }: { select: (state: NavigationState) => T }) =>\n select({ location: useLocation() }),\n useRouter: () => ({\n get state() {\n return { location };\n },\n }),\n useSearch: () => useLocation().search,\n Link,\n stringifySearch: stringifyMemorySearch,\n page,\n };\n}\n\n/**\n * A navigation host whose location lives in memory. Created once per mount;\n * later option changes keep the first location.\n */\nexport function useMemoryNavigation(options: MemoryNavigationOptions): NavigationHost {\n const [latest] = useState(() => ({ current: options }));\n latest.current = options;\n return useMemo(\n () =>\n createMemoryNavigation({\n initialPath: options.initialPath,\n consoleOrigin: options.consoleOrigin,\n handles: (pathname) => latest.current.handles(pathname),\n openUrl: (url) =>\n latest.current.openUrl\n ? latest.current.openUrl(url)\n : void window.open(url, \"_blank\", \"noopener,noreferrer\"),\n openTab: () => (latest.current.openTab ?? openBlankTab)(),\n onLocationChange: (location) => latest.current.onLocationChange?.(location),\n }),\n // oxlint-disable-next-line react-hooks/exhaustive-deps -- one history per mount\n [],\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/app/lib/navigation.tsx"],"sourcesContent":["// Navigation for the session UI, independent of any one router. The web app\n// backs it with its TanStack router (see `configurePageAppHost`), so links,\n// history and URLs there are exactly the router's own. An embed backs it with\n// its own routing or in-memory state.\nimport type { AnchorHTMLAttributes, ComponentType, ReactNode, Ref } from \"react\";\n\nimport { useAppHost } from \"./app-host\";\n\n/** History state the session UI writes and reads. */\nexport type NavigationHistoryState = {\n /** Set only on the Settings \"Back to sessions\" link that reopens this session. */\n restoredSessionId?: string | undefined;\n [key: string]: unknown;\n};\n\nexport type NavigationLocation = Readonly<{\n pathname: string;\n search: Record<string, unknown>;\n searchStr: string;\n hash: string;\n href: string;\n state: NavigationHistoryState;\n}>;\n\nexport type NavigationState = Readonly<{ location: NavigationLocation }>;\n\nexport type NavigationSearch = Record<string, unknown>;\nexport type NavigationParams = Record<string, string>;\n\n/** A value, `(previous) => next`, or `true` to keep the current one. */\nexport type NavigationUpdater<T> = true | T | ((previous: T) => T);\n\nexport type NavigateOptions = {\n /** A route path such as `/workspaces/$workspaceId`, filled from `params`. */\n to?: string | undefined;\n from?: string | undefined;\n params?: NavigationUpdater<NavigationParams> | undefined;\n search?: NavigationUpdater<NavigationSearch> | undefined;\n hash?: NavigationUpdater<string> | undefined;\n state?: NavigationUpdater<NavigationHistoryState> | undefined;\n replace?: boolean | undefined;\n resetScroll?: boolean | undefined;\n ignoreBlocker?: boolean | undefined;\n reloadDocument?: boolean | undefined;\n href?: string | undefined;\n};\n\nexport type NavigateFunction = (options: NavigateOptions) => Promise<void>;\n\nexport type LinkProps = NavigateOptions &\n Omit<AnchorHTMLAttributes<HTMLAnchorElement>, \"href\" | \"children\"> & {\n children?:\n | ReactNode\n | ((state: { isActive: boolean; isTransitioning: boolean }) => ReactNode)\n | undefined;\n preload?: false | \"intent\" | \"viewport\" | \"render\" | undefined;\n disabled?: boolean | undefined;\n ref?: Ref<HTMLAnchorElement> | undefined;\n };\n\n/**\n * The page around the session UI, for flows that leave it or return to it\n * (provider authorization, checkout, connect returns). The web app maps these\n * to `window.location` and `history`; an embed keeps the host page untouched.\n */\nexport type PageHost = Readonly<{\n /** Absolute URL of the console page being shown. */\n href: () => string;\n /** The console origin that app paths (`/workspaces/...`) resolve against. */\n origin: () => string;\n /** The page's query, where authorization and connect returns land. */\n readQuery: () => URLSearchParams;\n /** Replaces the page's query after handling a return, without a navigation. */\n replaceQuery: (query: URLSearchParams, options?: { keepHistoryState?: boolean }) => void;\n /**\n * Leaves for a URL: an external flow, or an app page outside the session UI.\n * An embed opens it beside the host page instead of replacing it.\n */\n assign: (url: string, options?: { replace?: boolean }) => void;\n /**\n * True when `assign` opens outside URLs beside the page rather than leaving\n * it (an embed), so a flow that leaves for checkout stays here and waits.\n */\n opensBeside: boolean;\n /** Opens a URL beside the page (a file, an image, a provider page). */\n open: (url: string) => void;\n /**\n * Opens an empty tab inside a click, for a URL known only after an await\n * (checkout, a freshly signed link). Null when the browser blocks it or the\n * host shows URLs its own way; the caller then leaves through `assign`.\n */\n openTab: () => Window | null;\n}>;\n\nexport type NavigationHost = Readonly<{\n useNavigate: () => NavigateFunction;\n useLocation: () => NavigationLocation;\n useRouterState: <T>(options: { select: (state: NavigationState) => T }) => T;\n /** Live, non-reactive read for event handlers. */\n useRouter: () => { readonly state: NavigationState };\n useSearch: (options: { strict: false }) => NavigationSearch;\n Link: ComponentType<LinkProps>;\n stringifySearch: (search: NavigationSearch) => string;\n page: PageHost;\n}>;\n\n/**\n * The browser window as the page: the default when nothing scopes another one,\n * and what a host that owns the URL (the web app) passes as its `page`.\n */\nexport const browserPage: PageHost = {\n href: () => window.location.href,\n origin: () => window.location.origin,\n readQuery: () => new URLSearchParams(window.location.search),\n replaceQuery: (query, options) =>\n window.history.replaceState(\n options?.keepHistoryState ? window.history.state : null,\n \"\",\n `${window.location.pathname}${query.size ? `?${query}` : \"\"}`,\n ),\n assign: (url, options) =>\n options?.replace ? window.location.replace(url) : window.location.assign(url),\n opensBeside: false,\n open: (url) => void window.open(url, \"_blank\", \"noopener,noreferrer\"),\n openTab: openBlankTab,\n};\n\n/** An empty new tab with no handle back to this page, or null when blocked. */\nexport function openBlankTab(): Window | null {\n let tab: Window | null = null;\n try {\n tab = window.open(\"\", \"_blank\");\n } catch {\n return null;\n }\n if (tab) tab.opener = null;\n return tab;\n}\n\nfunction useNavigationHost(): NavigationHost {\n const host = useAppHost().navigation;\n if (!host) throw new Error(\"Opengeni navigation is not configured\");\n return host;\n}\n\nexport function useNavigate(): NavigateFunction {\n return useNavigationHost().useNavigate();\n}\n\nexport function useLocation(): NavigationLocation {\n return useNavigationHost().useLocation();\n}\n\nexport function useRouterState<T>(options: { select: (state: NavigationState) => T }): T {\n return useNavigationHost().useRouterState(options);\n}\n\nexport function useRouter(): { readonly state: NavigationState } {\n return useNavigationHost().useRouter();\n}\n\nexport function useSearch(options: { strict: false }): NavigationSearch {\n return useNavigationHost().useSearch(options);\n}\n\nexport function Link(props: LinkProps) {\n const HostLink = useNavigationHost().Link;\n return <HostLink {...props} />;\n}\n\n/** The page around the session UI; the browser window unless a host scopes another. */\nexport function usePage(): PageHost {\n return useAppHost().navigation?.page ?? browserPage;\n}\n\n/** The host's search serializer (`?a=1&b=%22x%22`), for hrefs built outside `Link`. */\nexport function useStringifySearch(): (search: NavigationSearch) => string {\n return useNavigationHost().stringifySearch;\n}\n"],"mappings":";;;;;;AAuKS;AAzDF,IAAM,cAAwB;AAAA,EACnC,MAAM,MAAM,OAAO,SAAS;AAAA,EAC5B,QAAQ,MAAM,OAAO,SAAS;AAAA,EAC9B,WAAW,MAAM,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAAA,EAC3D,cAAc,CAAC,OAAO,YACpB,OAAO,QAAQ;AAAA,IACb,SAAS,mBAAmB,OAAO,QAAQ,QAAQ;AAAA,IACnD;AAAA,IACA,GAAG,OAAO,SAAS,QAAQ,GAAG,MAAM,OAAO,IAAI,KAAK,KAAK,EAAE;AAAA,EAC7D;AAAA,EACF,QAAQ,CAAC,KAAK,YACZ,SAAS,UAAU,OAAO,SAAS,QAAQ,GAAG,IAAI,OAAO,SAAS,OAAO,GAAG;AAAA,EAC9E,aAAa;AAAA,EACb,MAAM,CAAC,QAAQ,KAAK,OAAO,KAAK,KAAK,UAAU,qBAAqB;AAAA,EACpE,SAAS;AACX;AAGO,SAAS,eAA8B;AAC5C,MAAI,MAAqB;AACzB,MAAI;AACF,UAAM,OAAO,KAAK,IAAI,QAAQ;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,IAAK,KAAI,SAAS;AACtB,SAAO;AACT;AAEA,SAAS,oBAAoC;AAC3C,QAAM,OAAO,WAAW,EAAE;AAC1B,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,uCAAuC;AAClE,SAAO;AACT;AAEO,SAAS,cAAgC;AAC9C,SAAO,kBAAkB,EAAE,YAAY;AACzC;AAEO,SAAS,cAAkC;AAChD,SAAO,kBAAkB,EAAE,YAAY;AACzC;AAEO,SAAS,eAAkB,SAAuD;AACvF,SAAO,kBAAkB,EAAE,eAAe,OAAO;AACnD;AAEO,SAAS,YAAiD;AAC/D,SAAO,kBAAkB,EAAE,UAAU;AACvC;AAEO,SAAS,UAAU,SAA8C;AACtE,SAAO,kBAAkB,EAAE,UAAU,OAAO;AAC9C;AAEO,SAAS,KAAK,OAAkB;AACrC,QAAM,WAAW,kBAAkB,EAAE;AACrC,SAAO,oBAAC,YAAU,GAAG,OAAO;AAC9B;AAGO,SAAS,UAAoB;AAClC,SAAO,WAAW,EAAE,YAAY,QAAQ;AAC1C;AAGO,SAAS,qBAA2D;AACzE,SAAO,kBAAkB,EAAE;AAC7B;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/internal.ts"],"sourcesContent":["import { observedSessionSequence, type SessionEvent } from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type { EmbeddedSessionEventClientLike } from \"../client\";\nimport { normalizeError } from \"../lib/error-message\";\n\nconst HIDDEN_STREAM_GRACE_MS = 2_000;\n\n/**\n * Keep live browser work active while the page is visible, then suspend it\n * after a short hidden-tab grace period. Returning to the page re-enables the\n * caller, which must reconcile durable state before resuming live delivery.\n */\nexport function usePageLiveActivity(hiddenGraceMs = HIDDEN_STREAM_GRACE_MS): boolean {\n // Keep the server and initial browser render identical; the effect applies\n // visibility after mount and preserves the intentional hidden-tab grace.\n const [active, setActive] = useState(true);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n let hiddenTimer: ReturnType<typeof setTimeout> | null = null;\n const cancelHiddenTimer = () => {\n if (hiddenTimer !== null) {\n clearTimeout(hiddenTimer);\n hiddenTimer = null;\n }\n };\n const sync = () => {\n cancelHiddenTimer();\n if (document.visibilityState !== \"hidden\") {\n setActive(true);\n return;\n }\n hiddenTimer = setTimeout(() => {\n hiddenTimer = null;\n if (document.visibilityState === \"hidden\") setActive(false);\n }, hiddenGraceMs);\n };\n document.addEventListener(\"visibilitychange\", sync);\n window.addEventListener(\"pageshow\", sync);\n sync();\n return () => {\n cancelHiddenTimer();\n document.removeEventListener(\"visibilitychange\", sync);\n window.removeEventListener(\"pageshow\", sync);\n };\n }, [hiddenGraceMs]);\n\n return active;\n}\n\nexport type AsyncListState<T> = {\n data: T | null;\n loading: boolean;\n error: Error | null;\n refresh: () => Promise<void>;\n};\n\n/**\n * Shared fetch + optional polling loop for the list/read hooks. Stale\n * responses (superseded by a newer load or an unmount) are dropped.\n */\nexport function usePolledValue<T>(\n load: (signal?: AbortSignal) => Promise<T>,\n options: { pollIntervalMs?: number | undefined; enabled?: boolean | undefined } = {},\n): AsyncListState<T> {\n const enabled = options.enabled ?? true;\n const pollIntervalMs = options.pollIntervalMs;\n const pageLive = usePageLiveActivity();\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState(enabled);\n const [error, setError] = useState<Error | null>(null);\n const generation = useRef(0);\n const activeLoadRef = useRef(load);\n useLayoutEffect(() => {\n activeLoadRef.current = load;\n }, [load]);\n const requestAbortRef = useRef<AbortController | null>(null);\n const inFlightRef = useRef<{ load: typeof load; promise: Promise<void> } | null>(null);\n const trailingRefreshRef = useRef<{ load: typeof load; promise: Promise<void> } | null>(null);\n const [stateIdentity, setStateIdentity] = useState<{ load: typeof load }>(() => ({ load }));\n\n // A new loader identity means a new query (different session/workspace/...):\n // drop the previous result instead of showing it as the new query's data.\n useEffect(() => {\n if (stateIdentity.load !== load) {\n setStateIdentity({ load });\n setData(null);\n setError(null);\n }\n }, [load, stateIdentity.load]);\n\n const run = useCallback((): Promise<void> => {\n // A callback retained by a completed mutation from the previous query must\n // not supersede or settle the current query's request.\n if (activeLoadRef.current !== load) return Promise.resolve();\n const existing = inFlightRef.current;\n if (existing?.load === load) return existing.promise;\n const ticket = ++generation.current;\n const requestAbort = new AbortController();\n requestAbortRef.current = requestAbort;\n let promise!: Promise<void>;\n promise = (async () => {\n try {\n const result = await load(requestAbort.signal);\n if (\n ticket === generation.current &&\n activeLoadRef.current === load &&\n !requestAbort.signal.aborted\n ) {\n setData(result);\n setError(null);\n setLoading(false);\n }\n } catch (cause) {\n if (\n ticket === generation.current &&\n activeLoadRef.current === load &&\n !requestAbort.signal.aborted\n ) {\n setError(normalizeError(cause));\n setLoading(false);\n }\n } finally {\n if (requestAbortRef.current === requestAbort) requestAbortRef.current = null;\n if (inFlightRef.current?.promise === promise) inFlightRef.current = null;\n }\n })();\n inFlightRef.current = { load, promise };\n return promise;\n }, [load]);\n\n const refresh = useCallback((): Promise<void> => {\n const existing = inFlightRef.current;\n if (existing?.load !== load) return run();\n const trailing = trailingRefreshRef.current;\n if (trailing?.load === load) return trailing.promise;\n let promise!: Promise<void>;\n promise = existing.promise.then(async () => {\n if (trailingRefreshRef.current?.promise === promise) {\n trailingRefreshRef.current = null;\n }\n if (activeLoadRef.current === load) await run();\n });\n trailingRefreshRef.current = { load, promise };\n return promise;\n }, [load, run]);\n\n useEffect(() => {\n if (!enabled || !pageLive) {\n setLoading(false);\n generation.current += 1;\n requestAbortRef.current?.abort();\n inFlightRef.current = null;\n trailingRefreshRef.current = null;\n return;\n }\n setLoading(true);\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const schedule = () => {\n if (cancelled || pollIntervalMs === undefined || pollIntervalMs <= 0) return;\n timer = setTimeout(() => {\n timer = null;\n void run().finally(schedule);\n }, pollIntervalMs);\n };\n void run().finally(schedule);\n if (pollIntervalMs === undefined || pollIntervalMs <= 0) {\n return () => {\n cancelled = true;\n generation.current += 1;\n requestAbortRef.current?.abort();\n inFlightRef.current = null;\n trailingRefreshRef.current = null;\n };\n }\n return () => {\n cancelled = true;\n if (timer !== null) clearTimeout(timer);\n generation.current += 1;\n requestAbortRef.current?.abort();\n inFlightRef.current = null;\n trailingRefreshRef.current = null;\n };\n }, [run, enabled, pageLive, pollIntervalMs]);\n\n const identityMatches = stateIdentity.load === load;\n return {\n data: identityMatches ? data : null,\n loading: identityMatches ? loading : enabled,\n error: identityMatches ? error : null,\n refresh,\n };\n}\n\nexport type MutationState = {\n mutating: boolean;\n mutationError: Error | null;\n clearMutationError: () => void;\n};\n\n/**\n * Shared async mutation runner for the write hooks. `run` resolves with the\n * operation's value, or `null` after capturing the error in `mutationError`\n * (callers then roll back optimistic state).\n */\nexport function useMutationRunner(identity: unknown = undefined): MutationState & {\n run: <T>(operation: () => Promise<T>) => Promise<T | null>;\n} {\n const [mutating, setMutating] = useState(false);\n const [mutationError, setMutationError] = useState<Error | null>(null);\n const [stateIdentity, setStateIdentity] = useState<unknown>(() => identity);\n const inFlight = useRef(0);\n const generation = useRef(0);\n const identityRef = useRef(identity);\n useLayoutEffect(() => {\n if (Object.is(identityRef.current, identity)) return;\n identityRef.current = identity;\n generation.current += 1;\n inFlight.current = 0;\n }, [identity]);\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n useEffect(() => {\n if (!Object.is(stateIdentity, identity)) {\n setStateIdentity(() => identity);\n setMutating(false);\n setMutationError(null);\n }\n }, [identity, stateIdentity]);\n const run = useCallback(\n async <T>(operation: () => Promise<T>): Promise<T | null> => {\n const ownedIdentity = identity;\n const ownedGeneration = generation.current;\n if (!Object.is(identityRef.current, ownedIdentity)) return null;\n inFlight.current += 1;\n if (mounted.current) {\n setMutating(true);\n setMutationError(null);\n }\n try {\n const result = await operation();\n if (\n !mounted.current ||\n generation.current !== ownedGeneration ||\n !Object.is(identityRef.current, ownedIdentity)\n ) {\n return null;\n }\n return result;\n } catch (cause) {\n if (\n mounted.current &&\n generation.current === ownedGeneration &&\n Object.is(identityRef.current, ownedIdentity)\n ) {\n setMutationError(normalizeError(cause));\n }\n return null;\n } finally {\n if (\n generation.current === ownedGeneration &&\n Object.is(identityRef.current, ownedIdentity)\n ) {\n inFlight.current -= 1;\n if (mounted.current && inFlight.current === 0) {\n setMutating(false);\n }\n }\n }\n },\n [identity],\n );\n const identityMatches = Object.is(stateIdentity, identity);\n return {\n mutating: identityMatches && mutating,\n mutationError: identityMatches ? mutationError : null,\n clearMutationError: useCallback(() => {\n if (Object.is(identityRef.current, identity)) setMutationError(null);\n }, [identity]),\n run,\n };\n}\n\nexport type SessionEventFeedOptions = {\n /**\n * Share an existing event log (from `useSessionEvents`) instead of opening\n * a second stream. When omitted the hook tails the session's event stream\n * itself, starting at the current `lastSequence`.\n */\n events?: SessionEvent[] | undefined;\n enabled?: boolean | undefined;\n};\n\n/**\n * What a read hook's authoritative value reflects, for {@link useSessionEventTrigger}:\n *\n * - a number: every session event at or below this sequence (the session\n * detail's `lastSequence`, or a projection's `observedSessionSequence`);\n * - `\"reading\"`: the first read for this conversation is still in flight;\n * - `null` (or omitted): unknown, so every matching event refreshes.\n */\nexport type SessionReadThrough = number | \"reading\" | null;\n\n/** The sequence a projection read reflects, as {@link SessionReadThrough}. */\nexport function projectionReadThrough(\n value: unknown,\n firstReadInFlight: boolean,\n): SessionReadThrough {\n if (value === null || value === undefined) return firstReadInFlight ? \"reading\" : null;\n return observedSessionSequence(value) ?? null;\n}\n\nexport type SessionEventTriggerOptions = SessionEventFeedOptions & {\n /**\n * Shared-feed mode: deliver an event only when the hook's own read does not\n * already reflect it. While the first read is in flight, matching events\n * wait for it and the newest is delivered once if the read predates it.\n */\n readThrough?: SessionReadThrough | undefined;\n /**\n * Re-read the hook's projection. Called instead of delivering an event when\n * the feed's window starts after the sequence the read reflects, so events\n * between them (which could have changed the projection) were never seen.\n */\n refresh?: (() => void) | undefined;\n};\n\ntype HeldBatch = { latestMatch: SessionEvent | undefined; windowStart: number };\n\n/**\n * Invoke `onEvent` for every session event matching `match` — the live-update\n * primitive behind `useTurnQueue` and `useGoal`. Either watches a shared\n * `events` log or tails the stream directly (reconnect handled by the SDK).\n */\nexport function useSessionEventTrigger(\n client: EmbeddedSessionEventClientLike,\n workspaceId: string,\n sessionId: string | null | undefined,\n match: (event: SessionEvent) => boolean,\n onEvent: (event: SessionEvent) => void,\n options: SessionEventTriggerOptions = {},\n reconcileBeforeLive?: (() => void | Promise<void>) | undefined,\n): void {\n const enabled = options.enabled ?? true;\n const pageLive = usePageLiveActivity();\n const liveEnabled = enabled && pageLive;\n const events = options.events;\n const sharedFeed = events !== undefined;\n const readThrough = options.readThrough ?? null;\n const matchRef = useRef(match);\n const onEventRef = useRef(onEvent);\n const reconcileBeforeLiveRef = useRef(reconcileBeforeLive);\n const readThroughRef = useRef(readThrough);\n const refreshRef = useRef(options.refresh);\n useLayoutEffect(() => {\n matchRef.current = match;\n onEventRef.current = onEvent;\n reconcileBeforeLiveRef.current = reconcileBeforeLive;\n readThroughRef.current = readThrough;\n refreshRef.current = options.refresh;\n }, [match, onEvent, reconcileBeforeLive, readThrough, options.refresh]);\n const consumedRef = useRef(0);\n const feedKeyRef = useRef<string | null>(null);\n const sharedFeedHasEventsRef = useRef(false);\n // The newest matching event that arrived while the first read was in flight,\n // and the latest window start the feed reported meanwhile.\n const awaitingReadRef = useRef<HeldBatch | null>(null);\n const deliverBatch = useCallback((batch: HeldBatch) => {\n const through = readThroughRef.current;\n if (through === \"reading\") {\n const waiting = awaitingReadRef.current;\n const latest =\n waiting?.latestMatch &&\n (!batch.latestMatch || waiting.latestMatch.sequence > batch.latestMatch.sequence)\n ? waiting.latestMatch\n : batch.latestMatch;\n awaitingReadRef.current = {\n latestMatch: latest,\n windowStart: Math.max(waiting?.windowStart ?? 0, batch.windowStart),\n };\n return;\n }\n if (typeof through === \"number\") {\n // Events between the read and the window's first event were never seen.\n if (batch.windowStart > through + 1 && refreshRef.current) {\n refreshRef.current();\n return;\n }\n if (batch.latestMatch && batch.latestMatch.sequence > through) {\n onEventRef.current(batch.latestMatch);\n }\n return;\n }\n if (batch.latestMatch) onEventRef.current(batch.latestMatch);\n }, []);\n const deliver = useCallback(\n (event: SessionEvent) => deliverBatch({ latestMatch: event, windowStart: 0 }),\n [deliverBatch],\n );\n // The first read landed: settle what waited for it against what it reflects.\n useEffect(() => {\n if (readThrough === \"reading\") return;\n const waiting = awaitingReadRef.current;\n awaitingReadRef.current = null;\n if (waiting && sharedFeed && liveEnabled) deliverBatch(waiting);\n }, [deliverBatch, liveEnabled, readThrough, sharedFeed]);\n\n // Shared-log mode: scan only the unseen tail on every append.\n useEffect(() => {\n if (!sharedFeed || !liveEnabled || !sessionId) {\n return;\n }\n const feedKey = `${workspaceId}\\u0000${sessionId}`;\n const firstSequence = events[0]?.sequence ?? 0;\n if (feedKeyRef.current !== feedKey) {\n feedKeyRef.current = feedKey;\n awaitingReadRef.current = null;\n sharedFeedHasEventsRef.current = events.length > 0;\n // The caller has already loaded its authoritative initial projection.\n // Seed from the shared log's current tail so mounting a large historical\n // session cannot replay every old event as a new live trigger.\n consumedRef.current = events.at(-1)?.sequence ?? 0;\n return;\n }\n const firstNonEmptyBatch = !sharedFeedHasEventsRef.current && events.length > 0;\n if (firstNonEmptyBatch || firstSequence > consumedRef.current + 1) {\n // The usual shared feed mounts empty, then receives a historical tail.\n // A later discontinuity can likewise replace the retained browser\n // window. In either case, reconcile once from the latest relevant event\n // instead of replaying the whole retained window as live traffic.\n sharedFeedHasEventsRef.current = events.length > 0;\n consumedRef.current = events.at(-1)?.sequence ?? consumedRef.current;\n let latestMatch: SessionEvent | undefined;\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (event && matchRef.current(event)) {\n latestMatch = event;\n break;\n }\n }\n deliverBatch({ latestMatch, windowStart: firstSequence });\n return;\n }\n sharedFeedHasEventsRef.current ||= events.length > 0;\n for (const event of events) {\n if (event.sequence <= consumedRef.current) {\n continue;\n }\n consumedRef.current = event.sequence;\n if (matchRef.current(event)) {\n deliver(event);\n }\n }\n }, [sharedFeed, liveEnabled, events, workspaceId, sessionId, deliver, deliverBatch]);\n\n // Self-stream mode: tail from the session's current lastSequence.\n useEffect(() => {\n if (sharedFeed || !liveEnabled || !sessionId) {\n return;\n }\n const controller = new AbortController();\n void (async () => {\n try {\n const session = await client.getSession(workspaceId, sessionId);\n if (controller.signal.aborted) {\n return;\n }\n const stream = client.streamEvents(workspaceId, sessionId, {\n after: session.lastSequence,\n signal: controller.signal,\n onOpen: () => {\n // Start reconciliation without delaying consumption of live SSE.\n void Promise.resolve()\n .then(() => reconcileBeforeLiveRef.current?.())\n .catch(() => undefined);\n },\n });\n for await (const event of stream) {\n if (matchRef.current(event)) {\n onEventRef.current(event);\n }\n }\n } catch {\n // Live updates are best-effort: the read hooks still expose refresh()\n // and the initial load already populated state.\n }\n })();\n return () => {\n controller.abort();\n };\n }, [sharedFeed, liveEnabled, client, workspaceId, sessionId]);\n}\n\n/** Debounce rapid event bursts into one trailing call (default 150ms). */\nexport function useDebouncedCallback(callback: () => void, delayMs = 150): () => void {\n const callbackRef = useRef(callback);\n useLayoutEffect(() => {\n callbackRef.current = callback;\n }, [callback]);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n return useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n timerRef.current = null;\n callbackRef.current();\n }, delayMs);\n }, [delayMs]);\n}\n"],"mappings":"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","names":[]}