@agent-native/core 0.91.1 → 0.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (383) hide show
  1. package/blueprints/action/crud.md +1 -1
  2. package/blueprints/channel/discord.md +1 -1
  3. package/blueprints/provider/stripe.md +1 -1
  4. package/blueprints/sandbox/docker.md +1 -1
  5. package/corpus/README.md +2 -2
  6. package/corpus/core/CHANGELOG.md +31 -0
  7. package/corpus/core/blueprints/action/crud.md +1 -1
  8. package/corpus/core/blueprints/channel/discord.md +1 -1
  9. package/corpus/core/blueprints/provider/stripe.md +1 -1
  10. package/corpus/core/blueprints/sandbox/docker.md +1 -1
  11. package/corpus/core/docs/content/faq.mdx +17 -0
  12. package/corpus/core/docs/content/notifications.mdx +12 -6
  13. package/corpus/core/package.json +6 -5
  14. package/corpus/core/src/agent/production-agent.ts +140 -46
  15. package/corpus/core/src/agent/run-manager.ts +23 -2
  16. package/corpus/core/src/agent/run-store.ts +2 -2
  17. package/corpus/core/src/agent/tool-search.ts +71 -4
  18. package/corpus/core/src/cli/add.ts +1 -1
  19. package/corpus/core/src/cli/create.ts +8 -3
  20. package/corpus/core/src/cli/index.ts +25 -4
  21. package/corpus/core/src/cli/upgrade.ts +798 -0
  22. package/corpus/core/src/client/AssistantChat.tsx +1 -1
  23. package/corpus/core/src/client/HighlightedCodeBlock.tsx +20 -3
  24. package/corpus/core/src/client/agent-chat-adapter.ts +31 -6
  25. package/corpus/core/src/client/chat/message-components.tsx +85 -8
  26. package/corpus/core/src/client/chat/tool-call-display.tsx +355 -144
  27. package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -9
  28. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +7 -0
  29. package/corpus/core/src/client/settings/SettingsPanel.tsx +533 -389
  30. package/corpus/core/src/client/settings/SettingsSection.tsx +154 -17
  31. package/corpus/core/src/client/sse-event-processor.ts +29 -2
  32. package/corpus/core/src/extensions/actions.ts +113 -5
  33. package/corpus/core/src/jobs/scheduler.ts +30 -1
  34. package/corpus/core/src/localization/default-messages.ts +21 -0
  35. package/corpus/core/src/notifications/channels.ts +88 -25
  36. package/corpus/core/src/notifications/registry.ts +17 -3
  37. package/corpus/core/src/notifications/types.ts +4 -1
  38. package/corpus/core/src/server/agent-chat-plugin.ts +7 -3
  39. package/corpus/core/src/server/request-context.ts +7 -0
  40. package/corpus/core/src/styles/agent-conversation.css +1 -1
  41. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  42. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  43. package/corpus/core/src/templates/default/AGENTS.md +10 -3
  44. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +21 -0
  45. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +21 -0
  46. package/corpus/core/src/templates/default/app/i18n/en-US.ts +21 -0
  47. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +21 -0
  48. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  49. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +20 -0
  50. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +21 -0
  51. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +20 -0
  52. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +21 -0
  53. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +20 -0
  54. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  55. package/corpus/core/src/templates/default/package.json +4 -3
  56. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  57. package/corpus/core/src/templates/headless/AGENTS.md +9 -3
  58. package/corpus/core/src/templates/headless/package.json +4 -3
  59. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  60. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  61. package/corpus/core/src/templates/workspace-core/package.json +6 -6
  62. package/corpus/core/src/templates/workspace-root/AGENTS.md +10 -4
  63. package/corpus/core/src/templates/workspace-root/package.json +3 -2
  64. package/corpus/core/src/triggers/dispatcher.ts +30 -2
  65. package/corpus/core/src/vite/client.ts +96 -1
  66. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +20 -2
  67. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +20 -2
  68. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  69. package/corpus/templates/analytics/AGENTS.md +7 -5
  70. package/corpus/templates/analytics/actions/save-monitor.ts +14 -0
  71. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +41 -6
  72. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +122 -11
  73. package/corpus/templates/analytics/app/global.css +26 -10
  74. package/corpus/templates/analytics/app/i18n/zh-TW.ts +2 -0
  75. package/corpus/templates/analytics/app/i18n-data.ts +25 -0
  76. package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +8 -2
  77. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +151 -32
  78. package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +17 -2
  79. package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +4 -0
  80. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +461 -286
  81. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +285 -294
  82. package/corpus/templates/analytics/changelog/2026-07-08-console-details-expand-inline-under-each-row-and-the-event-t.md +6 -0
  83. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-tables-keep-their-size-while-loading.md +6 -0
  84. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-uptime-and-errors-tabs-now-clearly-show-which-view-is-active.md +6 -0
  85. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-keeps-a-usable-stage-when-dev-tools-is-open-a.md +6 -0
  86. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-resumes-after-scrubbing-and-expands-console-r.md +6 -0
  87. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-uses-stock-rrweb-sizing-again-so-recorded.md +6 -0
  88. package/corpus/templates/analytics/changelog/2026-07-08-session-replays-wait-for-full-load-keep-a-normal-viewport-an.md +6 -0
  89. package/corpus/templates/analytics/changelog/2026-07-08-sidebar-dashboard-menus-now-open-above-the-dashboard-canvas.md +6 -0
  90. 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
  91. package/corpus/templates/analytics/docs/uptime-monitoring.md +13 -11
  92. package/corpus/templates/analytics/package.json +2 -2
  93. package/corpus/templates/analytics/server/db/schema-monitoring.ts +4 -0
  94. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +60 -12
  95. package/corpus/templates/analytics/server/plugins/db.ts +10 -0
  96. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +20 -2
  97. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  98. package/corpus/templates/assets/package.json +2 -2
  99. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +20 -2
  100. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  101. package/corpus/templates/brain/package.json +2 -2
  102. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +20 -2
  103. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  104. package/corpus/templates/calendar/AGENTS.md +10 -0
  105. package/corpus/templates/calendar/actions/create-event.ts +5 -1
  106. package/corpus/templates/calendar/actions/event-action-helpers.ts +41 -0
  107. package/corpus/templates/calendar/actions/get-attendee-timezones.ts +28 -0
  108. package/corpus/templates/calendar/actions/set-attendee-timezone.ts +68 -0
  109. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +150 -11
  110. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +36 -1
  111. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +32 -0
  112. package/corpus/templates/calendar/app/hooks/use-attendee-timezones.ts +24 -0
  113. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  114. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  115. package/corpus/templates/calendar/app/lib/attendee-local-time.ts +122 -0
  116. package/corpus/templates/calendar/changelog/2026-07-08-event-details-now-support-extension-widgets-and-you-can-see-.md +6 -0
  117. package/corpus/templates/calendar/changelog/2026-07-08-when-you-invite-guests-to-a-new-event-you-now-appear-in.md +6 -0
  118. package/corpus/templates/calendar/package.json +2 -2
  119. package/corpus/templates/calendar/server/handlers/events.ts +5 -1
  120. package/corpus/templates/calendar/shared/api.ts +6 -0
  121. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +20 -2
  122. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  123. package/corpus/templates/chat/package.json +2 -2
  124. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +6 -2
  125. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +20 -2
  126. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  127. package/corpus/templates/clips/actions/create-meeting.ts +8 -3
  128. package/corpus/templates/clips/actions/list-meetings.ts +31 -3
  129. package/corpus/templates/clips/changelog/2026-07-08-after-finishing-a-desktop-recording-reopening-clips-restor.md +6 -0
  130. package/corpus/templates/clips/changelog/2026-07-08-clips-now-pops-up-to-take-notes-when-you-join-an-adhoc-zoom-.md +6 -0
  131. package/corpus/templates/clips/changelog/2026-07-08-desktop-clip-recordings-are-louder-after-capture-mic-only.md +6 -0
  132. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-notes-stay-active-from-tray-and-shortcut-controls.md +6 -0
  133. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-popovers-can-start-notes-and-join-the-meetin.md +6 -0
  134. package/corpus/templates/clips/changelog/2026-07-08-meeting-notes-keep-their-recording-state-when-the-desktop.md +6 -0
  135. package/corpus/templates/clips/changelog/2026-07-08-meeting-reminder-dropdowns-now-expand-fully-instead-of-being.md +6 -0
  136. package/corpus/templates/clips/changelog/2026-07-08-meeting-reminders-now-appear-1-minute-before-start-stay-unti.md +6 -0
  137. package/corpus/templates/clips/changelog/2026-07-08-the-desktop-meetings-panel-has-room-for-its-drop-shadow-and-.md +6 -0
  138. package/corpus/templates/clips/chrome-extension/package.json +2 -2
  139. package/corpus/templates/clips/desktop/package.json +2 -2
  140. package/corpus/templates/clips/desktop/src/app.tsx +214 -37
  141. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +30 -6
  142. package/corpus/templates/clips/desktop/src/lib/meeting-notification-timing.ts +83 -0
  143. package/corpus/templates/clips/desktop/src/lib/native-recording-warm.ts +21 -0
  144. package/corpus/templates/clips/desktop/src/lib/recorder.ts +98 -20
  145. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +197 -50
  146. package/corpus/templates/clips/desktop/src/styles.css +150 -53
  147. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +362 -0
  148. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +41 -7
  149. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +9 -2
  150. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +89 -11
  151. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +71 -17
  152. package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +36 -1
  153. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +62 -10
  154. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +3 -3
  155. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +1 -25
  156. package/corpus/templates/clips/desktop/src-tauri/src/state.rs +5 -0
  157. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -6
  158. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +36 -1
  159. package/corpus/templates/clips/package.json +2 -2
  160. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +20 -2
  161. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  162. package/corpus/templates/content/actions/_batch-utils.ts +8 -0
  163. package/corpus/templates/content/actions/_builder-cms-read-client.ts +7 -5
  164. package/corpus/templates/content/actions/_content-database-personal-view.ts +80 -0
  165. package/corpus/templates/content/actions/_database-source-utils.ts +776 -319
  166. package/corpus/templates/content/actions/_database-utils.ts +6 -1
  167. package/corpus/templates/content/actions/_property-utils.ts +168 -0
  168. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +19 -12
  169. package/corpus/templates/content/actions/bind-content-database-source-field.ts +19 -12
  170. package/corpus/templates/content/actions/delete-document.ts +9 -13
  171. package/corpus/templates/content/actions/get-content-database-personal-view.ts +27 -0
  172. package/corpus/templates/content/actions/refresh-content-database-source.ts +5 -5
  173. package/corpus/templates/content/actions/update-content-database-personal-view.ts +31 -0
  174. package/corpus/templates/content/actions/update-content-database-view.ts +3 -0
  175. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +1 -1
  176. package/corpus/templates/content/app/components/editor/body-hydration.ts +35 -11
  177. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +2631 -551
  178. package/corpus/templates/content/app/components/editor/database/filter-sort.ts +220 -18
  179. package/corpus/templates/content/app/hooks/use-content-database.ts +32 -0
  180. package/corpus/templates/content/app/hooks/use-documents.ts +8 -2
  181. package/corpus/templates/content/app/i18n/zh-TW.ts +16 -0
  182. package/corpus/templates/content/app/i18n-data.ts +154 -0
  183. package/corpus/templates/content/changelog/2026-07-08-builder-source-sync-now-completes-reliably-on-hosted-databases.md +6 -0
  184. package/corpus/templates/content/changelog/2026-07-08-database-filters-now-support-notion-style-reset-save-for-eve.md +6 -0
  185. package/corpus/templates/content/changelog/2026-07-08-date-filters-can-now-target-a-between-range.md +6 -0
  186. package/corpus/templates/content/changelog/2026-07-08-fixed-builder-database-sync-so-large-sources-continue-past-t.md +6 -0
  187. package/corpus/templates/content/package.json +2 -2
  188. package/corpus/templates/content/parity/matrix.md +1 -1
  189. package/corpus/templates/content/parity/matrix.ts +2 -0
  190. package/corpus/templates/content/server/plugins/db.ts +19 -0
  191. package/corpus/templates/content/shared/api.ts +24 -0
  192. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +20 -2
  193. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  194. package/corpus/templates/design/package.json +2 -2
  195. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +20 -2
  196. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  197. package/corpus/templates/dispatch/app/i18n/zh-TW.ts +34 -1
  198. package/corpus/templates/dispatch/app/i18n-data.ts +387 -10
  199. package/corpus/templates/dispatch/app/routes/automations.tsx +1 -0
  200. package/corpus/templates/dispatch/changelog/2026-07-08-added-an-automations-page-to-review-pause-and-create.md +6 -0
  201. package/corpus/templates/dispatch/changelog/2026-07-08-destinations-now-shows-outbound-delivery-queue-health.md +6 -0
  202. package/corpus/templates/dispatch/package.json +2 -2
  203. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +20 -2
  204. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  205. package/corpus/templates/forms/package.json +2 -2
  206. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  207. package/corpus/templates/macros/package.json +2 -2
  208. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +20 -2
  209. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  210. package/corpus/templates/mail/app/hooks/use-emails.ts +56 -44
  211. package/corpus/templates/mail/app/lib/gmail-mutation-queue.ts +325 -0
  212. package/corpus/templates/mail/changelog/2026-07-08-rapid-archive-and-mark-read-now-batch-gmail-updates-so-the-i.md +6 -0
  213. package/corpus/templates/mail/package.json +2 -2
  214. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +20 -2
  215. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  216. package/corpus/templates/plan/package.json +2 -2
  217. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +20 -2
  218. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  219. package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +46 -29
  220. package/corpus/templates/slides/app/context/DeckContext.tsx +45 -18
  221. package/corpus/templates/slides/app/i18n/ar-SA.ts +4 -0
  222. package/corpus/templates/slides/app/i18n/de-DE.ts +4 -0
  223. package/corpus/templates/slides/app/i18n/en-US.ts +4 -0
  224. package/corpus/templates/slides/app/i18n/es-ES.ts +4 -0
  225. package/corpus/templates/slides/app/i18n/fr-FR.ts +4 -0
  226. package/corpus/templates/slides/app/i18n/hi-IN.ts +4 -0
  227. package/corpus/templates/slides/app/i18n/ja-JP.ts +4 -0
  228. package/corpus/templates/slides/app/i18n/ko-KR.ts +4 -0
  229. package/corpus/templates/slides/app/i18n/pt-BR.ts +4 -0
  230. package/corpus/templates/slides/app/i18n/zh-CN.ts +4 -0
  231. package/corpus/templates/slides/app/i18n/zh-TW.ts +4 -0
  232. package/corpus/templates/slides/app/lib/image-drop-to-agent.ts +115 -0
  233. package/corpus/templates/slides/app/pages/DeckEditor.tsx +22 -13
  234. package/corpus/templates/slides/changelog/2026-07-08-dropping-an-image-onto-a-slide-and-sending-it-to-the-agent-w.md +6 -0
  235. package/corpus/templates/slides/changelog/2026-07-08-undo-works-after-the-agent-edits-a-slide-so-you-can-reverse.md +6 -0
  236. package/corpus/templates/slides/package.json +2 -2
  237. package/corpus/templates/videos/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  238. package/corpus/templates/voice/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  239. package/dist/agent/production-agent.d.ts +5 -1
  240. package/dist/agent/production-agent.d.ts.map +1 -1
  241. package/dist/agent/production-agent.js +112 -42
  242. package/dist/agent/production-agent.js.map +1 -1
  243. package/dist/agent/run-manager.d.ts.map +1 -1
  244. package/dist/agent/run-manager.js +23 -2
  245. package/dist/agent/run-manager.js.map +1 -1
  246. package/dist/agent/run-store.js +2 -2
  247. package/dist/agent/run-store.js.map +1 -1
  248. package/dist/agent/tool-search.d.ts +2 -0
  249. package/dist/agent/tool-search.d.ts.map +1 -1
  250. package/dist/agent/tool-search.js +60 -4
  251. package/dist/agent/tool-search.js.map +1 -1
  252. package/dist/catalog.json +2 -2
  253. package/dist/cli/add.js +1 -1
  254. package/dist/cli/add.js.map +1 -1
  255. package/dist/cli/create.d.ts.map +1 -1
  256. package/dist/cli/create.js +8 -3
  257. package/dist/cli/create.js.map +1 -1
  258. package/dist/cli/index.js +24 -4
  259. package/dist/cli/index.js.map +1 -1
  260. package/dist/cli/upgrade.d.ts +100 -0
  261. package/dist/cli/upgrade.d.ts.map +1 -0
  262. package/dist/cli/upgrade.js +678 -0
  263. package/dist/cli/upgrade.js.map +1 -0
  264. package/dist/client/AssistantChat.js +1 -1
  265. package/dist/client/AssistantChat.js.map +1 -1
  266. package/dist/client/HighlightedCodeBlock.d.ts +2 -0
  267. package/dist/client/HighlightedCodeBlock.d.ts.map +1 -1
  268. package/dist/client/HighlightedCodeBlock.js +10 -1
  269. package/dist/client/HighlightedCodeBlock.js.map +1 -1
  270. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  271. package/dist/client/agent-chat-adapter.js +32 -4
  272. package/dist/client/agent-chat-adapter.js.map +1 -1
  273. package/dist/client/chat/message-components.d.ts.map +1 -1
  274. package/dist/client/chat/message-components.js +61 -8
  275. package/dist/client/chat/message-components.js.map +1 -1
  276. package/dist/client/chat/tool-call-display.d.ts +12 -0
  277. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  278. package/dist/client/chat/tool-call-display.js +136 -42
  279. package/dist/client/chat/tool-call-display.js.map +1 -1
  280. package/dist/client/code-agent-chat-adapter.js +2 -9
  281. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  282. package/dist/client/extensions/ExtensionSlot.js +6 -0
  283. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  284. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  285. package/dist/client/settings/SettingsPanel.js +52 -19
  286. package/dist/client/settings/SettingsPanel.js.map +1 -1
  287. package/dist/client/settings/SettingsSection.d.ts +19 -4
  288. package/dist/client/settings/SettingsSection.d.ts.map +1 -1
  289. package/dist/client/settings/SettingsSection.js +33 -4
  290. package/dist/client/settings/SettingsSection.js.map +1 -1
  291. package/dist/client/sse-event-processor.d.ts +9 -0
  292. package/dist/client/sse-event-processor.d.ts.map +1 -1
  293. package/dist/client/sse-event-processor.js +20 -2
  294. package/dist/client/sse-event-processor.js.map +1 -1
  295. package/dist/collab/routes.d.ts +1 -1
  296. package/dist/collab/struct-routes.d.ts +1 -1
  297. package/dist/extensions/actions.d.ts.map +1 -1
  298. package/dist/extensions/actions.js +85 -5
  299. package/dist/extensions/actions.js.map +1 -1
  300. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  301. package/dist/jobs/scheduler.js +26 -1
  302. package/dist/jobs/scheduler.js.map +1 -1
  303. package/dist/localization/default-messages.d.ts +19 -0
  304. package/dist/localization/default-messages.d.ts.map +1 -1
  305. package/dist/localization/default-messages.js +19 -0
  306. package/dist/localization/default-messages.js.map +1 -1
  307. package/dist/notifications/channels.d.ts +8 -3
  308. package/dist/notifications/channels.d.ts.map +1 -1
  309. package/dist/notifications/channels.js +61 -22
  310. package/dist/notifications/channels.js.map +1 -1
  311. package/dist/notifications/registry.d.ts.map +1 -1
  312. package/dist/notifications/registry.js +14 -3
  313. package/dist/notifications/registry.js.map +1 -1
  314. package/dist/notifications/routes.d.ts +1 -1
  315. package/dist/notifications/types.d.ts +4 -1
  316. package/dist/notifications/types.d.ts.map +1 -1
  317. package/dist/notifications/types.js.map +1 -1
  318. package/dist/observability/routes.d.ts +1 -1
  319. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  320. package/dist/resources/handlers.d.ts +3 -3
  321. package/dist/server/agent-chat-plugin.d.ts +5 -1
  322. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  323. package/dist/server/agent-chat-plugin.js +2 -2
  324. package/dist/server/agent-chat-plugin.js.map +1 -1
  325. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  326. package/dist/server/request-context.d.ts +7 -0
  327. package/dist/server/request-context.d.ts.map +1 -1
  328. package/dist/server/request-context.js.map +1 -1
  329. package/dist/styles/agent-conversation.css +1 -1
  330. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  331. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  332. package/dist/templates/default/AGENTS.md +10 -3
  333. package/dist/templates/default/app/i18n/ar-SA.ts +21 -0
  334. package/dist/templates/default/app/i18n/de-DE.ts +21 -0
  335. package/dist/templates/default/app/i18n/en-US.ts +21 -0
  336. package/dist/templates/default/app/i18n/es-ES.ts +21 -0
  337. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  338. package/dist/templates/default/app/i18n/hi-IN.ts +20 -0
  339. package/dist/templates/default/app/i18n/ja-JP.ts +21 -0
  340. package/dist/templates/default/app/i18n/ko-KR.ts +20 -0
  341. package/dist/templates/default/app/i18n/pt-BR.ts +21 -0
  342. package/dist/templates/default/app/i18n/zh-CN.ts +20 -0
  343. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  344. package/dist/templates/default/package.json +4 -3
  345. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  346. package/dist/templates/headless/AGENTS.md +9 -3
  347. package/dist/templates/headless/package.json +4 -3
  348. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  349. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  350. package/dist/templates/workspace-core/package.json +6 -6
  351. package/dist/templates/workspace-root/AGENTS.md +10 -4
  352. package/dist/templates/workspace-root/package.json +3 -2
  353. package/dist/triggers/dispatcher.js +27 -2
  354. package/dist/triggers/dispatcher.js.map +1 -1
  355. package/dist/vite/client.d.ts.map +1 -1
  356. package/dist/vite/client.js +70 -1
  357. package/dist/vite/client.js.map +1 -1
  358. package/docs/content/faq.mdx +17 -0
  359. package/docs/content/notifications.mdx +12 -6
  360. package/package.json +7 -6
  361. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  362. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  363. package/src/templates/default/AGENTS.md +10 -3
  364. package/src/templates/default/app/i18n/ar-SA.ts +21 -0
  365. package/src/templates/default/app/i18n/de-DE.ts +21 -0
  366. package/src/templates/default/app/i18n/en-US.ts +21 -0
  367. package/src/templates/default/app/i18n/es-ES.ts +21 -0
  368. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  369. package/src/templates/default/app/i18n/hi-IN.ts +20 -0
  370. package/src/templates/default/app/i18n/ja-JP.ts +21 -0
  371. package/src/templates/default/app/i18n/ko-KR.ts +20 -0
  372. package/src/templates/default/app/i18n/pt-BR.ts +21 -0
  373. package/src/templates/default/app/i18n/zh-CN.ts +20 -0
  374. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  375. package/src/templates/default/package.json +4 -3
  376. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  377. package/src/templates/headless/AGENTS.md +9 -3
  378. package/src/templates/headless/package.json +4 -3
  379. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  380. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  381. package/src/templates/workspace-core/package.json +6 -6
  382. package/src/templates/workspace-root/AGENTS.md +10 -4
  383. package/src/templates/workspace-root/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"code-agent-chat-adapter.js","sourceRoot":"","sources":["../../src/client/code-agent-chat-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ChatModelAdapter,\n ChatModelRunOptions,\n ChatModelRunResult,\n} from \"@assistant-ui/react\";\n\nimport {\n normalizeCodeAgentTranscript,\n type CodeAgentTranscriptEvent as CoreCodeAgentTranscriptEvent,\n type NormalizedCodeAgentStatusEvent,\n type NormalizedCodeAgentThinkingEvent,\n type NormalizedCodeAgentToolEvent,\n type NormalizedCodeAgentTranscriptItem,\n} from \"../code-agents/transcript-normalizer.js\";\nimport {\n compareCodeAgentTranscriptEvents,\n isCodeAgentRunActive,\n type CodeAgentRunStateLike,\n} from \"../code-agents/transcript-order.js\";\nimport type { ReasoningEffort } from \"../shared/reasoning-effort.js\";\nimport { unwrapAttachmentEnvelope } from \"./composer/pasted-text.js\";\nimport type { AgentPromptAttachment } from \"./composer/prompt-attachments.js\";\nimport type { ContentPart } from \"./sse-event-processor.js\";\n\nexport type CodeAgentChatFollowUpMode = \"immediate\" | \"queued\";\n\nexport interface CodeAgentChatTranscriptEvent {\n id: string;\n runId: string;\n kind?: CoreCodeAgentTranscriptEvent[\"kind\"];\n type?: CoreCodeAgentTranscriptEvent[\"kind\"] | \"note\";\n message?: string;\n text?: string;\n createdAt: string;\n metadata?: Record<string, unknown>;\n artifactPath?: string;\n artifactUrl?: string;\n}\n\nexport interface CodeAgentChatControlResult {\n ok: boolean;\n run?: CodeAgentRunStateLike | null;\n queued?: boolean;\n message?: string;\n error?: string;\n}\n\nexport interface CodeAgentChatController {\n get(runId: string): Promise<CodeAgentRunStateLike | null>;\n transcript(runId: string): Promise<CodeAgentChatTranscriptEvent[]>;\n sendFollowUp(input: {\n runId: string;\n prompt: string;\n mode?: CodeAgentChatFollowUpMode;\n permissionMode?: string;\n engine?: string;\n model?: string;\n reasoningEffort?: ReasoningEffort;\n source?: string;\n metadata?: Record<string, unknown>;\n }): Promise<CodeAgentChatControlResult>;\n control(input: {\n runId: string;\n command: \"stop\";\n }): Promise<CodeAgentChatControlResult>;\n}\n\nexport interface CreateCodeAgentChatAdapterOptions {\n controller: CodeAgentChatController;\n runIdRef: { current: string | null };\n permissionModeRef?: { current: string | undefined };\n modelRef?: { current: string | undefined };\n engineRef?: { current: string | undefined };\n effortRef?: { current: ReasoningEffort | undefined };\n followUpModeRef?: { current: CodeAgentChatFollowUpMode | undefined };\n attachOnlyRef?: { current: boolean };\n tabId?: string;\n pollIntervalMs?: number;\n idlePollIntervalMs?: number;\n terminalIdlePolls?: number;\n /**\n * Assistant-ui may abort a run for UI lifecycle reasons, such as switching\n * selected sessions. Code sessions keep running unless the host sends an\n * explicit stop command.\n */\n stopOnAbort?: boolean;\n}\n\ntype AssistantUiAttachment = {\n name?: string;\n contentType?: string;\n content?: readonly Record<string, unknown>[];\n};\n\nexport function createCodeAgentChatAdapter(\n options: CreateCodeAgentChatAdapterOptions,\n): ChatModelAdapter {\n const pollIntervalMs = options.pollIntervalMs ?? 1000;\n const idlePollIntervalMs = options.idlePollIntervalMs ?? 5000;\n const terminalIdlePolls = options.terminalIdlePolls ?? 3;\n const stopOnAbort = options.stopOnAbort === true;\n\n return {\n async *run({ messages, abortSignal }: ChatModelRunOptions) {\n const runId = options.runIdRef.current;\n if (!runId) {\n yield errorResult(\"Select an Agent-Native Code session first.\");\n return;\n }\n\n const lastUserMessage = latestUserMessage(messages);\n const attachments = lastUserMessage\n ? extractPromptAttachmentsFromAssistantMessage(lastUserMessage)\n : [];\n const prompt =\n latestUserText(messages).trim() ||\n (attachments.length > 0 ? \"Use the attached context.\" : \"\");\n if (!prompt.trim()) {\n yield errorResult(\"Enter a follow-up prompt.\");\n return;\n }\n\n let stoppedFromAbort = false;\n const stopForAbort = () => {\n stoppedFromAbort = true;\n if (stopOnAbort) {\n void options.controller.control({ runId, command: \"stop\" });\n }\n };\n if (abortSignal.aborted) {\n stopForAbort();\n return;\n }\n abortSignal.addEventListener(\"abort\", stopForAbort, { once: true });\n\n try {\n const initialEvents = await options.controller.transcript(runId);\n const seenEventIds = new Set(initialEvents.map((event) => event.id));\n const tailedEvents: CodeAgentChatTranscriptEvent[] = [];\n\n if (!options.attachOnlyRef?.current) {\n const beforeSendRun = await options.controller.get(runId);\n const response = await options.controller.sendFollowUp({\n runId,\n prompt,\n mode:\n options.followUpModeRef?.current ??\n (beforeSendRun && isCodeAgentRunActive(beforeSendRun)\n ? \"queued\"\n : \"immediate\"),\n permissionMode: options.permissionModeRef?.current,\n engine: options.engineRef?.current,\n model: options.modelRef?.current,\n reasoningEffort: options.effortRef?.current,\n source: \"code-agent-chat\",\n metadata: attachments.length > 0 ? { attachments } : undefined,\n });\n if (!response.ok) {\n yield errorResult(\n response.error ?? response.message ?? \"Could not send follow-up.\",\n runId,\n );\n return;\n }\n }\n\n let yieldedContent = false;\n let idleTerminalPolls = 0;\n while (!abortSignal.aborted) {\n const [events, run] = await Promise.all([\n options.controller.transcript(runId),\n options.controller.get(runId),\n ]);\n const nextEvents = events\n .filter((event) => !seenEventIds.has(event.id))\n .sort(compareCodeAgentTranscriptEvents);\n for (const event of nextEvents) {\n seenEventIds.add(event.id);\n tailedEvents.push(event);\n }\n\n const content = codeAgentTranscriptEventsToContent(tailedEvents);\n const sawClear = nextEvents.some(isAgentChatClearTranscriptEvent);\n if ((content.length > 0 || sawClear) && nextEvents.length > 0) {\n yieldedContent = true;\n yield withRunMetadata({ content: [...content] }, runId);\n }\n\n if (run && isCodeAgentRunActive(run)) {\n idleTerminalPolls = 0;\n } else if (nextEvents.length === 0) {\n idleTerminalPolls += 1;\n } else {\n idleTerminalPolls = 0;\n }\n\n if (idleTerminalPolls >= terminalIdlePolls) {\n if (content.length > 0 && !yieldedContent) {\n yield withRunMetadata({ content: [...content] }, runId);\n }\n return;\n }\n\n await sleep(\n run && isCodeAgentRunActive(run)\n ? pollIntervalMs\n : idlePollIntervalMs,\n abortSignal,\n );\n }\n } finally {\n abortSignal.removeEventListener(\"abort\", stopForAbort);\n if (stoppedFromAbort) {\n return;\n }\n }\n },\n };\n}\n\nexport function codeAgentTranscriptEventsToContent(\n events: readonly CodeAgentChatTranscriptEvent[],\n): ContentPart[] {\n const normalized = normalizeCodeAgentTranscript(\n events.map(toCoreCodeAgentTranscriptEvent),\n );\n const content: ContentPart[] = [];\n\n const appendText = (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n const last = content.at(-1);\n if (last?.type === \"text\") {\n last.text = `${last.text}${last.text ? \"\\n\\n\" : \"\"}${trimmed}`;\n } else {\n content.push({ type: \"text\", text: trimmed });\n }\n };\n\n for (const item of normalized.items) {\n const part = contentPartForCodeAgentTranscriptItem(item);\n if (!part) continue;\n if (part.type === \"text\") {\n appendText(part.text);\n } else {\n content.push(part);\n }\n }\n\n return content;\n}\n\nfunction isAgentChatClearTranscriptEvent(\n event: CodeAgentChatTranscriptEvent | undefined,\n): boolean {\n return event?.metadata?.agentChatEventType === \"clear\";\n}\n\nfunction latestUserMessage(\n messages: ChatModelRunOptions[\"messages\"],\n): ChatModelRunOptions[\"messages\"][number] | undefined {\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (message.role === \"user\") return message;\n }\n return undefined;\n}\n\nfunction latestUserText(messages: ChatModelRunOptions[\"messages\"]): string {\n const message = latestUserMessage(messages);\n return (\n message?.content\n .filter(\n (part): part is { type: \"text\"; text: string } => part.type === \"text\",\n )\n .map((part) => part.text)\n .join(\"\\n\") ?? \"\"\n );\n}\n\nfunction extractPromptAttachmentsFromAssistantMessage(message: {\n attachments?: readonly AssistantUiAttachment[];\n}): AgentPromptAttachment[] {\n const attachments: AgentPromptAttachment[] = [];\n for (const att of message.attachments ?? []) {\n const name = att.name ?? \"attachment\";\n for (const part of att.content ?? []) {\n if (part.type === \"image\" && typeof part.image === \"string\") {\n attachments.push({\n name,\n type: att.contentType,\n dataUrl: part.image,\n });\n } else if (part.type === \"file\" && typeof part.data === \"string\") {\n attachments.push({\n name,\n type:\n att.contentType ??\n (typeof part.mimeType === \"string\" ? part.mimeType : undefined),\n ...(part.data.startsWith(\"data:\")\n ? { dataUrl: part.data }\n : { text: part.data }),\n });\n } else if (part.type === \"text\" && typeof part.text === \"string\") {\n attachments.push({\n name,\n type: att.contentType,\n text: unwrapAttachmentEnvelope(part.text),\n });\n }\n }\n }\n return attachments;\n}\n\nfunction toCoreCodeAgentTranscriptEvent(\n event: CodeAgentChatTranscriptEvent,\n): CoreCodeAgentTranscriptEvent {\n return {\n schemaVersion: 1,\n id: event.id,\n runId: event.runId,\n kind: (event.kind ??\n event.type ??\n \"status\") as CoreCodeAgentTranscriptEvent[\"kind\"],\n message: event.message ?? event.text ?? \"\",\n createdAt: event.createdAt,\n metadata: {\n ...(event.metadata ?? {}),\n ...(event.artifactPath ? { artifactPath: event.artifactPath } : {}),\n ...(event.artifactUrl ? { artifactUrl: event.artifactUrl } : {}),\n },\n };\n}\n\nfunction contentPartForCodeAgentTranscriptItem(\n item: NormalizedCodeAgentTranscriptItem,\n): ContentPart | null {\n if (item.type === \"assistant\") {\n return item.text.trim() ? { type: \"text\", text: item.text.trim() } : null;\n }\n if (item.type === \"tool\") {\n return toolContentPartForCodeAgentTranscriptItem(item);\n }\n if (item.type === \"thinking\") {\n return thinkingContentPartForCodeAgentTranscriptItem(item);\n }\n if (item.type === \"status\") {\n const text = statusTextForCodeAgentTranscriptItem(item);\n return text ? { type: \"text\", text } : null;\n }\n return null;\n}\n\nfunction thinkingContentPartForCodeAgentTranscriptItem(\n item: NormalizedCodeAgentThinkingEvent,\n): ContentPart | null {\n const text = item.text.trim();\n if (!text) return null;\n // Surface as a special \"thinking\" tool-call-like part so the chat renderer\n // can display a collapsed-by-default \"Thinking…\" cell. Using a distinct\n // toolName makes it easy to style in AssistantChat without a new content type.\n return {\n type: \"tool-call\",\n toolCallId: `thinking-${item.id}`,\n toolName: \"thinking\",\n argsText: \"\",\n args: {},\n result: text,\n };\n}\n\nfunction toolContentPartForCodeAgentTranscriptItem(\n item: NormalizedCodeAgentToolEvent,\n): ContentPart {\n return {\n type: \"tool-call\",\n toolCallId: `code-tool-${item.id}`,\n toolName: item.tool ?? item.label ?? \"code-agent\",\n argsText: previewValue(item.input) ?? \"\",\n args: recordArgs(item.input),\n ...(item.result !== undefined\n ? { result: previewValue(item.result) ?? \"\" }\n : {}),\n ...(item.mcpApp ? { mcpApp: item.mcpApp } : {}),\n ...(item.structuredMeta ? { structuredMeta: item.structuredMeta } : {}),\n };\n}\n\nfunction statusTextForCodeAgentTranscriptItem(\n item: NormalizedCodeAgentStatusEvent,\n): string | null {\n if (item.statusKind === \"artifact\") {\n const event = item.events[0];\n const path =\n stringMetadata(event?.metadata, \"artifactPath\") ??\n stringMetadata(event?.metadata, \"path\");\n const url = stringMetadata(event?.metadata, \"artifactUrl\");\n const target = url ?? path;\n return target\n ? `Artifact: ${item.text}\\n${target}`\n : `Artifact: ${item.text}`;\n }\n if (item.level === \"info\" && item.statusKind !== \"note\") return null;\n return item.text;\n}\n\nfunction recordArgs(value: unknown): Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const result: Record<string, string> = {};\n for (const [key, entry] of Object.entries(value)) {\n result[key] =\n typeof entry === \"string\" ? entry : (previewValue(entry) ?? \"\");\n }\n return result;\n}\n\nfunction previewValue(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n const text =\n typeof value === \"string\" ? value : (JSON.stringify(value, null, 2) ?? \"\");\n const trimmed = text.trim();\n if (!trimmed) return undefined;\n return trimmed.length > 4000 ? `${trimmed.slice(0, 4000)}\\n...` : trimmed;\n}\n\nfunction stringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const value = metadata?.[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction withRunMetadata(\n result: ChatModelRunResult,\n runId: string,\n): ChatModelRunResult {\n const metadata = (result.metadata ?? {}) as Record<string, unknown>;\n const custom =\n metadata.custom && typeof metadata.custom === \"object\"\n ? (metadata.custom as Record<string, unknown>)\n : {};\n return {\n ...result,\n metadata: {\n ...metadata,\n custom: { ...custom, runId },\n },\n };\n}\n\nfunction errorResult(message: string, runId?: string): ChatModelRunResult {\n return withRunMetadata(\n {\n content: [{ type: \"text\", text: message }],\n status: { type: \"incomplete\", reason: \"error\" },\n } as ChatModelRunResult,\n runId ?? \"code-agent\",\n );\n}\n\nfunction sleep(ms: number, abortSignal: AbortSignal): Promise<void> {\n if (abortSignal.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const timeout = setTimeout(resolve, ms);\n abortSignal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timeout);\n resolve();\n },\n { once: true },\n );\n });\n}\n"]}
