@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
@@ -355,7 +355,7 @@ function isAssistantUiDuplicateMessageIdError(error: unknown): boolean {
355
355
 
356
356
  function cloneContentParts(content: ContentPart[]): ContentPart[] {
357
357
  return content.map((part) =>
358
- part.type === "text"
358
+ part.type === "text" || part.type === "reasoning"
359
359
  ? { ...part }
360
360
  : {
361
361
  ...part,
@@ -1894,7 +1894,9 @@ const AssistantChatInner = forwardRef<
1894
1894
  repo,
1895
1895
  );
1896
1896
  } catch {
1897
- shouldImport = true;
1897
+ // If the runtime/export comparison itself fails, do not fail open by
1898
+ // importing a server snapshot that may be stale relative to local UI.
1899
+ shouldImport = false;
1898
1900
  }
1899
1901
  if (shouldImport) {
1900
1902
  if (options?.markTitleGenerated) {
@@ -1907,7 +1909,7 @@ const AssistantChatInner = forwardRef<
1907
1909
  settled = false;
1908
1910
  }
1909
1911
  }
1910
- if (Array.isArray(repo?.queuedMessages)) {
1912
+ if (settled && Array.isArray(repo?.queuedMessages)) {
1911
1913
  const incomingQueue = repo.queuedMessages as QueuedMessage[];
1912
1914
  const incomingSerialized = JSON.stringify(incomingQueue);
1913
1915
  const currentSerialized = JSON.stringify(queuedMessagesRef.current);
@@ -2521,18 +2523,29 @@ const AssistantChatInner = forwardRef<
2521
2523
  markTitleGenerated: true,
2522
2524
  });
2523
2525
  if (repo) {
2524
- const { title, preview } = extractThreadMeta(repo);
2525
- writeCachedThreadSnapshot(apiUrl, threadId, {
2526
- threadData:
2527
- typeof data.threadData === "string"
2528
- ? data.threadData
2529
- : JSON.stringify(data.threadData),
2530
- title: data.title || title,
2531
- preview,
2532
- messageCount: Array.isArray(repo.messages)
2533
- ? repo.messages.length
2534
- : 0,
2535
- });
2526
+ let shouldCacheServerSnapshot = true;
2527
+ try {
2528
+ shouldCacheServerSnapshot = shouldImportServerThreadData(
2529
+ normalizeThreadRepository(threadRuntime.export()),
2530
+ repo,
2531
+ );
2532
+ } catch {
2533
+ shouldCacheServerSnapshot = false;
2534
+ }
2535
+ if (shouldCacheServerSnapshot) {
2536
+ const { title, preview } = extractThreadMeta(repo);
2537
+ writeCachedThreadSnapshot(apiUrl, threadId, {
2538
+ threadData:
2539
+ typeof data.threadData === "string"
2540
+ ? data.threadData
2541
+ : JSON.stringify(data.threadData),
2542
+ title: data.title || title,
2543
+ preview,
2544
+ messageCount: Array.isArray(repo.messages)
2545
+ ? repo.messages.length
2546
+ : 0,
2547
+ });
2548
+ }
2536
2549
  }
2537
2550
  }
2538
2551
  // Also skip title generation if thread already has a title
@@ -8,6 +8,8 @@
8
8
  * - A content hash gate means identical re-renders never re-invoke Shiki.
9
9
  * - A final highlight is triggered immediately when streaming ends (caller
10
10
  * passes streaming=false).
11
+ * - Non-streaming first paint waits for Shiki (invisible placeholder reserves
12
+ * space) so the UI never snaps from plain text to highlighted HTML.
11
13
  *
12
14
  * Usage:
13
15
  * <HighlightedCodeBlock code={code} lang="typescript" containerClass="agent-markdown-shiki" />
@@ -69,6 +71,7 @@ export function HighlightedCodeBlock({
69
71
  loadHighlighter,
70
72
  }: HighlightedCodeBlockProps): React.ReactElement {
71
73
  const [html, setHtml] = useState<string | null>(null);
74
+ const [failed, setFailed] = useState(false);
72
75
  // Track the content hash for which html was last rendered so identical
73
76
  // re-renders never re-invoke Shiki.
74
77
  const renderedHashRef = useRef<number | null>(null);
@@ -111,12 +114,14 @@ export function HighlightedCodeBlock({
111
114
  .then((out) => {
112
115
  if (!cancelledRef.current) {
113
116
  renderedHashRef.current = contentHash;
117
+ setFailed(false);
114
118
  setHtml(out as string);
115
119
  }
116
120
  })
117
121
  .catch(() => {
118
122
  if (!cancelledRef.current) {
119
123
  renderedHashRef.current = contentHash;
124
+ setFailed(true);
120
125
  setHtml(null);
121
126
  }
122
127
  });
@@ -148,9 +153,21 @@ export function HighlightedCodeBlock({
148
153
  />
149
154
  );
150
155
  }
156
+
157
+ // Streaming: show plain growing text (previous html already kept above when
158
+ // available). Non-streaming first paint: reserve space invisibly so we never
159
+ // flash unhighlighted → highlighted.
160
+ const showPlain = streaming || failed;
151
161
  return (
152
- <pre>
153
- <code className={lang ? `language-${lang}` : undefined}>{code}</code>
154
- </pre>
162
+ <div className={containerClass} aria-busy={!showPlain && !failed}>
163
+ <pre>
164
+ <code
165
+ className={lang ? `language-${lang}` : undefined}
166
+ style={showPlain ? undefined : { visibility: "hidden" }}
167
+ >
168
+ {code}
169
+ </code>
170
+ </pre>
171
+ </div>
155
172
  );
156
173
  }
@@ -1,4 +1,3 @@
1
- import { IconBrandGithub } from "@tabler/icons-react";
2
1
  import type { CSSProperties } from "react";
3
2
 
4
3
  import { appPath } from "./api-path.js";
@@ -192,7 +191,7 @@ export function PoweredByBadge({
192
191
  }
193
192
 
194
193
  /**
195
- * Small GitHub badge: "Free and open source"
194
+ * Small badge: "Free and open source"
196
195
  *
197
196
  * Intended to pair with PoweredByBadge on public pages.
198
197
  */
@@ -209,11 +208,6 @@ export function OpenSourceBadge({
209
208
  return (
210
209
  <>
211
210
  <style>{`
212
- .an-open-source-badge svg {
213
- width: 15px;
214
- height: 15px;
215
- flex: none;
216
- }
217
211
  .an-open-source-badge {
218
212
  background: transparent !important;
219
213
  border-color: transparent !important;
@@ -283,7 +277,6 @@ export function OpenSourceBadge({
283
277
  : containerStyle(position)
284
278
  }
285
279
  >
286
- <IconBrandGithub aria-hidden="true" stroke={1.8} />
287
280
  <span>Free and open source</span>
288
281
  </a>
289
282
  </>
@@ -196,6 +196,7 @@ function contentToContinuationHistory(content: ContentPart[]): string {
196
196
  if (part.text.trim()) chunks.push(part.text.trim());
197
197
  continue;
198
198
  }
199
+ if (part.type === "reasoning") continue;
199
200
  if (part.activity === true) continue;
200
201
  const toolSummary = [
201
202
  `Tool: ${part.toolName}`,
@@ -577,6 +578,12 @@ function contentToStructuredMessages(
577
578
  continue;
578
579
  }
579
580
 
581
+ // Reasoning/thinking is UI-only — do not send chain-of-thought back into
582
+ // model history on continuation.
583
+ if (part.type === "reasoning") {
584
+ continue;
585
+ }
586
+
580
587
  if (isToolCallContentPart(part)) {
581
588
  if (part.activity === true) continue;
582
589
  const toolCallId = nextToolCallId();
@@ -736,11 +743,11 @@ function combineContinuationHistory(fragments: string[]): string {
736
743
  }
737
744
 
738
745
  function hasContinuationProgress(content: ContentPart[]): boolean {
739
- return content.some((part) =>
740
- part.type === "text"
741
- ? part.text.trim().length > 0
742
- : part.result !== undefined,
743
- );
746
+ return content.some((part) => {
747
+ if (part.type === "text") return part.text.trim().length > 0;
748
+ if (part.type === "reasoning") return false;
749
+ return part.result !== undefined;
750
+ });
744
751
  }
745
752
 
746
753
  const COMPLETED_TOOL_TIMEOUT_NAME_RE =
@@ -880,7 +887,9 @@ function lastUnresolvedToolActivity(
880
887
 
881
888
  function snapshotContent(content: ContentPart[]): ContentPart[] {
882
889
  return content.map((part) =>
883
- part.type === "text" ? { ...part } : { ...part, args: { ...part.args } },
890
+ part.type === "text" || part.type === "reasoning"
891
+ ? { ...part }
892
+ : { ...part, args: { ...part.args } },
884
893
  );
885
894
  }
886
895
 
@@ -952,6 +961,22 @@ function contentAfterContinuationPrefix(
952
961
  return content.slice(contentIndex);
953
962
  }
954
963
 
964
+ if (prefixPart.type === "reasoning" && currentPart.type === "reasoning") {
965
+ if (currentPart.text === prefixPart.text) {
966
+ contentIndex += 1;
967
+ continue;
968
+ }
969
+ if (currentPart.text.startsWith(prefixPart.text)) {
970
+ const appendedText = currentPart.text.slice(prefixPart.text.length);
971
+ if (appendedText) {
972
+ delta.push({ type: "reasoning", text: appendedText });
973
+ }
974
+ contentIndex += 1;
975
+ continue;
976
+ }
977
+ return content.slice(contentIndex);
978
+ }
979
+
955
980
  if (
956
981
  prefixPart.type === "tool-call" &&
957
982
  currentPart.type === "tool-call" &&
@@ -2251,7 +2276,11 @@ export function createAgentChatAdapter(
2251
2276
  // ends the turn from the client side.
2252
2277
  const followBackgroundTurn = async function* (
2253
2278
  initialSignal: AgentAutoContinueSignal,
2254
- ): AsyncGenerator<ChatModelRunResult, void, unknown> {
2279
+ ): AsyncGenerator<
2280
+ ChatModelRunResult,
2281
+ "completed" | "client_continue",
2282
+ unknown
2283
+ > {
2255
2284
  lastAutoContinueReason = initialSignal.reason;
2256
2285
  if (initialSignal.activityTrail.length > 0) {
2257
2286
  lastActivityTrail = [...initialSignal.activityTrail];
@@ -2285,7 +2314,7 @@ export function createAgentChatAdapter(
2285
2314
  while (true) {
2286
2315
  if (abortSignal.aborted) {
2287
2316
  clearActiveRun();
2288
- return;
2317
+ return "completed";
2289
2318
  }
2290
2319
  let active: Record<string, unknown> | null = null;
2291
2320
  try {
@@ -2299,7 +2328,7 @@ export function createAgentChatAdapter(
2299
2328
  } catch (pollErr: unknown) {
2300
2329
  if (pollErr instanceof Error && pollErr.name === "AbortError") {
2301
2330
  clearActiveRun();
2302
- return;
2331
+ return "completed";
2303
2332
  }
2304
2333
  // Transient poll failure — counts as "no active run" this tick.
2305
2334
  }
@@ -2326,8 +2355,25 @@ export function createAgentChatAdapter(
2326
2355
  const isTerminal =
2327
2356
  activeStatus === "completed" || activeStatus === "errored";
2328
2357
  if (isTerminal && replayedTerminalRunIds.has(activeRunId)) {
2358
+ if (
2359
+ lastAutoContinueReason === "stale_run" &&
2360
+ lastRecoverableRunError?.errorCode === "stale_run"
2361
+ ) {
2362
+ const continuation = prepareAutoContinuation(
2363
+ new AgentAutoContinueSignal({
2364
+ reason: "stale_run",
2365
+ errorInfo: lastRecoverableRunError,
2366
+ activityTrail: lastActivityTrail,
2367
+ }),
2368
+ );
2369
+ if (continuation.ok) {
2370
+ dispatchResumingUiEvent();
2371
+ await delay(250, abortSignal);
2372
+ return "client_continue";
2373
+ }
2374
+ }
2329
2375
  yield* emitBackgroundTerminalOutcome(active);
2330
- return;
2376
+ return "completed";
2331
2377
  }
2332
2378
  const previousRunId = runId;
2333
2379
  runId = activeRunId;
@@ -2340,7 +2386,7 @@ export function createAgentChatAdapter(
2340
2386
  }
2341
2387
  const attach = yield* followAttachOnce();
2342
2388
  if (attach === "completed" || attach === "aborted") {
2343
- return;
2389
+ return "completed";
2344
2390
  }
2345
2391
  if (isTerminal) {
2346
2392
  replayedTerminalRunIds.add(activeRunId);
@@ -2362,7 +2408,7 @@ export function createAgentChatAdapter(
2362
2408
  BACKGROUND_FOLLOW_IDLE_TIMEOUT_MS
2363
2409
  ) {
2364
2410
  yield* emitBackgroundTerminalOutcome(lastSeenActive);
2365
- return;
2411
+ return "completed";
2366
2412
  }
2367
2413
  }
2368
2414
  dispatchResumingUiEvent();
@@ -2382,13 +2428,13 @@ export function createAgentChatAdapter(
2382
2428
  },
2383
2429
  );
2384
2430
  yield* emitBackgroundTerminalOutcome(lastSeenActive);
2385
- return;
2431
+ return "completed";
2386
2432
  }
2387
2433
  }
2388
2434
  await delay(BACKGROUND_FOLLOW_POLL_INTERVAL_MS, abortSignal);
2389
2435
  if (abortSignal.aborted) {
2390
2436
  clearActiveRun();
2391
- return;
2437
+ return "completed";
2392
2438
  }
2393
2439
  }
2394
2440
  };
@@ -2978,7 +3024,10 @@ export function createAgentChatAdapter(
2978
3024
  // client/server recovery race: client watchdog signals here are
2979
3025
  // just "reattach", not "recover".
2980
3026
  if (shouldFollowServerContinuation(err) && threadId) {
2981
- yield* followBackgroundTurn(err);
3027
+ const followOutcome = yield* followBackgroundTurn(err);
3028
+ if (followOutcome === "client_continue") {
3029
+ continue;
3030
+ }
2982
3031
  return;
2983
3032
  }
2984
3033
  if (err.reason === "no_progress") {
@@ -3157,9 +3206,12 @@ export function createAgentChatAdapter(
3157
3206
  // before any response headers arrived has no dispatch mode yet
3158
3207
  // and keeps the foreground startup-retry path.)
3159
3208
  if (shouldFollowServerContinuation() && threadId) {
3160
- yield* followBackgroundTurn(
3209
+ const followOutcome = yield* followBackgroundTurn(
3161
3210
  new AgentAutoContinueSignal({ reason: "stream_ended" }),
3162
3211
  );
3212
+ if (followOutcome === "client_continue") {
3213
+ continue;
3214
+ }
3163
3215
  return;
3164
3216
  }
3165
3217
 
@@ -10,6 +10,7 @@ import {
10
10
  ActionBarPrimitive,
11
11
  BranchPickerPrimitive,
12
12
  ComposerPrimitive,
13
+ useMessagePartReasoning,
13
14
  } from "@assistant-ui/react";
14
15
  import type { Attachment } from "@assistant-ui/react";
15
16
  import {
@@ -66,6 +67,8 @@ import {
66
67
  ToolCallFallback,
67
68
  FilesChangedSummary,
68
69
  ChatRunningContext,
70
+ ReasoningCell,
71
+ WorkedForSummary,
69
72
  } from "./tool-call-display.js";
70
73
 
71
74
  // ─── Pending selection context key ───────────────────────────────────────────
@@ -793,7 +796,7 @@ function assistantMessageHasRenderableContent(message: {
793
796
  return content.some((part) => {
794
797
  if (!part || typeof part !== "object") return false;
795
798
  const type = (part as { type?: unknown }).type;
796
- if (type === "text") {
799
+ if (type === "text" || type === "reasoning") {
797
800
  const text = (part as { text?: unknown }).text;
798
801
  return typeof text === "string" && text.trim().length > 0;
799
802
  }
@@ -837,6 +840,21 @@ export function shouldShowAssistantMessageFooter({
837
840
  return !chatRunning && statusIsTerminal;
838
841
  }
839
842
 
843
+ function ReasoningMessagePart() {
844
+ const part = useMessagePartReasoning();
845
+ const isStreaming = part.status?.type === "running";
846
+ return <ReasoningCell text={part.text} isStreaming={isStreaming} />;
847
+ }
848
+
849
+ function groupAssistantWorkParts(part: {
850
+ type?: string;
851
+ }): ["group-work"] | null {
852
+ if (part.type === "reasoning" || part.type === "tool-call") {
853
+ return ["group-work"];
854
+ }
855
+ return null;
856
+ }
857
+
840
858
  export function AssistantMessage() {
841
859
  const [restoreState, setRestoreState] = useState<
842
860
  "idle" | "confirming" | "restoring"
@@ -860,6 +878,39 @@ export function AssistantMessage() {
860
878
  });
861
879
  const cpCtx = React.useContext(CheckpointContext);
862
880
 
881
+ // Capture live run duration when this message finishes streaming.
882
+ const runStartedAtRef = useRef<number | null>(null);
883
+ const [capturedDurationMs, setCapturedDurationMs] = useState<number | null>(
884
+ null,
885
+ );
886
+ useEffect(() => {
887
+ if (chatRunning && isLast) {
888
+ if (runStartedAtRef.current == null) {
889
+ runStartedAtRef.current = Date.now();
890
+ }
891
+ return;
892
+ }
893
+ if (
894
+ !chatRunning &&
895
+ isLast &&
896
+ runStartedAtRef.current != null &&
897
+ capturedDurationMs == null
898
+ ) {
899
+ setCapturedDurationMs(Date.now() - runStartedAtRef.current);
900
+ runStartedAtRef.current = null;
901
+ }
902
+ }, [chatRunning, isLast, capturedDurationMs]);
903
+
904
+ // Animate collapse only when this message just finished running in-session.
905
+ const wasRunningRef = useRef(false);
906
+ const [animateCollapse, setAnimateCollapse] = useState(false);
907
+ useEffect(() => {
908
+ if (wasRunningRef.current && !chatRunning && isComplete && isLast) {
909
+ setAnimateCollapse(true);
910
+ }
911
+ wasRunningRef.current = chatRunning && isLast;
912
+ }, [chatRunning, isComplete, isLast]);
913
+
863
914
  const handleRestore = useCallback(async () => {
864
915
  if (restoreState === "idle") {
865
916
  setRestoreState("confirming");
@@ -926,6 +977,13 @@ export function AssistantMessage() {
926
977
  (p.structuredMeta.toolKind === "edit" ||
927
978
  p.structuredMeta.toolKind === "write"),
928
979
  );
980
+ const hasCollapsibleWork =
981
+ Array.isArray(msgContent) &&
982
+ msgContent.some(
983
+ (p) =>
984
+ p.type === "reasoning" ||
985
+ (p.type === "tool-call" && p.activity !== true),
986
+ );
929
987
 
930
988
  if (!hasRenderableContent) return null;
931
989
 
@@ -935,14 +993,33 @@ export function AssistantMessage() {
935
993
  style={{ contentVisibility: isComplete ? "auto" : "visible" }}
936
994
  >
937
995
  <div className="w-full max-w-[95%] text-sm leading-relaxed text-foreground">
938
- <MessagePrimitive.Parts
939
- components={{
940
- Text: MarkdownText,
941
- tools: {
942
- Fallback: ToolCallFallback,
943
- },
996
+ <MessagePrimitive.GroupedParts groupBy={groupAssistantWorkParts}>
997
+ {({ part, children }) => {
998
+ switch (part.type) {
999
+ case "group-work": {
1000
+ const showSummary =
1001
+ isComplete && !chatRunning && hasCollapsibleWork;
1002
+ if (!showSummary) return <>{children}</>;
1003
+ return (
1004
+ <WorkedForSummary
1005
+ durationMs={capturedDurationMs}
1006
+ autoCollapse={animateCollapse}
1007
+ >
1008
+ {children}
1009
+ </WorkedForSummary>
1010
+ );
1011
+ }
1012
+ case "text":
1013
+ return <MarkdownText />;
1014
+ case "reasoning":
1015
+ return <ReasoningMessagePart />;
1016
+ case "tool-call":
1017
+ return part.toolUI ?? <ToolCallFallback {...part} />;
1018
+ default:
1019
+ return null;
1020
+ }
944
1021
  }}
945
- />
1022
+ </MessagePrimitive.GroupedParts>
946
1023
  {isComplete && hasCodeAgentTools && msgContent && (
947
1024
  <FilesChangedSummary parts={msgContent} />
948
1025
  )}