@agent-native/core 0.91.2 → 0.92.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +31 -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/application-state/store.ts +12 -1
  9. package/corpus/core/src/cli/index.ts +20 -0
  10. package/corpus/core/src/cli/upgrade.ts +798 -0
  11. package/corpus/core/src/client/AssistantChat.tsx +28 -15
  12. package/corpus/core/src/client/HighlightedCodeBlock.tsx +20 -3
  13. package/corpus/core/src/client/PoweredByBadge.tsx +1 -8
  14. package/corpus/core/src/client/agent-chat-adapter.ts +68 -16
  15. package/corpus/core/src/client/chat/message-components.tsx +85 -8
  16. package/corpus/core/src/client/chat/tool-call-display.tsx +355 -144
  17. package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +52 -1
  18. package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -9
  19. package/corpus/core/src/client/db-admin/TableEditor.tsx +49 -0
  20. package/corpus/core/src/client/db-admin/export-utils.ts +13 -4
  21. package/corpus/core/src/client/db-admin/useAgentSync.ts +72 -0
  22. package/corpus/core/src/client/error-capture.ts +69 -7
  23. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +5 -1
  24. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +53 -8
  25. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +5 -1
  26. package/corpus/core/src/client/extensions/portable-extension.ts +1 -0
  27. package/corpus/core/src/client/org/OrgSwitcher.tsx +12 -9
  28. package/corpus/core/src/client/org/TeamPage.tsx +77 -71
  29. package/corpus/core/src/client/session-replay.ts +3 -97
  30. package/corpus/core/src/client/settings/SettingsPanel.tsx +738 -441
  31. package/corpus/core/src/client/settings/SettingsSection.tsx +161 -17
  32. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +25 -9
  33. package/corpus/core/src/client/sse-event-processor.ts +29 -2
  34. package/corpus/core/src/db-admin/agent-tools.ts +8 -2
  35. package/corpus/core/src/db-admin/operations.ts +116 -4
  36. package/corpus/core/src/db-admin/routes.ts +1 -0
  37. package/corpus/core/src/db-admin/types.ts +4 -0
  38. package/corpus/core/src/extensions/actions.ts +113 -5
  39. package/corpus/core/src/extensions/html-shell.ts +5 -4
  40. package/corpus/core/src/extensions/routes.ts +10 -0
  41. package/corpus/core/src/navigation/index.ts +1 -1
  42. package/corpus/core/src/notifications/channels.ts +88 -25
  43. package/corpus/core/src/notifications/registry.ts +17 -3
  44. package/corpus/core/src/notifications/types.ts +4 -1
  45. package/corpus/core/src/resources/handlers.ts +10 -8
  46. package/corpus/core/src/server/agent-chat-plugin.ts +7 -3
  47. package/corpus/core/src/server/poll.ts +293 -8
  48. package/corpus/core/src/server/request-context.ts +7 -0
  49. package/corpus/core/src/styles/agent-conversation.css +1 -1
  50. package/corpus/core/src/styles/agent-native.css +27 -0
  51. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  52. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  53. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  54. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  55. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  56. package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  57. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  58. package/corpus/core/src/templates/default/AGENTS.md +14 -5
  59. package/corpus/core/src/templates/default/package.json +2 -1
  60. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  61. package/corpus/core/src/templates/headless/AGENTS.md +13 -3
  62. package/corpus/core/src/templates/headless/package.json +1 -0
  63. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  64. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  65. package/corpus/core/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  66. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  67. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  68. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  69. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  70. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  71. package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  72. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  73. package/corpus/core/src/templates/workspace-core/AGENTS.md +7 -1
  74. package/corpus/core/src/templates/workspace-root/AGENTS.md +17 -5
  75. package/corpus/core/src/templates/workspace-root/package.json +1 -0
  76. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +5 -0
  77. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
  78. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
  79. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +7 -0
  80. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +20 -2
  81. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +5 -6
  82. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -1
  83. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  84. package/corpus/templates/analytics/AGENTS.md +39 -18
  85. package/corpus/templates/analytics/actions/capture-test-error.ts +4 -0
  86. package/corpus/templates/analytics/actions/get-analytics-alert-rule-defaults.ts +23 -0
  87. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -1
  88. package/corpus/templates/analytics/actions/list-analysis-revisions.ts +40 -0
  89. package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +40 -0
  90. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +299 -0
  91. package/corpus/templates/analytics/actions/navigate.ts +4 -2
  92. package/corpus/templates/analytics/actions/restore-analysis-revision.ts +43 -0
  93. package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +68 -0
  94. package/corpus/templates/analytics/actions/save-analytics-alert-rule.ts +14 -0
  95. package/corpus/templates/analytics/actions/save-monitor.ts +15 -1
  96. package/corpus/templates/analytics/actions/view-screen.ts +24 -0
  97. package/corpus/templates/analytics/app/components/analysis/AnalysisHistoryPanel.tsx +181 -0
  98. package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +184 -0
  99. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +41 -6
  100. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +122 -11
  101. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +22 -16
  102. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
  103. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +27 -21
  104. package/corpus/templates/analytics/app/hooks/use-analysis-revisions.ts +43 -0
  105. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +110 -0
  106. package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +43 -0
  107. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +8 -3
  108. package/corpus/templates/analytics/app/i18n/zh-TW.ts +64 -2
  109. package/corpus/templates/analytics/app/i18n-data.ts +783 -3
  110. package/corpus/templates/analytics/app/pages/Agents.tsx +359 -19
  111. package/corpus/templates/analytics/app/pages/Settings.tsx +3 -2
  112. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +34 -1
  113. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +28 -0
  114. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +18 -1
  115. package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +7 -10
  116. package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +8 -2
  117. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +479 -23
  118. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +0 -9
  119. package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +11 -0
  120. package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +9 -1
  121. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +157 -35
  122. package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +17 -2
  123. package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +4 -0
  124. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +80 -220
  125. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -99
  126. package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +262 -104
  127. package/corpus/templates/analytics/app/routes/team.tsx +1 -1
  128. package/corpus/templates/analytics/changelog/2026-07-08-admins-can-audit-dashboard-usage-ownership-and-cleanup-signa.md +6 -0
  129. package/corpus/templates/analytics/changelog/2026-07-08-agent-monitoring-stays-available-to-non-admins.md +6 -0
  130. package/corpus/templates/analytics/changelog/2026-07-08-alert-rules-are-easier-to-scan-expand-and-edit-from-settings.md +6 -0
  131. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-forms-remember-last-email-recipients.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-rules-can-now-use-per-rule-slack-and-webhook.md +6 -0
  133. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +5 -0
  134. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-tables-keep-their-size-while-loading.md +6 -0
  135. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-usage-now-counts-explorer-dashboard-traffic.md +6 -0
  136. package/corpus/templates/analytics/changelog/2026-07-08-demo-mode-session-emails-are-filtered-and-anonymized.md +6 -0
  137. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-adds-stack-traces-and-frequency-bars.md +6 -0
  138. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-now-shows-the-latest-occurrence-message-a.md +6 -0
  139. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-errors-only-show-test-action-when-empty.md +6 -0
  140. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-uptime-and-errors-tabs-now-clearly-show-which-view-is-active.md +6 -0
  141. package/corpus/templates/analytics/changelog/2026-07-08-production-session-replay-now-requires-private-blob-storage-.md +6 -0
  142. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-uses-stock-rrweb-sizing-again-so-recorded.md +6 -0
  143. package/corpus/templates/analytics/changelog/2026-07-08-shared-extension-links-now-show-a-clear-message-when-you-do-.md +6 -0
  144. package/corpus/templates/analytics/changelog/2026-07-08-sidebar-dashboard-menus-now-open-above-the-dashboard-canvas.md +6 -0
  145. package/corpus/templates/analytics/changelog/2026-07-08-team-settings-show-access-controls-next-to-member-lists.md +6 -0
  146. 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
  147. package/corpus/templates/analytics/changelog/2026-07-08-uptime-monitors-now-use-a-10-second-request-timeout-by-defau.md +6 -0
  148. package/corpus/templates/analytics/docs/uptime-monitoring.md +13 -11
  149. package/corpus/templates/analytics/server/db/schema-monitoring.ts +5 -1
  150. package/corpus/templates/analytics/server/db/schema.ts +56 -0
  151. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +92 -0
  152. package/corpus/templates/analytics/server/lib/dashboards-store.ts +334 -5
  153. package/corpus/templates/analytics/server/lib/error-capture.ts +231 -36
  154. package/corpus/templates/analytics/server/lib/session-replay.ts +114 -8
  155. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +65 -16
  156. package/corpus/templates/analytics/server/plugins/db.ts +122 -2
  157. package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +1 -0
  158. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +5 -0
  159. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
  160. package/corpus/templates/assets/.agents/skills/security/SKILL.md +7 -0
  161. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +20 -2
  162. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -1
  163. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  164. package/corpus/templates/assets/AGENTS.md +4 -0
  165. package/corpus/templates/assets/app/routes/settings.tsx +1 -1
  166. package/corpus/templates/assets/app/routes/team.tsx +1 -1
  167. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +5 -0
  168. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
  169. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
  170. package/corpus/templates/brain/.agents/skills/security/SKILL.md +7 -0
  171. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +20 -2
  172. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  173. package/corpus/templates/brain/AGENTS.md +4 -0
  174. package/corpus/templates/brain/app/routes/team.tsx +1 -1
  175. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +5 -0
  176. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
  177. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +7 -0
  178. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +20 -2
  179. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -1
  180. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  181. package/corpus/templates/calendar/AGENTS.md +4 -0
  182. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +11 -2
  183. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -8
  184. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +7 -1
  185. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +11 -2
  186. package/corpus/templates/calendar/app/lib/popover-click-guard.ts +48 -4
  187. package/corpus/templates/calendar/app/pages/Settings.tsx +1 -1
  188. package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
  189. package/corpus/templates/calendar/changelog/2026-07-08-clicking-empty-calendar-space-closes-an-open-event-popover-b.md +6 -0
  190. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +5 -0
  191. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
  192. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  193. package/corpus/templates/chat/.agents/skills/security/SKILL.md +7 -0
  194. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +20 -2
  195. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  196. package/corpus/templates/chat/AGENTS.md +4 -0
  197. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  198. package/corpus/templates/chat/app/routes/settings.tsx +2 -2
  199. package/corpus/templates/chat/app/routes/team.tsx +1 -1
  200. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +5 -0
  201. package/corpus/templates/clips/.agents/skills/security/SKILL.md +7 -0
  202. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +20 -2
  203. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  204. package/corpus/templates/clips/AGENTS.md +4 -0
  205. package/corpus/templates/clips/actions/finalize-recording.ts +9 -3
  206. package/corpus/templates/clips/actions/set-thumbnail.ts +11 -2
  207. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +1 -7
  208. package/corpus/templates/clips/app/components/player/player-controls.tsx +21 -13
  209. package/corpus/templates/clips/app/components/player/video-player.tsx +30 -75
  210. package/corpus/templates/clips/app/i18n/ar-SA.ts +6 -5
  211. package/corpus/templates/clips/app/i18n/de-DE.ts +6 -6
  212. package/corpus/templates/clips/app/i18n/en-US.ts +6 -5
  213. package/corpus/templates/clips/app/i18n/es-ES.ts +6 -5
  214. package/corpus/templates/clips/app/i18n/fr-FR.ts +6 -6
  215. package/corpus/templates/clips/app/i18n/hi-IN.ts +6 -5
  216. package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -5
  217. package/corpus/templates/clips/app/i18n/ko-KR.ts +6 -5
  218. package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -5
  219. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -5
  220. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -5
  221. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +51 -118
  222. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-notes-stay-active-from-tray-and-shortcut-controls.md +6 -0
  223. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-popovers-can-start-notes-and-join-the-meetin.md +6 -0
  224. package/corpus/templates/clips/changelog/2026-07-08-hosted-clip-uploads-now-clear-failed-buffered-chunks.md +6 -0
  225. package/corpus/templates/clips/changelog/2026-07-08-hosted-recording-uploads-now-avoid-sql-chunk-storage.md +6 -0
  226. package/corpus/templates/clips/changelog/2026-07-08-meeting-notes-keep-their-recording-state-when-the-desktop.md +6 -0
  227. package/corpus/templates/clips/changelog/2026-07-08-meeting-recaps-now-keep-summaries-action-items-and-transcrip.md +6 -0
  228. package/corpus/templates/clips/changelog/2026-07-08-meeting-reminder-dropdowns-now-expand-fully-instead-of-being.md +6 -0
  229. package/corpus/templates/clips/changelog/2026-07-08-video-playback-controls-now-match-loom-style-5-second-skips-.md +6 -0
  230. package/corpus/templates/clips/desktop/src/app.tsx +123 -3
  231. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +15 -1
  232. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -0
  233. package/corpus/templates/clips/desktop/src/styles.css +23 -1
  234. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +1 -3
  235. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +40 -6
  236. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -2
  237. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +3 -5
  238. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +23 -19
  239. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +3 -3
  240. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +0 -1
  241. package/corpus/templates/clips/desktop/src-tauri/src/state.rs +5 -0
  242. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -6
  243. package/corpus/templates/clips/server/lib/recording-upload-state.ts +63 -0
  244. package/corpus/templates/clips/server/lib/video-storage.ts +4 -0
  245. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +19 -13
  246. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +40 -1
  247. package/corpus/templates/content/.agents/skills/actions/SKILL.md +5 -0
  248. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
  249. package/corpus/templates/content/.agents/skills/security/SKILL.md +7 -0
  250. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +20 -2
  251. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -1
  252. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  253. package/corpus/templates/content/AGENTS.md +4 -0
  254. package/corpus/templates/content/actions/_batch-utils.ts +8 -0
  255. package/corpus/templates/content/actions/_builder-cms-read-client.ts +7 -5
  256. package/corpus/templates/content/actions/_database-source-utils.ts +776 -319
  257. package/corpus/templates/content/actions/_database-utils.ts +6 -1
  258. package/corpus/templates/content/actions/_property-utils.ts +168 -0
  259. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +19 -12
  260. package/corpus/templates/content/actions/bind-content-database-source-field.ts +19 -12
  261. package/corpus/templates/content/actions/delete-document.ts +9 -13
  262. package/corpus/templates/content/actions/refresh-content-database-source.ts +5 -5
  263. package/corpus/templates/content/app/components/editor/body-hydration.ts +35 -11
  264. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +47 -5
  265. package/corpus/templates/content/app/hooks/use-documents.ts +8 -2
  266. package/corpus/templates/content/app/routes/_app.settings.tsx +2 -2
  267. package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
  268. package/corpus/templates/content/changelog/2026-07-08-builder-source-sync-now-completes-reliably-on-hosted-databases.md +6 -0
  269. package/corpus/templates/content/changelog/2026-07-08-fixed-builder-database-sync-so-large-sources-continue-past-t.md +6 -0
  270. package/corpus/templates/content/server/plugins/db.ts +19 -0
  271. package/corpus/templates/design/.agents/skills/actions/SKILL.md +5 -0
  272. package/corpus/templates/design/.agents/skills/security/SKILL.md +7 -0
  273. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +20 -2
  274. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  275. package/corpus/templates/design/AGENTS.md +4 -0
  276. package/corpus/templates/design/actions/take-design-screenshot.ts +12 -9
  277. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -13
  278. package/corpus/templates/design/app/routes/team.tsx +1 -1
  279. package/corpus/templates/design/changelog/2026-07-08-local-images-added-to-designs-now-upload-to-file-storage-ins.md +6 -0
  280. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +5 -0
  281. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +7 -0
  282. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +20 -2
  283. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  284. package/corpus/templates/dispatch/AGENTS.md +4 -0
  285. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
  286. package/corpus/templates/dispatch/app/routes/settings.tsx +2 -2
  287. package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
  288. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +5 -0
  289. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
  290. package/corpus/templates/forms/.agents/skills/security/SKILL.md +7 -0
  291. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +20 -2
  292. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -1
  293. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  294. package/corpus/templates/forms/AGENTS.md +4 -0
  295. package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -2
  296. package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
  297. package/corpus/templates/forms/shared/navigation.ts +1 -1
  298. package/corpus/templates/macros/.agents/skills/security/SKILL.md +7 -0
  299. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  300. package/corpus/templates/macros/AGENTS.md +4 -0
  301. package/corpus/templates/macros/app/routes/settings.tsx +2 -2
  302. package/corpus/templates/macros/app/routes/team.tsx +1 -1
  303. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +5 -0
  304. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +1 -1
  305. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
  306. package/corpus/templates/mail/.agents/skills/security/SKILL.md +7 -0
  307. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +20 -2
  308. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -1
  309. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  310. package/corpus/templates/mail/AGENTS.md +4 -0
  311. package/corpus/templates/mail/changelog/2026-07-08-mail-attachments-in-hosted-environments-now-require-file-sto.md +6 -0
  312. package/corpus/templates/mail/server/handlers/media.ts +26 -1
  313. package/corpus/templates/mail/server/lib/outgoing-email.ts +24 -1
  314. package/corpus/templates/mail/server/lib/upload-store.ts +2 -1
  315. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +5 -0
  316. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
  317. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
  318. package/corpus/templates/plan/.agents/skills/security/SKILL.md +7 -0
  319. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +20 -2
  320. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  321. package/corpus/templates/plan/AGENTS.md +4 -0
  322. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
  323. package/corpus/templates/plan/app/routes/settings.tsx +2 -2
  324. package/corpus/templates/plan/app/routes/team.tsx +1 -1
  325. package/corpus/templates/plan/changelog/2026-07-08-hosted-plan-images-now-require-connected-storage.md +6 -0
  326. package/corpus/templates/plan/server/lib/plan-assets.ts +33 -4
  327. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +5 -0
  328. package/corpus/templates/slides/.agents/skills/security/SKILL.md +7 -0
  329. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +20 -2
  330. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  331. package/corpus/templates/slides/AGENTS.md +4 -0
  332. package/corpus/templates/slides/actions/generate-image-api.ts +15 -3
  333. package/corpus/templates/slides/app/routes/settings.tsx +2 -2
  334. package/corpus/templates/slides/app/routes/team.tsx +1 -1
  335. package/corpus/templates/slides/changelog/2026-07-08-generated-slide-images-now-return-hosted-file-storage-urls-i.md +6 -0
  336. package/corpus/templates/slides/shared/api.ts +1 -1
  337. package/corpus/templates/videos/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  338. package/corpus/templates/voice/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  339. package/dist/agent/production-agent.d.ts +5 -1
  340. package/dist/agent/production-agent.d.ts.map +1 -1
  341. package/dist/agent/production-agent.js +112 -42
  342. package/dist/agent/production-agent.js.map +1 -1
  343. package/dist/agent/tool-search.d.ts +2 -0
  344. package/dist/agent/tool-search.d.ts.map +1 -1
  345. package/dist/agent/tool-search.js +60 -4
  346. package/dist/agent/tool-search.js.map +1 -1
  347. package/dist/application-state/store.d.ts.map +1 -1
  348. package/dist/application-state/store.js +8 -2
  349. package/dist/application-state/store.js.map +1 -1
  350. package/dist/cli/index.js +19 -0
  351. package/dist/cli/index.js.map +1 -1
  352. package/dist/cli/upgrade.d.ts +100 -0
  353. package/dist/cli/upgrade.d.ts.map +1 -0
  354. package/dist/cli/upgrade.js +678 -0
  355. package/dist/cli/upgrade.js.map +1 -0
  356. package/dist/client/AssistantChat.d.ts.map +1 -1
  357. package/dist/client/AssistantChat.js +25 -14
  358. package/dist/client/AssistantChat.js.map +1 -1
  359. package/dist/client/HighlightedCodeBlock.d.ts +2 -0
  360. package/dist/client/HighlightedCodeBlock.d.ts.map +1 -1
  361. package/dist/client/HighlightedCodeBlock.js +10 -1
  362. package/dist/client/HighlightedCodeBlock.js.map +1 -1
  363. package/dist/client/PoweredByBadge.d.ts +1 -1
  364. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  365. package/dist/client/PoweredByBadge.js +3 -9
  366. package/dist/client/PoweredByBadge.js.map +1 -1
  367. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  368. package/dist/client/agent-chat-adapter.js +60 -13
  369. package/dist/client/agent-chat-adapter.js.map +1 -1
  370. package/dist/client/chat/message-components.d.ts.map +1 -1
  371. package/dist/client/chat/message-components.js +61 -8
  372. package/dist/client/chat/message-components.js.map +1 -1
  373. package/dist/client/chat/tool-call-display.d.ts +12 -0
  374. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  375. package/dist/client/chat/tool-call-display.js +136 -42
  376. package/dist/client/chat/tool-call-display.js.map +1 -1
  377. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
  378. package/dist/client/chat/widgets/DataTableWidget.js +19 -2
  379. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
  380. package/dist/client/code-agent-chat-adapter.js +2 -9
  381. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  382. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  383. package/dist/client/db-admin/TableEditor.js +19 -2
  384. package/dist/client/db-admin/TableEditor.js.map +1 -1
  385. package/dist/client/db-admin/export-utils.d.ts +2 -0
  386. package/dist/client/db-admin/export-utils.d.ts.map +1 -1
  387. package/dist/client/db-admin/export-utils.js +11 -3
  388. package/dist/client/db-admin/export-utils.js.map +1 -1
  389. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
  390. package/dist/client/db-admin/useAgentSync.js +63 -0
  391. package/dist/client/db-admin/useAgentSync.js.map +1 -1
  392. package/dist/client/error-capture.d.ts.map +1 -1
  393. package/dist/client/error-capture.js +41 -7
  394. package/dist/client/error-capture.js.map +1 -1
  395. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  396. package/dist/client/extensions/EmbeddedExtension.js +3 -1
  397. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  398. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  399. package/dist/client/extensions/ExtensionViewer.js +32 -5
  400. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  401. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  402. package/dist/client/extensions/InlineExtensionFrame.js +3 -1
  403. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  404. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  405. package/dist/client/extensions/portable-extension.js +1 -0
  406. package/dist/client/extensions/portable-extension.js.map +1 -1
  407. package/dist/client/org/OrgSwitcher.d.ts +1 -1
  408. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  409. package/dist/client/org/OrgSwitcher.js +11 -6
  410. package/dist/client/org/OrgSwitcher.js.map +1 -1
  411. package/dist/client/org/TeamPage.d.ts.map +1 -1
  412. package/dist/client/org/TeamPage.js +5 -5
  413. package/dist/client/org/TeamPage.js.map +1 -1
  414. package/dist/client/session-replay.d.ts +0 -8
  415. package/dist/client/session-replay.d.ts.map +1 -1
  416. package/dist/client/session-replay.js +3 -80
  417. package/dist/client/session-replay.js.map +1 -1
  418. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  419. package/dist/client/settings/SettingsPanel.js +89 -33
  420. package/dist/client/settings/SettingsPanel.js.map +1 -1
  421. package/dist/client/settings/SettingsSection.d.ts +19 -4
  422. package/dist/client/settings/SettingsSection.d.ts.map +1 -1
  423. package/dist/client/settings/SettingsSection.js +33 -4
  424. package/dist/client/settings/SettingsSection.js.map +1 -1
  425. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  426. package/dist/client/settings/SettingsTabsPage.js +21 -10
  427. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  428. package/dist/client/sse-event-processor.d.ts +9 -0
  429. package/dist/client/sse-event-processor.d.ts.map +1 -1
  430. package/dist/client/sse-event-processor.js +20 -2
  431. package/dist/client/sse-event-processor.js.map +1 -1
  432. package/dist/db-admin/agent-tools.d.ts.map +1 -1
  433. package/dist/db-admin/agent-tools.js +7 -2
  434. package/dist/db-admin/agent-tools.js.map +1 -1
  435. package/dist/db-admin/operations.d.ts.map +1 -1
  436. package/dist/db-admin/operations.js +90 -4
  437. package/dist/db-admin/operations.js.map +1 -1
  438. package/dist/db-admin/routes.d.ts.map +1 -1
  439. package/dist/db-admin/routes.js +1 -0
  440. package/dist/db-admin/routes.js.map +1 -1
  441. package/dist/db-admin/types.d.ts +4 -0
  442. package/dist/db-admin/types.d.ts.map +1 -1
  443. package/dist/db-admin/types.js.map +1 -1
  444. package/dist/extensions/actions.d.ts.map +1 -1
  445. package/dist/extensions/actions.js +85 -5
  446. package/dist/extensions/actions.js.map +1 -1
  447. package/dist/extensions/html-shell.d.ts +5 -4
  448. package/dist/extensions/html-shell.d.ts.map +1 -1
  449. package/dist/extensions/html-shell.js.map +1 -1
  450. package/dist/extensions/routes.d.ts.map +1 -1
  451. package/dist/extensions/routes.js +8 -0
  452. package/dist/extensions/routes.js.map +1 -1
  453. package/dist/navigation/index.d.ts +1 -1
  454. package/dist/navigation/index.d.ts.map +1 -1
  455. package/dist/navigation/index.js +1 -1
  456. package/dist/navigation/index.js.map +1 -1
  457. package/dist/notifications/channels.d.ts +8 -3
  458. package/dist/notifications/channels.d.ts.map +1 -1
  459. package/dist/notifications/channels.js +61 -22
  460. package/dist/notifications/channels.js.map +1 -1
  461. package/dist/notifications/registry.d.ts.map +1 -1
  462. package/dist/notifications/registry.js +14 -3
  463. package/dist/notifications/registry.js.map +1 -1
  464. package/dist/notifications/types.d.ts +4 -1
  465. package/dist/notifications/types.d.ts.map +1 -1
  466. package/dist/notifications/types.js.map +1 -1
  467. package/dist/resources/handlers.d.ts +5 -0
  468. package/dist/resources/handlers.d.ts.map +1 -1
  469. package/dist/resources/handlers.js +9 -8
  470. package/dist/resources/handlers.js.map +1 -1
  471. package/dist/server/agent-chat-plugin.d.ts +5 -1
  472. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  473. package/dist/server/agent-chat-plugin.js +2 -2
  474. package/dist/server/agent-chat-plugin.js.map +1 -1
  475. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  476. package/dist/server/poll.d.ts +12 -4
  477. package/dist/server/poll.d.ts.map +1 -1
  478. package/dist/server/poll.js +236 -9
  479. package/dist/server/poll.js.map +1 -1
  480. package/dist/server/request-context.d.ts +7 -0
  481. package/dist/server/request-context.d.ts.map +1 -1
  482. package/dist/server/request-context.js.map +1 -1
  483. package/dist/styles/agent-conversation.css +1 -1
  484. package/dist/styles/agent-native.css +27 -0
  485. package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -0
  486. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  487. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  488. package/dist/templates/default/.agents/skills/security/SKILL.md +7 -0
  489. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  490. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  491. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  492. package/dist/templates/default/AGENTS.md +14 -5
  493. package/dist/templates/default/package.json +2 -1
  494. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  495. package/dist/templates/headless/AGENTS.md +13 -3
  496. package/dist/templates/headless/package.json +1 -0
  497. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  498. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  499. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  500. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  501. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  502. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  503. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  504. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  505. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  506. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  507. package/dist/templates/workspace-core/AGENTS.md +7 -1
  508. package/dist/templates/workspace-root/AGENTS.md +17 -5
  509. package/dist/templates/workspace-root/package.json +1 -0
  510. package/docs/content/faq.mdx +17 -0
  511. package/docs/content/notifications.mdx +12 -6
  512. package/package.json +2 -2
  513. package/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  514. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  515. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  516. package/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  517. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  518. package/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  519. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  520. package/src/templates/default/AGENTS.md +14 -5
  521. package/src/templates/default/package.json +2 -1
  522. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  523. package/src/templates/headless/AGENTS.md +13 -3
  524. package/src/templates/headless/package.json +1 -0
  525. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  526. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  527. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  528. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  529. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  530. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  531. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  532. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  533. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  534. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  535. package/src/templates/workspace-core/AGENTS.md +7 -1
  536. package/src/templates/workspace-root/AGENTS.md +17 -5
  537. package/src/templates/workspace-root/package.json +1 -0
  538. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-clamps-ultra-wide-viewports-while-keeping-the.md +0 -6