1
+ {"version":3,"file":"code-agent-chat-adapter.js","sourceRoot":"","sources":["../../src/client/code-agent-chat-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ChatModelAdapter,\n ChatModelRunOptions,\n ChatModelRunResult,\n} from \"@assistant-ui/react\";\n\nimport {\n normalizeCodeAgentTranscript,\n type CodeAgentTranscriptEvent as CoreCodeAgentTranscriptEvent,\n type NormalizedCodeAgentStatusEvent,\n type NormalizedCodeAgentThinkingEvent,\n type NormalizedCodeAgentToolEvent,\n type NormalizedCodeAgentTranscriptItem,\n} from \"../code-agents/transcript-normalizer.js\";\nimport {\n compareCodeAgentTranscriptEvents,\n isCodeAgentRunActive,\n type CodeAgentRunStateLike,\n} from \"../code-agents/transcript-order.js\";\nimport type { ReasoningEffort } from \"../shared/reasoning-effort.js\";\nimport { unwrapAttachmentEnvelope } from \"./composer/pasted-text.js\";\nimport type { AgentPromptAttachment } from \"./composer/prompt-attachments.js\";\nimport type { ContentPart } from \"./sse-event-processor.js\";\n\nexport type CodeAgentChatFollowUpMode = \"immediate\" | \"queued\";\n\nexport interface CodeAgentChatTranscriptEvent {\n id: string;\n runId: string;\n kind?: CoreCodeAgentTranscriptEvent[\"kind\"];\n type?: CoreCodeAgentTranscriptEvent[\"kind\"] | \"note\";\n message?: string;\n text?: string;\n createdAt: string;\n metadata?: Record<string, unknown>;\n artifactPath?: string;\n artifactUrl?: string;\n}\n\nexport interface CodeAgentChatControlResult {\n ok: boolean;\n run?: CodeAgentRunStateLike | null;\n queued?: boolean;\n message?: string;\n error?: string;\n}\n\nexport interface CodeAgentChatController {\n get(runId: string): Promise<CodeAgentRunStateLike | null>;\n transcript(runId: string): Promise<CodeAgentChatTranscriptEvent[]>;\n sendFollowUp(input: {\n runId: string;\n prompt: string;\n mode?: CodeAgentChatFollowUpMode;\n permissionMode?: string;\n engine?: string;\n model?: string;\n reasoningEffort?: ReasoningEffort;\n source?: string;\n metadata?: Record<string, unknown>;\n }): Promise<CodeAgentChatControlResult>;\n control(input: {\n runId: string;\n command: \"stop\";\n }): Promise<CodeAgentChatControlResult>;\n}\n\nexport interface CreateCodeAgentChatAdapterOptions {\n controller: CodeAgentChatController;\n runIdRef: { current: string | null };\n permissionModeRef?: { current: string | undefined };\n modelRef?: { current: string | undefined };\n engineRef?: { current: string | undefined };\n effortRef?: { current: ReasoningEffort | undefined };\n followUpModeRef?: { current: CodeAgentChatFollowUpMode | undefined };\n attachOnlyRef?: { current: boolean };\n tabId?: string;\n pollIntervalMs?: number;\n idlePollIntervalMs?: number;\n terminalIdlePolls?: number;\n /**\n * Assistant-ui may abort a run for UI lifecycle reasons, such as switching\n * selected sessions. Code sessions keep running unless the host sends an\n * explicit stop command.\n */\n stopOnAbort?: boolean;\n}\n\ntype AssistantUiAttachment = {\n name?: string;\n contentType?: string;\n content?: readonly Record<string, unknown>[];\n};\n\nexport function createCodeAgentChatAdapter(\n options: CreateCodeAgentChatAdapterOptions,\n): ChatModelAdapter {\n const pollIntervalMs = options.pollIntervalMs ?? 1000;\n const idlePollIntervalMs = options.idlePollIntervalMs ?? 5000;\n const terminalIdlePolls = options.terminalIdlePolls ?? 3;\n const stopOnAbort = options.stopOnAbort === true;\n\n return {\n async *run({ messages, abortSignal }: ChatModelRunOptions) {\n const runId = options.runIdRef.current;\n if (!runId) {\n yield errorResult(\"Select an Agent-Native Code session first.\");\n return;\n }\n\n const lastUserMessage = latestUserMessage(messages);\n const attachments = lastUserMessage\n ? extractPromptAttachmentsFromAssistantMessage(lastUserMessage)\n : [];\n const prompt =\n latestUserText(messages).trim() ||\n (attachments.length > 0 ? \"Use the attached context.\" : \"\");\n if (!prompt.trim()) {\n yield errorResult(\"Enter a follow-up prompt.\");\n return;\n }\n\n let stoppedFromAbort = false;\n const stopForAbort = () => {\n stoppedFromAbort = true;\n if (stopOnAbort) {\n void options.controller.control({ runId, command: \"stop\" });\n }\n };\n if (abortSignal.aborted) {\n stopForAbort();\n return;\n }\n abortSignal.addEventListener(\"abort\", stopForAbort, { once: true });\n\n try {\n const initialEvents = await options.controller.transcript(runId);\n const seenEventIds = new Set(initialEvents.map((event) => event.id));\n const tailedEvents: CodeAgentChatTranscriptEvent[] = [];\n\n if (!options.attachOnlyRef?.current) {\n const beforeSendRun = await options.controller.get(runId);\n const response = await options.controller.sendFollowUp({\n runId,\n prompt,\n mode:\n options.followUpModeRef?.current ??\n (beforeSendRun && isCodeAgentRunActive(beforeSendRun)\n ? \"queued\"\n : \"immediate\"),\n permissionMode: options.permissionModeRef?.current,\n engine: options.engineRef?.current,\n model: options.modelRef?.current,\n reasoningEffort: options.effortRef?.current,\n source: \"code-agent-chat\",\n metadata: attachments.length > 0 ? { attachments } : undefined,\n });\n if (!response.ok) {\n yield errorResult(\n response.error ?? response.message ?? \"Could not send follow-up.\",\n runId,\n );\n return;\n }\n }\n\n let yieldedContent = false;\n let idleTerminalPolls = 0;\n while (!abortSignal.aborted) {\n const [events, run] = await Promise.all([\n options.controller.transcript(runId),\n options.controller.get(runId),\n ]);\n const nextEvents = events\n .filter((event) => !seenEventIds.has(event.id))\n .sort(compareCodeAgentTranscriptEvents);\n for (const event of nextEvents) {\n seenEventIds.add(event.id);\n tailedEvents.push(event);\n }\n\n const content = codeAgentTranscriptEventsToContent(tailedEvents);\n const sawClear = nextEvents.some(isAgentChatClearTranscriptEvent);\n if ((content.length > 0 || sawClear) && nextEvents.length > 0) {\n yieldedContent = true;\n yield withRunMetadata({ content: [...content] }, runId);\n }\n\n if (run && isCodeAgentRunActive(run)) {\n idleTerminalPolls = 0;\n } else if (nextEvents.length === 0) {\n idleTerminalPolls += 1;\n } else {\n idleTerminalPolls = 0;\n }\n\n if (idleTerminalPolls >= terminalIdlePolls) {\n if (content.length > 0 && !yieldedContent) {\n yield withRunMetadata({ content: [...content] }, runId);\n }\n return;\n }\n\n await sleep(\n run && isCodeAgentRunActive(run)\n ? pollIntervalMs\n : idlePollIntervalMs,\n abortSignal,\n );\n }\n } finally {\n abortSignal.removeEventListener(\"abort\", stopForAbort);\n if (stoppedFromAbort) {\n return;\n }\n }\n },\n };\n}\n\nexport function codeAgentTranscriptEventsToContent(\n events: readonly CodeAgentChatTranscriptEvent[],\n): ContentPart[] {\n const normalized = normalizeCodeAgentTranscript(\n events.map(toCoreCodeAgentTranscriptEvent),\n );\n const content: ContentPart[] = [];\n\n const appendText = (text: string) => {\n const trimmed = text.trim();\n if (!trimmed) return;\n const last = content.at(-1);\n if (last?.type === \"text\") {\n last.text = `${last.text}${last.text ? \"\\n\\n\" : \"\"}${trimmed}`;\n } else {\n content.push({ type: \"text\", text: trimmed });\n }\n };\n\n for (const item of normalized.items) {\n const part = contentPartForCodeAgentTranscriptItem(item);\n if (!part) continue;\n if (part.type === \"text\") {\n appendText(part.text);\n } else {\n content.push(part);\n }\n }\n\n return content;\n}\n\nfunction isAgentChatClearTranscriptEvent(\n event: CodeAgentChatTranscriptEvent | undefined,\n): boolean {\n return event?.metadata?.agentChatEventType === \"clear\";\n}\n\nfunction latestUserMessage(\n messages: ChatModelRunOptions[\"messages\"],\n): ChatModelRunOptions[\"messages\"][number] | undefined {\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (message.role === \"user\") return message;\n }\n return undefined;\n}\n\nfunction latestUserText(messages: ChatModelRunOptions[\"messages\"]): string {\n const message = latestUserMessage(messages);\n return (\n message?.content\n .filter(\n (part): part is { type: \"text\"; text: string } => part.type === \"text\",\n )\n .map((part) => part.text)\n .join(\"\\n\") ?? \"\"\n );\n}\n\nfunction extractPromptAttachmentsFromAssistantMessage(message: {\n attachments?: readonly AssistantUiAttachment[];\n}): AgentPromptAttachment[] {\n const attachments: AgentPromptAttachment[] = [];\n for (const att of message.attachments ?? []) {\n const name = att.name ?? \"attachment\";\n for (const part of att.content ?? []) {\n if (part.type === \"image\" && typeof part.image === \"string\") {\n attachments.push({\n name,\n type: att.contentType,\n dataUrl: part.image,\n });\n } else if (part.type === \"file\" && typeof part.data === \"string\") {\n attachments.push({\n name,\n type:\n att.contentType ??\n (typeof part.mimeType === \"string\" ? part.mimeType : undefined),\n ...(part.data.startsWith(\"data:\")\n ? { dataUrl: part.data }\n : { text: part.data }),\n });\n } else if (part.type === \"text\" && typeof part.text === \"string\") {\n attachments.push({\n name,\n type: att.contentType,\n text: unwrapAttachmentEnvelope(part.text),\n });\n }\n }\n }\n return attachments;\n}\n\nfunction toCoreCodeAgentTranscriptEvent(\n event: CodeAgentChatTranscriptEvent,\n): CoreCodeAgentTranscriptEvent {\n return {\n schemaVersion: 1,\n id: event.id,\n runId: event.runId,\n kind: (event.kind ??\n event.type ??\n \"status\") as CoreCodeAgentTranscriptEvent[\"kind\"],\n message: event.message ?? event.text ?? \"\",\n createdAt: event.createdAt,\n metadata: {\n ...(event.metadata ?? {}),\n ...(event.artifactPath ? { artifactPath: event.artifactPath } : {}),\n ...(event.artifactUrl ? { artifactUrl: event.artifactUrl } : {}),\n },\n };\n}\n\nfunction contentPartForCodeAgentTranscriptItem(\n item: NormalizedCodeAgentTranscriptItem,\n): ContentPart | null {\n if (item.type === \"assistant\") {\n return item.text.trim() ? { type: \"text\", text: item.text.trim() } : null;\n }\n if (item.type === \"tool\") {\n return toolContentPartForCodeAgentTranscriptItem(item);\n }\n if (item.type === \"thinking\") {\n return thinkingContentPartForCodeAgentTranscriptItem(item);\n }\n if (item.type === \"status\") {\n const text = statusTextForCodeAgentTranscriptItem(item);\n return text ? { type: \"text\", text } : null;\n }\n return null;\n}\n\nfunction thinkingContentPartForCodeAgentTranscriptItem(\n item: NormalizedCodeAgentThinkingEvent,\n): ContentPart | null {\n const text = item.text.trim();\n if (!text) return null;\n return {\n type: \"reasoning\",\n text,\n };\n}\n\nfunction toolContentPartForCodeAgentTranscriptItem(\n item: NormalizedCodeAgentToolEvent,\n): ContentPart {\n return {\n type: \"tool-call\",\n toolCallId: `code-tool-${item.id}`,\n toolName: item.tool ?? item.label ?? \"code-agent\",\n argsText: previewValue(item.input) ?? \"\",\n args: recordArgs(item.input),\n ...(item.result !== undefined\n ? { result: previewValue(item.result) ?? \"\" }\n : {}),\n ...(item.mcpApp ? { mcpApp: item.mcpApp } : {}),\n ...(item.structuredMeta ? { structuredMeta: item.structuredMeta } : {}),\n };\n}\n\nfunction statusTextForCodeAgentTranscriptItem(\n item: NormalizedCodeAgentStatusEvent,\n): string | null {\n if (item.statusKind === \"artifact\") {\n const event = item.events[0];\n const path =\n stringMetadata(event?.metadata, \"artifactPath\") ??\n stringMetadata(event?.metadata, \"path\");\n const url = stringMetadata(event?.metadata, \"artifactUrl\");\n const target = url ?? path;\n return target\n ? `Artifact: ${item.text}\\n${target}`\n : `Artifact: ${item.text}`;\n }\n if (item.level === \"info\" && item.statusKind !== \"note\") return null;\n return item.text;\n}\n\nfunction recordArgs(value: unknown): Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n const result: Record<string, string> = {};\n for (const [key, entry] of Object.entries(value)) {\n result[key] =\n typeof entry === \"string\" ? entry : (previewValue(entry) ?? \"\");\n }\n return result;\n}\n\nfunction previewValue(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined;\n const text =\n typeof value === \"string\" ? value : (JSON.stringify(value, null, 2) ?? \"\");\n const trimmed = text.trim();\n if (!trimmed) return undefined;\n return trimmed.length > 4000 ? `${trimmed.slice(0, 4000)}\\n...` : trimmed;\n}\n\nfunction stringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n): string | undefined {\n const value = metadata?.[key];\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction withRunMetadata(\n result: ChatModelRunResult,\n runId: string,\n): ChatModelRunResult {\n const metadata = (result.metadata ?? {}) as Record<string, unknown>;\n const custom =\n metadata.custom && typeof metadata.custom === \"object\"\n ? (metadata.custom as Record<string, unknown>)\n : {};\n return {\n ...result,\n metadata: {\n ...metadata,\n custom: { ...custom, runId },\n },\n };\n}\n\nfunction errorResult(message: string, runId?: string): ChatModelRunResult {\n return withRunMetadata(\n {\n content: [{ type: \"text\", text: message }],\n status: { type: \"incomplete\", reason: \"error\" },\n } as ChatModelRunResult,\n runId ?? \"code-agent\",\n );\n}\n\nfunction sleep(ms: number, abortSignal: AbortSignal): Promise<void> {\n if (abortSignal.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const timeout = setTimeout(resolve, ms);\n abortSignal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timeout);\n resolve();\n },\n { once: true },\n );\n });\n}\n"]}
@@ -104,6 +104,12 @@ function describeSlot(slotId, t) {
104
104
  description: t("extensions.contactSidebarDescription"),
105
105
  };
