@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
@@ -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" />
@@ -1 +1 @@
1
- {"version":3,"file":"HighlightedCodeBlock.d.ts","sourceRoot":"","sources":["../../src/client/HighlightedCodeBlock.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAsC,MAAM,OAAO,CAAC;AAe3D,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;IACvB;mEAC+D;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;uEAEmE;IACnE,eAAe,EAAE,MAAM,OAAO,CAAC;QAC7B,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YACxC,YAAY,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;SACzC,KACE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,kBAAkB,EAAE,MAAM,MAAM,EAAE,CAAC;KACpC,CAAC,CAAC;CACJ;AAYD,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,SAAiB,EACjB,eAAe,GAChB,EAAE,yBAAyB,GAAG,KAAK,CAAC,YAAY,CAsFhD"}
1
+ {"version":3,"file":"HighlightedCodeBlock.d.ts","sourceRoot":"","sources":["../../src/client/HighlightedCodeBlock.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAsC,MAAM,OAAO,CAAC;AAe3D,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,cAAc,EAAE,MAAM,CAAC;IACvB;mEAC+D;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;uEAEmE;IACnE,eAAe,EAAE,MAAM,OAAO,CAAC;QAC7B,UAAU,EAAE,CACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YACxC,YAAY,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;SACzC,KACE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,kBAAkB,EAAE,MAAM,MAAM,EAAE,CAAC;KACpC,CAAC,CAAC;CACJ;AAYD,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,SAAiB,EACjB,eAAe,GAChB,EAAE,yBAAyB,GAAG,KAAK,CAAC,YAAY,CAqGhD"}
@@ -9,6 +9,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
9
9
  * - A content hash gate means identical re-renders never re-invoke Shiki.
10
10
  * - A final highlight is triggered immediately when streaming ends (caller
11
11
  * passes streaming=false).
12
+ * - Non-streaming first paint waits for Shiki (invisible placeholder reserves
13
+ * space) so the UI never snaps from plain text to highlighted HTML.
12
14
  *
13
15
  * Usage:
14
16
  * <HighlightedCodeBlock code={code} lang="typescript" containerClass="agent-markdown-shiki" />
@@ -36,6 +38,7 @@ function hashString(s) {
36
38
  }
37
39
  export function HighlightedCodeBlock({ code, lang, containerClass, streaming = false, loadHighlighter, }) {
38
40
  const [html, setHtml] = useState(null);
41
+ const [failed, setFailed] = useState(false);
39
42
  // Track the content hash for which html was last rendered so identical
40
43
  // re-renders never re-invoke Shiki.
41
44
  const renderedHashRef = useRef(null);
@@ -75,12 +78,14 @@ export function HighlightedCodeBlock({ code, lang, containerClass, streaming = f
75
78
  .then((out) => {
76
79
  if (!cancelledRef.current) {
77
80
  renderedHashRef.current = contentHash;
81
+ setFailed(false);
78
82
  setHtml(out);
79
83
  }
80
84
  })
81
85
  .catch(() => {
82
86
  if (!cancelledRef.current) {
83
87
  renderedHashRef.current = contentHash;
88
+ setFailed(true);
84
89
  setHtml(null);
85
90
  }
86
91
  });
@@ -105,6 +110,10 @@ export function HighlightedCodeBlock({ code, lang, containerClass, streaming = f
105
110
  if (html) {
106
111
  return (_jsx("div", { className: containerClass, dangerouslySetInnerHTML: { __html: html } }));
107
112
  }
108
- return (_jsx("pre", { children: _jsx("code", { className: lang ? `language-${lang}` : undefined, children: code }) }));
113
+ // Streaming: show plain growing text (previous html already kept above when
114
+ // available). Non-streaming first paint: reserve space invisibly so we never
115
+ // flash unhighlighted → highlighted.
116
+ const showPlain = streaming || failed;
117
+ return (_jsx("div", { className: containerClass, "aria-busy": !showPlain && !failed, children: _jsx("pre", { children: _jsx("code", { className: lang ? `language-${lang}` : undefined, style: showPlain ? undefined : { visibility: "hidden" }, children: code }) }) }));
109
118
  }
110
119
  //# sourceMappingURL=HighlightedCodeBlock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HighlightedCodeBlock.js","sourceRoot":"","sources":["../../src/client/HighlightedCodeBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared debounced syntax-highlighted code block.\n *\n * Performance characteristics vs the old per-site implementations:\n * - While code is still growing (streaming), Shiki re-highlight is debounced\n * to ~150 ms (trailing). Between debounce fires the previous highlighted\n * HTML is kept — no blank flash.\n * - A content hash gate means identical re-renders never re-invoke Shiki.\n * - A final highlight is triggered immediately when streaming ends (caller\n * passes streaming=false).\n *\n * Usage:\n * <HighlightedCodeBlock code={code} lang=\"typescript\" containerClass=\"agent-markdown-shiki\" />\n */\nimport React, { useEffect, useRef, useState } from \"react\";\n\nconst LANG_ALIASES: Record<string, string> = {\n js: \"javascript\",\n ts: \"typescript\",\n sh: \"bash\",\n shell: \"bash\",\n zsh: \"bash\",\n py: \"python\",\n yml: \"yaml\",\n md: \"markdown\",\n bq: \"sql\",\n bigquery: \"sql\",\n};\n\nexport interface HighlightedCodeBlockProps {\n code: string;\n lang: string;\n /** Class applied to the wrapper div when Shiki HTML is rendered. */\n containerClass: string;\n /** Pass true while the parent message is still streaming. When false the\n * block fires an immediate (non-debounced) highlight pass. */\n streaming?: boolean;\n /** Loader for the site-specific Shiki highlighter instance. Each call site\n * has its own highlighter loader (different language sets, different CSS\n * class, etc.) — pass it in so this component stays decoupled. */\n loadHighlighter: () => Promise<{\n codeToHtml: (\n code: string,\n options: {\n lang: string;\n themes: { light: string; dark: string };\n defaultColor?: false | \"light\" | \"dark\";\n },\n ) => string | Promise<string>;\n getLoadedLanguages: () => string[];\n }>;\n}\n\nconst DEBOUNCE_MS = 150;\n\nfunction hashString(s: string): number {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = (Math.imul(31, h) + s.charCodeAt(i)) | 0;\n }\n return h;\n}\n\nexport function HighlightedCodeBlock({\n code,\n lang,\n containerClass,\n streaming = false,\n loadHighlighter,\n}: HighlightedCodeBlockProps): React.ReactElement {\n const [html, setHtml] = useState<string | null>(null);\n // Track the content hash for which html was last rendered so identical\n // re-renders never re-invoke Shiki.\n const renderedHashRef = useRef<number | null>(null);\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const cancelledRef = useRef(false);\n\n useEffect(() => {\n cancelledRef.current = false;\n return () => {\n cancelledRef.current = true;\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n };\n }, []);\n\n useEffect(() => {\n const contentHash = hashString(lang + \"\\0\" + code);\n\n // Skip if we already rendered this exact content\n if (renderedHashRef.current === contentHash) return;\n\n const doHighlight = () => {\n loadHighlighter()\n .then((highlighter) => {\n const requested = (lang || \"text\").toLowerCase();\n const resolved = LANG_ALIASES[requested] ?? requested;\n const loaded = highlighter.getLoadedLanguages();\n const finalLang = loaded.includes(resolved) ? resolved : \"text\";\n return highlighter.codeToHtml(code, {\n lang: finalLang,\n themes: {\n light: \"github-light-default\",\n dark: \"github-dark-default\",\n },\n defaultColor: false,\n });\n })\n .then((out) => {\n if (!cancelledRef.current) {\n renderedHashRef.current = contentHash;\n setHtml(out as string);\n }\n })\n .catch(() => {\n if (!cancelledRef.current) {\n renderedHashRef.current = contentHash;\n setHtml(null);\n }\n });\n };\n\n // Clear any existing pending debounce\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n\n if (streaming) {\n // Debounce while the code block is still growing\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = null;\n doHighlight();\n }, DEBOUNCE_MS);\n } else {\n // Stream complete (or never was streaming): highlight immediately\n doHighlight();\n }\n }, [code, lang, streaming, loadHighlighter]);\n\n if (html) {\n return (\n <div\n className={containerClass}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n return (\n <pre>\n <code className={lang ? `language-${lang}` : undefined}>{code}</code>\n </pre>\n );\n}\n"]}
1
+ {"version":3,"file":"HighlightedCodeBlock.js","sourceRoot":"","sources":["../../src/client/HighlightedCodeBlock.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared debounced syntax-highlighted code block.\n *\n * Performance characteristics vs the old per-site implementations:\n * - While code is still growing (streaming), Shiki re-highlight is debounced\n * to ~150 ms (trailing). Between debounce fires the previous highlighted\n * HTML is kept — no blank flash.\n * - A content hash gate means identical re-renders never re-invoke Shiki.\n * - A final highlight is triggered immediately when streaming ends (caller\n * passes streaming=false).\n * - Non-streaming first paint waits for Shiki (invisible placeholder reserves\n * space) so the UI never snaps from plain text to highlighted HTML.\n *\n * Usage:\n * <HighlightedCodeBlock code={code} lang=\"typescript\" containerClass=\"agent-markdown-shiki\" />\n */\nimport React, { useEffect, useRef, useState } from \"react\";\n\nconst LANG_ALIASES: Record<string, string> = {\n js: \"javascript\",\n ts: \"typescript\",\n sh: \"bash\",\n shell: \"bash\",\n zsh: \"bash\",\n py: \"python\",\n yml: \"yaml\",\n md: \"markdown\",\n bq: \"sql\",\n bigquery: \"sql\",\n};\n\nexport interface HighlightedCodeBlockProps {\n code: string;\n lang: string;\n /** Class applied to the wrapper div when Shiki HTML is rendered. */\n containerClass: string;\n /** Pass true while the parent message is still streaming. When false the\n * block fires an immediate (non-debounced) highlight pass. */\n streaming?: boolean;\n /** Loader for the site-specific Shiki highlighter instance. Each call site\n * has its own highlighter loader (different language sets, different CSS\n * class, etc.) — pass it in so this component stays decoupled. */\n loadHighlighter: () => Promise<{\n codeToHtml: (\n code: string,\n options: {\n lang: string;\n themes: { light: string; dark: string };\n defaultColor?: false | \"light\" | \"dark\";\n },\n ) => string | Promise<string>;\n getLoadedLanguages: () => string[];\n }>;\n}\n\nconst DEBOUNCE_MS = 150;\n\nfunction hashString(s: string): number {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = (Math.imul(31, h) + s.charCodeAt(i)) | 0;\n }\n return h;\n}\n\nexport function HighlightedCodeBlock({\n code,\n lang,\n containerClass,\n streaming = false,\n loadHighlighter,\n}: HighlightedCodeBlockProps): React.ReactElement {\n const [html, setHtml] = useState<string | null>(null);\n const [failed, setFailed] = useState(false);\n // Track the content hash for which html was last rendered so identical\n // re-renders never re-invoke Shiki.\n const renderedHashRef = useRef<number | null>(null);\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const cancelledRef = useRef(false);\n\n useEffect(() => {\n cancelledRef.current = false;\n return () => {\n cancelledRef.current = true;\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n };\n }, []);\n\n useEffect(() => {\n const contentHash = hashString(lang + \"\\0\" + code);\n\n // Skip if we already rendered this exact content\n if (renderedHashRef.current === contentHash) return;\n\n const doHighlight = () => {\n loadHighlighter()\n .then((highlighter) => {\n const requested = (lang || \"text\").toLowerCase();\n const resolved = LANG_ALIASES[requested] ?? requested;\n const loaded = highlighter.getLoadedLanguages();\n const finalLang = loaded.includes(resolved) ? resolved : \"text\";\n return highlighter.codeToHtml(code, {\n lang: finalLang,\n themes: {\n light: \"github-light-default\",\n dark: \"github-dark-default\",\n },\n defaultColor: false,\n });\n })\n .then((out) => {\n if (!cancelledRef.current) {\n renderedHashRef.current = contentHash;\n setFailed(false);\n setHtml(out as string);\n }\n })\n .catch(() => {\n if (!cancelledRef.current) {\n renderedHashRef.current = contentHash;\n setFailed(true);\n setHtml(null);\n }\n });\n };\n\n // Clear any existing pending debounce\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n\n if (streaming) {\n // Debounce while the code block is still growing\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = null;\n doHighlight();\n }, DEBOUNCE_MS);\n } else {\n // Stream complete (or never was streaming): highlight immediately\n doHighlight();\n }\n }, [code, lang, streaming, loadHighlighter]);\n\n if (html) {\n return (\n <div\n className={containerClass}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n }\n\n // Streaming: show plain growing text (previous html already kept above when\n // available). Non-streaming first paint: reserve space invisibly so we never\n // flash unhighlighted → highlighted.\n const showPlain = streaming || failed;\n return (\n <div className={containerClass} aria-busy={!showPlain && !failed}>\n <pre>\n <code\n className={lang ? `language-${lang}` : undefined}\n style={showPlain ? undefined : { visibility: \"hidden\" }}\n >\n {code}\n </code>\n </pre>\n </div>\n );\n}\n"]}
@@ -21,7 +21,7 @@ export interface OpenSourceBadgeProps {
21
21
  */
22
22
  export declare function PoweredByBadge({ position, variant, embedded, }: PoweredByBadgeProps): import("react").JSX.Element | null;
23
23
  /**
24
- * Small GitHub badge: "Free and open source"
24
+ * Small badge: "Free and open source"
25
25
  *
26
26
  * Intended to pair with PoweredByBadge on public pages.
27
27
  */
@@ -1 +1 @@
1
- {"version":3,"file":"PoweredByBadge.d.ts","sourceRoot":"","sources":["../../src/client/PoweredByBadge.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,CAAC;IAC1C,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,aAAa,GAAG,cAAc,CAAC;IAC1C,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA+BD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAyB,EACzB,OAAiB,EACjB,QAAgB,GACjB,EAAE,mBAAmB,sCAiIrB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAwB,EACxB,QAAgB,GACjB,EAAE,oBAAoB,sCAyFtB"}
1
+ {"version":3,"file":"PoweredByBadge.d.ts","sourceRoot":"","sources":["../../src/client/PoweredByBadge.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,CAAC;IAC1C,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,aAAa,GAAG,cAAc,CAAC;IAC1C,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA+BD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAyB,EACzB,OAAiB,EACjB,QAAgB,GACjB,EAAE,mBAAmB,sCAiIrB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAwB,EACxB,QAAgB,GACjB,EAAE,oBAAoB,sCAmFtB"}
@@ -1,5 +1,4 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { IconBrandGithub } from "@tabler/icons-react";
3
2
  import { appPath } from "./api-path.js";
4
3
  import { cn } from "./utils.js";
5
4
  const containerStyle = (position) => ({
@@ -133,7 +132,7 @@ export function PoweredByBadge({ position = "bottom-right", variant = "badge", e
133
132
  : containerStyle(position), "aria-label": "Built with Agent Native", children: [!isPlain && _jsx("span", { children: "Built with" }), _jsx("img", { src: logoOnLight, alt: "Agent Native", className: "an-powered-logo an-powered-logo-light" }), _jsx("img", { src: logoOnDark, alt: "Agent Native", className: "an-powered-logo an-powered-logo-dark" })] })] }));
134
133
  }
135
134
  /**
136
- * Small GitHub badge: "Free and open source"
135
+ * Small badge: "Free and open source"
137
136
  *
138
137
  * Intended to pair with PoweredByBadge on public pages.
139
138
  */
@@ -143,11 +142,6 @@ export function OpenSourceBadge({ position = "bottom-left", embedded = false, })
143
142
  if (hidden)
144
143
  return null;
145
144
  return (_jsxs(_Fragment, { children: [_jsx("style", { children: `
146
- .an-open-source-badge svg {
147
- width: 15px;
148
- height: 15px;
149
- flex: none;
150
- }
151
145
  .an-open-source-badge {
152
146
  background: transparent !important;
153
147
  border-color: transparent !important;
@@ -191,7 +185,7 @@ export function OpenSourceBadge({ position = "bottom-left", embedded = false, })
191
185
  .light .an-open-source-badge:hover {
192
186
  color: #33C4FF !important;
193
187
  }
194
- ` }), _jsxs("a", { href: "https://github.com/BuilderIO/agent-native", target: "_blank", rel: "noopener noreferrer", className: cn("an-open-source-badge", embedded && "an-open-source-badge-embedded"), style: embedded
188
+ ` }), _jsx("a", { href: "https://github.com/BuilderIO/agent-native", target: "_blank", rel: "noopener noreferrer", className: cn("an-open-source-badge", embedded && "an-open-source-badge-embedded"), style: embedded
195
189
  ? {
196
190
  display: "flex",
197
191
  alignItems: "center",
@@ -203,6 +197,6 @@ export function OpenSourceBadge({ position = "bottom-left", embedded = false, })
203
197
  textDecoration: "none",
204
198
  transition: "opacity 0.2s, color 0.2s",
205
199
  }
206
- : containerStyle(position), children: [_jsx(IconBrandGithub, { "aria-hidden": "true", stroke: 1.8 }), _jsx("span", { children: "Free and open source" })] })] }));
200
+ : containerStyle(position), children: _jsx("span", { children: "Free and open source" }) })] }));
207
201
  }
208
202
  //# sourceMappingURL=PoweredByBadge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PoweredByBadge.js","sourceRoot":"","sources":["../../src/client/PoweredByBadge.tsx"],"names":[],"mappings":"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","sourcesContent":["import { IconBrandGithub } from \"@tabler/icons-react\";\nimport type { CSSProperties } from \"react\";\n\nimport { appPath } from \"./api-path.js\";\nimport { cn } from \"./utils.js\";\n\nexport interface PoweredByBadgeProps {\n position?: \"bottom-right\" | \"bottom-left\";\n /** Plain shows the logo only with no surrounding badge chrome. */\n variant?: \"badge\" | \"plain\";\n /** When true, positioning is handled by the parent container. */\n embedded?: boolean;\n}\n\nexport interface OpenSourceBadgeProps {\n position?: \"bottom-left\" | \"bottom-right\";\n /** When true, positioning is handled by the parent container. */\n embedded?: boolean;\n}\n\nconst containerStyle = (\n position: \"bottom-right\" | \"bottom-left\",\n): CSSProperties => ({\n position: \"fixed\",\n bottom: 16,\n ...(position === \"bottom-right\" ? { right: 16 } : { left: 16 }),\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 12px\",\n borderRadius: 8,\n fontSize: 12,\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontWeight: 500,\n lineHeight: 1,\n color: \"rgba(95, 95, 95, 0.95)\",\n background: \"rgba(0, 0, 0, 0.05)\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n border: \"1px solid rgba(0, 0, 0, 0.06)\",\n textDecoration: \"none\",\n transition: \"opacity 0.2s, color 0.2s\",\n opacity: 0.82,\n});\n\nconst darkQuery = \"(prefers-color-scheme: dark)\";\n\n/**\n * Small branding badge: \"Built with [Agent Native logo]\"\n *\n * - Fixed position in the corner\n * - Subtle, semi-transparent\n * - Links to https://agent-native.com\n * - Respects prefers-color-scheme\n * - Can be hidden via HIDE_BRANDING=true env var (for white-label)\n */\nexport function PoweredByBadge({\n position = \"bottom-right\",\n variant = \"badge\",\n embedded = false,\n}: PoweredByBadgeProps) {\n // Allow hiding via env var\n const hidden =\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_HIDE_BRANDING === \"true\";\n\n if (hidden) return null;\n\n const logoOnLight = appPath(\"/agent-native-logo-light.svg\");\n const logoOnDark = appPath(\"/agent-native-logo-dark.svg\");\n const isPlain = variant === \"plain\";\n\n return (\n <>\n <style>{`\n .an-powered-logo {\n display: block;\n height: ${isPlain ? \"16.2px\" : \"14px\"};\n width: auto;\n flex: none;\n }\n .an-powered-logo-dark {\n display: none;\n }\n @media (max-width: 640px) {\n .an-powered-badge:not(.an-powered-badge-embedded) {\n position: static !important;\n margin: 0.75rem auto 0 !important;\n width: max-content;\n max-width: calc(100vw - 2rem);\n }\n }\n .an-powered-badge-plain {\n background: transparent !important;\n border-color: transparent !important;\n backdrop-filter: none !important;\n -webkit-backdrop-filter: none !important;\n padding: 0 !important;\n opacity: 1 !important;\n }\n .an-powered-badge-plain:hover {\n opacity: 0.82 !important;\n }\n .dark .an-powered-badge:not(.an-powered-badge-plain) {\n background: rgba(255, 255, 255, 0.06) !important;\n border-color: rgba(255, 255, 255, 0.08) !important;\n color: rgba(215, 215, 215, 0.94) !important;\n }\n .dark .an-powered-logo-light {\n display: none;\n }\n .dark .an-powered-logo-dark {\n display: block;\n }\n @media ${darkQuery} {\n .an-powered-badge:not(.an-powered-badge-plain) {\n background: rgba(255, 255, 255, 0.06) !important;\n border-color: rgba(255, 255, 255, 0.08) !important;\n color: rgba(215, 215, 215, 0.94) !important;\n }\n .an-powered-logo-light {\n display: none;\n }\n .an-powered-logo-dark {\n display: block;\n }\n }\n .light .an-powered-badge:not(.an-powered-badge-plain) {\n background: rgba(0, 0, 0, 0.05) !important;\n border-color: rgba(0, 0, 0, 0.06) !important;\n color: rgba(95, 95, 95, 0.95) !important;\n }\n .light .an-powered-logo-light {\n display: block;\n }\n .light .an-powered-logo-dark {\n display: none;\n }\n .an-powered-badge:not(.an-powered-badge-plain):hover {\n opacity: 1 !important;\n color: rgba(70, 70, 70, 1) !important;\n }\n @media ${darkQuery} {\n .an-powered-badge:not(.an-powered-badge-plain):hover {\n color: rgba(238, 238, 238, 1) !important;\n }\n }\n .dark .an-powered-badge:not(.an-powered-badge-plain):hover {\n color: rgba(238, 238, 238, 1) !important;\n }\n .light .an-powered-badge:not(.an-powered-badge-plain):hover {\n color: rgba(70, 70, 70, 1) !important;\n }\n `}</style>\n <a\n href=\"https://agent-native.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n \"an-powered-badge\",\n isPlain && \"an-powered-badge-plain\",\n embedded && \"an-powered-badge-embedded\",\n )}\n style={\n embedded\n ? {\n display: \"inline-flex\",\n alignItems: \"center\",\n textDecoration: \"none\",\n transition: \"opacity 0.2s\",\n }\n : containerStyle(position)\n }\n aria-label=\"Built with Agent Native\"\n >\n {!isPlain && <span>Built with</span>}\n <img\n src={logoOnLight}\n alt=\"Agent Native\"\n className=\"an-powered-logo an-powered-logo-light\"\n />\n <img\n src={logoOnDark}\n alt=\"Agent Native\"\n className=\"an-powered-logo an-powered-logo-dark\"\n />\n </a>\n </>\n );\n}\n\n/**\n * Small GitHub badge: \"Free and open source\"\n *\n * Intended to pair with PoweredByBadge on public pages.\n */\nexport function OpenSourceBadge({\n position = \"bottom-left\",\n embedded = false,\n}: OpenSourceBadgeProps) {\n const hidden =\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_HIDE_BRANDING === \"true\";\n\n if (hidden) return null;\n\n return (\n <>\n <style>{`\n .an-open-source-badge svg {\n width: 15px;\n height: 15px;\n flex: none;\n }\n .an-open-source-badge {\n background: transparent !important;\n border-color: transparent !important;\n backdrop-filter: none !important;\n -webkit-backdrop-filter: none !important;\n color: #00B5FF !important;\n font-weight: 600 !important;\n opacity: 0.95 !important;\n }\n @media (max-width: 640px) {\n .an-open-source-badge:not(.an-open-source-badge-embedded) {\n position: static !important;\n margin: 1rem auto 0 !important;\n width: max-content;\n max-width: calc(100vw - 2rem);\n }\n }\n .dark .an-open-source-badge {\n color: #00B5FF !important;\n }\n @media ${darkQuery} {\n .an-open-source-badge {\n color: #00B5FF !important;\n }\n }\n .light .an-open-source-badge {\n color: #00B5FF !important;\n }\n .an-open-source-badge:hover {\n opacity: 1 !important;\n color: #33C4FF !important;\n }\n @media ${darkQuery} {\n .an-open-source-badge:hover {\n color: #33C4FF !important;\n }\n }\n .dark .an-open-source-badge:hover {\n color: #33C4FF !important;\n }\n .light .an-open-source-badge:hover {\n color: #33C4FF !important;\n }\n `}</style>\n <a\n href=\"https://github.com/BuilderIO/agent-native\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n \"an-open-source-badge\",\n embedded && \"an-open-source-badge-embedded\",\n )}\n style={\n embedded\n ? {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontWeight: 600,\n lineHeight: 1,\n textDecoration: \"none\",\n transition: \"opacity 0.2s, color 0.2s\",\n }\n : containerStyle(position)\n }\n >\n <IconBrandGithub aria-hidden=\"true\" stroke={1.8} />\n <span>Free and open source</span>\n </a>\n </>\n );\n}\n"]}
1
+ {"version":3,"file":"PoweredByBadge.js","sourceRoot":"","sources":["../../src/client/PoweredByBadge.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAgBhC,MAAM,cAAc,GAAG,CACrB,QAAwC,EACzB,EAAE,CAAC,CAAC;IACnB,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,EAAE;IACV,GAAG,CAAC,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC/D,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,GAAG,EAAE,CAAC;IACN,OAAO,EAAE,UAAU;IACnB,YAAY,EAAE,CAAC;IACf,QAAQ,EAAE,EAAE;IACZ,UAAU,EACR,mEAAmE;IACrE,UAAU,EAAE,GAAG;IACf,UAAU,EAAE,CAAC;IACb,KAAK,EAAE,wBAAwB;IAC/B,UAAU,EAAE,qBAAqB;IACjC,cAAc,EAAE,WAAW;IAC3B,oBAAoB,EAAE,WAAW;IACjC,MAAM,EAAE,+BAA+B;IACvC,cAAc,EAAE,MAAM;IACtB,UAAU,EAAE,0BAA0B;IACtC,OAAO,EAAE,IAAI;CACd,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,8BAA8B,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,GAAG,cAAc,EACzB,OAAO,GAAG,OAAO,EACjB,QAAQ,GAAG,KAAK,GACI;IACpB,2BAA2B;IAC3B,MAAM,MAAM,GACT,OAAO,IAAI,CAAC,GAA0C;QACrD,EAAE,kBAAkB,KAAK,MAAM,CAAC;IAEpC,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,WAAW,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,KAAK,OAAO,CAAC;IAEpC,OAAO,CACL,8BACE,0BAAQ;;;oBAGM,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqC9B,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4BT,SAAS;;;;;;;;;;;OAWnB,GAAS,EACV,aACE,IAAI,EAAC,0BAA0B,EAC/B,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAE,EAAE,CACX,kBAAkB,EAClB,OAAO,IAAI,wBAAwB,EACnC,QAAQ,IAAI,2BAA2B,CACxC,EACD,KAAK,EACH,QAAQ;oBACN,CAAC,CAAC;wBACE,OAAO,EAAE,aAAa;wBACtB,UAAU,EAAE,QAAQ;wBACpB,cAAc,EAAE,MAAM;wBACtB,UAAU,EAAE,cAAc;qBAC3B;oBACH,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,gBAEnB,yBAAyB,aAEnC,CAAC,OAAO,IAAI,wCAAuB,EACpC,cACE,GAAG,EAAE,WAAW,EAChB,GAAG,EAAC,cAAc,EAClB,SAAS,EAAC,uCAAuC,GACjD,EACF,cACE,GAAG,EAAE,UAAU,EACf,GAAG,EAAC,cAAc,EAClB,SAAS,EAAC,sCAAsC,GAChD,IACA,IACH,CACJ,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,GAAG,aAAa,EACxB,QAAQ,GAAG,KAAK,GACK;IACrB,MAAM,MAAM,GACT,OAAO,IAAI,CAAC,GAA0C;QACrD,EAAE,kBAAkB,KAAK,MAAM,CAAC;IAEpC,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAExB,OAAO,CACL,8BACE,0BAAQ;;;;;;;;;;;;;;;;;;;;;iBAqBG,SAAS;;;;;;;;;;;;iBAYT,SAAS;;;;;;;;;;;OAWnB,GAAS,EACV,YACE,IAAI,EAAC,2CAA2C,EAChD,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAE,EAAE,CACX,sBAAsB,EACtB,QAAQ,IAAI,+BAA+B,CAC5C,EACD,KAAK,EACH,QAAQ;oBACN,CAAC,CAAC;wBACE,OAAO,EAAE,MAAM;wBACf,UAAU,EAAE,QAAQ;wBACpB,GAAG,EAAE,CAAC;wBACN,QAAQ,EAAE,EAAE;wBACZ,UAAU,EACR,mEAAmE;wBACrE,UAAU,EAAE,GAAG;wBACf,UAAU,EAAE,CAAC;wBACb,cAAc,EAAE,MAAM;wBACtB,UAAU,EAAE,0BAA0B;qBACvC;oBACH,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,YAG9B,kDAAiC,GAC/B,IACH,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import type { CSSProperties } from \"react\";\n\nimport { appPath } from \"./api-path.js\";\nimport { cn } from \"./utils.js\";\n\nexport interface PoweredByBadgeProps {\n position?: \"bottom-right\" | \"bottom-left\";\n /** Plain shows the logo only with no surrounding badge chrome. */\n variant?: \"badge\" | \"plain\";\n /** When true, positioning is handled by the parent container. */\n embedded?: boolean;\n}\n\nexport interface OpenSourceBadgeProps {\n position?: \"bottom-left\" | \"bottom-right\";\n /** When true, positioning is handled by the parent container. */\n embedded?: boolean;\n}\n\nconst containerStyle = (\n position: \"bottom-right\" | \"bottom-left\",\n): CSSProperties => ({\n position: \"fixed\",\n bottom: 16,\n ...(position === \"bottom-right\" ? { right: 16 } : { left: 16 }),\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"6px 12px\",\n borderRadius: 8,\n fontSize: 12,\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontWeight: 500,\n lineHeight: 1,\n color: \"rgba(95, 95, 95, 0.95)\",\n background: \"rgba(0, 0, 0, 0.05)\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n border: \"1px solid rgba(0, 0, 0, 0.06)\",\n textDecoration: \"none\",\n transition: \"opacity 0.2s, color 0.2s\",\n opacity: 0.82,\n});\n\nconst darkQuery = \"(prefers-color-scheme: dark)\";\n\n/**\n * Small branding badge: \"Built with [Agent Native logo]\"\n *\n * - Fixed position in the corner\n * - Subtle, semi-transparent\n * - Links to https://agent-native.com\n * - Respects prefers-color-scheme\n * - Can be hidden via HIDE_BRANDING=true env var (for white-label)\n */\nexport function PoweredByBadge({\n position = \"bottom-right\",\n variant = \"badge\",\n embedded = false,\n}: PoweredByBadgeProps) {\n // Allow hiding via env var\n const hidden =\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_HIDE_BRANDING === \"true\";\n\n if (hidden) return null;\n\n const logoOnLight = appPath(\"/agent-native-logo-light.svg\");\n const logoOnDark = appPath(\"/agent-native-logo-dark.svg\");\n const isPlain = variant === \"plain\";\n\n return (\n <>\n <style>{`\n .an-powered-logo {\n display: block;\n height: ${isPlain ? \"16.2px\" : \"14px\"};\n width: auto;\n flex: none;\n }\n .an-powered-logo-dark {\n display: none;\n }\n @media (max-width: 640px) {\n .an-powered-badge:not(.an-powered-badge-embedded) {\n position: static !important;\n margin: 0.75rem auto 0 !important;\n width: max-content;\n max-width: calc(100vw - 2rem);\n }\n }\n .an-powered-badge-plain {\n background: transparent !important;\n border-color: transparent !important;\n backdrop-filter: none !important;\n -webkit-backdrop-filter: none !important;\n padding: 0 !important;\n opacity: 1 !important;\n }\n .an-powered-badge-plain:hover {\n opacity: 0.82 !important;\n }\n .dark .an-powered-badge:not(.an-powered-badge-plain) {\n background: rgba(255, 255, 255, 0.06) !important;\n border-color: rgba(255, 255, 255, 0.08) !important;\n color: rgba(215, 215, 215, 0.94) !important;\n }\n .dark .an-powered-logo-light {\n display: none;\n }\n .dark .an-powered-logo-dark {\n display: block;\n }\n @media ${darkQuery} {\n .an-powered-badge:not(.an-powered-badge-plain) {\n background: rgba(255, 255, 255, 0.06) !important;\n border-color: rgba(255, 255, 255, 0.08) !important;\n color: rgba(215, 215, 215, 0.94) !important;\n }\n .an-powered-logo-light {\n display: none;\n }\n .an-powered-logo-dark {\n display: block;\n }\n }\n .light .an-powered-badge:not(.an-powered-badge-plain) {\n background: rgba(0, 0, 0, 0.05) !important;\n border-color: rgba(0, 0, 0, 0.06) !important;\n color: rgba(95, 95, 95, 0.95) !important;\n }\n .light .an-powered-logo-light {\n display: block;\n }\n .light .an-powered-logo-dark {\n display: none;\n }\n .an-powered-badge:not(.an-powered-badge-plain):hover {\n opacity: 1 !important;\n color: rgba(70, 70, 70, 1) !important;\n }\n @media ${darkQuery} {\n .an-powered-badge:not(.an-powered-badge-plain):hover {\n color: rgba(238, 238, 238, 1) !important;\n }\n }\n .dark .an-powered-badge:not(.an-powered-badge-plain):hover {\n color: rgba(238, 238, 238, 1) !important;\n }\n .light .an-powered-badge:not(.an-powered-badge-plain):hover {\n color: rgba(70, 70, 70, 1) !important;\n }\n `}</style>\n <a\n href=\"https://agent-native.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n \"an-powered-badge\",\n isPlain && \"an-powered-badge-plain\",\n embedded && \"an-powered-badge-embedded\",\n )}\n style={\n embedded\n ? {\n display: \"inline-flex\",\n alignItems: \"center\",\n textDecoration: \"none\",\n transition: \"opacity 0.2s\",\n }\n : containerStyle(position)\n }\n aria-label=\"Built with Agent Native\"\n >\n {!isPlain && <span>Built with</span>}\n <img\n src={logoOnLight}\n alt=\"Agent Native\"\n className=\"an-powered-logo an-powered-logo-light\"\n />\n <img\n src={logoOnDark}\n alt=\"Agent Native\"\n className=\"an-powered-logo an-powered-logo-dark\"\n />\n </a>\n </>\n );\n}\n\n/**\n * Small badge: \"Free and open source\"\n *\n * Intended to pair with PoweredByBadge on public pages.\n */\nexport function OpenSourceBadge({\n position = \"bottom-left\",\n embedded = false,\n}: OpenSourceBadgeProps) {\n const hidden =\n (import.meta.env as Record<string, string | undefined>)\n ?.VITE_HIDE_BRANDING === \"true\";\n\n if (hidden) return null;\n\n return (\n <>\n <style>{`\n .an-open-source-badge {\n background: transparent !important;\n border-color: transparent !important;\n backdrop-filter: none !important;\n -webkit-backdrop-filter: none !important;\n color: #00B5FF !important;\n font-weight: 600 !important;\n opacity: 0.95 !important;\n }\n @media (max-width: 640px) {\n .an-open-source-badge:not(.an-open-source-badge-embedded) {\n position: static !important;\n margin: 1rem auto 0 !important;\n width: max-content;\n max-width: calc(100vw - 2rem);\n }\n }\n .dark .an-open-source-badge {\n color: #00B5FF !important;\n }\n @media ${darkQuery} {\n .an-open-source-badge {\n color: #00B5FF !important;\n }\n }\n .light .an-open-source-badge {\n color: #00B5FF !important;\n }\n .an-open-source-badge:hover {\n opacity: 1 !important;\n color: #33C4FF !important;\n }\n @media ${darkQuery} {\n .an-open-source-badge:hover {\n color: #33C4FF !important;\n }\n }\n .dark .an-open-source-badge:hover {\n color: #33C4FF !important;\n }\n .light .an-open-source-badge:hover {\n color: #33C4FF !important;\n }\n `}</style>\n <a\n href=\"https://github.com/BuilderIO/agent-native\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n \"an-open-source-badge\",\n embedded && \"an-open-source-badge-embedded\",\n )}\n style={\n embedded\n ? {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 12,\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontWeight: 600,\n lineHeight: 1,\n textDecoration: \"none\",\n transition: \"opacity 0.2s, color 0.2s\",\n }\n : containerStyle(position)\n }\n >\n <span>Free and open source</span>\n </a>\n </>\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-chat-adapter.d.ts","sourceRoot":"","sources":["../../src/client/agent-chat-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AAOhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAmBrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,MAAM,oBAAoB;AAC9B;;;;GAIG;AACD,KAAK;AACP,0EAA0E;GACxE,WAAW,CAAC;AAqsChB;;;;GAIG;AACH;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC3C,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC;IACrD,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAA;KAAE,CAAC;IAC3D,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAyED,wBAAgB,sBAAsB,CACpC,OAAO,CAAC,EAAE,6BAA6B,GACtC,gBAAgB,CA68DlB"}
1
+ {"version":3,"file":"agent-chat-adapter.d.ts","sourceRoot":"","sources":["../../src/client/agent-chat-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AAOhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAmBrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,MAAM,oBAAoB;AAC9B;;;;GAIG;AACD,KAAK;AACP,0EAA0E;GACxE,WAAW,CAAC;AA8tChB;;;;GAIG;AACH;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC3C,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC;IACrD,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAA;KAAE,CAAC;IAC3D,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAyED,wBAAgB,sBAAsB,CACpC,OAAO,CAAC,EAAE,6BAA6B,GACtC,gBAAgB,CAw+DlB"}
@@ -132,6 +132,8 @@ function contentToContinuationHistory(content) {
132
132
  chunks.push(part.text.trim());
133
133
  continue;
134
134
  }
135
+ if (part.type === "reasoning")
136
+ continue;
135
137
  if (part.activity === true)
136
138
  continue;
137
139
  const toolSummary = [
@@ -438,6 +440,11 @@ function contentToStructuredMessages(content, nextToolCallId, options) {
438
440
  }
439
441
  continue;
440
442
  }
443
+ // Reasoning/thinking is UI-only — do not send chain-of-thought back into
444
+ // model history on continuation.
445
+ if (part.type === "reasoning") {
446
+ continue;
447
+ }
441
448
  if (isToolCallContentPart(part)) {
442
449
  if (part.activity === true)
443
450
  continue;
@@ -564,9 +571,13 @@ function combineContinuationHistory(fragments) {
564
571
  return truncateForContinuation(fragments.filter(Boolean).join("\n\n"), 40_000).trim();
565
572
  }
566
573
  function hasContinuationProgress(content) {
567
- return content.some((part) => part.type === "text"
568
- ? part.text.trim().length > 0
569
- : part.result !== undefined);
574
+ return content.some((part) => {
575
+ if (part.type === "text")
576
+ return part.text.trim().length > 0;
577
+ if (part.type === "reasoning")
578
+ return false;
579
+ return part.result !== undefined;
580
+ });
570
581
  }
571
582
  const COMPLETED_TOOL_TIMEOUT_NAME_RE = /^(add|apply|archive|capture|create|delete|deploy|duplicate|edit|generate|grant|insert|migrate|move|present|publish|remove|rename|reorder|revoke|save|send|set|sync|trash|update|write)(-|$)/;
572
583
  const COMPLETED_TOOL_TIMEOUT_NAME_ALLOWLIST = new Set([
@@ -679,7 +690,9 @@ function lastUnresolvedToolActivity(content) {
679
690
  return undefined;
680
691
  }
681
692
  function snapshotContent(content) {
682
- return content.map((part) => part.type === "text" ? { ...part } : { ...part, args: { ...part.args } });
693
+ return content.map((part) => part.type === "text" || part.type === "reasoning"
694
+ ? { ...part }
695
+ : { ...part, args: { ...part.args } });
683
696
  }
684
697
  function stableJson(value) {
685
698
  try {
@@ -737,6 +750,21 @@ function contentAfterContinuationPrefix(content, prefix) {
737
750
  }
738
751
  return content.slice(contentIndex);
739
752
  }
753
+ if (prefixPart.type === "reasoning" && currentPart.type === "reasoning") {
754
+ if (currentPart.text === prefixPart.text) {
755
+ contentIndex += 1;
756
+ continue;
757
+ }
758
+ if (currentPart.text.startsWith(prefixPart.text)) {
759
+ const appendedText = currentPart.text.slice(prefixPart.text.length);
760
+ if (appendedText) {
761
+ delta.push({ type: "reasoning", text: appendedText });
762
+ }
763
+ contentIndex += 1;
764
+ continue;
765
+ }
766
+ return content.slice(contentIndex);
767
+ }
740
768
  if (prefixPart.type === "tool-call" &&
741
769
  currentPart.type === "tool-call" &&
742
770
  toolContinuationKey(currentPart) === toolContinuationKey(prefixPart)) {
@@ -1824,7 +1852,7 @@ export function createAgentChatAdapter(options) {
1824
1852
  while (true) {
1825
1853
  if (abortSignal.aborted) {
1826
1854
  clearActiveRun();
1827
- return;
1855
+ return "completed";
1828
1856
  }
1829
1857
  let active = null;
1830
1858
  try {
@@ -1836,7 +1864,7 @@ export function createAgentChatAdapter(options) {
1836
1864
  catch (pollErr) {
1837
1865
  if (pollErr instanceof Error && pollErr.name === "AbortError") {
1838
1866
  clearActiveRun();
1839
- return;
1867
+ return "completed";
1840
1868
  }
1841
1869
  // Transient poll failure — counts as "no active run" this tick.
1842
1870
  }
@@ -1856,8 +1884,21 @@ export function createAgentChatAdapter(options) {
1856
1884
  updateCurrentRunDispatchMode(active?.dispatchMode);
1857
1885
  const isTerminal = activeStatus === "completed" || activeStatus === "errored";
1858
1886
  if (isTerminal && replayedTerminalRunIds.has(activeRunId)) {
1887
+ if (lastAutoContinueReason === "stale_run" &&
1888
+ lastRecoverableRunError?.errorCode === "stale_run") {
1889
+ const continuation = prepareAutoContinuation(new AgentAutoContinueSignal({
1890
+ reason: "stale_run",
1891
+ errorInfo: lastRecoverableRunError,
1892
+ activityTrail: lastActivityTrail,
1893
+ }));
1894
+ if (continuation.ok) {
1895
+ dispatchResumingUiEvent();
1896
+ await delay(250, abortSignal);
1897
+ return "client_continue";
1898
+ }
1899
+ }
1859
1900
  yield* emitBackgroundTerminalOutcome(active);
1860
- return;
1901
+ return "completed";
1861
1902
  }
1862
1903
  const previousRunId = runId;
1863
1904
  runId = activeRunId;
@@ -1870,7 +1911,7 @@ export function createAgentChatAdapter(options) {
1870
1911
  }
1871
1912
  const attach = yield* followAttachOnce();
1872
1913
  if (attach === "completed" || attach === "aborted") {
1873
- return;
1914
+ return "completed";
1874
1915
  }
1875
1916
  if (isTerminal) {
1876
1917
  replayedTerminalRunIds.add(activeRunId);
@@ -1892,7 +1933,7 @@ export function createAgentChatAdapter(options) {
1892
1933
  if (Date.now() - idleSince >=
1893
1934
  BACKGROUND_FOLLOW_IDLE_TIMEOUT_MS) {
1894
1935
  yield* emitBackgroundTerminalOutcome(lastSeenActive);
1895
- return;
1936
+ return "completed";
1896
1937
  }
1897
1938
  }
1898
1939
  dispatchResumingUiEvent();
@@ -1907,13 +1948,13 @@ export function createAgentChatAdapter(options) {
1907
1948
  : null,
1908
1949
  });
1909
1950
  yield* emitBackgroundTerminalOutcome(lastSeenActive);
1910
- return;
1951
+ return "completed";
1911
1952
  }
1912
1953
  }
1913
1954
  await delay(BACKGROUND_FOLLOW_POLL_INTERVAL_MS, abortSignal);
1914
1955
  if (abortSignal.aborted) {
1915
1956
  clearActiveRun();
1916
- return;
1957
+ return "completed";
1917
1958
  }
1918
1959
  }
1919
1960
  };
@@ -2434,7 +2475,10 @@ export function createAgentChatAdapter(options) {
2434
2475
  // client/server recovery race: client watchdog signals here are
2435
2476
  // just "reattach", not "recover".
2436
2477
  if (shouldFollowServerContinuation(err) && threadId) {
2437
- yield* followBackgroundTurn(err);
2478
+ const followOutcome = yield* followBackgroundTurn(err);
2479
+ if (followOutcome === "client_continue") {
2480
+ continue;
2481
+ }
2438
2482
  return;
2439
2483
  }
2440
2484
  if (err.reason === "no_progress") {
@@ -2597,7 +2641,10 @@ export function createAgentChatAdapter(options) {
2597
2641
  // before any response headers arrived has no dispatch mode yet
2598
2642
  // and keeps the foreground startup-retry path.)
2599
2643
  if (shouldFollowServerContinuation() && threadId) {
2600
- yield* followBackgroundTurn(new AgentAutoContinueSignal({ reason: "stream_ended" }));
2644
+ const followOutcome = yield* followBackgroundTurn(new AgentAutoContinueSignal({ reason: "stream_ended" }));
2645
+ if (followOutcome === "client_continue") {
2646
+ continue;
2647
+ }
2601
2648
  return;
2602
2649
  }
2603
2650
  if (err instanceof AgentStartupTimeoutError) {