@agent-native/core 0.91.2 → 0.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +17 -0
  3. package/corpus/core/docs/content/faq.mdx +17 -0
  4. package/corpus/core/docs/content/notifications.mdx +12 -6
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/agent/production-agent.ts +140 -46
  7. package/corpus/core/src/agent/tool-search.ts +71 -4
  8. package/corpus/core/src/cli/index.ts +20 -0
  9. package/corpus/core/src/cli/upgrade.ts +798 -0
  10. package/corpus/core/src/client/AssistantChat.tsx +1 -1
  11. package/corpus/core/src/client/HighlightedCodeBlock.tsx +20 -3
  12. package/corpus/core/src/client/agent-chat-adapter.ts +31 -6
  13. package/corpus/core/src/client/chat/message-components.tsx +85 -8
  14. package/corpus/core/src/client/chat/tool-call-display.tsx +355 -144
  15. package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -9
  16. package/corpus/core/src/client/session-replay.ts +3 -97
  17. package/corpus/core/src/client/settings/SettingsPanel.tsx +533 -389
  18. package/corpus/core/src/client/settings/SettingsSection.tsx +154 -17
  19. package/corpus/core/src/client/sse-event-processor.ts +29 -2
  20. package/corpus/core/src/extensions/actions.ts +113 -5
  21. package/corpus/core/src/notifications/channels.ts +88 -25
  22. package/corpus/core/src/notifications/registry.ts +17 -3
  23. package/corpus/core/src/notifications/types.ts +4 -1
  24. package/corpus/core/src/server/agent-chat-plugin.ts +7 -3
  25. package/corpus/core/src/server/request-context.ts +7 -0
  26. package/corpus/core/src/styles/agent-conversation.css +1 -1
  27. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  28. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  29. package/corpus/core/src/templates/default/AGENTS.md +10 -3
  30. package/corpus/core/src/templates/default/package.json +2 -1
  31. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  32. package/corpus/core/src/templates/headless/AGENTS.md +9 -3
  33. package/corpus/core/src/templates/headless/package.json +1 -0
  34. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  35. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  36. package/corpus/core/src/templates/workspace-root/AGENTS.md +10 -4
  37. package/corpus/core/src/templates/workspace-root/package.json +1 -0
  38. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +20 -2
  39. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +5 -6
  40. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  41. package/corpus/templates/analytics/AGENTS.md +7 -5
  42. package/corpus/templates/analytics/actions/save-monitor.ts +14 -0
  43. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +41 -6
  44. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +122 -11
  45. package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +8 -2
  46. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +151 -32
  47. package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +17 -2
  48. package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +4 -0
  49. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +54 -190
  50. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-tables-keep-their-size-while-loading.md +6 -0
  51. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-uptime-and-errors-tabs-now-clearly-show-which-view-is-active.md +6 -0
  52. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-uses-stock-rrweb-sizing-again-so-recorded.md +6 -0
  53. package/corpus/templates/analytics/changelog/2026-07-08-sidebar-dashboard-menus-now-open-above-the-dashboard-canvas.md +6 -0
  54. package/corpus/templates/analytics/changelog/2026-07-08-uptime-alerting-clarifies-in-app-inbox-vs-email-and-lets-you-paste-slack-or-webhook-urls-per-monitor.md +6 -0
  55. package/corpus/templates/analytics/docs/uptime-monitoring.md +13 -11
  56. package/corpus/templates/analytics/server/db/schema-monitoring.ts +4 -0
  57. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +60 -12
  58. package/corpus/templates/analytics/server/plugins/db.ts +10 -0
  59. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +20 -2
  60. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  61. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +20 -2
  62. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  63. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +20 -2
  64. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  65. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +20 -2
  66. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  67. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +20 -2
  68. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  69. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-notes-stay-active-from-tray-and-shortcut-controls.md +6 -0
  70. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-popovers-can-start-notes-and-join-the-meetin.md +6 -0
  71. package/corpus/templates/clips/changelog/2026-07-08-meeting-notes-keep-their-recording-state-when-the-desktop.md +6 -0
  72. package/corpus/templates/clips/changelog/2026-07-08-meeting-reminder-dropdowns-now-expand-fully-instead-of-being.md +6 -0
  73. package/corpus/templates/clips/desktop/src/app.tsx +123 -3
  74. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +15 -1
  75. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -0
  76. package/corpus/templates/clips/desktop/src/styles.css +23 -1
  77. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +1 -3
  78. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +40 -6
  79. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -2
  80. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +3 -5
  81. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +23 -19
  82. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +3 -3
  83. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +0 -1
  84. package/corpus/templates/clips/desktop/src-tauri/src/state.rs +5 -0
  85. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -6
  86. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +20 -2
  87. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  88. package/corpus/templates/content/actions/_batch-utils.ts +8 -0
  89. package/corpus/templates/content/actions/_builder-cms-read-client.ts +7 -5
  90. package/corpus/templates/content/actions/_database-source-utils.ts +776 -319
  91. package/corpus/templates/content/actions/_database-utils.ts +6 -1
  92. package/corpus/templates/content/actions/_property-utils.ts +168 -0
  93. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +19 -12
  94. package/corpus/templates/content/actions/bind-content-database-source-field.ts +19 -12
  95. package/corpus/templates/content/actions/delete-document.ts +9 -13
  96. package/corpus/templates/content/actions/refresh-content-database-source.ts +5 -5
  97. package/corpus/templates/content/app/components/editor/body-hydration.ts +35 -11
  98. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +47 -5
  99. package/corpus/templates/content/app/hooks/use-documents.ts +8 -2
  100. package/corpus/templates/content/changelog/2026-07-08-builder-source-sync-now-completes-reliably-on-hosted-databases.md +6 -0
  101. package/corpus/templates/content/changelog/2026-07-08-fixed-builder-database-sync-so-large-sources-continue-past-t.md +6 -0
  102. package/corpus/templates/content/server/plugins/db.ts +19 -0
  103. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +20 -2
  104. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  105. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +20 -2
  106. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  107. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +20 -2
  108. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  109. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  110. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +20 -2
  111. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  112. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +20 -2
  113. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  114. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +20 -2
  115. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  116. package/corpus/templates/videos/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  117. package/corpus/templates/voice/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  118. package/dist/agent/production-agent.d.ts +5 -1
  119. package/dist/agent/production-agent.d.ts.map +1 -1
  120. package/dist/agent/production-agent.js +112 -42
  121. package/dist/agent/production-agent.js.map +1 -1
  122. package/dist/agent/tool-search.d.ts +2 -0
  123. package/dist/agent/tool-search.d.ts.map +1 -1
  124. package/dist/agent/tool-search.js +60 -4
  125. package/dist/agent/tool-search.js.map +1 -1
  126. package/dist/cli/index.js +19 -0
  127. package/dist/cli/index.js.map +1 -1
  128. package/dist/cli/upgrade.d.ts +100 -0
  129. package/dist/cli/upgrade.d.ts.map +1 -0
  130. package/dist/cli/upgrade.js +678 -0
  131. package/dist/cli/upgrade.js.map +1 -0
  132. package/dist/client/AssistantChat.js +1 -1
  133. package/dist/client/AssistantChat.js.map +1 -1
  134. package/dist/client/HighlightedCodeBlock.d.ts +2 -0
  135. package/dist/client/HighlightedCodeBlock.d.ts.map +1 -1
  136. package/dist/client/HighlightedCodeBlock.js +10 -1
  137. package/dist/client/HighlightedCodeBlock.js.map +1 -1
  138. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  139. package/dist/client/agent-chat-adapter.js +32 -4
  140. package/dist/client/agent-chat-adapter.js.map +1 -1
  141. package/dist/client/chat/message-components.d.ts.map +1 -1
  142. package/dist/client/chat/message-components.js +61 -8
  143. package/dist/client/chat/message-components.js.map +1 -1
  144. package/dist/client/chat/tool-call-display.d.ts +12 -0
  145. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  146. package/dist/client/chat/tool-call-display.js +136 -42
  147. package/dist/client/chat/tool-call-display.js.map +1 -1
  148. package/dist/client/code-agent-chat-adapter.js +2 -9
  149. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  150. package/dist/client/session-replay.d.ts +0 -8
  151. package/dist/client/session-replay.d.ts.map +1 -1
  152. package/dist/client/session-replay.js +3 -80
  153. package/dist/client/session-replay.js.map +1 -1
  154. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  155. package/dist/client/settings/SettingsPanel.js +52 -19
  156. package/dist/client/settings/SettingsPanel.js.map +1 -1
  157. package/dist/client/settings/SettingsSection.d.ts +19 -4
  158. package/dist/client/settings/SettingsSection.d.ts.map +1 -1
  159. package/dist/client/settings/SettingsSection.js +33 -4
  160. package/dist/client/settings/SettingsSection.js.map +1 -1
  161. package/dist/client/sse-event-processor.d.ts +9 -0
  162. package/dist/client/sse-event-processor.d.ts.map +1 -1
  163. package/dist/client/sse-event-processor.js +20 -2
  164. package/dist/client/sse-event-processor.js.map +1 -1
  165. package/dist/collab/routes.d.ts +1 -1
  166. package/dist/extensions/actions.d.ts.map +1 -1
  167. package/dist/extensions/actions.js +85 -5
  168. package/dist/extensions/actions.js.map +1 -1
  169. package/dist/notifications/channels.d.ts +8 -3
  170. package/dist/notifications/channels.d.ts.map +1 -1
  171. package/dist/notifications/channels.js +61 -22
  172. package/dist/notifications/channels.js.map +1 -1
  173. package/dist/notifications/registry.d.ts.map +1 -1
  174. package/dist/notifications/registry.js +14 -3
  175. package/dist/notifications/registry.js.map +1 -1
  176. package/dist/notifications/routes.d.ts +1 -1
  177. package/dist/notifications/types.d.ts +4 -1
  178. package/dist/notifications/types.d.ts.map +1 -1
  179. package/dist/notifications/types.js.map +1 -1
  180. package/dist/observability/routes.d.ts +1 -1
  181. package/dist/resources/handlers.d.ts +1 -1
  182. package/dist/server/agent-chat-plugin.d.ts +5 -1
  183. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  184. package/dist/server/agent-chat-plugin.js +2 -2
  185. package/dist/server/agent-chat-plugin.js.map +1 -1
  186. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  187. package/dist/server/request-context.d.ts +7 -0
  188. package/dist/server/request-context.d.ts.map +1 -1
  189. package/dist/server/request-context.js.map +1 -1
  190. package/dist/styles/agent-conversation.css +1 -1
  191. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  192. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  193. package/dist/templates/default/AGENTS.md +10 -3
  194. package/dist/templates/default/package.json +2 -1
  195. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  196. package/dist/templates/headless/AGENTS.md +9 -3
  197. package/dist/templates/headless/package.json +1 -0
  198. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  199. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  200. package/dist/templates/workspace-root/AGENTS.md +10 -4
  201. package/dist/templates/workspace-root/package.json +1 -0
  202. package/docs/content/faq.mdx +17 -0
  203. package/docs/content/notifications.mdx +12 -6
  204. package/package.json +2 -2
  205. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  206. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  207. package/src/templates/default/AGENTS.md +10 -3
  208. package/src/templates/default/package.json +2 -1
  209. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  210. package/src/templates/headless/AGENTS.md +9 -3
  211. package/src/templates/headless/package.json +1 -0
  212. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  213. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  214. package/src/templates/workspace-root/AGENTS.md +10 -4
  215. package/src/templates/workspace-root/package.json +1 -0
  216. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-clamps-ultra-wide-viewports-while-keeping-the.md +0 -6