106
106
  }
107
+ if (slotId === "calendar.event-detail.bottom") {
108
+ return {
109
+ title: t("extensions.eventDetailWidget"),
110
+ description: t("extensions.eventDetailDescription"),
111
+ };
112
+ }
107
113
  return {
108
114
  title: t("extensions.addWidgetHere"),
109
115
  description: slotId,
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionSlot.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionSlot.tsx"],"names":[],"mappings":"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","sourcesContent":["import { IconPlus } from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useState } from \"react\";\n\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport { EmbeddedExtension } from \"./EmbeddedExtension.js\";\n\ninterface SlotInstall {\n installId: string;\n extensionId: string;\n name: string;\n description: string;\n icon: string | null;\n updatedAt: string;\n position: number;\n config: string | null;\n}\n\ninterface AvailableTool {\n extensionId: string;\n name: string;\n description: string;\n icon: string | null;\n config: string | null;\n}\n\nexport interface ExtensionSlotProps {\n /** Stable slot identifier — convention: `<app>.<area>.<position>`. */\n id: string;\n /** Object pushed to each embedded extension as `slotContext`. */\n context?: Record<string, unknown> | null;\n /** Show a small \"+\" affordance when the slot has no installs. Default: false. */\n showEmptyAffordance?: boolean;\n /** Optional className applied to the wrapper. */\n className?: string;\n /** Optional className applied to each EmbeddedExtension. */\n toolClassName?: string;\n}\n\n/**\n * A named UI slot that user-installed extensions can render into. Apps drop this\n * component wherever they want to allow extensions; the framework handles\n * fetching, sandboxing, context delivery, and lifecycle.\n *\n * Example:\n *\n * <ExtensionSlot\n * id=\"mail.contact-sidebar.bottom\"\n * context={{ contactEmail }}\n * showEmptyAffordance\n * />\n */\nexport function ExtensionSlot({\n id,\n context,\n showEmptyAffordance,\n className,\n toolClassName,\n}: ExtensionSlotProps) {\n const { data: installs = [], isLoading } = useQuery<SlotInstall[]>({\n queryKey: [\"slot-installs\", id],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(id)}/installs`,\n ),\n );\n if (!res.ok) return [];\n return res.json();\n },\n });\n\n if (isLoading) {\n return null;\n }\n\n if (installs.length === 0) {\n if (!showEmptyAffordance) return null;\n return (\n <div className={className}>\n <SlotEmptyAffordance slotId={id} />\n </div>\n );\n }\n\n return (\n <div className={className}>\n {installs.map((install) => (\n <EmbeddedExtension\n key={install.installId}\n extensionId={install.extensionId}\n slotId={id}\n context={context}\n className={toolClassName}\n />\n ))}\n </div>\n );\n}\n\nfunction SlotEmptyAffordance({ slotId }: { slotId: string }) {\n const t = useT();\n const [open, setOpen] = useState(false);\n const { data: available = [], isLoading } = useQuery<AvailableTool[]>({\n queryKey: [\"slot-available\", slotId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/available`,\n ),\n );\n if (!res.ok) return [];\n return res.json();\n },\n enabled: open,\n });\n const queryClient = useQueryClient();\n\n const install = async (extensionId: string) => {\n queryClient.setQueryData<SlotInstall[]>(\n [\"slot-installs\", slotId],\n (old) => {\n const extension = available.find((t) => t.extensionId === extensionId);\n if (!extension || !old) return old;\n return [\n ...old,\n {\n installId: `optimistic-${extensionId}`,\n extensionId,\n name: extension.name,\n description: extension.description,\n icon: extension.icon,\n updatedAt: new Date().toISOString(),\n position: old.length,\n config: extension.config,\n },\n ];\n },\n );\n setOpen(false);\n try {\n await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/install`,\n ),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ extensionId }),\n },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\", slotId] });\n }\n };\n\n const requestNew = () => {\n setOpen(false);\n sendToAgentChat({\n message: t(\"extensions.createWidgetPrompt\", { slotId }),\n submit: false,\n openSidebar: true,\n });\n };\n const slotDescription = describeSlot(slotId, t);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-4 py-2 text-[11px] text-muted-foreground/60 hover:text-muted-foreground cursor-pointer\"\n >\n <div className=\"h-5 w-5 rounded-md border border-dashed border-border/40 flex items-center justify-center shrink-0\">\n <IconPlus className=\"h-3 w-3\" />\n </div>\n <span>{t(\"extensions.addWidget\")}</span>\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>{t(\"extensions.addWidget\")}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <PopoverContent\n side=\"left\"\n align=\"end\"\n sideOffset={8}\n className=\"w-72 p-0 overflow-hidden\"\n >\n <div className=\"px-3 py-2 border-b border-border/40\">\n <p className=\"text-[12px] font-medium\">{slotDescription.title}</p>\n <p className=\"text-[11px] text-muted-foreground/70\">\n {slotDescription.description}\n </p>\n </div>\n <div className=\"max-h-72 overflow-y-auto py-1\">\n {isLoading && (\n <div className=\"px-3 py-3 text-[12px] text-muted-foreground/60\">\n {t(\"extensions.loading\")}\n </div>\n )}\n {!isLoading && available.length === 0 && (\n <div className=\"px-3 py-3 text-[12px] text-muted-foreground/60\">\n {t(\"extensions.noWidgetsAvailable\")}\n </div>\n )}\n {available.map((extension) => (\n <button\n key={extension.extensionId}\n type=\"button\"\n onClick={() => install(extension.extensionId)}\n className=\"flex w-full items-start gap-2 px-3 py-2 text-left hover:bg-accent cursor-pointer\"\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[12px] font-medium truncate\">\n {extension.name}\n </p>\n {extension.description && (\n <p className=\"text-[11px] text-muted-foreground/70 truncate\">\n {extension.description}\n </p>\n )}\n </div>\n </button>\n ))}\n </div>\n <div className=\"border-t border-border/40 p-1\">\n <button\n type=\"button\"\n onClick={requestNew}\n className=\"flex w-full items-center gap-2 rounded-md px-3 py-2 text-[12px] text-muted-foreground hover:bg-accent hover:text-foreground cursor-pointer\"\n >\n <IconPlus className=\"h-3.5 w-3.5\" />\n <span>{t(\"extensions.buildNewWidget\")}</span>\n </button>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction describeSlot(\n slotId: string,\n t: ReturnType<typeof useT>,\n): { title: string; description: string } {\n if (slotId === \"mail.contact-sidebar.bottom\") {\n return {\n title: t(\"extensions.contactSidebarWidget\"),\n description: t(\"extensions.contactSidebarDescription\"),\n };\n }\n\n return {\n title: t(\"extensions.addWidgetHere\"),\n description: slotId,\n };\n}\n"]}
1
+ {"version":3,"file":"ExtensionSlot.js","sourceRoot":"","sources":["../../../src/client/extensions/ExtensionSlot.tsx"],"names":[],"mappings":"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","sourcesContent":["import { IconPlus } from \"@tabler/icons-react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useState } from \"react\";\n\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { useT } from \"../i18n.js\";\nimport { EmbeddedExtension } from \"./EmbeddedExtension.js\";\n\ninterface SlotInstall {\n installId: string;\n extensionId: string;\n name: string;\n description: string;\n icon: string | null;\n updatedAt: string;\n position: number;\n config: string | null;\n}\n\ninterface AvailableTool {\n extensionId: string;\n name: string;\n description: string;\n icon: string | null;\n config: string | null;\n}\n\nexport interface ExtensionSlotProps {\n /** Stable slot identifier — convention: `<app>.<area>.<position>`. */\n id: string;\n /** Object pushed to each embedded extension as `slotContext`. */\n context?: Record<string, unknown> | null;\n /** Show a small \"+\" affordance when the slot has no installs. Default: false. */\n showEmptyAffordance?: boolean;\n /** Optional className applied to the wrapper. */\n className?: string;\n /** Optional className applied to each EmbeddedExtension. */\n toolClassName?: string;\n}\n\n/**\n * A named UI slot that user-installed extensions can render into. Apps drop this\n * component wherever they want to allow extensions; the framework handles\n * fetching, sandboxing, context delivery, and lifecycle.\n *\n * Example:\n *\n * <ExtensionSlot\n * id=\"mail.contact-sidebar.bottom\"\n * context={{ contactEmail }}\n * showEmptyAffordance\n * />\n */\nexport function ExtensionSlot({\n id,\n context,\n showEmptyAffordance,\n className,\n toolClassName,\n}: ExtensionSlotProps) {\n const { data: installs = [], isLoading } = useQuery<SlotInstall[]>({\n queryKey: [\"slot-installs\", id],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(id)}/installs`,\n ),\n );\n if (!res.ok) return [];\n return res.json();\n },\n });\n\n if (isLoading) {\n return null;\n }\n\n if (installs.length === 0) {\n if (!showEmptyAffordance) return null;\n return (\n <div className={className}>\n <SlotEmptyAffordance slotId={id} />\n </div>\n );\n }\n\n return (\n <div className={className}>\n {installs.map((install) => (\n <EmbeddedExtension\n key={install.installId}\n extensionId={install.extensionId}\n slotId={id}\n context={context}\n className={toolClassName}\n />\n ))}\n </div>\n );\n}\n\nfunction SlotEmptyAffordance({ slotId }: { slotId: string }) {\n const t = useT();\n const [open, setOpen] = useState(false);\n const { data: available = [], isLoading } = useQuery<AvailableTool[]>({\n queryKey: [\"slot-available\", slotId],\n queryFn: async () => {\n const res = await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/available`,\n ),\n );\n if (!res.ok) return [];\n return res.json();\n },\n enabled: open,\n });\n const queryClient = useQueryClient();\n\n const install = async (extensionId: string) => {\n queryClient.setQueryData<SlotInstall[]>(\n [\"slot-installs\", slotId],\n (old) => {\n const extension = available.find((t) => t.extensionId === extensionId);\n if (!extension || !old) return old;\n return [\n ...old,\n {\n installId: `optimistic-${extensionId}`,\n extensionId,\n name: extension.name,\n description: extension.description,\n icon: extension.icon,\n updatedAt: new Date().toISOString(),\n position: old.length,\n config: extension.config,\n },\n ];\n },\n );\n setOpen(false);\n try {\n await fetch(\n agentNativePath(\n `/_agent-native/slots/${encodeURIComponent(slotId)}/install`,\n ),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ extensionId }),\n },\n );\n } finally {\n queryClient.invalidateQueries({ queryKey: [\"slot-installs\", slotId] });\n }\n };\n\n const requestNew = () => {\n setOpen(false);\n sendToAgentChat({\n message: t(\"extensions.createWidgetPrompt\", { slotId }),\n submit: false,\n openSidebar: true,\n });\n };\n const slotDescription = describeSlot(slotId, t);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <TooltipProvider delayDuration={200}>\n <Tooltip>\n <TooltipTrigger asChild>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-4 py-2 text-[11px] text-muted-foreground/60 hover:text-muted-foreground cursor-pointer\"\n >\n <div className=\"h-5 w-5 rounded-md border border-dashed border-border/40 flex items-center justify-center shrink-0\">\n <IconPlus className=\"h-3 w-3\" />\n </div>\n <span>{t(\"extensions.addWidget\")}</span>\n </button>\n </PopoverTrigger>\n </TooltipTrigger>\n <TooltipContent>{t(\"extensions.addWidget\")}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <PopoverContent\n side=\"left\"\n align=\"end\"\n sideOffset={8}\n className=\"w-72 p-0 overflow-hidden\"\n >\n <div className=\"px-3 py-2 border-b border-border/40\">\n <p className=\"text-[12px] font-medium\">{slotDescription.title}</p>\n <p className=\"text-[11px] text-muted-foreground/70\">\n {slotDescription.description}\n </p>\n </div>\n <div className=\"max-h-72 overflow-y-auto py-1\">\n {isLoading && (\n <div className=\"px-3 py-3 text-[12px] text-muted-foreground/60\">\n {t(\"extensions.loading\")}\n </div>\n )}\n {!isLoading && available.length === 0 && (\n <div className=\"px-3 py-3 text-[12px] text-muted-foreground/60\">\n {t(\"extensions.noWidgetsAvailable\")}\n </div>\n )}\n {available.map((extension) => (\n <button\n key={extension.extensionId}\n type=\"button\"\n onClick={() => install(extension.extensionId)}\n className=\"flex w-full items-start gap-2 px-3 py-2 text-left hover:bg-accent cursor-pointer\"\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[12px] font-medium truncate\">\n {extension.name}\n </p>\n {extension.description && (\n <p className=\"text-[11px] text-muted-foreground/70 truncate\">\n {extension.description}\n </p>\n )}\n </div>\n </button>\n ))}\n </div>\n <div className=\"border-t border-border/40 p-1\">\n <button\n type=\"button\"\n onClick={requestNew}\n className=\"flex w-full items-center gap-2 rounded-md px-3 py-2 text-[12px] text-muted-foreground hover:bg-accent hover:text-foreground cursor-pointer\"\n >\n <IconPlus className=\"h-3.5 w-3.5\" />\n <span>{t(\"extensions.buildNewWidget\")}</span>\n </button>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction describeSlot(\n slotId: string,\n t: ReturnType<typeof useT>,\n): { title: string; description: string } {\n if (slotId === \"mail.contact-sidebar.bottom\") {\n return {\n title: t(\"extensions.contactSidebarWidget\"),\n description: t(\"extensions.contactSidebarDescription\"),\n };\n }\n\n if (slotId === \"calendar.event-detail.bottom\") {\n return {\n title: t(\"extensions.eventDetailWidget\"),\n description: t(\"extensions.eventDetailDescription\"),\n };\n }\n\n return {\n title: t(\"extensions.addWidgetHere\"),\n description: slotId,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/client/settings/SettingsPanel.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAQN,MAAM,OAAO,CAAC;AAqBf,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAi3D/B,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAu4BD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,qBAEtD;AAED,wBAAgB,oBAAoB,IAAI,eAAe,EAAE,CA+DxD"}
1
+ {"version":3,"file":"SettingsPanel.d.ts","sourceRoot":"","sources":["../../../src/client/settings/SettingsPanel.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAQN,MAAM,OAAO,CAAC;AA0Bf,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAg/D/B,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAg5BD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,qBAEtD;AAED,wBAAgB,oBAAoB,IAAI,eAAe,EAAE,CAkExD"}
@@ -16,7 +16,7 @@ import { AgentsSection } from "./AgentsSection.js";
16
16
  import { AutomationsSection } from "./AutomationsSection.js";
17
17
  import { DemoModeSection } from "./DemoModeSection.js";
18
18
  import { SecretsSection } from "./SecretsSection.js";
19
- import { SettingsSection } from "./SettingsSection.js";
19
+ import { SettingsSection, SettingsSurfaceProvider, useSettingsSurface, } from "./SettingsSection.js";
20
20
  import { UsageSection } from "./UsageSection.js";
21
21
  import { useBuilderConnectFlow, useBuilderStatus, } from "./useBuilderStatus.js";
22
22
  import { VoiceTranscriptionSection } from "./VoiceTranscriptionSection.js";
@@ -31,9 +31,34 @@ const CONTROL_STYLE = {
31
31
  fontSize: 12,
32
32
  lineHeight: 1,
33
33
  };
34
+ const CONTROL_STYLE_PAGE = {
35
+ fontSize: 14,
36
+ lineHeight: 1.2,
37
+ };
38
+ // Surface-aware class helpers so section bodies (shared with the compact
39
+ // sidebar) read as roomy, shadcn-style forms on the full settings page while
40
+ // staying dense in the sidebar.
41
+ function fieldLabelClass(isPage) {
42
+ return cn("font-medium text-foreground", isPage ? "text-sm" : "text-[12px]");
43
+ }
44
+ function textInputClass(isPage) {
45
+ return cn("flex w-full rounded-md border border-border bg-background text-foreground outline-none transition-colors hover:bg-accent/40 focus:ring-1 focus:ring-accent placeholder:text-muted-foreground/50", isPage ? "h-10 px-3 text-sm" : "h-9 px-3 text-[12px]");
46
+ }
47
+ function pillButtonClass(isPage, tone = "outline") {
48
+ const base = cn("inline-flex items-center justify-center gap-1 rounded-md font-medium transition-colors disabled:opacity-40", isPage ? "px-3 py-1.5 text-sm" : "px-2.5 py-1 text-[10px]");
49
+ if (tone === "solid") {
50
+ return cn(base, "bg-accent text-foreground hover:bg-accent/80");
51
+ }
52
+ if (tone === "ghost") {
53
+ return cn(base, "text-muted-foreground hover:bg-accent/40 hover:text-foreground");
54
+ }
55
+ return cn(base, "border border-border text-foreground hover:bg-accent/40");
56
+ }
34
57
  function SettingsSelect({ label, labelAdornment, value, options, onValueChange, }) {
58
+ const isPage = useSettingsSurface() === "page";
59
+ const controlStyle = isPage ? CONTROL_STYLE_PAGE : CONTROL_STYLE;
35
60
  const selected = options.find((option) => option.value === value);
36
- return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("p", { className: "text-[12px] font-medium text-foreground", children: label }), labelAdornment] }), _jsxs(SelectPrimitive.Root, { value: value, onValueChange: onValueChange, children: [_jsxs(SelectPrimitive.Trigger, { className: "flex h-9 w-full items-center justify-between rounded-md border border-border bg-background px-3 text-start text-[12px] text-foreground outline-none transition-colors hover:bg-accent/40 data-[placeholder]:text-muted-foreground", "aria-label": label, style: CONTROL_STYLE, children: [_jsx(SelectPrimitive.Value, { children: selected?.label ?? value }), _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(IconChevronDown, { size: 14, className: "text-muted-foreground" }) })] }), _jsx(SelectPrimitive.Portal, { children: _jsx(SelectPrimitive.Content, { position: "popper", sideOffset: 6, className: "z-[9999] w-[var(--radix-select-trigger-width)] overflow-hidden rounded-lg border border-border bg-popover shadow-lg", children: _jsx(SelectPrimitive.Viewport, { className: "p-1", children: options.map((option) => (_jsxs(SelectPrimitive.Item, { value: option.value, className: "relative flex w-full cursor-pointer select-none items-start gap-2 rounded-md px-8 py-2.5 text-[12px] outline-none data-[highlighted]:bg-accent/60 data-[state=checked]:bg-accent/40", style: CONTROL_STYLE, children: [_jsx("span", { className: "absolute start-2 top-2.5 flex h-4 w-4 items-center justify-center text-muted-foreground", children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(IconCheck, { size: 14 }) }) }), _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx(SelectPrimitive.ItemText, { children: _jsx("span", { className: "text-foreground", children: option.label }) }), option.description ? (_jsx("span", { className: "mt-0.5 text-[11px] leading-relaxed text-muted-foreground", children: option.description })) : null] })] }, option.value))) }) }) })] })] }));
61
+ return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("p", { className: fieldLabelClass(isPage), children: label }), labelAdornment] }), _jsxs(SelectPrimitive.Root, { value: value, onValueChange: onValueChange, children: [_jsxs(SelectPrimitive.Trigger, { className: cn("flex w-full items-center justify-between rounded-md border border-border bg-background px-3 text-start text-foreground outline-none transition-colors hover:bg-accent/40 data-[placeholder]:text-muted-foreground", isPage ? "h-10 text-sm" : "h-9 text-[12px]"), "aria-label": label, style: controlStyle, children: [_jsx(SelectPrimitive.Value, { children: selected?.label ?? value }), _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(IconChevronDown, { size: 16, className: "text-muted-foreground" }) })] }), _jsx(SelectPrimitive.Portal, { children: _jsx(SelectPrimitive.Content, { position: "popper", sideOffset: 6, className: "z-[9999] w-[var(--radix-select-trigger-width)] overflow-hidden rounded-lg border border-border bg-popover shadow-lg", children: _jsx(SelectPrimitive.Viewport, { className: "p-1", children: options.map((option) => (_jsxs(SelectPrimitive.Item, { value: option.value, className: cn("relative flex w-full cursor-pointer select-none items-start gap-2 rounded-md px-8 outline-none data-[highlighted]:bg-accent/60 data-[state=checked]:bg-accent/40", isPage ? "py-2.5 text-sm" : "py-2.5 text-[12px]"), style: controlStyle, children: [_jsx("span", { className: "absolute start-2 top-2.5 flex h-4 w-4 items-center justify-center text-muted-foreground", children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(IconCheck, { size: 14 }) }) }), _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx(SelectPrimitive.ItemText, { children: _jsx("span", { className: "text-foreground", children: option.label }) }), option.description ? (_jsx("span", { className: cn("mt-0.5 leading-relaxed text-muted-foreground", isPage ? "text-xs" : "text-[11px]"), children: option.description })) : null] })] }, option.value))) }) }) })] })] }));
37
62
  }
