@opengeni/react 4.4.1 → 4.5.1-canary.39832248373001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (654) hide show
  1. package/dist/app/app-state.js +15 -15
  2. package/dist/app/components/Composer.js +19 -19
  3. package/dist/app/components/artifacts/artifact-browse-controls.js +3 -3
  4. package/dist/app/components/artifacts/artifact-library.js +9 -9
  5. package/dist/app/components/artifacts/artifact-page-chrome.js +2 -2
  6. package/dist/app/components/artifacts/chat-interactive-block.js +14 -14
  7. package/dist/app/components/artifacts/inline-chat-image.js +22 -21
  8. package/dist/app/components/artifacts/retained-file-preview.js +24 -23
  9. package/dist/app/components/artifacts/retained-text-preview.js +2 -2
  10. package/dist/app/components/artifacts/site-audience.js +2 -2
  11. package/dist/app/components/artifacts/site-conversations.js +14 -13
  12. package/dist/app/components/artifacts/site-data.js +4 -4
  13. package/dist/app/components/artifacts/site-publishing.js +20 -20
  14. package/dist/app/components/artifacts/site-settings.js +25 -25
  15. package/dist/app/components/billing-class-mark.js +3 -3
  16. package/dist/app/components/capabilities/capability-detail-sheet.js +6 -6
  17. package/dist/app/components/capabilities/capability-logo-source.js +8 -8
  18. package/dist/app/components/capabilities/connector-tool-permissions.js +3 -3
  19. package/dist/app/components/capabilities/native-connect-setup.js +8 -8
  20. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +10 -10
  21. package/dist/app/components/capabilities/session-capability-card.js +43 -41
  22. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  23. package/dist/app/components/capabilities/session-chrome-card.js +20 -18
  24. package/dist/app/components/capabilities/session-custom-mcp-card.js +11 -11
  25. package/dist/app/components/capabilities/session-github-card.js +13 -13
  26. package/dist/app/components/capabilities/session-machine-card.js +19 -17
  27. package/dist/app/components/command-menu/chat-status.js +16 -15
  28. package/dist/app/components/command-menu/chat-switcher.js +19 -18
  29. package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
  30. package/dist/app/components/command-menu/command-menu.js +29 -107
  31. package/dist/app/components/command-menu/command-menu.js.map +1 -1
  32. package/dist/app/components/command-menu/shortcut-sheet.js +9 -9
  33. package/dist/app/components/composer-mobile-plus-panel.js +9 -9
  34. package/dist/app/components/composer-mobile-plus.js +1 -1
  35. package/dist/app/components/credit-required-gate.js +1 -1
  36. package/dist/app/components/credit-required-prompt.js +5 -5
  37. package/dist/app/components/credits/coupon-redeem.js +2 -2
  38. package/dist/app/components/credits/credit-refusal-notice.js +2 -2
  39. package/dist/app/components/desktop/app-shots.js +7 -7
  40. package/dist/app/components/desktop/this-computer.js +4 -4
  41. package/dist/app/components/feedback.js +3 -3
  42. package/dist/app/components/follow-up-repository-menu-body.js +2 -2
  43. package/dist/app/components/follow-up-repository-picker.js +1 -1
  44. package/dist/app/components/github-app-connect-launcher.js +2 -2
  45. package/dist/app/components/in-app-help-link.js +2 -2
  46. package/dist/app/components/machines/connect-machine-dialog.js +3 -3
  47. package/dist/app/components/markdown.js +5 -5
  48. package/dist/app/components/models/models-ui.js +3 -3
  49. package/dist/app/components/new-session-starters.js +2 -2
  50. package/dist/app/components/pickers.js +6 -6
  51. package/dist/app/components/rail/rail-context.js +3 -3
  52. package/dist/app/components/rail/rail-sections.js +51 -48
  53. package/dist/app/components/rail/session-header.js +29 -28
  54. package/dist/app/components/rail/session-list.js +50 -47
  55. package/dist/app/components/rail/session-row-content.d.ts +6 -2
  56. package/dist/app/components/rail/session-row-content.js +1 -1
  57. package/dist/app/components/rail/session-row-hover-details.js +17 -16
  58. package/dist/app/components/rail/session-shell.js +78 -75
  59. package/dist/app/components/rail/site-session-group-heading.d.ts +7 -1
  60. package/dist/app/components/rail/site-session-group-heading.js +20 -3
  61. package/dist/app/components/repository-picker.js +2 -2
  62. package/dist/app/components/session/agent-configuration-panel.js +18 -18
  63. package/dist/app/components/session/artifact-link-boundary.js +2 -2
  64. package/dist/app/components/session/artifact-session-page.js +5 -5
  65. package/dist/app/components/session/banners.js +7 -7
  66. package/dist/app/components/session/codex-account-indicator.js +10 -10
  67. package/dist/app/components/session/editable-artifacts-workspace.js +24 -24
  68. package/dist/app/components/session/failed-session-banner.js +6 -6
  69. package/dist/app/components/session/human-input.js +41 -37
  70. package/dist/app/components/session/inspector.js +61 -57
  71. package/dist/app/components/session/inspector.js.map +1 -1
  72. package/dist/app/components/session/message-actions.js +3 -3
  73. package/dist/app/components/session/message-resource-attachments.js +12 -11
  74. package/dist/app/components/session/message-resource-attachments.js.map +1 -1
  75. package/dist/app/components/session/model-account-indicator.js +9 -9
  76. package/dist/app/components/session/model-recovery-notice.js +3 -3
  77. package/dist/app/components/session/new-session-settings-menu.js +8 -8
  78. package/dist/app/components/session/sandbox-switcher.js +12 -12
  79. package/dist/app/components/session/sandbox-workspace.js +58 -54
  80. package/dist/app/components/session/search-markdown-highlight.js +6 -6
  81. package/dist/app/components/session/search-results-view.js +7 -7
  82. package/dist/app/components/session/session-admin-access.js +3 -3
  83. package/dist/app/components/session/session-admission-notice.js +5 -5
  84. package/dist/app/components/session/session-machine-access-notice.js +5 -5
  85. package/dist/app/components/session/session-search-dialog.js +8 -8
  86. package/dist/app/components/session/session-tenancy-control.d.ts +2 -0
  87. package/dist/app/components/session/session-tenancy-control.js +26 -11
  88. package/dist/app/components/session/session-tenancy-control.js.map +1 -1
  89. package/dist/app/components/session/session-usage-limit-section.js +4 -4
  90. package/dist/app/components/session/session-wait-status.js +8 -7
  91. package/dist/app/components/session/session-wait-status.js.map +1 -1
  92. package/dist/app/components/session/site-origin-link.d.ts +1 -0
  93. package/dist/app/components/session/site-origin-link.js +2 -2
  94. package/dist/app/components/session/subagents.js +13 -12
  95. package/dist/app/components/settings/row-select.js +3 -3
  96. package/dist/app/components/transcription-settings.js +4 -4
  97. package/dist/app/components/usage/usage-entry.js +5 -5
  98. package/dist/app/components/workspace-composer-plus.js +12 -12
  99. package/dist/app/embed/memory-navigation.js +2 -2
  100. package/dist/app/embed/session-app.js +196 -190
  101. package/dist/app/lib/actions/actions-provider.js +9 -9
  102. package/dist/app/lib/actions/held-modifier.d.ts +11 -0
  103. package/dist/app/lib/app-surfaces.js +2 -2
  104. package/dist/app/lib/codex-usage-query.js +6 -6
  105. package/dist/app/lib/composer-connectors.js +9 -9
  106. package/dist/app/lib/console-site.d.ts +6 -0
  107. package/dist/app/lib/console-site.js +14 -0
  108. package/dist/app/lib/console-text.js +2 -2
  109. package/dist/app/lib/events.js +13 -12
  110. package/dist/app/lib/failed-session-copy.js +3 -3
  111. package/dist/app/lib/model-access-onboarding.js +3 -3
  112. package/dist/app/lib/move-chat-to-machine.js +3 -3
  113. package/dist/app/lib/navigation.d.ts +5 -0
  114. package/dist/app/lib/navigation.js +1 -1
  115. package/dist/app/lib/routes.d.ts +17 -0
  116. package/dist/app/lib/routes.js +9 -3
  117. package/dist/app/lib/session-branch-cache.js +12 -11
  118. package/dist/app/lib/session-create.js +2 -2
  119. package/dist/app/lib/session-deep-link.js +2 -2
  120. package/dist/app/lib/session-failure-toasts.d.ts +8 -0
  121. package/dist/app/lib/session-group-pagination.js +12 -11
  122. package/dist/app/lib/session-hover-facts.js +12 -11
  123. package/dist/app/lib/session-model.js +2 -2
  124. package/dist/app/lib/session-rail.js +8 -7
  125. package/dist/app/lib/session-rename.js +2 -2
  126. package/dist/app/lib/session-ui-features.d.ts +6 -1
  127. package/dist/app/lib/session-ui-features.js +1 -1
  128. package/dist/app/lib/sessions-group.d.ts +43 -3
  129. package/dist/app/lib/sessions-group.js +19 -12
  130. package/dist/app/lib/shared-query.js +3 -3
  131. package/dist/app/lib/site-opened.d.ts +6 -0
  132. package/dist/app/lib/site-opened.js +10 -0
  133. package/dist/app/lib/turn-failure-analytics.js +5 -5
  134. package/dist/app/lib/use-duplicate-site.js +2 -2
  135. package/dist/app/lib/use-follow-up-repositories.js +2 -2
  136. package/dist/app/lib/use-session-list-hint-refresh.d.ts +20 -2
  137. package/dist/app/lib/use-session-list-hint-refresh.js +5 -1
  138. package/dist/app/lib/use-workspace-machines.js +5 -5
  139. package/dist/app/lib/use-workspace-model-catalog.js +7 -7
  140. package/dist/app/lib/use-workspace-rigs.js +7 -7
  141. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  142. package/dist/app/lib/workspace-scope-context.js +3 -3
  143. package/dist/app/routes/artifacts.js +70 -87
  144. package/dist/app/routes/artifacts.js.map +1 -1
  145. package/dist/app/routes/retained-artifact.js +36 -35
  146. package/dist/app/routes/retained-artifact.js.map +1 -1
  147. package/dist/app/routes/session-unavailable.js +6 -4
  148. package/dist/app/routes/session.js +127 -123
  149. package/dist/app/routes/sessions-index-hydration.js +3 -3
  150. package/dist/app/routes/sessions-index.js +96 -94
  151. package/dist/app/routes/site-view.d.ts +11 -0
  152. package/dist/app/routes/site-view.js +597 -0
  153. package/dist/app/routes/site-view.js.map +1 -0
  154. package/dist/artifacts-document.js +4 -4
  155. package/dist/artifacts-presentation.js +4 -4
  156. package/dist/artifacts-spreadsheet.js +4 -4
  157. package/dist/artifacts.js +13 -13
  158. package/dist/{browser-viewer-RYYQSRTC.js → browser-viewer-VPK3CV2H.js} +7 -5
  159. package/dist/{chat-interactive-block-ABCRKXJ4.js → chat-interactive-block-AMDSW656.js} +5 -5
  160. package/dist/chunk-22GTC4MZ.js +15 -0
  161. package/dist/chunk-22GTC4MZ.js.map +1 -0
  162. package/dist/{chunk-RQDFYQHA.js → chunk-25LWDG5D.js} +6 -6
  163. package/dist/{chunk-U3HSFCON.js → chunk-2CKVVAGP.js} +15 -15
  164. package/dist/{chunk-F6LBGYS6.js → chunk-2DL6NJP5.js} +15 -15
  165. package/dist/{chunk-UHFWF6ZU.js → chunk-2FPS5H2D.js} +2 -2
  166. package/dist/{chunk-NAWXARTY.js → chunk-2KO2G3RI.js} +72 -6
  167. package/dist/chunk-2KO2G3RI.js.map +1 -0
  168. package/dist/{chunk-TWXIFWBD.js → chunk-34EU25RL.js} +2 -2
  169. package/dist/{chunk-PTGRFAMH.js → chunk-3ABPIUCK.js} +2 -2
  170. package/dist/{chunk-722UO6YQ.js → chunk-3PEXVG4D.js} +2 -2
  171. package/dist/{chunk-N3ZP4IDU.js → chunk-45WYYFP6.js} +2 -2
  172. package/dist/{chunk-HOJGAJAB.js → chunk-4MQLGMV2.js} +5 -5
  173. package/dist/{chunk-L7YURQI2.js → chunk-4U4GXWXS.js} +3 -3
  174. package/dist/{chunk-63VGE4OH.js → chunk-5HIOVXOX.js} +3 -3
  175. package/dist/{chunk-GFUUFM2O.js → chunk-5M23GZA2.js} +3 -3
  176. package/dist/{chunk-PM3OSANE.js → chunk-5MJHH72T.js} +14 -3
  177. package/dist/chunk-5MJHH72T.js.map +1 -0
  178. package/dist/{chunk-RKB2Z457.js → chunk-5VGJXWQ2.js} +2 -2
  179. package/dist/{chunk-6W3LF3DB.js → chunk-5YFY4SFC.js} +2 -12
  180. package/dist/chunk-5YFY4SFC.js.map +1 -0
  181. package/dist/{chunk-I6VUUEXH.js → chunk-6AFSZKZA.js} +3 -3
  182. package/dist/{chunk-FBMU3VK5.js → chunk-6DCEDIF6.js} +2 -2
  183. package/dist/{chunk-5MZTJMZ3.js → chunk-6MRY2RUZ.js} +13 -7
  184. package/dist/chunk-6MRY2RUZ.js.map +1 -0
  185. package/dist/{chunk-4EONHNJU.js → chunk-6O4VWKSO.js} +2 -2
  186. package/dist/chunk-756MKA2J.js +45 -0
  187. package/dist/chunk-756MKA2J.js.map +1 -0
  188. package/dist/{chunk-BSX2R4CW.js → chunk-767WCGAX.js} +6 -6
  189. package/dist/{chunk-7KGKDWWR.js → chunk-7HFLYNWN.js} +2 -2
  190. package/dist/{chunk-OSVHU2WU.js → chunk-7IYAHFPE.js} +2 -2
  191. package/dist/{chunk-4EAF3HSD.js → chunk-7J7PZB4S.js} +2 -2
  192. package/dist/{chunk-ADJJQSYC.js → chunk-7PUFAH4I.js} +34 -32
  193. package/dist/chunk-7PUFAH4I.js.map +1 -0
  194. package/dist/{chunk-OR37STQZ.js → chunk-7R2JQHBX.js} +3 -3
  195. package/dist/{chunk-QM5H4FPT.js → chunk-7VN6VC3D.js} +3 -3
  196. package/dist/{chunk-HWDGJFM4.js → chunk-A2E3ZF6N.js} +4 -4
  197. package/dist/{chunk-RGW24ZZM.js → chunk-A6CK4ENG.js} +19 -17
  198. package/dist/chunk-A6CK4ENG.js.map +1 -0
  199. package/dist/{chunk-4432A3HQ.js → chunk-A6T4FGE7.js} +4 -4
  200. package/dist/{chunk-73SOCVLS.js → chunk-AIEXYO2X.js} +3 -3
  201. package/dist/{chunk-U7TC2XJQ.js → chunk-AJPW3SV4.js} +3 -3
  202. package/dist/{chunk-46VBQG2D.js → chunk-AOUCHCSB.js} +5 -5
  203. package/dist/{chunk-HDHK3SXK.js → chunk-AT4K4F6S.js} +2 -2
  204. package/dist/{chunk-TQGJN5UZ.js → chunk-AW3QEFOF.js} +140 -522
  205. package/dist/chunk-AW3QEFOF.js.map +1 -0
  206. package/dist/{chunk-HRJQAFKR.js → chunk-AX6YJA5U.js} +2 -2
  207. package/dist/{chunk-HO5Y2OOX.js → chunk-BLPXOHG6.js} +6 -6
  208. package/dist/{chunk-DT7BORXG.js → chunk-BMJTNPWK.js} +2 -2
  209. package/dist/{chunk-HIHO2QE7.js → chunk-BT2MVGHT.js} +2 -2
  210. package/dist/{chunk-AOLE4IRZ.js → chunk-C535KSTY.js} +2 -2
  211. package/dist/{chunk-IVOA3DXA.js → chunk-CB574ERL.js} +4 -4
  212. package/dist/{chunk-IBTXYLBW.js → chunk-CCFWY4GF.js} +2 -2
  213. package/dist/{chunk-ZOC3OP6F.js → chunk-CCR33J7L.js} +2 -2
  214. package/dist/{chunk-NYZQ7LO7.js → chunk-CDUDKETD.js} +2 -2
  215. package/dist/{chunk-JTN3T4QN.js → chunk-D3RK3NGM.js} +4 -4
  216. package/dist/{chunk-IOKSNX74.js → chunk-D5OWJZQR.js} +2 -2
  217. package/dist/{chunk-BJIZ7PL7.js → chunk-D64Z4V26.js} +145 -29
  218. package/dist/chunk-D64Z4V26.js.map +1 -0
  219. package/dist/{chunk-XWWXIZFP.js → chunk-DFXZYNTX.js} +7 -7
  220. package/dist/{chunk-SQGXMHJO.js → chunk-DGLRZMXL.js} +3 -3
  221. package/dist/{chunk-GNEHAPKV.js → chunk-DJFTH2DI.js} +3 -3
  222. package/dist/{chunk-KWKGBGAF.js → chunk-DKCX643S.js} +11 -11
  223. package/dist/{chunk-HQG4SLTE.js → chunk-DYJGYGPB.js} +2 -2
  224. package/dist/{chunk-GTQ3SNEI.js → chunk-E36IC3LU.js} +2 -2
  225. package/dist/{chunk-CVG4FILQ.js → chunk-ECHYJP63.js} +253 -1008
  226. package/dist/chunk-ECHYJP63.js.map +1 -0
  227. package/dist/{chunk-Q35DT6I6.js → chunk-EH7TTYE6.js} +179 -170
  228. package/dist/chunk-EH7TTYE6.js.map +1 -0
  229. package/dist/{chunk-72J6C2AJ.js → chunk-EMCB6XKU.js} +2 -2
  230. package/dist/{chunk-3AA6RNGE.js → chunk-ENS6E4RZ.js} +2 -2
  231. package/dist/{chunk-AG7VGUIW.js → chunk-ERG355NM.js} +3 -3
  232. package/dist/{chunk-TSBE4KOQ.js → chunk-EWL6NDOO.js} +3 -3
  233. package/dist/{chunk-Z5WMLJKI.js → chunk-F2RMKGDQ.js} +89 -1
  234. package/dist/chunk-F2RMKGDQ.js.map +1 -0
  235. package/dist/{chunk-X7L4H4VG.js → chunk-F33EDYS7.js} +524 -426
  236. package/dist/chunk-F33EDYS7.js.map +1 -0
  237. package/dist/{chunk-HTT3FB7T.js → chunk-F3FN6DO6.js} +2 -2
  238. package/dist/{chunk-ST22GONV.js → chunk-FB3B45FP.js} +11 -11
  239. package/dist/{chunk-P5T36BA3.js → chunk-FRP64DEK.js} +2 -2
  240. package/dist/{chunk-KBF3SE7G.js → chunk-FSP334UU.js} +2 -2
  241. package/dist/{chunk-4VKA5O7T.js → chunk-FVL4B552.js} +9 -9
  242. package/dist/{chunk-VP62LPLW.js → chunk-G2BX56CN.js} +5 -5
  243. package/dist/{chunk-CSHBR2IZ.js → chunk-GDLDBR6B.js} +2 -2
  244. package/dist/{chunk-PN66T6JA.js → chunk-GFSOXB2K.js} +2 -2
  245. package/dist/{chunk-S4EZ3JUB.js → chunk-GZGQHQI7.js} +29 -29
  246. package/dist/chunk-H4IE2PYF.js +792 -0
  247. package/dist/chunk-H4IE2PYF.js.map +1 -0
  248. package/dist/{chunk-XFNLU7EW.js → chunk-H5M33DAL.js} +15 -6
  249. package/dist/chunk-H5M33DAL.js.map +1 -0
  250. package/dist/{chunk-BXRIQZAH.js → chunk-HNNM2GDN.js} +3 -3
  251. package/dist/{chunk-EU6XSQFM.js → chunk-HPB4KSV3.js} +2 -2
  252. package/dist/{chunk-QCD5Y7K5.js → chunk-HSQRYJ4P.js} +5 -5
  253. package/dist/{chunk-YXOKAG66.js → chunk-HUXDGWAN.js} +2 -2
  254. package/dist/{chunk-VUHPA3XQ.js → chunk-I66ZB6KD.js} +3 -3
  255. package/dist/{chunk-7CZTKBTI.js → chunk-IC7KNOBB.js} +5 -5
  256. package/dist/{chunk-KF3MF6FP.js → chunk-IECRGM6K.js} +3 -2
  257. package/dist/chunk-IECRGM6K.js.map +1 -0
  258. package/dist/{chunk-HGMWMK5K.js → chunk-IIO2MR3B.js} +2 -2
  259. package/dist/chunk-IJYL5BZM.js +38 -0
  260. package/dist/chunk-IJYL5BZM.js.map +1 -0
  261. package/dist/{chunk-L6RXRRN3.js → chunk-ILDOW2IQ.js} +3 -3
  262. package/dist/{chunk-O756O2I7.js → chunk-IPPVX5GF.js} +1 -1
  263. package/dist/{chunk-X7ASQHR6.js → chunk-IUK5QGP5.js} +2 -2
  264. package/dist/{chunk-5JZYPZ72.js → chunk-JFK7NTEA.js} +4 -4
  265. package/dist/chunk-JFK7NTEA.js.map +1 -0
  266. package/dist/{chunk-PIVGX42P.js → chunk-JNY5MT3I.js} +2 -2
  267. package/dist/chunk-JRSNCSZN.js +37 -0
  268. package/dist/chunk-JRSNCSZN.js.map +1 -0
  269. package/dist/{chunk-DDK4WFJ3.js → chunk-JWN7SLTO.js} +9 -9
  270. package/dist/{chunk-Q35YZVDZ.js → chunk-KFWVBTUH.js} +3 -3
  271. package/dist/{chunk-JXT5QDJC.js → chunk-KNFDWNCH.js} +5 -5
  272. package/dist/{chunk-AZVANYMB.js → chunk-KUNFUSZ7.js} +2 -2
  273. package/dist/{chunk-DXZNDKQD.js → chunk-LEEJBZ5B.js} +2 -2
  274. package/dist/{chunk-STUCI6QA.js → chunk-LEKBNKLD.js} +1 -1
  275. package/dist/{chunk-STUCI6QA.js.map → chunk-LEKBNKLD.js.map} +1 -1
  276. package/dist/{chunk-RSNYGEVZ.js → chunk-LKJ2C7PH.js} +8 -8
  277. package/dist/{chunk-RIMKJBCD.js → chunk-LMPTC4CX.js} +2 -2
  278. package/dist/{chunk-3KVWXKD6.js → chunk-LQ47YL6E.js} +2 -2
  279. package/dist/{chunk-GAIM5RNE.js → chunk-MJQBC7C5.js} +3 -3
  280. package/dist/{chunk-NWZW2WHN.js → chunk-MM7OKOTE.js} +6 -6
  281. package/dist/{chunk-FM4OUCC2.js → chunk-MOKYT3X3.js} +3 -3
  282. package/dist/{chunk-GZ64CASI.js → chunk-MVZYNZXE.js} +5 -4
  283. package/dist/chunk-MVZYNZXE.js.map +1 -0
  284. package/dist/{chunk-XRRSFQEV.js → chunk-NAZZLAWX.js} +2 -2
  285. package/dist/{chunk-XOFUXMPP.js → chunk-ND2WCWXI.js} +4 -4
  286. package/dist/{chunk-6L7U46Y2.js → chunk-NKNVIO66.js} +2 -2
  287. package/dist/{chunk-JKUICTLM.js → chunk-NLAFNMPK.js} +2 -2
  288. package/dist/{chunk-OO2T63BY.js → chunk-NML44AW2.js} +2 -2
  289. package/dist/chunk-NQQKOJDI.js +89 -0
  290. package/dist/chunk-NQQKOJDI.js.map +1 -0
  291. package/dist/{chunk-4LKNIGHB.js → chunk-O2SBHS2N.js} +2 -2
  292. package/dist/{chunk-RA3FNMWF.js → chunk-O4DYOSOL.js} +5 -5
  293. package/dist/{chunk-ZKYYZH6L.js → chunk-OFB6TUDC.js} +4 -4
  294. package/dist/{chunk-DWPOQ3S5.js → chunk-OTMWHZBY.js} +2 -2
  295. package/dist/{chunk-VVCDB2T7.js → chunk-PCJLH45G.js} +3 -3
  296. package/dist/{chunk-WSMYOLHG.js → chunk-PEKPWK5M.js} +2 -2
  297. package/dist/{chunk-PZ24CYDO.js → chunk-PFAUGEV5.js} +2 -2
  298. package/dist/{chunk-KTRKZRID.js → chunk-PKEKZ2VA.js} +5 -5
  299. package/dist/{chunk-6JKZILLF.js → chunk-PMD7V4N7.js} +3 -3
  300. package/dist/{chunk-B74GSYR6.js → chunk-PUTS4DYW.js} +2 -2
  301. package/dist/{chunk-ZRJCGBVV.js → chunk-PVR5EELP.js} +2 -2
  302. package/dist/{chunk-JSIDLTTG.js → chunk-PZ2V2XIK.js} +2 -2
  303. package/dist/{chunk-TMEQPODK.js → chunk-PZ37VDB5.js} +2 -2
  304. package/dist/{chunk-FLGUVRR7.js → chunk-QBADR2FO.js} +6 -6
  305. package/dist/{chunk-TGVVEGZG.js → chunk-QLIDZGPV.js} +6 -6
  306. package/dist/{chunk-LVONK3YQ.js → chunk-QRKTESVE.js} +2 -2
  307. package/dist/{chunk-HT5WSUC7.js → chunk-QXEDIDBZ.js} +3 -3
  308. package/dist/{chunk-WURSS6MP.js → chunk-R66YMYJU.js} +2 -2
  309. package/dist/{chunk-6PQNLL4E.js → chunk-R7XCJWCD.js} +11 -11
  310. package/dist/{chunk-4R3JCVID.js → chunk-RAMZTZOB.js} +360 -103
  311. package/dist/chunk-RAMZTZOB.js.map +1 -0
  312. package/dist/{chunk-QRVNI5V6.js → chunk-SCNEQFIW.js} +3 -3
  313. package/dist/{chunk-BNUPYHHZ.js → chunk-SD4PPZFB.js} +4 -4
  314. package/dist/{chunk-ROQOVH4N.js → chunk-SFAU5R5S.js} +3 -3
  315. package/dist/{chunk-R63QEVPK.js → chunk-SJORXXLV.js} +6 -6
  316. package/dist/{chunk-FBE6AIIW.js → chunk-SOKNCW5U.js} +2 -2
  317. package/dist/{chunk-JRXHSVD5.js → chunk-SOXZ4LGS.js} +68 -11
  318. package/dist/chunk-SOXZ4LGS.js.map +1 -0
  319. package/dist/{chunk-EF5SYXAY.js → chunk-SQDPHCK2.js} +22 -14
  320. package/dist/chunk-SQDPHCK2.js.map +1 -0
  321. package/dist/{chunk-NDF3SH3X.js → chunk-TDIOBPLA.js} +5 -5
  322. package/dist/{chunk-EHCUFCXM.js → chunk-TEPPPAJI.js} +17 -7
  323. package/dist/chunk-TEPPPAJI.js.map +1 -0
  324. package/dist/{chunk-33TPANCR.js → chunk-TFK4KFKA.js} +4 -4
  325. package/dist/{chunk-6NIB2KGJ.js → chunk-THVIT3PW.js} +22 -22
  326. package/dist/{chunk-HPPKLBTJ.js → chunk-TJQDL3JH.js} +2 -2
  327. package/dist/{chunk-FD4Q5KFL.js → chunk-TLL22FFO.js} +2 -2
  328. package/dist/{chunk-7DU35P5J.js → chunk-TN5T5HRZ.js} +7 -7
  329. package/dist/{chunk-JK7C5A4I.js → chunk-TR4HIKJ2.js} +8 -8
  330. package/dist/{chunk-HNYJEAES.js → chunk-UGEWCWVV.js} +3 -3
  331. package/dist/chunk-ULYQEFNH.js +529 -0
  332. package/dist/chunk-ULYQEFNH.js.map +1 -0
  333. package/dist/{chunk-H5EVWF6L.js → chunk-UNNJUJVD.js} +2 -2
  334. package/dist/{chunk-AD22P5X3.js → chunk-UUSAOIJR.js} +3 -3
  335. package/dist/{chunk-Z6DKXQG7.js → chunk-UXXFMF4X.js} +2 -2
  336. package/dist/{chunk-RGPYMHKI.js → chunk-V3K4RQO7.js} +9 -3
  337. package/dist/chunk-V3K4RQO7.js.map +1 -0
  338. package/dist/{chunk-UP4BE32Y.js → chunk-VO6RVVP7.js} +5 -5
  339. package/dist/{chunk-S4SC5SSV.js → chunk-VPNXQUUS.js} +11 -11
  340. package/dist/{chunk-7BST7BA6.js → chunk-VW3BBTMA.js} +1 -1
  341. package/dist/{chunk-CBY5CXBD.js → chunk-VWSFA4LJ.js} +2 -2
  342. package/dist/{chunk-MYNUBDU7.js → chunk-VYKW6TB2.js} +1 -1
  343. package/dist/chunk-VYKW6TB2.js.map +1 -0
  344. package/dist/{chunk-QEJTQTF5.js → chunk-W6T5HR3Z.js} +3 -3
  345. package/dist/{chunk-5JEIDFPD.js → chunk-WBPQ7OPC.js} +1 -1
  346. package/dist/{chunk-GZLLDA6P.js → chunk-WEFN327U.js} +2 -2
  347. package/dist/{chunk-ANHUMDJX.js → chunk-WNDTLK44.js} +2 -2
  348. package/dist/{chunk-DLOYMWUQ.js → chunk-WSLPZ43N.js} +7 -7
  349. package/dist/{chunk-2DS4UOYQ.js → chunk-WSZQNTVN.js} +2 -2
  350. package/dist/{chunk-LE2EDBXU.js → chunk-WUHB422G.js} +5 -5
  351. package/dist/{chunk-BJW7G6EF.js → chunk-WVX5AQXS.js} +3 -3
  352. package/dist/{chunk-5POTDNQT.js → chunk-WWOHORRO.js} +3 -3
  353. package/dist/{chunk-4W7VISE7.js → chunk-WYDZP5F2.js} +93 -94
  354. package/dist/chunk-WYDZP5F2.js.map +1 -0
  355. package/dist/{chunk-KZHW27BV.js → chunk-WYEPUXGL.js} +2 -2
  356. package/dist/{chunk-GALB2G3W.js → chunk-X2AH4DRF.js} +2 -2
  357. package/dist/{chunk-NCX5SAQY.js → chunk-XN6CALYY.js} +9 -9
  358. package/dist/{chunk-SUVEDKE2.js → chunk-XNACICAB.js} +3 -3
  359. package/dist/{chunk-FDNJVZRE.js → chunk-XU4I47IP.js} +4 -4
  360. package/dist/chunk-XV6ZYRHK.js +59 -0
  361. package/dist/chunk-XV6ZYRHK.js.map +1 -0
  362. package/dist/{chunk-WRLWLGEF.js → chunk-Y5E3XQ2S.js} +25 -2
  363. package/dist/{chunk-WRLWLGEF.js.map → chunk-Y5E3XQ2S.js.map} +1 -1
  364. package/dist/{chunk-U36PO27Q.js → chunk-YG3IJCM2.js} +3 -3
  365. package/dist/{chunk-UWJ5P5CU.js → chunk-YGSJWWT3.js} +3 -3
  366. package/dist/{chunk-APU42QDI.js → chunk-YO64YVYL.js} +105 -101
  367. package/dist/chunk-YO64YVYL.js.map +1 -0
  368. package/dist/{chunk-P5WABK2H.js → chunk-Z4GJB24B.js} +2 -2
  369. package/dist/{chunk-NLMTNEWW.js → chunk-Z6E6TUAE.js} +2 -2
  370. package/dist/{chunk-OBQVTCTW.js → chunk-ZX5H7LWD.js} +2 -2
  371. package/dist/components/browser-viewer.d.ts +1 -1
  372. package/dist/composer.js +8 -8
  373. package/dist/{computer-viewer-KEDVLD42.js → computer-viewer-VA5JONUH.js} +6 -6
  374. package/dist/connect.js +7 -7
  375. package/dist/desktop.js +2 -2
  376. package/dist/editor.js +2 -2
  377. package/dist/{embedded-new-voice-LFHWWYD2.js → embedded-new-voice-6BILAOUG.js} +6 -6
  378. package/dist/{embedded-voice-6QS4ANNX.js → embedded-voice-UDE4JRKB.js} +6 -6
  379. package/dist/{fleet-decision-row-QNSTP3VX.js → fleet-decision-row-NN2HXDX3.js} +2 -2
  380. package/dist/hooks/internal.d.ts +38 -0
  381. package/dist/hooks/use-client-config-flags.d.ts +12 -0
  382. package/dist/hooks/use-workspace-sessions.d.ts +10 -1
  383. package/dist/index.js +86 -80
  384. package/dist/interaction.js +8 -6
  385. package/dist/interaction.js.map +1 -1
  386. package/dist/{latest-question-AW3PPDUM.js → latest-question-4WDBECXB.js} +4 -3
  387. package/dist/{latest-question-AW3PPDUM.js.map → latest-question-4WDBECXB.js.map} +1 -1
  388. package/dist/machines.js +4 -4
  389. package/dist/messages/en.d.ts +3 -3
  390. package/dist/messages.js +1 -1
  391. package/dist/{model-policy-picker-menu-CURJ247L.js → model-policy-picker-menu-NRTO6FRP.js} +4 -4
  392. package/dist/{platform-activity-row-BMXXNZKX.js → platform-activity-row-ENQVIFTL.js} +2 -2
  393. package/dist/{queue-surface-implementation-2X5AXB6I.js → queue-surface-implementation-H4XSNHZE.js} +8 -6
  394. package/dist/{queue-surface-implementation-2X5AXB6I.js.map → queue-surface-implementation-H4XSNHZE.js.map} +1 -1
  395. package/dist/realtime.js +5 -5
  396. package/dist/{sandbox-files-4FBG3GS2.js → sandbox-files-IEHODU35.js} +9 -9
  397. package/dist/sandbox-files-IEHODU35.js.map +1 -0
  398. package/dist/session-app.js +198 -192
  399. package/dist/session-list-model.d.ts +1 -0
  400. package/dist/session-list-model.js +7 -1
  401. package/dist/{session-realtime-2XIB254N.js → session-realtime-JNKDSGH7.js} +3 -3
  402. package/dist/session-realtime-JNKDSGH7.js.map +1 -0
  403. package/dist/session-realtime.js +2 -2
  404. package/dist/session-ui.js +48 -43
  405. package/dist/session.js +20 -18
  406. package/dist/sites.js +2 -2
  407. package/dist/terminal.js +2 -2
  408. package/dist/this-computer.js +3 -3
  409. package/dist/timeline/invoked-tool.d.ts +5 -0
  410. package/dist/timeline/tool-display-name.d.ts +2 -2
  411. package/dist/timeline/tool-icon.d.ts +14 -0
  412. package/dist/timeline/tool-presentation.d.ts +8 -3
  413. package/dist/{timeline-annotation-markers-X4K2IEOO.js → timeline-annotation-markers-ZSOFW7PG.js} +2 -2
  414. package/dist/{timeline-annotation-selection-MEHBW676.js → timeline-annotation-selection-YWV2UC34.js} +2 -2
  415. package/dist/{timeline-annotations-dialog-U2FPQ3UY.js → timeline-annotations-dialog-ZWQVX2HI.js} +3 -3
  416. package/dist/timeline-model.js +16 -14
  417. package/dist/ui/access-list.js +7 -7
  418. package/dist/ui/cadence-picker.js +2 -2
  419. package/dist/ui/list-row.js +3 -3
  420. package/dist/ui/revision-history.js +2 -2
  421. package/dist/ui/role-select.js +3 -3
  422. package/dist/ui/select-menu.js +2 -2
  423. package/dist/usage.js +3 -3
  424. package/dist/workbench.js +4 -4
  425. package/package.json +4 -4
  426. package/src/app/app-state.tsx +3 -1
  427. package/src/app/components/capabilities/session-machine-card.tsx +9 -2
  428. package/src/app/components/rail/session-list.tsx +254 -44
  429. package/src/app/components/rail/session-row-content.tsx +24 -2
  430. package/src/app/components/rail/session-shell.tsx +14 -9
  431. package/src/app/components/rail/site-session-group-heading.tsx +59 -20
  432. package/src/app/components/session/session-tenancy-control.tsx +18 -0
  433. package/src/app/components/session/site-origin-link.test.tsx +73 -0
  434. package/src/app/components/session/site-origin-link.tsx +4 -2
  435. package/src/app/embed/memory-navigation.tsx +1 -0
  436. package/src/app/lib/actions/held-modifier.test.ts +101 -0
  437. package/src/app/lib/actions/held-modifier.ts +108 -0
  438. package/src/app/lib/console-site.tsx +38 -0
  439. package/src/app/lib/navigation.tsx +4 -0
  440. package/src/app/lib/routes.tsx +42 -0
  441. package/src/app/lib/session-failure-toasts.ts +26 -0
  442. package/src/app/lib/session-ui-features.tsx +18 -4
  443. package/src/app/lib/sessions-group.tsx +219 -30
  444. package/src/app/lib/site-opened.tsx +48 -0
  445. package/src/app/lib/site-session-groups.test.ts +173 -6
  446. package/src/app/lib/site-view-routes.test.ts +55 -0
  447. package/src/app/lib/use-session-list-hint-refresh.tsx +44 -4
  448. package/src/app/routes/artifacts.tsx +2 -29
  449. package/src/app/routes/session-transient-failures.test.tsx +343 -0
  450. package/src/app/routes/session-unavailable.tsx +74 -3
  451. package/src/app/routes/session.tsx +4 -13
  452. package/src/app/routes/sessions-index.tsx +13 -9
  453. package/src/app/routes/site-view.test.tsx +476 -0
  454. package/src/app/routes/site-view.tsx +583 -0
  455. package/src/components/browser-viewer.tsx +16 -2
  456. package/src/hooks/internal.ts +129 -6
  457. package/src/hooks/use-client-config-flags.ts +8 -0
  458. package/src/hooks/use-session-events.ts +83 -9
  459. package/src/hooks/use-workspace-sessions.ts +21 -1
  460. package/src/messages/en.ts +3 -3
  461. package/src/session-list-model.ts +4 -0
  462. package/src/timeline/activity-rail.tsx +3 -2
  463. package/src/timeline/invoked-tool.ts +14 -4
  464. package/src/timeline/projection.ts +11 -6
  465. package/src/timeline/rolling-activity.tsx +6 -2
  466. package/src/timeline/tool-display-name.ts +2 -2
  467. package/src/timeline/tool-icon.tsx +165 -0
  468. package/src/timeline/tool-presentation.ts +207 -48
  469. package/src/timeline/tool-renderers.tsx +1 -70
  470. package/styles/compiled.css +38 -0
  471. package/dist/chunk-22ZBT6CN.js +0 -50
  472. package/dist/chunk-22ZBT6CN.js.map +0 -1
  473. package/dist/chunk-4R3JCVID.js.map +0 -1
  474. package/dist/chunk-4W7VISE7.js.map +0 -1
  475. package/dist/chunk-5JZYPZ72.js.map +0 -1
  476. package/dist/chunk-5MZTJMZ3.js.map +0 -1
  477. package/dist/chunk-6W3LF3DB.js.map +0 -1
  478. package/dist/chunk-ADJJQSYC.js.map +0 -1
  479. package/dist/chunk-APU42QDI.js.map +0 -1
  480. package/dist/chunk-BJIZ7PL7.js.map +0 -1
  481. package/dist/chunk-CVG4FILQ.js.map +0 -1
  482. package/dist/chunk-EF5SYXAY.js.map +0 -1
  483. package/dist/chunk-EHCUFCXM.js.map +0 -1
  484. package/dist/chunk-GZ64CASI.js.map +0 -1
  485. package/dist/chunk-JRXHSVD5.js.map +0 -1
  486. package/dist/chunk-KF3MF6FP.js.map +0 -1
  487. package/dist/chunk-MYNUBDU7.js.map +0 -1
  488. package/dist/chunk-NAWXARTY.js.map +0 -1
  489. package/dist/chunk-PM3OSANE.js.map +0 -1
  490. package/dist/chunk-Q35DT6I6.js.map +0 -1
  491. package/dist/chunk-R25ZKOZR.js +0 -24
  492. package/dist/chunk-R25ZKOZR.js.map +0 -1
  493. package/dist/chunk-RGPYMHKI.js.map +0 -1
  494. package/dist/chunk-RGW24ZZM.js.map +0 -1
  495. package/dist/chunk-TQGJN5UZ.js.map +0 -1
  496. package/dist/chunk-X7L4H4VG.js.map +0 -1
  497. package/dist/chunk-XFNLU7EW.js.map +0 -1
  498. package/dist/chunk-Z5WMLJKI.js.map +0 -1
  499. /package/dist/{browser-viewer-RYYQSRTC.js.map → app/lib/console-site.js.map} +0 -0
  500. /package/dist/{chat-interactive-block-ABCRKXJ4.js.map → app/lib/site-opened.js.map} +0 -0
  501. /package/dist/{computer-viewer-KEDVLD42.js.map → browser-viewer-VPK3CV2H.js.map} +0 -0
  502. /package/dist/{embedded-new-voice-LFHWWYD2.js.map → chat-interactive-block-AMDSW656.js.map} +0 -0
  503. /package/dist/{chunk-RQDFYQHA.js.map → chunk-25LWDG5D.js.map} +0 -0
  504. /package/dist/{chunk-U3HSFCON.js.map → chunk-2CKVVAGP.js.map} +0 -0
  505. /package/dist/{chunk-F6LBGYS6.js.map → chunk-2DL6NJP5.js.map} +0 -0
  506. /package/dist/{chunk-UHFWF6ZU.js.map → chunk-2FPS5H2D.js.map} +0 -0
  507. /package/dist/{chunk-TWXIFWBD.js.map → chunk-34EU25RL.js.map} +0 -0
  508. /package/dist/{chunk-PTGRFAMH.js.map → chunk-3ABPIUCK.js.map} +0 -0
  509. /package/dist/{chunk-722UO6YQ.js.map → chunk-3PEXVG4D.js.map} +0 -0
  510. /package/dist/{chunk-N3ZP4IDU.js.map → chunk-45WYYFP6.js.map} +0 -0
  511. /package/dist/{chunk-HOJGAJAB.js.map → chunk-4MQLGMV2.js.map} +0 -0
  512. /package/dist/{chunk-L7YURQI2.js.map → chunk-4U4GXWXS.js.map} +0 -0
  513. /package/dist/{chunk-63VGE4OH.js.map → chunk-5HIOVXOX.js.map} +0 -0
  514. /package/dist/{chunk-GFUUFM2O.js.map → chunk-5M23GZA2.js.map} +0 -0
  515. /package/dist/{chunk-RKB2Z457.js.map → chunk-5VGJXWQ2.js.map} +0 -0
  516. /package/dist/{chunk-I6VUUEXH.js.map → chunk-6AFSZKZA.js.map} +0 -0
  517. /package/dist/{chunk-FBMU3VK5.js.map → chunk-6DCEDIF6.js.map} +0 -0
  518. /package/dist/{chunk-4EONHNJU.js.map → chunk-6O4VWKSO.js.map} +0 -0
  519. /package/dist/{chunk-BSX2R4CW.js.map → chunk-767WCGAX.js.map} +0 -0
  520. /package/dist/{chunk-7KGKDWWR.js.map → chunk-7HFLYNWN.js.map} +0 -0
  521. /package/dist/{chunk-OSVHU2WU.js.map → chunk-7IYAHFPE.js.map} +0 -0
  522. /package/dist/{chunk-4EAF3HSD.js.map → chunk-7J7PZB4S.js.map} +0 -0
  523. /package/dist/{chunk-OR37STQZ.js.map → chunk-7R2JQHBX.js.map} +0 -0
  524. /package/dist/{chunk-QM5H4FPT.js.map → chunk-7VN6VC3D.js.map} +0 -0
  525. /package/dist/{chunk-HWDGJFM4.js.map → chunk-A2E3ZF6N.js.map} +0 -0
  526. /package/dist/{chunk-4432A3HQ.js.map → chunk-A6T4FGE7.js.map} +0 -0
  527. /package/dist/{chunk-73SOCVLS.js.map → chunk-AIEXYO2X.js.map} +0 -0
  528. /package/dist/{chunk-U7TC2XJQ.js.map → chunk-AJPW3SV4.js.map} +0 -0
  529. /package/dist/{chunk-46VBQG2D.js.map → chunk-AOUCHCSB.js.map} +0 -0
  530. /package/dist/{chunk-HDHK3SXK.js.map → chunk-AT4K4F6S.js.map} +0 -0
  531. /package/dist/{chunk-HRJQAFKR.js.map → chunk-AX6YJA5U.js.map} +0 -0
  532. /package/dist/{chunk-HO5Y2OOX.js.map → chunk-BLPXOHG6.js.map} +0 -0
  533. /package/dist/{chunk-DT7BORXG.js.map → chunk-BMJTNPWK.js.map} +0 -0
  534. /package/dist/{chunk-HIHO2QE7.js.map → chunk-BT2MVGHT.js.map} +0 -0
  535. /package/dist/{chunk-AOLE4IRZ.js.map → chunk-C535KSTY.js.map} +0 -0
  536. /package/dist/{chunk-IVOA3DXA.js.map → chunk-CB574ERL.js.map} +0 -0
  537. /package/dist/{chunk-IBTXYLBW.js.map → chunk-CCFWY4GF.js.map} +0 -0
  538. /package/dist/{chunk-ZOC3OP6F.js.map → chunk-CCR33J7L.js.map} +0 -0
  539. /package/dist/{chunk-NYZQ7LO7.js.map → chunk-CDUDKETD.js.map} +0 -0
  540. /package/dist/{chunk-JTN3T4QN.js.map → chunk-D3RK3NGM.js.map} +0 -0
  541. /package/dist/{chunk-IOKSNX74.js.map → chunk-D5OWJZQR.js.map} +0 -0
  542. /package/dist/{chunk-XWWXIZFP.js.map → chunk-DFXZYNTX.js.map} +0 -0
  543. /package/dist/{chunk-SQGXMHJO.js.map → chunk-DGLRZMXL.js.map} +0 -0
  544. /package/dist/{chunk-GNEHAPKV.js.map → chunk-DJFTH2DI.js.map} +0 -0
  545. /package/dist/{chunk-KWKGBGAF.js.map → chunk-DKCX643S.js.map} +0 -0
  546. /package/dist/{chunk-HQG4SLTE.js.map → chunk-DYJGYGPB.js.map} +0 -0
  547. /package/dist/{chunk-GTQ3SNEI.js.map → chunk-E36IC3LU.js.map} +0 -0
  548. /package/dist/{chunk-72J6C2AJ.js.map → chunk-EMCB6XKU.js.map} +0 -0
  549. /package/dist/{chunk-3AA6RNGE.js.map → chunk-ENS6E4RZ.js.map} +0 -0
  550. /package/dist/{chunk-AG7VGUIW.js.map → chunk-ERG355NM.js.map} +0 -0
  551. /package/dist/{chunk-TSBE4KOQ.js.map → chunk-EWL6NDOO.js.map} +0 -0
  552. /package/dist/{chunk-HTT3FB7T.js.map → chunk-F3FN6DO6.js.map} +0 -0
  553. /package/dist/{chunk-ST22GONV.js.map → chunk-FB3B45FP.js.map} +0 -0
  554. /package/dist/{chunk-P5T36BA3.js.map → chunk-FRP64DEK.js.map} +0 -0
  555. /package/dist/{chunk-KBF3SE7G.js.map → chunk-FSP334UU.js.map} +0 -0
  556. /package/dist/{chunk-4VKA5O7T.js.map → chunk-FVL4B552.js.map} +0 -0
  557. /package/dist/{chunk-VP62LPLW.js.map → chunk-G2BX56CN.js.map} +0 -0
  558. /package/dist/{chunk-CSHBR2IZ.js.map → chunk-GDLDBR6B.js.map} +0 -0
  559. /package/dist/{chunk-PN66T6JA.js.map → chunk-GFSOXB2K.js.map} +0 -0
  560. /package/dist/{chunk-S4EZ3JUB.js.map → chunk-GZGQHQI7.js.map} +0 -0
  561. /package/dist/{chunk-BXRIQZAH.js.map → chunk-HNNM2GDN.js.map} +0 -0
  562. /package/dist/{chunk-EU6XSQFM.js.map → chunk-HPB4KSV3.js.map} +0 -0
  563. /package/dist/{chunk-QCD5Y7K5.js.map → chunk-HSQRYJ4P.js.map} +0 -0
  564. /package/dist/{chunk-YXOKAG66.js.map → chunk-HUXDGWAN.js.map} +0 -0
  565. /package/dist/{chunk-VUHPA3XQ.js.map → chunk-I66ZB6KD.js.map} +0 -0
  566. /package/dist/{chunk-7CZTKBTI.js.map → chunk-IC7KNOBB.js.map} +0 -0
  567. /package/dist/{chunk-HGMWMK5K.js.map → chunk-IIO2MR3B.js.map} +0 -0
  568. /package/dist/{chunk-L6RXRRN3.js.map → chunk-ILDOW2IQ.js.map} +0 -0
  569. /package/dist/{chunk-O756O2I7.js.map → chunk-IPPVX5GF.js.map} +0 -0
  570. /package/dist/{chunk-X7ASQHR6.js.map → chunk-IUK5QGP5.js.map} +0 -0
  571. /package/dist/{chunk-PIVGX42P.js.map → chunk-JNY5MT3I.js.map} +0 -0
  572. /package/dist/{chunk-DDK4WFJ3.js.map → chunk-JWN7SLTO.js.map} +0 -0
  573. /package/dist/{chunk-Q35YZVDZ.js.map → chunk-KFWVBTUH.js.map} +0 -0
  574. /package/dist/{chunk-JXT5QDJC.js.map → chunk-KNFDWNCH.js.map} +0 -0
  575. /package/dist/{chunk-AZVANYMB.js.map → chunk-KUNFUSZ7.js.map} +0 -0
  576. /package/dist/{chunk-DXZNDKQD.js.map → chunk-LEEJBZ5B.js.map} +0 -0
  577. /package/dist/{chunk-RSNYGEVZ.js.map → chunk-LKJ2C7PH.js.map} +0 -0
  578. /package/dist/{chunk-RIMKJBCD.js.map → chunk-LMPTC4CX.js.map} +0 -0
  579. /package/dist/{chunk-3KVWXKD6.js.map → chunk-LQ47YL6E.js.map} +0 -0
  580. /package/dist/{chunk-GAIM5RNE.js.map → chunk-MJQBC7C5.js.map} +0 -0
  581. /package/dist/{chunk-NWZW2WHN.js.map → chunk-MM7OKOTE.js.map} +0 -0
  582. /package/dist/{chunk-FM4OUCC2.js.map → chunk-MOKYT3X3.js.map} +0 -0
  583. /package/dist/{chunk-XRRSFQEV.js.map → chunk-NAZZLAWX.js.map} +0 -0
  584. /package/dist/{chunk-XOFUXMPP.js.map → chunk-ND2WCWXI.js.map} +0 -0
  585. /package/dist/{chunk-6L7U46Y2.js.map → chunk-NKNVIO66.js.map} +0 -0
  586. /package/dist/{chunk-JKUICTLM.js.map → chunk-NLAFNMPK.js.map} +0 -0
  587. /package/dist/{chunk-OO2T63BY.js.map → chunk-NML44AW2.js.map} +0 -0
  588. /package/dist/{chunk-4LKNIGHB.js.map → chunk-O2SBHS2N.js.map} +0 -0
  589. /package/dist/{chunk-RA3FNMWF.js.map → chunk-O4DYOSOL.js.map} +0 -0
  590. /package/dist/{chunk-ZKYYZH6L.js.map → chunk-OFB6TUDC.js.map} +0 -0
  591. /package/dist/{chunk-DWPOQ3S5.js.map → chunk-OTMWHZBY.js.map} +0 -0
  592. /package/dist/{chunk-VVCDB2T7.js.map → chunk-PCJLH45G.js.map} +0 -0
  593. /package/dist/{chunk-WSMYOLHG.js.map → chunk-PEKPWK5M.js.map} +0 -0
  594. /package/dist/{chunk-PZ24CYDO.js.map → chunk-PFAUGEV5.js.map} +0 -0
  595. /package/dist/{chunk-KTRKZRID.js.map → chunk-PKEKZ2VA.js.map} +0 -0
  596. /package/dist/{chunk-6JKZILLF.js.map → chunk-PMD7V4N7.js.map} +0 -0
  597. /package/dist/{chunk-B74GSYR6.js.map → chunk-PUTS4DYW.js.map} +0 -0
  598. /package/dist/{chunk-ZRJCGBVV.js.map → chunk-PVR5EELP.js.map} +0 -0
  599. /package/dist/{chunk-JSIDLTTG.js.map → chunk-PZ2V2XIK.js.map} +0 -0
  600. /package/dist/{chunk-TMEQPODK.js.map → chunk-PZ37VDB5.js.map} +0 -0
  601. /package/dist/{chunk-FLGUVRR7.js.map → chunk-QBADR2FO.js.map} +0 -0
  602. /package/dist/{chunk-TGVVEGZG.js.map → chunk-QLIDZGPV.js.map} +0 -0
  603. /package/dist/{chunk-LVONK3YQ.js.map → chunk-QRKTESVE.js.map} +0 -0
  604. /package/dist/{chunk-HT5WSUC7.js.map → chunk-QXEDIDBZ.js.map} +0 -0
  605. /package/dist/{chunk-WURSS6MP.js.map → chunk-R66YMYJU.js.map} +0 -0
  606. /package/dist/{chunk-6PQNLL4E.js.map → chunk-R7XCJWCD.js.map} +0 -0
  607. /package/dist/{chunk-QRVNI5V6.js.map → chunk-SCNEQFIW.js.map} +0 -0
  608. /package/dist/{chunk-BNUPYHHZ.js.map → chunk-SD4PPZFB.js.map} +0 -0
  609. /package/dist/{chunk-ROQOVH4N.js.map → chunk-SFAU5R5S.js.map} +0 -0
  610. /package/dist/{chunk-R63QEVPK.js.map → chunk-SJORXXLV.js.map} +0 -0
  611. /package/dist/{chunk-FBE6AIIW.js.map → chunk-SOKNCW5U.js.map} +0 -0
  612. /package/dist/{chunk-NDF3SH3X.js.map → chunk-TDIOBPLA.js.map} +0 -0
  613. /package/dist/{chunk-33TPANCR.js.map → chunk-TFK4KFKA.js.map} +0 -0
  614. /package/dist/{chunk-6NIB2KGJ.js.map → chunk-THVIT3PW.js.map} +0 -0
  615. /package/dist/{chunk-HPPKLBTJ.js.map → chunk-TJQDL3JH.js.map} +0 -0
  616. /package/dist/{chunk-FD4Q5KFL.js.map → chunk-TLL22FFO.js.map} +0 -0
  617. /package/dist/{chunk-7DU35P5J.js.map → chunk-TN5T5HRZ.js.map} +0 -0
  618. /package/dist/{chunk-JK7C5A4I.js.map → chunk-TR4HIKJ2.js.map} +0 -0
  619. /package/dist/{chunk-HNYJEAES.js.map → chunk-UGEWCWVV.js.map} +0 -0
  620. /package/dist/{chunk-H5EVWF6L.js.map → chunk-UNNJUJVD.js.map} +0 -0
  621. /package/dist/{chunk-AD22P5X3.js.map → chunk-UUSAOIJR.js.map} +0 -0
  622. /package/dist/{chunk-Z6DKXQG7.js.map → chunk-UXXFMF4X.js.map} +0 -0
  623. /package/dist/{chunk-UP4BE32Y.js.map → chunk-VO6RVVP7.js.map} +0 -0
  624. /package/dist/{chunk-S4SC5SSV.js.map → chunk-VPNXQUUS.js.map} +0 -0
  625. /package/dist/{chunk-7BST7BA6.js.map → chunk-VW3BBTMA.js.map} +0 -0
  626. /package/dist/{chunk-CBY5CXBD.js.map → chunk-VWSFA4LJ.js.map} +0 -0
  627. /package/dist/{chunk-QEJTQTF5.js.map → chunk-W6T5HR3Z.js.map} +0 -0
  628. /package/dist/{chunk-5JEIDFPD.js.map → chunk-WBPQ7OPC.js.map} +0 -0
  629. /package/dist/{chunk-GZLLDA6P.js.map → chunk-WEFN327U.js.map} +0 -0
  630. /package/dist/{chunk-ANHUMDJX.js.map → chunk-WNDTLK44.js.map} +0 -0
  631. /package/dist/{chunk-DLOYMWUQ.js.map → chunk-WSLPZ43N.js.map} +0 -0
  632. /package/dist/{chunk-2DS4UOYQ.js.map → chunk-WSZQNTVN.js.map} +0 -0
  633. /package/dist/{chunk-LE2EDBXU.js.map → chunk-WUHB422G.js.map} +0 -0
  634. /package/dist/{chunk-BJW7G6EF.js.map → chunk-WVX5AQXS.js.map} +0 -0
  635. /package/dist/{chunk-5POTDNQT.js.map → chunk-WWOHORRO.js.map} +0 -0
  636. /package/dist/{chunk-KZHW27BV.js.map → chunk-WYEPUXGL.js.map} +0 -0
  637. /package/dist/{chunk-GALB2G3W.js.map → chunk-X2AH4DRF.js.map} +0 -0
  638. /package/dist/{chunk-NCX5SAQY.js.map → chunk-XN6CALYY.js.map} +0 -0
  639. /package/dist/{chunk-SUVEDKE2.js.map → chunk-XNACICAB.js.map} +0 -0
  640. /package/dist/{chunk-FDNJVZRE.js.map → chunk-XU4I47IP.js.map} +0 -0
  641. /package/dist/{chunk-U36PO27Q.js.map → chunk-YG3IJCM2.js.map} +0 -0
  642. /package/dist/{chunk-UWJ5P5CU.js.map → chunk-YGSJWWT3.js.map} +0 -0
  643. /package/dist/{chunk-P5WABK2H.js.map → chunk-Z4GJB24B.js.map} +0 -0
  644. /package/dist/{chunk-NLMTNEWW.js.map → chunk-Z6E6TUAE.js.map} +0 -0
  645. /package/dist/{chunk-OBQVTCTW.js.map → chunk-ZX5H7LWD.js.map} +0 -0
  646. /package/dist/{embedded-voice-6QS4ANNX.js.map → computer-viewer-VA5JONUH.js.map} +0 -0
  647. /package/dist/{model-policy-picker-menu-CURJ247L.js.map → embedded-new-voice-6BILAOUG.js.map} +0 -0
  648. /package/dist/{sandbox-files-4FBG3GS2.js.map → embedded-voice-UDE4JRKB.js.map} +0 -0
  649. /package/dist/{fleet-decision-row-QNSTP3VX.js.map → fleet-decision-row-NN2HXDX3.js.map} +0 -0
  650. /package/dist/{session-realtime-2XIB254N.js.map → model-policy-picker-menu-NRTO6FRP.js.map} +0 -0
  651. /package/dist/{platform-activity-row-BMXXNZKX.js.map → platform-activity-row-ENQVIFTL.js.map} +0 -0
  652. /package/dist/{timeline-annotation-markers-X4K2IEOO.js.map → timeline-annotation-markers-ZSOFW7PG.js.map} +0 -0
  653. /package/dist/{timeline-annotation-selection-MEHBW676.js.map → timeline-annotation-selection-YWV2UC34.js.map} +0 -0
  654. /package/dist/{timeline-annotations-dialog-U2FPQ3UY.js.map → timeline-annotations-dialog-ZWQVX2HI.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/timeline/retained-loaders.ts","../src/components/tool-review-history.tsx","../src/components/tool-action-review.tsx","../src/timeline/knowledge-receipt.tsx","../src/lib/git-patch.ts","../src/components/pierre-diff.tsx","../src/timeline/tool-renderers.tsx","../src/timeline/compute-label.tsx","../src/timeline/provider-logo.tsx","../src/timeline/tool-diff.tsx","../src/timeline/startup-preference.ts","../src/timeline/agent-row.tsx","../src/timeline/agent-identity.tsx","../src/timeline/activity-rail.tsx","../src/timeline/genie-loading.tsx","../src/timeline/startup-dispatch-details.tsx","../src/timeline/entrance.tsx","../src/timeline/seen-activity-ids.ts","../src/timeline/turn-summary.tsx","../src/timeline/fold-memory.ts","../src/timeline/learning-refusal-row.tsx"],"sourcesContent":["import type { OpenGeniClient, RetainedArtifactReference } from \"@opengeni/sdk\";\nimport type {\n RetainedArtifactLoadOptions,\n RetainedArtifactLoader,\n RetainedScreenshotLoader,\n VideoArtifactPlaybackLoader,\n} from \"./registry\";\n\n/** SDK methods the workspace retained-artifact loader needs. */\nexport type RetainedArtifactLoaderClient = Pick<\n OpenGeniClient,\n \"createRetainedArtifactDownloadUrl\" | \"downloadRetainedArtifact\"\n>;\n\n/** SDK method the session retained-screenshot loader needs. */\nexport type RetainedScreenshotLoaderClient = Pick<OpenGeniClient, \"downloadRetainedScreenshot\">;\n\n/** SDK method the generated-video playback loader needs. */\nexport type RetainedVideoLoaderClient = Pick<OpenGeniClient, \"createVideoArtifactPlaybackSource\">;\n\n/**\n * Bind permanent retained-artifact retrieval (generated images, published\n * files) to one authenticated workspace, for `MessageTimeline`'s\n * `loadRetainedArtifact`. Images get a short-lived URL; files are assembled\n * from verified byte ranges unless the caller asks for a URL.\n */\nexport function createWorkspaceRetainedArtifactLoader(\n client: RetainedArtifactLoaderClient,\n workspaceId: string,\n): RetainedArtifactLoader {\n return async (\n artifact: RetainedArtifactReference,\n signal: AbortSignal,\n options?: RetainedArtifactLoadOptions,\n ) => {\n if (artifact.kind === \"file\" && options?.prefer !== \"url\") {\n const download = await client.downloadRetainedArtifact(workspaceId, artifact, { signal });\n return download.bytes;\n }\n const download = await client.createRetainedArtifactDownloadUrl(workspaceId, artifact, {\n signal,\n });\n return { url: download.url, expiresAt: download.expiresAt };\n };\n}\n\n/**\n * Bind the authenticated screenshot downloader to one workspace and session,\n * for `MessageTimeline`'s `loadRetainedScreenshot`. Fetched metadata must match\n * the timeline receipt before bytes are handed to React; errors deliberately\n * contain no storage locator or content.\n */\nexport function createSessionRetainedScreenshotLoader(\n client: RetainedScreenshotLoaderClient,\n workspaceId: string,\n sessionId: string,\n): RetainedScreenshotLoader {\n return async (artifact: RetainedArtifactReference, signal: AbortSignal) => {\n const download = await client.downloadRetainedScreenshot(\n workspaceId,\n sessionId,\n artifact.artifactId,\n { signal },\n );\n if (!download.metadata.available || !download.bytes) return null;\n if (\n download.metadata.artifactId !== artifact.artifactId ||\n download.metadata.kind !== artifact.kind ||\n download.metadata.contentType !== artifact.contentType ||\n download.metadata.originalBytes !== artifact.originalBytes ||\n download.metadata.sha256 !== artifact.sha256 ||\n download.metadata.dimensions?.width !== artifact.dimensions?.width ||\n download.metadata.dimensions?.height !== artifact.dimensions?.height\n ) {\n throw new Error(\"Retained screenshot receipt verification failed\");\n }\n return download.bytes;\n };\n}\n\n/**\n * Bind expiring generated-video playback sources to one authenticated\n * workspace, for `MessageTimeline`'s `loadVideoArtifactPlayback`.\n */\nexport function createWorkspaceRetainedVideoLoader(\n client: RetainedVideoLoaderClient,\n workspaceId: string,\n): VideoArtifactPlaybackLoader {\n return async (artifactId: string, signal: AbortSignal) =>\n await client.createVideoArtifactPlaybackSource(workspaceId, artifactId, { signal });\n}\n","import { createContext, useContext, useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type { SessionEvent, ToolActionReview } from \"@opengeni/sdk\";\nimport { approvalsFromRequiresAction } from \"../approvals\";\n\ntype HistoryContext = {\n approvalIds: ReadonlySet<string>;\n revision: number;\n load: (approvalId: string) => Promise<ToolActionReview>;\n onViewDetails: (review: ToolActionReview, path: string) => void;\n};\nconst History = createContext<HistoryContext | null>(null);\n\n/** Opt-in, authenticated history for the exact reviewed calls in the visible event window. */\nexport function ToolReviewHistoryProvider({\n events,\n load,\n onViewDetails,\n children,\n}: {\n events: readonly SessionEvent[];\n load: HistoryContext[\"load\"];\n onViewDetails: HistoryContext[\"onViewDetails\"];\n children: ReactNode;\n}) {\n const value = useMemo<HistoryContext>(\n () => ({\n approvalIds: new Set(\n events.flatMap((event) =>\n event.type === \"session.requiresAction\"\n ? approvalsFromRequiresAction(event.payload).map((approval) => approval.id)\n : [],\n ),\n ),\n revision:\n [...events]\n .reverse()\n .find(\n (event) =>\n event.type === \"session.requiresAction\" ||\n event.type === \"agent.toolCall.output\" ||\n event.type.startsWith(\"turn.\") ||\n event.type === \"user.approvalDecision\" ||\n event.type.startsWith(\"session.control.\"),\n )?.sequence ?? 0,\n load,\n onViewDetails,\n }),\n [events, load, onViewDetails],\n );\n return <History.Provider value={value}>{children}</History.Provider>;\n}\nexport function useHasToolReview(approvalId: string | null): boolean {\n const history = useContext(History);\n return Boolean(approvalId && history?.approvalIds.has(approvalId));\n}\n\n/**\n * The saved review for one recorded call, or null while it loads or when it is\n * unavailable (callers then keep their ordinary tool row).\n */\nexport function useRecordedToolReview(approvalId: string | null): {\n review: ToolActionReview | null;\n onViewDetails: ((path: string) => void) | undefined;\n} {\n const history = useContext(History);\n const [review, setReview] = useState<ToolActionReview | null>(null);\n const load = history?.load;\n const revision = history?.revision;\n useEffect(() => {\n if (!load || !approvalId) return;\n let active = true;\n void load(approvalId).then(\n (value) => {\n if (active && value.id === approvalId) setReview(value);\n },\n () => undefined,\n );\n return () => {\n active = false;\n };\n }, [approvalId, load, revision]);\n const onViewDetails = history?.onViewDetails;\n return {\n review: review && review.id === approvalId ? review : null,\n onViewDetails:\n review && onViewDetails ? (path: string) => onViewDetails(review, path) : undefined,\n };\n}\n","import {\n ArrowLeftIcon,\n CheckIcon,\n ChevronRightIcon,\n CircleAlertIcon,\n CircleSlashIcon,\n LoaderCircleIcon,\n ShieldCheckIcon,\n} from \"lucide-react\";\nimport { useEffect, useId, useRef, useState, type HTMLAttributes, type ReactNode } from \"react\";\nimport type { ToolActionReview, ToolReviewDetailsPage, ToolReviewStatus } from \"@opengeni/sdk\";\nimport { cn } from \"../lib/cn\";\nimport { SecretRefText } from \"./secret-ref-chip\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\nexport type ToolReviewDetailsLoader = (\n review: ToolActionReview,\n path: string,\n offset: number,\n) => Promise<ToolReviewDetailsPage>;\n\nconst statusText = (t: OpenGeniText): Record<ToolReviewStatus, string> => ({\n pending: t(\"toolActionReview.approvalNeeded\"),\n approved: t(\"toolActionReview.approved\"),\n executing: t(\"toolActionReview.approvedRunning\"),\n completed: t(\"toolActionReview.approvedDone\"),\n partial: t(\"toolActionReview.partlyDone\"),\n unknown: t(\"toolActionReview.outcomeUnknown\"),\n rejected: t(\"toolActionReview.declined\"),\n cancelled: t(\"toolActionReview.cancelled\"),\n expired: t(\"toolActionReview.expired\"),\n revoked: t(\"toolActionReview.accessUnavailable\"),\n blocked: t(\"toolActionReview.blocked\"),\n stale: t(\"toolActionReview.noLongerValid\"),\n failed: t(\"toolActionReview.failed\"),\n unavailable: t(\"toolActionReview.detailsUnavailable\"),\n});\nconst statusDetail = (t: OpenGeniText): Partial<Record<ToolReviewStatus, string>> => ({\n unknown: t(\"toolActionReview.itMayHaveRunCheck\"),\n rejected: t(\"toolActionReview.thisActionDidNotRun\"),\n cancelled: t(\"toolActionReview.thisActionDidNotRun\"),\n expired: t(\"toolActionReview.thisActionDidNotRun2\"),\n revoked: t(\"toolActionReview.thisActionDidNotRun3\"),\n stale: t(\"toolActionReview.theToolOrAccountChanged\"),\n partial: t(\"toolActionReview.someOfItRanCheck\"),\n failed: t(\"toolActionReview.theActionRanButReturned\"),\n});\ntype Tone = \"waiting\" | \"ok\" | \"failed\" | \"muted\";\nconst statusTone: Record<ToolReviewStatus, Tone> = {\n pending: \"waiting\",\n approved: \"ok\",\n executing: \"ok\",\n completed: \"ok\",\n partial: \"failed\",\n unknown: \"failed\",\n rejected: \"muted\",\n cancelled: \"muted\",\n expired: \"muted\",\n revoked: \"muted\",\n blocked: \"muted\",\n stale: \"muted\",\n failed: \"failed\",\n unavailable: \"muted\",\n};\nconst toneText: Record<Tone, string> = {\n waiting: \"text-og-status-waiting\",\n ok: \"text-og-fg-muted\",\n failed: \"text-og-status-failed\",\n muted: \"text-og-fg-muted\",\n};\n/** Fields that only identify the selection; the count, examples and details cover them. */\nconst selectionPaths = new Set([\n \"/messageIds\",\n \"/messageId\",\n \"/threadId\",\n \"/addLabelIds\",\n \"/removeLabelIds\",\n \"/labelIds\",\n]);\n/** Shown when an older request's saved values are gone: approval is impossible, decline is not. */\nexport const UNRECOVERABLE_TEXT = (t: OpenGeniText) => t(\"toolActionReview.theDetailsOfThisOlder\");\n/** Long argument lists stay readable; the full set is one click away in details. */\nconst VISIBLE_FIELDS = 6;\n\nfunction StatusIcon({ status, busy }: { status: ToolReviewStatus; busy?: boolean }) {\n const className = \"size-4\";\n if (busy || status === \"executing\" || status === \"approved\")\n return <LoaderCircleIcon aria-hidden=\"true\" className={cn(className, \"animate-spin\")} />;\n if (status === \"pending\") return <ShieldCheckIcon aria-hidden=\"true\" className={className} />;\n if (status === \"completed\") return <CheckIcon aria-hidden=\"true\" className={className} />;\n if (statusTone[status] === \"failed\")\n return <CircleAlertIcon aria-hidden=\"true\" className={className} />;\n return <CircleSlashIcon aria-hidden=\"true\" className={className} />;\n}\n\n/** Card chrome shared by the review, its loading state and its load failure. */\nexport function ToolReviewFrame({\n tone,\n icon,\n eyebrow,\n title,\n titleId,\n subtitle,\n children,\n footer,\n bare = false,\n ...rest\n}: {\n tone: Tone;\n icon: ReactNode;\n eyebrow: ReactNode;\n title: ReactNode;\n titleId?: string | undefined;\n subtitle?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n bare?: boolean | undefined;\n} & Omit<HTMLAttributes<HTMLElement>, \"title\">) {\n const waiting = tone === \"waiting\";\n return (\n <article\n aria-labelledby={titleId}\n {...rest}\n className={cn(\n \"min-w-0 text-og-fg\",\n !bare &&\n (waiting\n ? \"overflow-hidden rounded-og-lg border border-og-status-waiting/35 bg-og-status-waiting/5 shadow-og-sm\"\n : \"overflow-hidden rounded-og-lg border border-og-border bg-og-surface-1\"),\n rest.className,\n )}\n >\n <header className={cn(\"flex min-w-0 items-start gap-3\", bare ? \"pb-1\" : \"px-4 py-3\")}>\n <span\n className={cn(\n \"mt-0.5 inline-flex size-8 shrink-0 items-center justify-center rounded-og-md\",\n waiting\n ? \"bg-og-status-waiting/12 text-og-status-waiting\"\n : tone === \"failed\"\n ? \"bg-og-status-failed/10 text-og-status-failed\"\n : \"bg-og-fg/5 text-og-fg-muted\",\n )}\n >\n {icon}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p\n className={cn(\"m-0 text-og-xs font-medium\", toneText[tone])}\n role=\"status\"\n aria-live=\"polite\"\n >\n {eyebrow}\n </p>\n <h3\n tabIndex={-1}\n id={titleId}\n className=\"m-0 mt-0.5 break-words text-og-md font-semibold leading-snug text-og-fg outline-hidden [overflow-wrap:anywhere]\"\n >\n {title}\n </h3>\n {subtitle ? (\n <p className=\"m-0 mt-0.5 break-words text-og-xs text-og-fg-muted [overflow-wrap:anywhere]\">\n {subtitle}\n </p>\n ) : null}\n </div>\n </header>\n {children ? (\n <div\n className={cn(\n \"min-w-0\",\n bare ? \"pt-2\" : \"px-4 pb-3\",\n !bare && \"sm:pl-[3.75rem]\", // Aligns with the title, past the icon.\n )}\n >\n {children}\n </div>\n ) : null}\n {footer ? (\n <footer\n className={cn(\n \"flex flex-wrap items-center gap-x-3 gap-y-2\",\n bare\n ? \"pt-3\"\n : waiting\n ? \"border-t border-og-status-waiting/20 px-4 py-3\"\n : \"border-t border-og-border px-4 py-3\",\n )}\n >\n {footer}\n </footer>\n ) : null}\n </article>\n );\n}\n\nconst linkButton =\n \"focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40 inline-flex min-h-8 items-center gap-1 rounded-og-sm text-left text-og-sm text-og-fg underline decoration-og-border-strong underline-offset-4 hover:decoration-current [@media(pointer:coarse)]:min-h-11\";\n\n/** The facts of one saved action: consequences, selection and its key values. */\nfunction ReviewFacts({\n review,\n onViewDetails,\n showStatusDetail,\n}: {\n review: ToolActionReview;\n onViewDetails?: ((path: string) => void) | undefined;\n showStatusDetail: boolean;\n}) {\n const t = useOpenGeniText();\n const canOpen = Boolean(onViewDetails && review.detailsAvailable);\n const selection =\n review.selectionCount === undefined\n ? undefined\n : review.fields.find((field) =>\n [\"/messageIds\", \"/messageId\", \"/threadId\"].includes(field.path),\n );\n const fields = selection\n ? review.fields.filter((field) => !selectionPaths.has(field.path))\n : review.fields;\n const shown = fields.slice(0, VISIBLE_FIELDS);\n const hiddenFields = fields.length - shown.length + review.moreFields;\n // The title already names the main effect; list only the remaining ones.\n const effects = review.effects.filter(\n (effect) => effect !== review.approveLabel && !review.title.startsWith(effect),\n );\n const note =\n (showStatusDetail\n ? review.status === \"blocked\"\n ? t(\"toolActionReview.reasonItDidNotRun\", {\n reason: review.reason || t(\"toolActionReview.yourPermissionSettingsBlockThis\"),\n })\n : statusDetail(t)[review.status]\n : undefined) ?? review.consequence;\n const samples = review.samples ?? [];\n const count = review.selectionCount ?? 0;\n const noun =\n review.selectionKind === \"threads\"\n ? count === 1\n ? \"conversation\"\n : \"conversations\"\n : count === 1\n ? \"message\"\n : \"messages\";\n const hasContent =\n note || effects.length || selection || shown.length || hiddenFields > 0 || samples.length;\n if (!hasContent) return null;\n return (\n <div className=\"flex min-w-0 flex-col gap-3 text-og-sm\">\n {note ? <p className=\"m-0 leading-relaxed text-og-fg-muted\">{note}</p> : null}\n {effects.length > 0 ? (\n <ul className=\"m-0 list-none space-y-1 p-0\" aria-label={t(\"toolActionReview.alsoChanges\")}>\n {effects.map((effect) => (\n <li key={effect} className=\"flex items-start gap-2 text-og-fg\">\n <span\n aria-hidden=\"true\"\n className=\"mt-[0.55em] size-1 shrink-0 rounded-full bg-og-fg-muted\"\n />\n <span className=\"min-w-0 break-words\">{effect}</span>\n </li>\n ))}\n </ul>\n ) : null}\n {selection ? (\n <div className=\"min-w-0\">\n {samples.length > 0 ? (\n <>\n <p className=\"m-0 mb-1 text-og-xs text-og-fg-muted\">\n {t(\"toolActionReview.includes\")}\n </p>\n <ul className=\"m-0 list-none divide-y divide-og-border rounded-og-md border border-og-border bg-og-surface-1 p-0\">\n {samples.map((sample) => (\n <li key={sample.id} className=\"min-w-0 px-3 py-2\">\n <p className=\"m-0 truncate text-og-sm text-og-fg\">{sample.title}</p>\n {sample.subtitle ? (\n <p className=\"m-0 mt-0.5 truncate text-og-xs text-og-fg-muted\">\n {sample.subtitle}\n </p>\n ) : null}\n </li>\n ))}\n {count > samples.length ? (\n <li className=\"px-3 py-2 text-og-xs text-og-fg-muted\">\n {t(\"toolActionReview.and\")} {(count - samples.length).toLocaleString(t.locale)}{\" \"}\n {t(\"toolActionReview.more\")}\n </li>\n ) : null}\n </ul>\n </>\n ) : null}\n {canOpen && count > 0 ? (\n <button\n type=\"button\"\n className={cn(linkButton, samples.length > 0 && \"mt-1\")}\n data-review-path={selection.path}\n onClick={() => onViewDetails!(selection.path)}\n >\n {count === 1\n ? t(\"toolActionReview.viewTheNoun\", { noun })\n : t(\"toolActionReview.viewAllLocalestringNoun\", {\n localeString: count.toLocaleString(t.locale),\n noun,\n })}\n <ChevronRightIcon className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n ) : null}\n {shown.length > 0 ? (\n <dl className=\"m-0 min-w-0 space-y-2\">\n {shown.map((field) => (\n <div\n key={field.path}\n className=\"grid min-w-0 gap-x-4 gap-y-0.5 sm:grid-cols-[minmax(0,9rem)_minmax(0,1fr)]\"\n >\n <dt className=\"m-0 break-words text-og-xs text-og-fg-muted sm:pt-px sm:text-og-sm\">\n {field.label}\n </dt>\n <dd className=\"m-0 min-w-0 whitespace-pre-wrap break-words text-og-fg [overflow-wrap:anywhere]\">\n {field.protected ? (\n <span className=\"text-og-fg-muted\">{t(\"toolActionReview.hidden\")}</span>\n ) : field.truncated && canOpen ? (\n <button\n type=\"button\"\n data-review-path={field.path}\n aria-label={t(\"toolActionReview.viewLabelPreview\", {\n label: field.label,\n preview: field.preview,\n })}\n onClick={() => onViewDetails!(field.path)}\n className={cn(linkButton, \"max-w-full\")}\n >\n <span className=\"line-clamp-4 min-w-0 break-words [overflow-wrap:anywhere]\">\n <SecretRefText text={field.preview} linkable={false} />\n </span>\n <ChevronRightIcon className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />\n </button>\n ) : (\n <SecretRefText text={field.preview} />\n )}\n </dd>\n </div>\n ))}\n </dl>\n ) : null}\n {hiddenFields > 0 ? (\n <p className=\"m-0 text-og-xs text-og-fg-muted\">\n {hiddenFields === 1\n ? t(\"toolActionReview.n1MoreValue\")\n : t(\"toolActionReview.hiddenfieldsMoreValues\", { hiddenFields })}{\" \"}\n {t(\"toolActionReview.inDetails\")}\n </p>\n ) : null}\n </div>\n );\n}\n\nexport function DeclineButton({\n busy,\n submitting,\n label,\n onClick,\n}: {\n busy: boolean;\n submitting: boolean;\n label?: string | undefined;\n onClick: () => void;\n}) {\n const t = useOpenGeniText();\n return (\n <button\n type=\"button\"\n disabled={busy}\n onClick={onClick}\n className=\"inline-flex min-h-9 items-center justify-center rounded-og-md border border-og-border bg-og-surface-1 px-3 py-1.5 text-og-sm font-medium text-og-fg transition-colors hover:border-og-border-strong hover:bg-og-hover disabled:opacity-60 [@media(pointer:coarse)]:min-h-11 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n >\n {submitting ? t(\"toolActionReview.declining\") : (label ?? t(\"toolActionReview.decline\"))}\n </button>\n );\n}\n\n/** One host-neutral review. All callbacks refer to the immutable action; none can edit it. */\nexport function ToolActionReviewCard({\n review,\n onApprove,\n onReject,\n submitting,\n disabled,\n onViewDetails,\n pendingLabel,\n rejectLabel,\n bare,\n}: {\n review: ToolActionReview;\n onApprove?: (() => void) | undefined;\n onReject?: (() => void) | undefined;\n submitting?: \"approve\" | \"reject\" | null | undefined;\n disabled?: boolean | undefined;\n onViewDetails?: ((path: string) => void) | undefined;\n pendingLabel?: string | undefined;\n rejectLabel?: string | undefined;\n /** Render without card chrome, e.g. inside an expanded timeline row. */\n bare?: boolean | undefined;\n}) {\n const t = useOpenGeniText();\n const titleId = useId();\n const canApprove = review.availableActions.includes(\"approve\") && !!onApprove;\n const canReject = review.availableActions.includes(\"reject\") && !!onReject;\n const actionable = review.status === \"pending\" && (canApprove || canReject);\n const busy = Boolean(disabled || submitting);\n const tone: Tone = statusTone[review.status];\n const eyebrow = submitting\n ? submitting === \"approve\"\n ? t(\"toolActionReview.approving\")\n : t(\"toolActionReview.declining\")\n : review.status === \"pending\"\n ? (pendingLabel ?? statusText(t).pending)\n : statusText(t)[review.status];\n const detailsLink =\n review.detailsAvailable && onViewDetails ? (\n <button\n type=\"button\"\n className=\"inline-flex min-h-8 items-center rounded-og-sm text-og-sm text-og-fg-muted underline decoration-og-border-strong underline-offset-4 hover:text-og-fg hover:decoration-current [@media(pointer:coarse)]:min-h-11 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n data-review-path=\"\"\n onClick={() => onViewDetails(\"\")}\n >\n {t(\"toolActionReview.details\")}\n </button>\n ) : null;\n const reason = review.reason.trim();\n return (\n <ToolReviewFrame\n tone={tone}\n icon={<StatusIcon status={review.status} busy={Boolean(submitting)} />}\n eyebrow={eyebrow}\n title={review.title}\n titleId={titleId}\n subtitle={review.accountLabel}\n bare={bare}\n aria-busy={Boolean(submitting)}\n data-og-tool-review=\"\"\n data-review-status={review.status}\n footer={\n actionable ? (\n <>\n <div className=\"flex min-w-0 flex-1 basis-48 flex-wrap items-center gap-x-3 gap-y-1\">\n {detailsLink}\n {reason ? (\n <span className=\"min-w-0 text-og-xs leading-relaxed text-og-fg-subtle\">\n {reason}\n </span>\n ) : null}\n </div>\n <div className=\"ml-auto flex shrink-0 flex-wrap items-center justify-end gap-2\">\n {canReject ? (\n <DeclineButton\n busy={busy}\n submitting={submitting === \"reject\"}\n label={rejectLabel}\n onClick={onReject!}\n />\n ) : null}\n {canApprove ? (\n <button\n type=\"button\"\n disabled={busy}\n onClick={onApprove}\n className=\"inline-flex min-h-9 items-center justify-center gap-2 rounded-og-md border border-og-primary-border bg-og-primary px-3.5 py-1.5 text-og-sm font-medium text-og-primary-fg transition-colors hover:bg-og-primary-hover disabled:opacity-60 [@media(pointer:coarse)]:min-h-11 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n >\n {submitting === \"approve\" ? (\n <LoaderCircleIcon className=\"size-3.5 animate-spin\" aria-hidden=\"true\" />\n ) : null}\n {submitting === \"approve\" ? t(\"toolActionReview.approving\") : review.approveLabel}\n </button>\n ) : null}\n </div>\n </>\n ) : undefined\n }\n >\n {actionable && !canApprove ? (\n <p className=\"m-0 mb-3 text-og-sm leading-relaxed text-og-fg\">{UNRECOVERABLE_TEXT(t)}</p>\n ) : null}\n <ReviewFacts\n review={review}\n onViewDetails={onViewDetails}\n showStatusDetail={review.status !== \"pending\"}\n />\n {!actionable && detailsLink ? <div className=\"mt-2\">{detailsLink}</div> : null}\n </ToolReviewFrame>\n );\n}\n\n/** Full-page detail content: hosts choose navigation, never a nested scrolling panel. */\nexport function ToolActionReviewDetails({\n review,\n path: initialPath = \"\",\n load,\n onBack,\n manageFocus = true,\n}: {\n review: ToolActionReview;\n path?: string;\n load: ToolReviewDetailsLoader;\n onBack: () => void;\n /** Hosts rendering simultaneous previews can retain their own focus. */\n manageFocus?: boolean;\n}) {\n const t = useOpenGeniText();\n const [path, setPath] = useState(initialPath);\n const [trail, setTrail] = useState<Array<{ path: string; label: string }>>([]);\n const [offset, setOffset] = useState(0);\n const [page, setPage] = useState<ToolReviewDetailsPage | null>(null);\n const [error, setError] = useState(false);\n const [retry, setRetry] = useState(0);\n const heading = useRef<HTMLHeadingElement>(null);\n const focusedOnce = useRef(false);\n useEffect(() => {\n if (page && manageFocus && !focusedOnce.current) {\n focusedOnce.current = true;\n heading.current?.focus({ preventScroll: true });\n heading.current?.scrollIntoView({ block: \"start\" });\n }\n }, [page, manageFocus]);\n useEffect(() => {\n let active = true;\n setPage(null);\n setError(false);\n void load(review, path, offset).then(\n (value) => {\n if (!active) return;\n if (\n value.actionDigest !== review.actionDigest ||\n value.id !== review.id ||\n value.path !== path\n ) {\n setError(true);\n return;\n }\n setPage(value);\n },\n () => {\n if (active) setError(true);\n },\n );\n return () => {\n active = false;\n };\n }, [review, path, offset, load, retry]);\n const open = (next: string, label: string) => {\n setTrail((value) => [...value, { path, label }]);\n setPath(next);\n setOffset(0);\n };\n const up = () => {\n const previous = trail.at(-1);\n setTrail((value) => value.slice(0, -1));\n setPath(previous?.path ?? initialPath);\n setOffset(0);\n };\n return (\n <section\n className=\"og-root mx-auto w-full max-w-3xl px-4 py-5 text-og-fg sm:px-6\"\n data-og-review-details=\"\"\n >\n <button\n type=\"button\"\n onClick={onBack}\n className=\"mb-4 inline-flex min-h-11 items-center gap-2 rounded-og-md pr-2 text-og-sm text-og-fg-muted hover:text-og-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n >\n <ArrowLeftIcon className=\"size-4\" aria-hidden=\"true\" />\n {t(\"toolActionReview.backToReview\")}\n </button>\n <h2\n ref={heading}\n tabIndex={-1}\n className=\"m-0 break-words text-og-lg font-semibold outline-hidden [overflow-wrap:anywhere]\"\n >\n {review.title}\n </h2>\n {review.accountLabel ? (\n <p className=\"m-0 mt-1 text-og-sm text-og-fg-muted\">{review.accountLabel}</p>\n ) : null}\n <p className=\"m-0 mt-2 text-og-xs text-og-fg-subtle\">\n {t(\"toolActionReview.theExactValuesSavedFor\")}\n </p>\n {trail.length > 0 ? (\n <button\n type=\"button\"\n className=\"mt-3 inline-flex min-h-11 items-center gap-1.5 text-og-sm text-og-fg-muted underline underline-offset-4 hover:text-og-fg focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n onClick={up}\n >\n <ArrowLeftIcon className=\"size-3.5\" aria-hidden=\"true\" />\n {t(\"toolActionReview.backTo\")} {trail.at(-1)?.label ?? t(\"toolActionReview.allValues\")}\n </button>\n ) : null}\n {error ? (\n <div role=\"alert\" className=\"mt-4 py-4 text-og-sm\">\n {t(\"toolActionReview.couldnTLoadTheseDetails\")}{\" \"}\n <button\n type=\"button\"\n onClick={() => setRetry((value) => value + 1)}\n className=\"min-h-11 underline underline-offset-4 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n >\n {t(\"toolActionReview.tryAgain\")}\n </button>\n </div>\n ) : !page ? (\n <p role=\"status\" className=\"mt-4 py-4 text-og-sm text-og-fg-muted\">\n {t(\"toolActionReview.loadingDetails\")}\n </p>\n ) : (\n <>\n <dl className=\"m-0 mt-4 divide-y divide-og-border border-y border-og-border\">\n {page.items.map((item) => (\n <div key={`${page.path}:${item.label}`} className=\"py-3\">\n <dt className=\"m-0 text-og-xs text-og-fg-muted\">{item.label}</dt>\n <dd className=\"m-0 mt-1 whitespace-pre-wrap break-words text-og-sm leading-relaxed [overflow-wrap:anywhere]\">\n {item.truncated && item.path ? (\n <button\n type=\"button\"\n aria-label={t(\"toolActionReview.openLabel\", { label: item.label })}\n className={cn(linkButton, \"max-w-full\")}\n onClick={() => open(item.path!, item.label)}\n >\n <span className=\"min-w-0 break-words focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\">\n <SecretRefText text={item.value} linkable={false} />\n </span>\n <ChevronRightIcon className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />\n </button>\n ) : (\n <SecretRefText text={item.value} />\n )}\n {item.detail ? (\n <span className=\"mt-0.5 block text-og-xs text-og-fg-muted\">\n <SecretRefText text={item.detail} linkable={false} />\n </span>\n ) : null}\n </dd>\n </div>\n ))}\n </dl>\n {page.total > page.items.length || offset > 0 ? (\n <nav\n aria-label={t(\"toolActionReview.detailPages\")}\n className=\"mt-4 flex flex-wrap items-center justify-between gap-3 text-og-sm\"\n >\n <button\n type=\"button\"\n disabled={offset === 0}\n onClick={() => setOffset(Math.max(0, offset - 25))}\n className=\"min-h-11 rounded-og-md border border-og-border px-3 hover:bg-og-hover disabled:opacity-40 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n >\n {t(\"toolActionReview.previous\")}\n </button>\n <span className=\"text-og-fg-muted tabular-nums\">\n {page.total === 0\n ? t(\"toolActionReview.noItems\")\n : `${(offset + 1).toLocaleString(t.locale)}–${(offset + page.items.length).toLocaleString(t.locale)} of ${page.total.toLocaleString(t.locale)}`}\n </span>\n <button\n type=\"button\"\n disabled={page.nextOffset === null}\n onClick={() => setOffset(page.nextOffset ?? offset)}\n className=\"min-h-11 rounded-og-md border border-og-border px-3 hover:bg-og-hover disabled:opacity-40 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n >\n {t(\"toolActionReview.next\")}\n </button>\n </nav>\n ) : null}\n </>\n )}\n </section>\n );\n}\n","import { createContext, useContext, useState, type ReactNode } from \"react\";\nimport { BrainCircuitIcon } from \"lucide-react\";\nimport { ActivityDisclosure, BodyNote } from \"./shared\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\nexport type KnowledgeActivityActions = {\n onInspect?: ((entryId: string) => void) | undefined;\n onRetryFile?: ((fileId: string) => Promise<boolean | void>) | undefined;\n retryDisabled?: boolean | undefined;\n};\nconst KnowledgeActions = createContext<KnowledgeActivityActions>({});\nexport function KnowledgeActivityProvider({\n children,\n ...actions\n}: KnowledgeActivityActions & { children: ReactNode }) {\n return <KnowledgeActions.Provider value={actions}>{children}</KnowledgeActions.Provider>;\n}\n\n/** A saved/pending result never opens or blocks the human-input surface. */\nexport function KnowledgeReceiptRow(props: {\n outcome: \"published\" | \"pending\" | \"rejected\" | \"archived\" | \"failed\";\n entryId?: string | undefined;\n fileId?: string | undefined;\n title?: string | undefined;\n source?: boolean | undefined;\n}) {\n const t = useOpenGeniText();\n const actions = useContext(KnowledgeActions);\n const [retrying, setRetrying] = useState(false);\n const [retrySent, setRetrySent] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const label =\n props.outcome === \"pending\"\n ? t(\"timeline.knowledgeReceipt.knowledgeSavedForReview\")\n : props.outcome === \"failed\"\n ? t(\"timeline.knowledgeReceipt.sourcePreparationFailed\")\n : props.outcome === \"rejected\"\n ? t(\"timeline.knowledgeReceipt.sourceRemainsRejected\")\n : props.outcome === \"archived\"\n ? t(\"timeline.knowledgeReceipt.knowledgeArchived\")\n : props.source\n ? t(\"timeline.knowledgeReceipt.sourceSavedToKnowledge\")\n : t(\"timeline.knowledgeReceipt.savedToKnowledge\");\n const actionClass =\n \"rounded-og-sm px-1 py-0.5 text-og-sm text-og-fg-muted hover:text-og-fg focus-visible:outline-2 focus-visible:outline-og-accent disabled:opacity-50\";\n return (\n <ActivityDisclosure\n icon={<BrainCircuitIcon className=\"size-3.5\" />}\n iconTone=\"muted\"\n title={label}\n preview={props.title}\n >\n {props.outcome === \"pending\" ? (\n <BodyNote>{t(\"timeline.knowledgeReceipt.savedInNeedsReviewThis\")}</BodyNote>\n ) : null}\n {props.outcome === \"failed\" ? (\n <BodyNote>{t(\"timeline.knowledgeReceipt.theOriginalFileRemainsAttached\")}</BodyNote>\n ) : null}\n {props.outcome === \"rejected\" ? (\n <BodyNote>{t(\"timeline.knowledgeReceipt.processingTheFileAgainLeaves\")}</BodyNote>\n ) : null}\n {props.entryId && actions.onInspect ? (\n <button\n className={actionClass}\n type=\"button\"\n onClick={() => actions.onInspect?.(props.entryId!)}\n >\n {props.outcome === \"pending\"\n ? t(\"timeline.knowledgeReceipt.reviewInKnowledge\")\n : t(\"timeline.knowledgeReceipt.viewInKnowledge\")}\n </button>\n ) : null}\n {props.outcome === \"failed\" && props.fileId && actions.onRetryFile ? (\n <button\n className={actionClass}\n type=\"button\"\n disabled={retrying || retrySent || actions.retryDisabled}\n onClick={() => {\n setRetrying(true);\n setError(null);\n void actions.onRetryFile!(props.fileId!)\n .then((sent) => {\n if (sent !== false) setRetrySent(true);\n else setError(t(\"timeline.knowledgeReceipt.couldNotStartTheRetry\"));\n })\n .catch(() => setError(t(\"timeline.knowledgeReceipt.couldNotStartTheRetry2\")))\n .finally(() => setRetrying(false));\n }}\n >\n {retrying\n ? t(\"timeline.knowledgeReceipt.startingRetry\")\n : retrySent\n ? t(\"timeline.knowledgeReceipt.retryRequested\")\n : t(\"timeline.knowledgeReceipt.retryPreparation\")}\n </button>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"text-og-sm\">\n {error}\n </p>\n ) : null}\n </ActivityDisclosure>\n );\n}\n","import type { GitFileDiff } from \"@opengeni/sdk\";\n\n/**\n * Reconstruct a unified-diff patch string for a single `GitFileDiff` so it can\n * be fed to a generic patch renderer (e.g. Pierre's `PatchDiff`). The hook\n * already carries per-line old/new numbers and a hunk header, so we emit a\n * conventional `--- / +++ / @@` patch the parser understands.\n */\nexport function gitFileDiffToPatch(file: GitFileDiff): string {\n const oldPath = file.oldPath ?? file.path;\n const newPath = file.path;\n const lines: string[] = [];\n lines.push(`diff --git a/${oldPath} b/${newPath}`);\n if (file.status === \"deleted\") {\n lines.push(`--- a/${oldPath}`);\n lines.push(`+++ /dev/null`);\n } else if (file.status === \"added\" || file.status === \"untracked\") {\n lines.push(`--- /dev/null`);\n lines.push(`+++ b/${newPath}`);\n } else {\n lines.push(`--- a/${oldPath}`);\n lines.push(`+++ b/${newPath}`);\n }\n for (const hunk of file.hunks) {\n // Only trust a pre-parsed header if it carries the full unified range form\n // `@@ -<o>[,<n>] +<o>[,<n>] @@`. A synthesized create_file hunk (parsers.ts)\n // can carry a degenerate `@@ +1 @@` with no `-`/`+` ranges; a generic patch\n // parser (Pierre) renders zero lines from it, so the expanded diff comes up\n // empty while the collapsed chip still shows the (correct) addition count.\n // In that case regenerate a valid header from the hunk's range fields.\n const headerIsValid = /^@@ -\\d+(?:,\\d+)? \\+\\d+(?:,\\d+)? @@/.test(hunk.header ?? \"\");\n const header = headerIsValid\n ? hunk.header\n : `@@ -${hunk.oldStart},${hunk.oldLines} +${hunk.newStart},${hunk.newLines} @@`;\n lines.push(header);\n for (const line of hunk.lines) {\n if (line.type === \"meta\") continue;\n const prefix = line.type === \"add\" ? \"+\" : line.type === \"del\" ? \"-\" : \" \";\n lines.push(`${prefix}${line.text}`);\n }\n }\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import type { GitFileDiff } from \"@opengeni/sdk\";\nimport {\n type ComponentType,\n type CSSProperties,\n type ReactNode,\n lazy,\n Suspense,\n useEffect,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { gitFileDiffToPatch } from \"../lib/git-patch\";\nimport {\n loadPierreDiffs,\n pierreDiffsRevision,\n subscribePierreDiffs,\n} from \"../lib/pierre-diffs-loader\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\n/** Pierre `PatchDiff` props subset we drive. */\ntype PatchDiffComponent = ComponentType<{\n patch: string;\n options?: {\n theme?: string | { dark: string; light: string };\n themeType?: \"dark\" | \"light\";\n diffStyle?: \"unified\" | \"split\";\n overflow?: \"scroll\" | \"wrap\";\n stickyHeader?: boolean;\n };\n disableWorkerPool?: boolean;\n className?: string;\n}>;\n\nexport type PierreDiffProps = {\n diff: GitFileDiff[];\n layout?: \"unified\" | \"split\" | undefined;\n themeType?: \"dark\" | \"light\" | undefined;\n /** Shiki bundled theme names (dark/light) — derived from the host palette. */\n theme?: { dark: string; light: string } | undefined;\n /** Disable Pierre's worker pool if its worker bundling fights the host bundler. */\n disableWorkerPool?: boolean | undefined;\n /** Rendered while the (lazy) Pierre bundle loads. */\n loading?: ReactNode | undefined;\n /** Rendered if `@pierre/diffs/react` is not installed / fails to import. */\n fallback?: ReactNode | undefined;\n /** Skip the Shiki renderer entirely and show the plain-text degrade (the old\n * `usePierre={false}` path — one renderer, opted out of highlighting). */\n plain?: boolean | undefined;\n /** Long-line handling: `\"wrap\"` soft-wraps (the default — a diff in a narrow\n * dock pane should be readable without a horizontal-scroll tax), `\"scroll\"`\n * keeps lines on one row behind a horizontal scrollbar (better for a wide\n * viewport or pathological minified lines). */\n overflow?: \"wrap\" | \"scroll\" | undefined;\n className?: string | undefined;\n};\n\n// Lazy-load `@pierre/diffs/react` so Shiki + the worker pool stay off the\n// critical path (and out of an SSR bundle) until a diff is actually shown. The\n// peer is loaded only through the host-registered loader (see\n// `enablePierreDiffs`); without one the load rejects and we render `fallback`.\nconst LazyPatchDiff = lazy(async () => {\n const mod = (await loadPierreDiffs()) as {\n PatchDiff: PatchDiffComponent;\n };\n return { default: mod.PatchDiff };\n});\n\n/**\n * The Pierre-backed diff: Shiki-highlighted, virtualized, unified/split. Renders\n * one `PatchDiff` per changed file (a reconstructed unified patch from the\n * `GitFileDiff` hunks). The ONE workbench diff renderer; a host without\n * `@pierre/diffs` gets the built-in plain-text degrade (`PlainPatch`).\n */\nexport function PierreDiff({\n diff,\n layout = \"unified\",\n themeType,\n theme,\n disableWorkerPool,\n loading,\n fallback,\n plain,\n overflow = \"wrap\",\n className,\n}: PierreDiffProps) {\n const [failed, setFailed] = useState(false);\n const [ready, setReady] = useState(false);\n const [forcedColors, setForcedColors] = useState(false);\n\n // Pierre's rich renderer distinguishes additions/deletions primarily through\n // foreground and background colors inside a shadow root. In Windows forced-\n // colors mode those paints intentionally collapse, so expose the literal\n // unified patch (+/- markers) instead of leaving changed lines ambiguous.\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n const query = window.matchMedia(\"(forced-colors: active)\");\n const update = () => setForcedColors(query.matches);\n update();\n query.addEventListener?.(\"change\", update);\n return () => query.removeEventListener?.(\"change\", update);\n }, []);\n\n // Probe the import once so a hard failure (peer missing) shows `fallback`\n // rather than a Suspense boundary that never resolves. Skipped when `plain`.\n const loaderRevision = useSyncExternalStore(\n subscribePierreDiffs,\n pierreDiffsRevision,\n pierreDiffsRevision,\n );\n useEffect(() => {\n if (plain) return;\n let cancelled = false;\n setFailed(false);\n // Mount the lazy renderer only after the peer loaded, so a missing peer\n // never poisons React.lazy's cached result for the rest of the page.\n loadPierreDiffs().then(\n () => {\n if (!cancelled) setReady(true);\n },\n () => {\n if (!cancelled) setFailed(true);\n },\n );\n return () => {\n cancelled = true;\n };\n }, [plain, loaderRevision]);\n\n if (plain || failed || forcedColors) {\n // `plain` opts out of highlighting; `failed` = `@pierre/diffs` not installed.\n // Render the caller's fallback, or a plain (unhighlighted) patch dump — NOT a\n // second hunk renderer. One highlighted renderer (Pierre) + a text degrade.\n return (\n <div\n className={className}\n data-opengeni-plain-diff={forcedColors ? \"forced-colors\" : \"fallback\"}\n >\n {fallback ?? <PlainPatch diff={diff} />}\n </div>\n );\n }\n\n // Default to the dark theme: the host UI is dark-first, and Pierre's own\n // auto-detection otherwise lands on the light Shiki theme (a white diff pane\n // inside a dark dock). Callers pass `themeType=\"light\"` to opt into light.\n const options = {\n diffStyle: layout,\n overflow,\n stickyHeader: true,\n ...(theme\n ? { theme }\n : {\n theme: {\n dark: \"github-dark-high-contrast\",\n light: \"github-light-high-contrast\",\n },\n }),\n themeType: themeType ?? \"dark\",\n };\n\n // Pierre renders inside a shadow DOM, so host CSS can't reach it — but it reads\n // a set of `--diffs-*-override` custom properties through the shadow boundary.\n // Pin the diff's own base background to the dock surface and quiet the hunk\n // separator slab so collapsed context rows do not become heavy bars.\n const pierreVars = {\n \"--diffs-dark-bg\": \"var(--og-color-bg)\",\n \"--diffs-light-bg\": \"var(--og-color-bg)\",\n \"--diffs-bg-buffer-override\": \"var(--og-color-surface-1)\",\n \"--diffs-bg-separator-override\": \"var(--og-color-surface-1)\",\n // Pierre's default (fg mixed 65% into bg) falls under 4.5:1 on the lifted\n // graphite separator; quiet meta text keeps AA on every diff surface.\n \"--diffs-fg-number-override\": \"var(--og-color-fg-subtle)\",\n \"--diffs-addition-color-override\": \"var(--og-color-status-idle)\",\n \"--diffs-deletion-color-override\": \"var(--og-color-status-failed)\",\n \"--diffs-fg-number-addition-override\": \"var(--og-color-status-idle)\",\n \"--diffs-fg-number-deletion-override\": \"var(--og-color-status-failed)\",\n \"--diffs-bg-addition-override\":\n \"color-mix(in oklab, var(--og-color-status-idle) 12%, var(--og-color-bg))\",\n \"--diffs-bg-deletion-override\":\n \"color-mix(in oklab, var(--og-color-status-failed) 12%, var(--og-color-bg))\",\n \"--diffs-bg-addition-emphasis-override\":\n \"color-mix(in oklab, var(--og-color-status-idle) 22%, var(--og-color-bg))\",\n \"--diffs-bg-deletion-emphasis-override\":\n \"color-mix(in oklab, var(--og-color-status-failed) 22%, var(--og-color-bg))\",\n \"--diffs-header-font-family\": \"var(--og-font-sans)\",\n \"--diffs-font-family\": \"var(--og-font-mono)\",\n \"--diffs-font-size\": \"var(--og-code-font-size)\",\n \"--diffs-line-height\": \"var(--og-code-line-height)\",\n } as CSSProperties;\n\n return (\n <div className={cn(\"min-w-0\", className)} data-opengeni-pierre-diff style={pierreVars}>\n <Suspense fallback={loading ?? <DiffSkeleton />}>\n {ready\n ? diff.map((file) => (\n <div key={file.path} className=\"mb-2\">\n <LazyPatchDiff\n patch={gitFileDiffToPatch(file)}\n options={options}\n {...(disableWorkerPool !== undefined ? { disableWorkerPool } : {})}\n />\n </div>\n ))\n : (loading ?? <DiffSkeleton />)}\n </Suspense>\n </div>\n );\n}\n\nfunction DiffSkeleton() {\n const t = useOpenGeniText();\n return <div className=\"p-3 text-og-sm text-og-fg-subtle\">{t(\"pierreDiff.loadingDiff\")}</div>;\n}\n\n/**\n * The unhighlighted degrade for a host without `@pierre/diffs`: the reconstructed\n * unified patch as monospace text with +/−/@@ tinting. Deliberately NOT a\n * structured hunk renderer — the workbench keeps exactly one of those (Pierre).\n */\nfunction PlainPatch({ diff }: { diff: GitFileDiff[] }) {\n const t = useOpenGeniText();\n if (diff.length === 0) {\n return <div className=\"p-3 text-og-sm text-og-fg-subtle\">{t(\"pierreDiff.noChanges\")}</div>;\n }\n return (\n <div className=\"min-w-0\">\n {diff.map((file) => (\n <pre\n key={file.path}\n aria-label={t(\"pierreDiff.diffForPath\", { path: file.path })}\n className=\"mb-2 overflow-auto whitespace-pre rounded-og-sm border border-og-border bg-og-bg/60 p-2.5 font-og-mono text-og-xs leading-5\"\n role=\"region\"\n tabIndex={0}\n >\n {gitFileDiffToPatch(file)\n .split(\"\\n\")\n .map((line, index) => (\n <span\n // Patch line position is the stable identity in this immutable plain-text fallback.\n // oxlint-disable-next-line react/no-array-index-key\n key={index}\n className={cn(\n \"block\",\n line.startsWith(\"@@\")\n ? \"text-og-accent\"\n : line.startsWith(\"+\")\n ? \"text-og-status-idle\"\n : line.startsWith(\"-\")\n ? \"text-og-status-failed\"\n : \"text-og-fg-muted\",\n )}\n >\n {line || \" \"}\n </span>\n ))}\n </pre>\n ))}\n </div>\n );\n}\n","import { useHasToolReview, useRecordedToolReview } from \"../components/tool-review-history\";\nimport { ToolActionReviewCard } from \"../components/tool-action-review\";\nimport { SecretRefText } from \"../components/secret-ref-chip\";\nimport type { ToolReviewStatus } from \"@opengeni/sdk\";\nimport { KnowledgeReceiptRow } from \"./knowledge-receipt\";\nimport { defaultUrlTransform } from \"react-markdown\";\nimport { isRetainedImageContentType, useRetainedImageObjectUrl } from \"./retained-image\";\nimport { parseSandboxFileArtifactReceipt, type RetainedArtifactReference } from \"@opengeni/sdk\";\nimport {\n BoxIcon,\n BrainCircuitIcon,\n CalendarClockIcon,\n CameraIcon,\n CameraOffIcon,\n DownloadIcon,\n FileDiffIcon,\n FileSearchIcon,\n FolderGitIcon,\n GlobeIcon,\n ImageIcon,\n KeyboardIcon,\n KeyRoundIcon,\n LockIcon,\n MessageCircleQuestionIcon,\n MessagesSquareIcon,\n MessageSquareIcon,\n MousePointer2Icon,\n PackageSearchIcon,\n PanelsTopLeftIcon,\n PlugIcon,\n SearchIcon,\n ServerCogIcon,\n ServerIcon,\n Share2Icon,\n TargetIcon,\n TerminalIcon,\n VideoIcon,\n WrenchIcon,\n type LucideIcon,\n} from \"lucide-react\";\nimport { useContext, useState, type ReactNode } from \"react\";\nimport { formatBytes, tryParseJson } from \"../lib/format\";\nimport { useTimelineComputeLabel } from \"./compute-label\";\nimport { useToolDetails } from \"./tool-details\";\nimport type { ToolCallItem } from \"./types\";\nimport { ConnectorLogoIcon, useToolConnectorLogo } from \"./provider-logo\";\nimport {\n generatedImageReceipt,\n mediaPreviewFact,\n parseToolArgs,\n retainedScreenshotMetadata,\n retainedToolResultImages,\n unwrapMcpOutput,\n screenshotDataUrl,\n} from \"./parsers\";\nimport {\n createToolRegistry,\n type ToolRegistry,\n type ToolRegistryEntry,\n type ToolRenderer,\n type ToolRendererProps,\n} from \"./registry\";\nimport {\n BodyNote,\n MediaEmpty,\n MediaSkeleton,\n PayloadBlock,\n ScreenshotFigure,\n TermBlock,\n Thumbnail,\n ActivityDisclosure,\n CompactActivityContext,\n type DisclosureChip,\n} from \"./shared\";\nimport { RawPatch, ToolDiff } from \"./tool-diff\";\nimport {\n applyPatchPresentation,\n askPresentation,\n execPresentation,\n genericToolIconKind,\n parseDisclosedTools,\n parseSearchHits,\n pathBasename,\n pathDirname,\n machinePresentation,\n runOnPresentation,\n plainToolRow,\n presentedToolKind,\n presentsToolOutputPreview,\n toolRowPresentation,\n toolSearchPreview,\n toolSearchQuery,\n truncatePreview,\n webSearchPresentation,\n writeStdinPresentation,\n type PresentedToolKind,\n type ToolBody,\n type ToolIconKind,\n type ToolPreview,\n type ToolRowPresentation,\n type WebSearchResult,\n} from \"./tool-presentation\";\nimport { isPatchFilename, PatchApplyCommand } from \"./patch-apply-command\";\nimport { mcpToolLeaf, toolDisplayName } from \"./tool-display-name\";\nimport { useOpenGeniLinkResolver } from \"../components/open-geni-links\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\n/* ----------------------------------------------------------------------------\n Per-tool renderers\n Each renderer takes one projected `ToolCallItem` and returns an `ActivityDisclosure`\n tuned for that tool's real wire shape. The defaults below populate the\n registry; the mapping is registered at the bottom of the file.\n Restraint is the rule: compact title + one quiet preview, secondary detail\n only on expand. No loud right-side badges — at most a single settle chip.\n -------------------------------------------------------------------------- */\n\nconst ICON_SIZE = \"size-3.5\";\n\n/**\n * The single in-flight locus for a running row: a pulse dot immediately left of\n * the status word, riding the preview line — NOT a detached gutter badge. The\n * title already shimmers; this keeps the live signal in one place the eye reads\n * left-to-right.\n */\nfunction RunningPreview({ children }: { children: ReactNode }) {\n const compact = useContext(CompactActivityContext);\n return (\n <span className=\"inline-flex items-center gap-1.5\">\n {!compact && (\n <span className=\"size-1.5 shrink-0 animate-og-pulse rounded-full bg-og-status-running\" />\n )}\n <span className=\"min-w-0 truncate\">{children}</span>\n </span>\n );\n}\n\n/**\n * The collapsed-row path preview. Diff magnitude is rendered as a SINGLE muted\n * \"+N −M\" glyph pair — the saturated add/del green/red is reserved exclusively\n * for the expanded DiffView gutter, so the one-line rail stays a calm, single\n * hue (the file path) with no competing colored numerics.\n */\nfunction PathPreview({\n path,\n add,\n del,\n}: {\n path: string;\n add?: number | undefined;\n del?: number | undefined;\n}) {\n return (\n <span className=\"inline-flex items-center gap-2 truncate font-og-mono\">\n <span className=\"truncate\">\n <span className=\"text-og-fg-subtle\">{pathDirname(path)}</span>\n <span className=\"text-og-fg-muted\">{pathBasename(path)}</span>\n </span>\n {add != null || del != null ? (\n <span className=\"shrink-0 text-og-fg-subtle\">\n {add != null ? `+${add}` : \"\"}\n {add != null && del != null ? \" \" : \"\"}\n {del != null ? `−${del}` : \"\"}\n </span>\n ) : null}\n </span>\n );\n}\n\n/* ---- shared-model rows ------------------------------------------------------\n exec_command, write_stdin, apply_patch, web search, request_human_input,\n run_on and the generic fallback draw their row from the renderer-neutral\n presentation model in ./tool-presentation, which non-DOM renderers share.\n -------------------------------------------------------------------------- */\n\n/**\n * The icon for a presentation kind, looked up when a row renders. A module-level\n * table would capture the icons at load time; in a bundle where this module and\n * the icon library's chunk import each other, an icon can still be undefined\n * then, and the row would render an undefined component (React #130).\n */\nfunction toolIcon(kind: ToolIconKind): LucideIcon {\n switch (kind) {\n case \"terminal\":\n return TerminalIcon;\n case \"keyboard\":\n return KeyboardIcon;\n case \"file-diff\":\n return FileDiffIcon;\n case \"search\":\n return SearchIcon;\n case \"question\":\n return MessageCircleQuestionIcon;\n case \"target\":\n return TargetIcon;\n case \"brain\":\n return BrainCircuitIcon;\n case \"sessions\":\n return MessagesSquareIcon;\n case \"server\":\n return ServerIcon;\n case \"server-cog\":\n return ServerCogIcon;\n case \"calendar\":\n return CalendarClockIcon;\n case \"panels\":\n return PanelsTopLeftIcon;\n case \"share\":\n return Share2Icon;\n case \"message\":\n return MessageSquareIcon;\n case \"git\":\n return FolderGitIcon;\n case \"box\":\n return BoxIcon;\n case \"key\":\n return KeyRoundIcon;\n case \"file-search\":\n return FileSearchIcon;\n case \"package-search\":\n return PackageSearchIcon;\n case \"plug\":\n return PlugIcon;\n case \"wrench\":\n return WrenchIcon;\n }\n}\n\nfunction presentedPreviewNode(msg: OpenGeniText, preview: ToolPreview): ReactNode {\n switch (preview.kind) {\n case \"text\":\n return preview.running ? <RunningPreview>{preview.text}</RunningPreview> : preview.text;\n case \"path\":\n return <PathPreview path={preview.path} add={preview.add} del={preview.del} />;\n case \"files\":\n return (\n <span className=\"inline-flex items-center gap-2 font-og-mono\">\n <span className=\"text-og-fg-muted\">\n {msg(\"timeline.toolRenderers.filesCount\", { count: preview.count })}\n </span>\n <span className=\"text-og-fg-subtle\">\n +{preview.add} −{preview.del}\n </span>\n </span>\n );\n case \"malformed\":\n return (\n <span className=\"inline-flex items-center gap-2 font-og-mono\">\n <span className=\"text-og-fg-muted\">{preview.name}</span>\n <span className=\"text-og-fg-subtle\">{msg(\"timeline.toolRenderers.malformedPatch\")}</span>\n </span>\n );\n }\n}\n\nfunction PresentedBody({ body }: { body: ToolBody }) {\n switch (body.kind) {\n case \"term\":\n return (\n <>\n {/* Exec rows pass command={null}: the row title already carries `$ cmd`. */}\n <TermBlock\n command={body.command}\n {...(body.workdir !== null || body.command === null ? { workdir: body.workdir } : {})}\n output={body.output}\n {...(body.live ? { live: true } : {})}\n {...(body.failed !== undefined ? { failed: body.failed } : {})}\n />\n {body.note ? <BodyNote>{body.note}</BodyNote> : null}\n </>\n );\n case \"note\":\n return body.tone ? (\n <BodyNote tone={body.tone}>{body.text}</BodyNote>\n ) : (\n <BodyNote>{body.text}</BodyNote>\n );\n case \"payloads\":\n return (\n <>\n {body.note ? <p className=\"m-0 py-1 text-og-sm text-og-fg-muted\">{body.note}</p> : null}\n {body.blocks.map((block) =>\n block.failed ? (\n <PayloadBlock key={block.label} label={block.label} value={block.value} failed />\n ) : (\n <PayloadBlock key={block.label} label={block.label} value={block.value} />\n ),\n )}\n </>\n );\n case \"patch\":\n if (body.bare) {\n return <RawPatch diff={body.files[0]?.diff ?? \"\"} />;\n }\n return (\n <>\n {body.files.map((entry) =>\n entry.file ? (\n <ToolDiff key={entry.key} files={[entry.file]} />\n ) : (\n <div key={entry.key}>\n <p className=\"mb-1 font-og-mono text-og-xs text-og-fg-muted\">{entry.path}</p>\n <RawPatch diff={entry.diff} />\n </div>\n ),\n )}\n </>\n );\n case \"web-results\":\n return <WebSearchResults results={body.results} />;\n case \"none\":\n return null;\n }\n}\n\nfunction WebSearchResults({ results }: { results: WebSearchResult[] | null }) {\n const msg = useOpenGeniText();\n const resultOccurrences = new Map<string, number>();\n const keyedResults = results?.map((result) => {\n const contentKey = `${result.domain}\\u0000${result.title}\\u0000${result.snippet}`;\n const occurrence = (resultOccurrences.get(contentKey) ?? 0) + 1;\n resultOccurrences.set(contentKey, occurrence);\n return { key: `${contentKey}\\u0000${occurrence}`, result };\n });\n if (!keyedResults || !keyedResults.length) {\n return <BodyNote>{msg(\"timeline.toolRenderers.resultsFoldedIntoModelContext\")}</BodyNote>;\n }\n return (\n <ul className=\"flex flex-col gap-2\">\n {keyedResults.map(({ key, result }) => (\n <li key={key} className=\"flex gap-2.5\">\n <GlobeIcon className=\"mt-0.5 size-3.5 shrink-0 text-og-fg-subtle\" />\n <div className=\"min-w-0\">\n <p className=\"truncate text-og-base text-og-fg\">\n {result.title} <span className=\"text-og-fg-subtle\">{result.domain}</span>\n </p>\n <p className=\"text-og-sm leading-5 text-og-fg-muted\">{result.snippet}</p>\n </div>\n </li>\n ))}\n </ul>\n );\n}\n\n/** Draw one shared-model row with the web disclosure primitives. */\nfunction PresentedToolRow({\n presentation,\n item,\n logo = null,\n}: {\n presentation: ToolRowPresentation;\n /** The call the row presents; plain tool details reduce the row from it. */\n item: ToolCallItem;\n /** A connector's logo, drawn in place of the row's icon. */\n logo?: string | null;\n}) {\n const msg = useOpenGeniText();\n const computeLabel = useTimelineComputeLabel();\n const p =\n useToolDetails() === \"plain\"\n ? plainToolRow(msg, item, presentation, { computeLabel })\n : presentation;\n const Icon = toolIcon(p.icon);\n return (\n <ActivityDisclosure\n icon={<ConnectorLogoIcon src={logo} fallback={<Icon className={ICON_SIZE} />} />}\n iconTone={p.iconTone}\n // A chip inside the row's own toggle never links.\n title={<SecretRefText text={p.title} linkable={false} />}\n {...(p.titleMono ? { titleMono: true } : {})}\n {...(p.running ? { running: true } : {})}\n {...(p.chip ? { chip: p.chip } : {})}\n {...(p.failed !== undefined ? { failed: p.failed } : {})}\n {...(p.cancelled !== undefined ? { cancelled: p.cancelled } : {})}\n preview={p.preview ? presentedPreviewNode(msg, p.preview) : undefined}\n expandable={p.body.kind !== \"none\"}\n >\n <PresentedBody body={p.body} />\n </ActivityDisclosure>\n );\n}\n\nfunction ExecRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const computeLabel = useTimelineComputeLabel();\n return (\n <PresentedToolRow presentation={execPresentation(msg, item, { computeLabel })} item={item} />\n );\n}\n\nfunction WriteStdinRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n return <PresentedToolRow presentation={writeStdinPresentation(msg, item)} item={item} />;\n}\n\nfunction ApplyPatchRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const presentation = applyPatchPresentation(msg, item);\n return presentation ? (\n <PresentedToolRow presentation={presentation} item={item} />\n ) : (\n <GenericRenderer item={item} />\n );\n}\n\nfunction WebSearchRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n return <PresentedToolRow presentation={webSearchPresentation(msg, item)} item={item} />;\n}\n\nfunction AskRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n return <PresentedToolRow presentation={askPresentation(msg, item)} item={item} />;\n}\n\nfunction RunOnRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n return <PresentedToolRow presentation={runOnPresentation(msg, item)} item={item} />;\n}\n\n/**\n * Finding machines, moving onto one and back, and using its screen. A look at\n * the screen, or an action on it, shows the screenshot it took.\n */\nfunction MachineRenderer({ item, loadRetainedScreenshot }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const presentation = machinePresentation(msg, item);\n const retained = mcpToolLeaf(item.name).startsWith(\"computer_\")\n ? retainedScreenshotMetadata(item.output)\n : null;\n if (!retained?.available) return <PresentedToolRow presentation={presentation} item={item} />;\n return (\n <RetainedSessionImageDisclosure\n artifact={retained}\n load={loadRetainedScreenshot}\n title={presentation.title}\n caption={presentation.title}\n noun=\"screenshot\"\n icon={<CameraIcon className={ICON_SIZE} />}\n lightboxLabel={msg(\"timeline.toolRenderers.screenshot\")}\n batched={null}\n failed={item.status === \"failed\"}\n cancelled={item.status === \"cancelled\"}\n />\n );\n}\n\n/**\n * Baseline craft for unmatched tools: family icon + title-cased leaf + honest\n * status preview (Running… / Done / error snippet). No argument-field sniffing —\n * JSON stays in the expandable body only.\n *\n * A tool the shared presenter knows but no dedicated renderer claims (screen\n * steps such as `cua_get_desktop_state`, `interaction_discover`) still reads\n * the way the presenter words it, so the web row and other renderers agree.\n */\nfunction UnreviewedGenericRenderer({ item, loadRetainedScreenshot }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const details = useToolDetails();\n const logo = useToolConnectorLogo(item.display);\n const { images, output } = retainedToolResultImages(item.output);\n if (images.length === 0 || item.status === \"running\") {\n return (\n <PresentedToolRow presentation={toolRowPresentation(msg, item)} item={item} logo={logo} />\n );\n }\n // A tool that returned images shows them like a viewed image, with its\n // ordinary result text (and any further images) in the expanded body.\n const presentation = toolRowPresentation(msg, { ...item, output }, { details });\n const Icon = toolIcon(presentation.icon);\n const [first, ...rest] = images;\n return (\n <RetainedSessionImageDisclosure\n artifact={first!}\n load={loadRetainedScreenshot}\n title={presentation.title}\n caption={presentation.title}\n noun=\"image\"\n icon={<ConnectorLogoIcon src={logo} fallback={<Icon className={ICON_SIZE} />} />}\n lightboxLabel={presentation.title}\n batched={null}\n failed={presentation.failed ?? false}\n cancelled={presentation.cancelled ?? false}\n >\n <PresentedBody body={presentation.body} />\n {rest.map((image, index) => (\n <RetainedSessionImageDisclosure\n key={image.artifactId}\n artifact={image}\n load={loadRetainedScreenshot}\n title={msg(\"timeline.toolRenderers.imageIndex\", { index: index + 2 })}\n caption={`${presentation.title}, image ${index + 2}`}\n noun=\"image\"\n icon={<ImageIcon className={ICON_SIZE} />}\n lightboxLabel={presentation.title}\n batched={null}\n failed={false}\n cancelled={false}\n />\n ))}\n </RetainedSessionImageDisclosure>\n );\n}\n\n/* ---- computer_call --------------------------------------------------------- */\n\ntype ComputerAction = {\n type?: string;\n x?: number;\n y?: number;\n text?: string;\n keys?: string[];\n button?: string;\n};\n\nfunction computerVerb(msg: OpenGeniText, action: ComputerAction | undefined): string {\n if (!action || !action.type) {\n return msg(\"timeline.toolRenderers.acted\");\n }\n switch (action.type) {\n case \"screenshot\":\n return msg(\"timeline.toolRenderers.screenshot\");\n case \"click\":\n return msg(\"timeline.toolRenderers.clickedXY\", { x: action.x, y: action.y });\n case \"double_click\":\n return msg(\"timeline.toolRenderers.doubleClickedXY\", { x: action.x, y: action.y });\n case \"move\":\n return msg(\"timeline.toolRenderers.movedXY\", { x: action.x, y: action.y });\n case \"scroll\":\n return msg(\"timeline.toolRenderers.scrolled\");\n case \"type\": {\n const t = action.text ?? \"\";\n return msg(\"timeline.toolRenderers.typedSliceValue\", {\n slice: t.slice(0, 28),\n value: t.length > 28 ? \"…\" : \"\",\n });\n }\n case \"keypress\":\n return msg(\"timeline.toolRenderers.pressedJoin\", { join: (action.keys ?? []).join(\"+\") });\n case \"drag\":\n return msg(\"timeline.toolRenderers.dragged\");\n case \"wait\":\n return msg(\"timeline.toolRenderers.waited\");\n default:\n return action.type;\n }\n}\n\n/** Coerce a function-tool arguments payload into the ComputerAction fields. */\nfunction asComputerArgs(args: unknown): Partial<ComputerAction> {\n if (!args) {\n return {};\n }\n const parsed = typeof args === \"string\" ? tryParseJson(args) : args;\n if (!parsed || typeof parsed !== \"object\") {\n return {};\n }\n const record = parsed as Record<string, unknown>;\n return {\n ...(typeof record.x === \"number\" ? { x: record.x } : {}),\n ...(typeof record.y === \"number\" ? { y: record.y } : {}),\n ...(typeof record.text === \"string\" ? { text: record.text } : {}),\n ...(Array.isArray(record.keys) ? { keys: record.keys as string[] } : {}),\n ...(typeof record.button === \"string\" ? { button: record.button } : {}),\n };\n}\n\nfunction ComputerCallRenderer({ item, loadRetainedScreenshot }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const raw = (item.raw ?? {}) as {\n action?: ComputerAction;\n actions?: ComputerAction[];\n providerData?: { approvalStatus?: string };\n };\n // Function-mode computer tools (computer_screenshot / computer_click / …,\n // used on codex + chat-wire providers since the explicit tool-transport\n // change) carry the action in the tool NAME + arguments instead of raw.action.\n // Normalize them into the same ComputerAction shape so one renderer serves\n // every transport.\n const functionAction: ComputerAction | undefined =\n !raw.action && item.name.startsWith(\"computer_\") && item.name !== \"computer_call\"\n ? {\n type: item.name.slice(\"computer_\".length),\n ...asComputerArgs(item.arguments),\n }\n : undefined;\n const action = raw.action ?? functionAction;\n const actions = raw.actions ?? (action ? [action] : []);\n const verb = computerVerb(msg, action);\n const out = item.output;\n const running = item.status === \"running\";\n const rejected = raw.providerData?.approvalStatus === \"rejected\";\n const readOnly = typeof out === \"string\" && out.includes(\"read-only\");\n const shotUrl = screenshotDataUrl(out);\n const retained = retainedScreenshotMetadata(out);\n const omittedMedia = mediaPreviewFact(out);\n const empty = out === \"\" || out == null;\n const batched = actions.length > 1 ? actions.map((a) => computerVerb(msg, a)).join(\" · \") : null;\n // Fold the batched-action count into the title (one media affordance per row),\n // rather than a separate \"+N more\" mono label competing beside the thumbnail.\n const countSuffix = actions.length > 1 ? ` ·${actions.length}` : \"\";\n const isShot = action?.type === \"screenshot\";\n\n if (running) {\n return (\n <ActivityDisclosure\n icon={\n isShot ? (\n <CameraIcon className={ICON_SIZE} />\n ) : (\n <MousePointer2Icon className={ICON_SIZE} />\n )\n }\n iconTone=\"running\"\n title={verb}\n running\n media={<MediaSkeleton />}\n >\n <BodyNote>{msg(\"timeline.toolRenderers.capturingFrame\")}</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n if (readOnly) {\n return (\n <ActivityDisclosure\n icon={<MousePointer2Icon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={verb}\n chip={{ tone: \"bad\", text: \"read-only\" }}\n preview=\"write actions disabled\"\n >\n <BodyNote tone=\"error\">{msg(\"timeline.toolRenderers.computerUseIsReadOnly\")}</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n if (rejected) {\n return (\n <ActivityDisclosure\n icon={<LockIcon className={ICON_SIZE} />}\n iconTone=\"muted\"\n title={verb}\n preview={msg(\"timeline.toolRenderers.approvalRejectedThisActionDid2\")}\n >\n <BodyNote>{msg(\"timeline.toolRenderers.approvalRejectedThisActionDid\")}</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n const isFailed = item.status === \"failed\";\n const isCancelled = item.status === \"cancelled\";\n\n if (retained) {\n if (!retained.available) {\n const state =\n retained.reason === \"expired\" || retained.reason === \"deleted\"\n ? retained.reason\n : \"unavailable\";\n return (\n <ActivityDisclosure\n icon={<CameraOffIcon className={ICON_SIZE} />}\n iconTone={isFailed ? \"failed\" : \"muted\"}\n title={`${verb}${countSuffix} · ${state}`}\n failed={isFailed}\n cancelled={isCancelled}\n preview={`screenshot ${state}`}\n media={<MediaEmpty />}\n >\n <BodyNote tone={isFailed ? \"error\" : undefined}>\n {msg(\"timeline.toolRenderers.screenshotStateReplaceall\", {\n state,\n replaceAll: retained.reason.replaceAll(\"_\", \" \"),\n })}\n </BodyNote>\n </ActivityDisclosure>\n );\n }\n return (\n <RetainedSessionImageDisclosure\n artifact={retained}\n load={loadRetainedScreenshot}\n title={`${verb}${countSuffix}`}\n caption={`${verb}${countSuffix}`}\n noun=\"screenshot\"\n icon={<CameraIcon className={ICON_SIZE} />}\n lightboxLabel={msg(\"timeline.toolRenderers.screenshot\")}\n batched={batched}\n failed={isFailed}\n cancelled={isCancelled}\n />\n );\n }\n\n if (shotUrl) {\n const caption = `${verb}${actions.length > 1 ? ` (+${actions.length - 1} more)` : \"\"}`;\n return (\n <ActivityDisclosure\n icon={\n isShot ? (\n <CameraIcon className={ICON_SIZE} />\n ) : (\n <MousePointer2Icon className={ICON_SIZE} />\n )\n }\n iconTone={isFailed ? \"failed\" : \"accent\"}\n title={`${verb}${countSuffix}`}\n failed={isFailed}\n cancelled={isCancelled}\n media={<Thumbnail src={shotUrl} caption={caption} />}\n >\n <ScreenshotFigure src={shotUrl} caption={caption} />\n {batched ? (\n <BodyNote>{msg(\"timeline.toolRenderers.batchedBatched\", { batched })}</BodyNote>\n ) : null}\n </ActivityDisclosure>\n );\n }\n\n if (omittedMedia) {\n return (\n <ActivityDisclosure\n icon={<CameraOffIcon className={ICON_SIZE} />}\n iconTone={isFailed ? \"failed\" : \"muted\"}\n title={msg(\"timeline.toolRenderers.verbCountsuffixImageOmittedNot\", { verb, countSuffix })}\n failed={isFailed}\n cancelled={isCancelled}\n preview={msg(\"timeline.toolRenderers.inlineImageOmittedNotRetained\")}\n media={<MediaEmpty />}\n >\n <BodyNote>\n {msg(\"timeline.toolRenderers.theInlineMediatypeOutputWas\", {\n mediaType: omittedMedia.mediaType,\n })}\n </BodyNote>\n {batched ? (\n <BodyNote>{msg(\"timeline.toolRenderers.batchedBatched\", { batched })}</BodyNote>\n ) : null}\n </ActivityDisclosure>\n );\n }\n\n if (empty) {\n return (\n <ActivityDisclosure\n icon={<CameraOffIcon className={ICON_SIZE} />}\n iconTone={isFailed ? \"failed\" : \"muted\"}\n title={verb}\n failed={isFailed}\n cancelled={isCancelled}\n media={<MediaEmpty />}\n >\n <BodyNote>\n {isFailed\n ? msg(\"timeline.toolRenderers.computerCallFailedNoImage\")\n : isCancelled\n ? msg(\"timeline.toolRenderers.computerCallInterruptedNoImage\")\n : msg(\"timeline.toolRenderers.noImageTheSessionReturned\")}\n </BodyNote>\n </ActivityDisclosure>\n );\n }\n\n // a non-screenshot action whose output is not an image (click/keypress)\n return (\n <ActivityDisclosure\n icon={<MousePointer2Icon className={ICON_SIZE} />}\n iconTone={isFailed ? \"failed\" : \"accent\"}\n title={verb}\n failed={isFailed}\n cancelled={isCancelled}\n preview={batched ?? undefined}\n expandable={batched != null}\n >\n {batched ? <BodyNote>{batched}</BodyNote> : null}\n </ActivityDisclosure>\n );\n}\n\n/** Browser tool images share authenticated screenshot loading, with their own media kind. */\nfunction BrowserScreenshotRenderer(props: ToolRendererProps) {\n const msg = useOpenGeniText();\n const { item, loadRetainedScreenshot } = props;\n const leaf = mcpToolLeaf(item.name);\n const title =\n leaf === \"browser_observe\"\n ? msg(\"timeline.toolRenderers.observedBrowser\")\n : leaf === \"browser_act\"\n ? msg(\"timeline.toolRenderers.usedBrowser\")\n : msg(\"timeline.toolRenderers.browserScreenshot\");\n const retained = retainedScreenshotMetadata(item.output);\n const isFailed = item.status === \"failed\";\n const isCancelled = item.status === \"cancelled\";\n\n if (item.status === \"running\" && leaf === \"browser_screenshot\") {\n return (\n <ActivityDisclosure\n icon={<CameraIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={title}\n running\n media={<MediaSkeleton />}\n >\n <BodyNote>{msg(\"timeline.toolRenderers.capturingFrame\")}</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n if (!retained) return <GenericRenderer {...props} />;\n if (!retained.available) {\n const state =\n retained.reason === \"expired\" || retained.reason === \"deleted\"\n ? retained.reason\n : \"unavailable\";\n return (\n <ActivityDisclosure\n icon={<CameraOffIcon className={ICON_SIZE} />}\n iconTone={isFailed ? \"failed\" : \"muted\"}\n title={`${title} · ${state}`}\n failed={isFailed}\n cancelled={isCancelled}\n preview={`screenshot ${state}`}\n media={<MediaEmpty />}\n >\n <BodyNote tone={isFailed ? \"error\" : undefined}>\n {msg(\"timeline.toolRenderers.screenshotStateReplaceall\", {\n state,\n replaceAll: retained.reason.replaceAll(\"_\", \" \"),\n })}\n </BodyNote>\n </ActivityDisclosure>\n );\n }\n return (\n <RetainedSessionImageDisclosure\n artifact={retained}\n load={loadRetainedScreenshot}\n title={title}\n caption={title}\n noun=\"screenshot\"\n icon={<CameraIcon className={ICON_SIZE} />}\n lightboxLabel={msg(\"timeline.toolRenderers.browserScreenshot\")}\n batched={null}\n failed={isFailed}\n cancelled={isCancelled}\n />\n );\n}\n\ntype RetainedSessionImageDisclosureProps = {\n artifact: RetainedArtifactReference;\n load: ToolRendererProps[\"loadRetainedArtifact\"];\n title: string;\n caption: string;\n noun: \"image\" | \"screenshot\";\n icon: ReactNode;\n lightboxLabel: string;\n batched: string | null;\n failed: boolean;\n cancelled: boolean;\n filename?: string;\n defaultOpen?: boolean;\n children?: ReactNode;\n};\n\nfunction RetainedSessionImageDisclosure(props: RetainedSessionImageDisclosureProps) {\n const compact = useContext(CompactActivityContext);\n // The rolling progress label has no screenshot loader by design. Do not run\n // the full image hook there: it would report the missing loader as an error.\n if (compact) {\n return (\n <ActivityDisclosure\n icon={props.icon}\n title={props.title}\n compactPreview={null}\n failed={props.failed}\n cancelled={props.cancelled}\n />\n );\n }\n return <LoadedRetainedSessionImageDisclosure {...props} />;\n}\n\nfunction LoadedRetainedSessionImageDisclosure({\n artifact,\n load,\n title,\n caption,\n noun,\n icon,\n lightboxLabel,\n batched,\n failed,\n cancelled,\n filename,\n defaultOpen,\n children,\n}: RetainedSessionImageDisclosureProps) {\n const msg = useOpenGeniText();\n const state = useRetainedImageObjectUrl(artifact, load);\n const downloadFilename = filename ?? retainedImageFilename(artifact);\n const figure = {\n src: state.kind === \"ready\" ? state.url : \"\",\n caption,\n alt: caption,\n expandLabel: msg(\"timeline.toolRenderers.expandNoun\", { noun }),\n lightboxLabel,\n downloadFilename,\n };\n\n return (\n <ActivityDisclosure\n icon={icon}\n iconTone={failed ? \"failed\" : state.kind === \"ready\" ? \"accent\" : \"muted\"}\n title={title}\n defaultOpen={defaultOpen}\n failed={failed}\n cancelled={cancelled}\n preview={\n state.kind === \"loading\"\n ? msg(\"timeline.toolRenderers.loadingRetainedNoun\", { noun })\n : state.kind === \"error\"\n ? msg(\"timeline.toolRenderers.nounRetrievalFailed\", { noun })\n : state.kind === \"unavailable\"\n ? `${noun} ${state.label}`\n : undefined\n }\n media={\n state.kind === \"ready\" ? (\n <Thumbnail {...figure} />\n ) : state.kind === \"loading\" ? (\n <MediaSkeleton />\n ) : (\n <MediaEmpty />\n )\n }\n >\n {state.kind === \"ready\" ? (\n <ScreenshotFigure {...figure} showCaption={caption !== title} />\n ) : state.kind === \"loading\" ? (\n <BodyNote>{msg(\"timeline.toolRenderers.loadingTheRetainedNoun\", { noun })}</BodyNote>\n ) : state.kind === \"unavailable\" ? (\n <BodyNote>\n {noun === \"screenshot\"\n ? msg(\"timeline.toolRenderers.screenshot\")\n : msg(\"timeline.toolRenderers.image\")}{\" \"}\n {state.label}.\n </BodyNote>\n ) : (\n <ImageRetrievalError noun={noun} retry={state.retry} />\n )}\n {batched ? (\n <BodyNote>{msg(\"timeline.toolRenderers.batchedBatched\", { batched })}</BodyNote>\n ) : null}\n {children}\n </ActivityDisclosure>\n );\n}\n\nfunction ImageRetrievalError({ noun = \"image\", retry }: { noun?: string; retry: () => void }) {\n const msg = useOpenGeniText();\n return (\n <BodyNote tone=\"error\">\n {noun === \"screenshot\"\n ? msg(\"timeline.toolRenderers.screenshot\")\n : msg(\"timeline.toolRenderers.image\")}{\" \"}\n {msg(\"timeline.toolRenderers.retrievalFailed\")}{\" \"}\n <button\n type=\"button\"\n aria-label={msg(\"timeline.toolRenderers.retryNounRetrieval\", { noun })}\n onClick={retry}\n className=\"underline underline-offset-2\"\n >\n {msg(\"timeline.toolRenderers.retry\")}\n </button>\n </BodyNote>\n );\n}\n\nfunction GeneratedImageRenderer({ item, loadRetainedArtifact }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const args = parseToolArgs(item.arguments);\n const prompt = typeof args.prompt === \"string\" ? args.prompt : \"\";\n const raw =\n item.raw && typeof item.raw === \"object\" && !Array.isArray(item.raw)\n ? (item.raw as Record<string, unknown>)\n : null;\n // Function tools settle through agent.toolCall.output; OpenAI's hosted image\n // call is already complete on agent.toolCall.created and carries the compact\n // receipt in raw.output. Both paths deliberately converge on one renderer.\n const receipt = generatedImageReceipt(item.output) ?? generatedImageReceipt(raw?.output);\n if (item.status === \"running\") {\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={msg(\"timeline.toolRenderers.generatingImage\")}\n running\n preview={\n <RunningPreview>\n {truncatePreview(prompt, 72) || msg(\"timeline.toolRenderers.creating\")}\n </RunningPreview>\n }\n media={<MediaSkeleton />}\n >\n {prompt ? <BodyNote>{prompt}</BodyNote> : null}\n </ActivityDisclosure>\n );\n }\n if (!receipt) return <GenericRenderer item={item} />;\n return (\n <GeneratedImageDisclosure\n receipt={receipt}\n load={loadRetainedArtifact}\n prompt={prompt}\n failed={item.status === \"failed\"}\n cancelled={item.status === \"cancelled\"}\n />\n );\n}\n\nfunction GeneratedVideoRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const args = parseToolArgs(item.arguments);\n const prompt = typeof args.prompt === \"string\" ? args.prompt : \"\";\n const parsedOutput = typeof item.output === \"string\" ? tryParseJson(item.output) : item.output;\n const accepted =\n parsedOutput &&\n typeof parsedOutput === \"object\" &&\n !Array.isArray(parsedOutput) &&\n (parsedOutput as Record<string, unknown>).status === \"accepted\";\n const failed = item.status === \"failed\";\n const cancelled = item.status === \"cancelled\";\n const running = item.status === \"running\";\n return (\n <ActivityDisclosure\n icon={<VideoIcon className={ICON_SIZE} />}\n iconTone={failed ? \"failed\" : running ? \"running\" : accepted ? \"accent\" : \"muted\"}\n title={\n running\n ? msg(\"timeline.toolRenderers.startingVideoGeneration\")\n : accepted\n ? msg(\"timeline.toolRenderers.generatingVideo\")\n : msg(\"timeline.toolRenderers.generateVideo\")\n }\n running={running}\n failed={failed}\n cancelled={cancelled}\n preview={\n truncatePreview(prompt, 88) ||\n (accepted ? msg(\"timeline.toolRenderers.requestAccepted\") : undefined)\n }\n >\n {prompt ? <BodyNote>{prompt}</BodyNote> : null}\n {accepted ? (\n <BodyNote>{msg(\"timeline.toolRenderers.theVideoWillAppearHere\")}</BodyNote>\n ) : item.output !== undefined ? (\n <PayloadBlock label={msg(\"timeline.toolRenderers.output\")} value={item.output} />\n ) : null}\n </ActivityDisclosure>\n );\n}\nfunction SandboxFilePublishRenderer({ item, loadRetainedArtifact }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const plain = useToolDetails() === \"plain\";\n const { text: output, isError } = unwrapMcpOutput(item.output);\n const receipt = parseSandboxFileArtifactReceipt(output);\n const [downloadState, setDownloadState] = useState<\"idle\" | \"loading\" | \"error\">(\"idle\");\n if (item.status === \"running\") {\n return (\n <ActivityDisclosure\n icon={<DownloadIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={msg(\"timeline.toolRenderers.publishingFile\")}\n running\n preview={\n <RunningPreview>{msg(\"timeline.toolRenderers.retainingWorkspaceBytes\")}</RunningPreview>\n }\n />\n );\n }\n if (!receipt || isError || item.status === \"failed\") {\n return <GenericRenderer item={item} />;\n }\n\n // The closed SDK receipt has already checked the workspace-qualified route.\n const workspaceId = /^\\/v1\\/workspaces\\/([0-9a-f-]+)\\/artifacts\\//.exec(\n receipt.artifact.retrieval.path,\n )?.[1];\n const openLink = workspaceId ? (\n <a\n href={`/workspaces/${workspaceId}/artifacts/files/${receipt.artifact.artifactId}`}\n aria-label={msg(\"timeline.toolRenderers.openFilenameInArtifacts\", {\n filename: receipt.filename,\n })}\n className=\"inline-flex min-h-7 items-center rounded-og-sm px-2 text-og-sm font-medium text-og-accent-strong hover:bg-og-surface-2 hover:underline focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:min-h-10\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n >\n {msg(\"timeline.toolRenderers.openInArtifacts\")}\n </a>\n ) : null;\n\n const download = async () => {\n if (!loadRetainedArtifact) {\n setDownloadState(\"error\");\n return;\n }\n setDownloadState(\"loading\");\n let objectUrl: string | null = null;\n try {\n const source = await loadRetainedArtifact(receipt.artifact, new AbortController().signal);\n if (!source) throw new Error(\"artifact unavailable\");\n const url =\n source instanceof Uint8Array\n ? (objectUrl = URL.createObjectURL(\n new Blob([source as unknown as BlobPart], {\n type: receipt.artifact.contentType,\n }),\n ))\n : source.url;\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = receipt.filename;\n anchor.rel = \"noopener\";\n anchor.click();\n setDownloadState(\"idle\");\n } catch {\n setDownloadState(\"error\");\n } finally {\n const urlToRevoke = objectUrl;\n if (urlToRevoke) setTimeout(() => URL.revokeObjectURL(urlToRevoke), 0);\n }\n };\n\n const downloadButton = (\n <button\n type=\"button\"\n onClick={() => void download()}\n disabled={downloadState === \"loading\"}\n className=\"inline-flex items-center gap-1.5 rounded-og-sm border border-og-border px-2.5 py-1.5 text-og-sm font-medium text-og-fg transition-colors hover:border-og-border-strong hover:bg-og-surface-2 disabled:cursor-wait disabled:opacity-60\"\n >\n <DownloadIcon className=\"size-3.5\" />\n {downloadState === \"loading\"\n ? msg(\"timeline.toolRenderers.preparing\")\n : downloadState === \"error\"\n ? msg(\"timeline.toolRenderers.retryDownload\")\n : msg(\"timeline.toolRenderers.download\")}\n </button>\n );\n\n if (isRetainedImageContentType(receipt.artifact.contentType)) {\n return (\n <RetainedSessionImageDisclosure\n artifact={receipt.artifact}\n load={loadRetainedArtifact}\n title={msg(\"timeline.toolRenderers.publishedFilename\", { filename: receipt.filename })}\n caption={receipt.filename}\n noun=\"image\"\n icon={<ImageIcon className={ICON_SIZE} />}\n lightboxLabel={msg(\"timeline.toolRenderers.image\")}\n batched={null}\n failed={false}\n cancelled={false}\n filename={receipt.filename}\n defaultOpen\n >\n {downloadButton}\n {openLink}\n </RetainedSessionImageDisclosure>\n );\n }\n\n return (\n <ActivityDisclosure\n icon={<DownloadIcon className={ICON_SIZE} />}\n iconTone=\"accent\"\n title={msg(\"timeline.toolRenderers.publishedFilename\", { filename: receipt.filename })}\n defaultOpen\n preview={formatBytes(receipt.artifact.originalBytes)}\n >\n {downloadButton}\n {openLink}\n {plain ? null : isPatchFilename(receipt.filename) ? (\n <PatchApplyCommand\n artifact={receipt.artifact}\n filename={receipt.filename}\n load={loadRetainedArtifact}\n />\n ) : null}\n </ActivityDisclosure>\n );\n}\n\ntype PublishedSiteReceipt = {\n workspaceId: string;\n artifactId: string;\n title: string;\n revision: number;\n replayed: boolean;\n};\n\nfunction publishedSiteReceipt(output: unknown): PublishedSiteReceipt | null {\n const { text, isError } = unwrapMcpOutput(output);\n if (isError) return null;\n const parsed = tryParseJson(text);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return null;\n const artifact = (parsed as Record<string, unknown>).artifact;\n const version = (parsed as Record<string, unknown>).version;\n if (\n !artifact ||\n typeof artifact !== \"object\" ||\n Array.isArray(artifact) ||\n !version ||\n typeof version !== \"object\" ||\n Array.isArray(version)\n ) {\n return null;\n }\n const artifactRecord = artifact as Record<string, unknown>;\n const versionRecord = version as Record<string, unknown>;\n if (\n typeof artifactRecord.workspaceId !== \"string\" ||\n typeof artifactRecord.id !== \"string\" ||\n typeof artifactRecord.title !== \"string\" ||\n typeof versionRecord.revision !== \"number\" ||\n !Number.isInteger(versionRecord.revision) ||\n versionRecord.revision < 1\n ) {\n return null;\n }\n return {\n workspaceId: artifactRecord.workspaceId,\n artifactId: artifactRecord.id,\n title: artifactRecord.title,\n revision: versionRecord.revision,\n replayed: (parsed as Record<string, unknown>).replayed === true,\n };\n}\n\nconst SITE_OPEN_CLASS =\n \"inline-flex min-h-7 items-center rounded-og-sm px-2 text-og-sm font-medium text-og-accent-strong hover:bg-og-surface-2 hover:underline focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent pointer-coarse:min-h-10\";\n\nfunction SiteOpenLink({ receipt }: { receipt: PublishedSiteReceipt }) {\n const msg = useOpenGeniText();\n const [pending, setPending] = useState(false);\n const [failed, setFailed] = useState(false);\n // The console route only exists in the Opengeni console; a host decides.\n const resolution = useOpenGeniLinkResolver()?.({\n kind: \"site\",\n artifactId: receipt.artifactId,\n workspaceId: receipt.workspaceId,\n });\n const destination = resolution?.href ? defaultUrlTransform(resolution.href) : \"\";\n if (destination) {\n return (\n <a\n href={destination}\n aria-label={msg(\"timeline.toolRenderers.openTitle\", { title: receipt.title })}\n className={SITE_OPEN_CLASS}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n >\n {msg(\"timeline.toolRenderers.open\")}\n </a>\n );\n }\n if (resolution?.open) {\n const open = resolution.open;\n return (\n <button\n type=\"button\"\n aria-label={msg(\"timeline.toolRenderers.openTitle\", { title: receipt.title })}\n aria-busy={pending}\n disabled={pending}\n className={SITE_OPEN_CLASS}\n onClick={(event) => {\n event.stopPropagation();\n if (pending) return;\n setPending(true);\n setFailed(false);\n void Promise.resolve()\n .then(open)\n .catch(() => setFailed(true))\n .finally(() => setPending(false));\n }}\n onKeyDown={(event) => event.stopPropagation()}\n >\n {pending\n ? msg(\"timeline.toolRenderers.opening\")\n : failed\n ? msg(\"timeline.toolRenderers.retryOpen\")\n : msg(\"timeline.toolRenderers.open\")}\n </button>\n );\n }\n return null;\n}\n\nfunction SiteArtifactRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const leaf = mcpToolLeaf(item.name);\n const publishingExisting = leaf === \"artifacts_publish\";\n if (item.status === \"running\") {\n return (\n <ActivityDisclosure\n icon={<PanelsTopLeftIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={\n publishingExisting\n ? msg(\"timeline.toolRenderers.publishingSiteUpdate\")\n : msg(\"timeline.toolRenderers.publishingSite\")\n }\n running\n preview={\n <RunningPreview>\n {msg(\"timeline.toolRenderers.retainingSourceAndCompiledHtml\")}\n </RunningPreview>\n }\n />\n );\n }\n const receipt = publishedSiteReceipt(item.output);\n if (!receipt || item.status === \"failed\") return <GenericRenderer item={item} />;\n return (\n <ActivityDisclosure\n icon={<PanelsTopLeftIcon className={ICON_SIZE} />}\n iconTone=\"accent\"\n title={\n publishingExisting\n ? msg(\"timeline.toolRenderers.updatedTitle\", { title: receipt.title })\n : msg(\"timeline.toolRenderers.publishedTitle\", { title: receipt.title })\n }\n media={<SiteOpenLink receipt={receipt} />}\n >\n <BodyNote>\n {msg(\"timeline.toolRenderers.versionRevisionIsLive\", { revision: receipt.revision })}\n {receipt.replayed\n ? ` ${msg(\"timeline.toolRenderers.replayedFromTheOriginalPublication\")}`\n : \".\"}\n </BodyNote>\n </ActivityDisclosure>\n );\n}\n\nfunction GeneratedImageDisclosure({\n receipt,\n load,\n prompt,\n failed,\n cancelled,\n}: {\n receipt: NonNullable<ReturnType<typeof generatedImageReceipt>>;\n load: ToolRendererProps[\"loadRetainedArtifact\"];\n prompt: string;\n failed: boolean;\n cancelled: boolean;\n}) {\n const msg = useOpenGeniText();\n const state = useRetainedImageObjectUrl(receipt.artifact, load);\n const dimensions = receipt.artifact.dimensions!;\n const title = failed\n ? msg(\"timeline.toolRenderers.imageGenerationFailed\")\n : msg(\"timeline.toolRenderers.generatedImage\");\n const caption =\n prompt ||\n msg(\"timeline.toolRenderers.generatedImageWidthHeight\", {\n width: dimensions.width,\n height: dimensions.height,\n });\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone={failed ? \"failed\" : state.kind === \"ready\" ? \"accent\" : \"muted\"}\n title={title}\n defaultOpen={!failed && !cancelled}\n failed={failed}\n cancelled={cancelled}\n preview={\n state.kind === \"loading\"\n ? msg(\"timeline.toolRenderers.loadingImage\")\n : state.kind === \"error\"\n ? msg(\"timeline.toolRenderers.imageRetrievalFailed\")\n : state.kind === \"unavailable\"\n ? `image ${state.label}`\n : truncatePreview(prompt, 88) || `${dimensions.width}×${dimensions.height}`\n }\n media={\n state.kind === \"ready\" ? (\n <Thumbnail\n src={state.url}\n caption={caption}\n alt={caption}\n expandLabel={msg(\"timeline.toolRenderers.expandGeneratedImage\")}\n lightboxLabel={msg(\"timeline.toolRenderers.generatedImage\")}\n />\n ) : state.kind === \"loading\" ? (\n <MediaSkeleton />\n ) : (\n <MediaEmpty />\n )\n }\n >\n {state.kind === \"ready\" ? (\n <ScreenshotFigure\n src={state.url}\n caption={caption}\n alt={caption}\n expandLabel={msg(\"timeline.toolRenderers.expandGeneratedImage\")}\n lightboxLabel={msg(\"timeline.toolRenderers.generatedImage\")}\n />\n ) : state.kind === \"loading\" ? (\n <BodyNote>{msg(\"timeline.toolRenderers.loadingTheGeneratedImage\")}</BodyNote>\n ) : state.kind === \"unavailable\" ? (\n <BodyNote>{msg(\"timeline.toolRenderers.imageLabel\", { label: state.label })}</BodyNote>\n ) : (\n <ImageRetrievalError retry={state.retry} />\n )}\n <BodyNote>\n {dimensions.width}×{dimensions.height} · {receipt.sandboxPath}\n </BodyNote>\n </ActivityDisclosure>\n );\n}\n\nfunction retainedImageFilename(artifact: RetainedArtifactReference): string {\n const extension =\n artifact.contentType === \"image/jpeg\"\n ? \"jpg\"\n : artifact.contentType === \"image/webp\"\n ? \"webp\"\n : \"png\";\n return `${artifact.kind}-${artifact.artifactId}.${extension}`;\n}\n\n/* ---- web_search ------------------------------------------------------------ */\n\n/* ---- view_image ------------------------------------------------------------ */\n\n// Fragments of the tool's own (English) error output; matched, never displayed.\nconst VIEW_IMAGE_ERRORS = (msg: OpenGeniText) => [\n msg(\"timeline.toolRenderers.wasNotFound\"),\n msg(\"timeline.toolRenderers.isNotAFile\"),\n msg(\"timeline.toolRenderers.exceededTheAllowedSize\"),\n msg(\"timeline.toolRenderers.isNotASupportedImage\"),\n msg(\"timeline.toolRenderers.unableToReadImage\"),\n];\n\nfunction ViewImageRenderer({ item, loadRetainedScreenshot }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const args = parseToolArgs(item.arguments);\n const path = typeof args.path === \"string\" ? args.path : \"\";\n const out = item.output;\n const text = typeof out === \"string\" ? out : \"\";\n const retained = retainedScreenshotMetadata(out);\n const omittedMedia = mediaPreviewFact(out);\n\n if (item.status === \"running\") {\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={msg(\"timeline.toolRenderers.viewPathbasename\", { pathBasename: pathBasename(path) })}\n running\n preview={<RunningPreview>{msg(\"timeline.toolRenderers.reading\")}</RunningPreview>}\n media={<MediaSkeleton />}\n >\n <BodyNote>{msg(\"timeline.toolRenderers.readingImage\")}</BodyNote>\n </ActivityDisclosure>\n );\n }\n\n const viewFailed = item.status === \"failed\";\n const viewCancelled = item.status === \"cancelled\";\n\n if (retained) {\n const title = msg(\"timeline.toolRenderers.viewedPathbasename\", {\n pathBasename: pathBasename(path),\n });\n if (!retained.available) {\n const state =\n retained.reason === \"expired\" || retained.reason === \"deleted\"\n ? retained.reason\n : \"unavailable\";\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone={viewFailed ? \"failed\" : \"muted\"}\n title={`${title} · ${state}`}\n failed={viewFailed}\n cancelled={viewCancelled}\n preview={`image ${state}`}\n media={<MediaEmpty />}\n >\n <BodyNote tone={viewFailed ? \"error\" : undefined}>\n {msg(\"timeline.toolRenderers.imageStateReplaceall\", {\n state,\n replaceAll: retained.reason.replaceAll(\"_\", \" \"),\n })}\n </BodyNote>\n </ActivityDisclosure>\n );\n }\n return (\n <RetainedSessionImageDisclosure\n artifact={retained}\n load={loadRetainedScreenshot}\n title={title}\n caption={path || title}\n noun=\"image\"\n icon={<ImageIcon className={ICON_SIZE} />}\n lightboxLabel={msg(\"timeline.toolRenderers.image\")}\n batched={null}\n failed={viewFailed}\n cancelled={viewCancelled}\n />\n );\n }\n\n const errMatch = VIEW_IMAGE_ERRORS(msg).find((p) => text.includes(p));\n if (errMatch) {\n const tooBig = text.includes(\"exceeded the allowed size\");\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={msg(\"timeline.toolRenderers.viewPathbasename\", { pathBasename: pathBasename(path) })}\n chip={{\n tone: \"bad\",\n text: tooBig ? msg(\"timeline.toolRenderers.tooLarge\") : msg(\"timeline.chip.error\"),\n }}\n preview={text}\n >\n <BodyNote tone=\"error\">{text}</BodyNote>\n </ActivityDisclosure>\n );\n }\n if (text.startsWith(\"OpenAI file reference:\")) {\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone={viewFailed ? \"failed\" : \"muted\"}\n title={msg(\"timeline.toolRenderers.viewedPathbasename\", {\n pathBasename: pathBasename(path),\n })}\n failed={viewFailed}\n cancelled={viewCancelled}\n preview={path}\n >\n <BodyNote>{text}</BodyNote>\n </ActivityDisclosure>\n );\n }\n if (omittedMedia) {\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone={viewFailed ? \"failed\" : \"muted\"}\n title={msg(\"timeline.toolRenderers.viewedPathbasenameImageOmittedNot\", {\n pathBasename: pathBasename(path),\n })}\n failed={viewFailed}\n cancelled={viewCancelled}\n preview={msg(\"timeline.toolRenderers.inlineImageOmittedNotRetained\")}\n media={<MediaEmpty />}\n >\n <BodyNote>\n {msg(\"timeline.toolRenderers.theInlineMediatypeOutputWas\", {\n mediaType: omittedMedia.mediaType,\n })}\n </BodyNote>\n </ActivityDisclosure>\n );\n }\n if (text.includes(\"No image data\")) {\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone={viewFailed ? \"failed\" : \"muted\"}\n title={msg(\"timeline.toolRenderers.viewedPathbasename\", {\n pathBasename: pathBasename(path),\n })}\n failed={viewFailed}\n cancelled={viewCancelled}\n preview={msg(\"timeline.toolRenderers.noImage\")}\n >\n <BodyNote>\n {viewFailed\n ? msg(\"timeline.toolRenderers.viewImageFailedNoImage\")\n : viewCancelled\n ? msg(\"timeline.toolRenderers.viewImageInterrupted\")\n : msg(\"timeline.toolRenderers.noImageTheSandboxSession\")}\n </BodyNote>\n </ActivityDisclosure>\n );\n }\n if (text.startsWith(\"data:\")) {\n return (\n <ActivityDisclosure\n icon={<ImageIcon className={ICON_SIZE} />}\n iconTone={viewFailed ? \"failed\" : \"accent\"}\n title={msg(\"timeline.toolRenderers.viewedPathbasename\", {\n pathBasename: pathBasename(path),\n })}\n failed={viewFailed}\n cancelled={viewCancelled}\n media={<Thumbnail src={text} caption={path} alt={path} />}\n >\n <ScreenshotFigure src={text} caption={path} alt={path} />\n </ActivityDisclosure>\n );\n }\n return <GenericRenderer item={item} />;\n}\n\n/* ---- environment_set_variable (secret-safe, write-only) -------------------- */\n\n/** Plain tool details read this tool through the shared row model (no raw detail). */\nfunction SecretSetRenderer(props: ToolRendererProps) {\n return useToolDetails() === \"plain\" ? (\n <UnreviewedGenericRenderer {...props} />\n ) : (\n <FullSecretSetRenderer {...props} />\n );\n}\n\nfunction FullSecretSetRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const args = parseToolArgs(item.arguments);\n const name = typeof args.name === \"string\" ? args.name : \"variable\";\n\n if (item.status === \"running\") {\n return (\n <ActivityDisclosure\n icon={<KeyRoundIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={msg(\"timeline.toolRenderers.setName\", { name })}\n running\n preview={<RunningPreview>{msg(\"timeline.toolRenderers.setting\")}</RunningPreview>}\n >\n <PayloadBlock label={msg(\"timeline.toolRenderers.arguments\")} value={args} />\n </ActivityDisclosure>\n );\n }\n\n if (item.status === \"failed\") {\n const errorText = typeof item.output === \"string\" ? item.output : null;\n return (\n <ActivityDisclosure\n icon={<KeyRoundIcon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={msg(\"timeline.toolRenderers.setName\", { name })}\n failed\n preview={errorText ?? msg(\"timeline.toolRenderers.variableWriteFailed\")}\n >\n <PayloadBlock label={msg(\"timeline.toolRenderers.arguments\")} value={args} />\n {errorText ? (\n <PayloadBlock label={msg(\"timeline.toolRenderers.error\")} value={errorText} failed />\n ) : (\n <BodyNote tone=\"error\">{msg(\"timeline.toolRenderers.theToolCallFailedWith\")}</BodyNote>\n )}\n </ActivityDisclosure>\n );\n }\n\n return (\n <ActivityDisclosure\n icon={<KeyRoundIcon className={ICON_SIZE} />}\n iconTone=\"muted\"\n title={msg(\"timeline.toolRenderers.setName\", { name })}\n cancelled={item.status === \"cancelled\"}\n preview=\"exact value preserved\"\n >\n <PayloadBlock label={msg(\"timeline.toolRenderers.arguments\")} value={args} />\n <BodyNote>{msg(\"timeline.toolRenderers.theConfiguredValueIsPreserved\")}</BodyNote>\n </ActivityDisclosure>\n );\n}\n\n/* ---- tool_search (progressive MCP disclosure) ------------------------------ */\n\n/** Plain tool details read this tool through the shared row model (no raw detail). */\nfunction ToolSearchRenderer(props: ToolRendererProps) {\n return useToolDetails() === \"plain\" ? (\n <UnreviewedGenericRenderer {...props} />\n ) : (\n <FullToolSearchRenderer {...props} />\n );\n}\n\nfunction FullToolSearchRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const query = toolSearchQuery(item);\n const icon = <PackageSearchIcon className={ICON_SIZE} />;\n const running = item.status === \"running\";\n const queryPreview = query ? truncatePreview(query, 64) : \"\";\n\n if (running) {\n return (\n <ActivityDisclosure\n icon={icon}\n iconTone=\"running\"\n title={msg(\"timeline.toolRenderers.lookingUpTools\")}\n running\n preview={\n queryPreview ? (\n <RunningPreview>{queryPreview}</RunningPreview>\n ) : (\n <RunningPreview>{msg(\"timeline.toolRenderers.matchingCapabilities\")}</RunningPreview>\n )\n }\n >\n {query ? (\n <BodyNote>{msg(\"timeline.toolRenderers.capabilityQueryQuery\", { query })}</BodyNote>\n ) : null}\n <PayloadBlock\n label={msg(\"timeline.toolRenderers.arguments\")}\n value={parseToolArgs(item.arguments)}\n />\n </ActivityDisclosure>\n );\n }\n\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return (\n <ActivityDisclosure\n icon={icon}\n iconTone=\"failed\"\n title={msg(\"timeline.toolRenderers.toolLookupFailed\")}\n failed\n preview={\n truncatePreview(outText, 80) || queryPreview || msg(\"timeline.toolRenderers.lookupFailed\")\n }\n >\n {query ? (\n <BodyNote>{msg(\"timeline.toolRenderers.capabilityQueryQuery\", { query })}</BodyNote>\n ) : null}\n <PayloadBlock\n label={msg(\"timeline.toolRenderers.arguments\")}\n value={parseToolArgs(item.arguments)}\n />\n <PayloadBlock label={msg(\"timeline.toolRenderers.error\")} value={outText} failed />\n </ActivityDisclosure>\n );\n }\n\n const tools = parseDisclosedTools(item.output);\n const preview = toolSearchPreview(msg, tools, item.status === \"cancelled\");\n\n return (\n <ActivityDisclosure\n icon={icon}\n iconTone=\"muted\"\n title={msg(\"timeline.toolRenderers.lookedUpTools\")}\n cancelled={item.status === \"cancelled\"}\n preview={preview}\n >\n {query ? (\n <BodyNote>{msg(\"timeline.toolRenderers.capabilityQueryQuery\", { query })}</BodyNote>\n ) : null}\n {tools && tools.length > 0 ? (\n <ul className=\"grid gap-1.5\">\n {tools.slice(0, 12).map((tool) => (\n <li key={tool.name} className=\"flex min-w-0 items-baseline gap-2\">\n {tool.source ? (\n <span className=\"shrink-0 text-og-xs text-og-fg-subtle\">{tool.source}</span>\n ) : null}\n <span className=\"truncate font-mono text-og-sm text-og-fg\">{tool.leaf}</span>\n </li>\n ))}\n {tools.length > 12 ? (\n <li className=\"text-og-xs text-og-fg-muted\">\n +{tools.length - 12} {msg(\"timeline.toolRenderers.more\")}\n </li>\n ) : null}\n </ul>\n ) : tools && tools.length === 0 ? (\n <BodyNote>{msg(\"timeline.toolRenderers.noDeferredToolsMatchedThis\")}</BodyNote>\n ) : null}\n <PayloadBlock\n label={msg(\"timeline.toolRenderers.arguments\")}\n value={parseToolArgs(item.arguments)}\n />\n {tools == null && outText ? (\n <PayloadBlock label={msg(\"timeline.toolRenderers.result\")} value={outText} />\n ) : null}\n </ActivityDisclosure>\n );\n}\n\n/* ---- docs / knowledge search ----------------------------------------------- */\n\n/** Plain tool details read this tool through the shared row model (no raw detail). */\nfunction DocsSearchRenderer(props: ToolRendererProps) {\n return useToolDetails() === \"plain\" ? (\n <UnreviewedGenericRenderer {...props} />\n ) : (\n <FullDocsSearchRenderer {...props} />\n );\n}\n\nfunction FullDocsSearchRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const args = parseToolArgs(item.arguments);\n const query = typeof args.query === \"string\" ? args.query.trim() : \"\";\n const title = query\n ? msg(\"timeline.toolRenderers.searchTruncatepreview\", {\n truncatePreview: truncatePreview(query, 48),\n })\n : toolDisplayName(msg, item.name, item.display);\n const running = item.status === \"running\";\n\n if (running) {\n return (\n <ActivityDisclosure\n icon={<FileSearchIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={title}\n running\n preview={<RunningPreview>{msg(\"timeline.toolRenderers.searching\")}</RunningPreview>}\n >\n <PayloadBlock label={msg(\"timeline.toolRenderers.arguments\")} value={args} />\n </ActivityDisclosure>\n );\n }\n\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return (\n <ActivityDisclosure\n icon={<FileSearchIcon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={title}\n failed\n preview={truncatePreview(outText, 80) || msg(\"timeline.toolRenderers.searchFailed\")}\n >\n <PayloadBlock label={msg(\"timeline.toolRenderers.arguments\")} value={args} />\n <PayloadBlock label={msg(\"timeline.toolRenderers.error\")} value={outText} failed />\n </ActivityDisclosure>\n );\n }\n\n const hits = parseSearchHits(msg, outText);\n const preview =\n item.status === \"cancelled\"\n ? undefined\n : hits\n ? hits.length === 0\n ? msg(\"timeline.toolRenderers.noHits\")\n : msg(\"counts.hits\", { count: hits.length })\n : msg(\"timeline.toolRenderers.done\");\n\n return (\n <ActivityDisclosure\n icon={<FileSearchIcon className={ICON_SIZE} />}\n iconTone=\"muted\"\n title={title}\n cancelled={item.status === \"cancelled\"}\n preview={preview}\n >\n {hits && hits.length > 0 ? (\n <ul className=\"grid gap-2\">\n {hits.slice(0, 8).map((hit) => (\n <li key={`${hit.title}\\u0000${hit.snippet}`} className=\"min-w-0\">\n <div className=\"truncate text-og-sm font-medium text-og-fg\">{hit.title}</div>\n {hit.snippet ? (\n <div className=\"mt-0.5 line-clamp-2 text-og-xs text-og-fg-muted\">{hit.snippet}</div>\n ) : null}\n </li>\n ))}\n </ul>\n ) : null}\n <PayloadBlock label={msg(\"timeline.toolRenderers.arguments\")} value={args} />\n <PayloadBlock label={msg(\"timeline.toolRenderers.result\")} value={outText} />\n </ActivityDisclosure>\n );\n}\n\n/* ---- set_session_title / set_other_session_title --------------------------- */\n\n/** Plain tool details read this tool through the shared row model (no raw detail). */\nfunction SetSessionTitleRenderer(props: ToolRendererProps) {\n return useToolDetails() === \"plain\" ? (\n <UnreviewedGenericRenderer {...props} />\n ) : (\n <FullSetSessionTitleRenderer {...props} />\n );\n}\n\nfunction FullSetSessionTitleRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const args = parseToolArgs(item.arguments);\n const titleArg = typeof args.title === \"string\" ? args.title.trim() : \"\";\n const display = toolDisplayName(msg, item.name, item.display);\n const previewTitle = titleArg ? truncatePreview(titleArg, 72) : \"\";\n const icon = <MessagesSquareIcon className={ICON_SIZE} />;\n\n if (item.status === \"running\") {\n return (\n <ActivityDisclosure\n icon={icon}\n iconTone=\"running\"\n title={display}\n running\n preview={\n previewTitle ? (\n <RunningPreview>{previewTitle}</RunningPreview>\n ) : (\n <RunningPreview>{msg(\"timeline.toolRenderers.settingTitle\")}</RunningPreview>\n )\n }\n >\n <PayloadBlock label={msg(\"timeline.toolRenderers.arguments\")} value={args} />\n </ActivityDisclosure>\n );\n }\n\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return (\n <ActivityDisclosure\n icon={icon}\n iconTone=\"failed\"\n title={display}\n failed\n preview={truncatePreview(outText, 80) || msg(\"timeline.toolRenderers.renameFailed\")}\n >\n <PayloadBlock label={msg(\"timeline.toolRenderers.arguments\")} value={args} />\n <PayloadBlock label={msg(\"timeline.toolRenderers.error\")} value={outText} failed />\n </ActivityDisclosure>\n );\n }\n\n // Prefer the submitted title; fall back to a title field in the tool result.\n let settledTitle = previewTitle;\n if (!settledTitle) {\n const parsed = tryParseJson(outText);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const fromResult = (parsed as { title?: unknown }).title;\n if (typeof fromResult === \"string\" && fromResult.trim()) {\n settledTitle = truncatePreview(fromResult.trim(), 72);\n }\n }\n }\n\n return (\n <ActivityDisclosure\n icon={icon}\n iconTone=\"muted\"\n title={display}\n cancelled={item.status === \"cancelled\"}\n preview={item.status === \"cancelled\" ? undefined : settledTitle || undefined}\n >\n <PayloadBlock label={msg(\"timeline.toolRenderers.arguments\")} value={args} />\n {outText ? (\n <PayloadBlock label={msg(\"timeline.toolRenderers.result\")} value={outText} />\n ) : null}\n </ActivityDisclosure>\n );\n}\n\n/* ---- company memory propose (docs MCP) ------------------------------------- */\n\n/** Plain tool details read this tool through the shared row model (no raw detail). */\nfunction MemoryProposeRenderer(props: ToolRendererProps) {\n return useToolDetails() === \"plain\" ? (\n <UnreviewedGenericRenderer {...props} />\n ) : (\n <FullMemoryProposeRenderer {...props} />\n );\n}\n\nfunction FullMemoryProposeRenderer({ item }: ToolRendererProps) {\n const msg = useOpenGeniText();\n const args = parseToolArgs(item.arguments);\n const text = typeof args.text === \"string\" ? args.text.trim() : \"\";\n const title = msg(\"timeline.toolRenderers.proposeMemory\");\n const running = item.status === \"running\";\n\n if (running) {\n return (\n <ActivityDisclosure\n icon={<BrainCircuitIcon className={ICON_SIZE} />}\n iconTone=\"running\"\n title={title}\n running\n preview={<RunningPreview>{msg(\"timeline.toolRenderers.proposing\")}</RunningPreview>}\n >\n <PayloadBlock label={msg(\"timeline.toolRenderers.arguments\")} value={args} />\n </ActivityDisclosure>\n );\n }\n\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return (\n <ActivityDisclosure\n icon={<BrainCircuitIcon className={ICON_SIZE} />}\n iconTone=\"failed\"\n title={title}\n failed\n preview={truncatePreview(outText, 80) || msg(\"timeline.toolRenderers.proposeFailed\")}\n >\n {text ? <BodyNote>{text}</BodyNote> : null}\n <PayloadBlock label={msg(\"timeline.toolRenderers.error\")} value={outText} failed />\n </ActivityDisclosure>\n );\n }\n\n return (\n <ActivityDisclosure\n icon={<BrainCircuitIcon className={ICON_SIZE} />}\n iconTone=\"muted\"\n title={title}\n cancelled={item.status === \"cancelled\"}\n preview={text ? truncatePreview(text, 90) : msg(\"timeline.toolRenderers.done\")}\n >\n {text ? <BodyNote>{text}</BodyNote> : null}\n <PayloadBlock label={msg(\"timeline.toolRenderers.result\")} value={outText} />\n </ActivityDisclosure>\n );\n}\n\n/* ---- request_human_input --------------------------------------------------- */\n\n/* ---- run_on ---------------------------------------------------------------- */\n\n/* ---- generic fallback (first-party MCP, external MCP, unknown) ------------- */\n\n/**\n * Baseline craft for unmatched tools: family icon + title-cased leaf + honest\n * status preview (Running… / Done / error snippet). No argument-field sniffing —\n * JSON stays in the expandable body only.\n */\nfunction GenericRenderer(props: ToolRendererProps) {\n const reviewed = useHasToolReview(props.item.callId);\n if (reviewed && props.item.callId) return <ReviewedGenericRenderer {...props} />;\n return <UnreviewedGenericRenderer {...props} />;\n}\n\n/** Settled review states earn one quiet gutter word; success and waiting stay chip-free. */\nconst REVIEW_CHIP = (msg: OpenGeniText): Partial<Record<ToolReviewStatus, DisclosureChip>> => ({\n rejected: { tone: \"interrupted\", text: msg(\"timeline.chip.declined\") },\n cancelled: { tone: \"interrupted\", text: msg(\"timeline.toolRenderers.notRun\") },\n expired: { tone: \"interrupted\", text: msg(\"timeline.chip.expired\") },\n stale: { tone: \"interrupted\", text: msg(\"timeline.toolRenderers.notRun\") },\n revoked: { tone: \"interrupted\", text: msg(\"timeline.toolRenderers.notRun\") },\n blocked: { tone: \"interrupted\", text: msg(\"timeline.chip.blocked\") },\n unknown: { tone: \"bad\", text: msg(\"timeline.toolRenderers.outcomeUnknown\") },\n partial: { tone: \"bad\", text: msg(\"timeline.toolRenderers.partlyDone\") },\n failed: { tone: \"bad\", text: msg(\"timeline.chip.failed\") },\n});\n\n/**\n * A call that went through approval keeps the ordinary row shape, titled with\n * what was approved. The expanded body is the saved review plus the result.\n */\nfunction ReviewedGenericRenderer(props: ToolRendererProps) {\n const msg = useOpenGeniText();\n const { item } = props;\n const { review, onViewDetails } = useRecordedToolReview(item.callId);\n const logo = useToolConnectorLogo(item.display);\n if (!review) return <UnreviewedGenericRenderer {...props} />;\n const ReviewIcon = toolIcon(genericToolIconKind(item.name));\n const icon = <ConnectorLogoIcon src={logo} fallback={<ReviewIcon className={ICON_SIZE} />} />;\n const waiting = review.status === \"pending\";\n const running =\n !waiting &&\n (review.status === \"executing\" || review.status === \"approved\") &&\n item.status === \"running\";\n const { text: outText, isError } = unwrapMcpOutput(retainedToolResultImages(item.output).output);\n const chip =\n REVIEW_CHIP(msg)[review.status] ??\n (isError && !running && !waiting\n ? ({ tone: \"bad\", text: msg(\"timeline.chip.error\") } as const)\n : undefined);\n return (\n <ActivityDisclosure\n icon={icon}\n iconTone={chip?.tone === \"bad\" ? \"failed\" : waiting ? \"accent\" : \"muted\"}\n title={review.title}\n running={running}\n chip={chip}\n preview={\n waiting ? (\n msg(\"timeline.toolRenderers.waitingForYourApproval\")\n ) : running ? (\n <RunningPreview>{msg(\"timeline.toolRenderers.running\")}</RunningPreview>\n ) : item.display?.connector ? (\n // The logo names the connector; only a second account needs words.\n (item.display.accountLabel ?? undefined)\n ) : (\n (review.accountLabel ?? undefined)\n )\n }\n >\n <div className=\"py-1\" data-approval-id={item.callId} data-review-origin=\"history\">\n <ToolActionReviewCard\n bare\n review={{ ...review, availableActions: [] }}\n onViewDetails={onViewDetails}\n />\n </div>\n {outText ? (\n <PayloadBlock\n label={msg(\"timeline.toolRenderers.result\")}\n value={outText}\n failed={isError}\n />\n ) : null}\n </ActivityDisclosure>\n );\n}\n\n/* ---- the default registry -------------------------------------------------- */\n\nfunction KnowledgeSaveRenderer({ item }: ToolRendererProps) {\n const output = unwrapMcpOutput(item.output);\n const parsed = tryParseJson(output.text);\n if (item.status === \"running\" || output.isError || !parsed || typeof parsed !== \"object\")\n return <GenericRenderer item={item} />;\n const value = parsed as Record<string, unknown>;\n const receipt = (value.status === \"retained\" ? value.receipt : value) as\n | Record<string, unknown>\n | undefined;\n if (\n !receipt ||\n typeof receipt.entryId !== \"string\" ||\n ![\"published\", \"pending\", \"rejected\", \"archived\"].includes(String(receipt.outcome))\n )\n return <GenericRenderer item={item} />;\n const args = parseToolArgs(item.arguments);\n const entry = args.entry as Record<string, unknown> | undefined;\n return (\n <KnowledgeReceiptRow\n outcome={receipt.outcome as \"published\" | \"pending\" | \"rejected\" | \"archived\"}\n entryId={receipt.entryId}\n title={\n typeof entry?.title === \"string\"\n ? entry.title\n : typeof value.filename === \"string\"\n ? value.filename\n : undefined\n }\n source={value.status === \"retained\" || value.retained === true}\n />\n );\n}\n\nconst BASE_ENTRIES: ToolRegistryEntry[] = [\n ...[\n \"knowledge_save\",\n \"knowledge_archive\",\n \"knowledge_retain_file\",\n \"knowledge_retain_message\",\n \"task_note_promote_knowledge\",\n ].flatMap((name) =>\n [name, `opengeni__${name}`, `mcp__opengeni__${name}`].map((trustedName) => ({\n match: \"name\" as const,\n name: trustedName,\n matchPrefixedLeaf: false,\n render: KnowledgeSaveRenderer,\n })),\n ),\n // Provider-native items carry `raw.type` on the wire — this is their source of\n // truth and is consulted first by the registry.\n { match: \"rawType\", type: \"apply_patch_call\", render: ApplyPatchRenderer },\n { match: \"rawType\", type: \"computer_call\", render: ComputerCallRenderer },\n { match: \"rawType\", type: \"tool_search_call\", render: ToolSearchRenderer },\n // First-party sandbox + MCP tools resolve by name (exact or MCP leaf).\n { match: \"name\", name: \"exec_command\", render: ExecRenderer },\n { match: \"name\", name: \"request_human_input\", render: AskRenderer },\n { match: \"name\", name: \"run_on\", render: RunOnRenderer },\n { match: \"name\", name: \"sandboxes_list\", render: MachineRenderer },\n { match: \"name\", name: \"sandbox_swap\", render: MachineRenderer },\n { match: \"name\", name: \"computer_open\", render: MachineRenderer },\n { match: \"name\", name: \"computer_observe\", render: MachineRenderer },\n { match: \"name\", name: \"computer_act\", render: MachineRenderer },\n { match: \"name\", name: \"write_stdin\", render: WriteStdinRenderer },\n { match: \"name\", name: \"apply_patch_call\", render: ApplyPatchRenderer },\n { match: \"name\", name: \"apply_patch\", render: ApplyPatchRenderer },\n { match: \"name\", name: \"computer_call\", render: ComputerCallRenderer },\n {\n match: \"name\",\n name: \"browser_screenshot\",\n render: BrowserScreenshotRenderer,\n },\n { match: \"name\", name: \"browser_observe\", render: BrowserScreenshotRenderer },\n { match: \"name\", name: \"browser_act\", render: BrowserScreenshotRenderer },\n // Function-mode computer tools (codex / chat-wire transports).\n { match: \"name\", name: \"computer_screenshot\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_click\", render: ComputerCallRenderer },\n {\n match: \"name\",\n name: \"computer_double_click\",\n render: ComputerCallRenderer,\n },\n { match: \"name\", name: \"computer_move\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_scroll\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_type\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_keypress\", render: ComputerCallRenderer },\n { match: \"name\", name: \"computer_drag\", render: ComputerCallRenderer },\n { match: \"name\", name: \"web_search_call\", render: WebSearchRenderer },\n {\n match: \"name\",\n name: \"image_generation_call\",\n render: GeneratedImageRenderer,\n },\n { match: \"name\", name: \"generate_image\", render: GeneratedImageRenderer },\n { match: \"name\", name: \"generate_video\", render: GeneratedVideoRenderer },\n { match: \"name\", name: \"tool_search\", render: ToolSearchRenderer },\n { match: \"name\", name: \"view_image\", render: ViewImageRenderer },\n {\n match: \"name\",\n name: \"sandbox_file_publish\",\n render: SandboxFilePublishRenderer,\n },\n {\n match: \"name\",\n name: \"artifacts_create\",\n render: SiteArtifactRenderer,\n matchPrefixedLeaf: false,\n },\n {\n match: \"name\",\n name: \"artifacts_publish\",\n render: SiteArtifactRenderer,\n matchPrefixedLeaf: false,\n },\n {\n match: \"name\",\n name: \"opengeni__artifacts_create\",\n render: SiteArtifactRenderer,\n matchPrefixedLeaf: false,\n },\n {\n match: \"name\",\n name: \"opengeni__artifacts_publish\",\n render: SiteArtifactRenderer,\n matchPrefixedLeaf: false,\n },\n {\n match: \"name\",\n name: \"environment_set_variable\",\n render: SecretSetRenderer,\n },\n {\n match: \"name\",\n name: \"variable_set_set_variable\",\n render: SecretSetRenderer,\n },\n { match: \"name\", name: \"search_documents\", render: DocsSearchRenderer },\n { match: \"name\", name: \"knowledge_search\", render: DocsSearchRenderer },\n { match: \"name\", name: \"memory_propose\", render: MemoryProposeRenderer },\n { match: \"name\", name: \"set_session_title\", render: SetSessionTitleRenderer },\n {\n match: \"name\",\n name: \"set_other_session_title\",\n render: SetSessionTitleRenderer,\n },\n];\n\n/** Built-in renderers that draw their row from the shared presentation. */\nconst PRESENTATION_RENDERERS: ReadonlyMap<ToolRenderer, PresentedToolKind> = new Map<\n ToolRenderer,\n PresentedToolKind\n>([\n [ExecRenderer, \"exec\"],\n [WriteStdinRenderer, \"write_stdin\"],\n [ApplyPatchRenderer, \"apply_patch\"],\n [GenericRenderer, \"generic\"],\n]);\n\n/**\n * Whether `renderer` can draw `item` while its output is a bounded preview\n * (see {@link presentsToolOutputPreview}). Every other row (media, receipts,\n * cards that parse their result, consumer renderers) needs its exact output\n * before it renders.\n */\nexport function rendersToolOutputPreview(renderer: ToolRenderer, item: ToolCallItem): boolean {\n if (!item.outputPreview) return true;\n return (\n PRESENTATION_RENDERERS.get(renderer) === presentedToolKind(item) &&\n presentsToolOutputPreview(item)\n );\n}\n\n/** The built-in tool renderer registry: every first-party tool plus a fallback. */\nexport const defaultToolRegistry: ToolRegistry = createToolRegistry(BASE_ENTRIES, GenericRenderer);\n\n/** Build a registry that extends the built-ins with consumer entries/fallback. */\nexport function createDefaultToolRegistry(\n options: Parameters<typeof createToolRegistry>[2] = {},\n): ToolRegistry {\n return createToolRegistry(BASE_ENTRIES, GenericRenderer, options);\n}\n","import { createContext, useContext } from \"react\";\n\n/* ----------------------------------------------------------------------------\n Session compute label\n\n Optional host-supplied display name for the session's active compute target\n (e.g. \"Cloud sandbox\" or a Connected Machine name). Used by exec_command\n collapsed previews. The host owns resolution; this package never calls the\n machines API.\n -------------------------------------------------------------------------- */\n\nconst TimelineComputeLabelContext = createContext<string | null>(null);\n\nexport const TimelineComputeLabelProvider = TimelineComputeLabelContext.Provider;\n\nexport function useTimelineComputeLabel(): string | null {\n return useContext(TimelineComputeLabelContext);\n}\n","import { createContext, useContext, useEffect, useState, type ReactNode } from \"react\";\n\nimport type { ToolDisplayMetadata } from \"@opengeni/sdk\";\n\n/*\n * Connector logos in tool rows. The host resolves a provider domain to a logo\n * it serves itself (the same `resolveProviderLogo` MessageTimeline already\n * takes). Rows from a connector draw that logo in place of their generic icon;\n * without one they keep it.\n */\n\nexport type ResolveProviderLogo = (providerDomain: string) => string | null | undefined;\n\nconst ProviderLogoContext = createContext<ResolveProviderLogo | undefined>(undefined);\n\nexport const ProviderLogoProvider = ProviderLogoContext.Provider;\n\n/** The logo URL for a tool's connector, when the host has one. */\nexport function useToolConnectorLogo(display: ToolDisplayMetadata | undefined): string | null {\n const resolve = useContext(ProviderLogoContext);\n if (!resolve || !display?.providerDomain) return null;\n return resolve(display.providerDomain) ?? null;\n}\n\n/**\n * A connector's logo at icon size, or `fallback` when there is none or it\n * fails to load, so a row never shows a broken image.\n */\nexport function ConnectorLogoIcon({\n src,\n fallback,\n className,\n}: {\n src: string | null;\n fallback: ReactNode;\n className?: string;\n}) {\n const [failed, setFailed] = useState(false);\n useEffect(() => setFailed(false), [src]);\n if (!src || failed) return <>{fallback}</>;\n return (\n <img\n src={src}\n alt=\"\"\n aria-hidden=\"true\"\n loading=\"lazy\"\n decoding=\"async\"\n data-og-connector-logo=\"\"\n className={className ?? \"size-3.5 shrink-0 rounded-[3px] object-contain\"}\n onError={() => setFailed(true)}\n />\n );\n}\n","import type { GitFileDiff } from \"@opengeni/sdk\";\nimport { useState } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useThemeType } from \"../lib/use-theme-type\";\nimport { PierreDiff } from \"../components/pierre-diff\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\n/* ----------------------------------------------------------------------------\n Tool diff\n\n Renders parsed `GitFileDiff[]` (from the V4A apply_patch parser) through the\n EXACT same diff stack the Files/Changes tabs use: `PierreDiff` (Shiki-\n highlighted), with a built-in plain-text degrade for a host without\n `@pierre/diffs` — one renderer, a single data contract. A per-block\n Unified/Split toggle sits in the header.\n -------------------------------------------------------------------------- */\n\nexport function ToolDiff({ files }: { files: GitFileDiff[] }) {\n const [layout, setLayout] = useState<\"unified\" | \"split\">(\"unified\");\n // Resolve the host theme (auto-detect via `data-og-theme`) with the SAME hook\n // the Files tab uses, then thread it into Pierre. Without it Pierre falls back\n // to its hard dark default and renders a github-dark slab inside a light page.\n const themeType = useThemeType(undefined);\n return (\n <div className=\"min-w-0\">\n <div className=\"mb-1.5 flex justify-end\">\n <LayoutToggle layout={layout} onChange={setLayout} />\n </div>\n <PierreDiff diff={files} layout={layout} themeType={themeType} />\n </div>\n );\n}\n\nfunction LayoutToggle({\n layout,\n onChange,\n}: {\n layout: \"unified\" | \"split\";\n onChange: (next: \"unified\" | \"split\") => void;\n}) {\n return (\n <div className=\"inline-flex items-center gap-px rounded-og-xs border border-og-border p-px\">\n {([\"unified\", \"split\"] as const).map((value) => (\n <button\n key={value}\n type=\"button\"\n onClick={() => onChange(value)}\n className={cn(\n \"rounded-og-xs px-2 py-[3px] text-og-xs font-medium capitalize transition-colors\",\n layout === value\n ? \"bg-og-surface-2 text-og-fg\"\n : \"text-og-fg-subtle hover:text-og-fg-muted\",\n )}\n >\n {value}\n </button>\n ))}\n </div>\n );\n}\n\n/** Raw-patch fallback for a V4A hunk string the parser could not structure. */\nexport function RawPatch({ diff }: { diff: string }) {\n const t = useOpenGeniText();\n const occurrences = new Map<string, number>();\n const lines = diff.split(\"\\n\").map((line) => {\n const occurrence = (occurrences.get(line) ?? 0) + 1;\n occurrences.set(line, occurrence);\n return { key: `${line}\\u0000${occurrence}`, line };\n });\n return (\n <div className=\"min-w-0\">\n <p className=\"mb-1 text-og-xs font-medium uppercase tracking-[0.08em] text-og-fg-subtle\">\n {t(\"timeline.toolDiff.rawPatchCouldNotParse\")}\n </p>\n <pre className=\"max-h-72 overflow-auto border-l-2 border-og-border pl-3 font-og-mono text-og-xs leading-5\">\n {lines.map(({ key, line }) => (\n <span\n key={key}\n className={cn(\n \"block\",\n line.startsWith(\"@@\")\n ? \"text-og-accent\"\n : line.startsWith(\"+\")\n ? \"text-og-status-idle\"\n : line.startsWith(\"-\")\n ? \"text-og-status-failed\"\n : \"text-og-fg-muted\",\n )}\n >\n {line || \" \"}\n </span>\n ))}\n </pre>\n </div>\n );\n}\n","import { useSyncExternalStore } from \"react\";\n\nconst KEY = \"opengeni:startup-details:v1\";\nconst EVENT = \"opengeni:startup-details-changed\";\nlet fallback = false;\nfunction snapshot() {\n try {\n return window.localStorage.getItem(KEY) === \"true\";\n } catch {\n return fallback;\n }\n}\nfunction subscribe(listener: () => void) {\n window.addEventListener(EVENT, listener);\n window.addEventListener(\"storage\", listener);\n return () => {\n window.removeEventListener(EVENT, listener);\n window.removeEventListener(\"storage\", listener);\n };\n}\nexport function setStartupDetails(value: boolean) {\n fallback = value;\n try {\n window.localStorage.setItem(KEY, String(value));\n } catch {\n /* Private storage is optional. */\n }\n window.dispatchEvent(new Event(EVENT));\n}\n/** Presentation preference only. Startup evidence is always retained. */\nexport function useStartupDetails() {\n return useSyncExternalStore(subscribe, snapshot, () => false);\n}\n","import { ArrowUpRightIcon, ChevronRightIcon } from \"lucide-react\";\nimport { useContext, useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useForcedDefaultOpen } from \"./disclosure-context\";\nimport type { AgentTitleParts } from \"./platform-activity-presentation\";\nimport { ActivityDisclosure, CompactActivityContext } from \"./shared\";\nimport { ShimmerText } from \"./shimmer-text\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\n/* ----------------------------------------------------------------------------\n Agent row\n\n One row for everything that crosses between agents: spawning one, messaging\n one, and every update one sends back. It names the agent, previews what was\n said, opens the full text in place, and deep-links to the agent's session.\n It reuses the rail's row geometry (chevron, icon, title) so it reads as a\n sibling of tool rows, and spends color only on failure.\n -------------------------------------------------------------------------- */\n\nexport type AgentRowProps = {\n icon: ReactNode;\n title: AgentTitleParts;\n /** Quiet secondary text shown while collapsed. */\n preview?: string | null | undefined;\n /** Two lines suit inbound messages; spawns and messages use one. */\n previewLines?: 1 | 2 | undefined;\n /** Short trailing note after the title, e.g. \"+2 earlier\". */\n meta?: string | null | undefined;\n /** The agent session the row deep-links to. */\n sessionId?: string | null | undefined;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n running?: boolean | undefined;\n failed?: boolean | undefined;\n cancelled?: boolean | undefined;\n /** Expanded body; the row is static when absent. */\n children?: ReactNode | undefined;\n};\n\nexport function AgentRow({\n icon,\n title,\n preview,\n previewLines = 1,\n meta,\n sessionId,\n onOpenSession,\n running,\n failed,\n cancelled,\n children,\n}: AgentRowProps) {\n const t = useOpenGeniText();\n const compact = useContext(CompactActivityContext);\n const forcedDefaultOpen = useForcedDefaultOpen();\n const [open, setOpen] = useState(forcedDefaultOpen ?? false);\n if (compact) {\n return (\n <ActivityDisclosure\n icon={icon}\n title={title.text}\n preview={preview ?? undefined}\n running={running}\n failed={failed}\n cancelled={cancelled}\n />\n );\n }\n const hasBody = children != null;\n const canOpen = Boolean(sessionId && onOpenSession);\n const openLabel = title.name\n ? t(\"timeline.agentRow.openName\", { name: title.name })\n : t(\"timeline.agentRow.openAgentSession\");\n const status = failed ? \"failed\" : cancelled ? \"cancelled\" : running ? \"running\" : undefined;\n\n const inner = (\n <>\n {hasBody ? (\n <ChevronRightIcon\n aria-hidden\n className=\"mt-[3px] size-3.5 shrink-0 text-og-fg-subtle transition-transform duration-[var(--_og-duration-disclose)] ease-og-in-out group-data-[state=open]/agent:rotate-90\"\n />\n ) : (\n <span className=\"size-3.5 shrink-0\" aria-hidden />\n )}\n <span\n aria-hidden\n className={cn(\n \"mt-[3px] shrink-0 [&_svg]:size-3.5\",\n failed ? \"text-og-status-failed\" : \"text-og-fg-subtle\",\n )}\n >\n {icon}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-baseline gap-2\">\n <ShimmerText\n active={Boolean(running)}\n className={cn(\n \"min-w-0 truncate text-og-base leading-5\",\n failed && \"text-og-status-failed\",\n )}\n >\n {title.name ? (\n <>\n {title.before ? <span className=\"text-og-fg-muted\">{title.before}</span> : null}\n <span className={cn(\"font-medium\", failed ? undefined : \"text-og-fg\")}>\n {title.name}\n </span>\n {title.after ? <span className=\"text-og-fg-muted\">{title.after}</span> : null}\n </>\n ) : (\n <span className={cn(\"font-medium\", failed ? undefined : \"text-og-fg\")}>\n {title.text}\n </span>\n )}\n </ShimmerText>\n {meta ? (\n <span className=\"shrink-0 text-og-xs text-og-fg-subtle tabular-nums\">{meta}</span>\n ) : null}\n </span>\n {preview && !open ? (\n <span\n data-og-agent-preview=\"\"\n className={cn(\n \"mt-0.5 block text-og-sm leading-5 text-og-fg-muted\",\n previewLines === 2 ? \"line-clamp-2 break-words\" : \"truncate\",\n )}\n >\n {preview}\n </span>\n ) : null}\n </span>\n {failed ? (\n <span className=\"inline-flex shrink-0 items-center gap-1.5 self-center font-og-mono text-og-xs leading-none text-og-status-failed\">\n <span className=\"size-1.5 rounded-full bg-og-status-failed\" />\n {t(\"timeline.agentRow.failed\")}\n </span>\n ) : cancelled ? (\n <span className=\"og-cancelled-chip shrink-0 self-center font-og-mono text-og-xs leading-none text-og-fg-subtle\">\n {t(\"timeline.agentRow.interrupted\")}\n </span>\n ) : null}\n {canOpen && sessionId && onOpenSession ? (\n <button\n type=\"button\"\n aria-label={openLabel}\n title={openLabel}\n onClick={(event) => {\n event.stopPropagation();\n onOpenSession(sessionId);\n }}\n onKeyDown={(event) => event.stopPropagation()}\n className={cn(\n \"-my-0.5 inline-grid size-6 shrink-0 place-items-center rounded-og-sm text-og-fg-subtle\",\n \"outline-hidden transition-colors duration-150 hover:bg-og-surface-2 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent\",\n \"pointer-coarse:size-10\",\n )}\n >\n <ArrowUpRightIcon aria-hidden className=\"size-3.5\" />\n </button>\n ) : null}\n </>\n );\n\n const rowClass = cn(\n \"group/agent flex w-full min-w-0 items-start gap-2 rounded-og-sm px-1.5 py-1.5 text-left\",\n \"pointer-coarse:min-h-11 pointer-coarse:py-2.5\",\n );\n\n if (!hasBody) {\n return (\n <div data-og-agent-row=\"\" data-status={status} className={rowClass}>\n {inner}\n </div>\n );\n }\n\n // A div with button semantics (like ActivityDisclosure) so the open-session\n // button can live inside the row without nesting native buttons.\n return (\n <div data-og-agent-row=\"\" data-status={status}>\n <div\n role=\"button\"\n tabIndex={0}\n aria-expanded={open}\n data-state={open ? \"open\" : \"closed\"}\n onClick={() => setOpen((previous) => !previous)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setOpen((previous) => !previous);\n }\n }}\n className={cn(\n rowClass,\n \"cursor-pointer outline-hidden transition-colors duration-150 hover:bg-og-surface-1\",\n \"focus-visible:ring-2 focus-visible:ring-og-accent\",\n )}\n >\n {inner}\n </div>\n {open ? (\n <div className=\"mb-2 ml-[2.125rem] mr-1.5 mt-0.5 flex flex-col gap-2 border-l border-og-border pl-4 text-og-sm leading-6 text-og-fg animate-og-expand\">\n {children}\n </div>\n ) : null}\n </div>\n );\n}\n\n/** Plain multi-line text for an expanded agent row. */\nexport function AgentRowText({ children }: { children: string }) {\n return <p className=\"whitespace-pre-wrap break-words\">{children}</p>;\n}\n\n/** A labelled section inside an expanded agent row (Brief, Report, Evidence). */\nexport function AgentRowSection({\n label,\n children,\n muted,\n}: {\n label: string;\n children: string;\n muted?: boolean | undefined;\n}) {\n return (\n <div className=\"min-w-0\">\n <p className=\"text-og-xs font-medium text-og-fg-subtle\">{label}</p>\n <p\n className={cn(\"whitespace-pre-wrap break-words\", muted ? \"text-og-fg-muted\" : \"text-og-fg\")}\n >\n {children}\n </p>\n </div>\n );\n}\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { TimelineItem } from \"./types\";\n\n/**\n * Host lookup from a session id to its current display title. Return null or\n * undefined when the session is unknown; the timeline then falls back to the\n * title given at spawn time, then to generic copy.\n */\nexport type ResolveSessionTitle = (sessionId: string) => string | null | undefined;\n\ntype AgentIdentity = {\n /** The best known display title for an agent session, or null. */\n titleFor: (sessionId: string | null | undefined) => string | null;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n};\n\nconst SESSION_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nconst AGENT_TITLE_MAX_LENGTH = 80;\n\n/** Typed routing coordinates only: a session reference is always a UUID. */\nexport function isSessionId(value: string | null | undefined): value is string {\n return typeof value === \"string\" && SESSION_ID.test(value);\n}\n\n/** One bounded display line, or null for an empty or non-string title. */\nexport function displayAgentTitle(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const title = value.replace(/\\s+/g, \" \").trim();\n if (!title) return null;\n return title.length > AGENT_TITLE_MAX_LENGTH\n ? `${title.slice(0, AGENT_TITLE_MAX_LENGTH - 1).trimEnd()}…`\n : title;\n}\n\nconst AgentIdentityContext = createContext<AgentIdentity>({ titleFor: () => null });\n\nexport function useAgentIdentity(): AgentIdentity {\n return useContext(AgentIdentityContext);\n}\n\n/**\n * Names the agents a timeline talks to. The host resolver wins (it follows\n * renames); otherwise the title the manager passed when spawning that session\n * in this same timeline is used.\n */\nexport function AgentIdentityProvider({\n items,\n resolveSessionTitle,\n onOpenSession,\n children,\n}: {\n items: readonly TimelineItem[];\n resolveSessionTitle?: ResolveSessionTitle | undefined;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n children: ReactNode;\n}) {\n // Streaming replaces the item array on every delta; key the index by its\n // content so the context (and every agent row) only changes with a title.\n const spawnTitleKey = JSON.stringify(\n items.flatMap((item) =>\n item.kind === \"worker\" &&\n item.action === \"spawn\" &&\n isSessionId(item.workerSessionId) &&\n item.title\n ? [[item.workerSessionId.toLowerCase(), item.title]]\n : [],\n ),\n );\n const value = useMemo<AgentIdentity>(() => {\n const spawnTitles = new Map<string, string>(JSON.parse(spawnTitleKey) as [string, string][]);\n return {\n titleFor: (sessionId) => {\n if (!isSessionId(sessionId)) return null;\n return (\n displayAgentTitle(resolveSessionTitle?.(sessionId)) ??\n displayAgentTitle(spawnTitles.get(sessionId.toLowerCase())) ??\n null\n );\n },\n onOpenSession,\n };\n }, [spawnTitleKey, resolveSessionTitle, onOpenSession]);\n return <AgentIdentityContext.Provider value={value}>{children}</AgentIdentityContext.Provider>;\n}\n","import { KnowledgeReceiptRow } from \"./knowledge-receipt\";\nimport { workerRowTitleParts } from \"./platform-activity-presentation\";\nimport { AgentRow, AgentRowSection } from \"./agent-row\";\nimport { useAgentIdentity } from \"./agent-identity\";\nimport { AnimatePresence, motion, useReducedMotion } from \"motion/react\";\nimport { GenieLoading } from \"./genie-loading\";\nimport { StartupDispatchDetails } from \"./startup-dispatch-details\";\nimport { useStartupDetails } from \"./startup-preference\";\nimport {\n ArrowRightIcon,\n BotIcon,\n BrainCircuitIcon,\n MessageSquareTextIcon,\n SendIcon,\n WrenchIcon,\n} from \"lucide-react\";\nimport {\n Component,\n createContext,\n lazy,\n Suspense,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { jsx as rowJsx, jsxs as rowJsxs } from \"react/jsx-runtime\";\nimport { Markdown } from \"../components/markdown\";\nimport { cn } from \"../lib/cn\";\nimport { truncate } from \"../lib/format\";\nimport { defaultToolRegistry, rendersToolOutputPreview } from \"./tool-renderers\";\nimport { useEntranceAnimation, useEntranceAnimationLive } from \"./entrance\";\nimport type { RetainedArtifactLoader, RetainedScreenshotLoader, ToolRegistry } from \"./registry\";\nimport { useSeenActivityIds } from \"./seen-activity-ids\";\nimport {\n BodyNote,\n PayloadBlock,\n ActivityDisclosure,\n ToolCallTruncationProvider,\n ToolOutputPreviewProvider,\n} from \"./shared\";\nimport { invokedToolCall } from \"./invoked-tool\";\nimport { toolDisplayName } from \"./tool-display-name\";\nimport type { ActivityItem, AgentMessageItem, MemoryItem, ToolCallItem, WorkerItem } from \"./types\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\nconst LazyFleetDecisionRow = lazy(() => import(\"./fleet-decision-row\"));\nconst LazyPlatformActivityRow = lazy(() => import(\"./platform-activity-row\"));\n\n/* ----------------------------------------------------------------------------\n Activity rail\n\n Renders a run of clustered activity items (reasoning, tool calls, workers,\n sandbox ops) as the left-bordered column between chat messages. Tool calls\n resolve through the renderer registry; everything else has a first-class row.\n\n Shared by `MessageTimeline` and the component demo so both draw the exact\n same rail — no divergence.\n -------------------------------------------------------------------------- */\n\nexport type ActivityRailProps = {\n items: ActivityItem[];\n /** The owning turn remains active between individual phase receipts. */\n startupActive?: boolean;\n /** Renderer registry for tool calls. Defaults to {@link defaultToolRegistry}. */\n toolRegistry?: ToolRegistry | undefined;\n /** Drill into a spawned worker session. */\n onOpenSession?: ((sessionId: string) => void) | undefined;\n /**\n * Deep-link a memory row to its record in the host's memory pane. Opt-in: the\n * library draws no \"View in memory\" affordance without a handler (the memory\n * row is then non-interactive rich content). See {@link MessageTimelineProps}.\n */\n onMemoryClick?: ((memoryId: string) => void) | undefined;\n loadRetainedScreenshot?: RetainedScreenshotLoader | undefined;\n /** Resolve permanent generated-image receipts through the authenticated host SDK. */\n loadRetainedArtifact?: RetainedArtifactLoader | undefined;\n /** Drop the left rule + indent (used inside a folded turn summary). */\n bare?: boolean | undefined;\n className?: string | undefined;\n};\n\n/**\n * The \"family\" a row belongs to, for light intra-rail grouping. Consecutive\n * rows of the same family sit tight; a family change gets a little extra top\n * margin so a long run reads as clusters rather than one undifferentiated wall.\n */\nfunction familyOf(item: ActivityItem): string {\n if (item.kind === \"tool-call\") {\n return item.name === \"exec_command\" || item.name === \"write_stdin\" ? \"terminal\" : item.name;\n }\n return item.kind;\n}\n\nexport function ActivityRail({\n items,\n startupActive,\n toolRegistry = defaultToolRegistry,\n onOpenSession,\n onMemoryClick,\n loadRetainedScreenshot,\n loadRetainedArtifact,\n bare,\n className,\n}: ActivityRailProps) {\n const msg = useOpenGeniText();\n const debug = useStartupDetails();\n const reducedMotion = useReducedMotion();\n const [detailsOpen, setDetailsOpen] = useState(false);\n const phases = items.filter((item) => item.kind === \"startup-phase\");\n const dispatch = phases.find((item) => item.dispatchWait !== undefined);\n // Empty reasoning envelopes can arrive before any visible model output.\n const hasWork = items.some(\n (item) =>\n item.kind !== \"startup-phase\" && (item.kind !== \"reasoning\" || item.text.trim().length > 0),\n );\n const interrupted = phases.some(\n (item) => item.status === \"failed\" || item.status === \"cancelled\",\n );\n const providerResponded = phases.some(\n (item) => item.phase === \"provider_first_byte\" && item.status === \"complete\",\n );\n const responsePending = phases.some((item) => item.phase === \"provider_first_byte\");\n const loading =\n !hasWork &&\n !interrupted &&\n (startupActive ?? (!providerResponded && phases.some((item) => item.status === \"running\")));\n const visibleItems =\n debug || detailsOpen\n ? items\n : items.filter((item) =>\n item.kind === \"startup-phase\"\n ? item.status === \"failed\" || item.status === \"cancelled\"\n : item.kind !== \"reasoning\" || item.text.trim().length > 0,\n );\n const startedAt = phases.reduce((first, item) => {\n const start = item.loadingStartedAt ?? item.startedAt;\n return start < first ? start : first;\n }, phases[0]?.startedAt ?? \"\");\n const enterMounted = useEntranceAnimation();\n // Live gate: rails born during bulk capture enter=false forever; with a\n // seen-id map we still want later live appends to fade (ids gate remounts).\n const enterLive = useEntranceAnimationLive();\n const seenIds = useSeenActivityIds();\n const enter = seenIds ? enterLive : enterMounted;\n const previousIdsRef = useRef<Set<string> | null>(null);\n const enteringIds = new Set<string>();\n if (enter) {\n for (const item of items) {\n if (seenIds) {\n if (!seenIds.has(item.id)) {\n enteringIds.add(item.id);\n }\n } else if (previousIdsRef.current !== null && !previousIdsRef.current.has(item.id)) {\n // Standalone ActivityRail (tests / demo): append-only, no remount map.\n enteringIds.add(item.id);\n }\n }\n }\n useLayoutEffect(() => {\n previousIdsRef.current = new Set(items.map((item) => item.id));\n if (seenIds) {\n for (const item of items) {\n seenIds.add(item.id);\n }\n }\n });\n return (\n <div\n className={cn(\n // Rows sit TIGHT by default (gap-0.5) so a same-family run reads as one\n // calm cluster; a family change opens real breathing room (mt-3) below,\n // so a long rail reads as a few clusters, not a metronome of rows.\n \"relative flex flex-col gap-0.5\",\n !bare && \"border-l-2 border-og-border pl-3 sm:pl-4\",\n // Whole-rail enter: standalone rails only (no seen-id map). Inside\n // MessageTimeline, unknown ids take per-row enter — remounts stay quiet.\n !bare && enter && !seenIds && previousIdsRef.current === null && \"animate-og-enter\",\n className,\n )}\n >\n <AnimatePresence initial={false}>\n {loading && !debug ? (\n <motion.div\n key=\"startup\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1, height: \"auto\" }}\n exit={{\n opacity: 0,\n height: 0,\n pointerEvents: \"none\",\n }}\n transition={{\n height: { duration: reducedMotion ? 0 : 0.32, ease: [0.22, 1, 0.36, 1] },\n opacity: { duration: reducedMotion ? 0 : 0.16 },\n }}\n style={{ overflow: \"hidden\" }}\n >\n <GenieLoading\n startedAt={startedAt}\n notice={\n dispatch?.dispatchWait?.lastError\n ? msg(\"timeline.activityRail.unableToStartYetYour\")\n : undefined\n }\n phase={responsePending ? \"waiting\" : \"preparing\"}\n detailsOpen={detailsOpen}\n onShowDetails={() => setDetailsOpen((open) => !open)}\n />\n </motion.div>\n ) : null}\n </AnimatePresence>\n {detailsOpen && !debug && !loading ? (\n <button\n type=\"button\"\n className=\"og-genie-details self-start\"\n onClick={() => setDetailsOpen(false)}\n >\n {msg(\"timeline.activityRail.hideStartupDetails\")}\n </button>\n ) : null}\n {dispatch && (detailsOpen || debug) ? (\n <StartupDispatchDetails wait={dispatch.dispatchWait ?? null} />\n ) : null}\n {visibleItems.map((item, index) => {\n const newFamily = index > 0 && familyOf(item) !== familyOf(visibleItems[index - 1]!);\n const row = renderActivity(\n msg,\n item,\n toolRegistry,\n onOpenSession,\n onMemoryClick,\n loadRetainedScreenshot,\n loadRetainedArtifact,\n );\n return (\n <div\n key={item.id}\n data-og-timeline-row-anchor=\"\"\n data-og-item={item.id}\n data-og-annotation-source-key={\n item.kind === \"tool-call\" ? item.annotationSource?.eventId : undefined\n }\n className={cn(newFamily && \"mt-3\", enteringIds.has(item.id) && \"animate-og-row-enter\")}\n >\n {row}\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * Host message renderer for progress notes inside a rail, so notes keep the\n * host's links and formatting. Without one, notes render the library Markdown.\n */\nexport const ActivityNoteTextContext = createContext<\n ((text: string, item: AgentMessageItem) => ReactNode) | null\n>(null);\n\n/**\n * Assistant commentary folded into the rail: the agent's own words about the\n * work, quieter than an answer and aligned with the step titles.\n */\nfunction ActivityNoteRow({ item }: { item: AgentMessageItem }) {\n const renderText = useContext(ActivityNoteTextContext);\n if (!item.text.trim()) return null;\n return (\n <div className=\"flex items-start gap-2 px-1.5 py-1.5\" data-og-activity-note=\"\">\n <span className=\"size-3.5 shrink-0\" aria-hidden />\n <MessageSquareTextIcon aria-hidden className=\"mt-1 size-3.5 shrink-0 text-og-fg-subtle\" />\n <div\n className=\"min-w-0 flex-1 text-og-sm text-og-fg-muted\"\n data-og-search-item={item.id}\n data-og-annotation-source-key={item.annotationSource?.eventId}\n >\n {renderText ? (\n renderText(item.text, item)\n ) : (\n <Markdown softLineBreaks streaming={item.streaming}>\n {item.text}\n </Markdown>\n )}\n </div>\n </div>\n );\n}\n\n/** A never-reachable guard: adding an `ActivityItem` kind is now a compile error. */\nfunction assertNever(item: never): never {\n throw new Error(`ActivityRail: unhandled activity item ${JSON.stringify(item)}`);\n}\n\nexport function renderActivity(\n msg: OpenGeniText,\n item: ActivityItem,\n toolRegistry: ToolRegistry,\n onOpenSession: ((sessionId: string) => void) | undefined,\n onMemoryClick: ((memoryId: string) => void) | undefined,\n loadRetainedScreenshot: RetainedScreenshotLoader | undefined,\n loadRetainedArtifact: RetainedArtifactLoader | undefined,\n) {\n switch (item.kind) {\n case \"reasoning\":\n case \"sandbox\":\n case \"startup-phase\":\n return (\n <Suspense fallback={null}>\n <LazyPlatformActivityRow\n item={item}\n d={ActivityDisclosure}\n p={PayloadBlock}\n t={(name: string) => toolDisplayName(msg, name)}\n b={BotIcon}\n m={Markdown}\n j={rowJsx}\n s={rowJsxs}\n />\n </Suspense>\n );\n case \"tool-call\": {\n // A deferred tool run through tool_invoke reads as the tool it ran.\n const shown = invokedToolCall(item);\n const Renderer = toolRegistry.resolve(shown);\n const outputPreview = item.outputPreview ?? null;\n // A row that cannot read its preview waits for its exact output; one\n // whose read failed, or that has no reader, falls back to the generic\n // row, which says it shows a preview.\n const exactFirst = outputPreview !== null && !rendersToolOutputPreview(Renderer, shown);\n const Shown =\n exactFirst && (outputPreview.state === \"error\" || !outputPreview.load)\n ? toolRegistry.fallback\n : Renderer;\n return (\n <ToolRowBoundary name={toolDisplayName(msg, shown.name)} resetKeys={[item.status, Shown]}>\n <ToolCallTruncationProvider value={item.truncation ?? null}>\n <ToolOutputPreviewProvider value={outputPreview}>\n {exactFirst && outputPreview.load && outputPreview.state !== \"error\" ? (\n <ToolOutputExactRow item={shown} preview={outputPreview} />\n ) : (\n <Shown\n item={shown}\n loadRetainedScreenshot={loadRetainedScreenshot}\n loadRetainedArtifact={loadRetainedArtifact}\n />\n )}\n </ToolOutputPreviewProvider>\n </ToolCallTruncationProvider>\n </ToolRowBoundary>\n );\n }\n case \"worker\":\n return <WorkerRow item={item} onOpenSession={onOpenSession} />;\n case \"knowledge\":\n return (\n <KnowledgeReceiptRow\n outcome={item.outcome}\n entryId={item.entryId}\n fileId={item.fileId}\n title={item.filename}\n source={Boolean(item.fileId)}\n />\n );\n case \"memory\":\n return <MemoryRow item={item} onMemoryClick={onMemoryClick} />;\n case \"agent-message\":\n return <ActivityNoteRow item={item} />;\n case \"fleet-decision\":\n return (\n <Suspense fallback={null}>\n <LazyFleetDecisionRow\n item={item}\n d={ActivityDisclosure}\n b={BodyNote}\n j={rowJsx}\n s={rowJsxs}\n />\n </Suspense>\n );\n default:\n return assertNever(item);\n }\n}\n\n/**\n * A tool row whose renderer needs its exact output: it reads it on mount and\n * stands in as a quiet loading row until the output lands.\n */\nfunction ToolOutputExactRow({\n item,\n preview,\n}: {\n item: ToolCallItem;\n preview: NonNullable<ToolCallItem[\"outputPreview\"]>;\n}) {\n const msg = useOpenGeniText();\n const pending = preview.state === \"preview\";\n const load = preview.load;\n useEffect(() => {\n if (pending) load?.();\n }, [pending, load]);\n return (\n <div data-og-tool-output-loading=\"\" aria-busy=\"true\">\n <ActivityDisclosure\n icon={<WrenchIcon className=\"size-3.5\" />}\n title={toolDisplayName(msg, item.name, item.display)}\n preview={msg(\"timeline.toolRenderers.loadingOutput\")}\n expandable={false}\n />\n </div>\n );\n}\n\n/**\n * Human labels for the memory kinds, translated at the SDK boundary so a raw\n * enum slug never renders as UI. Kept local to the library (the app has its own\n * `KIND_LABEL`); an unknown kind simply omits the chip rather than showing a slug.\n */\nconst MEMORY_KIND_LABEL = (msg: OpenGeniText): Record<string, string> => ({\n preference: msg(\"timeline.activityRail.preference\"),\n semantic: msg(\"timeline.activityRail.fact\"),\n procedural: msg(\"timeline.activityRail.procedure\"),\n decision: msg(\"timeline.activityRail.decision\"),\n episodic: msg(\"timeline.activityRail.history\"),\n});\n\n/**\n * A memory write the agent made mid-turn. A calm, NEUTRAL step (a successful save\n * is ordinary progress, never an exceptional state, so no accent/color): a brain-\n * circuit glyph, \"Saved to memory\" / \"Updated memory\", a human kind chip, and the\n * memory text. Expanding reveals the full text; a supersede shows the old text\n * struck through above the new one. When the host opts in with `onMemoryClick`,\n * a quiet \"View in memory\" affordance deep-links to the LIVE record.\n */\nfunction MemoryRow({\n item,\n onMemoryClick,\n}: {\n item: MemoryItem;\n onMemoryClick?: ((memoryId: string) => void) | undefined;\n}) {\n const msg = useOpenGeniText();\n const corrected = item.variant === \"corrected\";\n const kindLabel = MEMORY_KIND_LABEL(msg)[item.memoryKind];\n // A supersede carries both the old text (`preview`) and the new (`replacementPreview`);\n // an in-place update / archive carries only `preview`.\n const superseded = corrected && Boolean(item.replacementPreview);\n // Link to the LIVE record: a supersede's replacement when present, else the memory itself.\n const targetId = corrected ? (item.replacementMemoryId ?? item.memoryId) : item.memoryId;\n const deepLink = Boolean(onMemoryClick);\n return (\n <ActivityDisclosure\n icon={<BrainCircuitIcon className=\"size-3.5\" />}\n iconTone=\"muted\"\n title={\n <span className=\"inline-flex min-w-0 items-center gap-2\">\n <span className=\"shrink-0\">\n {corrected\n ? msg(\"timeline.activityRail.updatedMemory\")\n : msg(\"timeline.activityRail.savedToMemory\")}\n </span>\n {kindLabel ? (\n <span className=\"shrink-0 rounded-og-xs bg-og-surface-2 px-1.5 py-px text-og-xs font-normal leading-tight text-og-fg-subtle\">\n {kindLabel}\n </span>\n ) : null}\n </span>\n }\n preview={superseded ? item.replacementPreview : item.preview}\n >\n {superseded ? (\n // The correction as a before → after: the old memory struck through and\n // dimmed, the new text in the ordinary body weight below it.\n <div className=\"flex flex-col gap-1.5\">\n <p className=\"whitespace-pre-wrap text-og-sm leading-6 text-og-fg-subtle line-through\">\n {item.preview}\n </p>\n <p className=\"whitespace-pre-wrap text-og-base leading-6 text-og-fg-muted\">\n {item.replacementPreview}\n </p>\n </div>\n ) : corrected && item.action === \"updated\" ? (\n // Edited in place, no replacement record: the memory is still live, so\n // show its current text — NOT the archived treatment.\n <>\n <p className=\"whitespace-pre-wrap text-og-base leading-6 text-og-fg-muted\">\n {item.preview}\n </p>\n <BodyNote tone=\"muted\">{msg(\"timeline.activityRail.updatedInPlace\")}</BodyNote>\n </>\n ) : corrected ? (\n // A correction with no replacement (and not an in-place update) archived the record.\n <BodyNote tone=\"muted\">{msg(\"timeline.activityRail.archived\")}</BodyNote>\n ) : (\n <p className=\"whitespace-pre-wrap text-og-base leading-6 text-og-fg-muted\">\n {item.preview}\n </p>\n )}\n {item.deduped ? (\n <BodyNote tone=\"muted\">{msg(\"timeline.activityRail.mergedIntoAnExistingMemory\")}</BodyNote>\n ) : null}\n {deepLink ? (\n <button\n type=\"button\"\n onClick={() => onMemoryClick?.(targetId)}\n className={cn(\n \"group/memlink -mx-1 inline-flex w-fit items-center gap-1 rounded-og-sm px-1 py-0.5 text-left text-og-sm text-og-fg-subtle\",\n \"outline-hidden transition-colors duration-150 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent\",\n )}\n >\n {msg(\"timeline.activityRail.viewInMemory\")}\n <ArrowRightIcon className=\"size-3.5 transition-transform duration-150 group-hover/memlink:translate-x-0.5\" />\n </button>\n ) : null}\n </ActivityDisclosure>\n );\n}\n\n/**\n * Spawning or messaging another agent: a named rail step. The title names the\n * agent, one line previews the brief or message, expanding shows it in full,\n * and the trailing arrow opens the agent's session once its id is known. A\n * failed or interrupted call keeps its quiet chip; an interrupted one, or a\n * spawn that never produced a session, offers no link.\n */\nfunction WorkerRow({\n item,\n onOpenSession,\n}: {\n item: WorkerItem;\n onOpenSession?: ((sessionId: string) => void) | undefined;\n}) {\n const msg = useOpenGeniText();\n const identity = useAgentIdentity();\n const running = item.status === \"running\";\n const failed = item.status === \"failed\";\n const cancelled = item.status === \"cancelled\";\n const sessionId = item.workerSessionId;\n const name = identity.titleFor(sessionId) ?? (item.action === \"spawn\" ? item.title : null);\n const title = workerRowTitleParts(msg, item, name);\n const prompt = item.prompt?.trim() ? item.prompt.trim() : null;\n const failure = failed ? item.failure : null;\n const hasBody = Boolean(prompt) || Boolean(failure);\n return (\n <AgentRow\n icon={item.action === \"spawn\" ? <BotIcon /> : <SendIcon />}\n title={title}\n preview={\n failure ? failure.message : prompt ? truncate(prompt.replace(/\\s+/g, \" \"), 240) : null\n }\n sessionId={cancelled ? null : sessionId}\n onOpenSession={onOpenSession ?? identity.onOpenSession}\n running={running}\n failed={failed}\n cancelled={cancelled}\n >\n {hasBody ? (\n <>\n {prompt ? (\n <AgentRowSection\n label={\n item.action === \"spawn\"\n ? msg(\"timeline.activityRail.brief\")\n : msg(\"timeline.activityRail.message\")\n }\n >\n {prompt}\n </AgentRowSection>\n ) : null}\n {failure ? (\n <AgentRowSection label={failure.code} muted>\n {failure.message}\n </AgentRowSection>\n ) : null}\n </>\n ) : undefined}\n </AgentRow>\n );\n}\n\n/**\n * One tool row that fails to render shows a one-line note in its place, so the\n * rest of the work group (and the live preview) keeps reading normally.\n */\nfunction ToolRowRenderError({ name }: { name: string }) {\n const t = useOpenGeniText();\n return (\n <div\n data-testid=\"tool-row-render-error\"\n role=\"status\"\n className=\"px-1.5 py-1.5 text-og-menu text-og-fg-subtle\"\n >\n {t(\"timeline.activityRail.nameCouldNotBeDisplayed\", { name })}\n </div>\n );\n}\n\nclass ToolRowBoundary extends Component<\n { name: string; resetKeys: readonly unknown[]; children: ReactNode },\n { failed: boolean; resetKeys: readonly unknown[] }\n> {\n state = { failed: false, resetKeys: this.props.resetKeys };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n /** A new status or renderer for the row gets a fresh attempt. */\n static getDerivedStateFromProps(\n props: { resetKeys: readonly unknown[] },\n state: { failed: boolean; resetKeys: readonly unknown[] },\n ): { failed: boolean; resetKeys: readonly unknown[] } | null {\n const same =\n props.resetKeys.length === state.resetKeys.length &&\n props.resetKeys.every((key, index) => Object.is(key, state.resetKeys[index]));\n return same ? null : { failed: false, resetKeys: props.resetKeys };\n }\n\n render(): ReactNode {\n if (!this.state.failed) return this.props.children;\n return <ToolRowRenderError name={this.props.name} />;\n }\n}\n","import { ThinkingOrb } from \"thinking-orbs\";\nimport { useThemeType } from \"../lib/use-theme-type\";\nimport { GENIE_PREPARING_PHRASES, GENIE_WAITING_PHRASES } from \"./genie-copy\";\nimport { createContext, useContext, useEffect, useState, type ReactNode } from \"react\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\nexport type GenieLoadingRenderProps = {\n startedAt: string;\n phase: \"preparing\" | \"waiting\";\n detailsOpen: boolean;\n onShowDetails: () => void;\n};\n\nexport type GenieLoadingOptions = {\n /** Replace the visual while preserving SDK loading visibility and transitions. */\n render?: (props: GenieLoadingRenderProps) => ReactNode;\n phrases?: readonly string[];\n /** Native copy overrides. Omitted messages retain the default English copy. */\n messages?: {\n status?: string;\n slowStatus?: string;\n slowText?: string;\n showDetails?: string;\n hideDetails?: string;\n };\n /** Public adapter options; the renderer dependency's declarations stay private. */\n orb?: {\n state?:\n | \"working\"\n | \"searching\"\n | \"solving\"\n | \"listening\"\n | \"connecting\"\n | \"weaving\"\n | \"composing\"\n | \"breathing\"\n | \"shaping\";\n size?: 64 | 20;\n speed?: number;\n };\n};\nexport const GenieLoadingOptionsContext = createContext<GenieLoadingOptions | undefined>(undefined);\n\n/**\n * Neutral defaults for conversations embedded in another product\n * (`SessionConversation`, `OpenGeniChat`), which should not carry Opengeni's\n * own playful copy. The Opengeni app keeps the defaults above.\n */\nexport const EMBEDDED_GENIE_LOADING = (t: OpenGeniText) =>\n ({\n phrases: [t(\"timeline.genieLoading.thinking\")],\n messages: { showDetails: t(\"timeline.genieLoading.showDetails\") },\n }) as const satisfies GenieLoadingOptions;\n\n/** Decorative copy never substitutes for a failure or claims measurable progress. */\nexport function GenieLoading({\n startedAt,\n phase = \"preparing\",\n onShowDetails,\n detailsOpen = false,\n notice,\n}: {\n startedAt: string;\n phase?: GenieLoadingRenderProps[\"phase\"];\n onShowDetails: () => void;\n detailsOpen?: boolean;\n /** An actionable startup problem takes precedence over decorative copy. */\n notice?: string | undefined;\n}) {\n const t = useOpenGeniText();\n const options = useContext(GenieLoadingOptionsContext);\n const waiting = phase === \"waiting\";\n const phrases = options?.phrases?.length\n ? options.phrases\n : waiting\n ? GENIE_WAITING_PHRASES(t)\n : GENIE_PREPARING_PHRASES(t);\n const theme = useThemeType(undefined);\n const [phrase, setPhrase] = useState(0);\n const [showDetails, setShowDetails] = useState(false);\n const [slow, setSlow] = useState(false);\n // Only the number of phrases matters to the rotation. The phrase list is a\n // fresh array on every render (translated text, or an inline host option),\n // so depending on its identity would restart the timer and re-pick a phrase\n // after every render, chaining renders until the random pick repeats.\n const phraseCount = phrases.length;\n useEffect(() => {\n const update = () => {\n setShowDetails(Date.now() - Date.parse(startedAt) >= 30_000);\n setSlow(Date.now() - Date.parse(startedAt) >= 60_000);\n if (!document.hidden) setPhrase(Math.floor(Math.random() * phraseCount));\n };\n update();\n const timer = window.setInterval(update, 5_000);\n return () => window.clearInterval(timer);\n }, [startedAt, phraseCount]);\n if (options?.render && !notice)\n return options.render({ startedAt, phase, detailsOpen, onShowDetails });\n return (\n <div className=\"og-genie-loading\">\n <div\n className=\"og-genie-orb\"\n aria-hidden=\"true\"\n style={{\n width: options?.orb?.size ?? 64,\n height: options?.orb?.size ?? 64,\n flexBasis: options?.orb?.size ?? 64,\n }}\n >\n <ThinkingOrb state=\"searching\" size={64} theme={theme} speed={0.8} {...options?.orb} />\n </div>\n <div className=\"og-genie-copy\">\n <span className=\"sr-only\" role=\"status\">\n {notice ??\n (slow\n ? (options?.messages?.slowStatus ??\n (waiting\n ? t(\"timeline.genieLoading.waitingForAResponseTaking\")\n : t(\"timeline.genieLoading.preparingYourTaskTakingLonger\")))\n : (options?.messages?.status ??\n (waiting\n ? t(\"timeline.genieLoading.waitingForAResponse\")\n : t(\"timeline.genieLoading.preparingYourTask\"))))}\n </span>\n <span\n key={notice ?? (slow ? \"slow\" : phrase)}\n className=\"og-genie-phrase\"\n style={notice ? { animation: \"none\" } : undefined}\n aria-hidden=\"true\"\n >\n {notice ??\n (slow\n ? (options?.messages?.slowText ??\n (waiting\n ? t(\"timeline.genieLoading.stillWaitingForAResponse\")\n : t(\"timeline.genieLoading.aLittleLongerThanUsual\")))\n : phrases[phrase % phrases.length])}\n </span>\n {showDetails || detailsOpen || notice ? (\n <button\n type=\"button\"\n className=\"og-genie-details\"\n aria-expanded={detailsOpen}\n onClick={onShowDetails}\n >\n {detailsOpen\n ? (options?.messages?.hideDetails ?? t(\"timeline.genieLoading.hideDetails\"))\n : (options?.messages?.showDetails ??\n (waiting\n ? t(\"timeline.genieLoading.showDetails\")\n : t(\"timeline.genieLoading.behindTheMagic\")))}\n <span aria-hidden=\"true\"> ↗</span>\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport type { Session } from \"@opengeni/sdk\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\n/** Live dispatch diagnostics belong to the current loading area, never history. */\nexport function StartupDispatchDetails({ wait }: { wait: Session[\"dispatchWait\"] }) {\n const t = useOpenGeniText();\n const [now, setNow] = useState(Date.now);\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 15_000);\n return () => clearInterval(timer);\n }, []);\n const next = wait?.nextAttemptAt ? new Date(wait.nextAttemptAt) : null;\n return (\n <div className=\"text-og-xs text-og-fg-muted\" data-og-startup-dispatch-details=\"\">\n <p>{t(\"timeline.startupDispatchDetails.yourMessagesAreSavedNo\")}</p>\n <p>\n {wait?.state === \"pending\" && next\n ? next.getTime() <= now\n ? t(\"timeline.startupDispatchDetails.automaticStartRetryIsDue\")\n : t(\"timeline.startupDispatchDetails.automaticStartRetryAtLocaletimestring\", {\n localeTimeString: next.toLocaleTimeString(t.locale, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n })\n : wait?.state === \"acknowledged\"\n ? t(\"timeline.startupDispatchDetails.theStartRequestWasAccepted\")\n : t(\"timeline.startupDispatchDetails.startConfirmationIsUnavailable\")}\n </p>\n {wait && wait.attempts > 0 ? (\n <p>{t(\"timeline.startupDispatchDetails.dispatchAttempts\", { count: wait.attempts })}</p>\n ) : null}\n {wait?.lastError ? (\n <p className=\"max-h-32 overflow-y-auto whitespace-pre-wrap break-words\">\n {t(\"timeline.startupDispatchDetails.lastRecordedDispatchErrorLasterror\", {\n lastError: wait.lastError,\n })}\n </p>\n ) : null}\n </div>\n );\n}\n","import { createContext, useContext, useRef, type ReactNode } from \"react\";\n\n/* ----------------------------------------------------------------------------\n Entrance animation gating\n\n Bulk paints (the initial tail window, a prepended older window) must not run\n per-row entrance animations — hundreds of rows fading in at once reads as a\n full-timeline flash. Toggling `animation: none` on and off is NOT an option:\n removing the override restarts every animation, which is itself the flash.\n\n Instead each animated element decides ONCE, at its own mount, whether it was\n born in a bulk paint — and keeps that decision forever. Rows born in a bulk\n paint never animate; rows appended live animate exactly as before. Nothing\n is ever toggled on existing DOM, so nothing can replay.\n -------------------------------------------------------------------------- */\n\nconst EntranceAnimationContext = createContext(true);\nconst EntranceAnimationLiveContext = createContext(true);\n\n/**\n * Freeze the mount-time gate for this subtree while publishing a separate live\n * gate to activity rails that need later appends to animate after a bulk paint.\n * MessageTimeline mounts one provider per durable group, so existing groups do\n * not receive a context invalidation when a prepend toggles bulk mode and new\n * groups still capture the value from the commit that created them.\n */\nexport function EntranceAnimationProvider({\n value,\n liveValue = value,\n children,\n}: {\n value: boolean;\n liveValue?: boolean | undefined;\n children: ReactNode;\n}) {\n const mountedValue = useRef(value).current;\n return (\n <EntranceAnimationContext.Provider value={mountedValue}>\n <EntranceAnimationLiveContext.Provider value={liveValue}>\n {children}\n </EntranceAnimationLiveContext.Provider>\n </EntranceAnimationContext.Provider>\n );\n}\n\n/**\n * Live entrance gate from the nearest provider. Prefer\n * {@link useEntranceAnimation} for elements that must freeze the decision at\n * mount; use this when a stable parent (e.g. ActivityRail) needs to animate\n * later appends after a bulk window clears.\n */\nexport function useEntranceAnimationLive(): boolean {\n return useContext(EntranceAnimationLiveContext);\n}\n\n/**\n * Whether this element should wear the entrance animation. Captured at mount\n * from the nearest provider (true outside any provider) and stable for the\n * element's lifetime — see the module doctrine above.\n */\nexport function useEntranceAnimation(): boolean {\n const enabled = useContext(EntranceAnimationContext);\n const captured = useRef(enabled);\n return captured.current;\n}\n","import { createContext, useContext } from \"react\";\n\n/* ----------------------------------------------------------------------------\n Seen activity ids\n\n ActivityRails remount across fold wraps / settle key flips. A per-rail\n previousIds set resets on remount, so either every row re-fades (flash) or\n the first live tool never animates (pop). This map lives on MessageTimeline\n and records every activity id that has already painted — live appends of\n unknown ids earn row-enter; remounts of known ids stay quiet.\n -------------------------------------------------------------------------- */\n\nconst SeenActivityIdsContext = createContext<Set<string> | null>(null);\n\nexport const SeenActivityIdsProvider = SeenActivityIdsContext.Provider;\n\nexport function useSeenActivityIds(): Set<string> | null {\n return useContext(SeenActivityIdsContext);\n}\n","import { ChevronRightIcon, CircleSlashIcon, ShrinkIcon, TriangleAlertIcon } from \"lucide-react\";\nimport {\n Component,\n createContext,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { Collapsible } from \"radix-ui\";\nimport { CopyButton } from \"../components/copy-button\";\nimport { cn } from \"../lib/cn\";\nimport { MOTION_INSPECT_SCALE } from \"../lib/motion-inspect\";\nimport { presentTurnFailureText } from \"./compaction-copy\";\nimport { useForcedDefaultOpen } from \"./disclosure-context\";\nimport { useTimelineSearchReveal } from \"../components/timeline-search\";\nimport { useEntranceAnimation } from \"./entrance\";\nimport { useFoldMemory, type FoldRestingState } from \"./fold-memory\";\nimport {\n BUILT_IN_TURN_SUMMARY_FACET_IDS,\n createTurnSummaryContext,\n formatElapsed,\n resolveTurnSummaryFacets,\n selectTurnSummaryFacets,\n turnSummaryFallbackLabel,\n type TurnSummaryFacetConfiguration,\n type TurnSummaryStatus,\n} from \"./turn-summary-model\";\nimport type { ActivityItem, TurnOutcome } from \"./types\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\nimport { ShimmerText } from \"./shimmer-text\";\n\nexport { BUILT_IN_TURN_SUMMARY_FACET_IDS, formatElapsed };\nexport type {\n BuiltInTurnSummaryFacetId,\n TurnSummaryContext,\n TurnSummaryFacet,\n TurnSummaryFacetConfiguration,\n TurnSummaryFacetResult,\n TurnSummaryOptions,\n TurnSummaryStatus,\n} from \"./turn-summary-model\";\nexport type { TurnOutcome } from \"./types\";\n\n/* ----------------------------------------------------------------------------\n Turn summary\n\n A completed (or failed/cancelled) turn folds behind one quiet summary chip:\n \"N steps · M files · K commands · 1 screenshot · 4m\". The chip is the default\n surface; expanding it reveals the full settled turn body. Top-level live\n activity keeps the same open shell so settling never remounts the rail into\n a brand-new wrapper (that remount was the hard yank).\n\n This keeps the timeline calm: a finished turn is a single line until the\n reader chooses to look inside it.\n -------------------------------------------------------------------------- */\n\nconst TurnSettleChromeContext = createContext(false);\n\n/**\n * True while settle chrome is active (open beat, slow collapse, or the short\n * cancel-close latch). Nested cluster chips stay mounted and forced OPEN for\n * this window so the body keeps a stable height — never flat-map to bare\n * rails, and never remount closed nested chips mid-collapse (that yanked).\n */\nexport function useTurnSettleOpen(): boolean {\n return useContext(TurnSettleChromeContext);\n}\n\nexport type TurnSummaryProps = {\n /** Reports the disclosure's actual open state on mount and on every change. */\n onOpenStateChange?: ((open: boolean) => void) | undefined;\n /** The activity items in the turn (used only to compute the facet counts). */\n items: ActivityItem[];\n /**\n * The settled verdict — or absent for a completed CLUSTER of a still-running\n * turn, which folds neutrally. Only unfinished activity inside this summary\n * animates; the parent turn may still be composing a response elsewhere.\n */\n outcome?: TurnOutcome | undefined;\n /** A short failure reason shown inline on a failed chip (never hidden). */\n failureText?: string | undefined;\n /** Elapsed turn duration; shown as a trailing facet when at least 1s. */\n durationMs?: number | undefined;\n /** Start expanded. */\n defaultOpen?: boolean | undefined;\n liveHeader?: ReactNode;\n /**\n * A nested fold — a cluster or sub-turn INSIDE an already-expanded turn. It\n * drops the bordered/filled chip and renders as a plain disclosure node on the\n * parent's rail (chevron + glyph + facets), so expanding a turn reveals a thread\n * of nodes, never a stack of boxes-in-boxes. The top-level fold stays a chip.\n */\n bare?: boolean | undefined;\n /** Per-instance facet customization. Omit to preserve the built-in summary exactly. */\n facets?: TurnSummaryFacetConfiguration | undefined;\n /**\n * Settle choreography: this fold replaced rows the reader was just watching\n * live. Instead of yanking them behind a chip in one frame, the fold mounts\n * OPEN with the summary chip easing in above the still-visible rows, holds a\n * short beat so the reader registers the settle, then glides closed. Any\n * user interaction during the beat cancels the auto-collapse. Captured at\n * mount; ignored when the fold starts expanded (e.g. a failed turn).\n */\n settleFold?: boolean | undefined;\n /**\n * Durable identity (timeline group id) for cross-remount fold memory. When\n * an ancestor provides a {@link FoldMemoryProvider} map, reaching a resting\n * state is recorded under this key: \"closed\" when the settle choreography\n * completes its collapse or the reader closes the chip, \"open\" when the\n * reader expands it. A later remount under the same key restores that\n * resting state and never replays the open settle beat — the activity→turn\n * wrap and the nested force-open during settle chrome must not re-expand a\n * fold that already settled closed.\n */\n foldKey?: string | undefined;\n /**\n * When set, a hover/focus copy control sits on the chip row (outside the\n * disclosure trigger) so the reader can copy the turn's assistant prose\n * without toggling the fold.\n */\n copyText?: string | undefined;\n /** Adjacent compaction landmark count for the secondary chip facet. */\n contextCompactionCount?: number | undefined;\n /**\n * Exchange status line (compact progress presentation). Replaces the state\n * marker and the duration facet; a settled `worked` row reads as a separator.\n */\n status?: TurnSummaryStatus | undefined;\n /**\n * False when the fold has nothing to reveal: the row renders without a\n * chevron and is not a disclosure control. Defaults to true.\n */\n expandable?: boolean | undefined;\n /** The turn has steps that are not loaded yet (opening the row reads them). */\n unloadedSteps?: boolean | undefined;\n /** The rendered activity rail revealed on expand. */\n children: ReactNode;\n};\n\n/** How long a settling fold stays open before gliding closed. */\nconst SETTLE_FOLD_BEAT_MS = 1100 * MOTION_INSPECT_SCALE;\n/** Keep in sync with `--og-duration-disclose-settle`. */\nconst SETTLE_COLLAPSE_MS = 820 * MOTION_INSPECT_SCALE;\n/** Keep in sync with `--og-duration-disclose` (manual / cancel-close). */\nconst DISCLOSE_MS = 120 * MOTION_INSPECT_SCALE;\n\nexport function TurnSummary({\n items,\n outcome,\n failureText,\n durationMs,\n defaultOpen,\n liveHeader,\n bare,\n facets: facetConfiguration,\n settleFold,\n foldKey,\n copyText,\n contextCompactionCount,\n status,\n expandable = true,\n unloadedSteps,\n onOpenStateChange,\n children,\n}: TurnSummaryProps) {\n const t = useOpenGeniText();\n // An explicit `defaultOpen` always wins; otherwise an ancestor may seed it\n // (screenshot instrumentation); otherwise the turn starts folded.\n const forcedDefaultOpen = useForcedDefaultOpen();\n const searchReveal = useTimelineSearchReveal();\n const foldMemory = useFoldMemory();\n // A remembered resting state outranks author defaults: a fold that already\n // finished its settle collapse (or that the reader closed) mounts closed\n // even when a remount asks for the settle beat or a forced defaultOpen —\n // and one the reader expanded mounts open instead of snapping shut.\n const remembered = foldKey !== undefined ? foldMemory?.get(foldKey) : undefined;\n const restingOpen =\n remembered === \"closed\"\n ? false\n : remembered === \"open\"\n ? true\n : (defaultOpen ?? forcedDefaultOpen ?? false);\n const initialSettle = Boolean(settleFold) && !restingOpen && remembered === undefined;\n const [settling, setSettling] = useState(initialSettle);\n const [openState, setOpen] = useState(initialSettle ? true : restingOpen);\n // A fold with nothing to reveal never reads as open.\n const open = expandable && openState;\n const reportOpen = useRef(onOpenStateChange);\n reportOpen.current = onOpenStateChange;\n // Before paint: a listener may need to start motion in the same frame.\n useLayoutEffect(() => {\n reportOpen.current?.(open);\n }, [open]);\n const readerOwnsOpen = useRef(remembered !== undefined);\n useEffect(() => {\n // Readable work can produce primary media or fail after mounting. Reveal\n // that output without remounting existing tool controls, while preserving\n // every explicit reader-owned open/closed choice.\n if (status && defaultOpen && remembered === undefined && !readerOwnsOpen.current) setOpen(true);\n }, [status, defaultOpen, remembered]);\n // While true, a close uses the slow settle collapse. Cleared after that\n // auto-collapse finishes (or on first user interaction) so later manual\n // closes are the fast disclose pair.\n const [settlePhase, setSettlePhase] = useState(initialSettle);\n // Separate from settlePhase CSS: keep nested chips force-open through\n // cancel-close (fast collapse) without forcing the slow settle-collapse.\n const [nestSuppressLatch, setNestSuppressLatch] = useState(initialSettle);\n // Expand animation must NOT run on the settle mount (rows were already\n // visible — a height sweep would flash them). Armed once we leave that\n // initial open, so a later manual reopen animates instead of snapping.\n const [expandReady, setExpandReady] = useState(!initialSettle);\n const settleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const settleCloseDoneRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const nestLatchClearRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const settleFoldSeenRef = useRef(Boolean(settleFold));\n const settleArmedRef = useRef(false);\n const clearNestLatchTimer = () => {\n if (nestLatchClearRef.current !== null) {\n clearTimeout(nestLatchClearRef.current);\n nestLatchClearRef.current = null;\n }\n };\n const clearSettleTimers = () => {\n if (settleTimerRef.current !== null) {\n clearTimeout(settleTimerRef.current);\n settleTimerRef.current = null;\n }\n if (settleCloseDoneRef.current !== null) {\n clearTimeout(settleCloseDoneRef.current);\n settleCloseDoneRef.current = null;\n }\n clearNestLatchTimer();\n };\n const rememberResting = (state: FoldRestingState) => {\n if (foldKey !== undefined && foldMemory) {\n foldMemory.set(foldKey, state);\n }\n };\n const armSettleCollapse = () => {\n if (settleArmedRef.current) {\n return;\n }\n settleArmedRef.current = true;\n setSettling(true);\n setSettlePhase(true);\n setNestSuppressLatch(true);\n setExpandReady(false);\n setOpen(true);\n clearSettleTimers();\n settleTimerRef.current = setTimeout(() => {\n settleTimerRef.current = null;\n setExpandReady(true);\n setOpen(false);\n // The glide toward closed IS the choreography completing — record it\n // now, so a wrap that lands mid-collapse still remounts this fold shut.\n rememberResting(\"closed\");\n settleCloseDoneRef.current = setTimeout(() => {\n settleCloseDoneRef.current = null;\n settleArmedRef.current = false;\n setSettlePhase(false);\n setSettling(false);\n setNestSuppressLatch(false);\n }, SETTLE_COLLAPSE_MS);\n }, SETTLE_FOLD_BEAT_MS);\n };\n const mountSettleRef = useRef(initialSettle);\n // Mount-time settle (new turn wrap).\n // Mount-once settle arm + unmount timer cleanup — re-running on foldMemory\n // identity churn would restart the beat mid-choreography.\n useEffect(() => {\n if (mountSettleRef.current) {\n armSettleCollapse();\n }\n return () => {\n clearSettleTimers();\n settleArmedRef.current = false;\n };\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n // Live shell already open: settleFold rises later without remounting.\n // Do not require !restingOpen — live shells mount with defaultOpen and\n // only later receive settleFold. Failed turns mount with both at once\n // (seen=true), so they never take this edge.\n // Edge-trigger on settleFold only; foldMemory/foldKey are reopen guards.\n useEffect(() => {\n const was = settleFoldSeenRef.current;\n settleFoldSeenRef.current = Boolean(settleFold);\n if (!was && settleFold) {\n // A remembered resting state means this fold's story already resolved\n // once (choreography closed it, or the reader chose a state). Replaying\n // the open beat would re-expand it — the exact reopen this guards.\n if (foldKey !== undefined && foldMemory?.get(foldKey) !== undefined) {\n return;\n }\n armSettleCollapse();\n }\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, [settleFold]);\n useEffect(() => {\n if (!searchReveal) return;\n clearSettleTimers();\n settleArmedRef.current = false;\n setSettling(false);\n setSettlePhase(false);\n setNestSuppressLatch(false);\n setOpen(true);\n rememberResting(\"open\");\n // Search is an explicit, persistent reader action, not a new fold default.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n }, [searchReveal]);\n const onOpenChange = (next: boolean) => {\n readerOwnsOpen.current = true;\n // The reader took over — cancel the pending auto-collapse for good.\n // Clear settle CSS phase immediately (fast collapse) but keep nest latch\n // through the disclose window so nested chips stay force-open mid-close\n // (remounting them closed here yanks height).\n const wasNestFlat = settling || settlePhase || nestSuppressLatch;\n clearSettleTimers();\n settleArmedRef.current = false;\n rememberResting(next ? \"open\" : \"closed\");\n setExpandReady(true);\n setSettlePhase(false);\n setSettling(false);\n if (next) {\n setNestSuppressLatch(false);\n setOpen(true);\n return;\n }\n setOpen(false);\n if (wasNestFlat) {\n setNestSuppressLatch(true);\n nestLatchClearRef.current = setTimeout(() => {\n nestLatchClearRef.current = null;\n setNestSuppressLatch(false);\n }, DISCLOSE_MS);\n } else {\n setNestSuppressLatch(false);\n }\n };\n const enter = useEntranceAnimation();\n // Capture once: after a settle choreography the chip is already on screen.\n // Re-applying `animate-og-enter` when `settling` clears was the post-collapse\n // flash (opacity replay on the summary row).\n const [allowEnterAnimation] = useState(() =>\n Boolean(enter && !bare && !initialSettle && !restingOpen),\n );\n // Hold duration (and its \"· 8s\" insertion) until settle choreography finishes.\n // Surfacing it mid-beat or on the activity→turn remount made the chip text\n // reflow twice and read as another flash after the fold.\n const context = useMemo(\n () =>\n createTurnSummaryContext(\n t,\n items,\n outcome,\n failureText,\n settling || settlePhase ? undefined : durationMs,\n contextCompactionCount ?? 0,\n ),\n [items, outcome, failureText, durationMs, settling, settlePhase, contextCompactionCount, t],\n );\n const facetDefinitions = useMemo(\n () => resolveTurnSummaryFacets(facetConfiguration),\n [facetConfiguration],\n );\n const statusKind = status?.kind;\n const facets = useMemo(\n () => selectTurnSummaryFacets(facetDefinitions, context, statusKind),\n [context, facetDefinitions, statusKind],\n );\n // The chip names the failure; recorded technical text stays a hover title.\n const failure = outcome === \"failed\" ? presentTurnFailureText(t, failureText) : null;\n\n // Live open shell: keep the chip in-flow (so settle never inserts layout)\n // and quieter until there is an outcome or a settle beat — but still\n // clickable. `pointer-events-none` here trapped readers who expanded (or\n // who landed on the default-open live rail) with no way to collapse while\n // the turn was still running.\n const liveShell = outcome === undefined && open && !settlePhase && !bare;\n // Settle CSS phase OR cancel-close latch — see useTurnSettleOpen.\n // Nested chips stay force-open for this window (stable height).\n const settleChrome = settling || settlePhase || nestSuppressLatch;\n\n const statusLine = status ? turnSummaryStatusLine(t, status) : null;\n\n // Copy only on the collapsed chip — when open, per-message copy is enough\n // and a second control on the summary row felt crowded / off.\n const copyable = Boolean(\n copyText && copyText.trim().length > 0 && !bare && !liveShell && !open && !settlePhase,\n );\n\n const headerClassName = cn(\n // The section, not the viewport, bounds this sticky row. Content\n // is a sibling: its disclosure overflow never traps the header.\n // Nested rail folds must never stack additional sticky headers.\n !bare && open && \"sticky top-[var(--og-work-header-top,0px)] z-10 bg-og-bg\",\n settling && expandable && \"animate-og-settle-chip\",\n // Top-level turn fold and (when used) nested cluster folds render as\n // FLAT rail rows — chevron + glyph + facets on the page background, no\n // border, no fill. Only a hover tint hints the row is expandable, so a\n // collapsed turn never reads as a boxed card. The top-level row is a\n // touch larger (base text, size-5 glyph, wider gap) so it still reads\n // as a turn landmark above any nested cluster rows it groups.\n \"group flex w-full items-center rounded-og-sm text-left transition-colors\",\n // A folded turn is a touch target on coarse pointers: grow the row so it\n // clears the 44px minimum without disturbing the calm desktop rhythm.\n expandable && \"pointer-coarse:min-h-11 pointer-coarse:py-2.5\",\n bare\n ? \"gap-2 px-1.5 py-1.5 text-og-sm text-og-fg-muted\"\n : \"-mx-2 gap-2.5 px-2 py-1.5 text-og-base text-og-fg-muted\",\n // A failed fold keeps its red accent (glyph + inline reason below) and a\n // faint red hover wash so attention still lands there; every other\n // outcome gets the neutral surface hover. A row with nothing to reveal\n // is not a control and gets no hover.\n !expandable\n ? undefined\n : outcome === \"failed\"\n ? \"hover:bg-og-status-failed/[0.06] hover:text-og-fg\"\n : \"hover:bg-og-surface-1 hover:text-og-fg\",\n liveShell && \"text-og-fg-subtle\",\n // Phones hide the hint, so keep the copy control clear of the separator.\n status && copyable && \"max-sm:pr-10\",\n );\n const headerContent = (\n <>\n {/* Disclosure grammar matches the rows: chevron leads (far left), then any\n exceptional or active state, then the facets — one expand affordance\n side everywhere. A row with nothing to reveal keeps the chevron's space\n so its text stays aligned with neighbouring rows. */}\n {expandable ? (\n <ChevronRightIcon\n className={cn(\n \"size-3.5 shrink-0 text-og-fg-subtle transition-transform ease-og-in-out group-data-[state=open]:rotate-90\",\n settlePhase\n ? \"duration-[var(--_og-duration-disclose-settle)]\"\n : \"duration-[var(--_og-duration-disclose)]\",\n )}\n />\n ) : (\n <span aria-hidden className=\"size-3.5 shrink-0\" />\n )}\n {/* Completion is the quiet default and needs no repeated glyph. Failed,\n cancelled, and still-running folds retain a visible state marker. */}\n {status || outcome === \"complete\" || (!outcome && (liveHeader || context.settled)) ? null : (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center justify-center\",\n bare ? \"size-3.5\" : \"size-5\",\n outcome === \"failed\" ? \"text-og-status-failed\" : \"text-og-fg-subtle\",\n )}\n >\n {outcome === \"failed\" ? (\n <TriangleAlertIcon className=\"size-3\" />\n ) : outcome === \"cancelled\" ? (\n <CircleSlashIcon className=\"size-3\" />\n ) : (\n <span className=\"size-1.5 animate-og-pulse rounded-full bg-og-fg-subtle\" />\n )}\n </span>\n )}\n <span\n className={cn(\n \"min-w-0 truncate\",\n status?.kind === \"worked\" ? \"shrink\" : \"flex-1\",\n bare ? \"text-og-sm\" : \"text-og-fg-muted\",\n )}\n >\n {statusLine}\n {liveHeader && !open && !status\n ? liveHeader\n : !statusLine && facets.length === 0 && !failure && outcome !== \"cancelled\"\n ? turnSummaryFallbackLabel(t, context.items, unloadedSteps)\n : facets.map(({ facet, result }, index) => (\n <FacetRenderBoundary key={facet.id}>\n <>\n {index > 0 || statusLine ? \" · \" : null}\n <span aria-label={result.ariaLabel} title={result.title}>\n {result.icon ? (\n <span aria-hidden className=\"mr-1 inline-flex align-[-0.125em]\">\n {result.icon}\n </span>\n ) : null}\n {result.content}\n </span>\n </>\n </FacetRenderBoundary>\n ))}\n {failure ? (\n <span className=\"text-og-status-failed\" title={failure.detail}>\n {\" \"}\n · {failure.summary}\n </span>\n ) : null}\n {outcome === \"cancelled\" ? (\n <span className=\"text-og-fg-subtle\"> {t(\"timeline.turnSummary.interrupted\")}</span>\n ) : null}\n </span>\n {/* A settled exchange reads as a separator above its answer. */}\n {status?.kind === \"worked\" ? (\n <span aria-hidden className=\"ml-1 h-px min-w-0 flex-1 bg-og-border\" />\n ) : null}\n {status && status.kind !== \"worked\" && (contextCompactionCount ?? 0) > 0 ? (\n <ShrinkIcon\n className=\"size-3.5 shrink-0\"\n aria-label={t(\"timeline.turnSummary.contextCompactedExpandForDetails\")}\n />\n ) : null}\n </>\n );\n\n return (\n <TurnSettleChromeContext.Provider value={settleChrome}>\n <div className={cn(copyable && \"group/copy relative\")}>\n <Collapsible.Root\n data-og-work-section={bare ? undefined : \"\"}\n open={open}\n onOpenChange={onOpenChange}\n // History-only entrance. Never toggle this on after mount — see\n // allowEnterAnimation. Settle uses animate-og-settle-chip on the trigger.\n className={allowEnterAnimation && !liveShell ? \"animate-og-enter\" : undefined}\n >\n {expandable ? (\n <Collapsible.Trigger\n data-og-work-header={bare ? \"nested\" : \"outer\"}\n className={headerClassName}\n >\n {headerContent}\n </Collapsible.Trigger>\n ) : (\n // Nothing to reveal: a plain status row, not a disclosure control.\n <div data-og-work-header={bare ? \"nested\" : \"outer\"} className={headerClassName}>\n {headerContent}\n </div>\n )}\n {status?.guidance ? (\n // Guidance the reader needs stays visible in both fold states.\n <div data-og-exchange-guidance=\"\" className=\"min-w-0 pb-1 pl-6\">\n {status.guidance}\n </div>\n ) : null}\n {status && !open && status.preview ? (\n // Readable progress under the status line; the line above stays\n // the one disclosure control, so a click here is a mouse shortcut.\n <div\n data-og-exchange-preview=\"\"\n className={cn(\n \"flex min-w-0 flex-col gap-0.5 pb-1 pl-6\",\n expandable && \"cursor-pointer\",\n )}\n onClick={expandable ? () => onOpenChange(true) : undefined}\n >\n {status.preview ? <div className=\"min-w-0\">{status.preview}</div> : null}\n </div>\n ) : null}\n {expandable ? (\n <Collapsible.Content\n {...(nestSuppressLatch ? { forceMount: true as const } : {})}\n data-og-fold-content=\"\"\n className={cn(\n \"overflow-hidden\",\n expandReady && \"data-[state=open]:animate-og-expand\",\n // Auto-close: slow settle. Manual close (settlePhase cleared): fast.\n settlePhase\n ? \"data-[state=closed]:animate-og-settle-collapse\"\n : \"data-[state=closed]:animate-og-collapse\",\n )}\n >\n {/* A nested node indents its revealed rows under the glyph (thread nesting\n off the parent rail); the top-level turn body owns its own rail. */}\n <div className={bare ? \"pt-1 pl-5\" : \"pt-2\"}>{children}</div>\n </Collapsible.Content>\n ) : null}\n </Collapsible.Root>\n {copyable ? (\n <div className=\"pointer-events-none absolute top-1.5 right-0 z-10\">\n <div className=\"pointer-events-auto\">\n <CopyButton\n text={copyText!}\n label={t(\"timeline.turnSummary.copyTurn\")}\n reveal=\"group-hover\"\n />\n </div>\n </div>\n ) : null}\n </div>\n </TurnSettleChromeContext.Provider>\n );\n}\n\n/**\n * \"Working · 2m 14s\", \"Waiting for 2 agents · 3m 5s\", or \"Worked for 4m 10s\";\n * null when a settled span is too short to state.\n */\nfunction turnSummaryStatusLine(t: OpenGeniText, status: TurnSummaryStatus): ReactNode {\n if (status.kind === \"worked\") {\n return status.durationMs !== undefined &&\n Number.isFinite(status.durationMs) &&\n status.durationMs >= 1000 ? (\n <span data-og-exchange-status=\"worked\">\n {status.label ?? t(\"timeline.turnSummary.workedFor\")} {formatElapsed(t, status.durationMs)}\n </span>\n ) : null;\n }\n const label =\n status.label ??\n (status.kind === \"working\"\n ? t(\"timeline.turnSummary.working\")\n : t(\"timeline.turnSummary.waiting\"));\n return (\n <span data-og-exchange-status={status.kind}>\n {status.kind === \"working\" ? <ShimmerText>{label}</ShimmerText> : <span>{label}</span>}\n {status.since ? <LiveElapsed since={status.since} /> : null}\n </span>\n );\n}\n\n/** A second-resolution clock; unmounts with the live row. */\nfunction LiveElapsed({ since }: { since: string }) {\n const t = useOpenGeniText();\n const startedAt = Date.parse(since);\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n const timer = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(timer);\n }, []);\n if (!Number.isFinite(startedAt)) return null;\n return (\n <span className=\"tabular-nums\">{` · ${formatElapsed(t, Math.max(0, now - startedAt))}`}</span>\n );\n}\n\nclass FacetRenderBoundary extends Component<{ children: ReactNode }, { failed: boolean }> {\n state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n render(): ReactNode {\n return this.state.failed ? null : this.props.children;\n }\n}\n","import { createContext, useContext } from \"react\";\n\n/* ----------------------------------------------------------------------------\n Fold memory\n\n Remembers, per durable timeline group id, that a fold reached a RESTING\n state: \"closed\" when the settle choreography finished its collapse or the\n reader closed the chip by hand, \"open\" when the reader explicitly expanded\n it. The map lives OUTSIDE the component tree because the timeline\n deliberately remounts chips with fresh keys (the activity→turn wrap, the\n nested-chip key flip around settle chrome) — and a remount must never\n forget that the reader already watched this cluster fold. Re-opening an\n already-settled fold reads as the timeline undoing its own choreography.\n\n With no provider the hook returns null and every fold keeps its\n author-chosen default — standalone TurnSummary usage is unchanged.\n -------------------------------------------------------------------------- */\n\nexport type FoldRestingState = \"open\" | \"closed\";\n\nconst FoldMemoryContext = createContext<Map<string, FoldRestingState> | null>(null);\n\n/** Provide a per-timeline resting-state map (MessageTimeline owns one). */\nexport const FoldMemoryProvider = FoldMemoryContext.Provider;\n\n/** The ancestor fold-memory map, or null when none is mounted (inert). */\nexport function useFoldMemory(): Map<string, FoldRestingState> | null {\n return useContext(FoldMemoryContext);\n}\n\n/**\n * Single-cluster activity→turn wrap: copy the activity resting state onto the\n * new turn-* key. Those ids differ across the wrap; without this the turn\n * remounts settleFold and re-opens a chip the reader already watched collapse.\n *\n * Multi-cluster wraps deliberately do NOT inherit — the outer turn chip is new\n * and still takes one settle beat; nested clusters keep their own activity-*\n * memory so they stay closed under that beat.\n */\nexport function inheritFoldRestingState(\n memory: Map<string, FoldRestingState>,\n targetKey: string,\n sourceKeys: readonly string[],\n): void {\n if (memory.has(targetKey) || sourceKeys.length !== 1) {\n return;\n }\n const state = memory.get(sourceKeys[0]!);\n if (state !== undefined) {\n memory.set(targetKey, state);\n }\n}\n","import type { LearningRefusal } from \"@opengeni/sdk/learning-refusal\";\nimport { BrainCircuitIcon } from \"lucide-react\";\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { useOpenGeniText } from \"../messages/runtime\";\nimport { useEntranceAnimation } from \"./entrance\";\nimport {\n learningRefusalBody,\n learningRefusalPlace,\n learningRefusalPlaceLabel,\n learningRefusalTitle,\n type LearningRefusalPlace,\n} from \"./learning-refusal-copy\";\n\nexport type LearningRefusalActions = {\n /** Opens the place where the person can make the change themselves. */\n onOpen?: ((place: LearningRefusalPlace) => void) | undefined;\n};\n\nconst LearningRefusalActionsContext = createContext<LearningRefusalActions>({});\n\nexport function LearningRefusalActionsProvider({\n children,\n ...actions\n}: LearningRefusalActions & { children: ReactNode }) {\n return (\n <LearningRefusalActionsContext.Provider value={actions}>\n {children}\n </LearningRefusalActionsContext.Provider>\n );\n}\n\n/**\n * A change the agent tried to save to Skills, workspace instructions, or\n * Knowledge was refused. It stays outside the folded work row so the person\n * learns their request was not kept, says why in plain words, and links to\n * where they can still make it. Calm by design: nothing broke.\n */\nexport function LearningRefusalRow({ refusal }: { refusal: LearningRefusal }) {\n const t = useOpenGeniText();\n const enter = useEntranceAnimation();\n const { onOpen } = useContext(LearningRefusalActionsContext);\n const place = learningRefusalPlace(refusal);\n return (\n <div\n className={cn(\n enter && \"animate-og-enter\",\n \"flex items-start gap-2.5 rounded-og-md border border-og-status-waiting/35 bg-og-status-waiting/8 px-3.5 py-2.5 text-og-menu text-og-fg\",\n )}\n role=\"status\"\n data-og-learning-refusal={refusal.reason}\n >\n <BrainCircuitIcon aria-hidden className=\"mt-0.5 size-4 shrink-0 text-og-status-waiting\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"font-medium\">{learningRefusalTitle(t, refusal)}</p>\n <p className=\"mt-0.5 text-og-fg-muted\">{learningRefusalBody(t, refusal)}</p>\n {place && onOpen ? (\n <button\n type=\"button\"\n className=\"mt-1.5 -ml-1 rounded-og-sm px-1 py-0.5 font-medium text-og-fg underline-offset-2 hover:underline focus-visible:outline-2 focus-visible:outline-og-accent\"\n onClick={() => onOpen(place)}\n >\n {learningRefusalPlaceLabel(t, place)}\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["download","useEffect","useState","jsx","useState","useEffect","createContext","useContext","useState","jsx","jsxs","createContext","useContext","useState","useEffect","useState","jsx","fallback","useState","useEffect","BrainCircuitIcon","useContext","useState","createContext","useContext","createContext","useContext","useEffect","useState","Fragment","jsx","fallback","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","useContext","BrainCircuitIcon","useState","useSyncExternalStore","ChevronRightIcon","useContext","useState","Fragment","jsx","jsxs","useContext","useState","ChevronRightIcon","createContext","useContext","useMemo","jsx","createContext","useContext","useEffect","useState","jsx","jsxs","createContext","useContext","useState","useEffect","useEffect","useState","jsx","jsxs","useState","useEffect","BrainCircuitIcon","WrenchIcon","createContext","lazy","Suspense","useContext","useEffect","useRef","useState","createContext","useContext","useRef","jsx","createContext","useContext","Fragment","jsx","jsxs","lazy","useState","useRef","createContext","useContext","Suspense","useEffect","WrenchIcon","BrainCircuitIcon","ChevronRightIcon","CircleSlashIcon","Component","createContext","useContext","useEffect","useLayoutEffect","useMemo","useRef","useState","createContext","useContext","Fragment","jsx","jsxs","createContext","useContext","useState","useRef","useLayoutEffect","useEffect","useMemo","jsxs","Fragment","jsx","ChevronRightIcon","CircleSlashIcon","Component","BrainCircuitIcon","createContext","useContext","jsx","jsxs","createContext","useContext","BrainCircuitIcon"]}