@@ -1 +1 @@
1
- {"version":3,"file":"message-components.d.ts","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAqCxE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAc7D;AAID,UAAU,yBAAyB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAqBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,yBAAyB,GAAG,IAAI,CAyClC;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,SAAS,GACV,EAAE;IACD,SAAS,EAAE,yBAAyB,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBAYA;AAID,wBAAgB,qBAAqB,6BAgEpC;AAID,eAAO,MAAM,iBAAiB;YACpB,MAAM;aACL,OAAO;eACL,MAAM;SACJ,CAAC;AAEhB,eAAO,MAAM,qBAAqB;iBACnB,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;SAC9C,CAAC;AAIhB,wBAAgB,mBAAmB,sBA+BlC;AAwMD,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,QAAQ,GACT,GAAE;IACD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,qBAiIL;AAID,wBAAgB,WAAW,6BA2I1B;AA4BD,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAO3E;AAED,wBAAgB,gCAAgC,CAAC,EAC/C,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CAMV;AAED,wBAAgB,gBAAgB,6BA8L/B;AAID,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,qBAMjE;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAkB,GACnB,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,qBAWzB"}
1
+ {"version":3,"file":"message-components.d.ts","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":"AAwCA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAuCxE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAc7D;AAID,UAAU,yBAAyB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAqBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,yBAAyB,GAAG,IAAI,CAyClC;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,SAAS,GACV,EAAE;IACD,SAAS,EAAE,yBAAyB,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBAYA;AAID,wBAAgB,qBAAqB,6BAgEpC;AAID,eAAO,MAAM,iBAAiB;YACpB,MAAM;aACL,OAAO;eACL,MAAM;SACJ,CAAC;AAEhB,eAAO,MAAM,qBAAqB;iBACnB,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;SAC9C,CAAC;AAIhB,wBAAgB,mBAAmB,sBA+BlC;AAwMD,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,QAAQ,GACT,GAAE;IACD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,qBAiIL;AAID,wBAAgB,WAAW,6BA2I1B;AA4BD,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAO3E;AAED,wBAAgB,gCAAgC,CAAC,EAC/C,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CAMV;AAiBD,wBAAgB,gBAAgB,6BAyP/B;AAID,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,qBAMjE;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAkB,GACnB,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,qBAWzB"}
@@ -2,7 +2,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
2
2
  // Owns: message-timestamp helpers, SelectionAttachedPill, UserMessage,
3
3
  // AssistantMessage, MessageBranchPicker, CheckpointContext, MessageActionsContext,
4
4
  // RunningActivityStatus, ThinkingIndicator, and displayableUserMessageText.
5
- import { useThread, useMessageRuntime, useComposer, MessagePrimitive, ActionBarPrimitive, BranchPickerPrimitive, ComposerPrimitive, } from "@assistant-ui/react";
5
+ import { useThread, useMessageRuntime, useComposer, MessagePrimitive, ActionBarPrimitive, BranchPickerPrimitive, ComposerPrimitive, useMessagePartReasoning, } from "@assistant-ui/react";
6
6
  import { IconX, IconCheck, IconCopy, IconChevronDown, IconChevronLeft, IconChevronRight, IconDots, IconGitFork, IconId, IconQuote, IconRefresh, IconArrowBackUp, IconFile, IconFolder, IconFileText, IconCheckbox, IconMail, IconUser, IconPresentation, IconStack2, IconMessageChatbot, IconPencil, IconLoader2, } from "@tabler/icons-react";
7
7
  import React, { useState, useEffect, useCallback, useRef } from "react";
8
8
  import { getActiveRun } from "../active-run-state.js";
@@ -15,7 +15,7 @@ import { PastedTextChip } from "../composer/PastedTextChip.js";
15
15
  import { ThumbsFeedback } from "../observability/ThumbsFeedback.js";
16
16
  import { cn } from "../utils.js";
17
17
  import { MarkdownText } from "./markdown-renderer.js";
18
- import { ToolCallFallback, FilesChangedSummary, ChatRunningContext, } from "./tool-call-display.js";
18
+ import { ToolCallFallback, FilesChangedSummary, ChatRunningContext, ReasoningCell, WorkedForSummary, } from "./tool-call-display.js";
19
19
  // ─── Pending selection context key ───────────────────────────────────────────
20
20
  // Mirrored from AssistantChat to avoid a cross-import on a private constant.
21
21
  const PENDING_SELECTION_KEY = "pending-selection-context";