38
63
  // ─── Disconnect button for the Builder card's connected state ───────────────
39
64
  //
@@ -135,25 +160,31 @@ function DisconnectBuilderButton() {
135
160
  }
136
161
  // ─── "Connect Builder.io" card (shared across all sections) ─────────────────
137
162
  function UseBuilderCard({ builderFlow, connectUrl, connected, orgName, envManaged, credentialSource, trackingSource = "settings_panel_builder_card", trackingFlow = "connect_llm", label = "Connect Builder.io", subtitle = "Free credits to start — no API key needed.", dim, }) {
163
+ const isPage = useSettingsSurface() === "page";
138
164
  const effectiveConnected = connected || builderFlow.configured;
139
165
  const effectiveOrgName = builderFlow.orgName ?? orgName;
140
166
  const bgClass = dim ? "" : "bg-accent/30";
167
+ const titleCls = isPage ? "text-sm" : "text-[11px]";
168
+ const bodyCls = isPage ? "text-xs" : "text-[10px]";
141
169
  if (effectiveConnected) {
142
- return (_jsxs("div", { className: `rounded-md border border-border px-2.5 py-2 ${bgClass}`, children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-[11px] font-medium text-foreground", children: "Builder.io" }), _jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Connected"] })] }), effectiveOrgName && (_jsx("p", { className: "text-[10px] text-muted-foreground mt-0.5", children: effectiveOrgName })), envManaged ? (_jsx("p", { className: "text-[10px] text-muted-foreground mt-1", children: credentialSource === "env"
170
+ return (_jsxs("div", { className: cn("rounded-md border border-border", isPage ? "px-3.5 py-3" : "px-2.5 py-2", bgClass), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: cn("font-medium text-foreground", titleCls), children: "Builder.io" }), _jsxs("span", { className: cn("flex items-center gap-1 text-green-500", bodyCls), children: [_jsx(IconCheck, { size: isPage ? 14 : 10 }), "Connected"] })] }), effectiveOrgName && (_jsx("p", { className: cn("text-muted-foreground mt-0.5", bodyCls), children: effectiveOrgName })), envManaged ? (_jsx("p", { className: cn("text-muted-foreground mt-1", bodyCls), children: credentialSource === "env"
143
171
  ? "Deployment fallback is available. Connect your own account to override it."
144
- : "Using your connected Builder account. Deployment fallback is still available." })) : null, connectUrl || credentialSource !== "env" ? (_jsxs("div", { className: "flex items-center gap-2 mt-2.5", children: [connectUrl && (_jsxs("button", { type: "button", onClick: () => builderFlow.start({ trackingSource, trackingFlow }), disabled: builderFlow.connecting, className: "inline-flex items-center gap-1 rounded border border-border px-2 py-0.5 text-[10px] no-underline text-muted-foreground hover:text-foreground hover:bg-accent/40 disabled:opacity-60", children: [builderFlow.connecting
172
+ : "Using your connected Builder account. Deployment fallback is still available." })) : null, connectUrl || credentialSource !== "env" ? (_jsxs("div", { className: "flex items-center gap-2 mt-2.5", children: [connectUrl && (_jsxs("button", { type: "button", onClick: () => builderFlow.start({ trackingSource, trackingFlow }), disabled: builderFlow.connecting, className: cn(pillButtonClass(isPage, "ghost"), "no-underline"), children: [builderFlow.connecting
145
173
  ? "Connecting..."
146
174
  : credentialSource === "env"
147
175
  ? "Connect account"
148
- : "Reconnect", _jsx(IconExternalLink, { size: 10 })] })), credentialSource !== "env" ? _jsx(DisconnectBuilderButton, {}) : null] })) : null] }));
176
+ : "Reconnect", _jsx(IconExternalLink, { size: isPage ? 14 : 10 })] })), credentialSource !== "env" ? _jsx(DisconnectBuilderButton, {}) : null] })) : null] }));
149
177
  }