@@ -6,12 +6,14 @@ import {
6
6
  IconLoader2,
7
7
  IconCircleX,
8
8
  IconCheck,
9
- IconSquareFilled,
10
- IconChevronDown,
9
+ IconChevronRight,
11
10
  IconCopy,
11
+ IconCode,
12
+ IconBrandSlack,
13
+ IconTerminal2,
14
+ IconDatabase,
12
15
  IconSearch,
13
- IconArrowsMaximize,
14
- IconArrowsMinimize,
16
+ IconFileCode,
15
17
  IconShieldCheck,
16
18
  IconX,
17
19
  } from "@tabler/icons-react";
@@ -19,7 +21,7 @@ import React, {
19
21
  useState,
20
22
  useEffect,
21
23
  useCallback,
22
- useMemo,
24
+ useLayoutEffect,
23
25
  useRef,
24
26
  } from "react";
25
27
 
@@ -27,6 +29,7 @@ import type { ActionChatUIConfig } from "../../action-ui.js";
27
29
  import type { AgentMcpAppPayload } from "../../mcp-client/app-result.js";
28
30
  import { AgentTaskCard } from "../AgentTaskCard.js";
29
31
  import { writeClipboardText } from "../clipboard.js";
32
+ import { Dialog, DialogContent, DialogTitle } from "../components/ui/dialog.js";
30
33
  import { ConnectBuilderCard } from "../ConnectBuilderCard.js";
