@opengeni/react 6.8.0 → 6.8.1-canary.41842879332001

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 (685) hide show
  1. package/dist/app/app-state.js +8 -8
  2. package/dist/app/components/Composer.js +18 -18
  3. package/dist/app/components/agent/agent-capability-picker.js +6 -6
  4. package/dist/app/components/artifacts/artifact-library.js +6 -6
  5. package/dist/app/components/artifacts/artifact-viewer.js +18 -18
  6. package/dist/app/components/artifacts/chat-interactive-block.js +11 -11
  7. package/dist/app/components/artifacts/file-reach-dialog.js +6 -6
  8. package/dist/app/components/artifacts/inline-chat-image.js +19 -19
  9. package/dist/app/components/artifacts/retained-file-preview.js +20 -20
  10. package/dist/app/components/artifacts/retained-text-preview.js +3 -3
  11. package/dist/app/components/artifacts/site-audience.js +3 -3
  12. package/dist/app/components/artifacts/site-conversations.js +9 -9
  13. package/dist/app/components/artifacts/site-data.js +10 -10
  14. package/dist/app/components/artifacts/site-publishing-page.js +25 -25
  15. package/dist/app/components/artifacts/site-publishing.js +22 -22
  16. package/dist/app/components/artifacts/site-settings.js +24 -24
  17. package/dist/app/components/artifacts/site-version-menu.js +3 -3
  18. package/dist/app/components/billing-class-mark.js +3 -3
  19. package/dist/app/components/bots/bot-launch-strip.js +20 -20
  20. package/dist/app/components/bots/bot-template-dialog.js +26 -26
  21. package/dist/app/components/bots/bot-template-shortcuts.js +20 -20
  22. package/dist/app/components/bots/bot-templates-page.js +30 -30
  23. package/dist/app/components/capabilities/capability-detail-sheet.js +6 -6
  24. package/dist/app/components/capabilities/capability-logo-source.js +13 -13
  25. package/dist/app/components/capabilities/connector-tool-permissions.js +4 -4
  26. package/dist/app/components/capabilities/native-connect-setup.js +13 -13
  27. package/dist/app/components/capabilities/own-logins-shared-heads-up.js +3 -3
  28. package/dist/app/components/capabilities/prepared-mcp-setup-card.js +15 -15
  29. package/dist/app/components/capabilities/session-capability-card.js +47 -47
  30. package/dist/app/components/capabilities/session-chrome-card.js +20 -20
  31. package/dist/app/components/capabilities/session-custom-mcp-card.js +16 -16
  32. package/dist/app/components/capabilities/session-github-card.js +16 -16
  33. package/dist/app/components/capabilities/session-machine-card.js +19 -19
  34. package/dist/app/components/capabilities/session-personal-github-card.js +14 -14
  35. package/dist/app/components/capabilities/session-plugin-card.js +8 -8
  36. package/dist/app/components/command-menu/chat-status.js +15 -15
  37. package/dist/app/components/command-menu/chat-switcher.js +32 -32
  38. package/dist/app/components/command-menu/command-menu.js +36 -36
  39. package/dist/app/components/command-menu/shortcut-sheet.js +8 -8
  40. package/dist/app/components/composer-capabilities-menu-body.js +4 -4
  41. package/dist/app/components/composer-mobile-plus-panel.js +8 -8
  42. package/dist/app/components/composer-mobile-plus.js +1 -1
  43. package/dist/app/components/credit-required-gate.js +1 -1
  44. package/dist/app/components/credit-required-prompt.js +3 -3
  45. package/dist/app/components/desktop/app-shots.js +6 -6
  46. package/dist/app/components/desktop/computer-use.js +2 -2
  47. package/dist/app/components/desktop/this-computer.js +5 -5
  48. package/dist/app/components/feedback.js +3 -3
  49. package/dist/app/components/github-app-connect-launcher.js +1 -1
  50. package/dist/app/components/machines/connect-machine-dialog.js +11 -11
  51. package/dist/app/components/markdown.js +6 -6
  52. package/dist/app/components/models/models-ui.js +5 -5
  53. package/dist/app/components/my-things.js +4 -4
  54. package/dist/app/components/own-where-it-works.js +3 -3
  55. package/dist/app/components/personal-resource-attachment-surface.js +4 -4
  56. package/dist/app/components/pickers.js +5 -5
  57. package/dist/app/components/rail/channel-create-dialog.js +3 -3
  58. package/dist/app/components/rail/project-glyph.js +20 -20
  59. package/dist/app/components/rail/project-profile.js +27 -27
  60. package/dist/app/components/rail/rail-context.js +1 -1
  61. package/dist/app/components/rail/rail-sections.js +55 -55
  62. package/dist/app/components/rail/session-header.js +47 -47
  63. package/dist/app/components/rail/session-list.js +53 -53
  64. package/dist/app/components/rail/session-row-content.js +4 -4
  65. package/dist/app/components/rail/session-row-hover-details.js +14 -14
  66. package/dist/app/components/rail/session-shell.js +73 -73
  67. package/dist/app/components/rail/site-session-group-heading.js +8 -8
  68. package/dist/app/components/session/agent-configuration-panel.js +12 -12
  69. package/dist/app/components/session/banners.js +8 -8
  70. package/dist/app/components/session/console-new-conversation.js +39 -39
  71. package/dist/app/components/session/descendant-requests.js +36 -36
  72. package/dist/app/components/session/editable-artifacts-workspace.js +16 -16
  73. package/dist/app/components/session/failed-session-banner.js +6 -6
  74. package/dist/app/components/session/failure-recovery-boundary.js +3 -3
  75. package/dist/app/components/session/human-input-delegation-record.js +2 -2
  76. package/dist/app/components/session/human-input.js +33 -33
  77. package/dist/app/components/session/inspector.js +43 -43
  78. package/dist/app/components/session/message-actions.js +3 -3
  79. package/dist/app/components/session/message-resource-attachments.js +10 -10
  80. package/dist/app/components/session/model-recovery-notice.js +3 -3
  81. package/dist/app/components/session/new-session-settings-menu.js +6 -6
  82. package/dist/app/components/session/new-session-setup-strip.js +21 -21
  83. package/dist/app/components/session/sandbox-recovery-actions.js +3 -3
  84. package/dist/app/components/session/sandbox-switcher.js +7 -7
  85. package/dist/app/components/session/sandbox-workspace.js +48 -48
  86. package/dist/app/components/session/search-markdown-highlight.js +7 -7
  87. package/dist/app/components/session/search-results-view.js +8 -8
  88. package/dist/app/components/session/session-admin-access.js +4 -4
  89. package/dist/app/components/session/session-admission-notice.js +4 -4
  90. package/dist/app/components/session/session-avatar-picker.js +21 -21
  91. package/dist/app/components/session/session-avatar.js +19 -19
  92. package/dist/app/components/session/session-machine-access-notice.js +4 -4
  93. package/dist/app/components/session/session-profile-dialog.js +25 -25
  94. package/dist/app/components/session/session-profile-editor.js +26 -26
  95. package/dist/app/components/session/session-retention.js +3 -3
  96. package/dist/app/components/session/session-search-dialog.js +8 -8
  97. package/dist/app/components/session/session-tenancy-control.js +2 -2
  98. package/dist/app/components/session/session-usage-limit-section.js +4 -4
  99. package/dist/app/components/session/share-chat-dialog.js +5 -5
  100. package/dist/app/components/session/subagents.js +8 -8
  101. package/dist/app/components/session/subscription-account-indicator.js +6 -6
  102. package/dist/app/components/settings/row-select.js +4 -4
  103. package/dist/app/components/transcription-settings.js +6 -6
  104. package/dist/app/components/ui/destructive-confirm.js +5 -5
  105. package/dist/app/components/usage/usage-entry.js +3 -3
  106. package/dist/app/components/window-bar.js +9 -9
  107. package/dist/app/components/workspace-composer-plus.js +16 -16
  108. package/dist/app/components/workspace-reach.js +4 -4
  109. package/dist/app/embed/session-app.js +156 -156
  110. package/dist/app/lib/actions/actions-provider.js +8 -8
  111. package/dist/app/lib/agent-capabilities.js +3 -3
  112. package/dist/app/lib/codex-usage-query.js +2 -2
  113. package/dist/app/lib/composer-connectors.js +14 -14
  114. package/dist/app/lib/console-site.js +2 -2
  115. package/dist/app/lib/console-text.js +2 -2
  116. package/dist/app/lib/events.js +12 -12
  117. package/dist/app/lib/failed-session-copy.js +3 -3
  118. package/dist/app/lib/model-access-onboarding.js +3 -3
  119. package/dist/app/lib/move-chat-to-machine.js +3 -3
  120. package/dist/app/lib/session-branch-cache.js +8 -8
  121. package/dist/app/lib/session-create.js +4 -4
  122. package/dist/app/lib/session-group-pagination.js +8 -8
  123. package/dist/app/lib/session-hover-facts.js +13 -13
  124. package/dist/app/lib/session-model.js +2 -2
  125. package/dist/app/lib/session-pins.js +1 -1
  126. package/dist/app/lib/session-rail.js +5 -5
  127. package/dist/app/lib/session-rename.js +3 -3
  128. package/dist/app/lib/sessions-group.d.ts +5 -3
  129. package/dist/app/lib/sessions-group.js +7 -7
  130. package/dist/app/lib/site-tool-consent-dialog.js +7 -7
  131. package/dist/app/lib/site-tool-consent.js +1 -1
  132. package/dist/app/lib/turn-failure-analytics.js +4 -4
  133. package/dist/app/lib/use-follow-up-repositories.js +3 -3
  134. package/dist/app/lib/use-workspace-machines.js +4 -4
  135. package/dist/app/lib/use-workspace-model-catalog.js +3 -3
  136. package/dist/app/lib/use-workspace-rigs.js +2 -2
  137. package/dist/app/lib/workspace-navigation-preference.js +4 -4
  138. package/dist/app/lib/workspace-scope-context.js +3 -3
  139. package/dist/app/routes/artifacts.js +48 -48
  140. package/dist/app/routes/retained-artifact.js +32 -32
  141. package/dist/app/routes/session.js +94 -94
  142. package/dist/app/routes/sessions-index-hydration.js +5 -5
  143. package/dist/app/routes/sessions-index.js +76 -76
  144. package/dist/app/routes/site-view.js +55 -55
  145. package/dist/artifacts-document.js +4 -4
  146. package/dist/artifacts-presentation.js +4 -4
  147. package/dist/artifacts-spreadsheet.js +4 -4
  148. package/dist/artifacts.js +10 -10
  149. package/dist/automations.js +10 -10
  150. package/dist/{browser-viewer-ZHQDVHZ2.js → browser-viewer-H7PKY67P.js} +4 -4
  151. package/dist/{chat-interactive-block-VSDD6X3M.js → chat-interactive-block-47TCT4DN.js} +5 -5
  152. package/dist/{chunk-7Z76QP64.js → chunk-2QH3Q6Z2.js} +35 -5
  153. package/dist/chunk-2QH3Q6Z2.js.map +1 -0
  154. package/dist/{chunk-5MHMCE2G.js → chunk-2X2B6D5G.js} +3 -3
  155. package/dist/{chunk-OCXEY7HE.js → chunk-3BUI5DT7.js} +2 -2
  156. package/dist/{chunk-OSJ366KR.js → chunk-3FWP3TD3.js} +29 -29
  157. package/dist/{chunk-PWUSSSSL.js → chunk-3G5IA36N.js} +2 -2
  158. package/dist/{chunk-RGR57NYY.js → chunk-3NK4JAHL.js} +2 -2
  159. package/dist/{chunk-XUOYNJPB.js → chunk-3O7UZRWM.js} +24 -24
  160. package/dist/{chunk-JV3UI7BH.js → chunk-3OR6HMA4.js} +3 -3
  161. package/dist/{chunk-MV2CLIO6.js → chunk-3PC45I5N.js} +6 -6
  162. package/dist/{chunk-SJYTQLN3.js → chunk-3PI2BYK5.js} +3 -3
  163. package/dist/{chunk-DCEQCGVN.js → chunk-3PNA2P2Z.js} +2 -2
  164. package/dist/{chunk-ESXAECZ3.js → chunk-3XBZKF3K.js} +2 -2
  165. package/dist/{chunk-SBXSKRFA.js → chunk-45OGYO3S.js} +3 -3
  166. package/dist/{chunk-M3FDGRB4.js → chunk-4A7TKVNX.js} +3 -3
  167. package/dist/{chunk-RHXYO4H2.js → chunk-4BXRGXTD.js} +2 -2
  168. package/dist/{chunk-CV4VVLPZ.js → chunk-4HQAJA3T.js} +2 -2
  169. package/dist/{chunk-VCJQQYRE.js → chunk-4X2A3KPB.js} +4 -4
  170. package/dist/{chunk-OCXTTKVA.js → chunk-555K37A7.js} +2 -2
  171. package/dist/{chunk-EBIVTDEG.js → chunk-57L5ZXDS.js} +2 -2
  172. package/dist/{chunk-3L465FBR.js → chunk-5IADORIV.js} +6 -6
  173. package/dist/{chunk-SK5S2PCK.js → chunk-5IZQT4TE.js} +14 -14
  174. package/dist/chunk-5IZQT4TE.js.map +1 -0
  175. package/dist/{chunk-ZW5YTIH3.js → chunk-5PB46DAA.js} +1 -1
  176. package/dist/{chunk-ZW5YTIH3.js.map → chunk-5PB46DAA.js.map} +1 -1
  177. package/dist/{chunk-PVB4YVDP.js → chunk-5Y2O2432.js} +2 -2
  178. package/dist/{chunk-OOOSGPJL.js → chunk-6572EFE4.js} +1 -1
  179. package/dist/{chunk-YMI27QPF.js → chunk-6BG5HCUP.js} +2 -2
  180. package/dist/{chunk-QRECBCJM.js → chunk-6EXFJWII.js} +2 -2
  181. package/dist/{chunk-74CBR5YE.js → chunk-6PNRUGOK.js} +2 -2
  182. package/dist/{chunk-PUUEI4W3.js → chunk-6RJEY6TC.js} +5 -5
  183. package/dist/{chunk-DLVIRJGK.js → chunk-727GL2YY.js} +2 -2
  184. package/dist/{chunk-J2BTILRR.js → chunk-7FGYLFW6.js} +2 -2
  185. package/dist/{chunk-MKDFYE2E.js → chunk-7IMWTFEG.js} +2 -2
  186. package/dist/{chunk-FER6EVIY.js → chunk-7POKH54R.js} +2 -2
  187. package/dist/{chunk-H6BX6WOW.js → chunk-7T26IH6W.js} +3 -3
  188. package/dist/{chunk-R33SBMB7.js → chunk-7XQRVZZQ.js} +3 -3
  189. package/dist/{chunk-NFCS5WYC.js → chunk-A3SPPXMC.js} +3 -3
  190. package/dist/{chunk-DQPIEQGP.js → chunk-A7CWPDEH.js} +2 -2
  191. package/dist/{chunk-3PM3M2Q6.js → chunk-AGOYVKTI.js} +2 -2
  192. package/dist/{chunk-OBGOLHCP.js → chunk-AIQKZUPB.js} +3 -3
  193. package/dist/{chunk-GSCGKJNK.js → chunk-AMYDHG3S.js} +2 -2
  194. package/dist/{chunk-U4LTPFD2.js → chunk-APJPB6TX.js} +2 -2
  195. package/dist/{chunk-SP44O3OU.js → chunk-APLGT5EI.js} +2 -2
  196. package/dist/{chunk-M3HGBO2Y.js → chunk-ATNKMGLO.js} +1 -1
  197. package/dist/{chunk-4O2XWOLZ.js → chunk-AVX4CZQ3.js} +3 -3
  198. package/dist/{chunk-CXAN2FHF.js → chunk-B46MK44K.js} +6 -6
  199. package/dist/{chunk-RMCLFSMX.js → chunk-BBKUPEGG.js} +2 -2
  200. package/dist/{chunk-J2WY42FA.js → chunk-BES6OQE3.js} +2 -2
  201. package/dist/{chunk-GU7T2S5N.js → chunk-BM2N26SH.js} +2 -2
  202. package/dist/{chunk-HEGV4QMS.js → chunk-C3NS74PZ.js} +2 -2
  203. package/dist/{chunk-752WXSDN.js → chunk-C56ABB5V.js} +2 -2
  204. package/dist/{chunk-77SYIH6O.js → chunk-C6MATJQ5.js} +2 -2
  205. package/dist/{chunk-KUE5BOQE.js → chunk-CRX47CO6.js} +4 -4
  206. package/dist/{chunk-QPQ7R77C.js → chunk-CUIV2XPO.js} +3 -1
  207. package/dist/chunk-CUIV2XPO.js.map +1 -0
  208. package/dist/{chunk-GTHCHCWW.js → chunk-D33KWZQJ.js} +3 -3
  209. package/dist/{chunk-AH3DGOTK.js → chunk-D7E3BSCX.js} +2 -2
  210. package/dist/{chunk-OJWDNNW3.js → chunk-DFR3TMTZ.js} +5 -5
  211. package/dist/{chunk-WYGTAQMX.js → chunk-DICC75CU.js} +2 -2
  212. package/dist/{chunk-736RUNIA.js → chunk-DJ2LMKKX.js} +4 -4
  213. package/dist/{chunk-4F3AEJI6.js → chunk-DJI4D7PM.js} +4 -4
  214. package/dist/{chunk-LVELUUK6.js → chunk-DSZUQL4W.js} +2 -2
  215. package/dist/{chunk-MT2R57SF.js → chunk-DVF246BE.js} +2 -2
  216. package/dist/{chunk-OI6VI6SU.js → chunk-DVOWBHWN.js} +8 -8
  217. package/dist/{chunk-PZKHST7A.js → chunk-E2KPRSA4.js} +2 -2
  218. package/dist/{chunk-EKJHOWTZ.js → chunk-E3LMLWEB.js} +4 -4
  219. package/dist/{chunk-QURYQFDN.js → chunk-EDC7X7PW.js} +2 -2
  220. package/dist/{chunk-HYEIA25Y.js → chunk-EDSMULHU.js} +2 -2
  221. package/dist/{chunk-U6552Q3T.js → chunk-EQQOZ6DD.js} +2 -2
  222. package/dist/{chunk-IFSXVU2S.js → chunk-ERBDQ2GY.js} +2 -2
  223. package/dist/{chunk-IZXYFWA4.js → chunk-EWI73URG.js} +13 -13
  224. package/dist/{chunk-N3FM4BNA.js → chunk-EZ6LFN33.js} +2 -2
  225. package/dist/{chunk-4K64EKM7.js → chunk-F7YL6DPR.js} +4 -4
  226. package/dist/{chunk-ICAMYP5M.js → chunk-FIGFXMUP.js} +2 -2
  227. package/dist/{chunk-54U6ZBEX.js → chunk-FJRJK67G.js} +3 -3
  228. package/dist/{chunk-E5KOWRDU.js → chunk-FLHB2NZT.js} +2 -2
  229. package/dist/{chunk-OWET7EY2.js → chunk-FRSZSL2S.js} +19 -13
  230. package/dist/{chunk-OWET7EY2.js.map → chunk-FRSZSL2S.js.map} +1 -1
  231. package/dist/{chunk-D3PTVN2I.js → chunk-FUGGM76A.js} +2 -2
  232. package/dist/{chunk-QQIZMVAJ.js → chunk-FWLLGNGP.js} +51 -49
  233. package/dist/chunk-FWLLGNGP.js.map +1 -0
  234. package/dist/{chunk-TDTD66BK.js → chunk-FXPZAZYT.js} +2 -2
  235. package/dist/{chunk-KO3OHHY2.js → chunk-GAGAM4MT.js} +2 -2
  236. package/dist/{chunk-TK5FWVZR.js → chunk-GESGH3HY.js} +3 -3
  237. package/dist/{chunk-2VJOSU4H.js → chunk-GI4PWKXI.js} +2 -2
  238. package/dist/{chunk-KFNZZ2N6.js → chunk-GJTEBAZ7.js} +2 -2
  239. package/dist/{chunk-LTJFV2JI.js → chunk-GNCGEW7F.js} +2 -2
  240. package/dist/{chunk-34NV52R3.js → chunk-GOMUNPB6.js} +4 -4
  241. package/dist/{chunk-7YTR3UFO.js → chunk-GPWE5UD7.js} +8 -5
  242. package/dist/chunk-GPWE5UD7.js.map +1 -0
  243. package/dist/{chunk-LIJNVIT3.js → chunk-GUMUILEI.js} +3 -3
  244. package/dist/{chunk-7NLF35YL.js → chunk-GVGNHBFT.js} +4 -4
  245. package/dist/{chunk-K3D7IQQP.js → chunk-GW4YI3FB.js} +6 -6
  246. package/dist/{chunk-D5TIVCXG.js → chunk-GXKCV7X7.js} +2 -2
  247. package/dist/{chunk-2J77TWGH.js → chunk-H467EQA6.js} +3 -3
  248. package/dist/{chunk-3OK7Y6ES.js → chunk-HE77VDDR.js} +2 -2
  249. package/dist/{chunk-UO35OEOX.js → chunk-HT65RGCX.js} +3 -3
  250. package/dist/{chunk-G6ICCGJ3.js → chunk-HVQSFTE7.js} +2 -2
  251. package/dist/{chunk-G5UQBTXY.js → chunk-HXJPDC76.js} +2 -2
  252. package/dist/{chunk-GIWFLWXG.js → chunk-I6LQW24C.js} +4 -4
  253. package/dist/{chunk-467WDSOK.js → chunk-I7A6S5YL.js} +2 -2
  254. package/dist/{chunk-AAS7OWV6.js → chunk-IADS4ZYD.js} +3 -3
  255. package/dist/{chunk-Y3XZEKDQ.js → chunk-IJWMWCGR.js} +2 -2
  256. package/dist/{chunk-SGH7I7OY.js → chunk-IWFO6KOU.js} +2 -2
  257. package/dist/{chunk-GMHIOYB7.js → chunk-IYC6QGV2.js} +4 -4
  258. package/dist/{chunk-2OXSB2OL.js → chunk-J2TZIFRC.js} +3 -2
  259. package/dist/chunk-J2TZIFRC.js.map +1 -0
  260. package/dist/{chunk-3NNAC43A.js → chunk-J5AODKJO.js} +2 -2
  261. package/dist/{chunk-DIP7YALH.js → chunk-JKI3LMLH.js} +2 -2
  262. package/dist/{chunk-IJR6VOLU.js → chunk-JSYRWOCE.js} +2 -2
  263. package/dist/{chunk-CEMSIU4Z.js → chunk-JTQTWO4D.js} +5 -5
  264. package/dist/{chunk-JHZRAYI4.js → chunk-JWSRFXRN.js} +2 -2
  265. package/dist/chunk-JWSRFXRN.js.map +1 -0
  266. package/dist/{chunk-BASI553K.js → chunk-KBTKAAHM.js} +4 -4
  267. package/dist/{chunk-OYOFPNLC.js → chunk-KD7VEMWY.js} +4 -4
  268. package/dist/{chunk-3DRLCX5V.js → chunk-KPGFGRSA.js} +2 -2
  269. package/dist/{chunk-PLYVGZIN.js → chunk-KWFDEJFI.js} +1 -1
  270. package/dist/{chunk-FNXCFIPW.js → chunk-KYLEH4OF.js} +2 -2
  271. package/dist/{chunk-WXF2RTS4.js → chunk-L7FJTFJN.js} +2 -2
  272. package/dist/{chunk-KI46GKMD.js → chunk-L7VVQOSY.js} +7 -7
  273. package/dist/{chunk-M5IQVMLR.js → chunk-LAZ2QZTJ.js} +11 -4
  274. package/dist/chunk-LAZ2QZTJ.js.map +1 -0
  275. package/dist/chunk-LKLQVANM.js +2 -0
  276. package/dist/{chunk-YNTLWCF4.js → chunk-LLYEAZ4E.js} +3 -3
  277. package/dist/{chunk-4Z5X7PLC.js → chunk-LWM7JUW6.js} +3 -3
  278. package/dist/{chunk-CHU3RDV4.js → chunk-LXKV4ND3.js} +3 -3
  279. package/dist/{chunk-AB5IW227.js → chunk-LYLICEQO.js} +3 -3
  280. package/dist/{chunk-PSM3CU7N.js → chunk-M3OZOCIK.js} +46 -39
  281. package/dist/chunk-M3OZOCIK.js.map +1 -0
  282. package/dist/{chunk-OTW25A6I.js → chunk-M5GRI5K4.js} +3 -3
  283. package/dist/{chunk-X2QJXDE4.js → chunk-MF65PKKF.js} +8 -8
  284. package/dist/{chunk-EDDKPIIV.js → chunk-MJ4XIOPM.js} +2 -2
  285. package/dist/{chunk-FLWQJDJ5.js → chunk-MMPJJQG3.js} +6 -6
  286. package/dist/{chunk-T67LTMSW.js → chunk-MOU54FGD.js} +10 -10
  287. package/dist/{chunk-LQKVNREV.js → chunk-NAWHQ4IL.js} +3 -3
  288. package/dist/{chunk-ZBHGNE2J.js → chunk-NBHBB2VV.js} +3 -3
  289. package/dist/{chunk-PF2WU2IL.js → chunk-ND4IQJUM.js} +120 -17
  290. package/dist/chunk-ND4IQJUM.js.map +1 -0
  291. package/dist/{chunk-U5UGM5XD.js → chunk-NMOZDAEZ.js} +5 -5
  292. package/dist/{chunk-D74Z2N4K.js → chunk-NZA4R3BE.js} +2 -2
  293. package/dist/{chunk-WRMUXZ7C.js → chunk-OB2CX7PJ.js} +3 -3
  294. package/dist/{chunk-YJSCLGAW.js → chunk-OB4I4OIT.js} +3 -3
  295. package/dist/{chunk-DWJ6J3YW.js → chunk-OKQW2FPL.js} +4 -4
  296. package/dist/{chunk-2GCHGWNE.js → chunk-ORLX6A3C.js} +3 -3
  297. package/dist/{chunk-EBTUPRRQ.js → chunk-P5N4EYFW.js} +4 -4
  298. package/dist/{chunk-JKL5S7UQ.js → chunk-PL4JE3NI.js} +6 -6
  299. package/dist/{chunk-OP2GD6QW.js → chunk-PNUHKDY2.js} +2 -2
  300. package/dist/{chunk-MZY3VKKM.js → chunk-PWJE7D6V.js} +2 -2
  301. package/dist/{chunk-RISUROBM.js → chunk-PYE27I6J.js} +4 -4
  302. package/dist/{chunk-SPD4ULVB.js → chunk-PYMROAWS.js} +2 -1
  303. package/dist/chunk-PYMROAWS.js.map +1 -0
  304. package/dist/{chunk-Q5K2J5GG.js → chunk-Q74FQK3A.js} +13 -3
  305. package/dist/chunk-Q74FQK3A.js.map +1 -0
  306. package/dist/{chunk-R5QAL43H.js → chunk-QIJHK6P4.js} +2 -2
  307. package/dist/{chunk-AJBDAVX3.js → chunk-QK3A23NP.js} +7 -7
  308. package/dist/{chunk-CYDXCILL.js → chunk-QLWDNAOV.js} +7 -7
  309. package/dist/{chunk-BQYRZIZ7.js → chunk-QS6DQBVJ.js} +2 -2
  310. package/dist/{chunk-3PZ3LRPV.js → chunk-QSUVFPG3.js} +3 -3
  311. package/dist/{chunk-PYB4BFEC.js → chunk-QUC5MLTN.js} +3 -3
  312. package/dist/{chunk-WDASYY4S.js → chunk-QVT5AWPI.js} +6 -6
  313. package/dist/{chunk-K4DQS2ML.js → chunk-QZC6WCBR.js} +4 -4
  314. package/dist/{chunk-HWVPLFIW.js → chunk-RAHNICPP.js} +2 -2
  315. package/dist/{chunk-H6MJFMHZ.js → chunk-RME6RGIW.js} +3 -3
  316. package/dist/{chunk-XMBOLFFS.js → chunk-RQIB2F53.js} +2 -2
  317. package/dist/{chunk-OXQ2SXVC.js → chunk-RUA72NQY.js} +2 -2
  318. package/dist/{chunk-UMX6DZME.js → chunk-SCJHWN4X.js} +2 -2
  319. package/dist/{chunk-HTMQGS63.js → chunk-SIXBDT5F.js} +8 -8
  320. package/dist/{chunk-ZAX4XQLN.js → chunk-SPK3T4JK.js} +2 -2
  321. package/dist/{chunk-WTSQUCHB.js → chunk-SSN2YSST.js} +3 -3
  322. package/dist/{chunk-5MIBQ4P5.js → chunk-SYJCDX5V.js} +2 -2
  323. package/dist/{chunk-NQ2CPQJF.js → chunk-SYL7LCRA.js} +26 -3
  324. package/dist/chunk-SYL7LCRA.js.map +1 -0
  325. package/dist/{chunk-ZR5EKJT6.js → chunk-T6276OXI.js} +2 -2
  326. package/dist/{chunk-DEHLWZSI.js → chunk-T7OARG4N.js} +4 -4
  327. package/dist/{chunk-77BHKC43.js → chunk-TF5L3BEV.js} +1 -1
  328. package/dist/{chunk-GOCODNQS.js → chunk-TF6Z7BOP.js} +2 -2
  329. package/dist/{chunk-WIFDNUKD.js → chunk-TJDXWZMO.js} +3 -3
  330. package/dist/{chunk-SFIXTOOJ.js → chunk-TL5ATBHZ.js} +3 -3
  331. package/dist/{chunk-XZCCEKPW.js → chunk-TMOHIOMT.js} +6 -6
  332. package/dist/{chunk-AVXDIRRW.js → chunk-UI5X63YC.js} +2 -2
  333. package/dist/{chunk-6QK65ZWM.js → chunk-UIY7BDZC.js} +3 -3
  334. package/dist/{chunk-VATYK3JQ.js → chunk-UMBFMEO7.js} +3 -3
  335. package/dist/{chunk-UU5FBVRX.js → chunk-UU5G7OA4.js} +2 -2
  336. package/dist/{chunk-EGKARC53.js → chunk-UZUCYCF4.js} +2 -2
  337. package/dist/{chunk-LPKJ77EK.js → chunk-V2A7G7S7.js} +2 -2
  338. package/dist/{chunk-CH4UQ4NO.js → chunk-V5G4TKRC.js} +5 -5
  339. package/dist/{chunk-UBRQ3PQD.js → chunk-VKAVW34W.js} +2 -2
  340. package/dist/{chunk-JV5ULONH.js → chunk-VVLEVNTQ.js} +36 -36
  341. package/dist/{chunk-44JWVYJB.js → chunk-VW7X7TWZ.js} +2 -2
  342. package/dist/{chunk-3CDJSKDW.js → chunk-VWA2CHSL.js} +3 -3
  343. package/dist/{chunk-IN3VQFKS.js → chunk-W43HZPM7.js} +2 -2
  344. package/dist/{chunk-SXGJL7UT.js → chunk-WHGD7Q2L.js} +14 -14
  345. package/dist/{chunk-XOIDUM2H.js → chunk-WNXKYEVN.js} +1 -1
  346. package/dist/{chunk-TKQL7EDB.js → chunk-WSA7UBX4.js} +2 -2
  347. package/dist/{chunk-AJDGP2N4.js → chunk-WZ5TQJ3T.js} +19 -19
  348. package/dist/{chunk-FBA2NXYH.js → chunk-X3TGNSOG.js} +3 -3
  349. package/dist/{chunk-R4JA5JFI.js → chunk-X4WXYI3N.js} +3 -3
  350. package/dist/{chunk-Q5EZNBPI.js → chunk-XIQ3AIAJ.js} +3 -3
  351. package/dist/{chunk-S27VZ5DO.js → chunk-XWYT4LEL.js} +6 -6
  352. package/dist/{chunk-477DTTMH.js → chunk-Y3PU75OC.js} +3 -3
  353. package/dist/{chunk-4JXPLTWV.js → chunk-Y5ZWX5YS.js} +2 -2
  354. package/dist/{chunk-4BWMAGJJ.js → chunk-YA5PABND.js} +3 -3
  355. package/dist/{chunk-VXORMNU4.js → chunk-YBHAAULA.js} +67 -2
  356. package/dist/chunk-YBHAAULA.js.map +1 -0
  357. package/dist/{chunk-OGU73VUN.js → chunk-YBPRR2QS.js} +2 -2
  358. package/dist/{chunk-TNSJFZ6Q.js → chunk-YDYR7XQE.js} +4 -4
  359. package/dist/{chunk-GTRAH4FG.js → chunk-YG6V2LQH.js} +2 -2
  360. package/dist/{chunk-XVLEBB4Y.js → chunk-YUXA7ALE.js} +2 -2
  361. package/dist/{chunk-SN2WENRP.js → chunk-YWHQDXPB.js} +3 -3
  362. package/dist/{chunk-BFFNINCC.js → chunk-YWRR5R7B.js} +3 -3
  363. package/dist/{chunk-FSDQQQIA.js → chunk-YYRK7A4N.js} +3 -3
  364. package/dist/{chunk-MRECRNVU.js → chunk-Z26CDLUV.js} +5 -5
  365. package/dist/{chunk-OYCK4JRS.js → chunk-Z27EXLMQ.js} +2 -2
  366. package/dist/{chunk-UTRNLNCW.js → chunk-Z7GDH7W2.js} +3 -3
  367. package/dist/{chunk-PRT4J2DL.js → chunk-ZGVLSAWL.js} +2 -2
  368. package/dist/{chunk-OK7BQMCI.js → chunk-ZM6Q5NQN.js} +9 -9
  369. package/dist/components/message-timeline.d.ts +10 -2
  370. package/dist/composer.js +8 -8
  371. package/dist/{computer-viewer-5LKRCEVQ.js → computer-viewer-SROXREYD.js} +5 -5
  372. package/dist/connect.js +12 -12
  373. package/dist/desktop-dictation.js +8 -8
  374. package/dist/desktop.js +2 -2
  375. package/dist/editor.js +2 -2
  376. package/dist/{embedded-new-voice-GHJRY3YL.js → embedded-new-voice-EIQY2VBF.js} +5 -5
  377. package/dist/{embedded-voice-ASQXBSTX.js → embedded-voice-LMWNH7F7.js} +5 -5
  378. package/dist/{fleet-decision-row-U7LDVBEM.js → fleet-decision-row-X2G56ZRA.js} +2 -2
  379. package/dist/hooks/use-recordings.d.ts +4 -2
  380. package/dist/in-chat-connect-model.js +5 -5
  381. package/dist/index.d.ts +2 -2
  382. package/dist/index.js +66 -60
  383. package/dist/interaction.js +5 -5
  384. package/dist/{latest-question-RNVF262Q.js → latest-question-KA7AQYVI.js} +2 -2
  385. package/dist/machines.js +3 -3
  386. package/dist/meetings/recorder-context.d.ts +6 -1
  387. package/dist/meetings/recorder-panel.d.ts +2 -5
  388. package/dist/meetings-recorder.js +1 -1
  389. package/dist/meetings.js +22 -21
  390. package/dist/meetings.js.map +1 -1
  391. package/dist/messages/en.d.ts +2 -0
  392. package/dist/messages.js +1 -1
  393. package/dist/{model-policy-picker-menu-E6XKMFTA.js → model-policy-picker-menu-SHWPT5VA.js} +4 -4
  394. package/dist/{payment-page-card-DJDKV2LW.js → payment-page-card-NNVUISN4.js} +4 -4
  395. package/dist/{platform-activity-row-MSDCSMET.js → platform-activity-row-7UDWSAHK.js} +2 -2
  396. package/dist/{queue-surface-implementation-GUAIG6TK.js → queue-surface-implementation-BUXSO24N.js} +5 -5
  397. package/dist/realtime.js +4 -4
  398. package/dist/{recorder-host-2MYDJPQW.js → recorder-host-POX54CFT.js} +5 -5
  399. package/dist/recordings.js +4 -4
  400. package/dist/{sandbox-files-W5W2LW4K.js → sandbox-files-33QD7DW2.js} +6 -6
  401. package/dist/session-app.js +156 -156
  402. package/dist/{session-connect-cards-HPH7JOZP.js → session-connect-cards-CXGNVA2A.js} +9 -9
  403. package/dist/session-list-model.js +2 -2
  404. package/dist/{session-realtime-SDTKFFIR.js → session-realtime-CVDSEULB.js} +3 -3
  405. package/dist/session-realtime.js +2 -2
  406. package/dist/session-ui.js +33 -33
  407. package/dist/session.d.ts +3 -2
  408. package/dist/session.js +16 -10
  409. package/dist/sites.js +2 -2
  410. package/dist/terminal.js +2 -2
  411. package/dist/this-computer.js +3 -3
  412. package/dist/timeline/index.d.ts +3 -2
  413. package/dist/timeline/projection.d.ts +52 -0
  414. package/dist/timeline/turn-summary-model.d.ts +4 -3
  415. package/dist/timeline/types.d.ts +8 -2
  416. package/dist/timeline/use-timeline-pauses.d.ts +12 -0
  417. package/dist/timeline/work-presentation.d.ts +4 -3
  418. package/dist/{timeline-annotation-markers-FNILLWNU.js → timeline-annotation-markers-5J5TM5IP.js} +2 -2
  419. package/dist/{timeline-annotation-selection-MBCIDO2Q.js → timeline-annotation-selection-WLY7FB7F.js} +2 -2
  420. package/dist/{timeline-annotations-dialog-JPNKLOTE.js → timeline-annotations-dialog-67VRFKJU.js} +3 -3
  421. package/dist/timeline-model.js +2 -2
  422. package/dist/ui/access-list.js +5 -5
  423. package/dist/ui/cadence-picker.js +4 -4
  424. package/dist/ui/choice-cards.js +3 -3
  425. package/dist/ui/confirm-dialog.js +2 -2
  426. package/dist/ui/copy-field.js +3 -3
  427. package/dist/ui/detail-page.js +2 -2
  428. package/dist/ui/detail-sheet.js +2 -2
  429. package/dist/ui/disclosure.js +3 -3
  430. package/dist/ui/email-chips-input.js +3 -3
  431. package/dist/ui/field.js +2 -2
  432. package/dist/ui/flush-form-page.js +3 -3
  433. package/dist/ui/form-dialog.js +2 -2
  434. package/dist/ui/list-row.js +3 -3
  435. package/dist/ui/relative-time.js +2 -2
  436. package/dist/ui/revision-history.js +4 -4
  437. package/dist/ui/role-select.js +5 -5
  438. package/dist/ui/select-menu.js +3 -3
  439. package/dist/ui/usage-meter.js +3 -3
  440. package/dist/usage.js +2 -2
  441. package/dist/workbench.js +4 -4
  442. package/package.json +6 -5
  443. package/src/app/components/rail/session-row-content.tsx +27 -0
  444. package/src/app/lib/session-branch-cache.tsx +1 -0
  445. package/src/app/lib/session-pins.tsx +1 -0
  446. package/src/app/lib/session-row-paused.test.tsx +183 -0
  447. package/src/app/lib/sessions-group-channels.test.ts +4 -4
  448. package/src/app/lib/sessions-group.tsx +62 -4
  449. package/src/app/routes/session.tsx +2 -0
  450. package/src/components/message-timeline.tsx +14 -2
  451. package/src/components/session-conversation.tsx +2 -1
  452. package/src/components/timeline-annotations.tsx +4 -1
  453. package/src/components/timeline-settlement.ts +1 -1
  454. package/src/hooks/use-recordings.ts +5 -0
  455. package/src/index.ts +5 -0
  456. package/src/meetings/recorder-context.tsx +28 -5
  457. package/src/meetings/recorder-panel.tsx +13 -5
  458. package/src/meetings/recorder-workspace.test.tsx +57 -8
  459. package/src/messages/en.ts +2 -0
  460. package/src/session.ts +8 -1
  461. package/src/timeline/index.ts +4 -1
  462. package/src/timeline/projection.ts +228 -16
  463. package/src/timeline/turn-summary-model.ts +4 -3
  464. package/src/timeline/turn-summary.tsx +15 -2
  465. package/src/timeline/types.ts +8 -2
  466. package/src/timeline/use-timeline-pauses.ts +105 -0
  467. package/src/timeline/work-presentation.ts +13 -4
  468. package/dist/chunk-2OXSB2OL.js.map +0 -1
  469. package/dist/chunk-7YTR3UFO.js.map +0 -1
  470. package/dist/chunk-7Z76QP64.js.map +0 -1
  471. package/dist/chunk-JHZRAYI4.js.map +0 -1
  472. package/dist/chunk-M5IQVMLR.js.map +0 -1
  473. package/dist/chunk-NQ2CPQJF.js.map +0 -1
  474. package/dist/chunk-O2UPPN5M.js +0 -2
  475. package/dist/chunk-PF2WU2IL.js.map +0 -1
  476. package/dist/chunk-PSM3CU7N.js.map +0 -1
  477. package/dist/chunk-Q5K2J5GG.js.map +0 -1
  478. package/dist/chunk-QPQ7R77C.js.map +0 -1
  479. package/dist/chunk-QQIZMVAJ.js.map +0 -1
  480. package/dist/chunk-SK5S2PCK.js.map +0 -1
  481. package/dist/chunk-SPD4ULVB.js.map +0 -1
  482. package/dist/chunk-VXORMNU4.js.map +0 -1
  483. /package/dist/{browser-viewer-ZHQDVHZ2.js.map → browser-viewer-H7PKY67P.js.map} +0 -0
  484. /package/dist/{chat-interactive-block-VSDD6X3M.js.map → chat-interactive-block-47TCT4DN.js.map} +0 -0
  485. /package/dist/{chunk-5MHMCE2G.js.map → chunk-2X2B6D5G.js.map} +0 -0
  486. /package/dist/{chunk-OCXEY7HE.js.map → chunk-3BUI5DT7.js.map} +0 -0
  487. /package/dist/{chunk-OSJ366KR.js.map → chunk-3FWP3TD3.js.map} +0 -0
  488. /package/dist/{chunk-PWUSSSSL.js.map → chunk-3G5IA36N.js.map} +0 -0
  489. /package/dist/{chunk-RGR57NYY.js.map → chunk-3NK4JAHL.js.map} +0 -0
  490. /package/dist/{chunk-XUOYNJPB.js.map → chunk-3O7UZRWM.js.map} +0 -0
  491. /package/dist/{chunk-JV3UI7BH.js.map → chunk-3OR6HMA4.js.map} +0 -0
  492. /package/dist/{chunk-MV2CLIO6.js.map → chunk-3PC45I5N.js.map} +0 -0
  493. /package/dist/{chunk-SJYTQLN3.js.map → chunk-3PI2BYK5.js.map} +0 -0
  494. /package/dist/{chunk-DCEQCGVN.js.map → chunk-3PNA2P2Z.js.map} +0 -0
  495. /package/dist/{chunk-ESXAECZ3.js.map → chunk-3XBZKF3K.js.map} +0 -0
  496. /package/dist/{chunk-SBXSKRFA.js.map → chunk-45OGYO3S.js.map} +0 -0
  497. /package/dist/{chunk-M3FDGRB4.js.map → chunk-4A7TKVNX.js.map} +0 -0
  498. /package/dist/{chunk-RHXYO4H2.js.map → chunk-4BXRGXTD.js.map} +0 -0
  499. /package/dist/{chunk-CV4VVLPZ.js.map → chunk-4HQAJA3T.js.map} +0 -0
  500. /package/dist/{chunk-VCJQQYRE.js.map → chunk-4X2A3KPB.js.map} +0 -0
  501. /package/dist/{chunk-OCXTTKVA.js.map → chunk-555K37A7.js.map} +0 -0
  502. /package/dist/{chunk-EBIVTDEG.js.map → chunk-57L5ZXDS.js.map} +0 -0
  503. /package/dist/{chunk-3L465FBR.js.map → chunk-5IADORIV.js.map} +0 -0
  504. /package/dist/{chunk-PVB4YVDP.js.map → chunk-5Y2O2432.js.map} +0 -0
  505. /package/dist/{chunk-OOOSGPJL.js.map → chunk-6572EFE4.js.map} +0 -0
  506. /package/dist/{chunk-YMI27QPF.js.map → chunk-6BG5HCUP.js.map} +0 -0
  507. /package/dist/{chunk-QRECBCJM.js.map → chunk-6EXFJWII.js.map} +0 -0
  508. /package/dist/{chunk-74CBR5YE.js.map → chunk-6PNRUGOK.js.map} +0 -0
  509. /package/dist/{chunk-PUUEI4W3.js.map → chunk-6RJEY6TC.js.map} +0 -0
  510. /package/dist/{chunk-DLVIRJGK.js.map → chunk-727GL2YY.js.map} +0 -0
  511. /package/dist/{chunk-J2BTILRR.js.map → chunk-7FGYLFW6.js.map} +0 -0
  512. /package/dist/{chunk-MKDFYE2E.js.map → chunk-7IMWTFEG.js.map} +0 -0
  513. /package/dist/{chunk-FER6EVIY.js.map → chunk-7POKH54R.js.map} +0 -0
  514. /package/dist/{chunk-H6BX6WOW.js.map → chunk-7T26IH6W.js.map} +0 -0
  515. /package/dist/{chunk-R33SBMB7.js.map → chunk-7XQRVZZQ.js.map} +0 -0
  516. /package/dist/{chunk-NFCS5WYC.js.map → chunk-A3SPPXMC.js.map} +0 -0
  517. /package/dist/{chunk-DQPIEQGP.js.map → chunk-A7CWPDEH.js.map} +0 -0
  518. /package/dist/{chunk-3PM3M2Q6.js.map → chunk-AGOYVKTI.js.map} +0 -0
  519. /package/dist/{chunk-OBGOLHCP.js.map → chunk-AIQKZUPB.js.map} +0 -0
  520. /package/dist/{chunk-GSCGKJNK.js.map → chunk-AMYDHG3S.js.map} +0 -0
  521. /package/dist/{chunk-U4LTPFD2.js.map → chunk-APJPB6TX.js.map} +0 -0
  522. /package/dist/{chunk-SP44O3OU.js.map → chunk-APLGT5EI.js.map} +0 -0
  523. /package/dist/{chunk-M3HGBO2Y.js.map → chunk-ATNKMGLO.js.map} +0 -0
  524. /package/dist/{chunk-4O2XWOLZ.js.map → chunk-AVX4CZQ3.js.map} +0 -0
  525. /package/dist/{chunk-CXAN2FHF.js.map → chunk-B46MK44K.js.map} +0 -0
  526. /package/dist/{chunk-RMCLFSMX.js.map → chunk-BBKUPEGG.js.map} +0 -0
  527. /package/dist/{chunk-J2WY42FA.js.map → chunk-BES6OQE3.js.map} +0 -0
  528. /package/dist/{chunk-GU7T2S5N.js.map → chunk-BM2N26SH.js.map} +0 -0
  529. /package/dist/{chunk-HEGV4QMS.js.map → chunk-C3NS74PZ.js.map} +0 -0
  530. /package/dist/{chunk-752WXSDN.js.map → chunk-C56ABB5V.js.map} +0 -0
  531. /package/dist/{chunk-77SYIH6O.js.map → chunk-C6MATJQ5.js.map} +0 -0
  532. /package/dist/{chunk-KUE5BOQE.js.map → chunk-CRX47CO6.js.map} +0 -0
  533. /package/dist/{chunk-GTHCHCWW.js.map → chunk-D33KWZQJ.js.map} +0 -0
  534. /package/dist/{chunk-AH3DGOTK.js.map → chunk-D7E3BSCX.js.map} +0 -0
  535. /package/dist/{chunk-OJWDNNW3.js.map → chunk-DFR3TMTZ.js.map} +0 -0
  536. /package/dist/{chunk-WYGTAQMX.js.map → chunk-DICC75CU.js.map} +0 -0
  537. /package/dist/{chunk-736RUNIA.js.map → chunk-DJ2LMKKX.js.map} +0 -0
  538. /package/dist/{chunk-4F3AEJI6.js.map → chunk-DJI4D7PM.js.map} +0 -0
  539. /package/dist/{chunk-LVELUUK6.js.map → chunk-DSZUQL4W.js.map} +0 -0
  540. /package/dist/{chunk-MT2R57SF.js.map → chunk-DVF246BE.js.map} +0 -0
  541. /package/dist/{chunk-OI6VI6SU.js.map → chunk-DVOWBHWN.js.map} +0 -0
  542. /package/dist/{chunk-PZKHST7A.js.map → chunk-E2KPRSA4.js.map} +0 -0
  543. /package/dist/{chunk-EKJHOWTZ.js.map → chunk-E3LMLWEB.js.map} +0 -0
  544. /package/dist/{chunk-QURYQFDN.js.map → chunk-EDC7X7PW.js.map} +0 -0
  545. /package/dist/{chunk-HYEIA25Y.js.map → chunk-EDSMULHU.js.map} +0 -0
  546. /package/dist/{chunk-U6552Q3T.js.map → chunk-EQQOZ6DD.js.map} +0 -0
  547. /package/dist/{chunk-IFSXVU2S.js.map → chunk-ERBDQ2GY.js.map} +0 -0
  548. /package/dist/{chunk-IZXYFWA4.js.map → chunk-EWI73URG.js.map} +0 -0
  549. /package/dist/{chunk-N3FM4BNA.js.map → chunk-EZ6LFN33.js.map} +0 -0
  550. /package/dist/{chunk-4K64EKM7.js.map → chunk-F7YL6DPR.js.map} +0 -0
  551. /package/dist/{chunk-ICAMYP5M.js.map → chunk-FIGFXMUP.js.map} +0 -0
  552. /package/dist/{chunk-54U6ZBEX.js.map → chunk-FJRJK67G.js.map} +0 -0
  553. /package/dist/{chunk-E5KOWRDU.js.map → chunk-FLHB2NZT.js.map} +0 -0
  554. /package/dist/{chunk-D3PTVN2I.js.map → chunk-FUGGM76A.js.map} +0 -0
  555. /package/dist/{chunk-TDTD66BK.js.map → chunk-FXPZAZYT.js.map} +0 -0
  556. /package/dist/{chunk-KO3OHHY2.js.map → chunk-GAGAM4MT.js.map} +0 -0
  557. /package/dist/{chunk-TK5FWVZR.js.map → chunk-GESGH3HY.js.map} +0 -0
  558. /package/dist/{chunk-2VJOSU4H.js.map → chunk-GI4PWKXI.js.map} +0 -0
  559. /package/dist/{chunk-KFNZZ2N6.js.map → chunk-GJTEBAZ7.js.map} +0 -0
  560. /package/dist/{chunk-LTJFV2JI.js.map → chunk-GNCGEW7F.js.map} +0 -0
  561. /package/dist/{chunk-34NV52R3.js.map → chunk-GOMUNPB6.js.map} +0 -0
  562. /package/dist/{chunk-LIJNVIT3.js.map → chunk-GUMUILEI.js.map} +0 -0
  563. /package/dist/{chunk-7NLF35YL.js.map → chunk-GVGNHBFT.js.map} +0 -0
  564. /package/dist/{chunk-K3D7IQQP.js.map → chunk-GW4YI3FB.js.map} +0 -0
  565. /package/dist/{chunk-D5TIVCXG.js.map → chunk-GXKCV7X7.js.map} +0 -0
  566. /package/dist/{chunk-2J77TWGH.js.map → chunk-H467EQA6.js.map} +0 -0
  567. /package/dist/{chunk-3OK7Y6ES.js.map → chunk-HE77VDDR.js.map} +0 -0
  568. /package/dist/{chunk-UO35OEOX.js.map → chunk-HT65RGCX.js.map} +0 -0
  569. /package/dist/{chunk-G6ICCGJ3.js.map → chunk-HVQSFTE7.js.map} +0 -0
  570. /package/dist/{chunk-G5UQBTXY.js.map → chunk-HXJPDC76.js.map} +0 -0
  571. /package/dist/{chunk-GIWFLWXG.js.map → chunk-I6LQW24C.js.map} +0 -0
  572. /package/dist/{chunk-467WDSOK.js.map → chunk-I7A6S5YL.js.map} +0 -0
  573. /package/dist/{chunk-AAS7OWV6.js.map → chunk-IADS4ZYD.js.map} +0 -0
  574. /package/dist/{chunk-Y3XZEKDQ.js.map → chunk-IJWMWCGR.js.map} +0 -0
  575. /package/dist/{chunk-SGH7I7OY.js.map → chunk-IWFO6KOU.js.map} +0 -0
  576. /package/dist/{chunk-GMHIOYB7.js.map → chunk-IYC6QGV2.js.map} +0 -0
  577. /package/dist/{chunk-3NNAC43A.js.map → chunk-J5AODKJO.js.map} +0 -0
  578. /package/dist/{chunk-DIP7YALH.js.map → chunk-JKI3LMLH.js.map} +0 -0
  579. /package/dist/{chunk-IJR6VOLU.js.map → chunk-JSYRWOCE.js.map} +0 -0
  580. /package/dist/{chunk-CEMSIU4Z.js.map → chunk-JTQTWO4D.js.map} +0 -0
  581. /package/dist/{chunk-BASI553K.js.map → chunk-KBTKAAHM.js.map} +0 -0
  582. /package/dist/{chunk-OYOFPNLC.js.map → chunk-KD7VEMWY.js.map} +0 -0
  583. /package/dist/{chunk-3DRLCX5V.js.map → chunk-KPGFGRSA.js.map} +0 -0
  584. /package/dist/{chunk-PLYVGZIN.js.map → chunk-KWFDEJFI.js.map} +0 -0
  585. /package/dist/{chunk-FNXCFIPW.js.map → chunk-KYLEH4OF.js.map} +0 -0
  586. /package/dist/{chunk-WXF2RTS4.js.map → chunk-L7FJTFJN.js.map} +0 -0
  587. /package/dist/{chunk-KI46GKMD.js.map → chunk-L7VVQOSY.js.map} +0 -0
  588. /package/dist/{chunk-O2UPPN5M.js.map → chunk-LKLQVANM.js.map} +0 -0
  589. /package/dist/{chunk-YNTLWCF4.js.map → chunk-LLYEAZ4E.js.map} +0 -0
  590. /package/dist/{chunk-4Z5X7PLC.js.map → chunk-LWM7JUW6.js.map} +0 -0
  591. /package/dist/{chunk-CHU3RDV4.js.map → chunk-LXKV4ND3.js.map} +0 -0
  592. /package/dist/{chunk-AB5IW227.js.map → chunk-LYLICEQO.js.map} +0 -0
  593. /package/dist/{chunk-OTW25A6I.js.map → chunk-M5GRI5K4.js.map} +0 -0
  594. /package/dist/{chunk-X2QJXDE4.js.map → chunk-MF65PKKF.js.map} +0 -0
  595. /package/dist/{chunk-EDDKPIIV.js.map → chunk-MJ4XIOPM.js.map} +0 -0
  596. /package/dist/{chunk-FLWQJDJ5.js.map → chunk-MMPJJQG3.js.map} +0 -0
  597. /package/dist/{chunk-T67LTMSW.js.map → chunk-MOU54FGD.js.map} +0 -0
  598. /package/dist/{chunk-LQKVNREV.js.map → chunk-NAWHQ4IL.js.map} +0 -0
  599. /package/dist/{chunk-ZBHGNE2J.js.map → chunk-NBHBB2VV.js.map} +0 -0
  600. /package/dist/{chunk-U5UGM5XD.js.map → chunk-NMOZDAEZ.js.map} +0 -0
  601. /package/dist/{chunk-D74Z2N4K.js.map → chunk-NZA4R3BE.js.map} +0 -0
  602. /package/dist/{chunk-WRMUXZ7C.js.map → chunk-OB2CX7PJ.js.map} +0 -0
  603. /package/dist/{chunk-YJSCLGAW.js.map → chunk-OB4I4OIT.js.map} +0 -0
  604. /package/dist/{chunk-DWJ6J3YW.js.map → chunk-OKQW2FPL.js.map} +0 -0
  605. /package/dist/{chunk-2GCHGWNE.js.map → chunk-ORLX6A3C.js.map} +0 -0
  606. /package/dist/{chunk-EBTUPRRQ.js.map → chunk-P5N4EYFW.js.map} +0 -0
  607. /package/dist/{chunk-JKL5S7UQ.js.map → chunk-PL4JE3NI.js.map} +0 -0
  608. /package/dist/{chunk-OP2GD6QW.js.map → chunk-PNUHKDY2.js.map} +0 -0
  609. /package/dist/{chunk-MZY3VKKM.js.map → chunk-PWJE7D6V.js.map} +0 -0
  610. /package/dist/{chunk-RISUROBM.js.map → chunk-PYE27I6J.js.map} +0 -0
  611. /package/dist/{chunk-R5QAL43H.js.map → chunk-QIJHK6P4.js.map} +0 -0
  612. /package/dist/{chunk-AJBDAVX3.js.map → chunk-QK3A23NP.js.map} +0 -0
  613. /package/dist/{chunk-CYDXCILL.js.map → chunk-QLWDNAOV.js.map} +0 -0
  614. /package/dist/{chunk-BQYRZIZ7.js.map → chunk-QS6DQBVJ.js.map} +0 -0
  615. /package/dist/{chunk-3PZ3LRPV.js.map → chunk-QSUVFPG3.js.map} +0 -0
  616. /package/dist/{chunk-PYB4BFEC.js.map → chunk-QUC5MLTN.js.map} +0 -0
  617. /package/dist/{chunk-WDASYY4S.js.map → chunk-QVT5AWPI.js.map} +0 -0
  618. /package/dist/{chunk-K4DQS2ML.js.map → chunk-QZC6WCBR.js.map} +0 -0
  619. /package/dist/{chunk-HWVPLFIW.js.map → chunk-RAHNICPP.js.map} +0 -0
  620. /package/dist/{chunk-H6MJFMHZ.js.map → chunk-RME6RGIW.js.map} +0 -0
  621. /package/dist/{chunk-XMBOLFFS.js.map → chunk-RQIB2F53.js.map} +0 -0
  622. /package/dist/{chunk-OXQ2SXVC.js.map → chunk-RUA72NQY.js.map} +0 -0
  623. /package/dist/{chunk-UMX6DZME.js.map → chunk-SCJHWN4X.js.map} +0 -0
  624. /package/dist/{chunk-HTMQGS63.js.map → chunk-SIXBDT5F.js.map} +0 -0
  625. /package/dist/{chunk-ZAX4XQLN.js.map → chunk-SPK3T4JK.js.map} +0 -0
  626. /package/dist/{chunk-WTSQUCHB.js.map → chunk-SSN2YSST.js.map} +0 -0
  627. /package/dist/{chunk-5MIBQ4P5.js.map → chunk-SYJCDX5V.js.map} +0 -0
  628. /package/dist/{chunk-ZR5EKJT6.js.map → chunk-T6276OXI.js.map} +0 -0
  629. /package/dist/{chunk-DEHLWZSI.js.map → chunk-T7OARG4N.js.map} +0 -0
  630. /package/dist/{chunk-77BHKC43.js.map → chunk-TF5L3BEV.js.map} +0 -0
  631. /package/dist/{chunk-GOCODNQS.js.map → chunk-TF6Z7BOP.js.map} +0 -0
  632. /package/dist/{chunk-WIFDNUKD.js.map → chunk-TJDXWZMO.js.map} +0 -0
  633. /package/dist/{chunk-SFIXTOOJ.js.map → chunk-TL5ATBHZ.js.map} +0 -0
  634. /package/dist/{chunk-XZCCEKPW.js.map → chunk-TMOHIOMT.js.map} +0 -0
  635. /package/dist/{chunk-AVXDIRRW.js.map → chunk-UI5X63YC.js.map} +0 -0
  636. /package/dist/{chunk-6QK65ZWM.js.map → chunk-UIY7BDZC.js.map} +0 -0
  637. /package/dist/{chunk-VATYK3JQ.js.map → chunk-UMBFMEO7.js.map} +0 -0
  638. /package/dist/{chunk-UU5FBVRX.js.map → chunk-UU5G7OA4.js.map} +0 -0
  639. /package/dist/{chunk-EGKARC53.js.map → chunk-UZUCYCF4.js.map} +0 -0
  640. /package/dist/{chunk-LPKJ77EK.js.map → chunk-V2A7G7S7.js.map} +0 -0
  641. /package/dist/{chunk-CH4UQ4NO.js.map → chunk-V5G4TKRC.js.map} +0 -0
  642. /package/dist/{chunk-UBRQ3PQD.js.map → chunk-VKAVW34W.js.map} +0 -0
  643. /package/dist/{chunk-JV5ULONH.js.map → chunk-VVLEVNTQ.js.map} +0 -0
  644. /package/dist/{chunk-44JWVYJB.js.map → chunk-VW7X7TWZ.js.map} +0 -0
  645. /package/dist/{chunk-3CDJSKDW.js.map → chunk-VWA2CHSL.js.map} +0 -0
  646. /package/dist/{chunk-IN3VQFKS.js.map → chunk-W43HZPM7.js.map} +0 -0
  647. /package/dist/{chunk-SXGJL7UT.js.map → chunk-WHGD7Q2L.js.map} +0 -0
  648. /package/dist/{chunk-XOIDUM2H.js.map → chunk-WNXKYEVN.js.map} +0 -0
  649. /package/dist/{chunk-TKQL7EDB.js.map → chunk-WSA7UBX4.js.map} +0 -0
  650. /package/dist/{chunk-AJDGP2N4.js.map → chunk-WZ5TQJ3T.js.map} +0 -0
  651. /package/dist/{chunk-FBA2NXYH.js.map → chunk-X3TGNSOG.js.map} +0 -0
  652. /package/dist/{chunk-R4JA5JFI.js.map → chunk-X4WXYI3N.js.map} +0 -0
  653. /package/dist/{chunk-Q5EZNBPI.js.map → chunk-XIQ3AIAJ.js.map} +0 -0
  654. /package/dist/{chunk-S27VZ5DO.js.map → chunk-XWYT4LEL.js.map} +0 -0
  655. /package/dist/{chunk-477DTTMH.js.map → chunk-Y3PU75OC.js.map} +0 -0
  656. /package/dist/{chunk-4JXPLTWV.js.map → chunk-Y5ZWX5YS.js.map} +0 -0
  657. /package/dist/{chunk-4BWMAGJJ.js.map → chunk-YA5PABND.js.map} +0 -0
  658. /package/dist/{chunk-OGU73VUN.js.map → chunk-YBPRR2QS.js.map} +0 -0
  659. /package/dist/{chunk-TNSJFZ6Q.js.map → chunk-YDYR7XQE.js.map} +0 -0
  660. /package/dist/{chunk-GTRAH4FG.js.map → chunk-YG6V2LQH.js.map} +0 -0
  661. /package/dist/{chunk-XVLEBB4Y.js.map → chunk-YUXA7ALE.js.map} +0 -0
  662. /package/dist/{chunk-SN2WENRP.js.map → chunk-YWHQDXPB.js.map} +0 -0
  663. /package/dist/{chunk-BFFNINCC.js.map → chunk-YWRR5R7B.js.map} +0 -0
  664. /package/dist/{chunk-FSDQQQIA.js.map → chunk-YYRK7A4N.js.map} +0 -0
  665. /package/dist/{chunk-MRECRNVU.js.map → chunk-Z26CDLUV.js.map} +0 -0
  666. /package/dist/{chunk-OYCK4JRS.js.map → chunk-Z27EXLMQ.js.map} +0 -0
  667. /package/dist/{chunk-UTRNLNCW.js.map → chunk-Z7GDH7W2.js.map} +0 -0
  668. /package/dist/{chunk-PRT4J2DL.js.map → chunk-ZGVLSAWL.js.map} +0 -0
  669. /package/dist/{chunk-OK7BQMCI.js.map → chunk-ZM6Q5NQN.js.map} +0 -0
  670. /package/dist/{computer-viewer-5LKRCEVQ.js.map → computer-viewer-SROXREYD.js.map} +0 -0
  671. /package/dist/{embedded-new-voice-GHJRY3YL.js.map → embedded-new-voice-EIQY2VBF.js.map} +0 -0
  672. /package/dist/{embedded-voice-ASQXBSTX.js.map → embedded-voice-LMWNH7F7.js.map} +0 -0
  673. /package/dist/{fleet-decision-row-U7LDVBEM.js.map → fleet-decision-row-X2G56ZRA.js.map} +0 -0
  674. /package/dist/{latest-question-RNVF262Q.js.map → latest-question-KA7AQYVI.js.map} +0 -0
  675. /package/dist/{model-policy-picker-menu-E6XKMFTA.js.map → model-policy-picker-menu-SHWPT5VA.js.map} +0 -0
  676. /package/dist/{payment-page-card-DJDKV2LW.js.map → payment-page-card-NNVUISN4.js.map} +0 -0
  677. /package/dist/{platform-activity-row-MSDCSMET.js.map → platform-activity-row-7UDWSAHK.js.map} +0 -0
  678. /package/dist/{queue-surface-implementation-GUAIG6TK.js.map → queue-surface-implementation-BUXSO24N.js.map} +0 -0
  679. /package/dist/{recorder-host-2MYDJPQW.js.map → recorder-host-POX54CFT.js.map} +0 -0
  680. /package/dist/{sandbox-files-W5W2LW4K.js.map → sandbox-files-33QD7DW2.js.map} +0 -0
  681. /package/dist/{session-connect-cards-HPH7JOZP.js.map → session-connect-cards-CXGNVA2A.js.map} +0 -0
  682. /package/dist/{session-realtime-SDTKFFIR.js.map → session-realtime-CVDSEULB.js.map} +0 -0
  683. /package/dist/{timeline-annotation-markers-FNILLWNU.js.map → timeline-annotation-markers-5J5TM5IP.js.map} +0 -0
  684. /package/dist/{timeline-annotation-selection-MBCIDO2Q.js.map → timeline-annotation-selection-WLY7FB7F.js.map} +0 -0
  685. /package/dist/{timeline-annotations-dialog-JPNKLOTE.js.map → timeline-annotations-dialog-67VRFKJU.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/timeline/registry.ts","../src/timeline/command-step.ts","../src/timeline/tool-presentation.ts","../src/timeline/genie-copy.ts","../src/timeline/turn-summary-model.ts"],"sourcesContent":["import type { RetainedArtifactReference, VideoArtifactPlaybackSource } from \"@opengeni/sdk\";\nimport type { ComponentType } from \"react\";\nimport { mcpToolLeaf } from \"./tool-display-name\";\nimport type { ToolCallItem } from \"./types\";\n\n/* ----------------------------------------------------------------------------\n Tool renderer registry\n\n The extension point. A `ToolRenderer` is a React component fed one projected\n `ToolCallItem`; the registry resolves which renderer handles a given call,\n keyed on the tool `name` and (secondarily) its provider-native `raw.type`.\n\n Resolution order (most → least specific):\n 1. exact match on `raw.type` (e.g. \"apply_patch_call\", \"computer_call\")\n 2. exact match on the tool `name` (e.g. \"exec_command\", \"web_search_call\")\n 3. allowed leaf match after MCP `__` prefix (e.g. opengeni__environment_set_variable)\n 4. the registry's generic fallback\n\n A consumer extends the defaults without forking by passing overrides to\n `createToolRegistry` — e.g. a custom renderer for their own MCP tool, or a\n replacement for a built-in one. The registry is immutable and fully typed.\n -------------------------------------------------------------------------- */\n\nexport type ToolRendererProps = {\n item: ToolCallItem;\n loadRetainedScreenshot?: RetainedScreenshotLoader | undefined;\n loadRetainedArtifact?: RetainedArtifactLoader | undefined;\n};\n\nexport type RetainedScreenshotLoader = (\n artifact: RetainedArtifactReference,\n signal: AbortSignal,\n) => Promise<Uint8Array | null>;\n\nexport type RetainedArtifactLoader = (\n artifact: RetainedArtifactReference,\n signal: AbortSignal,\n options?: RetainedArtifactLoadOptions,\n) => Promise<Uint8Array | { url: string; expiresAt?: string | undefined } | null>;\n\nexport type RetainedArtifactLoadOptions = {\n /**\n * Ask for a short-lived download URL instead of bytes, for example to build a\n * copyable `curl … | git apply` command. A loader that cannot mint one may\n * still return bytes; callers must handle that.\n */\n prefer?: \"url\" | undefined;\n};\n\n/** Mint an expiring source for native browser playback without loading video bytes in JS. */\nexport type VideoArtifactPlaybackLoader = (\n artifactId: string,\n signal: AbortSignal,\n) => Promise<VideoArtifactPlaybackSource>;\n\nexport type ToolRenderer = ComponentType<ToolRendererProps>;\n\n/** A registry entry: which key it matches and the component that renders it. */\nexport type ToolRegistryEntry =\n | { match: \"rawType\"; type: string; render: ToolRenderer }\n | {\n match: \"name\";\n name: string;\n render: ToolRenderer;\n /** Disable untrusted `<server>__${name}` leaf matching for identity-sensitive renderers. */\n matchPrefixedLeaf?: boolean | undefined;\n };\n\nexport type ToolRegistry = {\n /** Resolve the renderer for a call (never null — falls back to generic). */\n resolve: (item: ToolCallItem) => ToolRenderer;\n /** The generic fallback renderer. */\n fallback: ToolRenderer;\n};\n\nexport type CreateToolRegistryOptions = {\n /**\n * Entries that take precedence over the built-ins. Earlier entries win, so a\n * consumer can shadow a default renderer for the same key.\n */\n entries?: ToolRegistryEntry[] | undefined;\n /** Replace the generic fallback used for unmatched tools. */\n fallback?: ToolRenderer | undefined;\n};\n\n/** The `raw.type` of a projected tool call, when the provider item carries one. */\nexport function rawTypeOf(item: ToolCallItem): string | null {\n const raw = item.raw;\n if (raw && typeof raw === \"object\" && typeof (raw as { type?: unknown }).type === \"string\") {\n return (raw as { type: string }).type;\n }\n return null;\n}\n\n/**\n * Build a tool registry from a set of entries and a fallback. The returned\n * registry resolves in priority order: `raw.type` entries first, then `name`\n * entries, then the fallback. Consumer `entries` are consulted before the\n * built-in `baseEntries`, so they shadow defaults cleanly.\n */\nexport function createToolRegistry(\n baseEntries: ToolRegistryEntry[],\n baseFallback: ToolRenderer,\n options: CreateToolRegistryOptions = {},\n): ToolRegistry {\n const entries = [...(options.entries ?? []), ...baseEntries];\n const fallback = options.fallback ?? baseFallback;\n\n const byRawType = new Map<string, ToolRenderer>();\n const byName = new Map<string, ToolRenderer>();\n const byPrefixedLeaf = new Map<string, ToolRenderer>();\n for (const entry of entries) {\n if (entry.match === \"rawType\") {\n if (!byRawType.has(entry.type)) {\n byRawType.set(entry.type, entry.render);\n }\n } else if (!byName.has(entry.name)) {\n byName.set(entry.name, entry.render);\n }\n if (entry.match === \"name\" && entry.matchPrefixedLeaf !== false) {\n if (!byPrefixedLeaf.has(entry.name)) {\n byPrefixedLeaf.set(entry.name, entry.render);\n }\n }\n }\n\n const resolve = (item: ToolCallItem): ToolRenderer => {\n const rawType = rawTypeOf(item);\n if (rawType) {\n const byType = byRawType.get(rawType);\n if (byType) {\n return byType;\n }\n }\n const exact = byName.get(item.name);\n if (exact) {\n return exact;\n }\n const leaf = mcpToolLeaf(item.name);\n if (leaf !== item.name) {\n const byLeaf = byPrefixedLeaf.get(leaf);\n if (byLeaf) {\n return byLeaf;\n }\n }\n return fallback;\n };\n\n return { resolve, fallback };\n}\n","/**\n * Plain words for a shell command.\n *\n * A command row reads as what the command did (\"Downloaded report.json\",\n * \"Read notes.md\", \"Ran make_chart.py\") instead of the command itself. The\n * command stays one click away in the row's body. This is a best-effort,\n * display-only reading of the command text: anything it can't place falls back\n * to \"Ran a command\", and nothing here runs or changes the command.\n */\n\nimport type { OpenGeniText } from \"../messages/runtime\";\nimport { redactSignedUrls } from \"./credential-redaction\";\nimport { toolDisplayName } from \"./tool-display-name\";\nimport { toolStepLabel, type ToolStepPhase } from \"./tool-steps\";\n\n/* ---- shell reading ---------------------------------------------------------- */\n\ntype Redirect = { op: string; target: string };\ntype SimpleCommand = {\n words: string[];\n redirects: Redirect[];\n heredoc: boolean;\n /** The first command of this command's pipeline (itself when it starts one). */\n pipelineHead: SimpleCommand | null;\n};\n\n// `<<EOF` and `<<-'EOF'`, but not a `<<<` here-string.\nconst HEREDOC = /(?<!<)<<(?!<)-?\\s*(['\"]?)([A-Za-z_][\\w-]*)\\1/g;\n\n/** Drop here-document bodies (inline scripts and file contents) and keep the command lines. */\nfunction stripHeredocBodies(source: string): string {\n const lines = source.split(\"\\n\");\n const kept: string[] = [];\n for (let index = 0; index < lines.length; index++) {\n const line = lines[index]!;\n const delimiters = [...line.matchAll(HEREDOC)].map((match) => match[2]!);\n kept.push(line);\n for (const delimiter of delimiters) {\n while (index + 1 < lines.length && lines[index + 1]!.trim() !== delimiter) index++;\n index++;\n }\n }\n return kept.join(\"\\n\");\n}\n\ntype Token = { word: string } | { op: string };\n\n/** Split shell text into words and operators, honouring quotes and `$(…)`. */\nfunction tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let word = \"\";\n let inWord = false;\n const flush = () => {\n if (inWord) tokens.push({ word });\n word = \"\";\n inWord = false;\n };\n for (let i = 0; i < source.length; i++) {\n const ch = source[i]!;\n if (ch === \"'\") {\n const end = source.indexOf(\"'\", i + 1);\n word += source.slice(i + 1, end < 0 ? undefined : end);\n inWord = true;\n i = end < 0 ? source.length : end;\n } else if (ch === '\"') {\n let j = i + 1;\n while (j < source.length && source[j] !== '\"') {\n if (source[j] === \"\\\\\" && j + 1 < source.length) j++;\n word += source[j];\n j++;\n }\n inWord = true;\n i = j;\n } else if (ch === \"\\\\\") {\n if (source[i + 1] === \"\\n\") i++;\n else {\n word += source[i + 1] ?? \"\";\n inWord = true;\n i++;\n }\n } else if (ch === \"$\" && source[i + 1] === \"(\") {\n let depth = 0;\n let j = i + 1;\n for (; j < source.length; j++) {\n if (source[j] === \"(\") depth++;\n else if (source[j] === \")\" && --depth === 0) break;\n }\n word += source.slice(i, j + 1);\n inWord = true;\n i = j;\n } else if (ch === \"`\") {\n const end = source.indexOf(\"`\", i + 1);\n word += source.slice(i, end < 0 ? undefined : end + 1);\n inWord = true;\n i = end < 0 ? source.length : end;\n } else if (ch === \"#\" && !inWord) {\n while (i + 1 < source.length && source[i + 1] !== \"\\n\") i++;\n } else if (ch === \" \" || ch === \"\\t\") {\n flush();\n } else if (ch === \"\\n\" || ch === \";\" || ch === \"(\" || ch === \")\" || ch === \"{\" || ch === \"}\") {\n if ((ch === \"{\" || ch === \"}\") && inWord) {\n word += ch;\n continue;\n }\n flush();\n tokens.push({ op: \";\" });\n } else if (ch === \"&\" || ch === \"|\") {\n if (ch === \"&\" && source[i + 1] === \">\") {\n flush();\n tokens.push({ op: \">\" });\n i += source[i + 2] === \">\" ? 2 : 1;\n continue;\n }\n flush();\n const double = source[i + 1] === ch;\n tokens.push({ op: double ? \";\" : ch === \"|\" ? \"|\" : \";\" });\n if (double) i++;\n } else if (ch === \">\" || ch === \"<\") {\n // A file descriptor number right before the operator belongs to it (`2>`).\n let fd = \"\";\n if (inWord && /^\\d+$/.test(word)) {\n fd = word;\n word = \"\";\n inWord = false;\n }\n flush();\n let op = fd + ch;\n while (source[i + 1] === \">\" || source[i + 1] === \"<\") op += source[++i];\n if (source[i + 1] === \"&\") {\n // `2>&1`, `>&2`: a descriptor, not a file.\n i++;\n while (i + 1 < source.length && /[\\d-]/.test(source[i + 1]!)) i++;\n continue;\n }\n tokens.push({ op });\n } else {\n word += ch;\n inWord = true;\n }\n }\n flush();\n return tokens;\n}\n\n/** Commands in source order; a command after `|` points at its pipeline's first command. */\nfunction parseCommands(source: string): SimpleCommand[] {\n const text = stripHeredocBodies(source);\n const commands: SimpleCommand[] = [];\n const fresh = (): SimpleCommand => ({\n words: [],\n redirects: [],\n heredoc: false,\n pipelineHead: null,\n });\n let current = fresh();\n let head: SimpleCommand | null = null;\n let pendingRedirect: string | null = null;\n const end = (piped: boolean) => {\n if (current.words.length) {\n current.pipelineHead = head;\n commands.push(current);\n if (piped) head ??= current;\n }\n if (!piped) head = null;\n current = fresh();\n };\n for (const token of tokenize(text)) {\n if (\"op\" in token) {\n if (token.op === \";\") {\n end(false);\n } else if (token.op === \"|\") {\n end(true);\n } else if (token.op.startsWith(\"<<\")) {\n current.heredoc = true;\n pendingRedirect = token.op === \"<<<\" ? \"<<<\" : \"<<\";\n } else {\n pendingRedirect = token.op;\n }\n continue;\n }\n if (pendingRedirect) {\n current.redirects.push({ op: pendingRedirect, target: token.word });\n pendingRedirect = null;\n continue;\n }\n current.words.push(token.word);\n }\n end(false);\n return commands;\n}\n\n/* ---- reading a command ------------------------------------------------------ */\n\ntype NamedStep =\n | \"read\"\n | \"write\"\n | \"edit\"\n | \"list\"\n | \"download\"\n | \"runScript\"\n | \"install\"\n | \"createFolder\"\n | \"createFile\"\n | \"copy\"\n | \"move\"\n | \"delete\"\n | \"unpack\"\n | \"pack\"\n | \"convert\";\n\ntype FixedStep =\n | \"readFile\"\n | \"writeFile\"\n | \"browseFiles\"\n | \"searchFiles\"\n | \"runTests\"\n | \"installPackages\"\n | \"createFolderUnnamed\"\n | \"createFileUnnamed\"\n | \"copyFiles\"\n | \"moveFiles\"\n | \"deleteFiles\"\n | \"unpackFiles\"\n | \"packFiles\"\n | \"convertFile\"\n | \"checkChanges\"\n | \"saveChanges\"\n | \"uploadChanges\"\n | \"getChanges\"\n | \"queryDatabase\"\n | \"useGitHub\"\n | \"runDownloadedCode\"\n | \"reinstallPackages\";\n\ntype Step =\n | { kind: \"named\"; step: NamedStep; name: string | null; weight: number }\n | { kind: \"fixed\"; step: FixedStep; weight: number }\n | { kind: \"readFiles\"; count: number; weight: number }\n | { kind: \"search\"; query: string | null; weight: number }\n | { kind: \"host\"; step: \"fetch\" | \"send\"; host: string; weight: number }\n | { kind: \"code\"; language: string; weight: number }\n | { kind: \"tool\"; name: string; weight: number }\n | { kind: \"toolStep\"; step: \"findTools\" | \"checkProgress\" | \"wait\"; weight: number }\n /** A risky step with nothing safe to name (data sent to an unknown address): \"Ran a command\". */\n | { kind: \"opaque\"; weight: number };\n\n/** What a step says when its file has no name worth showing; null falls back to \"Ran a command\". */\nconst UNNAMED: Record<NamedStep, FixedStep | \"editFile\" | \"download\" | null> = {\n read: \"readFile\",\n write: \"writeFile\",\n edit: \"editFile\",\n list: \"browseFiles\",\n download: \"download\",\n runScript: null,\n install: \"installPackages\",\n createFolder: \"createFolderUnnamed\",\n createFile: \"createFileUnnamed\",\n copy: \"copyFiles\",\n move: \"moveFiles\",\n delete: \"deleteFiles\",\n unpack: \"unpackFiles\",\n pack: \"packFiles\",\n convert: \"convertFile\",\n};\n\n/**\n * Every step id a title is built from (`timeline.commandStep.<id>.<phase>`),\n * so the message catalog can check each one still has a use.\n */\nexport const COMMAND_STEP_IDS: ReadonlyArray<\n NamedStep | FixedStep | \"readFiles\" | \"search\" | \"searchFiles\" | \"fetch\" | \"send\" | \"runCode\"\n> = [\n ...(Object.keys(UNNAMED) as NamedStep[]),\n ...(Object.values(UNNAMED).filter(\n (step): step is FixedStep => step !== null && step !== \"editFile\" && step !== \"download\",\n ) as FixedStep[]),\n \"runTests\",\n \"checkChanges\",\n \"saveChanges\",\n \"uploadChanges\",\n \"getChanges\",\n \"queryDatabase\",\n \"useGitHub\",\n \"runDownloadedCode\",\n \"reinstallPackages\",\n \"readFiles\",\n \"search\",\n \"searchFiles\",\n \"fetch\",\n \"send\",\n \"runCode\",\n];\n\n/** Shell plumbing that never describes the work. */\nconst TRIVIAL = new Set([\n \"cd\",\n \"pushd\",\n \"popd\",\n \"export\",\n \"set\",\n \"unset\",\n \"source\",\n \".\",\n \"true\",\n \"false\",\n \":\",\n \"shopt\",\n \"trap\",\n \"alias\",\n \"umask\",\n \"ulimit\",\n \"echo\",\n \"printf\",\n \"if\",\n \"then\",\n \"else\",\n \"elif\",\n \"fi\",\n \"for\",\n \"while\",\n \"until\",\n \"do\",\n \"done\",\n \"case\",\n \"esac\",\n \"in\",\n \"[\",\n \"[[\",\n \"test\",\n \"exit\",\n \"return\",\n \"wait\",\n \"read\",\n \"local\",\n \"declare\",\n \"clear\",\n \"pwd\",\n \"date\",\n \"whoami\",\n \"which\",\n \"type\",\n \"command\",\n]);\n\nconst READERS = new Set([\n \"cat\",\n \"head\",\n \"tail\",\n \"less\",\n \"more\",\n \"nl\",\n \"bat\",\n \"wc\",\n \"pdftotext\",\n \"pdfinfo\",\n \"strings\",\n \"xxd\",\n \"hexdump\",\n \"file\",\n \"stat\",\n \"md5sum\",\n \"sha256sum\",\n \"column\",\n \"sort\",\n \"uniq\",\n \"cut\",\n \"jq\",\n \"yq\",\n \"csvlook\",\n \"exiftool\",\n]);\n\nconst LISTERS = new Set([\"ls\", \"find\", \"tree\", \"du\", \"fd\", \"fdfind\", \"exa\", \"eza\"]);\nconst SEARCHERS = new Set([\"grep\", \"egrep\", \"fgrep\", \"rg\", \"ag\", \"ack\"]);\nconst INTERPRETERS: Record<string, string> = {\n python: \"Python\",\n python3: \"Python\",\n node: \"JavaScript\",\n deno: \"JavaScript\",\n bun: \"JavaScript\",\n tsx: \"TypeScript\",\n \"ts-node\": \"TypeScript\",\n ruby: \"Ruby\",\n perl: \"Perl\",\n php: \"PHP\",\n Rscript: \"R\",\n bash: \"shell\",\n sh: \"shell\",\n zsh: \"shell\",\n};\nconst PACKAGE_MANAGERS = new Set([\n \"pip\",\n \"pip3\",\n \"npm\",\n \"yarn\",\n \"pnpm\",\n \"bun\",\n \"apt\",\n \"apt-get\",\n \"brew\",\n \"uv\",\n \"cargo\",\n \"gem\",\n \"conda\",\n \"go\",\n]);\nconst CONVERTERS = new Set([\n \"pandoc\",\n \"soffice\",\n \"libreoffice\",\n \"convert\",\n \"magick\",\n \"ffmpeg\",\n \"pdftoppm\",\n \"pdftocairo\",\n \"qpdf\",\n \"gs\",\n \"rsvg-convert\",\n \"inkscape\",\n \"wkhtmltopdf\",\n]);\nconst DATABASES = new Set([\"psql\", \"sqlite3\", \"mysql\", \"duckdb\", \"clickhouse-client\"]);\nconst TEST_RUNNERS = new Set([\"pytest\", \"jest\", \"vitest\", \"mocha\"]);\n\n/*\n * A title never makes a deletion or running downloaded code look harmless:\n * those steps outweigh everything else a command does, so the title names them.\n */\nconst DOWNLOADED_CODE_WEIGHT = 100;\n/** Sending data somewhere (`curl -d @- …`) outweighs whatever produced the data. */\nconst SEND_WEIGHT = 60;\nconst DELETE_WEIGHT = 50;\n/** Clearing a dependency or cache folder that a tool rebuilds is routine, not the headline. */\nconst REGENERABLE_DELETE_WEIGHT = 0.8;\nconst DOWNLOADERS = new Set([\"curl\", \"wget\", \"aria2c\", \"fetch\", \"http\", \"https\", \"xh\"]);\nconst DELETERS = new Set([\"rm\", \"rmdir\", \"unlink\", \"trash\", \"shred\", \"srm\"]);\nconst REGENERABLE_FOLDERS = new Set([\n \"node_modules\",\n \".venv\",\n \"venv\",\n \"__pycache__\",\n \".pytest_cache\",\n \".mypy_cache\",\n \".ruff_cache\",\n \".next\",\n \".turbo\",\n \".parcel-cache\",\n]);\nconst INSTALL_VALUE_FLAGS = new Set([\n \"-r\",\n \"--requirement\",\n \"-c\",\n \"--constraint\",\n \"-e\",\n \"--editable\",\n \"-i\",\n \"--index-url\",\n \"--extra-index-url\",\n \"-t\",\n \"--target\",\n \"--prefix\",\n \"-f\",\n \"--find-links\",\n]);\n/** `bash <(curl …)`, `sh -c \"$(wget …)\"`, `eval \"$(curl …)\"`, `source <(curl …)`. */\nconst RUNS_DOWNLOAD_INLINE =\n /(?:^|[\\s;&|(])(?:(?:ba|z|k|da)?sh|python3?|node|perl|ruby|php|eval|source|\\.)\\s+(?:-\\S+\\s+)*[\"']?(?:<\\(|\\$\\(|`)\\s*(?:\\S*\\/)?(?:curl|wget|aria2c|xh)\\b/;\n\nfunction basename(path: string): string {\n const trimmed = path.replace(/\\/+$/, \"\");\n return trimmed.slice(trimmed.lastIndexOf(\"/\") + 1);\n}\n\n/** A file or folder name worth showing, or null for globs, variables and option-like text. */\nfunction displayName(path: string | undefined): string | null {\n if (!path) return null;\n const name = basename(redactSignedUrls(path).replace(/\\?.*$/, \"\"));\n if (!name || name === \".\" || name === \"..\" || name === \"-\" || name.startsWith(\"-\")) return null;\n if (/[$*?`{}[\\]<>|]/.test(name) || /^\\d+$/.test(name)) return null;\n return name.length > 48 ? `${name.slice(0, 47)}…` : name;\n}\n\nfunction hostOf(url: string): string | null {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\" ? parsed.hostname : null;\n } catch {\n return null;\n }\n}\n\nfunction pathOf(url: string): string | undefined {\n try {\n return new URL(url).pathname;\n } catch {\n return undefined;\n }\n}\n\nfunction operands(words: readonly string[], valueFlags: ReadonlySet<string> = new Set()): string[] {\n const out: string[] = [];\n for (let i = 1; i < words.length; i++) {\n const word = words[i]!;\n if (word === \"--\") {\n out.push(...words.slice(i + 1));\n break;\n }\n if (word.startsWith(\"-\") && word.length > 1) {\n if (valueFlags.has(word)) i++;\n continue;\n }\n out.push(word);\n }\n return out;\n}\n\nfunction flagValue(words: readonly string[], flags: readonly string[]): string | undefined {\n for (let i = 1; i < words.length; i++) {\n const word = words[i]!;\n for (const flag of flags) {\n if (word === flag) return words[i + 1];\n if (flag.startsWith(\"--\") && word.startsWith(`${flag}=`)) return word.slice(flag.length + 1);\n }\n }\n return undefined;\n}\n\n/* ---- downloaders ------------------------------------------------------------- */\n\n/** Short options that take a value, so `-sSLo out.json` and `-qO-` read their value right. */\nconst CURL_VALUE_LETTERS = new Set(\"dFTXHuoAebcmrwxKEDUYyzCPQt\");\nconst WGET_VALUE_LETTERS = new Set(\"OoaPtTwUeilARDIXQB\");\nconst LONG_VALUE_OPTIONS = new Set([\n \"--output\",\n \"--out\",\n \"--output-document\",\n \"--output-file\",\n \"--data\",\n \"--data-raw\",\n \"--data-binary\",\n \"--data-ascii\",\n \"--data-urlencode\",\n \"--json\",\n \"--form\",\n \"--form-string\",\n \"--upload-file\",\n \"--request\",\n \"--method\",\n \"--header\",\n \"--user\",\n \"--password\",\n \"--user-agent\",\n \"--referer\",\n \"--cookie\",\n \"--cookie-jar\",\n \"--config\",\n \"--cert\",\n \"--key\",\n \"--max-time\",\n \"--connect-timeout\",\n \"--retry\",\n \"--post-data\",\n \"--post-file\",\n \"--body-data\",\n \"--body-file\",\n \"--directory-prefix\",\n \"--tries\",\n \"--timeout\",\n]);\nconst SEND_OPTIONS = [\n \"-d\",\n \"--data\",\n \"--data-raw\",\n \"--data-binary\",\n \"--data-ascii\",\n \"--data-urlencode\",\n \"--json\",\n \"-F\",\n \"--form\",\n \"--form-string\",\n \"-T\",\n \"--upload-file\",\n \"--post-data\",\n \"--post-file\",\n \"--body-data\",\n \"--body-file\",\n];\nconst SENDING_METHODS = /^(?:POST|PUT|PATCH|DELETE)$/i;\n\ntype DownloaderCall = {\n url: string | undefined;\n /** Where the body is saved: a file, `-` for standard output, or undefined when not set. */\n file: string | undefined;\n /** Saved under the link's own file name (`curl -O`, wget's default). */\n remoteName: boolean;\n /** Uploads or posts data. */\n sends: boolean;\n};\n\nfunction readDownloader(program: string, words: readonly string[]): DownloaderCall {\n const valueLetters = program === \"wget\" ? WGET_VALUE_LETTERS : CURL_VALUE_LETTERS;\n const options = new Map<string, string | true>();\n let url: string | undefined;\n for (let i = 1; i < words.length; i++) {\n const word = words[i]!;\n if (word === \"--\") {\n url ??= words.slice(i + 1).find((rest) => /^https?:\\/\\//i.test(rest));\n break;\n }\n if (word.startsWith(\"--\")) {\n const equals = word.indexOf(\"=\");\n if (equals > 0) options.set(word.slice(0, equals), word.slice(equals + 1));\n else if (LONG_VALUE_OPTIONS.has(word)) options.set(word, words[++i] ?? \"\");\n else options.set(word, true);\n continue;\n }\n if (/^-[A-Za-z]/.test(word)) {\n for (let j = 1; j < word.length; j++) {\n const letter = word[j]!;\n if (valueLetters.has(letter)) {\n options.set(`-${letter}`, j + 1 < word.length ? word.slice(j + 1) : (words[++i] ?? \"\"));\n break;\n }\n options.set(`-${letter}`, true);\n }\n continue;\n }\n if (!url && /^https?:\\/\\//i.test(word)) url = word;\n }\n const text = (name: string) => {\n const value = options.get(name);\n return typeof value === \"string\" ? value : undefined;\n };\n const method = text(\"-X\") ?? text(\"--request\") ?? text(\"--method\") ?? \"\";\n const sends = SEND_OPTIONS.some((name) => options.has(name)) || SENDING_METHODS.test(method);\n if (program === \"wget\") {\n const file = text(\"-O\") ?? text(\"--output-document\");\n return { url, file, remoteName: file === undefined, sends };\n }\n if (program === \"aria2c\") {\n const file = text(\"-o\") ?? text(\"--out\");\n return { url, file, remoteName: file === undefined, sends };\n }\n return {\n url,\n file: text(\"-o\") ?? text(\"--output\"),\n remoteName:\n options.has(\"-O\") || options.has(\"--remote-name\") || options.has(\"--remote-name-all\"),\n sends,\n };\n}\n\n/** The program a command runs, after wrappers such as `sudo` and `timeout`. */\nfunction programOf(command: SimpleCommand | null): string {\n return command ? basename(unwrap(command.words)[0] ?? \"\") : \"\";\n}\n\n/** Names of the files a command runs as a program: `./setup.sh`, `bash setup.sh`, `source env.sh`. */\nfunction filesRun(command: SimpleCommand): string[] {\n const words = unwrap(command.words);\n const first = words[0];\n if (!first) return [];\n if (/^\\.{0,2}\\//.test(first)) return [basename(first)];\n const program = basename(first);\n if (!INTERPRETERS[program] && program !== \"source\" && program !== \".\") return [];\n const script = operands(\n words,\n new Set([\"-W\", \"-X\", \"-r\", \"--require\", \"--import\", \"--loader\"]),\n )[0];\n return script ? [basename(script)] : [];\n}\n\nconst WRAPPERS = new Set([\"sudo\", \"time\", \"nice\", \"nohup\", \"exec\", \"stdbuf\", \"caffeinate\"]);\n\n/** Drop variable assignments and wrappers (`sudo`, `timeout 30`, `npx`) in front of the program. */\nfunction unwrap(words: readonly string[]): string[] {\n let rest = [...words];\n for (let guard = 0; guard < 8 && rest.length; guard++) {\n const first = rest[0]!;\n if (/^[A-Za-z_][A-Za-z0-9_]*=/.test(first)) rest = rest.slice(1);\n else if (WRAPPERS.has(first)) {\n rest = rest.slice(1);\n while (rest[0]?.startsWith(\"-\")) rest = rest.slice(1);\n } else if (first === \"env\") {\n rest = rest.slice(1);\n while (rest[0] && (rest[0].startsWith(\"-\") || rest[0].includes(\"=\"))) rest = rest.slice(1);\n } else if (first === \"timeout\") {\n rest = rest.slice(1);\n while (rest[0]?.startsWith(\"-\")) rest = rest.slice(1);\n rest = rest.slice(1);\n } else if (\n first === \"npx\" ||\n first === \"bunx\" ||\n first === \"pnpx\" ||\n (first === \"bun\" && rest[1] === \"x\")\n ) {\n rest = rest.slice(first === \"bun\" ? 2 : 1);\n while (rest[0]?.startsWith(\"-\"))\n rest = rest.slice(rest[0] === \"-p\" || rest[0] === \"--package\" ? 2 : 1);\n } else if ((first === \"uv\" || first === \"poetry\" || first === \"pipenv\") && rest[1] === \"run\") {\n rest = rest.slice(2);\n } else break;\n }\n return rest;\n}\n\nfunction classify(command: SimpleCommand, depth: number): Step | null {\n const words = unwrap(command.words);\n if (!words.length) return null;\n const program = basename(words[0]!);\n const sub = words[1];\n // Standard output written to a file (`> out.txt`); error streams and /dev/null don't count.\n const output = command.redirects.find(\n (r) => (r.op === \">\" || r.op === \">>\" || r.op === \"1>\") && r.target !== \"/dev/null\",\n )?.target;\n const named = (step: NamedStep, path: string | undefined, weight: number): Step => ({\n kind: \"named\",\n step,\n name: displayName(path),\n weight,\n });\n const fixed = (step: FixedStep, weight: number): Step => ({ kind: \"fixed\", step, weight });\n\n // Opengeni's tool client: `ogtool call <tool>` reads as that tool.\n const toolArgs =\n program === \"ogtool\"\n ? words.slice(1)\n : words[1] === \"codemode\" && /OPENGENI|ogtool/i.test(words[0]!)\n ? words.slice(2)\n : null;\n if (toolArgs) {\n const [verb, tool] = toolArgs;\n if (verb === \"call\" && tool) return { kind: \"tool\", name: tool, weight: 5 };\n if (verb === \"list\" || verb === \"show\" || verb === \"declarations\") {\n return { kind: \"toolStep\", step: \"findTools\", weight: 2 };\n }\n if (verb === \"read\") return { kind: \"toolStep\", step: \"checkProgress\", weight: 2 };\n return null;\n }\n\n if (DELETERS.has(program)) {\n const paths = operands(words);\n if (paths.length && paths.every((path) => REGENERABLE_FOLDERS.has(basename(path)))) {\n return paths.length === 1\n ? named(\"delete\", paths[0], REGENERABLE_DELETE_WEIGHT)\n : fixed(\"deleteFiles\", REGENERABLE_DELETE_WEIGHT);\n }\n return paths.length === 1\n ? named(\"delete\", paths[0], DELETE_WEIGHT)\n : fixed(\"deleteFiles\", DELETE_WEIGHT);\n }\n if (program === \"find\") {\n const exec = words.findIndex((word) => /^-(?:exec|execdir|ok|okdir)$/.test(word));\n if (\n words.includes(\"-delete\") ||\n (exec >= 0 && DELETERS.has(basename(unwrap(words.slice(exec + 1))[0] ?? \"\")))\n ) {\n return fixed(\"deleteFiles\", DELETE_WEIGHT);\n }\n }\n if (program === \"xargs\" || program === \"parallel\") {\n const rest = words.slice(1);\n while (rest[0]?.startsWith(\"-\")) rest.shift();\n if (DELETERS.has(basename(unwrap(rest)[0] ?? \"\"))) return fixed(\"deleteFiles\", DELETE_WEIGHT);\n return null;\n }\n if (program === \"git\" && (sub === \"clean\" || sub === \"rm\")) {\n return fixed(\"deleteFiles\", DELETE_WEIGHT);\n }\n\n if (TRIVIAL.has(program)) {\n return (program === \"echo\" || program === \"printf\") && output\n ? named(\"write\", output, 2)\n : null;\n }\n if (program === \"sleep\") return { kind: \"toolStep\", step: \"wait\", weight: 0.5 };\n\n if (program === \"curl\" || program === \"wget\" || program === \"aria2c\") {\n const call = readDownloader(program, words);\n const host = call.url ? hostOf(call.url) : null;\n // Sending data leads the title; with no address worth naming it is just \"Ran a command\".\n if (call.sends) {\n return host\n ? { kind: \"host\", step: \"send\", host, weight: SEND_WEIGHT }\n : { kind: \"opaque\", weight: SEND_WEIGHT };\n }\n const file = call.file ?? output;\n if (file && file !== \"-\" && file !== \"/dev/null\") return named(\"download\", file, 4);\n const remoteName = call.url && call.remoteName && file !== \"-\" ? pathOf(call.url) : undefined;\n if (remoteName && displayName(remoteName)) return named(\"download\", remoteName, 4);\n return host ? { kind: \"host\", step: \"fetch\", host, weight: 4 } : null;\n }\n\n if (program === \"cat\") {\n if (output) return named(\"write\", output, 3);\n const files = operands(words);\n if (!files.length) return null;\n return files.length > 1\n ? { kind: \"readFiles\", count: files.length, weight: 2 }\n : named(\"read\", files[0], 2);\n }\n if (program === \"tee\") return named(\"write\", operands(words)[0], 3);\n if (program === \"sed\" || program === \"awk\" || (program === \"perl\" && words.includes(\"-pi\"))) {\n const inPlace = words.some((word) => /^-i/.test(word) || word === \"-pi\");\n const files = operands(words, new Set([\"-e\", \"-f\"]));\n const file = files.length > 1 ? files[files.length - 1] : undefined;\n if (inPlace) return named(\"edit\", file, 3);\n return file ? named(\"read\", file, 2) : null;\n }\n if (READERS.has(program)) {\n const files = operands(\n words,\n new Set([\"-n\", \"-c\", \"--lines\", \"--bytes\", \"-d\", \"-f\", \"-k\", \"-t\"]),\n );\n const inputs = program === \"jq\" || program === \"yq\" ? files.slice(1) : files;\n if (!inputs.length) return null;\n return inputs.length > 1\n ? { kind: \"readFiles\", count: inputs.length, weight: 2 }\n : named(\"read\", inputs[0], 2);\n }\n if (LISTERS.has(program)) {\n const target = operands(\n words,\n new Set([\n \"-name\",\n \"-iname\",\n \"-type\",\n \"-maxdepth\",\n \"-mindepth\",\n \"-path\",\n \"-newer\",\n \"-size\",\n \"-mtime\",\n \"-L\",\n \"-d\",\n \"--max-depth\",\n ]),\n )[0];\n return target && target !== \".\" ? named(\"list\", target, 1) : fixed(\"browseFiles\", 1);\n }\n if (SEARCHERS.has(program) || (program === \"git\" && sub === \"grep\")) {\n if (program === \"rg\" && words.includes(\"--files\")) return fixed(\"browseFiles\", 1);\n const args = operands(\n program === \"git\" ? words.slice(1) : words,\n new Set([\n \"-e\",\n \"-g\",\n \"--glob\",\n \"-t\",\n \"--type\",\n \"-A\",\n \"-B\",\n \"-C\",\n \"-m\",\n \"--max-count\",\n \"--include\",\n \"--exclude\",\n ]),\n );\n const pattern = flagValue(words, [\"-e\"]) ?? args[0];\n const plain = pattern && /^[\\p{L}\\p{N} '’.,:@_-]{2,40}$/u.test(pattern) ? pattern : null;\n return { kind: \"search\", query: plain, weight: 2 };\n }\n if (program === \"mkdir\") {\n const dirs = operands(words, new Set([\"-m\"]));\n return dirs.length === 1 ? named(\"createFolder\", dirs[0], 1) : fixed(\"createFolderUnnamed\", 1);\n }\n if (program === \"touch\") {\n const files = operands(words);\n return files.length === 1 ? named(\"createFile\", files[0], 1) : fixed(\"createFileUnnamed\", 1);\n }\n if (program === \"cp\" || program === \"mv\" || program === \"rsync\" || program === \"ln\") {\n const paths = operands(words, new Set([\"-t\", \"--target-directory\", \"-e\"]));\n const step = program === \"mv\" ? \"move\" : \"copy\";\n if (program === \"ln\") return null;\n return paths.length === 2\n ? named(step, paths[0], 1.5)\n : fixed(step === \"move\" ? \"moveFiles\" : \"copyFiles\", 1.5);\n }\n if (program === \"unzip\" || program === \"gunzip\" || program === \"bunzip2\" || program === \"unxz\") {\n return named(\"unpack\", operands(words, new Set([\"-d\"]))[0], 2);\n }\n if (program === \"zip\") return named(\"pack\", operands(words)[0], 2);\n if (program === \"tar\" || program === \"7z\") {\n const flags = words.slice(1).join(\" \");\n const archive =\n flagValue(words, [\"-f\", \"--file\"]) ??\n words.slice(1).find((word) => /\\.(?:tar|tgz|gz|bz2|xz|zst|zip|7z)$/i.test(word));\n if (program === \"7z\" ? sub === \"x\" || sub === \"e\" : /(?:^|\\s)-?[a-z]*x/.test(flags)) {\n return named(\"unpack\", archive, 2);\n }\n return named(\"pack\", archive, 2);\n }\n if (CONVERTERS.has(program)) {\n const input =\n program === \"ffmpeg\"\n ? flagValue(words, [\"-i\"])\n : operands(\n words,\n new Set([\n \"-o\",\n \"--output\",\n \"--outdir\",\n \"--convert-to\",\n \"-t\",\n \"-f\",\n \"--from\",\n \"--to\",\n \"-density\",\n \"-resize\",\n \"-quality\",\n \"-r\",\n ]),\n )[0];\n return input ? named(\"convert\", input, 3) : fixed(\"convertFile\", 3);\n }\n if (DATABASES.has(program)) return fixed(\"queryDatabase\", 3);\n if (program === \"gh\") return fixed(\"useGitHub\", 2);\n if (program === \"git\") {\n switch (sub) {\n case \"status\":\n case \"diff\":\n case \"log\":\n case \"show\":\n case \"blame\":\n return fixed(\"checkChanges\", 1);\n case \"commit\":\n return fixed(\"saveChanges\", 2);\n case \"push\":\n return fixed(\"uploadChanges\", 2);\n case \"pull\":\n case \"fetch\":\n return fixed(\"getChanges\", 2);\n case \"clone\": {\n const repo = operands(words.slice(1), new Set([\"-b\", \"--branch\", \"--depth\", \"-o\"]))[0];\n return named(\"download\", repo?.replace(/\\.git$/, \"\"), 3);\n }\n default:\n return null;\n }\n }\n if (\n TEST_RUNNERS.has(program) ||\n ((program === \"bun\" ||\n program === \"npm\" ||\n program === \"yarn\" ||\n program === \"pnpm\" ||\n program === \"go\" ||\n program === \"cargo\") &&\n sub === \"test\")\n ) {\n return fixed(\"runTests\", 3);\n }\n if (PACKAGE_MANAGERS.has(program)) {\n const installVerb = program === \"uv\" && sub === \"pip\" ? words[2] : sub;\n if (installVerb === \"ci\" || (program === \"uv\" && installVerb === \"sync\")) {\n return fixed(\"installPackages\", 3);\n }\n if (installVerb === \"install\" || installVerb === \"add\" || installVerb === \"i\") {\n const packages = operands(\n program === \"uv\" && sub === \"pip\" ? words.slice(2) : words.slice(1),\n INSTALL_VALUE_FLAGS,\n ).filter((word) => !/^(?:-|install$|add$|i$)/.test(word));\n return packages.length === 1 ? named(\"install\", packages[0], 3) : fixed(\"installPackages\", 3);\n }\n if (\n (program === \"npm\" || program === \"yarn\" || program === \"pnpm\" || program === \"bun\") &&\n sub === \"run\" &&\n words[2]\n ) {\n return named(\"runScript\", words[2], 3);\n }\n }\n if (program === \"pip\" || program === \"pip3\") return null;\n\n const language = INTERPRETERS[program];\n if (language) {\n if (language === \"shell\") {\n const inline = flagValue(words, [\"-c\", \"-lc\", \"-ic\", \"-xc\", \"-ec\"]);\n if (inline && depth < 2) return pick(parseCommands(inline), depth + 1);\n }\n if (program === \"python\" || program === \"python3\") {\n const module = flagValue(words, [\"-m\"]);\n if (module === \"pytest\" || module === \"unittest\") return fixed(\"runTests\", 3);\n if (module === \"pip\") {\n return classify(\n { ...command, words: [\"pip\", ...words.slice(words.indexOf(\"-m\") + 2)] },\n depth,\n );\n }\n if (module) return named(\"runScript\", module, 3);\n }\n if (program === \"bun\" && sub && !/\\.(?:[cm]?[jt]sx?)$/.test(sub)) return null;\n const script = operands(\n words,\n new Set([\"-W\", \"-X\", \"-r\", \"--require\", \"--import\", \"--loader\"]),\n )[0];\n if (script && script !== \"-\" && /\\.[A-Za-z0-9]+$/.test(script))\n return named(\"runScript\", script, 3);\n const display =\n program === \"bun\" || program === \"deno\" || program === \"node\" ? \"JavaScript\" : language;\n if (command.heredoc || words.some((word) => /^-[ce]$/.test(word) || word === \"-\")) {\n return { kind: \"code\", language: display, weight: 3 };\n }\n return null;\n }\n if (/^\\.{0,2}\\/[\\w./-]+$/.test(words[0]!)) return named(\"runScript\", words[0], 3);\n return null;\n}\n\n/**\n * A command later in a pipeline only matters to the title when it deletes\n * (`… | xargs rm`), sends data (`cat .env | curl -d @- …`), runs what flows\n * into it as a program (`curl … | sh`) or saves a download (`curl … | tee a.json`).\n */\nfunction classifyPiped(command: SimpleCommand, depth: number): Step | null {\n const words = unwrap(command.words);\n const program = basename(words[0] ?? \"\");\n const language = INTERPRETERS[program];\n const headProgram = programOf(command.pipelineHead);\n if (language) {\n // `python3 -c '…'` and `bash -lc '…'` run their own code and only read the piped text.\n // (`bash -e` only stops on errors: it still runs the piped text.)\n const inlineFlag =\n language === \"shell\" || language === \"Python\" ? /^-[a-z]*c$/ : /^-(?:e|p|-eval|-print)$/;\n const inline = words.some((word) => inlineFlag.test(word));\n const script = operands(words).find((word) => /\\.[A-Za-z0-9]+$/.test(word));\n if (inline || script) return null;\n if (DOWNLOADERS.has(headProgram)) {\n return { kind: \"fixed\", step: \"runDownloadedCode\", weight: DOWNLOADED_CODE_WEIGHT };\n }\n const display =\n program === \"bun\" || program === \"deno\" || program === \"node\" ? \"JavaScript\" : language;\n return { kind: \"code\", language: display, weight: 3.5 };\n }\n const step = classify(command, depth);\n if (step && step.weight >= DELETE_WEIGHT) return step;\n if (DOWNLOADERS.has(headProgram)) {\n // A download saved further down the pipe: `curl … | tee a.json`, `curl … | jq . > a.json`.\n const saved =\n program === \"tee\"\n ? operands(words, new Set([\"-p\"]))[0]\n : command.redirects.find(\n (r) => (r.op === \">\" || r.op === \">>\" || r.op === \"1>\") && r.target !== \"/dev/null\",\n )?.target;\n if (saved && displayName(saved)) {\n return { kind: \"named\", step: \"download\", name: displayName(saved), weight: 4.5 };\n }\n }\n return null;\n}\n\nfunction isDeletion(step: Step): boolean {\n return (\n (step.kind === \"named\" && step.step === \"delete\") ||\n (step.kind === \"fixed\" && step.step === \"deleteFiles\")\n );\n}\n\nfunction pick(commands: readonly SimpleCommand[], depth: number): Step | null {\n let best: Step | null = null;\n const reads = new Set<string>();\n let readCount = 0;\n const deletions = new Set<string>();\n let regenerableDeletion = false;\n /** Files fetched by a downloader so far: running one later runs downloaded code. */\n const downloaded = new Set<string>();\n for (const command of commands) {\n let step = command.pipelineHead ? classifyPiped(command, depth) : classify(command, depth);\n if (downloaded.size && filesRun(command).some((name) => downloaded.has(name))) {\n step = { kind: \"fixed\", step: \"runDownloadedCode\", weight: DOWNLOADED_CODE_WEIGHT };\n }\n if (!step) continue;\n if (\n step.kind === \"named\" &&\n step.step === \"download\" &&\n step.name &&\n DOWNLOADERS.has(programOf(command.pipelineHead ?? command))\n ) {\n downloaded.add(step.name);\n }\n if (step.kind === \"named\" && step.step === \"read\" && step.name) {\n reads.add(step.name);\n readCount++;\n }\n if (step.kind === \"readFiles\") readCount += step.count;\n const deletes = isDeletion(step);\n if (deletes && step.weight < DELETE_WEIGHT) regenerableDeletion = true;\n else if (deletes) {\n // Several deletions read as \"Deleted files\", never as just the first one.\n deletions.add((step.kind === \"named\" && step.name) || `#${deletions.size}`);\n }\n if (!best || step.weight > best.weight) best = step;\n }\n if (!best) return null;\n if (isDeletion(best) && best.weight >= DELETE_WEIGHT && deletions.size > 1) {\n return { kind: \"fixed\", step: \"deleteFiles\", weight: best.weight };\n }\n const installs =\n (best.kind === \"named\" && best.step === \"install\") ||\n (best.kind === \"fixed\" && best.step === \"installPackages\");\n if (installs && regenerableDeletion) {\n return { kind: \"fixed\", step: \"reinstallPackages\", weight: best.weight };\n }\n if (\n (best.kind === \"named\" && best.step === \"read\" && reads.size > 1) ||\n (best.kind === \"readFiles\" && readCount > best.count)\n ) {\n return { kind: \"readFiles\", count: Math.max(reads.size, readCount), weight: best.weight };\n }\n return best;\n}\n\n/**\n * What a shell command did, in plain words and in the given phase (\"Downloading\n * report.json\" while it runs, \"Downloaded report.json\" once done), or null when\n * the command can't be placed; callers then say \"Ran a command\".\n */\nexport function commandStepTitle(\n t: OpenGeniText,\n command: string,\n phase: ToolStepPhase,\n): string | null {\n if (!command.trim()) return null;\n if (RUNS_DOWNLOAD_INLINE.test(command))\n return t(`timeline.commandStep.runDownloadedCode.${phase}`);\n const step = pick(parseCommands(command), 0);\n if (!step) return null;\n switch (step.kind) {\n case \"named\": {\n if (step.name) return t(`timeline.commandStep.${step.step}.${phase}`, { name: step.name });\n const unnamed = UNNAMED[step.step];\n if (unnamed === null) return null;\n if (unnamed === \"editFile\" || unnamed === \"download\") return toolStepLabel(t, unnamed, phase);\n return t(`timeline.commandStep.${unnamed}.${phase}`);\n }\n case \"fixed\":\n return t(`timeline.commandStep.${step.step}.${phase}`);\n case \"readFiles\":\n return t(`timeline.commandStep.readFiles.${phase}`, { count: step.count });\n case \"search\":\n return step.query\n ? t(`timeline.commandStep.search.${phase}`, { query: step.query })\n : t(`timeline.commandStep.searchFiles.${phase}`);\n case \"host\":\n return t(`timeline.commandStep.${step.step}.${phase}`, { host: step.host });\n case \"code\":\n return t(`timeline.commandStep.runCode.${phase}`, { language: step.language });\n case \"tool\": {\n // `ogtool call interaction.browser.open` names the tool by its catalog path.\n const dotted = step.name.split(\".\");\n const wire = dotted.length > 1 ? `${dotted[0]}__${dotted.slice(1).join(\"_\")}` : step.name;\n return toolDisplayName(t, wire, undefined, phase);\n }\n case \"toolStep\":\n return toolStepLabel(t, step.step, phase);\n case \"opaque\":\n return null;\n }\n}\n","import { isConnectedMachineOutcomeUnknownOutput, type GitFileDiff } from \"@opengeni/sdk\";\nimport { stringifyPayload, tryParseJson } from \"../lib/format\";\nimport {\n applyPatchOpsFromToolItem,\n controlCaret,\n execTruncated,\n isExecSessionLostBanner,\n looksBinary,\n parseExecBannerSessionId,\n parseToolArgs,\n retainedToolResultImages,\n sandboxCommandExitCode,\n stripExecBanner,\n tailPeek,\n unwrapMcpOutput,\n v4aToGitFileDiff,\n type ApplyPatchOperation,\n} from \"./parsers\";\nimport { commandStepTitle } from \"./command-step\";\nimport { redactDeep, redactSignedUrls, signedValuesDeep } from \"./credential-redaction\";\nimport { invokedToolCall } from \"./invoked-tool\";\nimport { rawTypeOf } from \"./registry\";\nimport { mcpToolLeaf, toolDisplayName } from \"./tool-display-name\";\nimport {\n builtInToolStep,\n toolStepLabel,\n toolStepPhase,\n type ToolStepId,\n type ToolStepPhase,\n} from \"./tool-steps\";\nimport type { ToolCallItem } from \"./types\";\nimport { type OpenGeniText } from \"../messages/runtime\";\n\n/* ----------------------------------------------------------------------------\n Tool row presentation model (renderer-neutral)\n\n The collapsed-row decisions every tool renderer makes — icon, tint, title,\n preview, settle chip and what the expanded body holds — expressed as plain\n data so DOM and non-DOM renderers draw the same row from one source of truth.\n Web renderers consume these functions; a change here changes every surface.\n -------------------------------------------------------------------------- */\n\nexport type ToolIconKind =\n | \"terminal\"\n | \"keyboard\"\n | \"file-diff\"\n | \"search\"\n | \"question\"\n | \"target\"\n | \"brain\"\n | \"sessions\"\n | \"server\"\n | \"server-cog\"\n | \"calendar\"\n | \"panels\"\n | \"share\"\n | \"message\"\n | \"git\"\n | \"box\"\n | \"key\"\n | \"file-search\"\n | \"package-search\"\n | \"plug\"\n | \"browser\"\n | \"screen\"\n | \"spreadsheet\"\n | \"wait\"\n | \"download\"\n | \"clipboard\"\n | \"image\"\n | \"video\"\n | \"record\"\n | \"document\"\n | \"file\"\n | \"attachment\"\n | \"archive\"\n | \"folder\"\n | \"site\"\n | \"skill\"\n | \"settings\"\n | \"bell\"\n | \"phone\"\n | \"inbox\"\n | \"help\"\n | \"model\"\n | \"progress\"\n | \"helper\"\n | \"sign-in\"\n | \"code\"\n | \"accounting\"\n | \"rename\"\n | \"wrench\";\n\nexport type ToolIconTone = \"accent\" | \"failed\" | \"running\" | \"muted\";\n\nexport type ToolChip = {\n tone: \"ok\" | \"bad\" | \"muted\" | \"interrupted\";\n text: string;\n};\n\n/** The collapsed-row secondary line. `running` previews carry the pulse locus. */\nexport type ToolPreview =\n | { kind: \"text\"; text: string; running?: boolean | undefined }\n | {\n kind: \"path\";\n path: string;\n add?: number | undefined;\n del?: number | undefined;\n }\n | { kind: \"files\"; count: number; add: number; del: number }\n | { kind: \"malformed\"; name: string };\n\nexport type ToolPatchFile = {\n key: string;\n path: string;\n file: GitFileDiff | null;\n diff: string;\n};\n\nexport type WebSearchResult = {\n title: string;\n domain: string;\n snippet: string;\n};\n\n/** What the expanded body holds; renderers draw these with their own primitives. */\nexport type ToolBody =\n | {\n kind: \"term\";\n command: string | null;\n workdir: string | null;\n output: string;\n live?: boolean | undefined;\n failed?: boolean | undefined;\n note?: string | undefined;\n }\n | { kind: \"note\"; text: string; tone?: \"error\" | undefined }\n | {\n kind: \"payloads\";\n /** A short explanation above the payloads. */\n note?: string | undefined;\n blocks: Array<{ label: string; value: unknown; failed?: boolean }>;\n }\n | {\n kind: \"patch\";\n files: ToolPatchFile[];\n /** A single malformed op renders its raw patch without the path caption. */\n bare?: boolean | undefined;\n }\n | { kind: \"web-results\"; results: WebSearchResult[] | null }\n | {\n /** A short labelled listing (disclosed tools, search hits) above payloads. */\n kind: \"listing\";\n note?: string | undefined;\n entries: ToolListingEntry[];\n /** Entries beyond the visible list (\"+N more\"). */\n more?: number | undefined;\n /** Shown instead of the list when it is known to be empty. */\n empty?: string | undefined;\n blocks: Array<{ label: string; value: unknown; failed?: boolean }>;\n }\n /** Nothing to expand: the row says everything a person needs. */\n | { kind: \"none\" };\n\nexport type ToolListingEntry = {\n key: string;\n title: string;\n /** Quiet leading label (the tool's server). */\n eyebrow?: string | null | undefined;\n mono?: boolean | undefined;\n /** Secondary text under the title (a search snippet). */\n snippet?: string | undefined;\n};\n\nexport type PresentedToolKind =\n | \"exec\"\n | \"write_stdin\"\n | \"apply_patch\"\n | \"web_search\"\n | \"ask\"\n | \"run_on\"\n | \"tool_search\"\n | \"docs_search\"\n | \"session_title\"\n | \"machine\"\n | \"generic\";\n\nexport type ToolRowPresentation = {\n tool: PresentedToolKind;\n icon: ToolIconKind;\n iconTone: ToolIconTone;\n title: string;\n titleMono?: boolean | undefined;\n running?: boolean | undefined;\n preview?: ToolPreview | undefined;\n chip?: ToolChip | undefined;\n failed?: boolean | undefined;\n cancelled?: boolean | undefined;\n /**\n * The preview quotes raw tool detail (command output, an error payload, tool\n * names), so plain rows leave it out.\n */\n detailPreview?: boolean | undefined;\n body: ToolBody;\n};\n\n/**\n * How much of a tool call a row shows. `full` (the default) shows commands,\n * arguments, output and diffs; `plain` shows only the plain step, its status\n * and human-readable results, never raw arguments, output or JSON.\n */\nexport type ToolDetails = \"full\" | \"plain\";\n\nexport type ToolPresentationContext = {\n /** Host-supplied active compute label (\"on <label> · …\" preview prefix). */\n computeLabel?: string | null | undefined;\n /** See `ToolDetails`. Defaults to `full`. */\n details?: ToolDetails | undefined;\n};\n\n/** Prefix a collapsed preview with the host-supplied active compute label. */\nexport function withComputePreview(label: string | null | undefined, preview: string): string {\n if (!label) {\n return preview;\n }\n return `on ${label} · ${preview}`;\n}\n\nexport function truncatePreview(text: string, max: number): string {\n const cleaned = text.replace(/\\s+/g, \" \").trim();\n if (!cleaned) {\n return \"\";\n }\n return cleaned.length > max ? `${cleaned.slice(0, max - 1)}…` : cleaned;\n}\n\n/**\n * The readable part of a tool error, for a one-line preview: the message inside\n * a JSON error envelope, without the runtime's \"please try again\" wrapper, an\n * HTTP status prefix or a trailing support reference. The full error stays in\n * the row body.\n */\nexport function readableToolError(text: string): string {\n const stripTransport = (value: string) =>\n value\n .trim()\n .replace(/^An error occurred while running the tool\\. Please try again\\.\\s*(Error:\\s*)?/, \"\")\n .replace(/^(?:[A-Za-z][\\w.-]{0,40} )?API \\d{3}:\\s*/, \"\");\n let message = stripTransport(text);\n const parsed = tryParseJson(message);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const envelope = parsed as { error?: unknown; message?: unknown };\n const inner =\n typeof envelope.error === \"string\"\n ? envelope.error\n : envelope.error && typeof envelope.error === \"object\"\n ? (envelope.error as { message?: unknown }).message\n : envelope.message;\n if (typeof inner === \"string\" && inner.trim()) message = stripTransport(inner);\n }\n return message.replace(/\\s*\\(?Reference: [\\w-]+\\)?\\.?$/, \"\").trim();\n}\n\nfunction textPreview(text: string, running?: boolean): ToolPreview {\n return running ? { kind: \"text\", text, running: true } : { kind: \"text\", text };\n}\n\n/* ---- exec_command ---------------------------------------------------------- */\n\n/**\n * A command row's title: what the command did in plain words (\"Downloaded\n * report.json\"), or \"Ran a command\" when it can't be placed. A call that ended\n * badly keeps the ongoing form so its chip finishes the sentence.\n */\nfunction execTitle(t: OpenGeniText, cmd: string, phase: ToolStepPhase): string {\n return commandStepTitle(t, cmd, phase) ?? toolStepLabel(t, \"runCommand\", phase);\n}\n\nexport function execPresentation(\n t: OpenGeniText,\n item: ToolCallItem,\n context: ToolPresentationContext = {},\n): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const cmd = typeof args.cmd === \"string\" ? args.cmd : \"\";\n // The command is one click away in the body; signed links never show their signature.\n const command = cmd.trim() ? redactSignedUrls(cmd) : null;\n const workdir = typeof args.workdir === \"string\" ? args.workdir : null;\n const out = item.output;\n const computeLabel = context.computeLabel ?? null;\n const base = {\n tool: \"exec\" as const,\n icon: \"terminal\" as const,\n title: execTitle(t, cmd, \"running\"),\n };\n\n if (isConnectedMachineOutcomeUnknownOutput(out)) {\n // The call has ended; only its effects are unknown, which the chip says.\n return {\n ...base,\n title: execTitle(t, cmd, \"done\"),\n iconTone: \"failed\",\n failed: true,\n chip: { tone: \"bad\", text: t(\"timeline.toolPresentation.outcomeUnknown\") },\n body: {\n kind: \"term\",\n command,\n workdir,\n output: redactSignedUrls(out, undefined, \"text\"),\n failed: true,\n },\n };\n }\n\n // No output event ever arrived: the turn failed before the output insert —\n // most likely a NUL byte in the command output prevented storage.\n if (item.status === \"failed\" && out === undefined) {\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: t(\"timeline.chip.failed\") },\n preview: textPreview(\n withComputePreview(computeLabel, t(\"timeline.toolPresentation.outputLostNulByteCould\")),\n ),\n body: {\n kind: \"term\",\n command,\n workdir,\n output: \"\",\n failed: true,\n note: t(\"timeline.toolPresentation.outputContainedANulByte\"),\n },\n };\n }\n\n if (item.status === \"failed\" && (out == null || out === \"\")) {\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: t(\"timeline.chip.failed\") },\n preview: textPreview(\n withComputePreview(computeLabel, t(\"timeline.toolPresentation.toolCallFailed\")),\n ),\n body: {\n kind: \"term\",\n command,\n workdir,\n output: \"\",\n failed: true,\n note: t(\"timeline.toolPresentation.theToolCallFailedWith\"),\n },\n };\n }\n\n if (item.status === \"running\") {\n const streamed =\n typeof out === \"string\" ? redactSignedUrls(stripExecBanner(out), undefined, \"text\") : \"\";\n const runningPreview = streamed ? `${streamed.split(\"\\n\").length} lines` : \"running…\";\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(withComputePreview(computeLabel, runningPreview), true),\n body: {\n kind: \"term\",\n command,\n workdir,\n output: streamed,\n live: true,\n },\n };\n }\n\n const text = typeof out === \"string\" ? out : stringifyPayload(out);\n const stripped = redactSignedUrls(stripExecBanner(text), undefined, \"text\");\n const bgSession = parseExecBannerSessionId(text);\n const exitCode = sandboxCommandExitCode(text);\n const binary = looksBinary(stripped);\n const exitedBadly = exitCode != null && exitCode !== 0;\n\n // Color is spent on the exception only: a clean exit earns no chip.\n let chip: ToolChip | undefined;\n let iconTone: ToolIconTone = \"muted\";\n if (bgSession != null) {\n chip = { tone: \"muted\", text: `session ${bgSession}` };\n } else if (exitCode != null && exitCode !== 0) {\n chip = { tone: \"bad\", text: `exit ${exitCode}` };\n iconTone = \"failed\";\n }\n\n const peek = binary\n ? t(\"timeline.toolPresentation.binaryOutput\")\n : tailPeek(stripped) || t(\"timeline.toolPresentation.noOutput\");\n const truncated = execTruncated(text);\n const preview = withComputePreview(\n computeLabel,\n truncated ? t(\"timeline.toolPresentation.truncatedPeek\", { peek }) : peek,\n );\n return {\n ...base,\n title: execTitle(\n t,\n cmd,\n item.status === \"complete\" && !exitedBadly && bgSession == null ? \"done\" : \"running\",\n ),\n iconTone,\n ...(chip ? { chip } : {}),\n failed: item.status === \"failed\",\n cancelled: item.status === \"cancelled\",\n preview: textPreview(preview),\n body: {\n kind: \"term\",\n command,\n workdir,\n output: binary ? t(\"timeline.toolPresentation.binaryOutputSuppressed\") : stripped,\n failed: item.status === \"failed\" || exitedBadly,\n ...(bgSession != null\n ? {\n note: t(\"timeline.toolPresentation.sessionBgsessionALaterWrite\", { bgSession }),\n }\n : {}),\n },\n };\n}\n\n/* ---- write_stdin ----------------------------------------------------------- */\n\nexport function writeStdinPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const sessionId =\n typeof args.session_id === \"string\" || typeof args.session_id === \"number\"\n ? args.session_id\n : undefined;\n const text = typeof item.output === \"string\" ? item.output : stringifyPayload(item.output);\n const lost = isExecSessionLostBanner(text);\n const keys = controlCaret(typeof args.chars === \"string\" ? args.chars : \"\");\n const exitCode = sandboxCommandExitCode(text);\n const stripped = stripExecBanner(text);\n const title = `session ${sessionId} ← ${keys || \"∅\"}`;\n const base = {\n tool: \"write_stdin\" as const,\n icon: \"keyboard\" as const,\n title,\n titleMono: true,\n };\n\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(\"sending…\", true),\n body: {\n kind: \"note\",\n text: t(\"timeline.toolPresentation.sendingInputToSessionSessionid\", { sessionId }),\n },\n };\n }\n\n let chip: ToolChip | undefined;\n if (lost) {\n chip = { tone: \"bad\", text: t(\"timeline.chip.lost\") };\n } else if (exitCode != null && exitCode !== 0) {\n chip = { tone: \"bad\", text: `exit ${exitCode}` };\n }\n\n return {\n ...base,\n iconTone: lost ? \"failed\" : \"muted\",\n ...(chip ? { chip } : {}),\n failed: item.status === \"failed\",\n cancelled: item.status === \"cancelled\",\n preview: textPreview(\n lost\n ? t(\"timeline.toolPresentation.sessionSessionidPtyVanished\", { sessionId })\n : tailPeek(stripped) || \"sent\",\n ),\n body: lost\n ? { kind: \"note\", tone: \"error\", text: stripped || text }\n : {\n kind: \"term\",\n command: `write_stdin → session ${sessionId}`,\n workdir: null,\n output: stripped,\n },\n };\n}\n\n/* ---- apply_patch ----------------------------------------------------------- */\n\nexport function patchVerb(t: OpenGeniText, op: ApplyPatchOperation | undefined): string {\n if (!op) {\n return t(\"timeline.toolPresentation.edited\");\n }\n return op.type === \"create_file\"\n ? t(\"timeline.toolPresentation.created\")\n : op.type === \"delete_file\"\n ? t(\"timeline.toolPresentation.deleted\")\n : op.moveTo\n ? t(\"timeline.toolPresentation.renamed\")\n : t(\"timeline.toolPresentation.edited\");\n}\n\nexport function pathBasename(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n return parts.length ? parts[parts.length - 1]! : path;\n}\n\nexport function pathDirname(path: string): string {\n const idx = path.lastIndexOf(\"/\");\n return idx >= 0 ? path.slice(0, idx + 1) : \"\";\n}\n\nexport function safeParsePatchOp(op: ApplyPatchOperation): GitFileDiff | null {\n try {\n return v4aToGitFileDiff(op);\n } catch {\n return null;\n }\n}\n\nfunction patchFiles(\n ops: ApplyPatchOperation[],\n parsed?: Array<GitFileDiff | null>,\n): ToolPatchFile[] {\n return ops.map((op, index) => ({\n key: `${op.type}:${op.path}:${index}`,\n path: op.path,\n file: parsed ? (parsed[index] ?? null) : safeParsePatchOp(op),\n diff: op.diff ?? \"\",\n }));\n}\n\n/** Returns null when a settled patch has no op (renderers fall back to generic). */\nexport function applyPatchPresentation(\n t: OpenGeniText,\n item: ToolCallItem,\n): ToolRowPresentation | null {\n const ops = applyPatchOpsFromToolItem(item);\n const cancelled = item.status === \"cancelled\";\n const firstOp = ops[0];\n const base = { tool: \"apply_patch\" as const, icon: \"file-diff\" as const };\n\n if (item.status === \"running\") {\n // Show the patch structure from the arguments, marked clearly in-progress.\n const fileCount = ops.length;\n const titleVerb = firstOp\n ? t(\"timeline.toolPresentation.applyingPathbasename\", {\n pathBasename: pathBasename(firstOp.path),\n })\n : t(\"timeline.toolPresentation.applyingPatch\");\n return {\n ...base,\n iconTone: \"running\",\n title:\n fileCount > 1\n ? t(\"timeline.toolPresentation.applyingFilecountFiles\", { fileCount })\n : titleVerb,\n running: true,\n preview: textPreview(\n fileCount > 1 ? `${fileCount} files` : firstOp ? firstOp.path : \"applying…\",\n true,\n ),\n body: { kind: \"patch\", files: patchFiles(ops) },\n };\n }\n\n if (item.status === \"failed\") {\n return {\n ...base,\n iconTone: \"failed\",\n title: firstOp ? `${patchVerb(t, firstOp)} ${pathBasename(firstOp.path)}` : \"apply_patch\",\n chip: { tone: \"bad\", text: t(\"timeline.chip.failed\") },\n preview: textPreview(\n typeof item.output === \"string\" ? item.output : t(\"timeline.toolPresentation.patchFailed\"),\n ),\n body: {\n kind: \"payloads\",\n blocks: [{ label: t(\"timeline.toolPresentation.error\"), value: item.output, failed: true }],\n },\n };\n }\n\n // Multi-file edit: magnitude stays a single muted glyph pair.\n if (ops.length > 1) {\n const parsed = ops.map((op) => safeParsePatchOp(op));\n const goodFiles = parsed.filter((f): f is GitFileDiff => f !== null);\n const add = goodFiles.reduce((n, f) => n + f.additions, 0);\n const del = goodFiles.reduce((n, f) => n + f.deletions, 0);\n return {\n ...base,\n iconTone: \"accent\",\n title: t(\"timeline.toolPresentation.editedLengthFiles\", { length: ops.length }),\n cancelled,\n preview: { kind: \"files\", count: ops.length, add, del },\n body: { kind: \"patch\", files: patchFiles(ops, parsed) },\n };\n }\n\n if (!firstOp) {\n return null;\n }\n if (firstOp.type === \"delete_file\") {\n return {\n ...base,\n iconTone: \"failed\",\n title: t(\"timeline.toolPresentation.deletedPathbasename\", {\n pathBasename: pathBasename(firstOp.path),\n }),\n cancelled,\n preview: { kind: \"path\", path: firstOp.path },\n body: { kind: \"note\", text: t(\"timeline.toolPresentation.fileDeletedNoDiffTo\") },\n };\n }\n\n const file = safeParsePatchOp(firstOp);\n if (!file) {\n return {\n ...base,\n iconTone: \"accent\",\n title: `${patchVerb(t, firstOp)} ${pathBasename(firstOp.path)}`,\n cancelled,\n preview: { kind: \"malformed\", name: pathBasename(firstOp.path) },\n body: { kind: \"patch\", files: patchFiles([firstOp], [null]), bare: true },\n };\n }\n\n return {\n ...base,\n iconTone: \"accent\",\n title: `${patchVerb(t, firstOp)} ${pathBasename(file.path)}`,\n cancelled,\n preview: {\n kind: \"path\",\n path: file.path,\n add: file.additions,\n del: file.deletions,\n },\n body: { kind: \"patch\", files: patchFiles([firstOp], [file]) },\n };\n}\n\n/* ---- web search ------------------------------------------------------------ */\n\nexport function webSearchQueryFromArguments(args: unknown): string | null {\n if (typeof args === \"string\") {\n const trimmed = args.trim();\n if (!trimmed) {\n return null;\n }\n try {\n return webSearchQueryFromArguments(JSON.parse(trimmed));\n } catch {\n return trimmed;\n }\n }\n if (!args || typeof args !== \"object\") {\n return null;\n }\n const record = args as Record<string, unknown>;\n if (typeof record.query === \"string\" && record.query.trim().length > 0) {\n return record.query;\n }\n if (Array.isArray(record.queries)) {\n const first = record.queries.find(\n (value): value is string => typeof value === \"string\" && value.trim().length > 0,\n );\n if (first) {\n return first;\n }\n }\n return null;\n}\n\nexport function webSearchPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const raw = (item.raw ?? {}) as {\n providerData?: {\n action?: {\n type?: string;\n query?: string;\n queries?: string[];\n url?: string;\n pattern?: string;\n };\n };\n };\n const action = raw.providerData?.action ?? {};\n const actionType = action.type ?? \"search\";\n const queries = (action.queries ?? []).filter(\n (value): value is string => typeof value === \"string\" && value.trim().length > 0,\n );\n const searchQuery =\n (typeof action.query === \"string\" && action.query.trim().length > 0 ? action.query : null) ??\n queries[0] ??\n webSearchQueryFromArguments(item.arguments);\n const running = item.status === \"running\";\n const query =\n actionType === \"open_page\"\n ? (action.url ?? t(\"timeline.toolPresentation.pageUnavailable\"))\n : actionType === \"find_in_page\"\n ? action.pattern && action.url\n ? `\"${action.pattern}\" in ${action.url}`\n : (action.pattern ?? action.url ?? t(\"timeline.toolPresentation.pageUnavailable\"))\n : // Codex often emits the live card before action.query/queries land.\n (searchQuery ?? (running ? \"…\" : t(\"timeline.toolPresentation.queryUnavailable\")));\n const variants = queries.length > 1 ? ` +${queries.length - 1} variants` : \"\";\n const base = { tool: \"web_search\" as const, icon: \"search\" as const };\n\n if (running) {\n return {\n ...base,\n iconTone: \"running\",\n title:\n actionType === \"open_page\"\n ? t(\"timeline.toolPresentation.openingWebPage\")\n : actionType === \"find_in_page\"\n ? t(\"timeline.toolPresentation.searchingWithinPage\")\n : t(\"timeline.toolPresentation.searchingTheWeb\"),\n running: true,\n preview: textPreview(`${query}${variants}`, true),\n body: {\n kind: \"note\",\n text: t(\"timeline.toolPresentation.searchingResultsFoldIntoThe\"),\n },\n };\n }\n\n const rawResults = (item.output as { results?: unknown } | undefined)?.results;\n const results = Array.isArray(rawResults)\n ? (rawResults as unknown[]).filter((r): r is WebSearchResult => !!r && typeof r === \"object\")\n : null;\n return {\n ...base,\n iconTone: \"muted\",\n title:\n actionType === \"open_page\"\n ? t(\"timeline.toolPresentation.openedWebPage\")\n : actionType === \"find_in_page\"\n ? t(\"timeline.toolPresentation.searchedWithinPage\")\n : t(\"timeline.toolPresentation.searchedTheWeb\"),\n preview: textPreview(`${query}${variants}`),\n failed: item.status === \"failed\",\n cancelled: item.status === \"cancelled\",\n body: { kind: \"web-results\", results },\n };\n}\n\n/* ---- MCP-shaped tools: ask, run_on, generic -------------------------------- */\n\nexport function askToolPreview(args: unknown): string | null {\n const record = args && typeof args === \"object\" ? (args as Record<string, unknown>) : null;\n const questions = Array.isArray(record?.questions) ? record.questions : null;\n if (!questions || questions.length === 0) {\n return null;\n }\n const first = questions[0];\n if (!first || typeof first !== \"object\") {\n return null;\n }\n const q = first as Record<string, unknown>;\n const text =\n typeof q.label === \"string\" && q.label.trim()\n ? q.label.trim()\n : typeof q.prompt === \"string\" && q.prompt.trim()\n ? q.prompt.trim()\n : null;\n if (!text) {\n return null;\n }\n const preview = truncatePreview(text, 90);\n return questions.length > 1 ? `${preview} · ${questions.length} questions` : preview;\n}\n\nexport function runOnTargetName(output: unknown): string | null {\n const { text } = unwrapMcpOutput(output);\n const parsed = tryParseJson(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const name = (parsed as { targetName?: unknown }).targetName;\n if (typeof name === \"string\" && name.trim()) {\n return name.trim();\n }\n }\n return null;\n}\n\nexport function runOnOpPreview(args: Record<string, unknown>): string | null {\n const op = args.op;\n if (!op || typeof op !== \"object\" || Array.isArray(op)) {\n return null;\n }\n const record = op as Record<string, unknown>;\n if (record.kind === \"exec\" && typeof record.cmd === \"string\" && record.cmd.trim()) {\n return `$ ${redactSignedUrls(record.cmd.trim())}`;\n }\n if (\n (record.kind === \"read\" || record.kind === \"write\") &&\n typeof record.path === \"string\" &&\n record.path.trim()\n ) {\n return truncatePreview(record.path.trim(), 72);\n }\n return null;\n}\n\nexport function goalToolPreview(name: string, args: unknown): string | null {\n const leaf = mcpToolLeaf(name);\n if (\n leaf !== \"goal_set\" &&\n leaf !== \"goal_update\" &&\n leaf !== \"goal_complete\" &&\n leaf !== \"goal_pause\" &&\n leaf !== \"wait_for_input\"\n ) {\n return null;\n }\n const record = args && typeof args === \"object\" ? (args as Record<string, unknown>) : null;\n if (!record) {\n return null;\n }\n const text =\n typeof record.text === \"string\"\n ? record.text\n : typeof record.evidence === \"string\"\n ? record.evidence\n : typeof record.rationale === \"string\"\n ? record.rationale\n : typeof record.reason === \"string\"\n ? record.reason\n : typeof record.progressNote === \"string\"\n ? record.progressNote\n : null;\n return text ? truncatePreview(text, 90) : null;\n}\n\nconst SKILL_TOOLS: ReadonlySet<string> = new Set([\n \"skill_read\",\n \"repository_skill_read\",\n \"skill_checkout\",\n \"skill_search\",\n \"skill_save\",\n \"skill_publish\",\n \"skill_install\",\n \"skill_remove\",\n]);\nconst UUID_LIKE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** \"operate-smart-home\" → \"Operate smart home\"; \"builtin:documents\" → \"Documents\". */\nfunction readableSkillName(name: string): string | null {\n const bare = name.trim().replace(/^builtin:/, \"\");\n if (!bare || UUID_LIKE.test(bare)) return null;\n const plain = bare.replace(/[-_]+/g, \" \").replace(/\\s+/g, \" \").trim();\n if (!plain) return null;\n return plain.charAt(0).toUpperCase() + plain.slice(1);\n}\n\n/** The `name:` in a returned SKILL.md's front matter, read from raw or JSON-escaped text. */\nfunction skillNameInOutput(output: unknown): string | null {\n const { text } = unwrapMcpOutput(output);\n const head = text\n .slice(0, 4_000)\n .replace(/\\\\r/g, \"\")\n .replace(/\\r/g, \"\")\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\\"/g, '\"');\n const start = /(?:^|\\n|\")---[ \\t]*\\n/.exec(head);\n if (!start) return null;\n const rest = head.slice(start.index + start[0].length);\n const end = /\\n---[ \\t]*(?:\\n|$)/.exec(rest);\n const frontMatter = end ? rest.slice(0, end.index + 1) : rest;\n const match = /(?:^|\\n)name:[ \\t]*[\"']?([^\"'\\n\\\\]+?)[\"']?[ \\t]*(?:\\n|$)/.exec(frontMatter);\n return match?.[1]?.trim() || null;\n}\n\n/**\n * Which skill a skill step used: the name in the SKILL.md it returned, else the\n * name or query it was called with. A bare id is never shown.\n */\nexport function skillToolPreview(item: ToolCallItem): string | null {\n const leaf = mcpToolLeaf(item.name);\n if (!SKILL_TOOLS.has(leaf)) return null;\n const args = parseToolArgs(item.arguments);\n if (leaf === \"skill_search\") {\n return typeof args.query === \"string\" && args.query.trim()\n ? truncatePreview(args.query, 72)\n : null;\n }\n const returned = item.status === \"running\" ? null : skillNameInOutput(item.output);\n const requested =\n typeof args.skill === \"string\"\n ? args.skill\n : typeof args.name === \"string\"\n ? args.name\n : typeof args.skillId === \"string\"\n ? args.skillId\n : null;\n const name = readableSkillName(returned ?? requested ?? \"\");\n return name ? truncatePreview(name, 72) : null;\n}\n\n/**\n * The icon for each built-in step. Tools that read as the same step share its\n * icon, so a row's icon always matches its words (\"Opened the browser\" draws\n * the browser). Typed as a full record: a new step without an icon fails to\n * compile.\n */\nconst TOOL_STEP_ICONS: Readonly<Record<ToolStepId, ToolIconKind>> = {\n // Chats, goals and notifications\n nameChat: \"rename\",\n saveBotTemplate: \"rename\",\n notify: \"bell\",\n callYou: \"phone\",\n withdrawNotification: \"bell\",\n tidyInbox: \"inbox\",\n setGoal: \"target\",\n noteProgress: \"target\",\n completeGoal: \"target\",\n pauseGoal: \"target\",\n resumeGoal: \"target\",\n wait: \"wait\",\n askYou: \"question\",\n askForHelp: \"help\",\n // Notes, knowledge and instructions\n checkNotes: \"brain\",\n checkMeetings: \"record\",\n saveMeetingNotes: \"record\",\n saveNote: \"brain\",\n archiveNote: \"brain\",\n proposeUpdate: \"brain\",\n confirmUpdate: \"brain\",\n updateInstructions: \"brain\",\n coordinateWork: \"sessions\",\n // Guides (Skills)\n readGuide: \"skill\",\n findGuides: \"skill\",\n saveGuide: \"skill\",\n removeGuide: \"skill\",\n // Computers\n findComputers: \"server\",\n switchComputer: \"server\",\n useComputer: \"server\",\n setUpComputer: \"server\",\n removeComputer: \"server\",\n runCommand: \"terminal\",\n runCode: \"code\",\n editFile: \"file-diff\",\n lookAtImage: \"image\",\n searchCode: \"search\",\n searchFiles: \"file-search\",\n openFile: \"file\",\n // Screens and the browser\n checkScreens: \"screen\",\n openScreen: \"screen\",\n lookAtScreen: \"screen\",\n useScreen: \"screen\",\n enableScreenControl: \"screen\",\n useClipboard: \"clipboard\",\n openBrowser: \"browser\",\n useBrowser: \"browser\",\n readPage: \"browser\",\n lookAtPage: \"browser\",\n workInBrowser: \"browser\",\n download: \"download\",\n recordBrowser: \"record\",\n signIn: \"sign-in\",\n manageSignIns: \"sign-in\",\n shareBrowser: \"share\",\n workInExcel: \"spreadsheet\",\n // Projects, other chats and helpers\n checkProjects: \"folder\",\n organizeProjects: \"folder\",\n checkChats: \"sessions\",\n chooseChat: \"sessions\",\n checkProgress: \"progress\",\n changeModel: \"model\",\n startHelper: \"helper\",\n messageAssistant: \"sessions\",\n manageChat: \"sessions\",\n // Workspace administration and setup\n manageWorkspace: \"settings\",\n manageSetup: \"server-cog\",\n checkModels: \"model\",\n // Passwords and settings\n findPassword: \"key\",\n savePassword: \"key\",\n deletePassword: \"key\",\n checkSettings: \"settings\",\n updateSettings: \"settings\",\n // Tools and connections\n findTools: \"package-search\",\n useTool: \"plug\",\n requestAccess: \"plug\",\n listRepositories: \"git\",\n // Web, images and video\n searchWeb: \"search\",\n createImage: \"image\",\n createVideo: \"video\",\n // Social accounts\n checkAccounts: \"share\",\n readPosts: \"share\",\n syncPosts: \"share\",\n replyToPost: \"share\",\n // Scheduled tasks\n checkSchedules: \"calendar\",\n checkEvents: \"calendar\",\n changeEventSource: \"calendar\",\n createSchedule: \"calendar\",\n updateSchedule: \"calendar\",\n runSchedule: \"calendar\",\n // Slack\n readSlack: \"message\",\n postSlack: \"message\",\n deleteMessage: \"message\",\n // Accounting\n readAccounting: \"accounting\",\n updateAccounting: \"accounting\",\n // Documents, files and Sites\n searchDocuments: \"file-search\",\n checkDocuments: \"document\",\n createDocument: \"document\",\n editDocument: \"document\",\n exportDocument: \"document\",\n restoreDocument: \"document\",\n archiveDocument: \"archive\",\n shareFile: \"attachment\",\n checkSite: \"site\",\n updateSite: \"site\",\n};\n\n/**\n * The icon for a tool by name: a built-in tool draws its step's icon; other\n * tools fall back to their family's icon, then the generic wrench.\n */\nexport function genericToolIconKind(name: string): ToolIconKind {\n const leaf = mcpToolLeaf(name);\n const step = builtInToolStep(leaf);\n if (step) return TOOL_STEP_ICONS[step];\n return leaf.startsWith(\"goal_\")\n ? \"target\"\n : leaf.startsWith(\"memory_\") || leaf.startsWith(\"knowledge_\")\n ? \"brain\"\n : leaf.startsWith(\"session_\") || leaf.startsWith(\"sessions_\")\n ? \"sessions\"\n : leaf.startsWith(\"sandbox\") || leaf.startsWith(\"connected_machine_\")\n ? \"server\"\n : leaf.startsWith(\"rig_\")\n ? \"server-cog\"\n : leaf.startsWith(\"scheduled_\")\n ? \"calendar\"\n : leaf.startsWith(\"artifacts_\") || leaf.startsWith(\"editable_artifact_\")\n ? \"document\"\n : leaf.startsWith(\"site_\")\n ? \"site\"\n : leaf.startsWith(\"browser_\")\n ? \"browser\"\n : leaf.startsWith(\"computer_\") || leaf.startsWith(\"cua_\")\n ? \"screen\"\n : leaf.startsWith(\"secret_\")\n ? \"key\"\n : leaf.startsWith(\"social_\") ||\n leaf.startsWith(\"x_\") ||\n leaf.startsWith(\"reddit_\")\n ? \"share\"\n : leaf.startsWith(\"slack_\")\n ? \"message\"\n : leaf.startsWith(\"github_\")\n ? \"git\"\n : leaf.startsWith(\"variable_\") || leaf.startsWith(\"environment_\")\n ? \"settings\"\n : leaf.includes(\"document\")\n ? \"file-search\"\n : leaf.startsWith(\"skill_\")\n ? \"skill\"\n : \"wrench\";\n}\n\ntype McpRowOptions = {\n tool: PresentedToolKind;\n icon: ToolIconKind;\n title: string;\n /** Preview while running (falls back to `runningFallback`). */\n runningPreview: string | null;\n runningFallback: string;\n /** Settled preview (null → none); ask/run_on also use it as the error fallback. */\n settledPreview: string | null;\n /** Generic shows \"Done\" when no settled preview exists and skips the error fallback. */\n settledFallback?: string | undefined;\n /** Ask/run_on omit an empty Result block. */\n omitEmptyResult?: boolean | undefined;\n /** Generic shows a goal preview as plain text (no pulse) while running. */\n plainRunningPreview?: boolean | undefined;\n /** Machine steps say they failed in the title, so the preview stays empty. */\n quietError?: boolean | undefined;\n};\n\nfunction mcpRowPresentation(\n t: OpenGeniText,\n item: ToolCallItem,\n options: McpRowOptions,\n): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const base = { tool: options.tool, icon: options.icon, title: options.title };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview:\n options.runningPreview != null && options.plainRunningPreview\n ? textPreview(options.runningPreview)\n : textPreview(options.runningPreview ?? options.runningFallback, true),\n body: {\n kind: \"payloads\",\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n // Cancelled is not an error, even if the payload carries an isError flag.\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n const errorFallback = options.settledFallback === undefined ? options.settledPreview : null;\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: t(\"timeline.chip.error\") },\n ...(options.quietError\n ? {}\n : {\n detailPreview: true,\n preview: textPreview(\n truncatePreview(readableToolError(outText), 80) ||\n errorFallback ||\n t(\"timeline.toolPresentation.error\"),\n ),\n }),\n body: {\n kind: \"payloads\",\n blocks: [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.error\"), value: outText, failed: true },\n ],\n },\n };\n }\n const settled =\n item.status === \"cancelled\"\n ? null\n : (options.settledPreview ?? options.settledFallback ?? null);\n return {\n ...base,\n iconTone: \"muted\",\n cancelled: item.status === \"cancelled\",\n ...(settled != null ? { preview: textPreview(settled) } : {}),\n body: {\n kind: \"payloads\",\n blocks:\n options.omitEmptyResult && !outText\n ? [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }]\n : [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.result\"), value: outText },\n ],\n },\n };\n}\n\nexport function askPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const preview = askToolPreview(parseToolArgs(item.arguments));\n return mcpRowPresentation(t, item, {\n tool: \"ask\",\n icon: \"question\",\n title: t(\"timeline.toolPresentation.ask\"),\n runningPreview: preview,\n runningFallback: t(\"timeline.toolPresentation.waiting\"),\n settledPreview: preview,\n omitEmptyResult: true,\n });\n}\n\nexport function runOnPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const targetName = runOnTargetName(item.output);\n const opPreview = runOnOpPreview(parseToolArgs(item.arguments));\n return mcpRowPresentation(t, item, {\n tool: \"run_on\",\n icon: \"server\",\n title: targetName\n ? t(\"timeline.toolPresentation.runOnTargetname\", { targetName })\n : t(\"timeline.toolPresentation.runOn\"),\n runningPreview: opPreview,\n runningFallback: t(\"timeline.toolPresentation.running\"),\n settledPreview: opPreview,\n omitEmptyResult: true,\n });\n}\n\n/**\n * Finding machines, moving onto one and back, and using its screen, said the\n * way a person would describe it: \"Looked at the screen\", \"Typed “hello”\".\n */\nexport function machinePresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const leaf = mcpToolLeaf(item.name);\n const args = parseToolArgs(item.arguments);\n const action = leaf === \"computer_act\" ? computerActAction(args) : null;\n const preview = (action && computerActPreview(action)) ?? null;\n // A step that didn't work says so in words; the error itself stays one click\n // away in the row body instead of leaking a raw API payload into the preview.\n const failed =\n item.status !== \"running\" &&\n item.status !== \"cancelled\" &&\n (item.status === \"failed\" || unwrapMcpOutput(item.output).isError);\n return mcpRowPresentation(t, item, {\n tool: \"machine\",\n icon: genericToolIconKind(item.name),\n title: failed ? machineFailureTitle(t, leaf) : machineTitle(t, leaf, args, action, item.output),\n runningPreview: preview,\n runningFallback: t(\"timeline.toolPresentation.running\"),\n settledPreview: preview,\n settledFallback: t(\"timeline.toolPresentation.done\"),\n plainRunningPreview: true,\n quietError: true,\n });\n}\n\nfunction machineFailureTitle(t: OpenGeniText, leaf: string): string {\n switch (leaf) {\n case \"sandboxes_list\":\n return t(\"timeline.toolPresentation.couldNotLookForMachines\");\n case \"sandbox_swap\":\n return t(\"timeline.toolPresentation.couldNotMoveToTheMachine\");\n case \"computer_open\":\n return t(\"timeline.toolPresentation.couldNotOpenTheScreen\");\n default:\n return t(\"timeline.toolPresentation.couldNotUseTheScreen\");\n }\n}\n\n/** Direct screen-driver steps, named by what they did on the screen. */\nfunction cuaTitle(t: OpenGeniText, leaf: string): string {\n if (/^cua_(get_|list_|verify_|parse_|zoom$)/.test(leaf)) {\n return t(\"timeline.toolPresentation.lookedAtTheScreen\");\n }\n if (/^cua_(click|double_click|right_click)$/.test(leaf)) {\n return t(\"timeline.toolPresentation.clickedOnTheScreen\");\n }\n if (/^cua_(type_text|press_key|hotkey)$/.test(leaf)) {\n return t(\"timeline.toolPresentation.typedOnTheKeyboard\");\n }\n return t(\"timeline.toolPresentation.usedTheScreen\");\n}\n\ntype ComputerActAction = { type?: unknown; value?: unknown; locator?: unknown };\n\nfunction computerActAction(args: Record<string, unknown>): ComputerActAction | null {\n const action = args.action;\n return action && typeof action === \"object\" ? (action as ComputerActAction) : null;\n}\n\nfunction machineTitle(\n t: OpenGeniText,\n leaf: string,\n args: Record<string, unknown>,\n action: ComputerActAction | null,\n output: unknown,\n): string {\n switch (leaf) {\n case \"sandboxes_list\":\n return t(\"timeline.toolPresentation.lookedForMachines\");\n case \"interaction_discover\":\n return t(\"timeline.toolPresentation.lookedForScreens\");\n case \"sandbox_swap\": {\n if (args.target === \"session\") return t(\"timeline.toolPresentation.movedBack\");\n const targetName = runOnTargetName(output);\n return targetName\n ? t(\"timeline.toolPresentation.movedToTargetname\", { targetName })\n : t(\"timeline.toolPresentation.movedToAMachine\");\n }\n case \"computer_open\":\n return t(\"timeline.toolPresentation.openedTheScreen\");\n case \"computer_act\":\n return action?.type === \"pointer\"\n ? t(\"timeline.toolPresentation.clickedOnTheScreen\")\n : action?.type === \"keyboard\"\n ? t(\"timeline.toolPresentation.typedOnTheKeyboard\")\n : t(\"timeline.toolPresentation.usedTheScreen\");\n default:\n return leaf.startsWith(\"cua_\")\n ? cuaTitle(t, leaf)\n : t(\"timeline.toolPresentation.lookedAtTheScreen\");\n }\n}\n\n/** What a screen action typed or chose, when it says so: “hello”, “Save”. */\nfunction computerActPreview(action: ComputerActAction): string | undefined {\n const locator =\n action.locator && typeof action.locator === \"object\"\n ? (action.locator as { name?: unknown; text?: unknown })\n : undefined;\n const named =\n typeof locator?.name === \"string\"\n ? locator.name\n : typeof locator?.text === \"string\"\n ? locator.text\n : undefined;\n const shown = (\n action.type === \"keyboard\" && typeof action.value === \"string\" ? action.value : named\n )?.trim();\n if (!shown) return undefined;\n return `\\u201c${shown.length > 60 ? `${shown.slice(0, 59)}…` : shown}\\u201d`;\n}\n\n/**\n * Baseline craft for unmatched tools: family icon + title-cased leaf + honest\n * status preview (Running… / Done / error snippet).\n */\nexport function genericToolPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const goalPreview =\n goalToolPreview(item.name, parseToolArgs(item.arguments)) ??\n skillToolPreview(item) ??\n callUserPreview(t, item);\n const title = toolDisplayName(t, item.name, item.display, callStepPhase(item));\n if (item.status !== \"running\") {\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n const base = {\n tool: \"generic\" as const,\n icon: genericToolIconKind(item.name),\n title,\n };\n const args = parseToolArgs(item.arguments);\n // A permission Block is a decision, not a tool failure: say so plainly instead\n // of the generic \"error occurred, please try again\" wrapper.\n if (isError && BLOCKED_OUTPUT.test(outText)) {\n return {\n ...base,\n iconTone: \"muted\",\n chip: { tone: \"interrupted\", text: t(\"timeline.chip.blocked\") },\n preview: textPreview(t(\"timeline.toolPresentation.blockedByYourPermissionSettings\")),\n body: {\n kind: \"payloads\",\n note: t(\"timeline.toolPresentation.yourPermissionSettingsBlockThis\"),\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n // An interrupted approved action may have run. Never invite a blind retry.\n if (isError && UNCERTAIN_OUTPUT.test(outText)) {\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: t(\"timeline.toolPresentation.outcomeUnknown\") },\n preview: textPreview(t(\"timeline.toolPresentation.itMayHaveRun\")),\n body: {\n kind: \"payloads\",\n note: t(\"timeline.toolPresentation.thisActionMayHaveRun\"),\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n }\n return mcpRowPresentation(t, item, {\n tool: \"generic\",\n icon: genericToolIconKind(item.name),\n title,\n runningPreview: goalPreview,\n runningFallback: t(\"timeline.toolPresentation.running\"),\n settledPreview: goalPreview,\n settledFallback: t(\"timeline.toolPresentation.done\"),\n plainRunningPreview: true,\n });\n}\n\n/** The runtime's exact refusal for a tool whose effective permission is Block. */\nconst BLOCKED_OUTPUT = /Connector action was not executed: blocked\\b/;\n\n/**\n * An agent calling the person: why while it rings, then how it ended\n * (\"No answer · Production is down\").\n */\nexport function callUserPreview(t: OpenGeniText, item: ToolCallItem): string | null {\n if (mcpToolLeaf(item.name) !== \"call_user\") return null;\n const args = parseToolArgs(item.arguments);\n const reason =\n args && typeof args === \"object\" && typeof (args as { reason?: unknown }).reason === \"string\"\n ? truncatePreview((args as { reason: string }).reason, 80)\n : null;\n if (item.status === \"running\") return reason;\n const result = tryParseJson(unwrapMcpOutput(item.output).text);\n const record = result && typeof result === \"object\" ? (result as Record<string, unknown>) : null;\n const outcome =\n record?.placed === false\n ? t(\"timeline.toolPresentation.callUser.notPlaced\")\n : record?.outcome === \"answered\"\n ? t(\"timeline.toolPresentation.callUser.answered\")\n : record?.outcome === \"declined\"\n ? t(\"timeline.toolPresentation.callUser.declined\")\n : record?.outcome === \"missed\"\n ? t(\"timeline.toolPresentation.callUser.missed\")\n : record?.outcome === \"cancelled\"\n ? t(\"timeline.toolPresentation.callUser.cancelled\")\n : null;\n if (outcome && reason) return `${outcome} · ${reason}`;\n return outcome ?? reason;\n}\n/** The runtime's refusal to guess whether an approved action ran. */\nconst UNCERTAIN_OUTPUT = /Connector action outcome is uncertain\\b/;\n\n/* ---- tool_search (progressive MCP disclosure) ------------------------------ */\n\nexport type DisclosedTool = {\n /** Full wire name (`server__leaf` or bare). */\n name: string;\n /** Server / namespace prefix before `__`, when present. */\n source: string | null;\n /** Leaf tool name after `__`. */\n leaf: string;\n};\n\nexport function splitToolWireName(name: string): DisclosedTool {\n const boundary = name.indexOf(\"__\");\n if (boundary <= 0) {\n return { name, source: null, leaf: name };\n }\n return {\n name,\n source: name.slice(0, boundary),\n leaf: name.slice(boundary + 2),\n };\n}\n\n/** Capability query from live tool_search args (object or JSON string). */\nexport function toolSearchQuery(item: ToolCallItem): string {\n const fromArgs = parseToolArgs(item.arguments);\n if (typeof fromArgs.query === \"string\" && fromArgs.query.trim()) {\n return fromArgs.query.trim();\n }\n const raw = item.raw;\n if (raw && typeof raw === \"object\") {\n const rawArgs = (raw as { arguments?: unknown }).arguments;\n if (typeof rawArgs === \"string\" && rawArgs.trim()) {\n const parsed = tryParseJson(rawArgs);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const query = (parsed as { query?: unknown }).query;\n if (typeof query === \"string\" && query.trim()) {\n return query.trim();\n }\n }\n } else if (rawArgs && typeof rawArgs === \"object\" && !Array.isArray(rawArgs)) {\n const query = (rawArgs as { query?: unknown }).query;\n if (typeof query === \"string\" && query.trim()) {\n return query.trim();\n }\n }\n }\n return \"\";\n}\n\n/**\n * Parse disclosed tools from the runtime event shape.\n * `normalizeSdkEvent` collapses `tool_search_output.tools[]` into text:\n * \"Disclosed tools: a, b\" | \"No matching tools found.\"\n * Also accept a structured `tools` array when a host/enricher preserves it.\n */\nexport function parseDisclosedTools(output: unknown): DisclosedTool[] | null {\n if (output && typeof output === \"object\" && !Array.isArray(output)) {\n const tools = (output as { tools?: unknown }).tools;\n if (Array.isArray(tools)) {\n return tools\n .map((tool) => {\n if (typeof tool === \"string\" && tool.trim()) {\n return splitToolWireName(tool.trim());\n }\n if (\n tool &&\n typeof tool === \"object\" &&\n typeof (tool as { name?: unknown }).name === \"string\"\n ) {\n const name = (tool as { name: string }).name.trim();\n return name ? splitToolWireName(name) : null;\n }\n return null;\n })\n .filter((tool): tool is DisclosedTool => tool != null);\n }\n }\n\n const { text } = unwrapMcpOutput(output);\n const trimmed = text.trim();\n if (!trimmed) {\n return null;\n }\n if (/^no matching tools found\\.?$/i.test(trimmed)) {\n return [];\n }\n const disclosed = trimmed.match(/^disclosed tools:\\s*(.+)$/i);\n if (disclosed?.[1]) {\n return disclosed[1]\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean)\n .map(splitToolWireName);\n }\n const parsed = tryParseJson(trimmed);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parseDisclosedTools(parsed);\n }\n return null;\n}\n\nexport function toolSearchPreview(\n t: OpenGeniText,\n tools: DisclosedTool[] | null,\n cancelled: boolean,\n): string | undefined {\n if (cancelled) {\n return undefined;\n }\n if (!tools) {\n return t(\"timeline.toolPresentation.done\");\n }\n if (tools.length === 0) {\n return t(\"timeline.toolPresentation.noMatches\");\n }\n if (tools.length === 1) {\n return tools[0]!.leaf;\n }\n const head = tools[0]!.leaf;\n return t(\"timeline.toolPresentation.lengthToolsTruncatepreview\", {\n length: tools.length,\n truncatePreview: truncatePreview(head, 28),\n });\n}\n\nexport function toolSearchPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const query = toolSearchQuery(item);\n const queryPreview = query ? truncatePreview(query, 64) : \"\";\n const note = query ? `capability query: ${query}` : undefined;\n const args = parseToolArgs(item.arguments);\n const base = { tool: \"tool_search\" as const, icon: \"package-search\" as const };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n title: t(\"timeline.toolPresentation.lookingUpTools\"),\n running: true,\n preview: textPreview(\n queryPreview || t(\"timeline.toolPresentation.matchingCapabilities\"),\n true,\n ),\n body: {\n kind: \"listing\",\n note,\n entries: [],\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return {\n ...base,\n iconTone: \"failed\",\n title: t(\"timeline.toolPresentation.toolLookupFailed\"),\n failed: true,\n preview: textPreview(\n truncatePreview(outText, 80) || queryPreview || t(\"timeline.toolPresentation.lookupFailed\"),\n ),\n body: {\n kind: \"listing\",\n note,\n entries: [],\n blocks: [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.error\"), value: outText, failed: true },\n ],\n },\n };\n }\n const tools = parseDisclosedTools(item.output);\n const preview = toolSearchPreview(t, tools, item.status === \"cancelled\");\n return {\n ...base,\n iconTone: \"muted\",\n title: t(\"timeline.toolPresentation.lookedUpTools\"),\n detailPreview: true,\n cancelled: item.status === \"cancelled\",\n ...(preview ? { preview: textPreview(preview) } : {}),\n body: {\n kind: \"listing\",\n note,\n entries: (tools ?? []).slice(0, 12).map((tool) => ({\n key: tool.name,\n title: tool.leaf,\n eyebrow: tool.source,\n mono: true,\n })),\n more: tools && tools.length > 12 ? tools.length - 12 : undefined,\n empty:\n tools && tools.length === 0\n ? t(\"timeline.toolPresentation.noDeferredToolsMatchedThis\")\n : undefined,\n blocks:\n tools == null && outText\n ? [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.result\"), value: outText },\n ]\n : [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n}\n\n/* ---- docs / knowledge search ----------------------------------------------- */\n\nexport type SearchHit = { title: string; snippet: string };\n\nexport function parseSearchHits(t: OpenGeniText, outText: string): SearchHit[] | null {\n const parsed = tryParseJson(outText);\n if (parsed == null) {\n return null;\n }\n const list = Array.isArray(parsed)\n ? parsed\n : parsed &&\n typeof parsed === \"object\" &&\n Array.isArray((parsed as { results?: unknown }).results)\n ? (parsed as { results: unknown[] }).results\n : parsed && typeof parsed === \"object\" && Array.isArray((parsed as { hits?: unknown }).hits)\n ? (parsed as { hits: unknown[] }).hits\n : null;\n if (!list) {\n return null;\n }\n return list.map((row) => {\n const r = row && typeof row === \"object\" ? (row as Record<string, unknown>) : {};\n const title =\n (typeof r.title === \"string\" && r.title) ||\n (typeof r.name === \"string\" && r.name) ||\n (typeof r.documentTitle === \"string\" && r.documentTitle) ||\n (typeof r.path === \"string\" && r.path) ||\n (typeof r.id === \"string\" && r.id) ||\n t(\"timeline.toolPresentation.result\");\n const snippet =\n (typeof r.snippet === \"string\" && r.snippet) ||\n (typeof r.text === \"string\" && r.text) ||\n (typeof r.content === \"string\" && r.content) ||\n \"\";\n return { title, snippet: truncatePreview(snippet, 160) };\n });\n}\n\nexport function docsSearchPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const query = typeof args.query === \"string\" ? args.query.trim() : \"\";\n const base = {\n tool: \"docs_search\" as const,\n icon: \"file-search\" as const,\n title: query\n ? t(\"timeline.toolPresentation.searchTruncatepreview\", {\n truncatePreview: truncatePreview(query, 48),\n })\n : toolDisplayName(t, item.name, item.display, callStepPhase(item)),\n };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(t(\"timeline.toolPresentation.searching\"), true),\n body: {\n kind: \"payloads\",\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return {\n ...base,\n iconTone: \"failed\",\n failed: true,\n preview: textPreview(\n truncatePreview(outText, 80) || t(\"timeline.toolPresentation.searchFailed\"),\n ),\n body: {\n kind: \"payloads\",\n blocks: [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.error\"), value: outText, failed: true },\n ],\n },\n };\n }\n const hits = parseSearchHits(t, outText);\n const preview =\n item.status === \"cancelled\"\n ? undefined\n : hits\n ? hits.length === 0\n ? t(\"timeline.toolPresentation.noHits\")\n : t(\"counts.hits\", { count: hits.length })\n : t(\"timeline.toolPresentation.done\");\n return {\n ...base,\n iconTone: \"muted\",\n cancelled: item.status === \"cancelled\",\n ...(preview ? { preview: textPreview(preview) } : {}),\n body: {\n kind: \"listing\",\n entries: (hits ?? []).slice(0, 8).map((hit) => ({\n key: `${hit.title}\\u0000${hit.snippet}`,\n title: hit.title,\n snippet: hit.snippet || undefined,\n })),\n blocks: [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.result\"), value: outText },\n ],\n },\n };\n}\n\n/* ---- set_session_title / set_other_session_title --------------------------- */\n\nexport function sessionTitlePresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const titleArg = typeof args.title === \"string\" ? args.title.trim() : \"\";\n const previewTitle = titleArg ? truncatePreview(titleArg, 72) : \"\";\n const base = {\n tool: \"session_title\" as const,\n icon: genericToolIconKind(item.name),\n title: toolDisplayName(t, item.name, item.display, callStepPhase(item)),\n };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(previewTitle || t(\"timeline.toolPresentation.settingTitle\"), true),\n body: {\n kind: \"payloads\",\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return {\n ...base,\n iconTone: \"failed\",\n failed: true,\n preview: textPreview(\n truncatePreview(outText, 80) || t(\"timeline.toolPresentation.renameFailed\"),\n ),\n body: {\n kind: \"payloads\",\n blocks: [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.error\"), value: outText, failed: true },\n ],\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 return {\n ...base,\n iconTone: \"muted\",\n cancelled: item.status === \"cancelled\",\n ...(item.status !== \"cancelled\" && settledTitle ? { preview: textPreview(settledTitle) } : {}),\n body: {\n kind: \"payloads\",\n blocks: outText\n ? [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.result\"), value: outText },\n ]\n : [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n}\n\n/* ---- resolution ------------------------------------------------------------ */\n\nconst PRESENTERS_BY_RAW_TYPE: Record<string, PresentedToolKind> = {\n apply_patch_call: \"apply_patch\",\n // Web renders these with richer media renderers; keep them off name matches.\n computer_call: \"generic\",\n tool_search_call: \"tool_search\",\n};\n\nconst PRESENTERS_BY_NAME: Record<string, PresentedToolKind> = {\n exec_command: \"exec\",\n request_human_input: \"ask\",\n run_on: \"run_on\",\n write_stdin: \"write_stdin\",\n apply_patch_call: \"apply_patch\",\n apply_patch: \"apply_patch\",\n web_search_call: \"web_search\",\n tool_search: \"tool_search\",\n search_documents: \"docs_search\",\n knowledge_search: \"docs_search\",\n set_session_title: \"session_title\",\n set_other_session_title: \"session_title\",\n sandboxes_list: \"machine\",\n sandbox_swap: \"machine\",\n computer_open: \"machine\",\n computer_observe: \"machine\",\n computer_act: \"machine\",\n interaction_discover: \"machine\",\n};\n\n/**\n * The phase a call's step name reads in. A call that finished with an error\n * result keeps the ongoing form (\"Sending a message\" · Error), like a failed one.\n */\nexport function callStepPhase(item: ToolCallItem): ToolStepPhase {\n if (item.status === \"complete\" && unwrapMcpOutput(item.output).isError) return \"running\";\n return toolStepPhase(item.status);\n}\n\n/**\n * A row reduced to what a person needs: the plain step, its status and any\n * human-readable result. Commands, arguments, output, diffs and JSON are left\n * out, and a row with nothing human left to show does not expand.\n */\nexport function plainToolRow(\n t: OpenGeniText,\n item: ToolCallItem,\n row: ToolRowPresentation,\n context: Pick<ToolPresentationContext, \"computeLabel\"> = {},\n): ToolRowPresentation {\n const { detailPreview: _detailPreview, titleMono: _titleMono, ...rest } = row;\n const plain: ToolRowPresentation = { ...rest, body: plainBody(row.body) };\n if (row.detailPreview) delete plain.preview;\n if (row.tool === \"exec\" || row.tool === \"write_stdin\") {\n const failed =\n row.iconTone === \"failed\" || row.chip?.tone === \"bad\" || item.status === \"failed\";\n // Plain rows name no files, links or tools taken from the command itself.\n plain.title = toolStepLabel(t, \"runCommand\", failed ? \"running\" : toolStepPhase(item.status));\n if (isConnectedMachineOutcomeUnknownOutput(item.output)) {\n // The call has ended, but its effects remain unknown. Keep that verdict\n // in the chip, with the explanation available without raw command output.\n return {\n ...plain,\n title: toolStepLabel(t, \"runCommand\", \"done\"),\n body: { kind: \"note\", tone: \"error\", text: t(\"toolActionReview.itMayHaveRunCheck\") },\n };\n }\n const computeLabel = context.computeLabel ?? null;\n if (computeLabel) plain.preview = textPreview(computeLabel, row.running);\n else delete plain.preview;\n if (row.chip?.tone === \"bad\") plain.chip = { tone: \"bad\", text: t(\"timeline.chip.failed\") };\n else delete plain.chip;\n } else if (row.tool === \"apply_patch\") {\n delete plain.preview;\n }\n return plain;\n}\n\nfunction plainBody(body: ToolBody): ToolBody {\n switch (body.kind) {\n case \"term\":\n case \"patch\":\n return { kind: \"none\" };\n case \"payloads\":\n return body.note ? { kind: \"note\", text: body.note } : { kind: \"none\" };\n case \"listing\": {\n // Mono entries are wire names (disclosed tools); plain rows keep readable hits only.\n const entries = body.entries.filter((entry) => !entry.mono);\n return entries.length ? { ...body, entries, blocks: [] } : { kind: \"none\" };\n }\n default:\n return body;\n }\n}\n\n/**\n * Resolve the shared presenter for a call with the web registry's precedence\n * (raw.type, exact name, MCP leaf). Tools whose web renderer is richer than the\n * shared model (computer use, media, knowledge receipts, …) resolve to\n * `generic`; non-DOM renderers may layer their own presenters on top.\n */\nexport function presentedToolKind(item: ToolCallItem): PresentedToolKind {\n const rawType = rawTypeOf(item);\n if (rawType && PRESENTERS_BY_RAW_TYPE[rawType]) {\n return PRESENTERS_BY_RAW_TYPE[rawType];\n }\n const exact = PRESENTERS_BY_NAME[item.name];\n if (exact) {\n return exact;\n }\n const leaf = mcpToolLeaf(item.name);\n if (leaf !== item.name && PRESENTERS_BY_NAME[leaf]) {\n return PRESENTERS_BY_NAME[leaf];\n }\n if (leaf.startsWith(\"cua_\")) {\n return \"machine\";\n }\n return \"generic\";\n}\n\n/** Presentations whose collapsed row reads correctly from an output preview. */\nconst PREVIEW_READABLE_KINDS: ReadonlySet<PresentedToolKind> = new Set([\n \"exec\",\n \"write_stdin\",\n \"apply_patch\",\n \"generic\",\n]);\n\n/**\n * Whether the shared presentation of `item` reads correctly while its output\n * is a bounded preview (`item.outputPreview`): long strings keep their head and\n * tail, so an exit code, a tail peek, a patch summary or an error snippet stay\n * right, and the body is shown only after the exact output is read. Every\n * other tool needs its exact output first. True for an exact output.\n */\nexport function presentsToolOutputPreview(item: ToolCallItem): boolean {\n if (!item.outputPreview) return true;\n if (item.outputPreview.shape !== \"structured\") return false;\n const shown = invokedToolCall(item);\n const kind = presentedToolKind(shown);\n if (!PREVIEW_READABLE_KINDS.has(kind)) return false;\n if (kind !== \"generic\") return true;\n // A generic row draws retained images from its result, and parses JSON\n // result text whole (an MCP `content[].text` included) for its error flag:\n // cut JSON would not parse.\n if (hasCutJsonText(shown.output, 0)) return false;\n return retainedToolResultImages(shown.output).images.length === 0;\n}\n\nconst OUTPUT_PREVIEW_OMISSION = / characters omitted from this preview\\]…\\n/u;\n\nfunction hasCutJsonText(value: unknown, depth: number): boolean {\n if (typeof value === \"string\") {\n return /^\\s*[[{]/u.test(value) && OUTPUT_PREVIEW_OMISSION.test(value);\n }\n if (depth >= 4 || value === null || typeof value !== \"object\") return false;\n const children = Array.isArray(value) ? value : Object.values(value);\n return children.some((child) => hasCutJsonText(child, depth + 1));\n}\n\nexport function toolRowPresentation(\n t: OpenGeniText,\n item: ToolCallItem,\n context: ToolPresentationContext = {},\n): ToolRowPresentation {\n item = invokedToolCall(item);\n const row = presentedToolRow(t, item, context);\n const presented = context.details === \"plain\" ? plainToolRow(t, item, row, context) : row;\n const shown = item.awaitingApproval\n ? awaitingApprovalRow(t, presented)\n : item.approvalRejected\n ? rejectedApprovalRow(t, presented, item.approvalRejected === \"automatic\")\n : presented;\n return redactRow(shown, item);\n}\n\n/**\n * A signature, token or key never shows on a row, whichever tool produced it\n * and wherever the text puts it: every string the row shows (title, preview,\n * command, output, payloads) is redacted, including any credential value\n * found anywhere in the call's arguments or output.\n */\nfunction redactRow(row: ToolRowPresentation, item: ToolCallItem): ToolRowPresentation {\n const values = signedValuesDeep([item.arguments, item.output, item.raw, row]);\n return redactDeep(row, values);\n}\n\n/** A call waiting for the person's approval has not run: say so, never \"Done\". */\nfunction awaitingApprovalRow(t: OpenGeniText, row: ToolRowPresentation): ToolRowPresentation {\n return {\n ...row,\n iconTone: \"accent\",\n running: false,\n chip: undefined,\n failed: false,\n cancelled: false,\n detailPreview: false,\n preview: textPreview(t(\"timeline.toolRenderers.waitingForYourApproval\")),\n };\n}\n\n/** A rejected call never ran: say so and by whom, never \"Done\" or \"Interrupted\". */\nfunction rejectedApprovalRow(\n t: OpenGeniText,\n row: ToolRowPresentation,\n automatic: boolean,\n): ToolRowPresentation {\n return {\n ...row,\n iconTone: \"muted\",\n running: false,\n chip: undefined,\n failed: false,\n cancelled: false,\n detailPreview: false,\n preview: textPreview(\n t(\n automatic\n ? \"timeline.toolRenderers.declinedAutomatically\"\n : \"timeline.toolRenderers.youRejectedThis\",\n ),\n ),\n };\n}\n\nfunction presentedToolRow(\n t: OpenGeniText,\n item: ToolCallItem,\n context: ToolPresentationContext,\n): ToolRowPresentation {\n switch (presentedToolKind(item)) {\n case \"exec\":\n return execPresentation(t, item, context);\n case \"write_stdin\":\n return writeStdinPresentation(t, item);\n case \"apply_patch\":\n return applyPatchPresentation(t, item) ?? genericToolPresentation(t, item);\n case \"web_search\":\n return webSearchPresentation(t, item);\n case \"ask\":\n return askPresentation(t, item);\n case \"run_on\":\n return runOnPresentation(t, item);\n case \"tool_search\":\n return toolSearchPresentation(t, item);\n case \"docs_search\":\n return docsSearchPresentation(t, item);\n case \"session_title\":\n return sessionTitlePresentation(t, item);\n case \"machine\":\n return machinePresentation(t, item);\n default:\n return genericToolPresentation(t, item);\n }\n}\n","import { type OpenGeniText } from \"../messages/runtime\";\n/** Decorative loading copy shared by every renderer of the preparing state. */\nexport const GENIE_PREPARING_PHRASES = (t: OpenGeniText): readonly string[] => [\n t(\"timeline.genieCopy.polishingTheLamp\"),\n t(\"timeline.genieCopy.consultingTheCarpet\"),\n t(\"timeline.genieCopy.untanglingWishes\"),\n t(\"timeline.genieCopy.summoningALittleCleverness\"),\n t(\"timeline.genieCopy.checkingTheFinePrintOn\"),\n t(\"timeline.genieCopy.warmingUpTheAbracadabra\"),\n t(\"timeline.genieCopy.rearrangingTheStars\"),\n t(\"timeline.genieCopy.negotiatingWithTheLamp\"),\n t(\"timeline.genieCopy.dustingOffAThousandYears\"),\n t(\"timeline.genieCopy.wishfulThinking\"),\n t(\"timeline.genieCopy.decantingALittleMagic\"),\n t(\"timeline.genieCopy.findingTheGoodStardust\"),\n t(\"timeline.genieCopy.fluffingTheMagicCarpet\"),\n t(\"timeline.genieCopy.puttingAWishIntoMotion\"),\n t(\"timeline.genieCopy.aLittleHocusALittle\"),\n];\nexport const GENIE_WAITING_PHRASES = (t: OpenGeniText): readonly string[] => [\n t(\"timeline.genieCopy.waitingForAResponse\"),\n];\n","// Pure turn-summary model shared by the web and native renderers: facet definitions,\n// the summary context, status types and duration formatting. No DOM, no styling.\nimport type { ReactNode } from \"react\";\nimport type { ActivityItem, ToolCallItem, TurnOutcome } from \"./types\";\nimport type { OpenGeniText } from \"../messages/runtime\";\n\nexport const BUILT_IN_TURN_SUMMARY_FACET_IDS = [\n \"steps\",\n \"files\",\n \"commands\",\n \"screenshots\",\n \"memories\",\n \"compacted\",\n \"duration\",\n] as const;\n\nexport type BuiltInTurnSummaryFacetId = (typeof BUILT_IN_TURN_SUMMARY_FACET_IDS)[number];\n\nexport type TurnSummaryContext = Readonly<{\n /** Every normalized activity item folded into this summary. */\n items: readonly ActivityItem[];\n /** Tool calls from `items`, retained in timeline order for convenient aggregation. */\n toolCalls: readonly ToolCallItem[];\n /** The settled turn verdict, or absent for a neutral/incomplete cluster. */\n outcome: TurnOutcome | undefined;\n /** The bounded failure reason rendered by the enclosing summary, when present. */\n failureText: string | undefined;\n /** Total turn duration when the enclosing group has both valid timestamps. */\n durationMs: number | undefined;\n /** False when any projected activity is still running or streaming. */\n settled: boolean;\n /**\n * Adjacent compaction landmarks next to this fold. Landmark remains the\n * primary UI; this is a secondary chip signal only.\n */\n contextCompactionCount: number;\n /** Text in the host's language, for facets that show words. */\n t: OpenGeniText;\n}>;\n\nexport type TurnSummaryFacetResult = Readonly<{\n icon?: ReactNode;\n content: ReactNode;\n ariaLabel?: string;\n title?: string;\n}>;\n\nexport type TurnSummaryFacet = Readonly<{\n /** Stable identity used for removal and deterministic de-duplication. */\n id: string;\n /** Return null when this facet has nothing useful to show. */\n summarize(context: TurnSummaryContext): TurnSummaryFacetResult | null;\n}>;\n\ntype ModifyTurnSummaryFacets = Readonly<{\n /** Appended after the remaining built-ins, in supplied order. */\n add?: readonly TurnSummaryFacet[];\n /** Built-ins to omit before custom facets are appended. */\n remove?: readonly BuiltInTurnSummaryFacetId[];\n replace?: never;\n}>;\n\ntype ReplaceTurnSummaryFacets = Readonly<{\n /** The complete ordered facet list. Mutually exclusive with add/remove. */\n replace: readonly TurnSummaryFacet[];\n add?: never;\n remove?: never;\n}>;\n\nexport type TurnSummaryFacetConfiguration = ModifyTurnSummaryFacets | ReplaceTurnSummaryFacets;\n\nexport type TurnSummaryOptions = Readonly<{\n /**\n * Readable per-turn presentation. Assistant progress stays fully formatted;\n * each turn has its own Working / Worked row and rolling latest step.\n * Ordinary tip-follow and manual scrolling are unchanged.\n */\n rolling?: boolean;\n facets?: TurnSummaryFacetConfiguration;\n}>;\n\n/**\n * Exchange status shown in place of the plain facet line. `working` and\n * `waiting` run a live clock from `since`; `worked` shows the settled span.\n */\nexport type TurnSummaryStatus = Readonly<{\n kind: \"working\" | \"waiting\" | \"worked\";\n /** Replaces the default \"Working\" / \"Waiting\" wording. */\n label?: string | undefined;\n /** Who the wait is on: `you` when it needs the reader. */\n waitingOn?: \"you\" | undefined;\n /** For a `worked` row folding quiet cycles: how many updates it spans. */\n updates?: number | undefined;\n /** Live clock start for `working` and `waiting`. */\n since?: string | undefined;\n /** Settled span for `worked`. */\n durationMs?: number | undefined;\n /** Live step preview under the row while it is collapsed. */\n preview?: ReactNode;\n /**\n * Guidance under the row that stays visible whether the fold is open or\n * closed, e.g. what a wait needs from the reader.\n */\n guidance?: ReactNode;\n}>;\n\n/** Elapsed wall time with seconds below an hour: \"14s\", \"2m 14s\", \"1h 05m\". */\n/**\n * The label of a turn row with no status line and no facets. Steps are not\n * counted, so the row still names what opening it reveals: \"Preparation\" when\n * it holds only startup phases (and no unloaded steps), else \"Steps\".\n */\nexport function turnSummaryFallbackLabel(\n t: OpenGeniText,\n items: readonly ActivityItem[],\n unloadedSteps = false,\n): string {\n // Progress notes narrate steps; they are not steps themselves.\n const preparationOnly =\n !unloadedSteps &&\n items.some((item) => item.kind === \"startup-phase\") &&\n items.every((item) => item.kind === \"startup-phase\" || item.kind === \"agent-message\");\n return preparationOnly ? t(\"timeline.turnSummary.preparation\") : t(\"timeline.turnSummary.steps\");\n}\n\nexport function formatElapsed(t: OpenGeniText, durationMs: number): string {\n const totalSeconds = Math.max(0, Math.floor(durationMs / 1000));\n if (totalSeconds < 60) {\n return t(\"timeline.turnSummaryModel.seconds\", { count: totalSeconds });\n }\n const totalMinutes = Math.floor(totalSeconds / 60);\n if (totalMinutes < 60) {\n const seconds = totalSeconds % 60;\n return seconds\n ? t(\"timeline.turnSummaryModel.minutesSeconds\", { minutes: totalMinutes, seconds })\n : t(\"timeline.turnSummaryModel.minutes\", { count: totalMinutes });\n }\n return formatHoursOrDays(t, totalMinutes);\n}\n\n/** \"1h 05m\" below a day, \"2d 03h\" from a day on, so long waits stay readable. */\nfunction formatHoursOrDays(t: OpenGeniText, totalMinutes: number): string {\n const totalHours = Math.floor(totalMinutes / 60);\n if (totalHours < 24) {\n return t(\"timeline.turnSummaryModel.hoursMinutes\", {\n hours: totalHours,\n minutes: String(totalMinutes % 60).padStart(2, \"0\"),\n });\n }\n return t(\"timeline.turnSummaryModel.daysHours\", {\n days: Math.floor(totalHours / 24),\n hours: String(totalHours % 24).padStart(2, \"0\"),\n });\n}\n\nexport function createTurnSummaryContext(\n t: OpenGeniText,\n items: ActivityItem[],\n outcome: TurnOutcome | undefined,\n failureText: string | undefined,\n durationMs: number | undefined,\n contextCompactionCount: number,\n): TurnSummaryContext {\n const itemSnapshot = Object.freeze([...items]);\n const toolCalls = Object.freeze(\n itemSnapshot.filter((item): item is ToolCallItem => item.kind === \"tool-call\"),\n );\n const settled = itemSnapshot.every((item) => {\n if (item.kind === \"reasoning\" || item.kind === \"agent-message\") {\n return !item.streaming;\n }\n if (\n item.kind === \"tool-call\" ||\n item.kind === \"worker\" ||\n item.kind === \"sandbox\" ||\n item.kind === \"startup-phase\"\n ) {\n return item.status !== \"running\";\n }\n return true;\n });\n return Object.freeze({\n t,\n items: itemSnapshot,\n toolCalls,\n outcome,\n failureText,\n durationMs,\n settled,\n contextCompactionCount: Math.max(0, Math.floor(contextCompactionCount)),\n });\n}\n\n// Step, file, command and screenshot counts are not shown: conversation-first\n// history does not load a turn's steps until the turn is opened, so a count\n// would cost a read on every open. Their ids remain accepted by `remove`.\nexport const BUILT_IN_TURN_SUMMARY_FACETS: readonly TurnSummaryFacet[] = Object.freeze([\n {\n id: \"memories\",\n summarize: ({ items, t }) => {\n let saved = 0;\n let updated = 0;\n for (const item of items) {\n if (item.kind !== \"memory\") {\n continue;\n }\n if (item.variant === \"corrected\") {\n updated += 1;\n } else {\n saved += 1;\n }\n }\n const parts: string[] = [];\n if (saved) {\n parts.push(t(\"timeline.turnSummaryModel.memoriesSaved\", { count: saved }));\n }\n if (updated) {\n parts.push(t(\"timeline.turnSummaryModel.memoriesUpdated\", { count: updated }));\n }\n return parts.length > 0 ? { content: parts.join(\" · \") } : null;\n },\n },\n {\n id: \"compacted\",\n summarize: ({ contextCompactionCount, t }) =>\n contextCompactionCount > 0\n ? {\n content: t(\"timeline.turnSummaryModel.compacts\", { count: contextCompactionCount }),\n ariaLabel: t(\"timeline.turnSummaryModel.compactions\", {\n count: contextCompactionCount,\n }),\n }\n : null,\n },\n {\n id: \"duration\",\n summarize: ({ durationMs, t }) => {\n const duration = formatDurationFacet(t, durationMs);\n return duration ? { content: duration } : null;\n },\n },\n]);\n\nexport function resolveTurnSummaryFacets(\n configuration: TurnSummaryFacetConfiguration | undefined,\n): readonly TurnSummaryFacet[] {\n const requested: readonly TurnSummaryFacet[] = configuration?.replace ?? [\n ...BUILT_IN_TURN_SUMMARY_FACETS.filter(\n (facet) => !configuration?.remove?.includes(facet.id as BuiltInTurnSummaryFacetId),\n ),\n ...(configuration?.add ?? []),\n ];\n const seen = new Set<string>();\n return requested.filter((facet) => {\n if (!facet.id || seen.has(facet.id)) {\n return false;\n }\n seen.add(facet.id);\n return true;\n });\n}\n\nexport function formatDurationFacet(\n t: OpenGeniText,\n durationMs: number | undefined,\n): string | null {\n if (durationMs === undefined || !Number.isFinite(durationMs) || durationMs < 1000) {\n return null;\n }\n const totalSeconds = Math.floor(durationMs / 1000);\n if (totalSeconds < 60) {\n return t(\"timeline.turnSummaryModel.seconds\", { count: totalSeconds });\n }\n const totalMinutes = Math.floor(totalSeconds / 60);\n if (totalMinutes < 60) {\n return t(\"timeline.turnSummaryModel.minutes\", { count: totalMinutes });\n }\n return formatHoursOrDays(t, totalMinutes);\n}\n\nfunction hasFacetContent(content: ReactNode): boolean {\n return content !== null && content !== undefined && content !== false && content !== \"\";\n}\n\n/**\n * The facets a turn header shows. With a readable status line, duration lives in\n * the status, and a live or waiting status shows no built-in facets. A failing\n * custom facet is skipped rather than breaking the header.\n */\nexport function selectTurnSummaryFacets(\n definitions: readonly TurnSummaryFacet[],\n context: TurnSummaryContext,\n statusKind: TurnSummaryStatus[\"kind\"] | undefined,\n): Array<{ facet: TurnSummaryFacet; result: TurnSummaryFacetResult }> {\n return definitions.flatMap((facet) => {\n if (\n statusKind &&\n (facet.id === \"duration\" ||\n (statusKind !== \"worked\" &&\n BUILT_IN_TURN_SUMMARY_FACET_IDS.includes(facet.id as BuiltInTurnSummaryFacetId)))\n ) {\n return [];\n }\n try {\n const result = facet.summarize(context);\n return result && hasFacetContent(result.content) ? [{ facet, result }] : [];\n } catch {\n return [];\n }\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/timeline/registry.ts","../src/timeline/command-step.ts","../src/timeline/tool-presentation.ts","../src/timeline/genie-copy.ts","../src/timeline/turn-summary-model.ts"],"sourcesContent":["import type { RetainedArtifactReference, VideoArtifactPlaybackSource } from \"@opengeni/sdk\";\nimport type { ComponentType } from \"react\";\nimport { mcpToolLeaf } from \"./tool-display-name\";\nimport type { ToolCallItem } from \"./types\";\n\n/* ----------------------------------------------------------------------------\n Tool renderer registry\n\n The extension point. A `ToolRenderer` is a React component fed one projected\n `ToolCallItem`; the registry resolves which renderer handles a given call,\n keyed on the tool `name` and (secondarily) its provider-native `raw.type`.\n\n Resolution order (most → least specific):\n 1. exact match on `raw.type` (e.g. \"apply_patch_call\", \"computer_call\")\n 2. exact match on the tool `name` (e.g. \"exec_command\", \"web_search_call\")\n 3. allowed leaf match after MCP `__` prefix (e.g. opengeni__environment_set_variable)\n 4. the registry's generic fallback\n\n A consumer extends the defaults without forking by passing overrides to\n `createToolRegistry` — e.g. a custom renderer for their own MCP tool, or a\n replacement for a built-in one. The registry is immutable and fully typed.\n -------------------------------------------------------------------------- */\n\nexport type ToolRendererProps = {\n item: ToolCallItem;\n loadRetainedScreenshot?: RetainedScreenshotLoader | undefined;\n loadRetainedArtifact?: RetainedArtifactLoader | undefined;\n};\n\nexport type RetainedScreenshotLoader = (\n artifact: RetainedArtifactReference,\n signal: AbortSignal,\n) => Promise<Uint8Array | null>;\n\nexport type RetainedArtifactLoader = (\n artifact: RetainedArtifactReference,\n signal: AbortSignal,\n options?: RetainedArtifactLoadOptions,\n) => Promise<Uint8Array | { url: string; expiresAt?: string | undefined } | null>;\n\nexport type RetainedArtifactLoadOptions = {\n /**\n * Ask for a short-lived download URL instead of bytes, for example to build a\n * copyable `curl … | git apply` command. A loader that cannot mint one may\n * still return bytes; callers must handle that.\n */\n prefer?: \"url\" | undefined;\n};\n\n/** Mint an expiring source for native browser playback without loading video bytes in JS. */\nexport type VideoArtifactPlaybackLoader = (\n artifactId: string,\n signal: AbortSignal,\n) => Promise<VideoArtifactPlaybackSource>;\n\nexport type ToolRenderer = ComponentType<ToolRendererProps>;\n\n/** A registry entry: which key it matches and the component that renders it. */\nexport type ToolRegistryEntry =\n | { match: \"rawType\"; type: string; render: ToolRenderer }\n | {\n match: \"name\";\n name: string;\n render: ToolRenderer;\n /** Disable untrusted `<server>__${name}` leaf matching for identity-sensitive renderers. */\n matchPrefixedLeaf?: boolean | undefined;\n };\n\nexport type ToolRegistry = {\n /** Resolve the renderer for a call (never null — falls back to generic). */\n resolve: (item: ToolCallItem) => ToolRenderer;\n /** The generic fallback renderer. */\n fallback: ToolRenderer;\n};\n\nexport type CreateToolRegistryOptions = {\n /**\n * Entries that take precedence over the built-ins. Earlier entries win, so a\n * consumer can shadow a default renderer for the same key.\n */\n entries?: ToolRegistryEntry[] | undefined;\n /** Replace the generic fallback used for unmatched tools. */\n fallback?: ToolRenderer | undefined;\n};\n\n/** The `raw.type` of a projected tool call, when the provider item carries one. */\nexport function rawTypeOf(item: ToolCallItem): string | null {\n const raw = item.raw;\n if (raw && typeof raw === \"object\" && typeof (raw as { type?: unknown }).type === \"string\") {\n return (raw as { type: string }).type;\n }\n return null;\n}\n\n/**\n * Build a tool registry from a set of entries and a fallback. The returned\n * registry resolves in priority order: `raw.type` entries first, then `name`\n * entries, then the fallback. Consumer `entries` are consulted before the\n * built-in `baseEntries`, so they shadow defaults cleanly.\n */\nexport function createToolRegistry(\n baseEntries: ToolRegistryEntry[],\n baseFallback: ToolRenderer,\n options: CreateToolRegistryOptions = {},\n): ToolRegistry {\n const entries = [...(options.entries ?? []), ...baseEntries];\n const fallback = options.fallback ?? baseFallback;\n\n const byRawType = new Map<string, ToolRenderer>();\n const byName = new Map<string, ToolRenderer>();\n const byPrefixedLeaf = new Map<string, ToolRenderer>();\n for (const entry of entries) {\n if (entry.match === \"rawType\") {\n if (!byRawType.has(entry.type)) {\n byRawType.set(entry.type, entry.render);\n }\n } else if (!byName.has(entry.name)) {\n byName.set(entry.name, entry.render);\n }\n if (entry.match === \"name\" && entry.matchPrefixedLeaf !== false) {\n if (!byPrefixedLeaf.has(entry.name)) {\n byPrefixedLeaf.set(entry.name, entry.render);\n }\n }\n }\n\n const resolve = (item: ToolCallItem): ToolRenderer => {\n const rawType = rawTypeOf(item);\n if (rawType) {\n const byType = byRawType.get(rawType);\n if (byType) {\n return byType;\n }\n }\n const exact = byName.get(item.name);\n if (exact) {\n return exact;\n }\n const leaf = mcpToolLeaf(item.name);\n if (leaf !== item.name) {\n const byLeaf = byPrefixedLeaf.get(leaf);\n if (byLeaf) {\n return byLeaf;\n }\n }\n return fallback;\n };\n\n return { resolve, fallback };\n}\n","/**\n * Plain words for a shell command.\n *\n * A command row reads as what the command did (\"Downloaded report.json\",\n * \"Read notes.md\", \"Ran make_chart.py\") instead of the command itself. The\n * command stays one click away in the row's body. This is a best-effort,\n * display-only reading of the command text: anything it can't place falls back\n * to \"Ran a command\", and nothing here runs or changes the command.\n */\n\nimport type { OpenGeniText } from \"../messages/runtime\";\nimport { redactSignedUrls } from \"./credential-redaction\";\nimport { toolDisplayName } from \"./tool-display-name\";\nimport { toolStepLabel, type ToolStepPhase } from \"./tool-steps\";\n\n/* ---- shell reading ---------------------------------------------------------- */\n\ntype Redirect = { op: string; target: string };\ntype SimpleCommand = {\n words: string[];\n redirects: Redirect[];\n heredoc: boolean;\n /** The first command of this command's pipeline (itself when it starts one). */\n pipelineHead: SimpleCommand | null;\n};\n\n// `<<EOF` and `<<-'EOF'`, but not a `<<<` here-string.\nconst HEREDOC = /(?<!<)<<(?!<)-?\\s*(['\"]?)([A-Za-z_][\\w-]*)\\1/g;\n\n/** Drop here-document bodies (inline scripts and file contents) and keep the command lines. */\nfunction stripHeredocBodies(source: string): string {\n const lines = source.split(\"\\n\");\n const kept: string[] = [];\n for (let index = 0; index < lines.length; index++) {\n const line = lines[index]!;\n const delimiters = [...line.matchAll(HEREDOC)].map((match) => match[2]!);\n kept.push(line);\n for (const delimiter of delimiters) {\n while (index + 1 < lines.length && lines[index + 1]!.trim() !== delimiter) index++;\n index++;\n }\n }\n return kept.join(\"\\n\");\n}\n\ntype Token = { word: string } | { op: string };\n\n/** Split shell text into words and operators, honouring quotes and `$(…)`. */\nfunction tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let word = \"\";\n let inWord = false;\n const flush = () => {\n if (inWord) tokens.push({ word });\n word = \"\";\n inWord = false;\n };\n for (let i = 0; i < source.length; i++) {\n const ch = source[i]!;\n if (ch === \"'\") {\n const end = source.indexOf(\"'\", i + 1);\n word += source.slice(i + 1, end < 0 ? undefined : end);\n inWord = true;\n i = end < 0 ? source.length : end;\n } else if (ch === '\"') {\n let j = i + 1;\n while (j < source.length && source[j] !== '\"') {\n if (source[j] === \"\\\\\" && j + 1 < source.length) j++;\n word += source[j];\n j++;\n }\n inWord = true;\n i = j;\n } else if (ch === \"\\\\\") {\n if (source[i + 1] === \"\\n\") i++;\n else {\n word += source[i + 1] ?? \"\";\n inWord = true;\n i++;\n }\n } else if (ch === \"$\" && source[i + 1] === \"(\") {\n let depth = 0;\n let j = i + 1;\n for (; j < source.length; j++) {\n if (source[j] === \"(\") depth++;\n else if (source[j] === \")\" && --depth === 0) break;\n }\n word += source.slice(i, j + 1);\n inWord = true;\n i = j;\n } else if (ch === \"`\") {\n const end = source.indexOf(\"`\", i + 1);\n word += source.slice(i, end < 0 ? undefined : end + 1);\n inWord = true;\n i = end < 0 ? source.length : end;\n } else if (ch === \"#\" && !inWord) {\n while (i + 1 < source.length && source[i + 1] !== \"\\n\") i++;\n } else if (ch === \" \" || ch === \"\\t\") {\n flush();\n } else if (ch === \"\\n\" || ch === \";\" || ch === \"(\" || ch === \")\" || ch === \"{\" || ch === \"}\") {\n if ((ch === \"{\" || ch === \"}\") && inWord) {\n word += ch;\n continue;\n }\n flush();\n tokens.push({ op: \";\" });\n } else if (ch === \"&\" || ch === \"|\") {\n if (ch === \"&\" && source[i + 1] === \">\") {\n flush();\n tokens.push({ op: \">\" });\n i += source[i + 2] === \">\" ? 2 : 1;\n continue;\n }\n flush();\n const double = source[i + 1] === ch;\n tokens.push({ op: double ? \";\" : ch === \"|\" ? \"|\" : \";\" });\n if (double) i++;\n } else if (ch === \">\" || ch === \"<\") {\n // A file descriptor number right before the operator belongs to it (`2>`).\n let fd = \"\";\n if (inWord && /^\\d+$/.test(word)) {\n fd = word;\n word = \"\";\n inWord = false;\n }\n flush();\n let op = fd + ch;\n while (source[i + 1] === \">\" || source[i + 1] === \"<\") op += source[++i];\n if (source[i + 1] === \"&\") {\n // `2>&1`, `>&2`: a descriptor, not a file.\n i++;\n while (i + 1 < source.length && /[\\d-]/.test(source[i + 1]!)) i++;\n continue;\n }\n tokens.push({ op });\n } else {\n word += ch;\n inWord = true;\n }\n }\n flush();\n return tokens;\n}\n\n/** Commands in source order; a command after `|` points at its pipeline's first command. */\nfunction parseCommands(source: string): SimpleCommand[] {\n const text = stripHeredocBodies(source);\n const commands: SimpleCommand[] = [];\n const fresh = (): SimpleCommand => ({\n words: [],\n redirects: [],\n heredoc: false,\n pipelineHead: null,\n });\n let current = fresh();\n let head: SimpleCommand | null = null;\n let pendingRedirect: string | null = null;\n const end = (piped: boolean) => {\n if (current.words.length) {\n current.pipelineHead = head;\n commands.push(current);\n if (piped) head ??= current;\n }\n if (!piped) head = null;\n current = fresh();\n };\n for (const token of tokenize(text)) {\n if (\"op\" in token) {\n if (token.op === \";\") {\n end(false);\n } else if (token.op === \"|\") {\n end(true);\n } else if (token.op.startsWith(\"<<\")) {\n current.heredoc = true;\n pendingRedirect = token.op === \"<<<\" ? \"<<<\" : \"<<\";\n } else {\n pendingRedirect = token.op;\n }\n continue;\n }\n if (pendingRedirect) {\n current.redirects.push({ op: pendingRedirect, target: token.word });\n pendingRedirect = null;\n continue;\n }\n current.words.push(token.word);\n }\n end(false);\n return commands;\n}\n\n/* ---- reading a command ------------------------------------------------------ */\n\ntype NamedStep =\n | \"read\"\n | \"write\"\n | \"edit\"\n | \"list\"\n | \"download\"\n | \"runScript\"\n | \"install\"\n | \"createFolder\"\n | \"createFile\"\n | \"copy\"\n | \"move\"\n | \"delete\"\n | \"unpack\"\n | \"pack\"\n | \"convert\";\n\ntype FixedStep =\n | \"readFile\"\n | \"writeFile\"\n | \"browseFiles\"\n | \"searchFiles\"\n | \"runTests\"\n | \"installPackages\"\n | \"createFolderUnnamed\"\n | \"createFileUnnamed\"\n | \"copyFiles\"\n | \"moveFiles\"\n | \"deleteFiles\"\n | \"unpackFiles\"\n | \"packFiles\"\n | \"convertFile\"\n | \"checkChanges\"\n | \"saveChanges\"\n | \"uploadChanges\"\n | \"getChanges\"\n | \"queryDatabase\"\n | \"useGitHub\"\n | \"runDownloadedCode\"\n | \"reinstallPackages\";\n\ntype Step =\n | { kind: \"named\"; step: NamedStep; name: string | null; weight: number }\n | { kind: \"fixed\"; step: FixedStep; weight: number }\n | { kind: \"readFiles\"; count: number; weight: number }\n | { kind: \"search\"; query: string | null; weight: number }\n | { kind: \"host\"; step: \"fetch\" | \"send\"; host: string; weight: number }\n | { kind: \"code\"; language: string; weight: number }\n | { kind: \"tool\"; name: string; weight: number }\n | { kind: \"toolStep\"; step: \"findTools\" | \"checkProgress\" | \"wait\"; weight: number }\n /** A risky step with nothing safe to name (data sent to an unknown address): \"Ran a command\". */\n | { kind: \"opaque\"; weight: number };\n\n/** What a step says when its file has no name worth showing; null falls back to \"Ran a command\". */\nconst UNNAMED: Record<NamedStep, FixedStep | \"editFile\" | \"download\" | null> = {\n read: \"readFile\",\n write: \"writeFile\",\n edit: \"editFile\",\n list: \"browseFiles\",\n download: \"download\",\n runScript: null,\n install: \"installPackages\",\n createFolder: \"createFolderUnnamed\",\n createFile: \"createFileUnnamed\",\n copy: \"copyFiles\",\n move: \"moveFiles\",\n delete: \"deleteFiles\",\n unpack: \"unpackFiles\",\n pack: \"packFiles\",\n convert: \"convertFile\",\n};\n\n/**\n * Every step id a title is built from (`timeline.commandStep.<id>.<phase>`),\n * so the message catalog can check each one still has a use.\n */\nexport const COMMAND_STEP_IDS: ReadonlyArray<\n NamedStep | FixedStep | \"readFiles\" | \"search\" | \"searchFiles\" | \"fetch\" | \"send\" | \"runCode\"\n> = [\n ...(Object.keys(UNNAMED) as NamedStep[]),\n ...(Object.values(UNNAMED).filter(\n (step): step is FixedStep => step !== null && step !== \"editFile\" && step !== \"download\",\n ) as FixedStep[]),\n \"runTests\",\n \"checkChanges\",\n \"saveChanges\",\n \"uploadChanges\",\n \"getChanges\",\n \"queryDatabase\",\n \"useGitHub\",\n \"runDownloadedCode\",\n \"reinstallPackages\",\n \"readFiles\",\n \"search\",\n \"searchFiles\",\n \"fetch\",\n \"send\",\n \"runCode\",\n];\n\n/** Shell plumbing that never describes the work. */\nconst TRIVIAL = new Set([\n \"cd\",\n \"pushd\",\n \"popd\",\n \"export\",\n \"set\",\n \"unset\",\n \"source\",\n \".\",\n \"true\",\n \"false\",\n \":\",\n \"shopt\",\n \"trap\",\n \"alias\",\n \"umask\",\n \"ulimit\",\n \"echo\",\n \"printf\",\n \"if\",\n \"then\",\n \"else\",\n \"elif\",\n \"fi\",\n \"for\",\n \"while\",\n \"until\",\n \"do\",\n \"done\",\n \"case\",\n \"esac\",\n \"in\",\n \"[\",\n \"[[\",\n \"test\",\n \"exit\",\n \"return\",\n \"wait\",\n \"read\",\n \"local\",\n \"declare\",\n \"clear\",\n \"pwd\",\n \"date\",\n \"whoami\",\n \"which\",\n \"type\",\n \"command\",\n]);\n\nconst READERS = new Set([\n \"cat\",\n \"head\",\n \"tail\",\n \"less\",\n \"more\",\n \"nl\",\n \"bat\",\n \"wc\",\n \"pdftotext\",\n \"pdfinfo\",\n \"strings\",\n \"xxd\",\n \"hexdump\",\n \"file\",\n \"stat\",\n \"md5sum\",\n \"sha256sum\",\n \"column\",\n \"sort\",\n \"uniq\",\n \"cut\",\n \"jq\",\n \"yq\",\n \"csvlook\",\n \"exiftool\",\n]);\n\nconst LISTERS = new Set([\"ls\", \"find\", \"tree\", \"du\", \"fd\", \"fdfind\", \"exa\", \"eza\"]);\nconst SEARCHERS = new Set([\"grep\", \"egrep\", \"fgrep\", \"rg\", \"ag\", \"ack\"]);\nconst INTERPRETERS: Record<string, string> = {\n python: \"Python\",\n python3: \"Python\",\n node: \"JavaScript\",\n deno: \"JavaScript\",\n bun: \"JavaScript\",\n tsx: \"TypeScript\",\n \"ts-node\": \"TypeScript\",\n ruby: \"Ruby\",\n perl: \"Perl\",\n php: \"PHP\",\n Rscript: \"R\",\n bash: \"shell\",\n sh: \"shell\",\n zsh: \"shell\",\n};\nconst PACKAGE_MANAGERS = new Set([\n \"pip\",\n \"pip3\",\n \"npm\",\n \"yarn\",\n \"pnpm\",\n \"bun\",\n \"apt\",\n \"apt-get\",\n \"brew\",\n \"uv\",\n \"cargo\",\n \"gem\",\n \"conda\",\n \"go\",\n]);\nconst CONVERTERS = new Set([\n \"pandoc\",\n \"soffice\",\n \"libreoffice\",\n \"convert\",\n \"magick\",\n \"ffmpeg\",\n \"pdftoppm\",\n \"pdftocairo\",\n \"qpdf\",\n \"gs\",\n \"rsvg-convert\",\n \"inkscape\",\n \"wkhtmltopdf\",\n]);\nconst DATABASES = new Set([\"psql\", \"sqlite3\", \"mysql\", \"duckdb\", \"clickhouse-client\"]);\nconst TEST_RUNNERS = new Set([\"pytest\", \"jest\", \"vitest\", \"mocha\"]);\n\n/*\n * A title never makes a deletion or running downloaded code look harmless:\n * those steps outweigh everything else a command does, so the title names them.\n */\nconst DOWNLOADED_CODE_WEIGHT = 100;\n/** Sending data somewhere (`curl -d @- …`) outweighs whatever produced the data. */\nconst SEND_WEIGHT = 60;\nconst DELETE_WEIGHT = 50;\n/** Clearing a dependency or cache folder that a tool rebuilds is routine, not the headline. */\nconst REGENERABLE_DELETE_WEIGHT = 0.8;\nconst DOWNLOADERS = new Set([\"curl\", \"wget\", \"aria2c\", \"fetch\", \"http\", \"https\", \"xh\"]);\nconst DELETERS = new Set([\"rm\", \"rmdir\", \"unlink\", \"trash\", \"shred\", \"srm\"]);\nconst REGENERABLE_FOLDERS = new Set([\n \"node_modules\",\n \".venv\",\n \"venv\",\n \"__pycache__\",\n \".pytest_cache\",\n \".mypy_cache\",\n \".ruff_cache\",\n \".next\",\n \".turbo\",\n \".parcel-cache\",\n]);\nconst INSTALL_VALUE_FLAGS = new Set([\n \"-r\",\n \"--requirement\",\n \"-c\",\n \"--constraint\",\n \"-e\",\n \"--editable\",\n \"-i\",\n \"--index-url\",\n \"--extra-index-url\",\n \"-t\",\n \"--target\",\n \"--prefix\",\n \"-f\",\n \"--find-links\",\n]);\n/** `bash <(curl …)`, `sh -c \"$(wget …)\"`, `eval \"$(curl …)\"`, `source <(curl …)`. */\nconst RUNS_DOWNLOAD_INLINE =\n /(?:^|[\\s;&|(])(?:(?:ba|z|k|da)?sh|python3?|node|perl|ruby|php|eval|source|\\.)\\s+(?:-\\S+\\s+)*[\"']?(?:<\\(|\\$\\(|`)\\s*(?:\\S*\\/)?(?:curl|wget|aria2c|xh)\\b/;\n\nfunction basename(path: string): string {\n const trimmed = path.replace(/\\/+$/, \"\");\n return trimmed.slice(trimmed.lastIndexOf(\"/\") + 1);\n}\n\n/** A file or folder name worth showing, or null for globs, variables and option-like text. */\nfunction displayName(path: string | undefined): string | null {\n if (!path) return null;\n const name = basename(redactSignedUrls(path).replace(/\\?.*$/, \"\"));\n if (!name || name === \".\" || name === \"..\" || name === \"-\" || name.startsWith(\"-\")) return null;\n if (/[$*?`{}[\\]<>|]/.test(name) || /^\\d+$/.test(name)) return null;\n return name.length > 48 ? `${name.slice(0, 47)}…` : name;\n}\n\nfunction hostOf(url: string): string | null {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\" ? parsed.hostname : null;\n } catch {\n return null;\n }\n}\n\nfunction pathOf(url: string): string | undefined {\n try {\n return new URL(url).pathname;\n } catch {\n return undefined;\n }\n}\n\nfunction operands(words: readonly string[], valueFlags: ReadonlySet<string> = new Set()): string[] {\n const out: string[] = [];\n for (let i = 1; i < words.length; i++) {\n const word = words[i]!;\n if (word === \"--\") {\n out.push(...words.slice(i + 1));\n break;\n }\n if (word.startsWith(\"-\") && word.length > 1) {\n if (valueFlags.has(word)) i++;\n continue;\n }\n out.push(word);\n }\n return out;\n}\n\nfunction flagValue(words: readonly string[], flags: readonly string[]): string | undefined {\n for (let i = 1; i < words.length; i++) {\n const word = words[i]!;\n for (const flag of flags) {\n if (word === flag) return words[i + 1];\n if (flag.startsWith(\"--\") && word.startsWith(`${flag}=`)) return word.slice(flag.length + 1);\n }\n }\n return undefined;\n}\n\n/* ---- downloaders ------------------------------------------------------------- */\n\n/** Short options that take a value, so `-sSLo out.json` and `-qO-` read their value right. */\nconst CURL_VALUE_LETTERS = new Set(\"dFTXHuoAebcmrwxKEDUYyzCPQt\");\nconst WGET_VALUE_LETTERS = new Set(\"OoaPtTwUeilARDIXQB\");\nconst LONG_VALUE_OPTIONS = new Set([\n \"--output\",\n \"--out\",\n \"--output-document\",\n \"--output-file\",\n \"--data\",\n \"--data-raw\",\n \"--data-binary\",\n \"--data-ascii\",\n \"--data-urlencode\",\n \"--json\",\n \"--form\",\n \"--form-string\",\n \"--upload-file\",\n \"--request\",\n \"--method\",\n \"--header\",\n \"--user\",\n \"--password\",\n \"--user-agent\",\n \"--referer\",\n \"--cookie\",\n \"--cookie-jar\",\n \"--config\",\n \"--cert\",\n \"--key\",\n \"--max-time\",\n \"--connect-timeout\",\n \"--retry\",\n \"--post-data\",\n \"--post-file\",\n \"--body-data\",\n \"--body-file\",\n \"--directory-prefix\",\n \"--tries\",\n \"--timeout\",\n]);\nconst SEND_OPTIONS = [\n \"-d\",\n \"--data\",\n \"--data-raw\",\n \"--data-binary\",\n \"--data-ascii\",\n \"--data-urlencode\",\n \"--json\",\n \"-F\",\n \"--form\",\n \"--form-string\",\n \"-T\",\n \"--upload-file\",\n \"--post-data\",\n \"--post-file\",\n \"--body-data\",\n \"--body-file\",\n];\nconst SENDING_METHODS = /^(?:POST|PUT|PATCH|DELETE)$/i;\n\ntype DownloaderCall = {\n url: string | undefined;\n /** Where the body is saved: a file, `-` for standard output, or undefined when not set. */\n file: string | undefined;\n /** Saved under the link's own file name (`curl -O`, wget's default). */\n remoteName: boolean;\n /** Uploads or posts data. */\n sends: boolean;\n};\n\nfunction readDownloader(program: string, words: readonly string[]): DownloaderCall {\n const valueLetters = program === \"wget\" ? WGET_VALUE_LETTERS : CURL_VALUE_LETTERS;\n const options = new Map<string, string | true>();\n let url: string | undefined;\n for (let i = 1; i < words.length; i++) {\n const word = words[i]!;\n if (word === \"--\") {\n url ??= words.slice(i + 1).find((rest) => /^https?:\\/\\//i.test(rest));\n break;\n }\n if (word.startsWith(\"--\")) {\n const equals = word.indexOf(\"=\");\n if (equals > 0) options.set(word.slice(0, equals), word.slice(equals + 1));\n else if (LONG_VALUE_OPTIONS.has(word)) options.set(word, words[++i] ?? \"\");\n else options.set(word, true);\n continue;\n }\n if (/^-[A-Za-z]/.test(word)) {\n for (let j = 1; j < word.length; j++) {\n const letter = word[j]!;\n if (valueLetters.has(letter)) {\n options.set(`-${letter}`, j + 1 < word.length ? word.slice(j + 1) : (words[++i] ?? \"\"));\n break;\n }\n options.set(`-${letter}`, true);\n }\n continue;\n }\n if (!url && /^https?:\\/\\//i.test(word)) url = word;\n }\n const text = (name: string) => {\n const value = options.get(name);\n return typeof value === \"string\" ? value : undefined;\n };\n const method = text(\"-X\") ?? text(\"--request\") ?? text(\"--method\") ?? \"\";\n const sends = SEND_OPTIONS.some((name) => options.has(name)) || SENDING_METHODS.test(method);\n if (program === \"wget\") {\n const file = text(\"-O\") ?? text(\"--output-document\");\n return { url, file, remoteName: file === undefined, sends };\n }\n if (program === \"aria2c\") {\n const file = text(\"-o\") ?? text(\"--out\");\n return { url, file, remoteName: file === undefined, sends };\n }\n return {\n url,\n file: text(\"-o\") ?? text(\"--output\"),\n remoteName:\n options.has(\"-O\") || options.has(\"--remote-name\") || options.has(\"--remote-name-all\"),\n sends,\n };\n}\n\n/** The program a command runs, after wrappers such as `sudo` and `timeout`. */\nfunction programOf(command: SimpleCommand | null): string {\n return command ? basename(unwrap(command.words)[0] ?? \"\") : \"\";\n}\n\n/** Names of the files a command runs as a program: `./setup.sh`, `bash setup.sh`, `source env.sh`. */\nfunction filesRun(command: SimpleCommand): string[] {\n const words = unwrap(command.words);\n const first = words[0];\n if (!first) return [];\n if (/^\\.{0,2}\\//.test(first)) return [basename(first)];\n const program = basename(first);\n if (!INTERPRETERS[program] && program !== \"source\" && program !== \".\") return [];\n const script = operands(\n words,\n new Set([\"-W\", \"-X\", \"-r\", \"--require\", \"--import\", \"--loader\"]),\n )[0];\n return script ? [basename(script)] : [];\n}\n\nconst WRAPPERS = new Set([\"sudo\", \"time\", \"nice\", \"nohup\", \"exec\", \"stdbuf\", \"caffeinate\"]);\n\n/** Drop variable assignments and wrappers (`sudo`, `timeout 30`, `npx`) in front of the program. */\nfunction unwrap(words: readonly string[]): string[] {\n let rest = [...words];\n for (let guard = 0; guard < 8 && rest.length; guard++) {\n const first = rest[0]!;\n if (/^[A-Za-z_][A-Za-z0-9_]*=/.test(first)) rest = rest.slice(1);\n else if (WRAPPERS.has(first)) {\n rest = rest.slice(1);\n while (rest[0]?.startsWith(\"-\")) rest = rest.slice(1);\n } else if (first === \"env\") {\n rest = rest.slice(1);\n while (rest[0] && (rest[0].startsWith(\"-\") || rest[0].includes(\"=\"))) rest = rest.slice(1);\n } else if (first === \"timeout\") {\n rest = rest.slice(1);\n while (rest[0]?.startsWith(\"-\")) rest = rest.slice(1);\n rest = rest.slice(1);\n } else if (\n first === \"npx\" ||\n first === \"bunx\" ||\n first === \"pnpx\" ||\n (first === \"bun\" && rest[1] === \"x\")\n ) {\n rest = rest.slice(first === \"bun\" ? 2 : 1);\n while (rest[0]?.startsWith(\"-\"))\n rest = rest.slice(rest[0] === \"-p\" || rest[0] === \"--package\" ? 2 : 1);\n } else if ((first === \"uv\" || first === \"poetry\" || first === \"pipenv\") && rest[1] === \"run\") {\n rest = rest.slice(2);\n } else break;\n }\n return rest;\n}\n\nfunction classify(command: SimpleCommand, depth: number): Step | null {\n const words = unwrap(command.words);\n if (!words.length) return null;\n const program = basename(words[0]!);\n const sub = words[1];\n // Standard output written to a file (`> out.txt`); error streams and /dev/null don't count.\n const output = command.redirects.find(\n (r) => (r.op === \">\" || r.op === \">>\" || r.op === \"1>\") && r.target !== \"/dev/null\",\n )?.target;\n const named = (step: NamedStep, path: string | undefined, weight: number): Step => ({\n kind: \"named\",\n step,\n name: displayName(path),\n weight,\n });\n const fixed = (step: FixedStep, weight: number): Step => ({ kind: \"fixed\", step, weight });\n\n // Opengeni's tool client: `ogtool call <tool>` reads as that tool.\n const toolArgs =\n program === \"ogtool\"\n ? words.slice(1)\n : words[1] === \"codemode\" && /OPENGENI|ogtool/i.test(words[0]!)\n ? words.slice(2)\n : null;\n if (toolArgs) {\n const [verb, tool] = toolArgs;\n if (verb === \"call\" && tool) return { kind: \"tool\", name: tool, weight: 5 };\n if (verb === \"list\" || verb === \"show\" || verb === \"declarations\") {\n return { kind: \"toolStep\", step: \"findTools\", weight: 2 };\n }\n if (verb === \"read\") return { kind: \"toolStep\", step: \"checkProgress\", weight: 2 };\n return null;\n }\n\n if (DELETERS.has(program)) {\n const paths = operands(words);\n if (paths.length && paths.every((path) => REGENERABLE_FOLDERS.has(basename(path)))) {\n return paths.length === 1\n ? named(\"delete\", paths[0], REGENERABLE_DELETE_WEIGHT)\n : fixed(\"deleteFiles\", REGENERABLE_DELETE_WEIGHT);\n }\n return paths.length === 1\n ? named(\"delete\", paths[0], DELETE_WEIGHT)\n : fixed(\"deleteFiles\", DELETE_WEIGHT);\n }\n if (program === \"find\") {\n const exec = words.findIndex((word) => /^-(?:exec|execdir|ok|okdir)$/.test(word));\n if (\n words.includes(\"-delete\") ||\n (exec >= 0 && DELETERS.has(basename(unwrap(words.slice(exec + 1))[0] ?? \"\")))\n ) {\n return fixed(\"deleteFiles\", DELETE_WEIGHT);\n }\n }\n if (program === \"xargs\" || program === \"parallel\") {\n const rest = words.slice(1);\n while (rest[0]?.startsWith(\"-\")) rest.shift();\n if (DELETERS.has(basename(unwrap(rest)[0] ?? \"\"))) return fixed(\"deleteFiles\", DELETE_WEIGHT);\n return null;\n }\n if (program === \"git\" && (sub === \"clean\" || sub === \"rm\")) {\n return fixed(\"deleteFiles\", DELETE_WEIGHT);\n }\n\n if (TRIVIAL.has(program)) {\n return (program === \"echo\" || program === \"printf\") && output\n ? named(\"write\", output, 2)\n : null;\n }\n if (program === \"sleep\") return { kind: \"toolStep\", step: \"wait\", weight: 0.5 };\n\n if (program === \"curl\" || program === \"wget\" || program === \"aria2c\") {\n const call = readDownloader(program, words);\n const host = call.url ? hostOf(call.url) : null;\n // Sending data leads the title; with no address worth naming it is just \"Ran a command\".\n if (call.sends) {\n return host\n ? { kind: \"host\", step: \"send\", host, weight: SEND_WEIGHT }\n : { kind: \"opaque\", weight: SEND_WEIGHT };\n }\n const file = call.file ?? output;\n if (file && file !== \"-\" && file !== \"/dev/null\") return named(\"download\", file, 4);\n const remoteName = call.url && call.remoteName && file !== \"-\" ? pathOf(call.url) : undefined;\n if (remoteName && displayName(remoteName)) return named(\"download\", remoteName, 4);\n return host ? { kind: \"host\", step: \"fetch\", host, weight: 4 } : null;\n }\n\n if (program === \"cat\") {\n if (output) return named(\"write\", output, 3);\n const files = operands(words);\n if (!files.length) return null;\n return files.length > 1\n ? { kind: \"readFiles\", count: files.length, weight: 2 }\n : named(\"read\", files[0], 2);\n }\n if (program === \"tee\") return named(\"write\", operands(words)[0], 3);\n if (program === \"sed\" || program === \"awk\" || (program === \"perl\" && words.includes(\"-pi\"))) {\n const inPlace = words.some((word) => /^-i/.test(word) || word === \"-pi\");\n const files = operands(words, new Set([\"-e\", \"-f\"]));\n const file = files.length > 1 ? files[files.length - 1] : undefined;\n if (inPlace) return named(\"edit\", file, 3);\n return file ? named(\"read\", file, 2) : null;\n }\n if (READERS.has(program)) {\n const files = operands(\n words,\n new Set([\"-n\", \"-c\", \"--lines\", \"--bytes\", \"-d\", \"-f\", \"-k\", \"-t\"]),\n );\n const inputs = program === \"jq\" || program === \"yq\" ? files.slice(1) : files;\n if (!inputs.length) return null;\n return inputs.length > 1\n ? { kind: \"readFiles\", count: inputs.length, weight: 2 }\n : named(\"read\", inputs[0], 2);\n }\n if (LISTERS.has(program)) {\n const target = operands(\n words,\n new Set([\n \"-name\",\n \"-iname\",\n \"-type\",\n \"-maxdepth\",\n \"-mindepth\",\n \"-path\",\n \"-newer\",\n \"-size\",\n \"-mtime\",\n \"-L\",\n \"-d\",\n \"--max-depth\",\n ]),\n )[0];\n return target && target !== \".\" ? named(\"list\", target, 1) : fixed(\"browseFiles\", 1);\n }\n if (SEARCHERS.has(program) || (program === \"git\" && sub === \"grep\")) {\n if (program === \"rg\" && words.includes(\"--files\")) return fixed(\"browseFiles\", 1);\n const args = operands(\n program === \"git\" ? words.slice(1) : words,\n new Set([\n \"-e\",\n \"-g\",\n \"--glob\",\n \"-t\",\n \"--type\",\n \"-A\",\n \"-B\",\n \"-C\",\n \"-m\",\n \"--max-count\",\n \"--include\",\n \"--exclude\",\n ]),\n );\n const pattern = flagValue(words, [\"-e\"]) ?? args[0];\n const plain = pattern && /^[\\p{L}\\p{N} '’.,:@_-]{2,40}$/u.test(pattern) ? pattern : null;\n return { kind: \"search\", query: plain, weight: 2 };\n }\n if (program === \"mkdir\") {\n const dirs = operands(words, new Set([\"-m\"]));\n return dirs.length === 1 ? named(\"createFolder\", dirs[0], 1) : fixed(\"createFolderUnnamed\", 1);\n }\n if (program === \"touch\") {\n const files = operands(words);\n return files.length === 1 ? named(\"createFile\", files[0], 1) : fixed(\"createFileUnnamed\", 1);\n }\n if (program === \"cp\" || program === \"mv\" || program === \"rsync\" || program === \"ln\") {\n const paths = operands(words, new Set([\"-t\", \"--target-directory\", \"-e\"]));\n const step = program === \"mv\" ? \"move\" : \"copy\";\n if (program === \"ln\") return null;\n return paths.length === 2\n ? named(step, paths[0], 1.5)\n : fixed(step === \"move\" ? \"moveFiles\" : \"copyFiles\", 1.5);\n }\n if (program === \"unzip\" || program === \"gunzip\" || program === \"bunzip2\" || program === \"unxz\") {\n return named(\"unpack\", operands(words, new Set([\"-d\"]))[0], 2);\n }\n if (program === \"zip\") return named(\"pack\", operands(words)[0], 2);\n if (program === \"tar\" || program === \"7z\") {\n const flags = words.slice(1).join(\" \");\n const archive =\n flagValue(words, [\"-f\", \"--file\"]) ??\n words.slice(1).find((word) => /\\.(?:tar|tgz|gz|bz2|xz|zst|zip|7z)$/i.test(word));\n if (program === \"7z\" ? sub === \"x\" || sub === \"e\" : /(?:^|\\s)-?[a-z]*x/.test(flags)) {\n return named(\"unpack\", archive, 2);\n }\n return named(\"pack\", archive, 2);\n }\n if (CONVERTERS.has(program)) {\n const input =\n program === \"ffmpeg\"\n ? flagValue(words, [\"-i\"])\n : operands(\n words,\n new Set([\n \"-o\",\n \"--output\",\n \"--outdir\",\n \"--convert-to\",\n \"-t\",\n \"-f\",\n \"--from\",\n \"--to\",\n \"-density\",\n \"-resize\",\n \"-quality\",\n \"-r\",\n ]),\n )[0];\n return input ? named(\"convert\", input, 3) : fixed(\"convertFile\", 3);\n }\n if (DATABASES.has(program)) return fixed(\"queryDatabase\", 3);\n if (program === \"gh\") return fixed(\"useGitHub\", 2);\n if (program === \"git\") {\n switch (sub) {\n case \"status\":\n case \"diff\":\n case \"log\":\n case \"show\":\n case \"blame\":\n return fixed(\"checkChanges\", 1);\n case \"commit\":\n return fixed(\"saveChanges\", 2);\n case \"push\":\n return fixed(\"uploadChanges\", 2);\n case \"pull\":\n case \"fetch\":\n return fixed(\"getChanges\", 2);\n case \"clone\": {\n const repo = operands(words.slice(1), new Set([\"-b\", \"--branch\", \"--depth\", \"-o\"]))[0];\n return named(\"download\", repo?.replace(/\\.git$/, \"\"), 3);\n }\n default:\n return null;\n }\n }\n if (\n TEST_RUNNERS.has(program) ||\n ((program === \"bun\" ||\n program === \"npm\" ||\n program === \"yarn\" ||\n program === \"pnpm\" ||\n program === \"go\" ||\n program === \"cargo\") &&\n sub === \"test\")\n ) {\n return fixed(\"runTests\", 3);\n }\n if (PACKAGE_MANAGERS.has(program)) {\n const installVerb = program === \"uv\" && sub === \"pip\" ? words[2] : sub;\n if (installVerb === \"ci\" || (program === \"uv\" && installVerb === \"sync\")) {\n return fixed(\"installPackages\", 3);\n }\n if (installVerb === \"install\" || installVerb === \"add\" || installVerb === \"i\") {\n const packages = operands(\n program === \"uv\" && sub === \"pip\" ? words.slice(2) : words.slice(1),\n INSTALL_VALUE_FLAGS,\n ).filter((word) => !/^(?:-|install$|add$|i$)/.test(word));\n return packages.length === 1 ? named(\"install\", packages[0], 3) : fixed(\"installPackages\", 3);\n }\n if (\n (program === \"npm\" || program === \"yarn\" || program === \"pnpm\" || program === \"bun\") &&\n sub === \"run\" &&\n words[2]\n ) {\n return named(\"runScript\", words[2], 3);\n }\n }\n if (program === \"pip\" || program === \"pip3\") return null;\n\n const language = INTERPRETERS[program];\n if (language) {\n if (language === \"shell\") {\n const inline = flagValue(words, [\"-c\", \"-lc\", \"-ic\", \"-xc\", \"-ec\"]);\n if (inline && depth < 2) return pick(parseCommands(inline), depth + 1);\n }\n if (program === \"python\" || program === \"python3\") {\n const module = flagValue(words, [\"-m\"]);\n if (module === \"pytest\" || module === \"unittest\") return fixed(\"runTests\", 3);\n if (module === \"pip\") {\n return classify(\n { ...command, words: [\"pip\", ...words.slice(words.indexOf(\"-m\") + 2)] },\n depth,\n );\n }\n if (module) return named(\"runScript\", module, 3);\n }\n if (program === \"bun\" && sub && !/\\.(?:[cm]?[jt]sx?)$/.test(sub)) return null;\n const script = operands(\n words,\n new Set([\"-W\", \"-X\", \"-r\", \"--require\", \"--import\", \"--loader\"]),\n )[0];\n if (script && script !== \"-\" && /\\.[A-Za-z0-9]+$/.test(script))\n return named(\"runScript\", script, 3);\n const display =\n program === \"bun\" || program === \"deno\" || program === \"node\" ? \"JavaScript\" : language;\n if (command.heredoc || words.some((word) => /^-[ce]$/.test(word) || word === \"-\")) {\n return { kind: \"code\", language: display, weight: 3 };\n }\n return null;\n }\n if (/^\\.{0,2}\\/[\\w./-]+$/.test(words[0]!)) return named(\"runScript\", words[0], 3);\n return null;\n}\n\n/**\n * A command later in a pipeline only matters to the title when it deletes\n * (`… | xargs rm`), sends data (`cat .env | curl -d @- …`), runs what flows\n * into it as a program (`curl … | sh`) or saves a download (`curl … | tee a.json`).\n */\nfunction classifyPiped(command: SimpleCommand, depth: number): Step | null {\n const words = unwrap(command.words);\n const program = basename(words[0] ?? \"\");\n const language = INTERPRETERS[program];\n const headProgram = programOf(command.pipelineHead);\n if (language) {\n // `python3 -c '…'` and `bash -lc '…'` run their own code and only read the piped text.\n // (`bash -e` only stops on errors: it still runs the piped text.)\n const inlineFlag =\n language === \"shell\" || language === \"Python\" ? /^-[a-z]*c$/ : /^-(?:e|p|-eval|-print)$/;\n const inline = words.some((word) => inlineFlag.test(word));\n const script = operands(words).find((word) => /\\.[A-Za-z0-9]+$/.test(word));\n if (inline || script) return null;\n if (DOWNLOADERS.has(headProgram)) {\n return { kind: \"fixed\", step: \"runDownloadedCode\", weight: DOWNLOADED_CODE_WEIGHT };\n }\n const display =\n program === \"bun\" || program === \"deno\" || program === \"node\" ? \"JavaScript\" : language;\n return { kind: \"code\", language: display, weight: 3.5 };\n }\n const step = classify(command, depth);\n if (step && step.weight >= DELETE_WEIGHT) return step;\n if (DOWNLOADERS.has(headProgram)) {\n // A download saved further down the pipe: `curl … | tee a.json`, `curl … | jq . > a.json`.\n const saved =\n program === \"tee\"\n ? operands(words, new Set([\"-p\"]))[0]\n : command.redirects.find(\n (r) => (r.op === \">\" || r.op === \">>\" || r.op === \"1>\") && r.target !== \"/dev/null\",\n )?.target;\n if (saved && displayName(saved)) {\n return { kind: \"named\", step: \"download\", name: displayName(saved), weight: 4.5 };\n }\n }\n return null;\n}\n\nfunction isDeletion(step: Step): boolean {\n return (\n (step.kind === \"named\" && step.step === \"delete\") ||\n (step.kind === \"fixed\" && step.step === \"deleteFiles\")\n );\n}\n\nfunction pick(commands: readonly SimpleCommand[], depth: number): Step | null {\n let best: Step | null = null;\n const reads = new Set<string>();\n let readCount = 0;\n const deletions = new Set<string>();\n let regenerableDeletion = false;\n /** Files fetched by a downloader so far: running one later runs downloaded code. */\n const downloaded = new Set<string>();\n for (const command of commands) {\n let step = command.pipelineHead ? classifyPiped(command, depth) : classify(command, depth);\n if (downloaded.size && filesRun(command).some((name) => downloaded.has(name))) {\n step = { kind: \"fixed\", step: \"runDownloadedCode\", weight: DOWNLOADED_CODE_WEIGHT };\n }\n if (!step) continue;\n if (\n step.kind === \"named\" &&\n step.step === \"download\" &&\n step.name &&\n DOWNLOADERS.has(programOf(command.pipelineHead ?? command))\n ) {\n downloaded.add(step.name);\n }\n if (step.kind === \"named\" && step.step === \"read\" && step.name) {\n reads.add(step.name);\n readCount++;\n }\n if (step.kind === \"readFiles\") readCount += step.count;\n const deletes = isDeletion(step);\n if (deletes && step.weight < DELETE_WEIGHT) regenerableDeletion = true;\n else if (deletes) {\n // Several deletions read as \"Deleted files\", never as just the first one.\n deletions.add((step.kind === \"named\" && step.name) || `#${deletions.size}`);\n }\n if (!best || step.weight > best.weight) best = step;\n }\n if (!best) return null;\n if (isDeletion(best) && best.weight >= DELETE_WEIGHT && deletions.size > 1) {\n return { kind: \"fixed\", step: \"deleteFiles\", weight: best.weight };\n }\n const installs =\n (best.kind === \"named\" && best.step === \"install\") ||\n (best.kind === \"fixed\" && best.step === \"installPackages\");\n if (installs && regenerableDeletion) {\n return { kind: \"fixed\", step: \"reinstallPackages\", weight: best.weight };\n }\n if (\n (best.kind === \"named\" && best.step === \"read\" && reads.size > 1) ||\n (best.kind === \"readFiles\" && readCount > best.count)\n ) {\n return { kind: \"readFiles\", count: Math.max(reads.size, readCount), weight: best.weight };\n }\n return best;\n}\n\n/**\n * What a shell command did, in plain words and in the given phase (\"Downloading\n * report.json\" while it runs, \"Downloaded report.json\" once done), or null when\n * the command can't be placed; callers then say \"Ran a command\".\n */\nexport function commandStepTitle(\n t: OpenGeniText,\n command: string,\n phase: ToolStepPhase,\n): string | null {\n if (!command.trim()) return null;\n if (RUNS_DOWNLOAD_INLINE.test(command))\n return t(`timeline.commandStep.runDownloadedCode.${phase}`);\n const step = pick(parseCommands(command), 0);\n if (!step) return null;\n switch (step.kind) {\n case \"named\": {\n if (step.name) return t(`timeline.commandStep.${step.step}.${phase}`, { name: step.name });\n const unnamed = UNNAMED[step.step];\n if (unnamed === null) return null;\n if (unnamed === \"editFile\" || unnamed === \"download\") return toolStepLabel(t, unnamed, phase);\n return t(`timeline.commandStep.${unnamed}.${phase}`);\n }\n case \"fixed\":\n return t(`timeline.commandStep.${step.step}.${phase}`);\n case \"readFiles\":\n return t(`timeline.commandStep.readFiles.${phase}`, { count: step.count });\n case \"search\":\n return step.query\n ? t(`timeline.commandStep.search.${phase}`, { query: step.query })\n : t(`timeline.commandStep.searchFiles.${phase}`);\n case \"host\":\n return t(`timeline.commandStep.${step.step}.${phase}`, { host: step.host });\n case \"code\":\n return t(`timeline.commandStep.runCode.${phase}`, { language: step.language });\n case \"tool\": {\n // `ogtool call interaction.browser.open` names the tool by its catalog path.\n const dotted = step.name.split(\".\");\n const wire = dotted.length > 1 ? `${dotted[0]}__${dotted.slice(1).join(\"_\")}` : step.name;\n return toolDisplayName(t, wire, undefined, phase);\n }\n case \"toolStep\":\n return toolStepLabel(t, step.step, phase);\n case \"opaque\":\n return null;\n }\n}\n","import { isConnectedMachineOutcomeUnknownOutput, type GitFileDiff } from \"@opengeni/sdk\";\nimport { stringifyPayload, tryParseJson } from \"../lib/format\";\nimport {\n applyPatchOpsFromToolItem,\n controlCaret,\n execTruncated,\n isExecSessionLostBanner,\n looksBinary,\n parseExecBannerSessionId,\n parseToolArgs,\n retainedToolResultImages,\n sandboxCommandExitCode,\n stripExecBanner,\n tailPeek,\n unwrapMcpOutput,\n v4aToGitFileDiff,\n type ApplyPatchOperation,\n} from \"./parsers\";\nimport { commandStepTitle } from \"./command-step\";\nimport { redactDeep, redactSignedUrls, signedValuesDeep } from \"./credential-redaction\";\nimport { invokedToolCall } from \"./invoked-tool\";\nimport { rawTypeOf } from \"./registry\";\nimport { mcpToolLeaf, toolDisplayName } from \"./tool-display-name\";\nimport {\n builtInToolStep,\n toolStepLabel,\n toolStepPhase,\n type ToolStepId,\n type ToolStepPhase,\n} from \"./tool-steps\";\nimport type { ToolCallItem } from \"./types\";\nimport { type OpenGeniText } from \"../messages/runtime\";\n\n/* ----------------------------------------------------------------------------\n Tool row presentation model (renderer-neutral)\n\n The collapsed-row decisions every tool renderer makes — icon, tint, title,\n preview, settle chip and what the expanded body holds — expressed as plain\n data so DOM and non-DOM renderers draw the same row from one source of truth.\n Web renderers consume these functions; a change here changes every surface.\n -------------------------------------------------------------------------- */\n\nexport type ToolIconKind =\n | \"terminal\"\n | \"keyboard\"\n | \"file-diff\"\n | \"search\"\n | \"question\"\n | \"target\"\n | \"brain\"\n | \"sessions\"\n | \"server\"\n | \"server-cog\"\n | \"calendar\"\n | \"panels\"\n | \"share\"\n | \"message\"\n | \"git\"\n | \"box\"\n | \"key\"\n | \"file-search\"\n | \"package-search\"\n | \"plug\"\n | \"browser\"\n | \"screen\"\n | \"spreadsheet\"\n | \"wait\"\n | \"download\"\n | \"clipboard\"\n | \"image\"\n | \"video\"\n | \"record\"\n | \"document\"\n | \"file\"\n | \"attachment\"\n | \"archive\"\n | \"folder\"\n | \"site\"\n | \"skill\"\n | \"settings\"\n | \"bell\"\n | \"phone\"\n | \"inbox\"\n | \"help\"\n | \"model\"\n | \"progress\"\n | \"helper\"\n | \"sign-in\"\n | \"code\"\n | \"accounting\"\n | \"rename\"\n | \"wrench\";\n\nexport type ToolIconTone = \"accent\" | \"failed\" | \"running\" | \"muted\";\n\nexport type ToolChip = {\n tone: \"ok\" | \"bad\" | \"muted\" | \"interrupted\";\n text: string;\n};\n\n/** The collapsed-row secondary line. `running` previews carry the pulse locus. */\nexport type ToolPreview =\n | { kind: \"text\"; text: string; running?: boolean | undefined }\n | {\n kind: \"path\";\n path: string;\n add?: number | undefined;\n del?: number | undefined;\n }\n | { kind: \"files\"; count: number; add: number; del: number }\n | { kind: \"malformed\"; name: string };\n\nexport type ToolPatchFile = {\n key: string;\n path: string;\n file: GitFileDiff | null;\n diff: string;\n};\n\nexport type WebSearchResult = {\n title: string;\n domain: string;\n snippet: string;\n};\n\n/** What the expanded body holds; renderers draw these with their own primitives. */\nexport type ToolBody =\n | {\n kind: \"term\";\n command: string | null;\n workdir: string | null;\n output: string;\n live?: boolean | undefined;\n failed?: boolean | undefined;\n note?: string | undefined;\n }\n | { kind: \"note\"; text: string; tone?: \"error\" | undefined }\n | {\n kind: \"payloads\";\n /** A short explanation above the payloads. */\n note?: string | undefined;\n blocks: Array<{ label: string; value: unknown; failed?: boolean }>;\n }\n | {\n kind: \"patch\";\n files: ToolPatchFile[];\n /** A single malformed op renders its raw patch without the path caption. */\n bare?: boolean | undefined;\n }\n | { kind: \"web-results\"; results: WebSearchResult[] | null }\n | {\n /** A short labelled listing (disclosed tools, search hits) above payloads. */\n kind: \"listing\";\n note?: string | undefined;\n entries: ToolListingEntry[];\n /** Entries beyond the visible list (\"+N more\"). */\n more?: number | undefined;\n /** Shown instead of the list when it is known to be empty. */\n empty?: string | undefined;\n blocks: Array<{ label: string; value: unknown; failed?: boolean }>;\n }\n /** Nothing to expand: the row says everything a person needs. */\n | { kind: \"none\" };\n\nexport type ToolListingEntry = {\n key: string;\n title: string;\n /** Quiet leading label (the tool's server). */\n eyebrow?: string | null | undefined;\n mono?: boolean | undefined;\n /** Secondary text under the title (a search snippet). */\n snippet?: string | undefined;\n};\n\nexport type PresentedToolKind =\n | \"exec\"\n | \"write_stdin\"\n | \"apply_patch\"\n | \"web_search\"\n | \"ask\"\n | \"run_on\"\n | \"tool_search\"\n | \"docs_search\"\n | \"session_title\"\n | \"machine\"\n | \"generic\";\n\nexport type ToolRowPresentation = {\n tool: PresentedToolKind;\n icon: ToolIconKind;\n iconTone: ToolIconTone;\n title: string;\n titleMono?: boolean | undefined;\n running?: boolean | undefined;\n preview?: ToolPreview | undefined;\n chip?: ToolChip | undefined;\n failed?: boolean | undefined;\n cancelled?: boolean | undefined;\n /**\n * The preview quotes raw tool detail (command output, an error payload, tool\n * names), so plain rows leave it out.\n */\n detailPreview?: boolean | undefined;\n body: ToolBody;\n};\n\n/**\n * How much of a tool call a row shows. `full` (the default) shows commands,\n * arguments, output and diffs; `plain` shows only the plain step, its status\n * and human-readable results, never raw arguments, output or JSON.\n */\nexport type ToolDetails = \"full\" | \"plain\";\n\nexport type ToolPresentationContext = {\n /** Host-supplied active compute label (\"on <label> · …\" preview prefix). */\n computeLabel?: string | null | undefined;\n /** See `ToolDetails`. Defaults to `full`. */\n details?: ToolDetails | undefined;\n};\n\n/** Prefix a collapsed preview with the host-supplied active compute label. */\nexport function withComputePreview(label: string | null | undefined, preview: string): string {\n if (!label) {\n return preview;\n }\n return `on ${label} · ${preview}`;\n}\n\nexport function truncatePreview(text: string, max: number): string {\n const cleaned = text.replace(/\\s+/g, \" \").trim();\n if (!cleaned) {\n return \"\";\n }\n return cleaned.length > max ? `${cleaned.slice(0, max - 1)}…` : cleaned;\n}\n\n/**\n * The readable part of a tool error, for a one-line preview: the message inside\n * a JSON error envelope, without the runtime's \"please try again\" wrapper, an\n * HTTP status prefix or a trailing support reference. The full error stays in\n * the row body.\n */\nexport function readableToolError(text: string): string {\n const stripTransport = (value: string) =>\n value\n .trim()\n .replace(/^An error occurred while running the tool\\. Please try again\\.\\s*(Error:\\s*)?/, \"\")\n .replace(/^(?:[A-Za-z][\\w.-]{0,40} )?API \\d{3}:\\s*/, \"\");\n let message = stripTransport(text);\n const parsed = tryParseJson(message);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const envelope = parsed as { error?: unknown; message?: unknown };\n const inner =\n typeof envelope.error === \"string\"\n ? envelope.error\n : envelope.error && typeof envelope.error === \"object\"\n ? (envelope.error as { message?: unknown }).message\n : envelope.message;\n if (typeof inner === \"string\" && inner.trim()) message = stripTransport(inner);\n }\n return message.replace(/\\s*\\(?Reference: [\\w-]+\\)?\\.?$/, \"\").trim();\n}\n\nfunction textPreview(text: string, running?: boolean): ToolPreview {\n return running ? { kind: \"text\", text, running: true } : { kind: \"text\", text };\n}\n\n/* ---- exec_command ---------------------------------------------------------- */\n\n/**\n * A command row's title: what the command did in plain words (\"Downloaded\n * report.json\"), or \"Ran a command\" when it can't be placed. A call that ended\n * badly keeps the ongoing form so its chip finishes the sentence.\n */\nfunction execTitle(t: OpenGeniText, cmd: string, phase: ToolStepPhase): string {\n return commandStepTitle(t, cmd, phase) ?? toolStepLabel(t, \"runCommand\", phase);\n}\n\nexport function execPresentation(\n t: OpenGeniText,\n item: ToolCallItem,\n context: ToolPresentationContext = {},\n): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const cmd = typeof args.cmd === \"string\" ? args.cmd : \"\";\n // The command is one click away in the body; signed links never show their signature.\n const command = cmd.trim() ? redactSignedUrls(cmd) : null;\n const workdir = typeof args.workdir === \"string\" ? args.workdir : null;\n const out = item.output;\n const computeLabel = context.computeLabel ?? null;\n const base = {\n tool: \"exec\" as const,\n icon: \"terminal\" as const,\n title: execTitle(t, cmd, \"running\"),\n };\n\n if (isConnectedMachineOutcomeUnknownOutput(out)) {\n // The call has ended; only its effects are unknown, which the chip says.\n return {\n ...base,\n title: execTitle(t, cmd, \"done\"),\n iconTone: \"failed\",\n failed: true,\n chip: { tone: \"bad\", text: t(\"timeline.toolPresentation.outcomeUnknown\") },\n body: {\n kind: \"term\",\n command,\n workdir,\n output: redactSignedUrls(out, undefined, \"text\"),\n failed: true,\n },\n };\n }\n\n // No output event ever arrived: the turn failed before the output insert —\n // most likely a NUL byte in the command output prevented storage.\n if (item.status === \"failed\" && out === undefined) {\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: t(\"timeline.chip.failed\") },\n preview: textPreview(\n withComputePreview(computeLabel, t(\"timeline.toolPresentation.outputLostNulByteCould\")),\n ),\n body: {\n kind: \"term\",\n command,\n workdir,\n output: \"\",\n failed: true,\n note: t(\"timeline.toolPresentation.outputContainedANulByte\"),\n },\n };\n }\n\n if (item.status === \"failed\" && (out == null || out === \"\")) {\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: t(\"timeline.chip.failed\") },\n preview: textPreview(\n withComputePreview(computeLabel, t(\"timeline.toolPresentation.toolCallFailed\")),\n ),\n body: {\n kind: \"term\",\n command,\n workdir,\n output: \"\",\n failed: true,\n note: t(\"timeline.toolPresentation.theToolCallFailedWith\"),\n },\n };\n }\n\n if (item.status === \"running\") {\n const streamed =\n typeof out === \"string\" ? redactSignedUrls(stripExecBanner(out), undefined, \"text\") : \"\";\n const runningPreview = streamed ? `${streamed.split(\"\\n\").length} lines` : \"running…\";\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(withComputePreview(computeLabel, runningPreview), true),\n body: {\n kind: \"term\",\n command,\n workdir,\n output: streamed,\n live: true,\n },\n };\n }\n\n const text = typeof out === \"string\" ? out : stringifyPayload(out);\n const stripped = redactSignedUrls(stripExecBanner(text), undefined, \"text\");\n const bgSession = parseExecBannerSessionId(text);\n const exitCode = sandboxCommandExitCode(text);\n const binary = looksBinary(stripped);\n const exitedBadly = exitCode != null && exitCode !== 0;\n\n // Color is spent on the exception only: a clean exit earns no chip.\n let chip: ToolChip | undefined;\n let iconTone: ToolIconTone = \"muted\";\n if (bgSession != null) {\n chip = { tone: \"muted\", text: `session ${bgSession}` };\n } else if (exitCode != null && exitCode !== 0) {\n chip = { tone: \"bad\", text: `exit ${exitCode}` };\n iconTone = \"failed\";\n }\n\n const peek = binary\n ? t(\"timeline.toolPresentation.binaryOutput\")\n : tailPeek(stripped) || t(\"timeline.toolPresentation.noOutput\");\n const truncated = execTruncated(text);\n const preview = withComputePreview(\n computeLabel,\n truncated ? t(\"timeline.toolPresentation.truncatedPeek\", { peek }) : peek,\n );\n return {\n ...base,\n title: execTitle(\n t,\n cmd,\n item.status === \"complete\" && !exitedBadly && bgSession == null ? \"done\" : \"running\",\n ),\n iconTone,\n ...(chip ? { chip } : {}),\n failed: item.status === \"failed\",\n cancelled: item.status === \"cancelled\",\n preview: textPreview(preview),\n body: {\n kind: \"term\",\n command,\n workdir,\n output: binary ? t(\"timeline.toolPresentation.binaryOutputSuppressed\") : stripped,\n failed: item.status === \"failed\" || exitedBadly,\n ...(bgSession != null\n ? {\n note: t(\"timeline.toolPresentation.sessionBgsessionALaterWrite\", { bgSession }),\n }\n : {}),\n },\n };\n}\n\n/* ---- write_stdin ----------------------------------------------------------- */\n\nexport function writeStdinPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const sessionId =\n typeof args.session_id === \"string\" || typeof args.session_id === \"number\"\n ? args.session_id\n : undefined;\n const text = typeof item.output === \"string\" ? item.output : stringifyPayload(item.output);\n const lost = isExecSessionLostBanner(text);\n const keys = controlCaret(typeof args.chars === \"string\" ? args.chars : \"\");\n const exitCode = sandboxCommandExitCode(text);\n const stripped = stripExecBanner(text);\n const title = `session ${sessionId} ← ${keys || \"∅\"}`;\n const base = {\n tool: \"write_stdin\" as const,\n icon: \"keyboard\" as const,\n title,\n titleMono: true,\n };\n\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(\"sending…\", true),\n body: {\n kind: \"note\",\n text: t(\"timeline.toolPresentation.sendingInputToSessionSessionid\", { sessionId }),\n },\n };\n }\n\n let chip: ToolChip | undefined;\n if (lost) {\n chip = { tone: \"bad\", text: t(\"timeline.chip.lost\") };\n } else if (exitCode != null && exitCode !== 0) {\n chip = { tone: \"bad\", text: `exit ${exitCode}` };\n }\n\n return {\n ...base,\n iconTone: lost ? \"failed\" : \"muted\",\n ...(chip ? { chip } : {}),\n failed: item.status === \"failed\",\n cancelled: item.status === \"cancelled\",\n preview: textPreview(\n lost\n ? t(\"timeline.toolPresentation.sessionSessionidPtyVanished\", { sessionId })\n : tailPeek(stripped) || \"sent\",\n ),\n body: lost\n ? { kind: \"note\", tone: \"error\", text: stripped || text }\n : {\n kind: \"term\",\n command: `write_stdin → session ${sessionId}`,\n workdir: null,\n output: stripped,\n },\n };\n}\n\n/* ---- apply_patch ----------------------------------------------------------- */\n\nexport function patchVerb(t: OpenGeniText, op: ApplyPatchOperation | undefined): string {\n if (!op) {\n return t(\"timeline.toolPresentation.edited\");\n }\n return op.type === \"create_file\"\n ? t(\"timeline.toolPresentation.created\")\n : op.type === \"delete_file\"\n ? t(\"timeline.toolPresentation.deleted\")\n : op.moveTo\n ? t(\"timeline.toolPresentation.renamed\")\n : t(\"timeline.toolPresentation.edited\");\n}\n\nexport function pathBasename(path: string): string {\n const parts = path.split(\"/\").filter(Boolean);\n return parts.length ? parts[parts.length - 1]! : path;\n}\n\nexport function pathDirname(path: string): string {\n const idx = path.lastIndexOf(\"/\");\n return idx >= 0 ? path.slice(0, idx + 1) : \"\";\n}\n\nexport function safeParsePatchOp(op: ApplyPatchOperation): GitFileDiff | null {\n try {\n return v4aToGitFileDiff(op);\n } catch {\n return null;\n }\n}\n\nfunction patchFiles(\n ops: ApplyPatchOperation[],\n parsed?: Array<GitFileDiff | null>,\n): ToolPatchFile[] {\n return ops.map((op, index) => ({\n key: `${op.type}:${op.path}:${index}`,\n path: op.path,\n file: parsed ? (parsed[index] ?? null) : safeParsePatchOp(op),\n diff: op.diff ?? \"\",\n }));\n}\n\n/** Returns null when a settled patch has no op (renderers fall back to generic). */\nexport function applyPatchPresentation(\n t: OpenGeniText,\n item: ToolCallItem,\n): ToolRowPresentation | null {\n const ops = applyPatchOpsFromToolItem(item);\n const cancelled = item.status === \"cancelled\";\n const firstOp = ops[0];\n const base = { tool: \"apply_patch\" as const, icon: \"file-diff\" as const };\n\n if (item.status === \"running\") {\n // Show the patch structure from the arguments, marked clearly in-progress.\n const fileCount = ops.length;\n const titleVerb = firstOp\n ? t(\"timeline.toolPresentation.applyingPathbasename\", {\n pathBasename: pathBasename(firstOp.path),\n })\n : t(\"timeline.toolPresentation.applyingPatch\");\n return {\n ...base,\n iconTone: \"running\",\n title:\n fileCount > 1\n ? t(\"timeline.toolPresentation.applyingFilecountFiles\", { fileCount })\n : titleVerb,\n running: true,\n preview: textPreview(\n fileCount > 1 ? `${fileCount} files` : firstOp ? firstOp.path : \"applying…\",\n true,\n ),\n body: { kind: \"patch\", files: patchFiles(ops) },\n };\n }\n\n if (item.status === \"failed\") {\n return {\n ...base,\n iconTone: \"failed\",\n title: firstOp ? `${patchVerb(t, firstOp)} ${pathBasename(firstOp.path)}` : \"apply_patch\",\n chip: { tone: \"bad\", text: t(\"timeline.chip.failed\") },\n preview: textPreview(\n typeof item.output === \"string\" ? item.output : t(\"timeline.toolPresentation.patchFailed\"),\n ),\n body: {\n kind: \"payloads\",\n blocks: [{ label: t(\"timeline.toolPresentation.error\"), value: item.output, failed: true }],\n },\n };\n }\n\n // Multi-file edit: magnitude stays a single muted glyph pair.\n if (ops.length > 1) {\n const parsed = ops.map((op) => safeParsePatchOp(op));\n const goodFiles = parsed.filter((f): f is GitFileDiff => f !== null);\n const add = goodFiles.reduce((n, f) => n + f.additions, 0);\n const del = goodFiles.reduce((n, f) => n + f.deletions, 0);\n return {\n ...base,\n iconTone: \"accent\",\n title: t(\"timeline.toolPresentation.editedLengthFiles\", { length: ops.length }),\n cancelled,\n preview: { kind: \"files\", count: ops.length, add, del },\n body: { kind: \"patch\", files: patchFiles(ops, parsed) },\n };\n }\n\n if (!firstOp) {\n return null;\n }\n if (firstOp.type === \"delete_file\") {\n return {\n ...base,\n iconTone: \"failed\",\n title: t(\"timeline.toolPresentation.deletedPathbasename\", {\n pathBasename: pathBasename(firstOp.path),\n }),\n cancelled,\n preview: { kind: \"path\", path: firstOp.path },\n body: { kind: \"note\", text: t(\"timeline.toolPresentation.fileDeletedNoDiffTo\") },\n };\n }\n\n const file = safeParsePatchOp(firstOp);\n if (!file) {\n return {\n ...base,\n iconTone: \"accent\",\n title: `${patchVerb(t, firstOp)} ${pathBasename(firstOp.path)}`,\n cancelled,\n preview: { kind: \"malformed\", name: pathBasename(firstOp.path) },\n body: { kind: \"patch\", files: patchFiles([firstOp], [null]), bare: true },\n };\n }\n\n return {\n ...base,\n iconTone: \"accent\",\n title: `${patchVerb(t, firstOp)} ${pathBasename(file.path)}`,\n cancelled,\n preview: {\n kind: \"path\",\n path: file.path,\n add: file.additions,\n del: file.deletions,\n },\n body: { kind: \"patch\", files: patchFiles([firstOp], [file]) },\n };\n}\n\n/* ---- web search ------------------------------------------------------------ */\n\nexport function webSearchQueryFromArguments(args: unknown): string | null {\n if (typeof args === \"string\") {\n const trimmed = args.trim();\n if (!trimmed) {\n return null;\n }\n try {\n return webSearchQueryFromArguments(JSON.parse(trimmed));\n } catch {\n return trimmed;\n }\n }\n if (!args || typeof args !== \"object\") {\n return null;\n }\n const record = args as Record<string, unknown>;\n if (typeof record.query === \"string\" && record.query.trim().length > 0) {\n return record.query;\n }\n if (Array.isArray(record.queries)) {\n const first = record.queries.find(\n (value): value is string => typeof value === \"string\" && value.trim().length > 0,\n );\n if (first) {\n return first;\n }\n }\n return null;\n}\n\nexport function webSearchPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const raw = (item.raw ?? {}) as {\n providerData?: {\n action?: {\n type?: string;\n query?: string;\n queries?: string[];\n url?: string;\n pattern?: string;\n };\n };\n };\n const action = raw.providerData?.action ?? {};\n const actionType = action.type ?? \"search\";\n const queries = (action.queries ?? []).filter(\n (value): value is string => typeof value === \"string\" && value.trim().length > 0,\n );\n const searchQuery =\n (typeof action.query === \"string\" && action.query.trim().length > 0 ? action.query : null) ??\n queries[0] ??\n webSearchQueryFromArguments(item.arguments);\n const running = item.status === \"running\";\n const query =\n actionType === \"open_page\"\n ? (action.url ?? t(\"timeline.toolPresentation.pageUnavailable\"))\n : actionType === \"find_in_page\"\n ? action.pattern && action.url\n ? `\"${action.pattern}\" in ${action.url}`\n : (action.pattern ?? action.url ?? t(\"timeline.toolPresentation.pageUnavailable\"))\n : // Codex often emits the live card before action.query/queries land.\n (searchQuery ?? (running ? \"…\" : t(\"timeline.toolPresentation.queryUnavailable\")));\n const variants = queries.length > 1 ? ` +${queries.length - 1} variants` : \"\";\n const base = { tool: \"web_search\" as const, icon: \"search\" as const };\n\n if (running) {\n return {\n ...base,\n iconTone: \"running\",\n title:\n actionType === \"open_page\"\n ? t(\"timeline.toolPresentation.openingWebPage\")\n : actionType === \"find_in_page\"\n ? t(\"timeline.toolPresentation.searchingWithinPage\")\n : t(\"timeline.toolPresentation.searchingTheWeb\"),\n running: true,\n preview: textPreview(`${query}${variants}`, true),\n body: {\n kind: \"note\",\n text: t(\"timeline.toolPresentation.searchingResultsFoldIntoThe\"),\n },\n };\n }\n\n const rawResults = (item.output as { results?: unknown } | undefined)?.results;\n const results = Array.isArray(rawResults)\n ? (rawResults as unknown[]).filter((r): r is WebSearchResult => !!r && typeof r === \"object\")\n : null;\n return {\n ...base,\n iconTone: \"muted\",\n title:\n actionType === \"open_page\"\n ? t(\"timeline.toolPresentation.openedWebPage\")\n : actionType === \"find_in_page\"\n ? t(\"timeline.toolPresentation.searchedWithinPage\")\n : t(\"timeline.toolPresentation.searchedTheWeb\"),\n preview: textPreview(`${query}${variants}`),\n failed: item.status === \"failed\",\n cancelled: item.status === \"cancelled\",\n body: { kind: \"web-results\", results },\n };\n}\n\n/* ---- MCP-shaped tools: ask, run_on, generic -------------------------------- */\n\nexport function askToolPreview(args: unknown): string | null {\n const record = args && typeof args === \"object\" ? (args as Record<string, unknown>) : null;\n const questions = Array.isArray(record?.questions) ? record.questions : null;\n if (!questions || questions.length === 0) {\n return null;\n }\n const first = questions[0];\n if (!first || typeof first !== \"object\") {\n return null;\n }\n const q = first as Record<string, unknown>;\n const text =\n typeof q.label === \"string\" && q.label.trim()\n ? q.label.trim()\n : typeof q.prompt === \"string\" && q.prompt.trim()\n ? q.prompt.trim()\n : null;\n if (!text) {\n return null;\n }\n const preview = truncatePreview(text, 90);\n return questions.length > 1 ? `${preview} · ${questions.length} questions` : preview;\n}\n\nexport function runOnTargetName(output: unknown): string | null {\n const { text } = unwrapMcpOutput(output);\n const parsed = tryParseJson(text);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const name = (parsed as { targetName?: unknown }).targetName;\n if (typeof name === \"string\" && name.trim()) {\n return name.trim();\n }\n }\n return null;\n}\n\nexport function runOnOpPreview(args: Record<string, unknown>): string | null {\n const op = args.op;\n if (!op || typeof op !== \"object\" || Array.isArray(op)) {\n return null;\n }\n const record = op as Record<string, unknown>;\n if (record.kind === \"exec\" && typeof record.cmd === \"string\" && record.cmd.trim()) {\n return `$ ${redactSignedUrls(record.cmd.trim())}`;\n }\n if (\n (record.kind === \"read\" || record.kind === \"write\") &&\n typeof record.path === \"string\" &&\n record.path.trim()\n ) {\n return truncatePreview(record.path.trim(), 72);\n }\n return null;\n}\n\nexport function goalToolPreview(name: string, args: unknown): string | null {\n const leaf = mcpToolLeaf(name);\n if (\n leaf !== \"goal_set\" &&\n leaf !== \"goal_update\" &&\n leaf !== \"goal_complete\" &&\n leaf !== \"goal_pause\" &&\n leaf !== \"wait_for_input\"\n ) {\n return null;\n }\n const record = args && typeof args === \"object\" ? (args as Record<string, unknown>) : null;\n if (!record) {\n return null;\n }\n const text =\n typeof record.text === \"string\"\n ? record.text\n : typeof record.evidence === \"string\"\n ? record.evidence\n : typeof record.rationale === \"string\"\n ? record.rationale\n : typeof record.reason === \"string\"\n ? record.reason\n : typeof record.progressNote === \"string\"\n ? record.progressNote\n : null;\n return text ? truncatePreview(text, 90) : null;\n}\n\nconst SKILL_TOOLS: ReadonlySet<string> = new Set([\n \"skill_read\",\n \"repository_skill_read\",\n \"skill_checkout\",\n \"skill_search\",\n \"skill_save\",\n \"skill_publish\",\n \"skill_install\",\n \"skill_remove\",\n]);\nconst UUID_LIKE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** \"operate-smart-home\" → \"Operate smart home\"; \"builtin:documents\" → \"Documents\". */\nfunction readableSkillName(name: string): string | null {\n const bare = name.trim().replace(/^builtin:/, \"\");\n if (!bare || UUID_LIKE.test(bare)) return null;\n const plain = bare.replace(/[-_]+/g, \" \").replace(/\\s+/g, \" \").trim();\n if (!plain) return null;\n return plain.charAt(0).toUpperCase() + plain.slice(1);\n}\n\n/** The `name:` in a returned SKILL.md's front matter, read from raw or JSON-escaped text. */\nfunction skillNameInOutput(output: unknown): string | null {\n const { text } = unwrapMcpOutput(output);\n const head = text\n .slice(0, 4_000)\n .replace(/\\\\r/g, \"\")\n .replace(/\\r/g, \"\")\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\\"/g, '\"');\n const start = /(?:^|\\n|\")---[ \\t]*\\n/.exec(head);\n if (!start) return null;\n const rest = head.slice(start.index + start[0].length);\n const end = /\\n---[ \\t]*(?:\\n|$)/.exec(rest);\n const frontMatter = end ? rest.slice(0, end.index + 1) : rest;\n const match = /(?:^|\\n)name:[ \\t]*[\"']?([^\"'\\n\\\\]+?)[\"']?[ \\t]*(?:\\n|$)/.exec(frontMatter);\n return match?.[1]?.trim() || null;\n}\n\n/**\n * Which skill a skill step used: the name in the SKILL.md it returned, else the\n * name or query it was called with. A bare id is never shown.\n */\nexport function skillToolPreview(item: ToolCallItem): string | null {\n const leaf = mcpToolLeaf(item.name);\n if (!SKILL_TOOLS.has(leaf)) return null;\n const args = parseToolArgs(item.arguments);\n if (leaf === \"skill_search\") {\n return typeof args.query === \"string\" && args.query.trim()\n ? truncatePreview(args.query, 72)\n : null;\n }\n const returned = item.status === \"running\" ? null : skillNameInOutput(item.output);\n const requested =\n typeof args.skill === \"string\"\n ? args.skill\n : typeof args.name === \"string\"\n ? args.name\n : typeof args.skillId === \"string\"\n ? args.skillId\n : null;\n const name = readableSkillName(returned ?? requested ?? \"\");\n return name ? truncatePreview(name, 72) : null;\n}\n\n/**\n * The icon for each built-in step. Tools that read as the same step share its\n * icon, so a row's icon always matches its words (\"Opened the browser\" draws\n * the browser). Typed as a full record: a new step without an icon fails to\n * compile.\n */\nconst TOOL_STEP_ICONS: Readonly<Record<ToolStepId, ToolIconKind>> = {\n // Chats, goals and notifications\n nameChat: \"rename\",\n saveBotTemplate: \"rename\",\n notify: \"bell\",\n callYou: \"phone\",\n withdrawNotification: \"bell\",\n tidyInbox: \"inbox\",\n setGoal: \"target\",\n noteProgress: \"target\",\n completeGoal: \"target\",\n pauseGoal: \"target\",\n resumeGoal: \"target\",\n wait: \"wait\",\n askYou: \"question\",\n askForHelp: \"help\",\n // Notes, knowledge and instructions\n checkNotes: \"brain\",\n checkMeetings: \"record\",\n saveMeetingNotes: \"record\",\n saveNote: \"brain\",\n archiveNote: \"brain\",\n proposeUpdate: \"brain\",\n confirmUpdate: \"brain\",\n updateInstructions: \"brain\",\n coordinateWork: \"sessions\",\n // Guides (Skills)\n readGuide: \"skill\",\n findGuides: \"skill\",\n saveGuide: \"skill\",\n removeGuide: \"skill\",\n // Computers\n findComputers: \"server\",\n switchComputer: \"server\",\n useComputer: \"server\",\n setUpComputer: \"server\",\n removeComputer: \"server\",\n runCommand: \"terminal\",\n runCode: \"code\",\n editFile: \"file-diff\",\n lookAtImage: \"image\",\n searchCode: \"search\",\n searchFiles: \"file-search\",\n openFile: \"file\",\n // Screens and the browser\n checkScreens: \"screen\",\n openScreen: \"screen\",\n lookAtScreen: \"screen\",\n useScreen: \"screen\",\n enableScreenControl: \"screen\",\n useClipboard: \"clipboard\",\n openBrowser: \"browser\",\n useBrowser: \"browser\",\n readPage: \"browser\",\n lookAtPage: \"browser\",\n workInBrowser: \"browser\",\n download: \"download\",\n recordBrowser: \"record\",\n signIn: \"sign-in\",\n manageSignIns: \"sign-in\",\n shareBrowser: \"share\",\n workInExcel: \"spreadsheet\",\n // Projects, other chats and helpers\n checkProjects: \"folder\",\n organizeProjects: \"folder\",\n checkChats: \"sessions\",\n chooseChat: \"sessions\",\n checkProgress: \"progress\",\n changeModel: \"model\",\n startHelper: \"helper\",\n messageAssistant: \"sessions\",\n manageChat: \"sessions\",\n // Workspace administration and setup\n manageWorkspace: \"settings\",\n manageSetup: \"server-cog\",\n checkModels: \"model\",\n // Passwords and settings\n findPassword: \"key\",\n savePassword: \"key\",\n deletePassword: \"key\",\n checkSettings: \"settings\",\n updateSettings: \"settings\",\n // Tools and connections\n findTools: \"package-search\",\n useTool: \"plug\",\n requestAccess: \"plug\",\n listRepositories: \"git\",\n // Web, images and video\n searchWeb: \"search\",\n createImage: \"image\",\n createVideo: \"video\",\n // Social accounts\n checkAccounts: \"share\",\n readPosts: \"share\",\n syncPosts: \"share\",\n replyToPost: \"share\",\n // Scheduled tasks\n checkSchedules: \"calendar\",\n checkEvents: \"calendar\",\n changeEventSource: \"calendar\",\n createSchedule: \"calendar\",\n updateSchedule: \"calendar\",\n runSchedule: \"calendar\",\n // Slack\n readSlack: \"message\",\n postSlack: \"message\",\n deleteMessage: \"message\",\n // Accounting\n readAccounting: \"accounting\",\n updateAccounting: \"accounting\",\n // Documents, files and Sites\n searchDocuments: \"file-search\",\n checkDocuments: \"document\",\n createDocument: \"document\",\n editDocument: \"document\",\n exportDocument: \"document\",\n restoreDocument: \"document\",\n archiveDocument: \"archive\",\n shareFile: \"attachment\",\n checkSite: \"site\",\n updateSite: \"site\",\n};\n\n/**\n * The icon for a tool by name: a built-in tool draws its step's icon; other\n * tools fall back to their family's icon, then the generic wrench.\n */\nexport function genericToolIconKind(name: string): ToolIconKind {\n const leaf = mcpToolLeaf(name);\n const step = builtInToolStep(leaf);\n if (step) return TOOL_STEP_ICONS[step];\n return leaf.startsWith(\"goal_\")\n ? \"target\"\n : leaf.startsWith(\"memory_\") || leaf.startsWith(\"knowledge_\")\n ? \"brain\"\n : leaf.startsWith(\"session_\") || leaf.startsWith(\"sessions_\")\n ? \"sessions\"\n : leaf.startsWith(\"sandbox\") || leaf.startsWith(\"connected_machine_\")\n ? \"server\"\n : leaf.startsWith(\"rig_\")\n ? \"server-cog\"\n : leaf.startsWith(\"scheduled_\")\n ? \"calendar\"\n : leaf.startsWith(\"artifacts_\") || leaf.startsWith(\"editable_artifact_\")\n ? \"document\"\n : leaf.startsWith(\"site_\")\n ? \"site\"\n : leaf.startsWith(\"browser_\")\n ? \"browser\"\n : leaf.startsWith(\"computer_\") || leaf.startsWith(\"cua_\")\n ? \"screen\"\n : leaf.startsWith(\"secret_\")\n ? \"key\"\n : leaf.startsWith(\"social_\") ||\n leaf.startsWith(\"x_\") ||\n leaf.startsWith(\"reddit_\")\n ? \"share\"\n : leaf.startsWith(\"slack_\")\n ? \"message\"\n : leaf.startsWith(\"github_\")\n ? \"git\"\n : leaf.startsWith(\"variable_\") || leaf.startsWith(\"environment_\")\n ? \"settings\"\n : leaf.includes(\"document\")\n ? \"file-search\"\n : leaf.startsWith(\"skill_\")\n ? \"skill\"\n : \"wrench\";\n}\n\ntype McpRowOptions = {\n tool: PresentedToolKind;\n icon: ToolIconKind;\n title: string;\n /** Preview while running (falls back to `runningFallback`). */\n runningPreview: string | null;\n runningFallback: string;\n /** Settled preview (null → none); ask/run_on also use it as the error fallback. */\n settledPreview: string | null;\n /** Generic shows \"Done\" when no settled preview exists and skips the error fallback. */\n settledFallback?: string | undefined;\n /** Ask/run_on omit an empty Result block. */\n omitEmptyResult?: boolean | undefined;\n /** Generic shows a goal preview as plain text (no pulse) while running. */\n plainRunningPreview?: boolean | undefined;\n /** Machine steps say they failed in the title, so the preview stays empty. */\n quietError?: boolean | undefined;\n};\n\nfunction mcpRowPresentation(\n t: OpenGeniText,\n item: ToolCallItem,\n options: McpRowOptions,\n): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const base = { tool: options.tool, icon: options.icon, title: options.title };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview:\n options.runningPreview != null && options.plainRunningPreview\n ? textPreview(options.runningPreview)\n : textPreview(options.runningPreview ?? options.runningFallback, true),\n body: {\n kind: \"payloads\",\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n // Cancelled is not an error, even if the payload carries an isError flag.\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n const errorFallback = options.settledFallback === undefined ? options.settledPreview : null;\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: t(\"timeline.chip.error\") },\n ...(options.quietError\n ? {}\n : {\n detailPreview: true,\n preview: textPreview(\n truncatePreview(readableToolError(outText), 80) ||\n errorFallback ||\n t(\"timeline.toolPresentation.error\"),\n ),\n }),\n body: {\n kind: \"payloads\",\n blocks: [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.error\"), value: outText, failed: true },\n ],\n },\n };\n }\n const settled =\n item.status === \"cancelled\"\n ? null\n : (options.settledPreview ?? options.settledFallback ?? null);\n return {\n ...base,\n iconTone: \"muted\",\n cancelled: item.status === \"cancelled\",\n ...(settled != null ? { preview: textPreview(settled) } : {}),\n body: {\n kind: \"payloads\",\n blocks:\n options.omitEmptyResult && !outText\n ? [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }]\n : [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.result\"), value: outText },\n ],\n },\n };\n}\n\nexport function askPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const preview = askToolPreview(parseToolArgs(item.arguments));\n return mcpRowPresentation(t, item, {\n tool: \"ask\",\n icon: \"question\",\n title: t(\"timeline.toolPresentation.ask\"),\n runningPreview: preview,\n runningFallback: t(\"timeline.toolPresentation.waiting\"),\n settledPreview: preview,\n omitEmptyResult: true,\n });\n}\n\nexport function runOnPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const targetName = runOnTargetName(item.output);\n const opPreview = runOnOpPreview(parseToolArgs(item.arguments));\n return mcpRowPresentation(t, item, {\n tool: \"run_on\",\n icon: \"server\",\n title: targetName\n ? t(\"timeline.toolPresentation.runOnTargetname\", { targetName })\n : t(\"timeline.toolPresentation.runOn\"),\n runningPreview: opPreview,\n runningFallback: t(\"timeline.toolPresentation.running\"),\n settledPreview: opPreview,\n omitEmptyResult: true,\n });\n}\n\n/**\n * Finding machines, moving onto one and back, and using its screen, said the\n * way a person would describe it: \"Looked at the screen\", \"Typed “hello”\".\n */\nexport function machinePresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const leaf = mcpToolLeaf(item.name);\n const args = parseToolArgs(item.arguments);\n const action = leaf === \"computer_act\" ? computerActAction(args) : null;\n const preview = (action && computerActPreview(action)) ?? null;\n // A step that didn't work says so in words; the error itself stays one click\n // away in the row body instead of leaking a raw API payload into the preview.\n const failed =\n item.status !== \"running\" &&\n item.status !== \"cancelled\" &&\n (item.status === \"failed\" || unwrapMcpOutput(item.output).isError);\n return mcpRowPresentation(t, item, {\n tool: \"machine\",\n icon: genericToolIconKind(item.name),\n title: failed ? machineFailureTitle(t, leaf) : machineTitle(t, leaf, args, action, item.output),\n runningPreview: preview,\n runningFallback: t(\"timeline.toolPresentation.running\"),\n settledPreview: preview,\n settledFallback: t(\"timeline.toolPresentation.done\"),\n plainRunningPreview: true,\n quietError: true,\n });\n}\n\nfunction machineFailureTitle(t: OpenGeniText, leaf: string): string {\n switch (leaf) {\n case \"sandboxes_list\":\n return t(\"timeline.toolPresentation.couldNotLookForMachines\");\n case \"sandbox_swap\":\n return t(\"timeline.toolPresentation.couldNotMoveToTheMachine\");\n case \"computer_open\":\n return t(\"timeline.toolPresentation.couldNotOpenTheScreen\");\n default:\n return t(\"timeline.toolPresentation.couldNotUseTheScreen\");\n }\n}\n\n/** Direct screen-driver steps, named by what they did on the screen. */\nfunction cuaTitle(t: OpenGeniText, leaf: string): string {\n if (/^cua_(get_|list_|verify_|parse_|zoom$)/.test(leaf)) {\n return t(\"timeline.toolPresentation.lookedAtTheScreen\");\n }\n if (/^cua_(click|double_click|right_click)$/.test(leaf)) {\n return t(\"timeline.toolPresentation.clickedOnTheScreen\");\n }\n if (/^cua_(type_text|press_key|hotkey)$/.test(leaf)) {\n return t(\"timeline.toolPresentation.typedOnTheKeyboard\");\n }\n return t(\"timeline.toolPresentation.usedTheScreen\");\n}\n\ntype ComputerActAction = { type?: unknown; value?: unknown; locator?: unknown };\n\nfunction computerActAction(args: Record<string, unknown>): ComputerActAction | null {\n const action = args.action;\n return action && typeof action === \"object\" ? (action as ComputerActAction) : null;\n}\n\nfunction machineTitle(\n t: OpenGeniText,\n leaf: string,\n args: Record<string, unknown>,\n action: ComputerActAction | null,\n output: unknown,\n): string {\n switch (leaf) {\n case \"sandboxes_list\":\n return t(\"timeline.toolPresentation.lookedForMachines\");\n case \"interaction_discover\":\n return t(\"timeline.toolPresentation.lookedForScreens\");\n case \"sandbox_swap\": {\n if (args.target === \"session\") return t(\"timeline.toolPresentation.movedBack\");\n const targetName = runOnTargetName(output);\n return targetName\n ? t(\"timeline.toolPresentation.movedToTargetname\", { targetName })\n : t(\"timeline.toolPresentation.movedToAMachine\");\n }\n case \"computer_open\":\n return t(\"timeline.toolPresentation.openedTheScreen\");\n case \"computer_act\":\n return action?.type === \"pointer\"\n ? t(\"timeline.toolPresentation.clickedOnTheScreen\")\n : action?.type === \"keyboard\"\n ? t(\"timeline.toolPresentation.typedOnTheKeyboard\")\n : t(\"timeline.toolPresentation.usedTheScreen\");\n default:\n return leaf.startsWith(\"cua_\")\n ? cuaTitle(t, leaf)\n : t(\"timeline.toolPresentation.lookedAtTheScreen\");\n }\n}\n\n/** What a screen action typed or chose, when it says so: “hello”, “Save”. */\nfunction computerActPreview(action: ComputerActAction): string | undefined {\n const locator =\n action.locator && typeof action.locator === \"object\"\n ? (action.locator as { name?: unknown; text?: unknown })\n : undefined;\n const named =\n typeof locator?.name === \"string\"\n ? locator.name\n : typeof locator?.text === \"string\"\n ? locator.text\n : undefined;\n const shown = (\n action.type === \"keyboard\" && typeof action.value === \"string\" ? action.value : named\n )?.trim();\n if (!shown) return undefined;\n return `\\u201c${shown.length > 60 ? `${shown.slice(0, 59)}…` : shown}\\u201d`;\n}\n\n/**\n * Baseline craft for unmatched tools: family icon + title-cased leaf + honest\n * status preview (Running… / Done / error snippet).\n */\nexport function genericToolPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const goalPreview =\n goalToolPreview(item.name, parseToolArgs(item.arguments)) ??\n skillToolPreview(item) ??\n callUserPreview(t, item);\n const title = toolDisplayName(t, item.name, item.display, callStepPhase(item));\n if (item.status !== \"running\") {\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n const base = {\n tool: \"generic\" as const,\n icon: genericToolIconKind(item.name),\n title,\n };\n const args = parseToolArgs(item.arguments);\n // A permission Block is a decision, not a tool failure: say so plainly instead\n // of the generic \"error occurred, please try again\" wrapper.\n if (isError && BLOCKED_OUTPUT.test(outText)) {\n return {\n ...base,\n iconTone: \"muted\",\n chip: { tone: \"interrupted\", text: t(\"timeline.chip.blocked\") },\n preview: textPreview(t(\"timeline.toolPresentation.blockedByYourPermissionSettings\")),\n body: {\n kind: \"payloads\",\n note: t(\"timeline.toolPresentation.yourPermissionSettingsBlockThis\"),\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n // An interrupted approved action may have run. Never invite a blind retry.\n if (isError && UNCERTAIN_OUTPUT.test(outText)) {\n return {\n ...base,\n iconTone: \"failed\",\n chip: { tone: \"bad\", text: t(\"timeline.toolPresentation.outcomeUnknown\") },\n preview: textPreview(t(\"timeline.toolPresentation.itMayHaveRun\")),\n body: {\n kind: \"payloads\",\n note: t(\"timeline.toolPresentation.thisActionMayHaveRun\"),\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n }\n return mcpRowPresentation(t, item, {\n tool: \"generic\",\n icon: genericToolIconKind(item.name),\n title,\n runningPreview: goalPreview,\n runningFallback: t(\"timeline.toolPresentation.running\"),\n settledPreview: goalPreview,\n settledFallback: t(\"timeline.toolPresentation.done\"),\n plainRunningPreview: true,\n });\n}\n\n/** The runtime's exact refusal for a tool whose effective permission is Block. */\nconst BLOCKED_OUTPUT = /Connector action was not executed: blocked\\b/;\n\n/**\n * An agent calling the person: why while it rings, then how it ended\n * (\"No answer · Production is down\").\n */\nexport function callUserPreview(t: OpenGeniText, item: ToolCallItem): string | null {\n if (mcpToolLeaf(item.name) !== \"call_user\") return null;\n const args = parseToolArgs(item.arguments);\n const reason =\n args && typeof args === \"object\" && typeof (args as { reason?: unknown }).reason === \"string\"\n ? truncatePreview((args as { reason: string }).reason, 80)\n : null;\n if (item.status === \"running\") return reason;\n const result = tryParseJson(unwrapMcpOutput(item.output).text);\n const record = result && typeof result === \"object\" ? (result as Record<string, unknown>) : null;\n const outcome =\n record?.placed === false\n ? t(\"timeline.toolPresentation.callUser.notPlaced\")\n : record?.outcome === \"answered\"\n ? t(\"timeline.toolPresentation.callUser.answered\")\n : record?.outcome === \"declined\"\n ? t(\"timeline.toolPresentation.callUser.declined\")\n : record?.outcome === \"missed\"\n ? t(\"timeline.toolPresentation.callUser.missed\")\n : record?.outcome === \"cancelled\"\n ? t(\"timeline.toolPresentation.callUser.cancelled\")\n : null;\n if (outcome && reason) return `${outcome} · ${reason}`;\n return outcome ?? reason;\n}\n/** The runtime's refusal to guess whether an approved action ran. */\nconst UNCERTAIN_OUTPUT = /Connector action outcome is uncertain\\b/;\n\n/* ---- tool_search (progressive MCP disclosure) ------------------------------ */\n\nexport type DisclosedTool = {\n /** Full wire name (`server__leaf` or bare). */\n name: string;\n /** Server / namespace prefix before `__`, when present. */\n source: string | null;\n /** Leaf tool name after `__`. */\n leaf: string;\n};\n\nexport function splitToolWireName(name: string): DisclosedTool {\n const boundary = name.indexOf(\"__\");\n if (boundary <= 0) {\n return { name, source: null, leaf: name };\n }\n return {\n name,\n source: name.slice(0, boundary),\n leaf: name.slice(boundary + 2),\n };\n}\n\n/** Capability query from live tool_search args (object or JSON string). */\nexport function toolSearchQuery(item: ToolCallItem): string {\n const fromArgs = parseToolArgs(item.arguments);\n if (typeof fromArgs.query === \"string\" && fromArgs.query.trim()) {\n return fromArgs.query.trim();\n }\n const raw = item.raw;\n if (raw && typeof raw === \"object\") {\n const rawArgs = (raw as { arguments?: unknown }).arguments;\n if (typeof rawArgs === \"string\" && rawArgs.trim()) {\n const parsed = tryParseJson(rawArgs);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n const query = (parsed as { query?: unknown }).query;\n if (typeof query === \"string\" && query.trim()) {\n return query.trim();\n }\n }\n } else if (rawArgs && typeof rawArgs === \"object\" && !Array.isArray(rawArgs)) {\n const query = (rawArgs as { query?: unknown }).query;\n if (typeof query === \"string\" && query.trim()) {\n return query.trim();\n }\n }\n }\n return \"\";\n}\n\n/**\n * Parse disclosed tools from the runtime event shape.\n * `normalizeSdkEvent` collapses `tool_search_output.tools[]` into text:\n * \"Disclosed tools: a, b\" | \"No matching tools found.\"\n * Also accept a structured `tools` array when a host/enricher preserves it.\n */\nexport function parseDisclosedTools(output: unknown): DisclosedTool[] | null {\n if (output && typeof output === \"object\" && !Array.isArray(output)) {\n const tools = (output as { tools?: unknown }).tools;\n if (Array.isArray(tools)) {\n return tools\n .map((tool) => {\n if (typeof tool === \"string\" && tool.trim()) {\n return splitToolWireName(tool.trim());\n }\n if (\n tool &&\n typeof tool === \"object\" &&\n typeof (tool as { name?: unknown }).name === \"string\"\n ) {\n const name = (tool as { name: string }).name.trim();\n return name ? splitToolWireName(name) : null;\n }\n return null;\n })\n .filter((tool): tool is DisclosedTool => tool != null);\n }\n }\n\n const { text } = unwrapMcpOutput(output);\n const trimmed = text.trim();\n if (!trimmed) {\n return null;\n }\n if (/^no matching tools found\\.?$/i.test(trimmed)) {\n return [];\n }\n const disclosed = trimmed.match(/^disclosed tools:\\s*(.+)$/i);\n if (disclosed?.[1]) {\n return disclosed[1]\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean)\n .map(splitToolWireName);\n }\n const parsed = tryParseJson(trimmed);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parseDisclosedTools(parsed);\n }\n return null;\n}\n\nexport function toolSearchPreview(\n t: OpenGeniText,\n tools: DisclosedTool[] | null,\n cancelled: boolean,\n): string | undefined {\n if (cancelled) {\n return undefined;\n }\n if (!tools) {\n return t(\"timeline.toolPresentation.done\");\n }\n if (tools.length === 0) {\n return t(\"timeline.toolPresentation.noMatches\");\n }\n if (tools.length === 1) {\n return tools[0]!.leaf;\n }\n const head = tools[0]!.leaf;\n return t(\"timeline.toolPresentation.lengthToolsTruncatepreview\", {\n length: tools.length,\n truncatePreview: truncatePreview(head, 28),\n });\n}\n\nexport function toolSearchPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const query = toolSearchQuery(item);\n const queryPreview = query ? truncatePreview(query, 64) : \"\";\n const note = query ? `capability query: ${query}` : undefined;\n const args = parseToolArgs(item.arguments);\n const base = { tool: \"tool_search\" as const, icon: \"package-search\" as const };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n title: t(\"timeline.toolPresentation.lookingUpTools\"),\n running: true,\n preview: textPreview(\n queryPreview || t(\"timeline.toolPresentation.matchingCapabilities\"),\n true,\n ),\n body: {\n kind: \"listing\",\n note,\n entries: [],\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return {\n ...base,\n iconTone: \"failed\",\n title: t(\"timeline.toolPresentation.toolLookupFailed\"),\n failed: true,\n preview: textPreview(\n truncatePreview(outText, 80) || queryPreview || t(\"timeline.toolPresentation.lookupFailed\"),\n ),\n body: {\n kind: \"listing\",\n note,\n entries: [],\n blocks: [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.error\"), value: outText, failed: true },\n ],\n },\n };\n }\n const tools = parseDisclosedTools(item.output);\n const preview = toolSearchPreview(t, tools, item.status === \"cancelled\");\n return {\n ...base,\n iconTone: \"muted\",\n title: t(\"timeline.toolPresentation.lookedUpTools\"),\n detailPreview: true,\n cancelled: item.status === \"cancelled\",\n ...(preview ? { preview: textPreview(preview) } : {}),\n body: {\n kind: \"listing\",\n note,\n entries: (tools ?? []).slice(0, 12).map((tool) => ({\n key: tool.name,\n title: tool.leaf,\n eyebrow: tool.source,\n mono: true,\n })),\n more: tools && tools.length > 12 ? tools.length - 12 : undefined,\n empty:\n tools && tools.length === 0\n ? t(\"timeline.toolPresentation.noDeferredToolsMatchedThis\")\n : undefined,\n blocks:\n tools == null && outText\n ? [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.result\"), value: outText },\n ]\n : [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n}\n\n/* ---- docs / knowledge search ----------------------------------------------- */\n\nexport type SearchHit = { title: string; snippet: string };\n\nexport function parseSearchHits(t: OpenGeniText, outText: string): SearchHit[] | null {\n const parsed = tryParseJson(outText);\n if (parsed == null) {\n return null;\n }\n const list = Array.isArray(parsed)\n ? parsed\n : parsed &&\n typeof parsed === \"object\" &&\n Array.isArray((parsed as { results?: unknown }).results)\n ? (parsed as { results: unknown[] }).results\n : parsed && typeof parsed === \"object\" && Array.isArray((parsed as { hits?: unknown }).hits)\n ? (parsed as { hits: unknown[] }).hits\n : null;\n if (!list) {\n return null;\n }\n return list.map((row) => {\n const r = row && typeof row === \"object\" ? (row as Record<string, unknown>) : {};\n const title =\n (typeof r.title === \"string\" && r.title) ||\n (typeof r.name === \"string\" && r.name) ||\n (typeof r.documentTitle === \"string\" && r.documentTitle) ||\n (typeof r.path === \"string\" && r.path) ||\n (typeof r.id === \"string\" && r.id) ||\n t(\"timeline.toolPresentation.result\");\n const snippet =\n (typeof r.snippet === \"string\" && r.snippet) ||\n (typeof r.text === \"string\" && r.text) ||\n (typeof r.content === \"string\" && r.content) ||\n \"\";\n return { title, snippet: truncatePreview(snippet, 160) };\n });\n}\n\nexport function docsSearchPresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const query = typeof args.query === \"string\" ? args.query.trim() : \"\";\n const base = {\n tool: \"docs_search\" as const,\n icon: \"file-search\" as const,\n title: query\n ? t(\"timeline.toolPresentation.searchTruncatepreview\", {\n truncatePreview: truncatePreview(query, 48),\n })\n : toolDisplayName(t, item.name, item.display, callStepPhase(item)),\n };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(t(\"timeline.toolPresentation.searching\"), true),\n body: {\n kind: \"payloads\",\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return {\n ...base,\n iconTone: \"failed\",\n failed: true,\n preview: textPreview(\n truncatePreview(outText, 80) || t(\"timeline.toolPresentation.searchFailed\"),\n ),\n body: {\n kind: \"payloads\",\n blocks: [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.error\"), value: outText, failed: true },\n ],\n },\n };\n }\n const hits = parseSearchHits(t, outText);\n const preview =\n item.status === \"cancelled\"\n ? undefined\n : hits\n ? hits.length === 0\n ? t(\"timeline.toolPresentation.noHits\")\n : t(\"counts.hits\", { count: hits.length })\n : t(\"timeline.toolPresentation.done\");\n return {\n ...base,\n iconTone: \"muted\",\n cancelled: item.status === \"cancelled\",\n ...(preview ? { preview: textPreview(preview) } : {}),\n body: {\n kind: \"listing\",\n entries: (hits ?? []).slice(0, 8).map((hit) => ({\n key: `${hit.title}\\u0000${hit.snippet}`,\n title: hit.title,\n snippet: hit.snippet || undefined,\n })),\n blocks: [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.result\"), value: outText },\n ],\n },\n };\n}\n\n/* ---- set_session_title / set_other_session_title --------------------------- */\n\nexport function sessionTitlePresentation(t: OpenGeniText, item: ToolCallItem): ToolRowPresentation {\n const args = parseToolArgs(item.arguments);\n const titleArg = typeof args.title === \"string\" ? args.title.trim() : \"\";\n const previewTitle = titleArg ? truncatePreview(titleArg, 72) : \"\";\n const base = {\n tool: \"session_title\" as const,\n icon: genericToolIconKind(item.name),\n title: toolDisplayName(t, item.name, item.display, callStepPhase(item)),\n };\n if (item.status === \"running\") {\n return {\n ...base,\n iconTone: \"running\",\n running: true,\n preview: textPreview(previewTitle || t(\"timeline.toolPresentation.settingTitle\"), true),\n body: {\n kind: \"payloads\",\n blocks: [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n }\n const { text: outText, isError } = unwrapMcpOutput(item.output);\n if ((isError || item.status === \"failed\") && item.status !== \"cancelled\") {\n return {\n ...base,\n iconTone: \"failed\",\n failed: true,\n preview: textPreview(\n truncatePreview(outText, 80) || t(\"timeline.toolPresentation.renameFailed\"),\n ),\n body: {\n kind: \"payloads\",\n blocks: [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.error\"), value: outText, failed: true },\n ],\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 return {\n ...base,\n iconTone: \"muted\",\n cancelled: item.status === \"cancelled\",\n ...(item.status !== \"cancelled\" && settledTitle ? { preview: textPreview(settledTitle) } : {}),\n body: {\n kind: \"payloads\",\n blocks: outText\n ? [\n { label: t(\"timeline.toolPresentation.arguments\"), value: args },\n { label: t(\"timeline.toolPresentation.result\"), value: outText },\n ]\n : [{ label: t(\"timeline.toolPresentation.arguments\"), value: args }],\n },\n };\n}\n\n/* ---- resolution ------------------------------------------------------------ */\n\nconst PRESENTERS_BY_RAW_TYPE: Record<string, PresentedToolKind> = {\n apply_patch_call: \"apply_patch\",\n // Web renders these with richer media renderers; keep them off name matches.\n computer_call: \"generic\",\n tool_search_call: \"tool_search\",\n};\n\nconst PRESENTERS_BY_NAME: Record<string, PresentedToolKind> = {\n exec_command: \"exec\",\n request_human_input: \"ask\",\n run_on: \"run_on\",\n write_stdin: \"write_stdin\",\n apply_patch_call: \"apply_patch\",\n apply_patch: \"apply_patch\",\n web_search_call: \"web_search\",\n tool_search: \"tool_search\",\n search_documents: \"docs_search\",\n knowledge_search: \"docs_search\",\n set_session_title: \"session_title\",\n set_other_session_title: \"session_title\",\n sandboxes_list: \"machine\",\n sandbox_swap: \"machine\",\n computer_open: \"machine\",\n computer_observe: \"machine\",\n computer_act: \"machine\",\n interaction_discover: \"machine\",\n};\n\n/**\n * The phase a call's step name reads in. A call that finished with an error\n * result keeps the ongoing form (\"Sending a message\" · Error), like a failed one.\n */\nexport function callStepPhase(item: ToolCallItem): ToolStepPhase {\n if (item.status === \"complete\" && unwrapMcpOutput(item.output).isError) return \"running\";\n return toolStepPhase(item.status);\n}\n\n/**\n * A row reduced to what a person needs: the plain step, its status and any\n * human-readable result. Commands, arguments, output, diffs and JSON are left\n * out, and a row with nothing human left to show does not expand.\n */\nexport function plainToolRow(\n t: OpenGeniText,\n item: ToolCallItem,\n row: ToolRowPresentation,\n context: Pick<ToolPresentationContext, \"computeLabel\"> = {},\n): ToolRowPresentation {\n const { detailPreview: _detailPreview, titleMono: _titleMono, ...rest } = row;\n const plain: ToolRowPresentation = { ...rest, body: plainBody(row.body) };\n if (row.detailPreview) delete plain.preview;\n if (row.tool === \"exec\" || row.tool === \"write_stdin\") {\n const failed =\n row.iconTone === \"failed\" || row.chip?.tone === \"bad\" || item.status === \"failed\";\n // Plain rows name no files, links or tools taken from the command itself.\n plain.title = toolStepLabel(t, \"runCommand\", failed ? \"running\" : toolStepPhase(item.status));\n if (isConnectedMachineOutcomeUnknownOutput(item.output)) {\n // The call has ended, but its effects remain unknown. Keep that verdict\n // in the chip, with the explanation available without raw command output.\n return {\n ...plain,\n title: toolStepLabel(t, \"runCommand\", \"done\"),\n body: { kind: \"note\", tone: \"error\", text: t(\"toolActionReview.itMayHaveRunCheck\") },\n };\n }\n const computeLabel = context.computeLabel ?? null;\n if (computeLabel) plain.preview = textPreview(computeLabel, row.running);\n else delete plain.preview;\n if (row.chip?.tone === \"bad\") plain.chip = { tone: \"bad\", text: t(\"timeline.chip.failed\") };\n else delete plain.chip;\n } else if (row.tool === \"apply_patch\") {\n delete plain.preview;\n }\n return plain;\n}\n\nfunction plainBody(body: ToolBody): ToolBody {\n switch (body.kind) {\n case \"term\":\n case \"patch\":\n return { kind: \"none\" };\n case \"payloads\":\n return body.note ? { kind: \"note\", text: body.note } : { kind: \"none\" };\n case \"listing\": {\n // Mono entries are wire names (disclosed tools); plain rows keep readable hits only.\n const entries = body.entries.filter((entry) => !entry.mono);\n return entries.length ? { ...body, entries, blocks: [] } : { kind: \"none\" };\n }\n default:\n return body;\n }\n}\n\n/**\n * Resolve the shared presenter for a call with the web registry's precedence\n * (raw.type, exact name, MCP leaf). Tools whose web renderer is richer than the\n * shared model (computer use, media, knowledge receipts, …) resolve to\n * `generic`; non-DOM renderers may layer their own presenters on top.\n */\nexport function presentedToolKind(item: ToolCallItem): PresentedToolKind {\n const rawType = rawTypeOf(item);\n if (rawType && PRESENTERS_BY_RAW_TYPE[rawType]) {\n return PRESENTERS_BY_RAW_TYPE[rawType];\n }\n const exact = PRESENTERS_BY_NAME[item.name];\n if (exact) {\n return exact;\n }\n const leaf = mcpToolLeaf(item.name);\n if (leaf !== item.name && PRESENTERS_BY_NAME[leaf]) {\n return PRESENTERS_BY_NAME[leaf];\n }\n if (leaf.startsWith(\"cua_\")) {\n return \"machine\";\n }\n return \"generic\";\n}\n\n/** Presentations whose collapsed row reads correctly from an output preview. */\nconst PREVIEW_READABLE_KINDS: ReadonlySet<PresentedToolKind> = new Set([\n \"exec\",\n \"write_stdin\",\n \"apply_patch\",\n \"generic\",\n]);\n\n/**\n * Whether the shared presentation of `item` reads correctly while its output\n * is a bounded preview (`item.outputPreview`): long strings keep their head and\n * tail, so an exit code, a tail peek, a patch summary or an error snippet stay\n * right, and the body is shown only after the exact output is read. Every\n * other tool needs its exact output first. True for an exact output.\n */\nexport function presentsToolOutputPreview(item: ToolCallItem): boolean {\n if (!item.outputPreview) return true;\n if (item.outputPreview.shape !== \"structured\") return false;\n const shown = invokedToolCall(item);\n const kind = presentedToolKind(shown);\n if (!PREVIEW_READABLE_KINDS.has(kind)) return false;\n if (kind !== \"generic\") return true;\n // A generic row draws retained images from its result, and parses JSON\n // result text whole (an MCP `content[].text` included) for its error flag:\n // cut JSON would not parse.\n if (hasCutJsonText(shown.output, 0)) return false;\n return retainedToolResultImages(shown.output).images.length === 0;\n}\n\nconst OUTPUT_PREVIEW_OMISSION = / characters omitted from this preview\\]…\\n/u;\n\nfunction hasCutJsonText(value: unknown, depth: number): boolean {\n if (typeof value === \"string\") {\n return /^\\s*[[{]/u.test(value) && OUTPUT_PREVIEW_OMISSION.test(value);\n }\n if (depth >= 4 || value === null || typeof value !== \"object\") return false;\n const children = Array.isArray(value) ? value : Object.values(value);\n return children.some((child) => hasCutJsonText(child, depth + 1));\n}\n\nexport function toolRowPresentation(\n t: OpenGeniText,\n item: ToolCallItem,\n context: ToolPresentationContext = {},\n): ToolRowPresentation {\n item = invokedToolCall(item);\n const row = presentedToolRow(t, item, context);\n const presented = context.details === \"plain\" ? plainToolRow(t, item, row, context) : row;\n const shown = item.awaitingApproval\n ? awaitingApprovalRow(t, presented)\n : item.approvalRejected\n ? rejectedApprovalRow(t, presented, item.approvalRejected === \"automatic\")\n : presented;\n return redactRow(shown, item);\n}\n\n/**\n * A signature, token or key never shows on a row, whichever tool produced it\n * and wherever the text puts it: every string the row shows (title, preview,\n * command, output, payloads) is redacted, including any credential value\n * found anywhere in the call's arguments or output.\n */\nfunction redactRow(row: ToolRowPresentation, item: ToolCallItem): ToolRowPresentation {\n const values = signedValuesDeep([item.arguments, item.output, item.raw, row]);\n return redactDeep(row, values);\n}\n\n/** A call waiting for the person's approval has not run: say so, never \"Done\". */\nfunction awaitingApprovalRow(t: OpenGeniText, row: ToolRowPresentation): ToolRowPresentation {\n return {\n ...row,\n iconTone: \"accent\",\n running: false,\n chip: undefined,\n failed: false,\n cancelled: false,\n detailPreview: false,\n preview: textPreview(t(\"timeline.toolRenderers.waitingForYourApproval\")),\n };\n}\n\n/** A rejected call never ran: say so and by whom, never \"Done\" or \"Interrupted\". */\nfunction rejectedApprovalRow(\n t: OpenGeniText,\n row: ToolRowPresentation,\n automatic: boolean,\n): ToolRowPresentation {\n return {\n ...row,\n iconTone: \"muted\",\n running: false,\n chip: undefined,\n failed: false,\n cancelled: false,\n detailPreview: false,\n preview: textPreview(\n t(\n automatic\n ? \"timeline.toolRenderers.declinedAutomatically\"\n : \"timeline.toolRenderers.youRejectedThis\",\n ),\n ),\n };\n}\n\nfunction presentedToolRow(\n t: OpenGeniText,\n item: ToolCallItem,\n context: ToolPresentationContext,\n): ToolRowPresentation {\n switch (presentedToolKind(item)) {\n case \"exec\":\n return execPresentation(t, item, context);\n case \"write_stdin\":\n return writeStdinPresentation(t, item);\n case \"apply_patch\":\n return applyPatchPresentation(t, item) ?? genericToolPresentation(t, item);\n case \"web_search\":\n return webSearchPresentation(t, item);\n case \"ask\":\n return askPresentation(t, item);\n case \"run_on\":\n return runOnPresentation(t, item);\n case \"tool_search\":\n return toolSearchPresentation(t, item);\n case \"docs_search\":\n return docsSearchPresentation(t, item);\n case \"session_title\":\n return sessionTitlePresentation(t, item);\n case \"machine\":\n return machinePresentation(t, item);\n default:\n return genericToolPresentation(t, item);\n }\n}\n","import { type OpenGeniText } from \"../messages/runtime\";\n/** Decorative loading copy shared by every renderer of the preparing state. */\nexport const GENIE_PREPARING_PHRASES = (t: OpenGeniText): readonly string[] => [\n t(\"timeline.genieCopy.polishingTheLamp\"),\n t(\"timeline.genieCopy.consultingTheCarpet\"),\n t(\"timeline.genieCopy.untanglingWishes\"),\n t(\"timeline.genieCopy.summoningALittleCleverness\"),\n t(\"timeline.genieCopy.checkingTheFinePrintOn\"),\n t(\"timeline.genieCopy.warmingUpTheAbracadabra\"),\n t(\"timeline.genieCopy.rearrangingTheStars\"),\n t(\"timeline.genieCopy.negotiatingWithTheLamp\"),\n t(\"timeline.genieCopy.dustingOffAThousandYears\"),\n t(\"timeline.genieCopy.wishfulThinking\"),\n t(\"timeline.genieCopy.decantingALittleMagic\"),\n t(\"timeline.genieCopy.findingTheGoodStardust\"),\n t(\"timeline.genieCopy.fluffingTheMagicCarpet\"),\n t(\"timeline.genieCopy.puttingAWishIntoMotion\"),\n t(\"timeline.genieCopy.aLittleHocusALittle\"),\n];\nexport const GENIE_WAITING_PHRASES = (t: OpenGeniText): readonly string[] => [\n t(\"timeline.genieCopy.waitingForAResponse\"),\n];\n","// Pure turn-summary model shared by the web and native renderers: facet definitions,\n// the summary context, status types and duration formatting. No DOM, no styling.\nimport type { ReactNode } from \"react\";\nimport type { ActivityItem, ToolCallItem, TurnOutcome } from \"./types\";\nimport type { OpenGeniText } from \"../messages/runtime\";\n\nexport const BUILT_IN_TURN_SUMMARY_FACET_IDS = [\n \"steps\",\n \"files\",\n \"commands\",\n \"screenshots\",\n \"memories\",\n \"compacted\",\n \"duration\",\n] as const;\n\nexport type BuiltInTurnSummaryFacetId = (typeof BUILT_IN_TURN_SUMMARY_FACET_IDS)[number];\n\nexport type TurnSummaryContext = Readonly<{\n /** Every normalized activity item folded into this summary. */\n items: readonly ActivityItem[];\n /** Tool calls from `items`, retained in timeline order for convenient aggregation. */\n toolCalls: readonly ToolCallItem[];\n /** The settled turn verdict, or absent for a neutral/incomplete cluster. */\n outcome: TurnOutcome | undefined;\n /** The bounded failure reason rendered by the enclosing summary, when present. */\n failureText: string | undefined;\n /** Total turn duration when the enclosing group has both valid timestamps. */\n durationMs: number | undefined;\n /** False when any projected activity is still running or streaming. */\n settled: boolean;\n /**\n * Adjacent compaction landmarks next to this fold. Landmark remains the\n * primary UI; this is a secondary chip signal only.\n */\n contextCompactionCount: number;\n /** Text in the host's language, for facets that show words. */\n t: OpenGeniText;\n}>;\n\nexport type TurnSummaryFacetResult = Readonly<{\n icon?: ReactNode;\n content: ReactNode;\n ariaLabel?: string;\n title?: string;\n}>;\n\nexport type TurnSummaryFacet = Readonly<{\n /** Stable identity used for removal and deterministic de-duplication. */\n id: string;\n /** Return null when this facet has nothing useful to show. */\n summarize(context: TurnSummaryContext): TurnSummaryFacetResult | null;\n}>;\n\ntype ModifyTurnSummaryFacets = Readonly<{\n /** Appended after the remaining built-ins, in supplied order. */\n add?: readonly TurnSummaryFacet[];\n /** Built-ins to omit before custom facets are appended. */\n remove?: readonly BuiltInTurnSummaryFacetId[];\n replace?: never;\n}>;\n\ntype ReplaceTurnSummaryFacets = Readonly<{\n /** The complete ordered facet list. Mutually exclusive with add/remove. */\n replace: readonly TurnSummaryFacet[];\n add?: never;\n remove?: never;\n}>;\n\nexport type TurnSummaryFacetConfiguration = ModifyTurnSummaryFacets | ReplaceTurnSummaryFacets;\n\nexport type TurnSummaryOptions = Readonly<{\n /**\n * Readable per-turn presentation. Assistant progress stays fully formatted;\n * each turn has its own Working / Worked row and rolling latest step.\n * Ordinary tip-follow and manual scrolling are unchanged.\n */\n rolling?: boolean;\n facets?: TurnSummaryFacetConfiguration;\n}>;\n\n/**\n * Exchange status shown in place of the plain facet line. `working` and\n * `waiting` run a live clock from `since`; `worked` shows the settled span;\n * `paused` shows the work done before the pause, with its clock stopped.\n */\nexport type TurnSummaryStatus = Readonly<{\n kind: \"working\" | \"waiting\" | \"worked\" | \"paused\";\n /** Replaces the default \"Working\" / \"Waiting\" wording. */\n label?: string | undefined;\n /** Who the wait is on: `you` when it needs the reader. */\n waitingOn?: \"you\" | undefined;\n /** For a `worked` row folding quiet cycles: how many updates it spans. */\n updates?: number | undefined;\n /** Live clock start for `working` and `waiting`. */\n since?: string | undefined;\n /** Settled span for `worked`; work done before the pause for `paused`. */\n durationMs?: number | undefined;\n /** Live step preview under the row while it is collapsed. */\n preview?: ReactNode;\n /**\n * Guidance under the row that stays visible whether the fold is open or\n * closed, e.g. what a wait needs from the reader.\n */\n guidance?: ReactNode;\n}>;\n\n/** Elapsed wall time with seconds below an hour: \"14s\", \"2m 14s\", \"1h 05m\". */\n/**\n * The label of a turn row with no status line and no facets. Steps are not\n * counted, so the row still names what opening it reveals: \"Preparation\" when\n * it holds only startup phases (and no unloaded steps), else \"Steps\".\n */\nexport function turnSummaryFallbackLabel(\n t: OpenGeniText,\n items: readonly ActivityItem[],\n unloadedSteps = false,\n): string {\n // Progress notes narrate steps; they are not steps themselves.\n const preparationOnly =\n !unloadedSteps &&\n items.some((item) => item.kind === \"startup-phase\") &&\n items.every((item) => item.kind === \"startup-phase\" || item.kind === \"agent-message\");\n return preparationOnly ? t(\"timeline.turnSummary.preparation\") : t(\"timeline.turnSummary.steps\");\n}\n\nexport function formatElapsed(t: OpenGeniText, durationMs: number): string {\n const totalSeconds = Math.max(0, Math.floor(durationMs / 1000));\n if (totalSeconds < 60) {\n return t(\"timeline.turnSummaryModel.seconds\", { count: totalSeconds });\n }\n const totalMinutes = Math.floor(totalSeconds / 60);\n if (totalMinutes < 60) {\n const seconds = totalSeconds % 60;\n return seconds\n ? t(\"timeline.turnSummaryModel.minutesSeconds\", { minutes: totalMinutes, seconds })\n : t(\"timeline.turnSummaryModel.minutes\", { count: totalMinutes });\n }\n return formatHoursOrDays(t, totalMinutes);\n}\n\n/** \"1h 05m\" below a day, \"2d 03h\" from a day on, so long waits stay readable. */\nfunction formatHoursOrDays(t: OpenGeniText, totalMinutes: number): string {\n const totalHours = Math.floor(totalMinutes / 60);\n if (totalHours < 24) {\n return t(\"timeline.turnSummaryModel.hoursMinutes\", {\n hours: totalHours,\n minutes: String(totalMinutes % 60).padStart(2, \"0\"),\n });\n }\n return t(\"timeline.turnSummaryModel.daysHours\", {\n days: Math.floor(totalHours / 24),\n hours: String(totalHours % 24).padStart(2, \"0\"),\n });\n}\n\nexport function createTurnSummaryContext(\n t: OpenGeniText,\n items: ActivityItem[],\n outcome: TurnOutcome | undefined,\n failureText: string | undefined,\n durationMs: number | undefined,\n contextCompactionCount: number,\n): TurnSummaryContext {\n const itemSnapshot = Object.freeze([...items]);\n const toolCalls = Object.freeze(\n itemSnapshot.filter((item): item is ToolCallItem => item.kind === \"tool-call\"),\n );\n const settled = itemSnapshot.every((item) => {\n if (item.kind === \"reasoning\" || item.kind === \"agent-message\") {\n return !item.streaming;\n }\n if (\n item.kind === \"tool-call\" ||\n item.kind === \"worker\" ||\n item.kind === \"sandbox\" ||\n item.kind === \"startup-phase\"\n ) {\n return item.status !== \"running\";\n }\n return true;\n });\n return Object.freeze({\n t,\n items: itemSnapshot,\n toolCalls,\n outcome,\n failureText,\n durationMs,\n settled,\n contextCompactionCount: Math.max(0, Math.floor(contextCompactionCount)),\n });\n}\n\n// Step, file, command and screenshot counts are not shown: conversation-first\n// history does not load a turn's steps until the turn is opened, so a count\n// would cost a read on every open. Their ids remain accepted by `remove`.\nexport const BUILT_IN_TURN_SUMMARY_FACETS: readonly TurnSummaryFacet[] = Object.freeze([\n {\n id: \"memories\",\n summarize: ({ items, t }) => {\n let saved = 0;\n let updated = 0;\n for (const item of items) {\n if (item.kind !== \"memory\") {\n continue;\n }\n if (item.variant === \"corrected\") {\n updated += 1;\n } else {\n saved += 1;\n }\n }\n const parts: string[] = [];\n if (saved) {\n parts.push(t(\"timeline.turnSummaryModel.memoriesSaved\", { count: saved }));\n }\n if (updated) {\n parts.push(t(\"timeline.turnSummaryModel.memoriesUpdated\", { count: updated }));\n }\n return parts.length > 0 ? { content: parts.join(\" · \") } : null;\n },\n },\n {\n id: \"compacted\",\n summarize: ({ contextCompactionCount, t }) =>\n contextCompactionCount > 0\n ? {\n content: t(\"timeline.turnSummaryModel.compacts\", { count: contextCompactionCount }),\n ariaLabel: t(\"timeline.turnSummaryModel.compactions\", {\n count: contextCompactionCount,\n }),\n }\n : null,\n },\n {\n id: \"duration\",\n summarize: ({ durationMs, t }) => {\n const duration = formatDurationFacet(t, durationMs);\n return duration ? { content: duration } : null;\n },\n },\n]);\n\nexport function resolveTurnSummaryFacets(\n configuration: TurnSummaryFacetConfiguration | undefined,\n): readonly TurnSummaryFacet[] {\n const requested: readonly TurnSummaryFacet[] = configuration?.replace ?? [\n ...BUILT_IN_TURN_SUMMARY_FACETS.filter(\n (facet) => !configuration?.remove?.includes(facet.id as BuiltInTurnSummaryFacetId),\n ),\n ...(configuration?.add ?? []),\n ];\n const seen = new Set<string>();\n return requested.filter((facet) => {\n if (!facet.id || seen.has(facet.id)) {\n return false;\n }\n seen.add(facet.id);\n return true;\n });\n}\n\nexport function formatDurationFacet(\n t: OpenGeniText,\n durationMs: number | undefined,\n): string | null {\n if (durationMs === undefined || !Number.isFinite(durationMs) || durationMs < 1000) {\n return null;\n }\n const totalSeconds = Math.floor(durationMs / 1000);\n if (totalSeconds < 60) {\n return t(\"timeline.turnSummaryModel.seconds\", { count: totalSeconds });\n }\n const totalMinutes = Math.floor(totalSeconds / 60);\n if (totalMinutes < 60) {\n return t(\"timeline.turnSummaryModel.minutes\", { count: totalMinutes });\n }\n return formatHoursOrDays(t, totalMinutes);\n}\n\nfunction hasFacetContent(content: ReactNode): boolean {\n return content !== null && content !== undefined && content !== false && content !== \"\";\n}\n\n/**\n * The facets a turn header shows. With a readable status line, duration lives in\n * the status, and a live or waiting status shows no built-in facets. A failing\n * custom facet is skipped rather than breaking the header.\n */\nexport function selectTurnSummaryFacets(\n definitions: readonly TurnSummaryFacet[],\n context: TurnSummaryContext,\n statusKind: TurnSummaryStatus[\"kind\"] | undefined,\n): Array<{ facet: TurnSummaryFacet; result: TurnSummaryFacetResult }> {\n return definitions.flatMap((facet) => {\n if (\n statusKind &&\n (facet.id === \"duration\" ||\n (statusKind !== \"worked\" &&\n BUILT_IN_TURN_SUMMARY_FACET_IDS.includes(facet.id as BuiltInTurnSummaryFacetId)))\n ) {\n return [];\n }\n try {\n const result = facet.summarize(context);\n return result && hasFacetContent(result.content) ? [{ facet, result }] : [];\n } catch {\n return [];\n }\n });\n}\n"],"mappings":"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","names":[]}