150
178
  if (!connectUrl)
151
179
  return null;
152
- return (_jsx("button", { type: "button", onClick: () => builderFlow.start({ trackingSource, trackingFlow }), disabled: builderFlow.connecting, className: `block w-full rounded-md border border-border px-3 py-3 text-start no-underline bg-gradient-to-br from-teal-500/10 via-transparent to-transparent hover:border-foreground/30 transition-colors disabled:cursor-wait disabled:opacity-70`, children: _jsxs("div", { className: "flex items-start gap-2.5", children: [_jsx("div", { className: "flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-foreground text-background", children: _jsx(BuilderBMark, { className: "h-3.5 w-3.5" }) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-1.5 flex-wrap", children: [_jsx("span", { className: "text-[12px] font-semibold text-foreground", children: builderFlow.connecting ? "Connecting Builder.io..." : label }), builderFlow.connecting && (_jsx(IconLoader2, { size: 12, className: "shrink-0 animate-spin text-muted-foreground" }))] }), _jsx("p", { className: "text-[10.5px] text-muted-foreground mt-0.5 leading-snug", children: subtitle }), builderFlow.error && (_jsx("p", { className: "mt-1 text-[10px] text-destructive", children: builderFlow.error }))] }), _jsx(IconExternalLink, { size: 12, className: "shrink-0 text-muted-foreground mt-0.5" })] }) }));
180
+ return (_jsx("button", { type: "button", onClick: () => builderFlow.start({ trackingSource, trackingFlow }), disabled: builderFlow.connecting, className: cn("block w-full rounded-md border border-border text-start no-underline bg-gradient-to-br from-teal-500/10 via-transparent to-transparent hover:border-foreground/30 transition-colors disabled:cursor-wait disabled:opacity-70", isPage ? "px-4 py-3.5" : "px-3 py-3"), children: _jsxs("div", { className: "flex items-start gap-2.5", children: [_jsx("div", { className: cn("flex shrink-0 items-center justify-center rounded-md bg-foreground text-background", isPage ? "h-8 w-8" : "h-7 w-7"), children: _jsx(BuilderBMark, { className: isPage ? "h-4 w-4" : "h-3.5 w-3.5" }) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-1.5 flex-wrap", children: [_jsx("span", { className: cn("font-semibold text-foreground", isPage ? "text-sm" : "text-[12px]"), children: builderFlow.connecting ? "Connecting Builder.io..." : label }), builderFlow.connecting && (_jsx(IconLoader2, { size: isPage ? 14 : 12, className: "shrink-0 animate-spin text-muted-foreground" }))] }), _jsx("p", { className: cn("text-muted-foreground mt-0.5 leading-snug", isPage ? "text-xs" : "text-[10.5px]"), children: subtitle }), builderFlow.error && (_jsx("p", { className: cn("mt-1 text-destructive", bodyCls), children: builderFlow.error }))] }), _jsx(IconExternalLink, { size: isPage ? 14 : 12, className: "shrink-0 text-muted-foreground mt-0.5" })] }) }));
153
181
  }
154
182
  // ─── Manual setup card ──────────────────────────────────────────────────────
155
183
  function ManualSetupCard({ hint, docsUrl, docsLabel = "Read the docs", children, dim, sourceBadge, }) {
156
- return (_jsxs("div", { className: `rounded-md border border-border px-2.5 py-2 ${dim ? "" : "bg-accent/30"}`, children: [_jsxs("div", { className: "flex items-center justify-between mb-1", children: [_jsx("div", { className: "text-[11px] font-medium text-foreground", children: "Set up manually" }), sourceBadge ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), sourceBadge] })) : null] }), hint && (_jsx("p", { className: "text-[10px] text-muted-foreground mb-1.5", children: hint })), children, docsUrl && (_jsxs("a", { href: docsUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 mt-1.5 rounded border border-border px-2.5 py-1 text-[10px] font-medium no-underline text-muted-foreground hover:text-foreground hover:bg-accent/40", children: [docsLabel, _jsx(IconExternalLink, { size: 10 })] }))] }));
184
+ const isPage = useSettingsSurface() === "page";
185
+ const titleCls = isPage ? "text-sm" : "text-[11px]";
186
+ const bodyCls = isPage ? "text-xs" : "text-[10px]";
187
+ return (_jsxs("div", { className: cn("rounded-md border border-border", isPage ? "px-3.5 py-3" : "px-2.5 py-2", dim ? "" : "bg-accent/30"), children: [_jsxs("div", { className: "flex items-center justify-between mb-1", children: [_jsx("div", { className: cn("font-medium text-foreground", titleCls), children: "Set up manually" }), sourceBadge ? (_jsxs("span", { className: cn("flex items-center gap-1 text-green-500", bodyCls), children: [_jsx(IconCheck, { size: isPage ? 14 : 10 }), sourceBadge] })) : null] }), hint && (_jsx("p", { className: cn("text-muted-foreground mb-1.5", bodyCls), children: hint })), children, docsUrl && (_jsxs("a", { href: docsUrl, target: "_blank", rel: "noopener noreferrer", className: cn(pillButtonClass(isPage, "outline"), "mt-1.5 no-underline"), children: [docsLabel, _jsx(IconExternalLink, { size: isPage ? 14 : 10 })] }))] }));
157
188
  }
158
189
  // ─── LLM helpers ────────────────────────────────────────────────────────────
159
190
  function friendlyModelName(model) {
@@ -224,6 +255,7 @@ const PROVIDER_DOCS = {
224
255
  "ai-sdk:cohere": "https://dashboard.cohere.com/api-keys",
225
256
  };
226
257
  function LLMSectionInner({ builderFlow, builderLoading, connectUrl, connected, orgName, envManaged, credentialSource, open, onToggle, }) {
258
+ const isPage = useSettingsSurface() === "page";
227
259
  const [envKeys, setEnvKeys] = useState([]);
228
260
  const [apiKey, setApiKey] = useState("");
229
261
  const [saving, setSaving] = useState(false);
@@ -449,7 +481,7 @@ function LLMSectionInner({ builderFlow, builderLoading, connectUrl, connected, o
449
481
  setBaseUrl("");
450
482
  setClearBaseUrl(false);
451
483
  setAdvancedOpen(false);
452
- } }), _jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "text-[12px] font-medium text-foreground", children: "Model" }), _jsx("input", { type: "text", list: `model-suggestions-${selectedEngine}`, value: selectedModel, onChange: (e) => setSelectedModel(e.target.value), placeholder: selectedEngineInfo?.defaultModel ?? "e.g. model-id", spellCheck: false, autoComplete: "off", className: "flex h-9 w-full rounded-md border border-border bg-background px-3 text-[12px] text-foreground outline-none transition-colors hover:bg-accent/40 focus:ring-1 focus:ring-accent placeholder:text-muted-foreground/50", style: CONTROL_STYLE }), modelOptions.length > 0 && (_jsx("datalist", { id: `model-suggestions-${selectedEngine}`, children: modelOptions.map((opt) => (_jsx("option", { value: opt.value, label: opt.label }, opt.value))) }))] }), isOpenAiEngine && (_jsxs("div", { className: "border-t border-border/70 pt-2", children: [_jsxs("button", { type: "button", onClick: () => setAdvancedOpen((v) => !v), className: "flex w-full cursor-pointer items-center justify-between gap-2 rounded px-0.5 py-1 text-left hover:text-foreground", children: [_jsxs("span", { className: "inline-flex min-w-0 items-center gap-1.5 text-[11px] font-medium text-foreground", children: [advancedOpen ? (_jsx(IconChevronDown, { size: 12 })) : (_jsx(IconChevronRight, { size: 12, className: "rtl:-scale-x-100" })), "Advanced"] }), _jsx("span", { className: "truncate text-[10px] text-muted-foreground", children: "OpenAI-compatible endpoint" })] }), advancedOpen && (_jsxs("div", { className: "mt-1.5 space-y-1.5", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("p", { className: "text-[12px] font-medium text-foreground", children: "Endpoint URL" }), _jsx("span", { className: "text-[10px] text-muted-foreground", children: baseUrlConfigured ? "Configured" : "Optional" })] }), _jsx("input", { type: "url", value: baseUrl, onChange: (e) => {
484
+ } }), _jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: fieldLabelClass(isPage), children: "Model" }), _jsx("input", { type: "text", list: `model-suggestions-${selectedEngine}`, value: selectedModel, onChange: (e) => setSelectedModel(e.target.value), placeholder: selectedEngineInfo?.defaultModel ?? "e.g. model-id", spellCheck: false, autoComplete: "off", className: textInputClass(isPage), style: isPage ? CONTROL_STYLE_PAGE : CONTROL_STYLE }), modelOptions.length > 0 && (_jsx("datalist", { id: `model-suggestions-${selectedEngine}`, children: modelOptions.map((opt) => (_jsx("option", { value: opt.value, label: opt.label }, opt.value))) }))] }), isOpenAiEngine && (_jsxs("div", { className: "border-t border-border/70 pt-2", children: [_jsxs("button", { type: "button", onClick: () => setAdvancedOpen((v) => !v), className: "flex w-full cursor-pointer items-center justify-between gap-2 rounded px-0.5 py-1 text-left hover:text-foreground", children: [_jsxs("span", { className: "inline-flex min-w-0 items-center gap-1.5 text-[11px] font-medium text-foreground", children: [advancedOpen ? (_jsx(IconChevronDown, { size: 12 })) : (_jsx(IconChevronRight, { size: 12, className: "rtl:-scale-x-100" })), "Advanced"] }), _jsx("span", { className: "truncate text-[10px] text-muted-foreground", children: "OpenAI-compatible endpoint" })] }), advancedOpen && (_jsxs("div", { className: "mt-1.5 space-y-1.5", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("p", { className: "text-[12px] font-medium text-foreground", children: "Endpoint URL" }), _jsx("span", { className: "text-[10px] text-muted-foreground", children: baseUrlConfigured ? "Configured" : "Optional" })] }), _jsx("input", { type: "url", value: baseUrl, onChange: (e) => {
453
485
  setBaseUrl(e.target.value);
454
486
  if (e.target.value.trim())
455
487
  setClearBaseUrl(false);
@@ -462,10 +494,10 @@ function LLMSectionInner({ builderFlow, builderLoading, connectUrl, connected, o
462
494
  setClearBaseUrl(e.target.checked);
463
495
  if (e.target.checked)
464
496
  setBaseUrl("");
465
- }, className: "h-3 w-3 accent-current" }), "Clear saved endpoint override"] })), envVar && envConfigured && endpointChanged && (_jsx("button", { type: "button", onClick: handleSave, disabled: saving, className: "rounded bg-accent px-2.5 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: saving ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 10 })) : ("Save endpoint") }))] }))] })), envVar && envConfigured ? (_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), envVar, " configured"] })) : envVar ? (_jsxs("div", { className: "flex gap-1.5", children: [_jsx("input", { type: "password", value: apiKey, onChange: (e) => setApiKey(e.target.value), onKeyDown: (e) => {
497
+ }, className: "h-3 w-3 accent-current" }), "Clear saved endpoint override"] })), envVar && envConfigured && endpointChanged && (_jsx("button", { type: "button", onClick: handleSave, disabled: saving, className: "rounded bg-accent px-2.5 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: saving ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 10 })) : ("Save endpoint") }))] }))] })), envVar && envConfigured ? (_jsxs("div", { className: cn("flex items-center gap-1.5 text-green-500", isPage ? "text-xs" : "text-[10px]"), children: [_jsx(IconCheck, { size: isPage ? 14 : 10 }), envVar, " configured"] })) : envVar ? (_jsxs("div", { className: "flex gap-1.5", children: [_jsx("input", { type: "password", value: apiKey, onChange: (e) => setApiKey(e.target.value), onKeyDown: (e) => {
466
498
  if (e.key === "Enter")
467
499
  handleSave();
468
- }, placeholder: PROVIDER_ENV_PLACEHOLDERS[envVar] ?? "...", className: "flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent" }), _jsx("button", { onClick: handleSave, disabled: !providerSettingsChanged || saving, className: "rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: saving ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 10 })) : ("Save") })] })) : null, _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { onClick: handleTest, disabled: testing, className: "rounded border border-border px-2.5 py-1 text-[10px] font-medium text-foreground hover:bg-accent/40 disabled:opacity-40", children: testing ? (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx(IconLoader2, { size: 10, className: "animate-spin" }), "Testing\u2026"] })) : ("Test") }), engineChanged && (_jsx("button", { onClick: handleApply, className: "rounded bg-accent px-2.5 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80", children: "Apply" })), settingsStatus != null && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: handleDisconnect, className: "ms-auto rounded border border-border px-2.5 py-1 text-[10px] font-medium text-muted-foreground hover:bg-destructive/10 hover:text-destructive hover:border-destructive/40", children: "Disconnect" }) }), _jsx(TooltipContent, { children: "Clear the saved engine \u2014 the app will fall back to the default until you re-apply." })] }))] }), testResult && testResult.ok && (_jsxs("p", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Test passed \u2014 ", testResult.latencyMs, "ms"] })), testResult && testResult.ok === false && (_jsxs("p", { className: "text-[10px] text-destructive", children: ["Test failed: ", testResult.error] })), disconnectError && (_jsxs("p", { className: "text-[10px] text-destructive", children: ["Disconnect failed: ", disconnectError] })), applyNote && (_jsx("p", { className: "text-[10px] text-muted-foreground", children: "Changes take effect on next conversation" }))] }) }))] })) }));
500
+ }, placeholder: PROVIDER_ENV_PLACEHOLDERS[envVar] ?? "...", className: cn(textInputClass(isPage), "flex-1"), style: isPage ? CONTROL_STYLE_PAGE : undefined }), _jsx("button", { onClick: handleSave, disabled: !providerSettingsChanged || saving, className: pillButtonClass(isPage, "solid"), children: saving ? (_jsx(IconLoader2, { size: isPage ? 14 : 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: isPage ? 14 : 10 })) : ("Save") })] })) : null, _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { onClick: handleTest, disabled: testing, className: pillButtonClass(isPage, "outline"), children: testing ? (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx(IconLoader2, { size: isPage ? 14 : 10, className: "animate-spin" }), "Testing\u2026"] })) : ("Test") }), engineChanged && (_jsx("button", { onClick: handleApply, className: pillButtonClass(isPage, "solid"), children: "Apply" })), settingsStatus != null && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { onClick: handleDisconnect, className: cn(pillButtonClass(isPage, "outline"), "ms-auto text-muted-foreground hover:bg-destructive/10 hover:text-destructive hover:border-destructive/40"), children: "Disconnect" }) }), _jsx(TooltipContent, { children: "Clear the saved engine \u2014 the app will fall back to the default until you re-apply." })] }))] }), testResult && testResult.ok && (_jsxs("p", { className: cn("flex items-center gap-1 text-green-500", isPage ? "text-xs" : "text-[10px]"), children: [_jsx(IconCheck, { size: isPage ? 14 : 10 }), "Test passed \u2014 ", testResult.latencyMs, "ms"] })), testResult && testResult.ok === false && (_jsxs("p", { className: cn("text-destructive", isPage ? "text-xs" : "text-[10px]"), children: ["Test failed: ", testResult.error] })), disconnectError && (_jsxs("p", { className: cn("text-destructive", isPage ? "text-xs" : "text-[10px]"), children: ["Disconnect failed: ", disconnectError] })), applyNote && (_jsx("p", { className: cn("text-muted-foreground", isPage ? "text-xs" : "text-[10px]"), children: "Changes take effect on next conversation" }))] }) }))] })) }));
469
501
  }