31
34
  import { McpAppRenderer } from "../mcp-apps/McpAppRenderer.js";
32
35
  import type { ContentPart } from "../sse-event-processor.js";
@@ -225,53 +228,97 @@ export function toolResultPayload(
225
228
  };
226
229
  }
227
230
 
228
- // ─── Search highlight helpers ─────────────────────────────────────────────────
231
+ // ─── Tool icon helpers ────────────────────────────────────────────────────────
229
232
 
230
- function escapeRegExp(value: string): string {
231
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
232
- }
233
-
234
- function countTextMatches(text: string, query: string): number {
235
- const needle = query.trim();
236
- if (!needle) return 0;
237
- return Array.from(text.matchAll(new RegExp(escapeRegExp(needle), "gi")))
238
- .length;
239
- }
233
+ type ToolIconComponent = React.ComponentType<{
234
+ className?: string;
235
+ size?: number | string;
236
+ }>;
240
237
 
241
- function renderHighlightedSearchText(
242
- text: string,
243
- query: string,
244
- ): React.ReactNode {
245
- const needle = query.trim();
246
- if (!needle) return text;
247
- const regex = new RegExp(escapeRegExp(needle), "gi");
248
- const parts: React.ReactNode[] = [];
249
- let lastIndex = 0;
250
- let match: RegExpExecArray | null;
251
- while ((match = regex.exec(text))) {
252
- if (match.index > lastIndex) {
253
- parts.push(text.slice(lastIndex, match.index));
254
- }
255
- parts.push(<mark key={`${match.index}-${match[0]}`}>{match[0]}</mark>);
256
- lastIndex = match.index + match[0].length;
257
- if (match[0].length === 0) regex.lastIndex += 1;
238
+ function resolveToolIcon(toolName: string): ToolIconComponent {
239
+ const name = toolName.toLowerCase();
240
+ if (name.includes("slack")) return IconBrandSlack;
241
+ if (
242
+ name.includes("bash") ||
243
+ name.includes("shell") ||
244
+ name.includes("terminal") ||
245
+ name.includes("run-code") ||
246
+ name.includes("exec")
247
+ ) {
248
+ return IconTerminal2;
249
+ }
250
+ if (
251
+ name.includes("sql") ||
252
+ name.includes("bigquery") ||
253
+ name.includes("db-query") ||
254
+ name.includes("query")
255
+ ) {
256
+ return IconDatabase;
258
257
  }
259
- if (lastIndex < text.length) parts.push(text.slice(lastIndex));
260
- return parts;
258
+ if (
259
+ name.includes("search") ||
260
+ name.includes("find") ||
261
+ name.includes("grep")
262
+ ) {
263
+ return IconSearch;
264
+ }
265
+ if (
266
+ name.includes("file") ||
267
+ name.includes("read") ||
268
+ name.includes("write") ||
269
+ name.includes("edit")
270
+ ) {
271
+ return IconFileCode;
272
+ }
273
+ return IconCode;
261
274
  }
262
275
 
263
- // ─── ToolDetailViewer ──────────────────────────────────────────────────────────
276
+ // ─── Simple code viewer (Codex-style gray box) ────────────────────────────────
264
277
 
265
- function ToolDetailViewer({ payload }: { payload: ToolDetailPayload }) {
266
- const [expanded, setExpanded] = useState(false);
267
- const [searchOpen, setSearchOpen] = useState(false);
268
- const [search, setSearch] = useState("");
278
+ function SimpleCodeViewer({
279
+ text,
280
+ lang,
281
+ className,
282
+ maxHeightClass = "max-h-56",
283
+ }: {
284
+ text: string;
285
+ lang: string;
286
+ className?: string;
287
+ maxHeightClass?: string;
288
+ }) {
289
+ return (
290
+ <div
291
+ className={cn(
292
+ "agent-tool-code overflow-auto rounded-md bg-muted/70 font-mono text-[11px] leading-relaxed text-foreground",
293
+ maxHeightClass,
294
+ className,
295
+ )}
296
+ >
297
+ {lang !== "text" && (
298
+ <div className="sticky top-0 z-[1] flex items-center justify-between border-b border-border/40 bg-muted/90 px-2.5 py-1">
299
+ <span className="font-mono text-[10px] uppercase tracking-wide text-muted-foreground/80">
300
+ {lang}
301
+ </span>
302
+ </div>
303
+ )}
304
+ <HighlightedCodeBlock code={text} lang={lang} />
305
+ </div>
306
+ );
307
+ }
308
+
309
+ function ToolOutputModal({
310
+ open,
311
+ onOpenChange,
312
+ title,
313
+ payload,
314
+ }: {
315
+ open: boolean;
316
+ onOpenChange: (open: boolean) => void;
317
+ title: string;
318
+ payload: ToolDetailPayload;
319
+ }) {
269
320
  const [copied, setCopied] = useState(false);
270
321
  const copyResetRef = useRef<ReturnType<typeof setTimeout> | null>(null);
271
- const matchCount = useMemo(
272
- () => countTextMatches(payload.text, search),
273
- [payload.text, search],
274
- );
275
322
 
276
323
  useEffect(() => {
277
324
  return () => {
@@ -292,81 +339,95 @@ function ToolDetailViewer({ payload }: { payload: ToolDetailPayload }) {
292
339
  }, [payload.copyText]);
293
340
 
294
341
  return (
295
- <div className="rounded-md border border-border/50 bg-background/60">
296
- <div className="flex min-h-9 flex-wrap items-center gap-2 border-b border-border/50 px-2.5 py-1.5">
297
- <div className="min-w-0 flex-1">
298
- <div className="flex min-w-0 items-center gap-1.5">
299
- <span className="truncate text-[11px] font-medium text-foreground/85">
300
- {payload.title}
301
- </span>
302
- {payload.lang !== "text" && (
303
- <span className="shrink-0 rounded border border-border/60 px-1 py-0.5 font-mono text-[9px] uppercase leading-none text-muted-foreground">
304
- {payload.lang}
305
- </span>
306
- )}
307
- </div>
342
+ <Dialog open={open} onOpenChange={onOpenChange}>
343
+ <DialogContent className="flex h-[min(80vh,720px)] w-[min(92vw,760px)] max-w-[760px] flex-col gap-0 overflow-hidden p-0">
344
+ <div className="flex shrink-0 items-center justify-between gap-3 border-b border-border px-5 py-3 pr-12">
345
+ <DialogTitle className="truncate text-sm font-medium">
346
+ {title}
347
+ </DialogTitle>
348
+ <button
349
+ type="button"
350
+ onClick={copyValue}
351
+ className="inline-flex h-7 items-center gap-1.5 rounded-md px-2 text-xs text-muted-foreground hover:bg-accent hover:text-foreground"
352
+ >
353
+ {copied ? <IconCheck size={13} /> : <IconCopy size={13} />}
354
+ {copied ? "Copied" : "Copy"}
355
+ </button>
308
356
  </div>
309
- <button
310
- type="button"
311
- onClick={() => setSearchOpen((v) => !v)}
312
- aria-label={`Search ${payload.title.toLowerCase()}`}
313
- aria-pressed={searchOpen}
314
- className={cn(
315
- "inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground",
316
- searchOpen && "bg-accent text-foreground",
317
- )}
318
- >
319
- <IconSearch size={12} />
320
- </button>
321
- <button
322
- type="button"
323
- onClick={() => setExpanded((v) => !v)}
324
- aria-label={expanded ? "Shrink code viewer" : "Expand code viewer"}
325
- aria-pressed={expanded}
326
- className="inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground"
327
- >
328
- {expanded ? (
329
- <IconArrowsMinimize size={12} />
330
- ) : (
331
- <IconArrowsMaximize size={12} />
332
- )}
333
- </button>
334
- <button
335
- type="button"
336
- onClick={copyValue}
337
- className="inline-flex h-6 items-center gap-1 rounded-md px-1.5 font-sans text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground"
338
- >
339
- {copied ? <IconCheck size={12} /> : <IconCopy size={12} />}
340
- {copied ? "Copied" : "Copy"}
341
- </button>
342
- </div>
343
- {searchOpen && (
344
- <div className="flex items-center gap-2 border-b border-border/50 px-2.5 py-2">
345
- <input
346
- value={search}
347
- onChange={(e) => setSearch(e.target.value)}
348
- placeholder="Find"
349
- className="h-7 min-w-0 flex-1 rounded-md border border-border bg-background px-2 text-xs text-foreground outline-none placeholder:text-muted-foreground focus:ring-1 focus:ring-ring"
357
+ <div className="min-h-0 flex-1 overflow-auto p-4">
358
+ <SimpleCodeViewer
359
+ text={payload.text}
360
+ lang={payload.lang}
361
+ maxHeightClass="max-h-none"
350
362
  />
351
- <span className="shrink-0 text-[11px] text-muted-foreground">
352
- {search.trim() ? matchCount : ""}
353
- </span>
354
363
  </div>
355
- )}
356
- <div
357
- className={cn(
358
- "agent-tool-code overflow-auto font-mono text-[11px] leading-relaxed text-foreground",
359
- expanded ? "max-h-[70vh]" : "max-h-72",
360
- )}
361
- >
362
- {search.trim() ? (
363
- <pre>
364
- <code>{renderHighlightedSearchText(payload.text, search)}</code>
365
- </pre>
366
- ) : (
367
- <HighlightedCodeBlock code={payload.text} lang={payload.lang} />
368
- )}
369
- </div>
364
+ </DialogContent>
365
+ </Dialog>
366
+ );
367
+ }
368
+
369
+ // ─── Collapsible height animation ─────────────────────────────────────────────
370
+
371
+ function AnimatedCollapse({
372
+ open,
373
+ children,
374
+ }: {
375
+ open: boolean;
376
+ children: React.ReactNode;
377
+ }) {
378
+ const ref = useRef<HTMLDivElement>(null);
379
+ const [height, setHeight] = useState<number | "auto">(open ? "auto" : 0);
380
+ const [mounted, setMounted] = useState(open);
381
+ const reduceMotionRef = useRef(false);
382
+
383
+ useEffect(() => {
384
+ reduceMotionRef.current =
385
+ typeof window !== "undefined" &&
386
+ !!window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
387
+ }, []);
388
+
389
+ useLayoutEffect(() => {
390
+ if (open) setMounted(true);
391
+ }, [open]);
392
+
393
+ useLayoutEffect(() => {
394
+ const el = ref.current;
395
+ if (!el || !mounted) return;
396
+ if (reduceMotionRef.current) {
397
+ setHeight(open ? "auto" : 0);
398
+ if (!open) setMounted(false);
399
+ return;
400
+ }
401
+ if (open) {
402
+ const full = el.scrollHeight;
403
+ setHeight(0);
404
+ const frame = requestAnimationFrame(() => setHeight(full));
405
+ return () => cancelAnimationFrame(frame);
406
+ }
407
+ setHeight(el.scrollHeight);
408
+ const frame = requestAnimationFrame(() => setHeight(0));
409
+ return () => cancelAnimationFrame(frame);
410
+ }, [open, mounted]);
411
+
412
+ const onTransitionEnd = useCallback(
413
+ (event: React.TransitionEvent<HTMLDivElement>) => {
414
+ if (event.propertyName !== "height") return;
415
+ if (open) setHeight("auto");
416
+ else setMounted(false);
417
+ },
418
+ [open],
419
+ );
420
+
421
+ if (!mounted) return null;
422
+
423
+ return (
424
+ <div
425
+ ref={ref}
426
+ className="overflow-hidden transition-[height] duration-200 ease-out"
427
+ style={{ height: height === "auto" ? "auto" : `${height}px` }}
428
+ onTransitionEnd={onTransitionEnd}
429
+ >
430
+ {children}
370
431
  </div>
371
432
  );
372
433
  }
@@ -548,6 +609,7 @@ function ToolCallDisplayGeneric({
548
609
 
549
610
  const isAgentCall = toolName.startsWith("agent:");
550
611
  const [expanded, setExpanded] = useState(isAgentCall);
612
+ const [outputOpen, setOutputOpen] = useState(false);
551
613
  const agentName = isAgentCall ? toolName.slice(6) : null;
552
614
  const isAgentError = isAgentCall && result === "Error calling agent";
553
615
  const agentStreamText = isAgentCall ? (argsText ?? "") : "";
@@ -659,34 +721,47 @@ function ToolCallDisplayGeneric({
659
721
  ? hasStreamText
660
722
  : hasArgs || result !== undefined;
661
723
  const isExpanded = isAgentCall ? hasStreamText && expanded : expanded;
724
+ const ToolIcon = resolveToolIcon(toolName);
725
+ const outputTitle = `Raw ${toolName} tool call output`;
662
726
 
663
727
  return (
664
- <div className="my-1 w-full overflow-hidden">
728
+ <div className="group/tool my-0.5 w-full overflow-hidden">
665
729
  {mcpApp && <McpAppRenderer app={mcpApp} className="mb-1.5" />}
666
730
  <button
731
+ type="button"
667
732
  onClick={() => canExpand && setExpanded(!isExpanded)}
668
733
  aria-expanded={canExpand ? isExpanded : undefined}
669
734
  className={cn(
670
- "flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs font-mono w-full text-left overflow-hidden",
671
- isRunning
672
- ? "bg-muted text-muted-foreground"
673
- : "bg-muted text-muted-foreground hover:bg-accent",
735
+ "flex w-full items-center gap-1.5 rounded-md py-0.5 text-left text-[13px] text-muted-foreground transition-colors",
736
+ canExpand && "hover:text-foreground",
737
+ isRunning && "text-muted-foreground",
674
738
  )}
675
739
  >
676
- <span className="shrink-0">
740
+ <span className="relative flex size-4 shrink-0 items-center justify-center">
677
741
  {isRunning ? (
678
- <IconLoader2 className="h-3 w-3 animate-spin" />
742
+ <IconLoader2 className="size-3.5 animate-spin" />
679
743
  ) : isAgentError ? (
680
- <IconCircleX className="h-3 w-3 text-destructive" />
681
- ) : result !== undefined ? (
682
- <IconCheck className="h-3 w-3 text-emerald-500" />
744
+ <IconCircleX className="size-3.5 text-destructive" />
683
745
  ) : (
684
- <IconSquareFilled className="h-3 w-3 text-muted-foreground" />
746
+ <>
747
+ <ToolIcon
748
+ className={cn(
749
+ "size-3.5 transition-opacity",
750
+ canExpand && "group-hover/tool:opacity-0",
751
+ )}
752
+ />
753
+ {canExpand && (
754
+ <IconChevronRight
755
+ className={cn(
756
+ "absolute size-3.5 opacity-0 transition-all group-hover/tool:opacity-100",
757
+ isExpanded && "rotate-90",
758
+ )}
759
+ />
760
+ )}
761
+ </>
685
762
  )}
686
763
  </span>
687
- <span className="truncate min-w-0">
688
- <span className="font-medium">{displayName}</span>
689
- </span>
764
+ <span className="min-w-0 truncate font-normal">{displayName}</span>
690
765
  {repeatCount && repeatCount > 1 && (
691
766
  <span
692
767
  className="shrink-0 rounded border border-border/60 px-1.5 py-0.5 text-[10px] leading-none text-muted-foreground"
@@ -695,16 +770,8 @@ function ToolCallDisplayGeneric({
695
770
  {repeatCount}x
696
771
  </span>
697
772
  )}
698
- {canExpand && (
699
- <IconChevronDown
700
- className={cn(
701
- "ml-auto h-3 w-3 shrink-0 opacity-40",
702
- isExpanded && "rotate-180",
703
- )}
704
- />
705
- )}
706
773
  </button>
707
- {isExpanded && isAgentCall && hasStreamText && (
774
+ <AnimatedCollapse open={isExpanded && isAgentCall && hasStreamText}>
708
775
  <div
709
776
  ref={streamRef}
710
777
  className="mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground break-words max-h-48 overflow-y-auto agent-markdown prose prose-sm prose-invert max-w-none"
@@ -721,12 +788,36 @@ function ToolCallDisplayGeneric({
721
788
  <span style={{ whiteSpace: "pre-wrap" }}>{agentStreamText}</span>
722
789
  )}
723
790
  </div>
724
- )}
725
- {isExpanded && !isAgentCall && (hasArgs || result !== undefined) && (
726
- <div className="mt-1 space-y-2 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground">
727
- {inputPayload && <ToolDetailViewer payload={inputPayload} />}
728
- {resultPayload && <ToolDetailViewer payload={resultPayload} />}
791
+ </AnimatedCollapse>
792
+ <AnimatedCollapse
793
+ open={isExpanded && !isAgentCall && (hasArgs || result !== undefined)}
794
+ >
795
+ <div className="mt-1 space-y-2 pl-5">
796
+ {inputPayload && (
797
+ <SimpleCodeViewer
798
+ text={inputPayload.text}
799
+ lang={inputPayload.lang}
800
+ />
801
+ )}
802
+ {resultPayload && (
803
+ <button
804
+ type="button"
805
+ onClick={() => setOutputOpen(true)}
806
+ aria-label={`View ${toolName} output`}
807
+ className="inline-flex size-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors hover:bg-accent hover:text-foreground"
808
+ >
809
+ <IconCode className="size-3.5" />
810
+ </button>
811
+ )}
729
812
  </div>
813
+ </AnimatedCollapse>
814
+ {resultPayload && (
815
+ <ToolOutputModal
816
+ open={outputOpen}
817
+ onOpenChange={setOutputOpen}
818
+ title={outputTitle}
819
+ payload={resultPayload}
820
+ />
730
821
  )}
731
822
  {approval && (
732
823
  <ApprovalAffordance toolName={toolName} approval={approval} />
@@ -788,6 +879,8 @@ export function ReconnectStreamMessage({
788
879
  const chatRunning = React.useContext(ChatRunningContext);
789
880
  const streamingTextPartIndex =
790
881
  content.at(-1)?.type === "text" ? content.length - 1 : -1;
882
+ const streamingReasoningPartIndex =
883
+ content.at(-1)?.type === "reasoning" ? content.length - 1 : -1;
791
884
 
792
885
  return (
793
886
  <div className="flex justify-start">
@@ -805,6 +898,15 @@ export function ReconnectStreamMessage({
805
898
  />
806
899
  );
807
900
  }
901
+ if (part.type === "reasoning") {
902
+ return (
903
+ <ReasoningCell
904
+ key={`reconnect-reasoning-${i}`}
905
+ text={part.text}
906
+ isStreaming={chatRunning && i === streamingReasoningPartIndex}
907
+ />
908
+ );
909
+ }
808
910
  if (part.type === "tool-call") {
809
911
  return (
810
912
  <ToolCallDisplay
@@ -832,6 +934,115 @@ export function ReconnectStreamMessage({
832
934
  );
833
935
  }
834
936
 
937
+ // ─── Reasoning / Thinking cell ────────────────────────────────────────────────
938
+
939
+ export function ReasoningCell({
940
+ text,
941
+ isStreaming = false,
942
+ defaultOpen,
943
+ }: {
944
+ text: string;
945
+ isStreaming?: boolean;
946
+ defaultOpen?: boolean;
947
+ }) {
948
+ const [open, setOpen] = useState(defaultOpen ?? isStreaming);
949
+ const trimmed = text.trim();
950
+ if (!trimmed && !isStreaming) return null;
951
+
952
+ return (
953
+ <div className="my-0.5 w-full">
954
+ <button
955
+ type="button"
956
+ onClick={() => setOpen((v) => !v)}
957
+ aria-expanded={open}
958
+ className="flex items-center gap-1.5 py-0.5 text-[13px] text-muted-foreground transition-colors hover:text-foreground"
959
+ >
960
+ <IconChevronRight
961
+ className={cn(
962
+ "size-3.5 shrink-0 transition-transform",
963
+ open && "rotate-90",
964
+ )}
965
+ />
966
+ <span>{isStreaming ? "Thinking" : "Thought"}</span>
967
+ </button>
968
+ <AnimatedCollapse open={open}>
969
+ <div className="pl-5 pb-1 text-[13px] leading-relaxed text-muted-foreground whitespace-pre-wrap">
970
+ {trimmed || (isStreaming ? "…" : "")}
971
+ </div>
972
+ </AnimatedCollapse>
973
+ </div>
974
+ );
975
+ }
976
+
977
+ // ─── Worked-for duration helpers ──────────────────────────────────────────────
978
+
979
+ export function formatWorkedDuration(ms: number): string {
980
+ const totalSeconds = Math.max(0, Math.round(ms / 1000));
981
+ if (totalSeconds < 60) {
982
+ return totalSeconds <= 1 ? "1s" : `${totalSeconds}s`;
983
+ }
984
+ const minutes = Math.floor(totalSeconds / 60);
985
+ const seconds = totalSeconds % 60;
986
+ if (minutes < 60) {
987
+ if (seconds === 0) return `${minutes}m`;
988
+ return `${minutes}m ${seconds}s`;
989
+ }
990
+ const hours = Math.floor(minutes / 60);
991
+ const remMinutes = minutes % 60;
992
+ if (remMinutes === 0) return `${hours}h`;
993
+ return `${hours}h ${remMinutes}m`;
994
+ }
995
+
996
+ export function WorkedForSummary({
997
+ durationMs,
998
+ autoCollapse = false,
999
+ children,
1000
+ }: {
1001
+ durationMs?: number | null;
1002
+ /** When true, start open then animate closed (post-run collapse). */
1003
+ autoCollapse?: boolean;
1004
+ children: React.ReactNode;
1005
+ }) {
1006
+ const [open, setOpen] = useState(autoCollapse);
1007
+ const didAutoCollapseRef = useRef(false);
1008
+
1009
+ useEffect(() => {
1010
+ if (!autoCollapse || didAutoCollapseRef.current) return;
1011
+ didAutoCollapseRef.current = true;
1012
+ const frame = requestAnimationFrame(() => {
1013
+ setOpen(false);
1014
+ });
1015
+ return () => cancelAnimationFrame(frame);
1016
+ }, [autoCollapse]);
1017
+
1018
+ const label =
1019
+ durationMs != null && durationMs >= 1000
1020
+ ? `Worked for ${formatWorkedDuration(durationMs)}`
1021
+ : "Worked";
1022
+
1023
+ return (
1024
+ <div className="my-1 w-full">
1025
+ <button
1026
+ type="button"
1027
+ onClick={() => setOpen((v) => !v)}
1028
+ aria-expanded={open}
1029
+ className="flex items-center gap-1.5 py-0.5 text-[13px] text-muted-foreground transition-colors hover:text-foreground"
1030
+ >
1031
+ <span>{label}</span>
1032
+ <IconChevronRight
1033
+ className={cn(
1034
+ "size-3.5 shrink-0 transition-transform",
1035
+ open && "rotate-90",
1036
+ )}
1037
+ />
1038
+ </button>
1039
+ <AnimatedCollapse open={open}>
1040
+ <div className="pt-1">{children}</div>
1041
+ </AnimatedCollapse>
1042
+ </div>
1043
+ );
1044
+ }
1045
+
835
1046
  // ─── Re-export for AssistantMessage ───────────────────────────────────────────
836
1047
  // AssistantMessage in AssistantChat.tsx uses FilesChangedSummary directly, so
837
1048
  // re-export it so AssistantChat.tsx can import from one place.