@@ -380,7 +380,7 @@ function assistantMessageHasRenderableContent(message) {
380
380
  if (!part || typeof part !== "object")
381
381
  return false;
382
382
  const type = part.type;
383
- if (type === "text") {
383
+ if (type === "text" || type === "reasoning") {
384
384
  const text = part.text;
385
385
  return typeof text === "string" && text.trim().length > 0;
386
386
  }
@@ -412,6 +412,17 @@ export function shouldShowAssistantMessageFooter({ isLast, chatRunning, hasRende
412
412
  return false;
413
413
  return !chatRunning && statusIsTerminal;
414
414
  }
415
+ function ReasoningMessagePart() {
416
+ const part = useMessagePartReasoning();
417
+ const isStreaming = part.status?.type === "running";
418
+ return _jsx(ReasoningCell, { text: part.text, isStreaming: isStreaming });
419
+ }
420
+ function groupAssistantWorkParts(part) {
421
+ if (part.type === "reasoning" || part.type === "tool-call") {
422
+ return ["group-work"];
423
+ }
424
+ return null;
425
+ }
415
426
  export function AssistantMessage() {
416
427
  const [restoreState, setRestoreState] = useState("idle");
417
428
  const messageRuntime = useMessageRuntime();
@@ -431,6 +442,33 @@ export function AssistantMessage() {
431
442
  hasUnresolvedTool,
432
443
  });
433
444
  const cpCtx = React.useContext(CheckpointContext);
445
+ // Capture live run duration when this message finishes streaming.
446
+ const runStartedAtRef = useRef(null);
447
+ const [capturedDurationMs, setCapturedDurationMs] = useState(null);
448
+ useEffect(() => {
449
+ if (chatRunning && isLast) {
450
+ if (runStartedAtRef.current == null) {
451
+ runStartedAtRef.current = Date.now();
452
+ }
453
+ return;
454
+ }
455
+ if (!chatRunning &&
456
+ isLast &&
457
+ runStartedAtRef.current != null &&
458
+ capturedDurationMs == null) {
459
+ setCapturedDurationMs(Date.now() - runStartedAtRef.current);
460
+ runStartedAtRef.current = null;
461
+ }
462
+ }, [chatRunning, isLast, capturedDurationMs]);
463
+ // Animate collapse only when this message just finished running in-session.
464
+ const wasRunningRef = useRef(false);
465
+ const [animateCollapse, setAnimateCollapse] = useState(false);
466
+ useEffect(() => {
467
+ if (wasRunningRef.current && !chatRunning && isComplete && isLast) {
468
+ setAnimateCollapse(true);
469
+ }
470
+ wasRunningRef.current = chatRunning && isLast;
471
+ }, [chatRunning, isComplete, isLast]);
434
472
  const handleRestore = useCallback(async () => {
435
473
  if (restoreState === "idle") {
436
474
  setRestoreState("confirming");
@@ -486,13 +524,28 @@ export function AssistantMessage() {
486
524
  p.structuredMeta &&
487
525
  (p.structuredMeta.toolKind === "edit" ||
488
526
  p.structuredMeta.toolKind === "write"));
527
+ const hasCollapsibleWork = Array.isArray(msgContent) &&
528
+ msgContent.some((p) => p.type === "reasoning" ||
529
+ (p.type === "tool-call" && p.activity !== true));
489
530
  if (!hasRenderableContent)
490
531
  return null;
491
- return (_jsxs("div", { className: "group relative", style: { contentVisibility: isComplete ? "auto" : "visible" }, children: [_jsxs("div", { className: "w-full max-w-[95%] text-sm leading-relaxed text-foreground", children: [_jsx(MessagePrimitive.Parts, { components: {
492
- Text: MarkdownText,
493
- tools: {
494
- Fallback: ToolCallFallback,
495
- },
532
+ return (_jsxs("div", { className: "group relative", style: { contentVisibility: isComplete ? "auto" : "visible" }, children: [_jsxs("div", { className: "w-full max-w-[95%] text-sm leading-relaxed text-foreground", children: [_jsx(MessagePrimitive.GroupedParts, { groupBy: groupAssistantWorkParts, children: ({ part, children }) => {
533
+ switch (part.type) {
534
+ case "group-work": {
535
+ const showSummary = isComplete && !chatRunning && hasCollapsibleWork;
536
+ if (!showSummary)
537
+ return _jsx(_Fragment, { children: children });
538
+ return (_jsx(WorkedForSummary, { durationMs: capturedDurationMs, autoCollapse: animateCollapse, children: children }));
539
+ }
540
+ case "text":
541
+ return _jsx(MarkdownText, {});
542
+ case "reasoning":
543
+ return _jsx(ReasoningMessagePart, {});
544
+ case "tool-call":
545
+ return part.toolUI ?? _jsx(ToolCallFallback, { ...part });
546
+ default:
547
+ return null;
548
+ }
496
549
  } }), isComplete && hasCodeAgentTools && msgContent && (_jsx(FilesChangedSummary, { parts: msgContent })), isLast && hasUnresolvedTool && !chatRunning && (_jsx(RunningActivityStatus, { label: "Thinking" }))] }), isComplete && (_jsxs("div", { className: "mt-1 flex items-center justify-between", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-1", children: [_jsx(MessageActionsMenu, { showRevert: showRestore && restoreState === "idle", onRevert: handleRestore }), isLast && (_jsx(TooltipProvider, { delayDuration: 400, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(ActionBarPrimitive.Reload, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Regenerate response", className: "flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 disabled:cursor-not-allowed disabled:opacity-40", children: _jsx(IconRefresh, { className: "h-3.5 w-3.5" }) }) }) }), _jsx(TooltipContent, { side: "top", className: "text-xs", children: "Regenerate response" })] }) })), _jsx(MessageBranchPicker, {}), timestamp && (_jsx(MessageTimestamp, { timestamp: timestamp, className: "opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100" }))] }), showRestore && restoreState === "confirming" ? (_jsxs("div", { className: "flex items-center gap-1 text-xs", children: [_jsx("button", { onClick: handleRestore, className: "rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90", children: "Restore to here?" }), _jsx("button", { onClick: cancelRestore, className: "rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent", children: "Cancel" })] })) : showRestore && restoreState === "restoring" ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" }), "Restoring..."] })) : (_jsx(ThumbsFeedback, { threadId: cpCtx?.threadId ?? "", runId: (() => {
497
550
  const meta = messageRuntime.getState().metadata;
498
551
  return ((typeof meta?.custom?.runId === "string" &&
@@ -1 +1 @@
1
- {"version":3,"file":"message-components.js","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":";AAAA,uEAAuE;AACvE,mFAAmF;AACnF,4EAA4E;AAE5E,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,KAAK,EACL,SAAS,EACT,QAAQ,EACR,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,MAAM,EACN,SAAS,EACT,WAAW,EACX,eAAe,EACf,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,OAAO,EACP,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAEhC,gFAAgF;AAChF,6EAA6E;AAC7E,MAAM,qBAAqB,GAAG,2BAA2B,CAAC;AAE1D,iFAAiF;AAEjF,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,OAAO,IAAI;SACR,OAAO,CAAC,0CAA0C,EAAE,EAAE,CAAC;SACvD,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC;SACzC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,MAAM,IAAI,GAAI,OAAkC,EAAE,QAOrC,CAAC;IACd,OAAO,CACL,IAAI,EAAE,MAAM,EAAE,4BAA4B,KAAK,IAAI;QACnD,IAAI,EAAE,MAAM,EAAE,yBAAyB,KAAK,UAAU;QACtD,IAAI,EAAE,MAAM,EAAE,yBAAyB,KAAK,OAAO,CACpD,CAAC;AACJ,CAAC;AASD,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACtD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAO,EAAE,CAAO;IACzC,OAAO,CACL,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE;QACnC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE;QAC7B,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAc;IAEd,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE;QAC9C,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhB,IAAI,KAAa,CAAC;IAClB,IAAI,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;SAAM,IAAI,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;QAC9C,KAAK,GAAG,aAAa,IAAI,EAAE,CAAC;IAC9B,CAAC;SAAM,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACpD,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE;YAC5C,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;SACf,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE;YAC5C,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,KAAK;QACL,IAAI,EAAE,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE;YACvC,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,SAAS,EACT,SAAS,GAIV;IACC,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,gDAAgD,EAChD,SAAS,CACV,EACD,KAAK,EAAE,SAAS,CAAC,IAAI,YAEpB,SAAS,CAAC,KAAK,GACX,CACR,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,qBAAqB;IACnC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE1D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,CACH,eAAe,CACb,oCAAoC,qBAAqB,EAAE,CAC5D,CACF;aACE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACzD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,SAAS;gBAAE,OAAO;YACtB,MAAM,IAAI,GACP,IAAI,EAAE,KAAK,EAAE,IAA2B;gBACxC,IAAI,EAAE,IAA2B,CAAC;YACrC,IAAI,IAAI;gBAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnB,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,UAAU,CAAC,CAAQ;YAC1B,MAAM,MAAM,GAAI,CAAiB,CAAC,MAAM,CAAC;YACzC,IAAI,OAAO,MAAM,EAAE,MAAM,KAAK,QAAQ;gBAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,CAAC;QACD,SAAS,SAAS;YAChB,SAAS,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,gCAAgC,EAAE,UAAU,CAAC,CAAC;QACtE,MAAM,CAAC,gBAAgB,CAAC,+BAA+B,EAAE,SAAS,CAAC,CAAC;QACpE,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,gCAAgC,EAAE,UAAU,CAAC,CAAC;YACzE,MAAM,CAAC,mBAAmB,CAAC,+BAA+B,EAAE,SAAS,CAAC,CAAC;QACzE,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjD,OAAO,CACL,cAAK,SAAS,EAAC,0DAA0D,YACvE,eAAK,SAAS,EAAC,8HAA8H,aAC3I,KAAC,SAAS,IAAC,IAAI,EAAE,EAAE,GAAI,EACvB,2BAAO,MAAM,CAAC,cAAc,EAAE,oCAAoC,EAClE,iBACE,IAAI,EAAC,QAAQ,gBACF,yBAAyB,EACpC,OAAO,EAAE,GAAG,EAAE;wBACZ,SAAS,CAAC,IAAI,CAAC,CAAC;wBAChB,4DAA4D;wBAC5D,MAAM,CAAC,aAAa,CAClB,IAAI,WAAW,CAAC,uCAAuC,CAAC,CACzD,CAAC;oBACJ,CAAC,EACD,SAAS,EAAC,iHAAiH,YAE3H,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,GAAI,GACZ,IACL,GACF,CACP,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAI1C,IAAI,CAAC,CAAC;AAEhB,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC,aAAa,CAE9C,IAAI,CAAC,CAAC;AAEhB,iFAAiF;AAEjF,MAAM,UAAU,mBAAmB;IACjC,OAAO,CACL,MAAC,qBAAqB,CAAC,IAAI,IACzB,oBAAoB,QACpB,SAAS,EAAC,6DAA6D,aAEvE,KAAC,qBAAqB,CAAC,QAAQ,IAAC,OAAO,kBACrC,iBACE,IAAI,EAAC,QAAQ,gBACF,iBAAiB,EAC5B,SAAS,EAAC,kNAAkN,YAE5N,KAAC,eAAe,IAAC,SAAS,EAAC,aAAa,GAAG,GACpC,GACsB,EACjC,gBAAM,SAAS,EAAC,0BAA0B,aACxC,KAAC,qBAAqB,CAAC,MAAM,KAAG,EAC/B,GAAG,EACJ,KAAC,qBAAqB,CAAC,KAAK,KAAG,IAC1B,EACP,KAAC,qBAAqB,CAAC,IAAI,IAAC,OAAO,kBACjC,iBACE,IAAI,EAAC,QAAQ,gBACF,aAAa,EACxB,SAAS,EAAC,kNAAkN,YAE5N,KAAC,gBAAgB,IAAC,SAAS,EAAC,aAAa,GAAG,GACrC,GACkB,IACF,CAC9B,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,gBAAgB,GAAG;IACvB,IAAI,EAAE,EAAE;IACR,SAAS,EAAE,gCAAgC;CAC5C,CAAC;AAEF,SAAS,eAAe,CAAC,EAAE,IAAI,EAAqB;IAClD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,KAAC,UAAU,OAAK,gBAAgB,GAAI,CAAC;QAC9C,KAAK,UAAU;YACb,OAAO,KAAC,YAAY,OAAK,gBAAgB,GAAI,CAAC;QAChD,KAAK,MAAM;YACT,OAAO,KAAC,YAAY,OAAK,gBAAgB,GAAI,CAAC;QAChD,KAAK,OAAO;YACV,OAAO,KAAC,QAAQ,OAAK,gBAAgB,GAAI,CAAC;QAC5C,KAAK,MAAM;YACT,OAAO,KAAC,QAAQ,OAAK,gBAAgB,GAAI,CAAC;QAC5C,KAAK,MAAM;YACT,OAAO,KAAC,gBAAgB,OAAK,gBAAgB,GAAI,CAAC;QACpD,KAAK,OAAO;YACV,OAAO,KAAC,kBAAkB,OAAK,gBAAgB,GAAI,CAAC;QACtD,KAAK,MAAM;YACT,OAAO,KAAC,QAAQ,OAAK,gBAAgB,GAAI,CAAC;QAC5C;YACE,OAAO,KAAC,UAAU,OAAK,gBAAgB,GAAI,CAAC;IAChD,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AACvD,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAErD,SAAS,eAAe,CAAC,EAAE,IAAI,EAAoB;IACjD,8DAA8D;IAC9D,MAAM,WAAW,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,KAA6B,CAAC;IAClC,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,0CAA0C;IAC1C,kBAAkB,CAAC,SAAS,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/D,eAAe,GAAG,IAAI,CAAC;QACvB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;QAC/B,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CACR,gBAEE,SAAS,EAAC,0KAA0K,wBAChK,KAAK,aAEzB,KAAC,eAAe,IAAC,IAAI,EAAE,IAAI,GAAI,EAC/B,eAAM,SAAS,EAAC,UAAU,YAAE,KAAK,GAAQ,KALpC,UAAU,CAMV,CACR,CAAC;QACF,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3C,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,IAAI,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,4BAAG,KAAK,GAAI,CAAC;IACtB,CAAC;IAED,sDAAsD;IACtD,mBAAmB,CAAC,SAAS,GAAG,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;QAC/B,IAAI,UAAU,GAAG,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CACR,gBAEE,SAAS,EAAC,4JAA4J,wBAClJ,WAAW,kBAE7B,WAAW,KAJR,UAAU,CAKV,CACR,CAAC;QACF,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3C,CAAC;IAED,IAAI,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,4BAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,GAAI,CAAC;AACvD,CAAC;AAED,iFAAiF;AAEjF,SAAS,sBAAsB;IAC7B,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IACtC,mFAAmF;IACnF,iFAAiF;IACjF,8EAA8E;IAC9E,4EAA4E;IAC5E,0CAA0C;IAC1C,MAAM,WAAW,GAAI,GAA+C;SACjE,WAAW,CAAC;IACf,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1D,OAAO,CACL,cAAK,SAAS,EAAC,2CAA2C,YACvD,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACvB,IAAI,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,OAAO,KAAC,cAAc,IAAc,UAAU,EAAE,GAAG,EAAE,OAAO,UAAhC,GAAG,CAAC,EAAE,CAA6B,CAAC;YAClE,CAAC;YAED,uEAAuE;YACvE,qEAAqE;YACrE,yDAAyD;YACzD,MAAM,SAAS,GACb,GACD,CAAC,QAAQ,EAAE,SAAS,CAAC;YACtB,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,CACjC,CAAC,CAAC,EAAyC,EAAE,CAC3C,CAAC,CAAC,IAAI,KAAK,OAAO;gBAClB,OAAO,IAAI,CAAC;gBACZ,CAAC,CAAE,CAAwB,CAAC,KAAK,CACpC,CAAC;YACF,MAAM,QAAQ,GAAG,SAAS,IAAI,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC;YACvD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CACL,cAEE,SAAS,EAAC,0EAA0E,EACpF,KAAK,EAAE,GAAG,CAAC,IAAI,YAEf,cACE,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,GAAG,CAAC,IAAI,EACb,SAAS,EAAC,4BAA4B,GACtC,IARG,GAAG,CAAC,EAAE,CASP,CACP,CAAC;YACJ,CAAC;YACD,OAAO,CACL,eAEE,SAAS,EAAC,oHAAoH,EAC9H,KAAK,EAAE,GAAG,CAAC,IAAI,aAEf,KAAC,QAAQ,IAAC,SAAS,EAAC,sBAAsB,GAAG,EAC7C,eAAM,SAAS,EAAC,wBAAwB,YAAE,GAAG,CAAC,IAAI,IAAI,MAAM,GAAQ,KAL/D,GAAG,CAAC,EAAE,CAMP,CACP,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,SAAS,uBAAuB;IAC9B,OAAO,CACL,MAAC,iBAAiB,CAAC,IAAI,IAAC,SAAS,EAAC,uFAAuF,aACvH,KAAC,iBAAiB,CAAC,KAAK,IACtB,SAAS,EAAC,gIAAgI,EAC1I,IAAI,EAAE,CAAC,EACP,UAAU,EAAC,OAAO,GAClB,EACF,eAAK,SAAS,EAAC,wBAAwB,aACrC,KAAC,iBAAiB,CAAC,MAAM,IAAC,OAAO,kBAC/B,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,qHAAqH,uBAGxH,GACgB,EAC3B,KAAC,iBAAiB,CAAC,IAAI,IAAC,OAAO,kBAC7B,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,4HAA4H,qBAG/H,GACc,IACrB,IACiB,CAC1B,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF,MAAM,UAAU,kBAAkB,CAAC,EACjC,UAAU,EACV,QAAQ,GACT,GAGG,EAAE;IACJ,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,sBAAsB,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC;IAE9E,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAsB,CAAC,IAAI,CAAC;aACxC,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,KAAK,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;YACxC,IAAI,CAAC,EAAE;gBAAE,OAAO;YAChB,SAAS,CAAC,SAAS,CAAC,CAAC;YACrB,UAAU,CAAC,GAAG,EAAE;gBACd,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC3C,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,CAAC,QAKF,CAAC;QACd,0EAA0E;QAC1E,yEAAyE;QACzE,sEAAsE;QACtE,uEAAuE;QACvE,8DAA8D;QAC9D,MAAM,KAAK,GACT,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAC9D,CAAC,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC;YAC/C,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9D,CAAC,CAAC,EAAE;YACJ,EAAE,CAAC;QACL,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;YACzC,IAAI,CAAC,EAAE;gBAAE,OAAO;YAChB,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE;gBACd,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC;IAC7B,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,QAAQ,EAAE,EAAE,CAAC;IACf,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,CACL,MAAC,YAAY,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,aAC7C,KAAC,mBAAmB,IAAC,OAAO,kBAC1B,+BACa,iBAAiB,EAC5B,SAAS,EAAE,EAAE,CACX,mJAAmJ,EACnJ,IAAI,IAAI,2BAA2B,CACpC,YAED,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,GAC7B,GACW,EACtB,MAAC,mBAAmB,IAClB,KAAK,EAAC,OAAO,EACb,UAAU,EAAE,CAAC,EACb,SAAS,EAAC,+CAA+C,aAExD,UAAU,EAAE,UAAU,IAAI,CACzB,MAAC,gBAAgB,IAAC,QAAQ,EAAE,cAAc,aACxC,KAAC,WAAW,IAAC,SAAS,EAAC,aAAa,GAAG,iBAEtB,CACpB,EACD,MAAC,gBAAgB,IACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4BACd,CAAC,CAAC,cAAc,EAAE,CAAC;4BACnB,iBAAiB,EAAE,CAAC;wBACtB,CAAC,aAEA,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CACtB,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,GAAG,CACtC,CAAC,CAAC,CAAC,CACF,KAAC,QAAQ,IAAC,SAAS,EAAC,aAAa,GAAG,CACrC,EACA,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,IACjC,EACnB,MAAC,gBAAgB,IACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4BACd,CAAC,CAAC,cAAc,EAAE,CAAC;4BACnB,mBAAmB,EAAE,CAAC;wBACxB,CAAC,aAEA,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CACjB,KAAC,SAAS,IAAC,SAAS,EAAC,aAAa,GAAG,CACtC,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,IAAC,SAAS,EAAC,aAAa,GAAG,CACnC,EACA,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,IAC/B,EAClB,UAAU,IAAI,CACb,MAAC,gBAAgB,IAAC,QAAQ,EAAE,YAAY,aACtC,KAAC,eAAe,IAAC,SAAS,EAAC,aAAa,GAAG,sBAE1B,CACpB,EACA,SAAS,IAAI,CACZ,8BACE,KAAC,qBAAqB,KAAG,EACzB,MAAC,iBAAiB,IAAC,SAAS,EAAC,yDAAyD,sBAC9E,SAAS,CAAC,KAAK,IACH,IACnB,CACJ,IACmB,IACT,CAChB,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IAC1C,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,kBAAkB,GACtB,CAAC,MAAM;QACP,CAAC,OAAO,CAAC,OAAO;YACd,EAAE,MAAM,CAAC,CAAC,IAAI,EAA0C,EAAE;YACxD,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;QAC/D,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACjE,KAAK,CAAC,CAAC;IAEX,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,EAAE,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAEvC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,eAAe,CAAC,EAAE,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC;QACzC,CAAC,CAAC;QAEF,OAAO,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrB,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAEzB,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAExB,kFAAkF;IAClF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,cAAK,SAAS,EAAC,kBAAkB,YAC/B,cAAK,SAAS,EAAC,oBAAoB,YACjC,KAAC,uBAAuB,KAAG,GACvB,GACF,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,cACE,SAAS,EAAC,wBAAwB,EAClC,KAAK,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAEpC,eAAK,SAAS,EAAC,aAAa,aAC1B,KAAC,sBAAsB,KAAG,EACzB,kBAAkB,IAAI,CACrB,eACE,SAAS,EAAC,iFAAiF,EAC3F,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;wBACZ,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;wBACxC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,KAAK,CAAC;4BAAE,OAAO;wBACrD,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;wBACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CACxC,sBAAsB,CACvB,CAAC;wBACF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;4BAAE,OAAO;wBAClC,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;4BACtB,EAAE,CAAC,WAAW,GAAG,IAAI,EAAE,CAAC,YAAY,CAAC,oBAAoB,CAAC,EAAE,CAAC;wBAC/D,CAAC,CAAC,CAAC;wBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;wBAC1C,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;wBAC1B,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;oBAC/D,CAAC,aAED,cACE,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,EAAE,CACX,iCAAiC,EACjC,CAAC,QAAQ,IAAI,YAAY,IAAI,+BAA+B,CAC7D,YAED,KAAC,gBAAgB,CAAC,KAAK,IACrB,UAAU,EAAE;oCACV,IAAI,EAAE,eAAe;iCACtB,GACD,GACE,EACL,CAAC,QAAQ,IAAI,YAAY,IAAI,CAC5B,cAAK,SAAS,EAAC,6HAA6H,GAAG,CAChJ,EAEA,CAAC,WAAW,IAAI,kBAAkB,IAAI,CACrC,KAAC,eAAe,IAAC,aAAa,EAAE,GAAG,YACjC,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,kBAAkB,CAAC,IAAI,IAAC,OAAO,kBAC9B,iBACE,IAAI,EAAC,QAAQ,gBACF,cAAc,EACzB,SAAS,EAAC,qPAAqP,YAE/P,KAAC,UAAU,IAAC,SAAS,EAAC,aAAa,GAAG,GAC/B,GACe,GACX,EACjB,KAAC,cAAc,IAAC,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,SAAS,6BAE9B,IACT,GACM,CACnB,IACG,CACP,EACA,kBAAkB,IAAI,YAAY,IAAI,CACrC,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAC3C,SAAS,EAAC,gIAAgI,aAE1I,KAAC,eAAe,IACd,SAAS,EAAE,EAAE,CACX,kCAAkC,EAClC,QAAQ,IAAI,YAAY,CACzB,GACD,EACD,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,IAC1B,CACV,EACD,eAAK,SAAS,EAAC,0CAA0C,aACvD,KAAC,mBAAmB,KAAG,EACtB,SAAS,IAAI,CACZ,KAAC,gBAAgB,IACf,SAAS,EAAE,SAAS,EACpB,SAAS,EAAC,kGAAkG,GAC5G,CACH,IACG,IACF,GACF,CACP,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,SAAS,oCAAoC,CAAC,OAE7C;IACC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACpD,MAAM,IAAI,GAAI,IAA2B,CAAC,IAAI,CAAC;QAC/C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,GAAI,IAA2B,CAAC,IAAI,CAAC;YAC/C,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gCAAgC,CAAC,OAEzC;IACC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;IACxC,OAAO,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,YAAY,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,OAAgB;IAChE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAW,EAAE;QACpC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACpD,MAAM,MAAM,GAAG,IAA4C,CAAC;QAC5D,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,EAC/C,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAOlB;IACC,IAAI,CAAC,oBAAoB;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,WAAW;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,iBAAiB;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,CAAC,WAAW,IAAI,gBAAgB,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAE9C,MAAM,CAAC,CAAC;IACV,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxD,MAAM,MAAM,GACV,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;IAC5D,MAAM,oBAAoB,GAAG,oCAAoC,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,iBAAiB,GAAG,iCAAiC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,gCAAgC,CAAC;QAClD,MAAM;QACN,WAAW;QACX,oBAAoB;QACpB,gBAAgB,EAAE,gCAAgC,CAAC,GAAG,CAAC;QACvD,iBAAiB;KAClB,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAElD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC3C,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,eAAe,CAAC,YAAY,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,YAAY,KAAK,YAAY,IAAI,CAAC,KAAK;YAAE,OAAO;QACpD,eAAe,CAAC,WAAW,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,CAAC,CAAC,QAEF,CAAC;YACd,MAAM,KAAK,GACT,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC9D,CAAC,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC;gBAC/C,IAAI,CAAC;YACP,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,eAAe,CAAC,MAAM,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,KAAK,CAAC,MAAM,yBAAyB,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAClE,CAAC;YACF,MAAM,WAAW,GAAc,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CACjC,CAAC,EAAE,EAAE,EAAE,CAAE,EAAyB,CAAC,KAAK,KAAK,KAAK,CACnD,CAAC;YACF,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,eAAe,CAAC,MAAM,CAAC,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,sBAAsB,EAAE;gBACpE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,YAAY,EAAG,UAA8B,CAAC,EAAE;iBACjD,CAAC;aACH,CAAC,CAAC;YACH,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;gBAClB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,eAAe,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;IAE1C,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,KAAK,EAAE,OAAO,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC;IAE5D,uEAAuE;IACvE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAoC,CAAC;IAC5D,MAAM,iBAAiB,GACrB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QACzB,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,WAAW;YACtB,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,KAAK,MAAM;gBACnC,CAAC,CAAC,cAAc,CAAC,QAAQ,KAAK,OAAO,CAAC,CAC3C,CAAC;IAEJ,IAAI,CAAC,oBAAoB;QAAE,OAAO,IAAI,CAAC;IAEvC,OAAO,CACL,eACE,SAAS,EAAC,gBAAgB,EAC1B,KAAK,EAAE,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,aAE7D,eAAK,SAAS,EAAC,4DAA4D,aACzE,KAAC,gBAAgB,CAAC,KAAK,IACrB,UAAU,EAAE;4BACV,IAAI,EAAE,YAAY;4BAClB,KAAK,EAAE;gCACL,QAAQ,EAAE,gBAAgB;6BAC3B;yBACF,GACD,EACD,UAAU,IAAI,iBAAiB,IAAI,UAAU,IAAI,CAChD,KAAC,mBAAmB,IAAC,KAAK,EAAE,UAAU,GAAI,CAC3C,EACA,MAAM,IAAI,iBAAiB,IAAI,CAAC,WAAW,IAAI,CAC9C,KAAC,qBAAqB,IAAC,KAAK,EAAC,UAAU,GAAG,CAC3C,IACG,EACL,UAAU,IAAI,CACb,eAAK,SAAS,EAAC,wCAAwC,aACrD,eAAK,SAAS,EAAC,iCAAiC,aAC9C,KAAC,kBAAkB,IACjB,UAAU,EAAE,WAAW,IAAI,YAAY,KAAK,MAAM,EAClD,QAAQ,EAAE,aAAa,GACvB,EAED,MAAM,IAAI,CACT,KAAC,eAAe,IAAC,aAAa,EAAE,GAAG,YACjC,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,kBAAkB,CAAC,MAAM,IAAC,OAAO,kBAChC,iBACE,IAAI,EAAC,QAAQ,gBACF,qBAAqB,EAChC,SAAS,EAAC,mRAAmR,YAE7R,KAAC,WAAW,IAAC,SAAS,EAAC,aAAa,GAAG,GAChC,GACiB,GACb,EACjB,KAAC,cAAc,IAAC,IAAI,EAAC,KAAK,EAAC,SAAS,EAAC,SAAS,oCAE7B,IACT,GACM,CACnB,EACD,KAAC,mBAAmB,KAAG,EACtB,SAAS,IAAI,CACZ,KAAC,gBAAgB,IACf,SAAS,EAAE,SAAS,EACpB,SAAS,EAAC,kGAAkG,GAC5G,CACH,IACG,EACL,WAAW,IAAI,YAAY,KAAK,YAAY,CAAC,CAAC,CAAC,CAC9C,eAAK,SAAS,EAAC,iCAAiC,aAC9C,iBACE,OAAO,EAAE,aAAa,EACtB,SAAS,EAAC,6FAA6F,iCAGhG,EACT,iBACE,OAAO,EAAE,aAAa,EACtB,SAAS,EAAC,gEAAgE,uBAGnE,IACL,CACP,CAAC,CAAC,CAAC,WAAW,IAAI,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,CAChD,gBAAM,SAAS,EAAC,uDAAuD,aACrE,KAAC,WAAW,IAAC,SAAS,EAAC,sBAAsB,GAAG,oBAE3C,CACR,CAAC,CAAC,CAAC,CACF,KAAC,cAAc,IACb,QAAQ,EAAE,KAAK,EAAE,QAAQ,IAAI,EAAE,EAC/B,KAAK,EAAE,CAAC,GAAG,EAAE;4BACX,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC,QAE1B,CAAC;4BACd,OAAO,CACL,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,KAAK,KAAK,QAAQ;gCACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;gCACpB,CAAC,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC;gCAC/C,EAAE,CACH,CAAC;wBACJ,CAAC,CAAC,EAAE,EACJ,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,GAC7D,CACH,IACG,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,qBAAqB,CAAC,EAAE,KAAK,EAAqB;IAChE,OAAO,CACL,cAAK,SAAS,EAAC,wBAAwB,YACrC,KAAC,iBAAiB,IAAC,KAAK,EAAE,KAAK,GAAI,GAC/B,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAChC,KAAK,GAAG,UAAU,GACnB,GAAuB,EAAE;IACxB,OAAO,CACL,cACE,SAAS,EAAC,0BAA0B,EACpC,IAAI,EAAC,QAAQ,eACH,QAAQ,gBACN,KAAK,YAEjB,eAAM,SAAS,EAAC,gCAAgC,YAAE,KAAK,GAAQ,GAC3D,CACP,CAAC;AACJ,CAAC","sourcesContent":["// Owns: message-timestamp helpers, SelectionAttachedPill, UserMessage,\n// AssistantMessage, MessageBranchPicker, CheckpointContext, MessageActionsContext,\n// RunningActivityStatus, ThinkingIndicator, and displayableUserMessageText.\n\nimport {\n useThread,\n useMessageRuntime,\n useComposer,\n MessagePrimitive,\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n} from \"@assistant-ui/react\";\nimport type { Attachment } from \"@assistant-ui/react\";\nimport {\n IconX,\n IconCheck,\n IconCopy,\n IconChevronDown,\n IconChevronLeft,\n IconChevronRight,\n IconDots,\n IconGitFork,\n IconId,\n IconQuote,\n IconRefresh,\n IconArrowBackUp,\n IconFile,\n IconFolder,\n IconFileText,\n IconCheckbox,\n IconMail,\n IconUser,\n IconPresentation,\n IconStack2,\n IconMessageChatbot,\n IconPencil,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport React, { useState, useEffect, useCallback, useRef } from \"react\";\n\nimport { getActiveRun } from \"../active-run-state.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { writeClipboardText } from \"../clipboard.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { isPastedTextAttachmentName } from \"../composer/pasted-text.js\";\nimport { PastedTextChip } from \"../composer/PastedTextChip.js\";\nimport { ThumbsFeedback } from \"../observability/ThumbsFeedback.js\";\nimport type { ContentPart } from \"../sse-event-processor.js\";\nimport { cn } from \"../utils.js\";\nimport { MarkdownText } from \"./markdown-renderer.js\";\nimport {\n ToolCallFallback,\n FilesChangedSummary,\n ChatRunningContext,\n} from \"./tool-call-display.js\";\n\n// ─── Pending selection context key ───────────────────────────────────────────\n// Mirrored from AssistantChat to avoid a cross-import on a private constant.\nconst PENDING_SELECTION_KEY = \"pending-selection-context\";\n\n// ─── displayableUserMessageText ───────────────────────────────────────────────\n\nexport function displayableUserMessageText(text: string): string {\n return text\n .replace(/<context\\b[^>]*>[\\s\\S]*?<\\/context>\\n?/gi, \"\")\n .replace(/<context\\b[^>]*>[\\s\\S]*$/gi, \"\")\n .replace(/<\\/context>/gi, \"\")\n .trim();\n}\n\nexport function isHiddenUserMessage(message: unknown): boolean {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: {\n agentNativeHiddenUserMessage?: unknown;\n agentNativeRecoveryAction?: unknown;\n };\n }\n | undefined;\n return (\n meta?.custom?.agentNativeHiddenUserMessage === true ||\n meta?.custom?.agentNativeRecoveryAction === \"continue\" ||\n meta?.custom?.agentNativeRecoveryAction === \"retry\"\n );\n}\n\n// ─── Message timestamp helpers ────────────────────────────────────────────────\n\ninterface FormattedMessageTimestamp {\n short: string;\n full: string;\n}\n\nfunction coerceMessageDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nfunction isSameCalendarDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function formatMessageTimestamp(\n value: unknown,\n): FormattedMessageTimestamp | null {\n const date = coerceMessageDate(value);\n if (!date) return null;\n\n const now = new Date();\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n const time = new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n\n let short: string;\n if (isSameCalendarDay(date, now)) {\n short = time;\n } else if (isSameCalendarDay(date, yesterday)) {\n short = `Yesterday ${time}`;\n } else if (date.getFullYear() === now.getFullYear()) {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n }).format(date)}, ${time}`;\n } else {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date)}, ${time}`;\n }\n\n return {\n short,\n full: new Intl.DateTimeFormat(undefined, {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date),\n };\n}\n\nexport function MessageTimestamp({\n timestamp,\n className,\n}: {\n timestamp: FormattedMessageTimestamp;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n \"text-[11px] leading-none text-muted-foreground\",\n className,\n )}\n title={timestamp.full}\n >\n {timestamp.short}\n </span>\n );\n}\n\n// ─── SelectionAttachedPill ────────────────────────────────────────────────────\n\nexport function SelectionAttachedPill() {\n const [length, setLength] = useState<number | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n )\n .then((r) => (r.ok && r.status !== 204 ? r.json() : null))\n .then((data) => {\n if (cancelled) return;\n const text =\n (data?.value?.text as string | undefined) ??\n (data?.text as string | undefined);\n if (text) setLength(text.length);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n function onAttached(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (typeof detail?.length === \"number\") setLength(detail.length);\n }\n function onCleared() {\n setLength(null);\n }\n window.addEventListener(\"agent-panel:selection-attached\", onAttached);\n window.addEventListener(\"agent-panel:selection-cleared\", onCleared);\n return () => {\n window.removeEventListener(\"agent-panel:selection-attached\", onAttached);\n window.removeEventListener(\"agent-panel:selection-cleared\", onCleared);\n };\n }, []);\n\n if (length === null || length === 0) return null;\n\n return (\n <div className=\"agent-selection-attached-pill shrink-0 px-3 pt-1.5 -mb-1\">\n <div className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-muted/50 px-2 py-0.5 text-[11px] text-muted-foreground\">\n <IconQuote size={11} />\n <span>{length.toLocaleString()} chars of selection attached</span>\n <button\n type=\"button\"\n aria-label=\"Clear selection context\"\n onClick={() => {\n setLength(null);\n // Dispatch clear event; AssistantChat owns the DELETE call.\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:selection-clear-requested\"),\n );\n }}\n className=\"flex h-4 w-4 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/60\"\n >\n <IconX size={11} />\n </button>\n </div>\n </div>\n );\n}\n\n// ─── CheckpointContext / MessageActionsContext ────────────────────────────────\n\nexport const CheckpointContext = React.createContext<{\n apiUrl: string;\n devMode: boolean;\n threadId?: string;\n} | null>(null);\n\nexport const MessageActionsContext = React.createContext<{\n onForkChat?: () => void | boolean | Promise<void | boolean>;\n} | null>(null);\n\n// ─── MessageBranchPicker ──────────────────────────────────────────────────────\n\nexport function MessageBranchPicker() {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className=\"flex items-center gap-0.5 text-[11px] text-muted-foreground\"\n >\n <BranchPickerPrimitive.Previous asChild>\n <button\n type=\"button\"\n aria-label=\"Previous branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Previous>\n <span className=\"tabular-nums select-none\">\n <BranchPickerPrimitive.Number />\n {\"/\"}\n <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <button\n type=\"button\"\n aria-label=\"Next branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n}\n\n// ─── Mention rendering ────────────────────────────────────────────────────────\n\nconst mentionIconProps = {\n size: 14,\n className: \"shrink-0 text-muted-foreground\",\n};\n\nfunction MentionChipIcon({ icon }: { icon?: string }) {\n switch (icon) {\n case \"folder\":\n return <IconFolder {...mentionIconProps} />;\n case \"document\":\n return <IconFileText {...mentionIconProps} />;\n case \"form\":\n return <IconCheckbox {...mentionIconProps} />;\n case \"email\":\n return <IconMail {...mentionIconProps} />;\n case \"user\":\n return <IconUser {...mentionIconProps} />;\n case \"deck\":\n return <IconPresentation {...mentionIconProps} />;\n case \"agent\":\n return <IconMessageChatbot {...mentionIconProps} />;\n case \"file\":\n return <IconFile {...mentionIconProps} />;\n default:\n return <IconStack2 {...mentionIconProps} />;\n }\n}\n\n// Matches rich mention format: @[label|icon] or plain @word\nconst richMentionPattern = /@\\[([^\\]|]+)\\|([^\\]]+)\\]/g;\nconst plainMentionPattern = /((?:^|(?<=\\s))@(\\w+))/g;\n\nfunction UserMessageText({ text }: { text: string }) {\n // Strip injected <context>...</context> blocks before display\n const displayText = displayableUserMessageText(text);\n\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let hasRichMentions = false;\n\n // First try rich mentions (@[label|icon])\n richMentionPattern.lastIndex = 0;\n while ((match = richMentionPattern.exec(displayText)) !== null) {\n hasRichMentions = true;\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const label = match[1];\n const icon = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 max-w-[200px] select-all\"\n data-mention-label={label}\n >\n <MentionChipIcon icon={icon} />\n <span className=\"truncate\">{label}</span>\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (hasRichMentions) {\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n return <>{parts}</>;\n }\n\n // Fallback: plain @word mentions (for older messages)\n plainMentionPattern.lastIndex = 0;\n while ((match = plainMentionPattern.exec(displayText)) !== null) {\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const mentionName = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 select-all\"\n data-mention-label={mentionName}\n >\n @{mentionName}\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n\n return <>{parts.length > 0 ? parts : displayText}</>;\n}\n\n// ─── UserMessageAttachments ───────────────────────────────────────────────────\n\nfunction UserMessageAttachments() {\n const messageRuntime = useMessageRuntime();\n const msg = messageRuntime.getState();\n // assistant-ui stores user attachments on msg.attachments (separate from content).\n // Each attachment has: { id, type, name, contentType?, content: MessagePart[] }.\n // Image adapters put a {type:\"image\", image:\"data:...\"} part in content; text\n // adapters put a {type:\"text\", text:\"<attachment>...\"} part. Fall back to a\n // file chip when there's no inline image.\n const attachments = (msg as { attachments?: readonly Attachment[] })\n .attachments;\n if (!attachments || attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap justify-end gap-1.5 mb-1.5\">\n {attachments.map((att) => {\n if (isPastedTextAttachmentName(att.name)) {\n return <PastedTextChip key={att.id} attachment={att} compact />;\n }\n\n // Prefer the hosted upload URL when available (set by the server after\n // preUploadAttachments). This avoids re-shipping base64 in each poll\n // and lets the browser cache the image via a stable URL.\n const uploadUrl = (\n att as unknown as { metadata?: { uploadUrl?: string } }\n ).metadata?.uploadUrl;\n const imagePart = att.content?.find(\n (p): p is { type: \"image\"; image: string } =>\n p.type === \"image\" &&\n \"image\" in p &&\n !!(p as { image?: string }).image,\n );\n const imageSrc = uploadUrl || imagePart?.image || null;\n if (imageSrc) {\n return (\n <div\n key={att.id}\n className=\"h-16 w-16 overflow-hidden rounded-lg border border-border/70 bg-muted/50\"\n title={att.name}\n >\n <img\n src={imageSrc}\n alt={att.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n );\n }\n return (\n <div\n key={att.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/70 bg-muted/50 px-2 py-1.5 text-xs text-muted-foreground\"\n title={att.name}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate max-w-[120px]\">{att.name || \"file\"}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── UserMessageEditComposer ──────────────────────────────────────────────────\n\nfunction UserMessageEditComposer() {\n return (\n <ComposerPrimitive.Root className=\"flex flex-col gap-2 rounded-lg border border-border bg-background px-3 py-2 shadow-sm\">\n <ComposerPrimitive.Input\n className=\"w-full resize-none bg-transparent text-sm leading-relaxed text-foreground placeholder:text-muted-foreground focus:outline-none\"\n rows={1}\n submitMode=\"enter\"\n />\n <div className=\"flex justify-end gap-2\">\n <ComposerPrimitive.Cancel asChild>\n <button\n type=\"button\"\n className=\"cursor-pointer rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n Cancel\n </button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <button\n type=\"submit\"\n className=\"cursor-pointer rounded-md bg-foreground px-2 py-1 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n Save\n </button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n );\n}\n\n// ─── MessageActionsMenu ────────────────────────────────────────────────────────\n\nexport function MessageActionsMenu({\n showRevert,\n onRevert,\n}: {\n showRevert?: boolean;\n onRevert?: () => void;\n} = {}) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState<string | null>(null);\n const messageRuntime = useMessageRuntime();\n const actionsCtx = React.useContext(MessageActionsContext);\n const timestamp = formatMessageTimestamp(messageRuntime.getState().createdAt);\n\n const handleCopyMessage = useCallback(() => {\n const m = messageRuntime.getState();\n const text = m.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n void writeClipboardText(text).then((ok) => {\n if (!ok) return;\n setCopied(\"message\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleCopyRequestId = useCallback(() => {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | {\n custom?: { runId?: unknown };\n runId?: unknown;\n }\n | undefined;\n // Live yields put the trace ID at metadata.custom.runId; server-persisted\n // messages put it at metadata.runId. If neither is present (e.g. the run\n // is still in flight and this is the first message), fall back to the\n // active-run state so a hung / mid-stream chat still surfaces a usable\n // trace ID. Last resort is the assistant-ui local message id.\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n (typeof window !== \"undefined\" ? getActiveRun()?.runId : null) ||\n m.id ||\n \"\";\n void writeClipboardText(runId).then((ok) => {\n if (!ok) return;\n setCopied(\"id\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleForkChat = useCallback(() => {\n setOpen(false);\n actionsCtx?.onForkChat?.();\n }, [actionsCtx]);\n\n const handleRevert = useCallback(() => {\n setOpen(false);\n onRevert?.();\n }, [onRevert]);\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button\n aria-label=\"Message actions\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground\",\n open && \"bg-accent text-foreground\",\n )}\n >\n <IconDots className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n sideOffset={6}\n className=\"w-48 rounded-lg border-border p-1.5 shadow-xl\"\n >\n {actionsCtx?.onForkChat && (\n <DropdownMenuItem onSelect={handleForkChat}>\n <IconGitFork className=\"h-3.5 w-3.5\" />\n Fork Chat\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyMessage();\n }}\n >\n {copied === \"message\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"message\" ? \"Copied!\" : \"Copy Message\"}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyRequestId();\n }}\n >\n {copied === \"id\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconId className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"id\" ? \"Copied!\" : \"Copy Request ID\"}\n </DropdownMenuItem>\n {showRevert && (\n <DropdownMenuItem onSelect={handleRevert}>\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n Revert to here\n </DropdownMenuItem>\n )}\n {timestamp && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"px-2 py-1 text-[11px] font-normal text-muted-foreground\">\n Sent {timestamp.short}\n </DropdownMenuLabel>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// ─── UserMessage ──────────────────────────────────────────────────────────────\n\nexport function UserMessage() {\n const [expanded, setExpanded] = useState(false);\n const [isExpandable, setIsExpandable] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const messageRuntime = useMessageRuntime();\n const message = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(message.createdAt);\n const isEditing = useComposer((state) => state.isEditing);\n const chatRunning = React.useContext(ChatRunningContext);\n const hidden = isHiddenUserMessage(message);\n const hasDisplayableText =\n !hidden &&\n (message.content\n ?.filter((part): part is { type: \"text\"; text: string } => {\n return part.type === \"text\" && typeof part.text === \"string\";\n })\n .some((part) => displayableUserMessageText(part.text).length > 0) ??\n false);\n\n useEffect(() => {\n const el = contentRef.current;\n if (!el || !hasDisplayableText) return;\n\n const measure = () => {\n setIsExpandable(el.scrollHeight > 200);\n };\n\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasDisplayableText]);\n\n if (hidden) return null;\n\n // When in edit mode, show the inline edit composer instead of the message bubble.\n if (isEditing) {\n return (\n <div className=\"flex justify-end\">\n <div className=\"w-full max-w-[85%]\">\n <UserMessageEditComposer />\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"group flex justify-end\"\n style={{ contentVisibility: \"auto\" }}\n >\n <div className=\"max-w-[85%]\">\n <UserMessageAttachments />\n {hasDisplayableText && (\n <div\n className=\"relative rounded-lg bg-accent px-3 py-2 text-sm leading-relaxed text-foreground\"\n onCopy={(e) => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const fragment = selection.getRangeAt(0).cloneContents();\n const mentions = fragment.querySelectorAll(\n \"[data-mention-label]\",\n );\n if (mentions.length === 0) return;\n e.preventDefault();\n mentions.forEach((el) => {\n el.textContent = `@${el.getAttribute(\"data-mention-label\")}`;\n });\n const div = document.createElement(\"div\");\n div.appendChild(fragment);\n e.clipboardData.setData(\"text/plain\", div.textContent || \"\");\n }}\n >\n <div\n ref={contentRef}\n className={cn(\n \"whitespace-pre-wrap break-words\",\n !expanded && isExpandable && \"max-h-[200px] overflow-hidden\",\n )}\n >\n <MessagePrimitive.Parts\n components={{\n Text: UserMessageText,\n }}\n />\n </div>\n {!expanded && isExpandable && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-14 rounded-b-lg bg-gradient-to-t from-accent via-accent/90 to-transparent\" />\n )}\n {/* Edit hover affordance — appears on hover when not running */}\n {!chatRunning && hasDisplayableText && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Edit asChild>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n className=\"absolute -left-8 top-1 flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/0 transition-colors duration-150 group-hover:text-muted-foreground/70 group-hover:hover:bg-accent group-hover:hover:text-foreground\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Edit>\n </TooltipTrigger>\n <TooltipContent side=\"left\" className=\"text-xs\">\n Edit message\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n {hasDisplayableText && isExpandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n className=\"mt-1 inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n expanded && \"rotate-180\",\n )}\n />\n {expanded ? \"Collapse\" : \"Expand\"}\n </button>\n )}\n <div className=\"mt-1 flex items-center justify-end gap-1\">\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ─── AssistantMessage ─────────────────────────────────────────────────────────\n\nfunction assistantMessageHasRenderableContent(message: {\n content?: unknown;\n}): boolean {\n const content = message.content;\n if (typeof content === \"string\") return content.trim().length > 0;\n if (!Array.isArray(content)) return false;\n return content.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const type = (part as { type?: unknown }).type;\n if (type === \"text\") {\n const text = (part as { text?: unknown }).text;\n return typeof text === \"string\" && text.trim().length > 0;\n }\n return true;\n });\n}\n\nfunction assistantMessageStatusIsTerminal(message: {\n status?: { type?: unknown };\n}): boolean {\n const statusType = message.status?.type;\n return statusType === \"complete\" || statusType === \"incomplete\";\n}\n\nexport function assistantMessageHasUnresolvedTool(content: unknown): boolean {\n if (!Array.isArray(content)) return false;\n return content.some((part): boolean => {\n if (!part || typeof part !== \"object\") return false;\n const record = part as { type?: unknown; result?: unknown };\n return record.type === \"tool-call\" && record.result === undefined;\n });\n}\n\nexport function shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal,\n hasUnresolvedTool,\n}: {\n isLast: boolean;\n chatRunning: boolean;\n hasRenderableContent: boolean;\n statusIsTerminal: boolean;\n hasUnresolvedTool?: boolean;\n}): boolean {\n if (!hasRenderableContent) return false;\n if (chatRunning) return false;\n if (!isLast) return true;\n if (hasUnresolvedTool) return false;\n return !chatRunning && statusIsTerminal;\n}\n\nexport function AssistantMessage() {\n const [restoreState, setRestoreState] = useState<\n \"idle\" | \"confirming\" | \"restoring\"\n >(\"idle\");\n const messageRuntime = useMessageRuntime();\n const thread = useThread();\n const chatRunning = React.useContext(ChatRunningContext);\n const msg = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(msg.createdAt);\n const isLast =\n thread.messages.length > 0 &&\n thread.messages[thread.messages.length - 1].id === msg.id;\n const hasRenderableContent = assistantMessageHasRenderableContent(msg);\n const hasUnresolvedTool = assistantMessageHasUnresolvedTool(msg.content);\n const isComplete = shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal: assistantMessageStatusIsTerminal(msg),\n hasUnresolvedTool,\n });\n const cpCtx = React.useContext(CheckpointContext);\n\n const handleRestore = useCallback(async () => {\n if (restoreState === \"idle\") {\n setRestoreState(\"confirming\");\n return;\n }\n if (restoreState !== \"confirming\" || !cpCtx) return;\n setRestoreState(\"restoring\");\n try {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n null;\n if (!runId) {\n setRestoreState(\"idle\");\n return;\n }\n const tid = cpCtx.threadId || \"\";\n const res = await fetch(\n `${cpCtx.apiUrl}/checkpoints?threadId=${encodeURIComponent(tid)}`,\n );\n const checkpoints: unknown[] = res.ok ? await res.json() : [];\n const checkpoint = checkpoints.find(\n (cp) => (cp as { runId?: string }).runId === runId,\n );\n if (!checkpoint) {\n setRestoreState(\"idle\");\n return;\n }\n const restoreRes = await fetch(`${cpCtx.apiUrl}/checkpoints/restore`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n checkpointId: (checkpoint as { id?: string }).id,\n }),\n });\n if (restoreRes.ok) {\n window.location.reload();\n } else {\n setRestoreState(\"idle\");\n }\n } catch {\n setRestoreState(\"idle\");\n }\n }, [restoreState, cpCtx, messageRuntime]);\n\n const cancelRestore = useCallback(() => {\n setRestoreState(\"idle\");\n }, []);\n\n const showRestore = cpCtx?.devMode && isComplete && !isLast;\n\n // Collect parts for the files-changed summary (code-agent turns only).\n const msgContent = msg.content as ContentPart[] | undefined;\n const hasCodeAgentTools =\n Array.isArray(msgContent) &&\n msgContent.some(\n (p) =>\n p.type === \"tool-call\" &&\n p.structuredMeta &&\n (p.structuredMeta.toolKind === \"edit\" ||\n p.structuredMeta.toolKind === \"write\"),\n );\n\n if (!hasRenderableContent) return null;\n\n return (\n <div\n className=\"group relative\"\n style={{ contentVisibility: isComplete ? \"auto\" : \"visible\" }}\n >\n <div className=\"w-full max-w-[95%] text-sm leading-relaxed text-foreground\">\n <MessagePrimitive.Parts\n components={{\n Text: MarkdownText,\n tools: {\n Fallback: ToolCallFallback,\n },\n }}\n />\n {isComplete && hasCodeAgentTools && msgContent && (\n <FilesChangedSummary parts={msgContent} />\n )}\n {isLast && hasUnresolvedTool && !chatRunning && (\n <RunningActivityStatus label=\"Thinking\" />\n )}\n </div>\n {isComplete && (\n <div className=\"mt-1 flex items-center justify-between\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <MessageActionsMenu\n showRevert={showRestore && restoreState === \"idle\"}\n onRevert={handleRestore}\n />\n {/* Regenerate button — only on the last assistant message, auto-disabled while running */}\n {isLast && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Reload asChild>\n <button\n type=\"button\"\n aria-label=\"Regenerate response\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconRefresh className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Reload>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">\n Regenerate response\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n {showRestore && restoreState === \"confirming\" ? (\n <div className=\"flex items-center gap-1 text-xs\">\n <button\n onClick={handleRestore}\n className=\"rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90\"\n >\n Restore to here?\n </button>\n <button\n onClick={cancelRestore}\n className=\"rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n </div>\n ) : showRestore && restoreState === \"restoring\" ? (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n Restoring...\n </span>\n ) : (\n <ThumbsFeedback\n threadId={cpCtx?.threadId ?? \"\"}\n runId={(() => {\n const meta = messageRuntime.getState().metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n return (\n (typeof meta?.custom?.runId === \"string\" &&\n meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n \"\"\n );\n })()}\n messageSeq={thread.messages.findIndex((m) => m.id === msg.id)}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── RunningActivityStatus / ThinkingIndicator ────────────────────────────────\n\nexport function RunningActivityStatus({ label }: { label: string }) {\n return (\n <div className=\"agent-running-activity\">\n <ThinkingIndicator label={label} />\n </div>\n );\n}\n\nexport function ThinkingIndicator({\n label = \"Thinking\",\n}: { label?: string } = {}) {\n return (\n <div\n className=\"agent-thinking-indicator\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={label}\n >\n <span className=\"agent-thinking-indicator__text\">{label}</span>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"message-components.js","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":"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","sourcesContent":["// Owns: message-timestamp helpers, SelectionAttachedPill, UserMessage,\n// AssistantMessage, MessageBranchPicker, CheckpointContext, MessageActionsContext,\n// RunningActivityStatus, ThinkingIndicator, and displayableUserMessageText.\n\nimport {\n useThread,\n useMessageRuntime,\n useComposer,\n MessagePrimitive,\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n useMessagePartReasoning,\n} from \"@assistant-ui/react\";\nimport type { Attachment } from \"@assistant-ui/react\";\nimport {\n IconX,\n IconCheck,\n IconCopy,\n IconChevronDown,\n IconChevronLeft,\n IconChevronRight,\n IconDots,\n IconGitFork,\n IconId,\n IconQuote,\n IconRefresh,\n IconArrowBackUp,\n IconFile,\n IconFolder,\n IconFileText,\n IconCheckbox,\n IconMail,\n IconUser,\n IconPresentation,\n IconStack2,\n IconMessageChatbot,\n IconPencil,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport React, { useState, useEffect, useCallback, useRef } from \"react\";\n\nimport { getActiveRun } from \"../active-run-state.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { writeClipboardText } from \"../clipboard.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { isPastedTextAttachmentName } from \"../composer/pasted-text.js\";\nimport { PastedTextChip } from \"../composer/PastedTextChip.js\";\nimport { ThumbsFeedback } from \"../observability/ThumbsFeedback.js\";\nimport type { ContentPart } from \"../sse-event-processor.js\";\nimport { cn } from \"../utils.js\";\nimport { MarkdownText } from \"./markdown-renderer.js\";\nimport {\n ToolCallFallback,\n FilesChangedSummary,\n ChatRunningContext,\n ReasoningCell,\n WorkedForSummary,\n} from \"./tool-call-display.js\";\n\n// ─── Pending selection context key ───────────────────────────────────────────\n// Mirrored from AssistantChat to avoid a cross-import on a private constant.\nconst PENDING_SELECTION_KEY = \"pending-selection-context\";\n\n// ─── displayableUserMessageText ───────────────────────────────────────────────\n\nexport function displayableUserMessageText(text: string): string {\n return text\n .replace(/<context\\b[^>]*>[\\s\\S]*?<\\/context>\\n?/gi, \"\")\n .replace(/<context\\b[^>]*>[\\s\\S]*$/gi, \"\")\n .replace(/<\\/context>/gi, \"\")\n .trim();\n}\n\nexport function isHiddenUserMessage(message: unknown): boolean {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: {\n agentNativeHiddenUserMessage?: unknown;\n agentNativeRecoveryAction?: unknown;\n };\n }\n | undefined;\n return (\n meta?.custom?.agentNativeHiddenUserMessage === true ||\n meta?.custom?.agentNativeRecoveryAction === \"continue\" ||\n meta?.custom?.agentNativeRecoveryAction === \"retry\"\n );\n}\n\n// ─── Message timestamp helpers ────────────────────────────────────────────────\n\ninterface FormattedMessageTimestamp {\n short: string;\n full: string;\n}\n\nfunction coerceMessageDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nfunction isSameCalendarDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function formatMessageTimestamp(\n value: unknown,\n): FormattedMessageTimestamp | null {\n const date = coerceMessageDate(value);\n if (!date) return null;\n\n const now = new Date();\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n const time = new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n\n let short: string;\n if (isSameCalendarDay(date, now)) {\n short = time;\n } else if (isSameCalendarDay(date, yesterday)) {\n short = `Yesterday ${time}`;\n } else if (date.getFullYear() === now.getFullYear()) {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n }).format(date)}, ${time}`;\n } else {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date)}, ${time}`;\n }\n\n return {\n short,\n full: new Intl.DateTimeFormat(undefined, {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date),\n };\n}\n\nexport function MessageTimestamp({\n timestamp,\n className,\n}: {\n timestamp: FormattedMessageTimestamp;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n \"text-[11px] leading-none text-muted-foreground\",\n className,\n )}\n title={timestamp.full}\n >\n {timestamp.short}\n </span>\n );\n}\n\n// ─── SelectionAttachedPill ────────────────────────────────────────────────────\n\nexport function SelectionAttachedPill() {\n const [length, setLength] = useState<number | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n )\n .then((r) => (r.ok && r.status !== 204 ? r.json() : null))\n .then((data) => {\n if (cancelled) return;\n const text =\n (data?.value?.text as string | undefined) ??\n (data?.text as string | undefined);\n if (text) setLength(text.length);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n function onAttached(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (typeof detail?.length === \"number\") setLength(detail.length);\n }\n function onCleared() {\n setLength(null);\n }\n window.addEventListener(\"agent-panel:selection-attached\", onAttached);\n window.addEventListener(\"agent-panel:selection-cleared\", onCleared);\n return () => {\n window.removeEventListener(\"agent-panel:selection-attached\", onAttached);\n window.removeEventListener(\"agent-panel:selection-cleared\", onCleared);\n };\n }, []);\n\n if (length === null || length === 0) return null;\n\n return (\n <div className=\"agent-selection-attached-pill shrink-0 px-3 pt-1.5 -mb-1\">\n <div className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-muted/50 px-2 py-0.5 text-[11px] text-muted-foreground\">\n <IconQuote size={11} />\n <span>{length.toLocaleString()} chars of selection attached</span>\n <button\n type=\"button\"\n aria-label=\"Clear selection context\"\n onClick={() => {\n setLength(null);\n // Dispatch clear event; AssistantChat owns the DELETE call.\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:selection-clear-requested\"),\n );\n }}\n className=\"flex h-4 w-4 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/60\"\n >\n <IconX size={11} />\n </button>\n </div>\n </div>\n );\n}\n\n// ─── CheckpointContext / MessageActionsContext ────────────────────────────────\n\nexport const CheckpointContext = React.createContext<{\n apiUrl: string;\n devMode: boolean;\n threadId?: string;\n} | null>(null);\n\nexport const MessageActionsContext = React.createContext<{\n onForkChat?: () => void | boolean | Promise<void | boolean>;\n} | null>(null);\n\n// ─── MessageBranchPicker ──────────────────────────────────────────────────────\n\nexport function MessageBranchPicker() {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className=\"flex items-center gap-0.5 text-[11px] text-muted-foreground\"\n >\n <BranchPickerPrimitive.Previous asChild>\n <button\n type=\"button\"\n aria-label=\"Previous branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Previous>\n <span className=\"tabular-nums select-none\">\n <BranchPickerPrimitive.Number />\n {\"/\"}\n <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <button\n type=\"button\"\n aria-label=\"Next branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n}\n\n// ─── Mention rendering ────────────────────────────────────────────────────────\n\nconst mentionIconProps = {\n size: 14,\n className: \"shrink-0 text-muted-foreground\",\n};\n\nfunction MentionChipIcon({ icon }: { icon?: string }) {\n switch (icon) {\n case \"folder\":\n return <IconFolder {...mentionIconProps} />;\n case \"document\":\n return <IconFileText {...mentionIconProps} />;\n case \"form\":\n return <IconCheckbox {...mentionIconProps} />;\n case \"email\":\n return <IconMail {...mentionIconProps} />;\n case \"user\":\n return <IconUser {...mentionIconProps} />;\n case \"deck\":\n return <IconPresentation {...mentionIconProps} />;\n case \"agent\":\n return <IconMessageChatbot {...mentionIconProps} />;\n case \"file\":\n return <IconFile {...mentionIconProps} />;\n default:\n return <IconStack2 {...mentionIconProps} />;\n }\n}\n\n// Matches rich mention format: @[label|icon] or plain @word\nconst richMentionPattern = /@\\[([^\\]|]+)\\|([^\\]]+)\\]/g;\nconst plainMentionPattern = /((?:^|(?<=\\s))@(\\w+))/g;\n\nfunction UserMessageText({ text }: { text: string }) {\n // Strip injected <context>...</context> blocks before display\n const displayText = displayableUserMessageText(text);\n\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let hasRichMentions = false;\n\n // First try rich mentions (@[label|icon])\n richMentionPattern.lastIndex = 0;\n while ((match = richMentionPattern.exec(displayText)) !== null) {\n hasRichMentions = true;\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const label = match[1];\n const icon = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 max-w-[200px] select-all\"\n data-mention-label={label}\n >\n <MentionChipIcon icon={icon} />\n <span className=\"truncate\">{label}</span>\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (hasRichMentions) {\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n return <>{parts}</>;\n }\n\n // Fallback: plain @word mentions (for older messages)\n plainMentionPattern.lastIndex = 0;\n while ((match = plainMentionPattern.exec(displayText)) !== null) {\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const mentionName = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 select-all\"\n data-mention-label={mentionName}\n >\n @{mentionName}\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n\n return <>{parts.length > 0 ? parts : displayText}</>;\n}\n\n// ─── UserMessageAttachments ───────────────────────────────────────────────────\n\nfunction UserMessageAttachments() {\n const messageRuntime = useMessageRuntime();\n const msg = messageRuntime.getState();\n // assistant-ui stores user attachments on msg.attachments (separate from content).\n // Each attachment has: { id, type, name, contentType?, content: MessagePart[] }.\n // Image adapters put a {type:\"image\", image:\"data:...\"} part in content; text\n // adapters put a {type:\"text\", text:\"<attachment>...\"} part. Fall back to a\n // file chip when there's no inline image.\n const attachments = (msg as { attachments?: readonly Attachment[] })\n .attachments;\n if (!attachments || attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap justify-end gap-1.5 mb-1.5\">\n {attachments.map((att) => {\n if (isPastedTextAttachmentName(att.name)) {\n return <PastedTextChip key={att.id} attachment={att} compact />;\n }\n\n // Prefer the hosted upload URL when available (set by the server after\n // preUploadAttachments). This avoids re-shipping base64 in each poll\n // and lets the browser cache the image via a stable URL.\n const uploadUrl = (\n att as unknown as { metadata?: { uploadUrl?: string } }\n ).metadata?.uploadUrl;\n const imagePart = att.content?.find(\n (p): p is { type: \"image\"; image: string } =>\n p.type === \"image\" &&\n \"image\" in p &&\n !!(p as { image?: string }).image,\n );\n const imageSrc = uploadUrl || imagePart?.image || null;\n if (imageSrc) {\n return (\n <div\n key={att.id}\n className=\"h-16 w-16 overflow-hidden rounded-lg border border-border/70 bg-muted/50\"\n title={att.name}\n >\n <img\n src={imageSrc}\n alt={att.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n );\n }\n return (\n <div\n key={att.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/70 bg-muted/50 px-2 py-1.5 text-xs text-muted-foreground\"\n title={att.name}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate max-w-[120px]\">{att.name || \"file\"}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── UserMessageEditComposer ──────────────────────────────────────────────────\n\nfunction UserMessageEditComposer() {\n return (\n <ComposerPrimitive.Root className=\"flex flex-col gap-2 rounded-lg border border-border bg-background px-3 py-2 shadow-sm\">\n <ComposerPrimitive.Input\n className=\"w-full resize-none bg-transparent text-sm leading-relaxed text-foreground placeholder:text-muted-foreground focus:outline-none\"\n rows={1}\n submitMode=\"enter\"\n />\n <div className=\"flex justify-end gap-2\">\n <ComposerPrimitive.Cancel asChild>\n <button\n type=\"button\"\n className=\"cursor-pointer rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n Cancel\n </button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <button\n type=\"submit\"\n className=\"cursor-pointer rounded-md bg-foreground px-2 py-1 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n Save\n </button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n );\n}\n\n// ─── MessageActionsMenu ────────────────────────────────────────────────────────\n\nexport function MessageActionsMenu({\n showRevert,\n onRevert,\n}: {\n showRevert?: boolean;\n onRevert?: () => void;\n} = {}) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState<string | null>(null);\n const messageRuntime = useMessageRuntime();\n const actionsCtx = React.useContext(MessageActionsContext);\n const timestamp = formatMessageTimestamp(messageRuntime.getState().createdAt);\n\n const handleCopyMessage = useCallback(() => {\n const m = messageRuntime.getState();\n const text = m.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n void writeClipboardText(text).then((ok) => {\n if (!ok) return;\n setCopied(\"message\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleCopyRequestId = useCallback(() => {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | {\n custom?: { runId?: unknown };\n runId?: unknown;\n }\n | undefined;\n // Live yields put the trace ID at metadata.custom.runId; server-persisted\n // messages put it at metadata.runId. If neither is present (e.g. the run\n // is still in flight and this is the first message), fall back to the\n // active-run state so a hung / mid-stream chat still surfaces a usable\n // trace ID. Last resort is the assistant-ui local message id.\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n (typeof window !== \"undefined\" ? getActiveRun()?.runId : null) ||\n m.id ||\n \"\";\n void writeClipboardText(runId).then((ok) => {\n if (!ok) return;\n setCopied(\"id\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleForkChat = useCallback(() => {\n setOpen(false);\n actionsCtx?.onForkChat?.();\n }, [actionsCtx]);\n\n const handleRevert = useCallback(() => {\n setOpen(false);\n onRevert?.();\n }, [onRevert]);\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button\n aria-label=\"Message actions\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground\",\n open && \"bg-accent text-foreground\",\n )}\n >\n <IconDots className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n sideOffset={6}\n className=\"w-48 rounded-lg border-border p-1.5 shadow-xl\"\n >\n {actionsCtx?.onForkChat && (\n <DropdownMenuItem onSelect={handleForkChat}>\n <IconGitFork className=\"h-3.5 w-3.5\" />\n Fork Chat\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyMessage();\n }}\n >\n {copied === \"message\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"message\" ? \"Copied!\" : \"Copy Message\"}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyRequestId();\n }}\n >\n {copied === \"id\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconId className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"id\" ? \"Copied!\" : \"Copy Request ID\"}\n </DropdownMenuItem>\n {showRevert && (\n <DropdownMenuItem onSelect={handleRevert}>\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n Revert to here\n </DropdownMenuItem>\n )}\n {timestamp && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"px-2 py-1 text-[11px] font-normal text-muted-foreground\">\n Sent {timestamp.short}\n </DropdownMenuLabel>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// ─── UserMessage ──────────────────────────────────────────────────────────────\n\nexport function UserMessage() {\n const [expanded, setExpanded] = useState(false);\n const [isExpandable, setIsExpandable] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const messageRuntime = useMessageRuntime();\n const message = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(message.createdAt);\n const isEditing = useComposer((state) => state.isEditing);\n const chatRunning = React.useContext(ChatRunningContext);\n const hidden = isHiddenUserMessage(message);\n const hasDisplayableText =\n !hidden &&\n (message.content\n ?.filter((part): part is { type: \"text\"; text: string } => {\n return part.type === \"text\" && typeof part.text === \"string\";\n })\n .some((part) => displayableUserMessageText(part.text).length > 0) ??\n false);\n\n useEffect(() => {\n const el = contentRef.current;\n if (!el || !hasDisplayableText) return;\n\n const measure = () => {\n setIsExpandable(el.scrollHeight > 200);\n };\n\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasDisplayableText]);\n\n if (hidden) return null;\n\n // When in edit mode, show the inline edit composer instead of the message bubble.\n if (isEditing) {\n return (\n <div className=\"flex justify-end\">\n <div className=\"w-full max-w-[85%]\">\n <UserMessageEditComposer />\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"group flex justify-end\"\n style={{ contentVisibility: \"auto\" }}\n >\n <div className=\"max-w-[85%]\">\n <UserMessageAttachments />\n {hasDisplayableText && (\n <div\n className=\"relative rounded-lg bg-accent px-3 py-2 text-sm leading-relaxed text-foreground\"\n onCopy={(e) => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const fragment = selection.getRangeAt(0).cloneContents();\n const mentions = fragment.querySelectorAll(\n \"[data-mention-label]\",\n );\n if (mentions.length === 0) return;\n e.preventDefault();\n mentions.forEach((el) => {\n el.textContent = `@${el.getAttribute(\"data-mention-label\")}`;\n });\n const div = document.createElement(\"div\");\n div.appendChild(fragment);\n e.clipboardData.setData(\"text/plain\", div.textContent || \"\");\n }}\n >\n <div\n ref={contentRef}\n className={cn(\n \"whitespace-pre-wrap break-words\",\n !expanded && isExpandable && \"max-h-[200px] overflow-hidden\",\n )}\n >\n <MessagePrimitive.Parts\n components={{\n Text: UserMessageText,\n }}\n />\n </div>\n {!expanded && isExpandable && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-14 rounded-b-lg bg-gradient-to-t from-accent via-accent/90 to-transparent\" />\n )}\n {/* Edit hover affordance — appears on hover when not running */}\n {!chatRunning && hasDisplayableText && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Edit asChild>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n className=\"absolute -left-8 top-1 flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/0 transition-colors duration-150 group-hover:text-muted-foreground/70 group-hover:hover:bg-accent group-hover:hover:text-foreground\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Edit>\n </TooltipTrigger>\n <TooltipContent side=\"left\" className=\"text-xs\">\n Edit message\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n {hasDisplayableText && isExpandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n className=\"mt-1 inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n expanded && \"rotate-180\",\n )}\n />\n {expanded ? \"Collapse\" : \"Expand\"}\n </button>\n )}\n <div className=\"mt-1 flex items-center justify-end gap-1\">\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ─── AssistantMessage ─────────────────────────────────────────────────────────\n\nfunction assistantMessageHasRenderableContent(message: {\n content?: unknown;\n}): boolean {\n const content = message.content;\n if (typeof content === \"string\") return content.trim().length > 0;\n if (!Array.isArray(content)) return false;\n return content.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const type = (part as { type?: unknown }).type;\n if (type === \"text\" || type === \"reasoning\") {\n const text = (part as { text?: unknown }).text;\n return typeof text === \"string\" && text.trim().length > 0;\n }\n return true;\n });\n}\n\nfunction assistantMessageStatusIsTerminal(message: {\n status?: { type?: unknown };\n}): boolean {\n const statusType = message.status?.type;\n return statusType === \"complete\" || statusType === \"incomplete\";\n}\n\nexport function assistantMessageHasUnresolvedTool(content: unknown): boolean {\n if (!Array.isArray(content)) return false;\n return content.some((part): boolean => {\n if (!part || typeof part !== \"object\") return false;\n const record = part as { type?: unknown; result?: unknown };\n return record.type === \"tool-call\" && record.result === undefined;\n });\n}\n\nexport function shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal,\n hasUnresolvedTool,\n}: {\n isLast: boolean;\n chatRunning: boolean;\n hasRenderableContent: boolean;\n statusIsTerminal: boolean;\n hasUnresolvedTool?: boolean;\n}): boolean {\n if (!hasRenderableContent) return false;\n if (chatRunning) return false;\n if (!isLast) return true;\n if (hasUnresolvedTool) return false;\n return !chatRunning && statusIsTerminal;\n}\n\nfunction ReasoningMessagePart() {\n const part = useMessagePartReasoning();\n const isStreaming = part.status?.type === \"running\";\n return <ReasoningCell text={part.text} isStreaming={isStreaming} />;\n}\n\nfunction groupAssistantWorkParts(part: {\n type?: string;\n}): [\"group-work\"] | null {\n if (part.type === \"reasoning\" || part.type === \"tool-call\") {\n return [\"group-work\"];\n }\n return null;\n}\n\nexport function AssistantMessage() {\n const [restoreState, setRestoreState] = useState<\n \"idle\" | \"confirming\" | \"restoring\"\n >(\"idle\");\n const messageRuntime = useMessageRuntime();\n const thread = useThread();\n const chatRunning = React.useContext(ChatRunningContext);\n const msg = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(msg.createdAt);\n const isLast =\n thread.messages.length > 0 &&\n thread.messages[thread.messages.length - 1].id === msg.id;\n const hasRenderableContent = assistantMessageHasRenderableContent(msg);\n const hasUnresolvedTool = assistantMessageHasUnresolvedTool(msg.content);\n const isComplete = shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal: assistantMessageStatusIsTerminal(msg),\n hasUnresolvedTool,\n });\n const cpCtx = React.useContext(CheckpointContext);\n\n // Capture live run duration when this message finishes streaming.\n const runStartedAtRef = useRef<number | null>(null);\n const [capturedDurationMs, setCapturedDurationMs] = useState<number | null>(\n null,\n );\n useEffect(() => {\n if (chatRunning && isLast) {\n if (runStartedAtRef.current == null) {\n runStartedAtRef.current = Date.now();\n }\n return;\n }\n if (\n !chatRunning &&\n isLast &&\n runStartedAtRef.current != null &&\n capturedDurationMs == null\n ) {\n setCapturedDurationMs(Date.now() - runStartedAtRef.current);\n runStartedAtRef.current = null;\n }\n }, [chatRunning, isLast, capturedDurationMs]);\n\n // Animate collapse only when this message just finished running in-session.\n const wasRunningRef = useRef(false);\n const [animateCollapse, setAnimateCollapse] = useState(false);\n useEffect(() => {\n if (wasRunningRef.current && !chatRunning && isComplete && isLast) {\n setAnimateCollapse(true);\n }\n wasRunningRef.current = chatRunning && isLast;\n }, [chatRunning, isComplete, isLast]);\n\n const handleRestore = useCallback(async () => {\n if (restoreState === \"idle\") {\n setRestoreState(\"confirming\");\n return;\n }\n if (restoreState !== \"confirming\" || !cpCtx) return;\n setRestoreState(\"restoring\");\n try {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n null;\n if (!runId) {\n setRestoreState(\"idle\");\n return;\n }\n const tid = cpCtx.threadId || \"\";\n const res = await fetch(\n `${cpCtx.apiUrl}/checkpoints?threadId=${encodeURIComponent(tid)}`,\n );\n const checkpoints: unknown[] = res.ok ? await res.json() : [];\n const checkpoint = checkpoints.find(\n (cp) => (cp as { runId?: string }).runId === runId,\n );\n if (!checkpoint) {\n setRestoreState(\"idle\");\n return;\n }\n const restoreRes = await fetch(`${cpCtx.apiUrl}/checkpoints/restore`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n checkpointId: (checkpoint as { id?: string }).id,\n }),\n });\n if (restoreRes.ok) {\n window.location.reload();\n } else {\n setRestoreState(\"idle\");\n }\n } catch {\n setRestoreState(\"idle\");\n }\n }, [restoreState, cpCtx, messageRuntime]);\n\n const cancelRestore = useCallback(() => {\n setRestoreState(\"idle\");\n }, []);\n\n const showRestore = cpCtx?.devMode && isComplete && !isLast;\n\n // Collect parts for the files-changed summary (code-agent turns only).\n const msgContent = msg.content as ContentPart[] | undefined;\n const hasCodeAgentTools =\n Array.isArray(msgContent) &&\n msgContent.some(\n (p) =>\n p.type === \"tool-call\" &&\n p.structuredMeta &&\n (p.structuredMeta.toolKind === \"edit\" ||\n p.structuredMeta.toolKind === \"write\"),\n );\n const hasCollapsibleWork =\n Array.isArray(msgContent) &&\n msgContent.some(\n (p) =>\n p.type === \"reasoning\" ||\n (p.type === \"tool-call\" && p.activity !== true),\n );\n\n if (!hasRenderableContent) return null;\n\n return (\n <div\n className=\"group relative\"\n style={{ contentVisibility: isComplete ? \"auto\" : \"visible\" }}\n >\n <div className=\"w-full max-w-[95%] text-sm leading-relaxed text-foreground\">\n <MessagePrimitive.GroupedParts groupBy={groupAssistantWorkParts}>\n {({ part, children }) => {\n switch (part.type) {\n case \"group-work\": {\n const showSummary =\n isComplete && !chatRunning && hasCollapsibleWork;\n if (!showSummary) return <>{children}</>;\n return (\n <WorkedForSummary\n durationMs={capturedDurationMs}\n autoCollapse={animateCollapse}\n >\n {children}\n </WorkedForSummary>\n );\n }\n case \"text\":\n return <MarkdownText />;\n case \"reasoning\":\n return <ReasoningMessagePart />;\n case \"tool-call\":\n return part.toolUI ?? <ToolCallFallback {...part} />;\n default:\n return null;\n }\n }}\n </MessagePrimitive.GroupedParts>\n {isComplete && hasCodeAgentTools && msgContent && (\n <FilesChangedSummary parts={msgContent} />\n )}\n {isLast && hasUnresolvedTool && !chatRunning && (\n <RunningActivityStatus label=\"Thinking\" />\n )}\n </div>\n {isComplete && (\n <div className=\"mt-1 flex items-center justify-between\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <MessageActionsMenu\n showRevert={showRestore && restoreState === \"idle\"}\n onRevert={handleRestore}\n />\n {/* Regenerate button — only on the last assistant message, auto-disabled while running */}\n {isLast && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Reload asChild>\n <button\n type=\"button\"\n aria-label=\"Regenerate response\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconRefresh className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Reload>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">\n Regenerate response\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n {showRestore && restoreState === \"confirming\" ? (\n <div className=\"flex items-center gap-1 text-xs\">\n <button\n onClick={handleRestore}\n className=\"rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90\"\n >\n Restore to here?\n </button>\n <button\n onClick={cancelRestore}\n className=\"rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n </div>\n ) : showRestore && restoreState === \"restoring\" ? (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n Restoring...\n </span>\n ) : (\n <ThumbsFeedback\n threadId={cpCtx?.threadId ?? \"\"}\n runId={(() => {\n const meta = messageRuntime.getState().metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n return (\n (typeof meta?.custom?.runId === \"string\" &&\n meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n \"\"\n );\n })()}\n messageSeq={thread.messages.findIndex((m) => m.id === msg.id)}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── RunningActivityStatus / ThinkingIndicator ────────────────────────────────\n\nexport function RunningActivityStatus({ label }: { label: string }) {\n return (\n <div className=\"agent-running-activity\">\n <ThinkingIndicator label={label} />\n </div>\n );\n}\n\nexport function ThinkingIndicator({\n label = \"Thinking\",\n}: { label?: string } = {}) {\n return (\n <div\n className=\"agent-thinking-indicator\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={label}\n >\n <span className=\"agent-thinking-indicator__text\">{label}</span>\n </div>\n );\n}\n"]}
@@ -56,5 +56,17 @@ export declare function ToolCallFallback({ toolName, args, argsText, result, ...
56
56
  export declare function ReconnectStreamMessage({ content, }: {
57
57
  content: ContentPart[];
58
58
  }): React.JSX.Element;
59
+ export declare function ReasoningCell({ text, isStreaming, defaultOpen, }: {
60
+ text: string;
61
+ isStreaming?: boolean;
62
+ defaultOpen?: boolean;
63
+ }): React.JSX.Element | null;
64
+ export declare function formatWorkedDuration(ms: number): string;
65
+ export declare function WorkedForSummary({ durationMs, autoCollapse, children, }: {
66
+ durationMs?: number | null;
67
+ /** When true, start open then animate closed (post-run collapse). */
68
+ autoCollapse?: boolean;
69
+ children: React.ReactNode;
70
+ }): React.JSX.Element;
59
71
  export { FilesChangedSummary };
60
72
  //# sourceMappingURL=tool-call-display.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-call-display.d.ts","sourceRoot":"","sources":["../../../src/client/chat/tool-call-display.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAcpE,OAAO,KAMN,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAKzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAIL,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAmBhC,eAAO,MAAM,kBAAkB,wBAA6B,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,8DAA8D;IAC9D,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAAC;AACF,eAAO,MAAM,eAAe,4CAE3B,CAAC;AAEF,eAAO,MAAM,+BAA+B,QAAS,CAAC;AAuCtD,KAAK,iBAAiB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC5C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAiEF,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,iBAAiB,GAAG,IAAI,CAyB1B;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,iBAAiB,GAAG,IAAI,CAU1B;AA8ND,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,MAAM,EACN,MAAM,EACN,SAAS,EACT,cAAc,EACd,QAAQ,EACR,WAAW,GACZ,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,qBAsDA;AAwND,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,GAAG,IAAI,EACR,EAAE,wBAAwB,GAAG;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,qBAwBA;AAMD,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,GACR,EAAE;IACD,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB,qBA8CA;AAKD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"tool-call-display.d.ts","sourceRoot":"","sources":["../../../src/client/chat/tool-call-display.tsx"],"names":[],"mappings":"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"}