470
502
  function friendlyAppName(appId) {
471
503
  return appId
@@ -1057,7 +1089,7 @@ function AccountSectionInner({ open, onToggle, }) {
1057
1089
  };
1058
1090
  return (_jsx(SettingsSection, { id: settingsSectionDomId("account"), icon: _jsx(IconUserCircle, { size: 14 }), title: "Account", subtitle: "Your profile photo and signed-in identity.", open: open, onToggle: onToggle, children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "flex h-12 w-12 shrink-0 items-center justify-center overflow-hidden rounded-full border border-border bg-accent text-[13px] font-semibold text-muted-foreground", children: avatarUrl ? (_jsx("img", { src: avatarUrl, alt: "", className: "h-full w-full object-cover" })) : (initials) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-[12px] font-medium text-foreground", children: isLoading ? "Loading..." : displayName }), email && (_jsx("p", { className: "truncate text-[11px] text-muted-foreground", children: email })), status === "saved" && (_jsx("p", { className: "mt-1 text-[11px] text-green-600 dark:text-green-400", children: "Photo updated" })), status === "error" && (_jsx("p", { className: "mt-1 text-[11px] text-destructive", children: "Could not update photo" }))] }), _jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", className: "hidden", onChange: handleAvatarChange }), _jsx("button", { type: "button", disabled: !email || uploading, onClick: () => fileInputRef.current?.click(), className: "inline-flex h-8 shrink-0 items-center justify-center rounded-md border border-border bg-background px-3 text-[12px] font-medium text-foreground transition-colors hover:bg-accent/50 disabled:cursor-not-allowed disabled:opacity-50", children: uploading ? "Uploading..." : "Change photo" })] }) }));
1059
1091
  }
1060
- function SettingsPanelContent({ isDevMode, onToggleDevMode, showDevToggle, devAppUrl, initialSection, sectionRequestKey, sections = ALL_SETTINGS_SECTIONS, showCapabilityStrip = true, className, }) {
1092
+ function SettingsPanelContent({ isDevMode, onToggleDevMode, showDevToggle, devAppUrl, initialSection, sectionRequestKey, sections = ALL_SETTINGS_SECTIONS, showCapabilityStrip = true, className, surface = "sidebar", }) {
1061
1093
  const { status: builder, loading: builderLoading } = useBuilderStatus();
1062
1094
  const connected = builder?.configured ?? false;
1063
1095
  const connectUrl = builder?.cliAuthUrl ?? builder?.connectUrl;
@@ -1131,11 +1163,12 @@ function SettingsPanelContent({ isDevMode, onToggleDevMode, showDevToggle, devAp
1131
1163
  window.addEventListener("hashchange", handleHash);
1132
1164
  return () => window.removeEventListener("hashchange", handleHash);
1133
1165
  }, [openSettingsSection, shouldShowSection]);
1134
- return (_jsxs("div", { className: cn("flex-1 min-h-0 overflow-y-auto p-3 space-y-2", className), style: { overflowY: "auto" }, children: [(showDevToggle || devAppUrl) && (_jsx("div", { className: "space-y-2 pb-2 border-b border-border mb-2", children: showDevToggle && (_jsx(SettingsSelect, { label: "Agent mode", labelAdornment: devAppUrl ? (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("a", { href: devAppUrl, target: "_blank", rel: "noopener noreferrer", "aria-label": "Open app in new tab", className: "flex items-center text-muted-foreground hover:text-foreground", children: _jsx(IconExternalLink, { size: 14 }) }) }), _jsx(TooltipContent, { children: "Open app in new tab" })] })) : undefined, value: isDevMode ? "development" : "production", options: agentModeOptions, onValueChange: (next) => {
1135
- const nextIsDev = next === "development";
1136
- if (nextIsDev !== isDevMode)
1137
- onToggleDevMode();
1138
- } })) })), showCapabilityStrip && (_jsx(CapabilityStatusStrip, { isDevMode: isDevMode, builderConnected: connected, builderLoading: builderLoading, builderBranchesAvailable: builderBranchesAvailable, onOpenLlm: () => openSettingsSection("llm", true) })), shouldShowSection("account") && (_jsx(AccountSectionInner, { open: openSection === "account", onToggle: () => toggle("account") })), shouldShowSection("llm") && (_jsx(LLMSectionInner, { builderFlow: builderFlow, builderLoading: builderLoading, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, open: openSection === "llm", onToggle: () => toggle("llm") })), shouldShowSection("app-models") && (_jsx(AppModelDefaultsSectionInner, { open: openSection === "app-models", onToggle: () => toggle("app-models") })), shouldShowSection("limits") && (_jsx(AgentLimitsSectionInner, { open: openSection === "limits", onToggle: () => toggle("limits") })), shouldShowSection("voice") && (_jsx(SettingsSection, { id: settingsSectionDomId("voice"), icon: _jsx(IconMicrophone, { size: 14 }), title: "Voice Transcription", subtitle: "How the composer microphone turns your voice into text.", open: openSection === "voice", onToggle: () => toggle("voice"), children: _jsx(VoiceTranscriptionSection, {}) })), shouldShowSection("demo-mode") && (_jsx(SettingsSection, { id: settingsSectionDomId("demo-mode"), icon: _jsx(IconEyeOff, { size: 14 }), title: "Demo mode", subtitle: "Replace names, emails, and numbers with realistic fake data everywhere \u2014 in the UI and what the agent sees. IDs and structure are preserved so the app keeps working.", open: openSection === "demo-mode", onToggle: () => toggle("demo-mode"), children: _jsx(DemoModeSection, {}) })), shouldShowSection("automations") && (_jsx(SettingsSection, { id: settingsSectionDomId("automations"), icon: _jsx(IconBolt, { size: 14 }), title: "Automations", subtitle: "Event-triggered and scheduled automations.", open: openSection === "automations", onToggle: () => toggle("automations"), children: _jsx(AutomationsSection, {}) })), shouldShowSection("secrets") && (_jsx(SettingsSection, { id: settingsSectionDomId("secrets"), icon: _jsx(IconKey, { size: 14 }), title: "API Keys & Connections", subtitle: "Service credentials and automation keys.", open: openSection === "secrets", onToggle: () => toggle("secrets"), children: _jsx(SecretsSection, { focusKey: focusSecretKey }) })), shouldShowSection("hosting") && (_jsx(SettingsSection, { id: settingsSectionDomId("hosting"), icon: _jsx(IconCloud, { size: 14 }), title: "Hosting", subtitle: "Deploy your app to the cloud.", connected: connected, open: openSection === "hosting", onToggle: () => toggle("hosting"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "hosting_settings", trackingFlow: "hosting" }), _jsx(ManualSetupCard, { hint: "Deploy manually to Netlify, Vercel, Cloudflare, or any Nitro-supported target.", docsUrl: "https://www.builder.io/c/docs/agent-native-deployment", dim: connected })] }) })), shouldShowSection("database") && (_jsx(SettingsSection, { id: settingsSectionDomId("database"), icon: _jsx(IconDatabase, { size: 14 }), title: "Database", subtitle: "Connect a cloud database for persistent storage.", connected: connected, open: openSection === "database", onToggle: () => toggle("database"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "database_settings", trackingFlow: "database" }), _jsx(ManualSetupCard, { hint: "Set DATABASE_URL in your .env to connect Neon, Supabase, Turso, any Postgres/SQLite database, or local PGlite with pglite:./data/pglite.", docsUrl: "https://www.builder.io/c/docs/agent-native-database", dim: connected })] }) })), shouldShowSection("uploads") && (_jsx(SettingsSection, { id: settingsSectionDomId("uploads"), icon: _jsx(IconUpload, { size: 14 }), title: "File uploads", subtitle: "Where user-uploaded files (avatars, chat attachments) are stored.", connected: connected, open: openSection === "uploads", onToggle: () => toggle("uploads"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "file_upload_settings", trackingFlow: "file_upload" }), _jsx(ManualSetupCard, { hint: "Without a provider, files are stored as base64 in your database. Fine for dev, not recommended for production.", docsUrl: "https://www.builder.io/c/docs/agent-native-file-uploads", dim: connected })] }) })), shouldShowSection("auth") && (_jsx(SettingsSection, { id: settingsSectionDomId("auth"), icon: _jsx(IconShield, { size: 14 }), title: "Authentication", subtitle: "Set up user authentication and access control.", connected: connected, open: openSection === "auth", onToggle: () => toggle("auth"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "auth_settings", trackingFlow: "auth" }), _jsx(ManualSetupCard, { hint: "Configure Better Auth with BETTER_AUTH_SECRET and optional Google/GitHub OAuth providers.", docsUrl: "https://www.builder.io/c/docs/agent-native-authentication", dim: connected })] }) })), shouldShowSection("email") && (_jsx(EmailSectionInner, { open: openSection === "email", onToggle: () => toggle("email") })), shouldShowSection("browser") && (_jsx(SettingsSection, { id: settingsSectionDomId("browser"), icon: _jsx(IconBrowser, { size: 14 }), title: "Browser Automation", subtitle: "Let agents control a real browser for web tasks.", connected: connected, open: openSection === "browser", onToggle: () => toggle("browser"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "browser_settings", trackingFlow: "browser_automation" }) })), builderBranchesAvailable && shouldShowSection("background") && (_jsx(SettingsSection, { id: settingsSectionDomId("background"), icon: _jsx(IconGitBranch, { size: 14 }), title: "Background Agent", subtitle: "Make code changes from production mode via Builder.", connected: connected, open: openSection === "background", onToggle: () => toggle("background"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "background_agent_settings", trackingFlow: "background_agent" }) })), shouldShowSection("integrations") && (_jsx(SettingsSection, { id: settingsSectionDomId("integrations"), icon: _jsx(IconPlugConnected, { size: 14 }), title: "Integrations", subtitle: "Connect messaging platforms and external services.", open: openSection === "integrations", onToggle: () => toggle("integrations"), children: _jsx(Suspense, { fallback: null, children: _jsx(IntegrationsPanel, {}) }) })), shouldShowSection("usage") && (_jsx(SettingsSection, { id: settingsSectionDomId("usage"), icon: _jsx(IconCoin, { size: 14 }), title: "Usage", subtitle: "Track token consumption and estimated cost \u2014 broken down by chat, automations, and background jobs.", open: openSection === "usage", onToggle: () => toggle("usage"), children: _jsx(UsageSection, {}) })), shouldShowSection("a2a") && (_jsx(SettingsSection, { id: settingsSectionDomId("a2a"), icon: _jsx(IconTopologyRing2, { size: 14 }), title: "Connected Agents (A2A)", subtitle: "Manage remote agents connected via the A2A protocol.", open: openSection === "a2a", onToggle: () => toggle("a2a"), children: _jsx(AgentsSection, {}) }))] }));
1166
+ const isPage = surface === "page";
1167
+ return (_jsx(SettingsSurfaceProvider, { surface: surface, children: _jsxs("div", { className: cn(isPage ? "space-y-3" : "flex-1 min-h-0 overflow-y-auto p-3 space-y-2", className), style: isPage ? undefined : { overflowY: "auto" }, children: [(showDevToggle || devAppUrl) && (_jsx("div", { className: "space-y-2 pb-2 border-b border-border mb-2", children: showDevToggle && (_jsx(SettingsSelect, { label: "Agent mode", labelAdornment: devAppUrl ? (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("a", { href: devAppUrl, target: "_blank", rel: "noopener noreferrer", "aria-label": "Open app in new tab", className: "flex items-center text-muted-foreground hover:text-foreground", children: _jsx(IconExternalLink, { size: 14 }) }) }), _jsx(TooltipContent, { children: "Open app in new tab" })] })) : undefined, value: isDevMode ? "development" : "production", options: agentModeOptions, onValueChange: (next) => {
1168
+ const nextIsDev = next === "development";
1169
+ if (nextIsDev !== isDevMode)
1170
+ onToggleDevMode();
1171
+ } })) })), showCapabilityStrip && (_jsx(CapabilityStatusStrip, { isDevMode: isDevMode, builderConnected: connected, builderLoading: builderLoading, builderBranchesAvailable: builderBranchesAvailable, onOpenLlm: () => openSettingsSection("llm", true) })), shouldShowSection("account") && (_jsx(AccountSectionInner, { open: openSection === "account", onToggle: () => toggle("account") })), shouldShowSection("llm") && (_jsx(LLMSectionInner, { builderFlow: builderFlow, builderLoading: builderLoading, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, open: openSection === "llm", onToggle: () => toggle("llm") })), shouldShowSection("app-models") && (_jsx(AppModelDefaultsSectionInner, { open: openSection === "app-models", onToggle: () => toggle("app-models") })), shouldShowSection("limits") && (_jsx(AgentLimitsSectionInner, { open: openSection === "limits", onToggle: () => toggle("limits") })), shouldShowSection("voice") && (_jsx(SettingsSection, { id: settingsSectionDomId("voice"), icon: _jsx(IconMicrophone, { size: 14 }), title: "Voice Transcription", subtitle: "How the composer microphone turns your voice into text.", open: openSection === "voice", onToggle: () => toggle("voice"), children: _jsx(VoiceTranscriptionSection, {}) })), shouldShowSection("demo-mode") && (_jsx(SettingsSection, { id: settingsSectionDomId("demo-mode"), icon: _jsx(IconEyeOff, { size: 14 }), title: "Demo mode", subtitle: "Replace names, emails, and numbers with realistic fake data everywhere \u2014 in the UI and what the agent sees. IDs and structure are preserved so the app keeps working.", open: openSection === "demo-mode", onToggle: () => toggle("demo-mode"), children: _jsx(DemoModeSection, {}) })), shouldShowSection("automations") && (_jsx(SettingsSection, { id: settingsSectionDomId("automations"), icon: _jsx(IconBolt, { size: 14 }), title: "Automations", subtitle: "Event-triggered and scheduled automations.", open: openSection === "automations", onToggle: () => toggle("automations"), children: _jsx(AutomationsSection, {}) })), shouldShowSection("secrets") && (_jsx(SettingsSection, { id: settingsSectionDomId("secrets"), icon: _jsx(IconKey, { size: 14 }), title: "API Keys & Connections", subtitle: "Service credentials and automation keys.", open: openSection === "secrets", onToggle: () => toggle("secrets"), children: _jsx(SecretsSection, { focusKey: focusSecretKey }) })), shouldShowSection("hosting") && (_jsx(SettingsSection, { id: settingsSectionDomId("hosting"), icon: _jsx(IconCloud, { size: 14 }), title: "Hosting", subtitle: "Deploy your app to the cloud.", connected: connected, open: openSection === "hosting", onToggle: () => toggle("hosting"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "hosting_settings", trackingFlow: "hosting" }), _jsx(ManualSetupCard, { hint: "Deploy manually to Netlify, Vercel, Cloudflare, or any Nitro-supported target.", docsUrl: "https://www.builder.io/c/docs/agent-native-deployment", dim: connected })] }) })), shouldShowSection("database") && (_jsx(SettingsSection, { id: settingsSectionDomId("database"), icon: _jsx(IconDatabase, { size: 14 }), title: "Database", subtitle: "Connect a cloud database for persistent storage.", connected: connected, open: openSection === "database", onToggle: () => toggle("database"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "database_settings", trackingFlow: "database" }), _jsx(ManualSetupCard, { hint: "Set DATABASE_URL in your .env to connect Neon, Supabase, Turso, any Postgres/SQLite database, or local PGlite with pglite:./data/pglite.", docsUrl: "https://www.builder.io/c/docs/agent-native-database", dim: connected })] }) })), shouldShowSection("uploads") && (_jsx(SettingsSection, { id: settingsSectionDomId("uploads"), icon: _jsx(IconUpload, { size: 14 }), title: "File uploads", subtitle: "Where user-uploaded files (avatars, chat attachments) are stored.", connected: connected, open: openSection === "uploads", onToggle: () => toggle("uploads"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "file_upload_settings", trackingFlow: "file_upload" }), _jsx(ManualSetupCard, { hint: "Without a provider, files are stored as base64 in your database. Fine for dev, not recommended for production.", docsUrl: "https://www.builder.io/c/docs/agent-native-file-uploads", dim: connected })] }) })), shouldShowSection("auth") && (_jsx(SettingsSection, { id: settingsSectionDomId("auth"), icon: _jsx(IconShield, { size: 14 }), title: "Authentication", subtitle: "Set up user authentication and access control.", connected: connected, open: openSection === "auth", onToggle: () => toggle("auth"), children: _jsxs("div", { className: "space-y-2", children: [_jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "auth_settings", trackingFlow: "auth" }), _jsx(ManualSetupCard, { hint: "Configure Better Auth with BETTER_AUTH_SECRET and optional Google/GitHub OAuth providers.", docsUrl: "https://www.builder.io/c/docs/agent-native-authentication", dim: connected })] }) })), shouldShowSection("email") && (_jsx(EmailSectionInner, { open: openSection === "email", onToggle: () => toggle("email") })), shouldShowSection("browser") && (_jsx(SettingsSection, { id: settingsSectionDomId("browser"), icon: _jsx(IconBrowser, { size: 14 }), title: "Browser Automation", subtitle: "Let agents control a real browser for web tasks.", connected: connected, open: openSection === "browser", onToggle: () => toggle("browser"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "browser_settings", trackingFlow: "browser_automation" }) })), builderBranchesAvailable && shouldShowSection("background") && (_jsx(SettingsSection, { id: settingsSectionDomId("background"), icon: _jsx(IconGitBranch, { size: 14 }), title: "Background Agent", subtitle: "Make code changes from production mode via Builder.", connected: connected, open: openSection === "background", onToggle: () => toggle("background"), children: _jsx(UseBuilderCard, { builderFlow: builderFlow, connectUrl: connectUrl, connected: connected, orgName: orgName, envManaged: envManaged, credentialSource: credentialSource, trackingSource: "background_agent_settings", trackingFlow: "background_agent" }) })), shouldShowSection("integrations") && (_jsx(SettingsSection, { id: settingsSectionDomId("integrations"), icon: _jsx(IconPlugConnected, { size: 14 }), title: "Integrations", subtitle: "Connect messaging platforms and external services.", open: openSection === "integrations", onToggle: () => toggle("integrations"), children: _jsx(Suspense, { fallback: null, children: _jsx(IntegrationsPanel, {}) }) })), shouldShowSection("usage") && (_jsx(SettingsSection, { id: settingsSectionDomId("usage"), icon: _jsx(IconCoin, { size: 14 }), title: "Usage", subtitle: "Track token consumption and estimated cost \u2014 broken down by chat, automations, and background jobs.", open: openSection === "usage", onToggle: () => toggle("usage"), children: _jsx(UsageSection, {}) })), shouldShowSection("a2a") && (_jsx(SettingsSection, { id: settingsSectionDomId("a2a"), icon: _jsx(IconTopologyRing2, { size: 14 }), title: "Connected Agents (A2A)", subtitle: "Manage remote agents connected via the A2A protocol.", open: openSection === "a2a", onToggle: () => toggle("a2a"), children: _jsx(AgentsSection, {}) }))] }) }));
1139
1172
  }
1140
1173
  export function SettingsPanel(props) {
1141
1174
  return _jsx(SettingsPanelContent, { ...props });
@@ -1156,7 +1189,7 @@ export function useAgentSettingsTabs() {
1156
1189
  icon: IconBrain,
1157
1190
  keywords: "agent model llm limits voice automations",
1158
1191
  searchEntries: buildSectionSearchEntries(AGENT_SETTINGS_SECTIONS),
1159
- content: (_jsx(SettingsPanelContent, { ...baseProps, sections: AGENT_SETTINGS_SECTIONS, showCapabilityStrip: false, className: "mx-auto w-full max-w-3xl p-0" })),
1192
+ content: (_jsx(SettingsPanelContent, { ...baseProps, surface: "page", sections: AGENT_SETTINGS_SECTIONS, showCapabilityStrip: false, className: "mx-auto w-full max-w-2xl" })),
1160
1193
  },
1161
1194
  {
1162
1195
  id: "connections",
@@ -1164,7 +1197,7 @@ export function useAgentSettingsTabs() {
1164
1197
  icon: IconPlugConnected,
1165
1198
  keywords: "connections secrets integrations email browser usage",
1166
1199
  searchEntries: buildSectionSearchEntries(CONNECTION_SETTINGS_SECTIONS),
1167
- content: (_jsx(SettingsPanelContent, { ...baseProps, sections: CONNECTION_SETTINGS_SECTIONS, showCapabilityStrip: false, className: "mx-auto w-full max-w-3xl p-0" })),
1200
+ content: (_jsx(SettingsPanelContent, { ...baseProps, surface: "page", sections: CONNECTION_SETTINGS_SECTIONS, showCapabilityStrip: false, className: "mx-auto w-full max-w-2xl" })),
1168
1201
  },
1169
1202
  {
1170
1203
  id: "workspace",
@@ -1172,7 +1205,7 @@ export function useAgentSettingsTabs() {
1172
1205
  icon: IconCloud,
1173
1206
  keywords: "workspace account hosting database uploads auth",
1174
1207
  searchEntries: buildSectionSearchEntries(WORKSPACE_SETTINGS_SECTIONS),
1175
- content: (_jsx(SettingsPanelContent, { ...baseProps, sections: WORKSPACE_SETTINGS_SECTIONS, showCapabilityStrip: false, className: "mx-auto w-full max-w-3xl p-0" })),
1208
+ content: (_jsx(SettingsPanelContent, { ...baseProps, surface: "page", sections: WORKSPACE_SETTINGS_SECTIONS, showCapabilityStrip: false, className: "mx-auto w-full max-w-2xl" })),
1176
1209
  },
1177
1210
  ], [baseProps]);
1178
1211
  }