@agent-native/core 0.169.0 → 0.170.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 (496) hide show
  1. package/agent-native.eject.json +4 -1
  2. package/bin/agent-native.js +23 -5
  3. package/corpus/README.md +1 -1
  4. package/corpus/templates/analytics/.agents/skills/secrets/SKILL.md +11 -4
  5. package/corpus/templates/analytics/actions/bigquery-table-info.ts +3 -2
  6. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
  7. package/corpus/templates/analytics/actions/search-bigquery-schema.ts +130 -4
  8. package/corpus/templates/analytics/agent-native.config.ts +1 -0
  9. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +36 -23
  10. package/corpus/templates/analytics/app/i18n-data.ts +28 -0
  11. package/corpus/templates/analytics/app/lib/dashboard-visibility.ts +41 -0
  12. package/corpus/templates/analytics/app/pages/Agents.tsx +25 -1
  13. package/corpus/templates/analytics/app/pages/DashboardOverview.tsx +34 -9
  14. package/corpus/templates/analytics/app/routes/$.tsx +10 -0
  15. package/corpus/templates/analytics/app/routes.ts +3 -1
  16. package/corpus/templates/analytics/changelog/2026-08-21-dashboard-filters-keep-other-users-dashboards-out-of-mine.md +6 -0
  17. package/corpus/templates/analytics/changelog/2026-08-22-fixed-the-agent-native-templates-first-party-dashboard-panel.md +6 -0
  18. package/corpus/templates/analytics/changelog/2026-08-22-org-admin-panels-no-longer-report-a-database-error-as-a-per.md +9 -0
  19. package/corpus/templates/analytics/changelog/2026-08-22-slack-requests-report-invalid-inputs.md +6 -0
  20. package/corpus/templates/analytics/changelog/2026-08-22-unknown-analytics-links-now-return-a-real-not-found-status.md +6 -0
  21. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +2 -1
  22. package/corpus/templates/analytics/docs/schemas/tracked-events.md +2 -0
  23. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +29 -7
  24. package/corpus/templates/analytics/server/handlers/slack.ts +59 -5
  25. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +11 -6
  26. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +132 -2
  27. package/corpus/templates/analytics/server/lib/real-data-actions.ts +14 -3
  28. package/corpus/templates/analytics/server/lib/slack.ts +4 -2
  29. package/corpus/templates/analytics/server/plugins/agent-chat.ts +33 -3
  30. package/corpus/templates/analytics/vitest.config.ts +6 -1
  31. package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +11 -4
  32. package/corpus/templates/assets/app/routes/library.tsx +5 -3
  33. package/corpus/templates/assets/app/routes.ts +3 -1
  34. package/corpus/templates/assets/changelog/2026-08-22-library-page-loads-again-instead-of-crashing-on-open.md +6 -0
  35. package/corpus/templates/assets/vitest.config.ts +6 -1
  36. package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +11 -4
  37. package/corpus/templates/brain/app/components/ui/pointer-lock.ts +1 -0
  38. package/corpus/templates/brain/app/routes/sources.tsx +8 -3
  39. package/corpus/templates/brain/changelog/2026-08-22-tuning-or-adding-a-source-no-longer-leaves-the-sources-page.md +6 -0
  40. package/corpus/templates/brain/server/lib/brain.ts +27 -2
  41. package/corpus/templates/brain/vitest.config.ts +1 -0
  42. package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +11 -4
  43. package/corpus/templates/calendar/actions/list-booking-links.ts +83 -4
  44. package/corpus/templates/calendar/actions/update-booking-link.ts +4 -3
  45. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +11 -3
  46. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +1 -1
  47. package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +103 -44
  48. package/corpus/templates/calendar/app/components/calendar/OutOfOfficeEvent.tsx +28 -24
  49. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +9 -2
  50. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +47 -58
  51. package/corpus/templates/calendar/app/hooks/use-booking-links.ts +5 -1
  52. package/corpus/templates/calendar/app/lib/event-layout.ts +52 -26
  53. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +126 -98
  54. package/corpus/templates/calendar/app/pages/CalendarView.tsx +1 -0
  55. package/corpus/templates/calendar/app/pages/Settings.tsx +88 -81
  56. package/corpus/templates/calendar/app/routes.ts +3 -1
  57. package/corpus/templates/calendar/changelog/2026-08-22-booking-link-visibility-respects-shared-access.md +6 -0
  58. package/corpus/templates/calendar/changelog/2026-08-22-clicking-an-out-of-office-event-s-marker-no-longer-creates-a.md +6 -0
  59. package/corpus/templates/calendar/changelog/2026-08-22-event-detail-views-now-show-your-calendar-timezone.md +6 -0
  60. package/corpus/templates/calendar/changelog/2026-08-22-google-calendar-can-now-connect-with-the-shared-google-oauth.md +6 -0
  61. package/corpus/templates/calendar/changelog/2026-08-22-overlapping-events-now-show-each-others-boundaries.md +6 -0
  62. package/corpus/templates/calendar/changelog/2026-08-22-public-booking-pages-now-offer-time-slots-from-the-host-s-we.md +6 -0
  63. package/corpus/templates/calendar/server/handlers/bookings.ts +5 -7
  64. package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -2
  65. package/corpus/templates/calendar/server/lib/google-calendar.ts +139 -14
  66. package/corpus/templates/calendar/server/onboarding.ts +85 -0
  67. package/corpus/templates/calendar/server/plugins/agent-chat.ts +2 -0
  68. package/corpus/templates/calendar/shared/api.ts +9 -1
  69. package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  70. package/corpus/templates/chat/app/routes.ts +3 -1
  71. package/corpus/templates/chat/vitest.config.ts +8 -0
  72. package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +11 -4
  73. package/corpus/templates/clips/actions/get-meeting.ts +9 -4
  74. package/corpus/templates/clips/actions/list-recordings.ts +16 -3
  75. package/corpus/templates/clips/actions/search-meetings.ts +1 -0
  76. package/corpus/templates/clips/actions/stop-meeting-recording.ts +87 -6
  77. package/corpus/templates/clips/actions/view-screen.ts +8 -1
  78. package/corpus/templates/clips/app/components/library/search-bar.tsx +1 -1
  79. package/corpus/templates/clips/app/components/meetings/meeting-history-row.tsx +32 -1
  80. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +1 -1
  81. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +29 -1
  82. package/corpus/templates/clips/app/i18n/en-US.ts +5 -0
  83. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +33 -4
  84. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +1 -0
  85. package/corpus/templates/clips/app/routes/access-request.approve.tsx +16 -9
  86. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +17 -7
  87. package/corpus/templates/clips/app/routes/share.$shareId.tsx +17 -7
  88. package/corpus/templates/clips/changelog/2026-08-21-camera-bubble-black-circle.md +6 -0
  89. package/corpus/templates/clips/changelog/2026-08-22-screen-recordings-respect-the-microphone-toggle.md +6 -0
  90. package/corpus/templates/clips/changelog/2026-08-22-the-recordings-library-no-longer-fails-right-after-server-start.md +6 -0
  91. package/corpus/templates/clips/changelog/2026-08-23-the-agent-can-see-your-library-right-after-server-start.md +6 -0
  92. package/corpus/templates/clips/chrome-extension/src/background.ts +1 -2
  93. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +39 -7
  94. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +21 -25
  95. package/corpus/templates/clips/desktop/src/app.tsx +53 -24
  96. package/corpus/templates/clips/desktop/src/lib/bubble-playback.ts +68 -0
  97. package/corpus/templates/clips/desktop/src/lib/recorder.ts +3 -0
  98. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +72 -14
  99. package/corpus/templates/clips/desktop/src/lib/updater.ts +8 -3
  100. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +162 -20
  101. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +43 -6
  102. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +150 -13
  103. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +12 -0
  104. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +28 -3
  105. package/corpus/templates/clips/server/lib/emails.ts +17 -33
  106. package/corpus/templates/content/.agents/skills/secrets/SKILL.md +11 -4
  107. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +140 -15
  108. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +12 -14
  109. package/corpus/templates/content/app/components/ui/pointer-lock.ts +1 -0
  110. package/corpus/templates/content/app/hooks/use-content-database.ts +18 -2
  111. package/corpus/templates/content/app/hooks/use-local-storage.ts +38 -22
  112. package/corpus/templates/content/app/i18n-data.ts +25 -0
  113. package/corpus/templates/content/app/routes.ts +3 -1
  114. package/corpus/templates/content/changelog/2026-08-22-code-blocks-inserted-from-the-slash-menu-no-longer-get-stuck.md +6 -0
  115. package/corpus/templates/content/changelog/2026-08-22-the-sidebar-page-tree-no-longer-flashes-empty-after-creating-a-page.md +6 -0
  116. package/corpus/templates/content/docs/solutions/2026-08-21-content-mermaid-rendering-shape.md +233 -0
  117. package/corpus/templates/content/server/plugins/agent-chat.ts +9 -2
  118. package/corpus/templates/content/vitest.config.ts +7 -1
  119. package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +11 -4
  120. package/corpus/templates/design/.agents/skills/secrets/SKILL.md +11 -4
  121. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +1386 -92
  122. package/corpus/templates/design/actions/generate-design.ts +98 -47
  123. package/corpus/templates/design/actions/get-design-system.ts +6 -1
  124. package/corpus/templates/design/actions/refresh-design-system-with-builder.ts +146 -0
  125. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +70 -26
  126. package/corpus/templates/design/app/components/design/EditPanel.tsx +15 -47
  127. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +284 -136
  128. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2060 -144
  129. package/corpus/templates/design/app/components/design/editor/DesignBottomToolbar.tsx +6 -2
  130. package/corpus/templates/design/app/components/design/editor/DesignWorkspaceRail.tsx +4 -4
  131. package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +10 -8
  132. package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +19 -2
  133. package/corpus/templates/design/app/components/design/multi-screen/types.ts +9 -2
  134. package/corpus/templates/design/app/components/layout/Header.tsx +15 -0
  135. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -2
  136. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +13 -8
  137. package/corpus/templates/design/app/i18n-data.ts +11 -10
  138. package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +12 -0
  139. package/corpus/templates/design/app/lib/design-system-data.ts +68 -0
  140. package/corpus/templates/design/app/pages/DesignEditor.tsx +99 -57
  141. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +39 -8
  142. package/corpus/templates/design/app/pages/DesignSystems.tsx +137 -43
  143. package/corpus/templates/design/app/pages/Index.tsx +3 -1
  144. package/corpus/templates/design/app/pages/Templates.tsx +0 -10
  145. package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +10 -0
  146. package/corpus/templates/design/app/pages/design-editor/collab-sync.ts +50 -0
  147. package/corpus/templates/design/app/pages/design-editor/commands/apply-design-editor-command.ts +1 -1
  148. package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +10 -8
  149. package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +6 -6
  150. package/corpus/templates/design/app/pages/design-editor/commands/apply-pending-visual-styles-with-agent.ts +1 -1
  151. package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +18 -7
  152. package/corpus/templates/design/app/pages/design-editor/commands/escape-hotkey.ts +4 -90
  153. package/corpus/templates/design/app/pages/design-editor/commands/layer-marquee-selection-change.ts +2 -1
  154. package/corpus/templates/design/app/pages/design-editor/commands/layer-selection-change.ts +4 -3
  155. package/corpus/templates/design/app/pages/design-editor/commands/screen-element-select.ts +12 -2
  156. package/corpus/templates/design/app/pages/design-editor/commands/screen-visual-style-change.ts +9 -2
  157. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-move-semantic-handoff.ts +1 -1
  158. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-semantic-handoff.ts +1 -1
  159. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-state-semantic-handoff.ts +1 -1
  160. package/corpus/templates/design/app/pages/design-editor/commands/start-sidebar-resize.ts +1 -1
  161. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +11 -1
  162. package/corpus/templates/design/app/pages/design-editor/effects/adopt-db-file-content.ts +11 -19
  163. package/corpus/templates/design/app/pages/design-editor/effects/observe-collab-text.ts +6 -6
  164. package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +1 -1
  165. package/corpus/templates/design/app/pages/design-editor/effects/seed-collab-content.ts +12 -15
  166. package/corpus/templates/design/app/pages/design-editor/preview-navigation.ts +25 -0
  167. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +5 -59
  168. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +8 -0
  169. package/corpus/templates/design/app/pages/design-editor/types.ts +3 -3
  170. package/corpus/templates/design/app/routes.ts +3 -1
  171. package/corpus/templates/design/changelog/2026-08-20-canvas-edits-patch-the-frame-instead-of-rebuilding-it.md +6 -0
  172. package/corpus/templates/design/changelog/2026-08-21-builder-design-system-imports-reconcile-after-indexing.md +6 -0
  173. package/corpus/templates/design/changelog/2026-08-21-draw-mode-needs-shift-y.md +6 -0
  174. package/corpus/templates/design/changelog/2026-08-21-eyedropper-shortcut.md +6 -0
  175. package/corpus/templates/design/changelog/2026-08-21-figma-style-alignment-guides-and-snapping.md +6 -0
  176. package/corpus/templates/design/changelog/2026-08-21-group-transforms-keep-the-selection.md +6 -0
  177. package/corpus/templates/design/changelog/2026-08-21-inspector-fields-keep-focus-on-enter.md +6 -0
  178. package/corpus/templates/design/changelog/2026-08-21-pen-alt-keeps-the-incoming-handle.md +6 -0
  179. package/corpus/templates/design/changelog/2026-08-21-pen-on-the-board-creates-one-vector.md +6 -0
  180. package/corpus/templates/design/changelog/2026-08-21-scale-a-multi-selection-from-the-group-handles.md +6 -0
  181. package/corpus/templates/design/changelog/2026-08-21-scale-resizes-text-with-the-object.md +6 -0
  182. package/corpus/templates/design/changelog/2026-08-21-selecting-another-object-keeps-the-scale-tool-armed.md +6 -0
  183. package/corpus/templates/design/changelog/2026-08-21-the-shape-tool-remembers-the-shape-you-picked.md +6 -0
  184. package/corpus/templates/design/changelog/2026-08-21-vectors-drawn-in-a-frame-land-where-you-drew-them.md +6 -0
  185. package/corpus/templates/design/changelog/2026-08-22-multi-screen-generation-no-longer-loses-a-saved-screens-layo.md +6 -0
  186. package/corpus/templates/design/changelog/2026-08-22-rename-and-search-fields-are-labeled-for-screen-readers.md +6 -0
  187. package/corpus/templates/design/package.json +2 -0
  188. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +311 -0
  189. package/corpus/templates/design/shared/canvas-math.ts +612 -206
  190. package/corpus/templates/design/shared/pen-path.ts +37 -0
  191. package/corpus/templates/design/vitest.config.ts +7 -1
  192. package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +11 -4
  193. package/corpus/templates/dispatch/actions/list-workspace-connections.ts +34 -3
  194. package/corpus/templates/dispatch/app/routes/integrations.tsx +55 -21
  195. package/corpus/templates/dispatch/app/routes.ts +3 -1
  196. package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +11 -4
  197. package/corpus/templates/factory/.env.example +2 -7
  198. package/corpus/templates/factory/AGENTS.md +3 -0
  199. package/corpus/templates/factory/README.md +5 -3
  200. package/corpus/templates/factory/actions/create-factory.ts +16 -3
  201. package/corpus/templates/factory/actions/get-slack-feedback-context.ts +2 -0
  202. package/corpus/templates/factory/actions/get-triage-item.ts +2 -0
  203. package/corpus/templates/factory/actions/list-factory-audit.ts +116 -36
  204. package/corpus/templates/factory/actions/list-factory-automations.ts +2 -1
  205. package/corpus/templates/factory/actions/list-triage-items.ts +22 -19
  206. package/corpus/templates/factory/actions/run-factory-automation.ts +7 -3
  207. package/corpus/templates/factory/actions/save-factory-automation.ts +5 -2
  208. package/corpus/templates/factory/actions/save-triage-config.ts +2 -8
  209. package/corpus/templates/factory/actions/start-builder-for-item.ts +21 -0
  210. package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +229 -297
  211. package/corpus/templates/factory/app/components/factory/FactorySettingsView.tsx +397 -247
  212. package/corpus/templates/factory/app/components/factory/FactorySourceSettingsGroup.tsx +33 -0
  213. package/corpus/templates/factory/app/components/factory/NewFactoryForm.tsx +202 -162
  214. package/corpus/templates/factory/app/i18n/en-US.ts +32 -4
  215. package/corpus/templates/factory/app/routes/factory.tsx +84 -11
  216. package/corpus/templates/factory/app/routes.ts +3 -1
  217. package/corpus/templates/factory/changelog/2026-08-21-activity-runs-use-automation-display-names.md +6 -0
  218. package/corpus/templates/factory/changelog/2026-08-21-create-and-settings-source-cards.md +6 -0
  219. package/corpus/templates/factory/changelog/2026-08-21-keep-automations-visible-while-running.md +6 -0
  220. package/corpus/templates/factory/changelog/2026-08-21-nested-factory-automations-can-poll.md +6 -0
  221. package/corpus/templates/factory/changelog/2026-08-21-settings-sticky-unsaved-bar.md +6 -0
  222. package/corpus/templates/factory/server/connectors/credentials.ts +10 -5
  223. package/corpus/templates/factory/server/lib/factory-audit-report.ts +412 -0
  224. package/corpus/templates/factory/server/lib/factory-config-reconcile.ts +321 -0
  225. package/corpus/templates/factory/server/lib/factory-scope.ts +25 -2
  226. package/corpus/templates/factory/server/lib/require-factory-automation.ts +13 -4
  227. package/corpus/templates/factory/server/plugins/factory-migrations.ts +148 -4
  228. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +4 -6
  229. package/corpus/templates/factory/vitest.config.ts +17 -2
  230. package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +11 -4
  231. package/corpus/templates/forms/app/routes/_app.settings.tsx +4 -1
  232. package/corpus/templates/forms/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  233. package/corpus/templates/forms/server/lib/public-form-ssr.ts +11 -1
  234. package/corpus/templates/forms/vitest.config.ts +1 -0
  235. package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +11 -4
  236. package/corpus/templates/macros/app/routes.ts +3 -1
  237. package/corpus/templates/macros/vitest.config.ts +6 -1
  238. package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +11 -4
  239. package/corpus/templates/mail/actions/manage-gmail-filters.ts +10 -2
  240. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +100 -37
  241. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +14 -2
  242. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +66 -36
  243. package/corpus/templates/mail/app/hooks/use-emails.ts +13 -3
  244. package/corpus/templates/mail/app/hooks/use-google-auth.ts +2 -0
  245. package/corpus/templates/mail/app/lib/google-oauth-setup.ts +17 -0
  246. package/corpus/templates/mail/app/pages/InboxPage.tsx +69 -9
  247. package/corpus/templates/mail/app/routes/$.tsx +9 -0
  248. package/corpus/templates/mail/app/routes/$view.$threadId.tsx +23 -1
  249. package/corpus/templates/mail/app/routes/$view.tsx +47 -1
  250. package/corpus/templates/mail/app/routes.ts +3 -1
  251. package/corpus/templates/mail/changelog/2026-08-22-gmail-can-now-connect-with-the-shared-google-oauth.md +6 -0
  252. package/corpus/templates/mail/changelog/2026-08-22-gmail-filters-now-shows-the-real-error.md +6 -0
  253. package/corpus/templates/mail/changelog/2026-08-22-unknown-mail-urls-now-show-the-404-page.md +6 -0
  254. package/corpus/templates/mail/server/handlers/google-auth.ts +11 -2
  255. package/corpus/templates/mail/server/lib/google-auth.ts +92 -12
  256. package/corpus/templates/mail/server/onboarding.ts +66 -18
  257. package/corpus/templates/mail/vitest.config.ts +6 -1
  258. package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +11 -4
  259. package/corpus/templates/plan/app/routes/settings.tsx +4 -1
  260. package/corpus/templates/plan/app/routes.ts +3 -1
  261. package/corpus/templates/plan/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  262. package/corpus/templates/plan/netlify.toml +1 -1
  263. package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +11 -4
  264. package/corpus/templates/slides/actions/patch-deck.ts +79 -10
  265. package/corpus/templates/slides/actions/update-slide.ts +11 -1
  266. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +14 -4
  267. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -52
  268. package/corpus/templates/slides/app/components/editor/GoogleDocImportHint.tsx +8 -53
  269. package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +9 -75
  270. package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +8 -60
  271. package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +10 -2
  272. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +19 -7
  273. package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +49 -36
  274. package/corpus/templates/slides/app/routes/access-request.approve.tsx +16 -9
  275. package/corpus/templates/slides/app/routes.ts +3 -1
  276. package/corpus/templates/slides/changelog/2026-08-22-already-uploaded-chat-images-are-no-longer-dropped.md +6 -0
  277. package/corpus/templates/slides/changelog/2026-08-22-google-drive-and-slides-can-now-connect-with-the-shared-google-oauth.md +6 -0
  278. package/corpus/templates/slides/changelog/2026-08-22-multi-slide-repairs-now-report-slides-that-still-overflow.md +6 -0
  279. package/corpus/templates/slides/changelog/2026-08-22-update-slide-now-reports-which-batched-edit-was-skipped.md +6 -0
  280. package/corpus/templates/slides/server/handlers/google-docs-auth.ts +52 -1
  281. package/corpus/templates/slides/server/lib/chat-attachments.ts +29 -3
  282. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +66 -16
  283. package/corpus/templates/slides/server/lib/slide-content-patch.ts +13 -2
  284. package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -2
  285. package/corpus/templates/slides/tsconfig.json +5 -0
  286. package/corpus/templates/slides/vitest.config.ts +6 -1
  287. package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +11 -4
  288. package/corpus/templates/tasks/app/routes/settings.tsx +4 -1
  289. package/corpus/templates/tasks/app/routes.ts +3 -1
  290. package/corpus/templates/tasks/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  291. package/corpus/templates/tasks/vitest.config.ts +7 -1
  292. package/dist/action.d.ts +91 -0
  293. package/dist/action.js +50 -0
  294. package/dist/agent/abort-reasons.d.ts +38 -0
  295. package/dist/agent/abort-reasons.js +49 -0
  296. package/dist/agent/engine/ai-sdk-engine.js +8 -5
  297. package/dist/agent/engine/anthropic-engine.js +7 -5
  298. package/dist/agent/engine/credential-errors.d.ts +1 -1
  299. package/dist/agent/engine/credential-errors.js +2 -2
  300. package/dist/agent/engine/first-event-timeout.d.ts +42 -17
  301. package/dist/agent/engine/first-event-timeout.js +67 -25
  302. package/dist/agent/production-agent.d.ts +23 -0
  303. package/dist/agent/production-agent.js +107 -102
  304. package/dist/agent/run-loop-with-resume.d.ts +2 -28
  305. package/dist/agent/run-loop-with-resume.js +25 -40
  306. package/dist/agent/run-manager.js +5 -4
  307. package/dist/agent/run-store.d.ts +55 -0
  308. package/dist/agent/run-store.js +124 -1
  309. package/dist/agent/tool-search.js +2 -1
  310. package/dist/agent/types.d.ts +9 -4
  311. package/dist/app-config/configuration-error.d.ts +11 -0
  312. package/dist/app-config/configuration-error.js +14 -0
  313. package/dist/app-config/index.d.ts +1 -0
  314. package/dist/app-config/index.js +1 -0
  315. package/dist/app-config/integrations.d.ts +1 -0
  316. package/dist/app-config/integrations.js +10 -0
  317. package/dist/app-config/plugins.d.ts +34 -0
  318. package/dist/app-config/plugins.js +39 -0
  319. package/dist/app-config/run-lifecycle-invariants.d.ts +18 -9
  320. package/dist/app-config/run-lifecycle-invariants.js +18 -25
  321. package/dist/app-config/schema.d.ts +16 -0
  322. package/dist/app-config/schema.js +2 -0
  323. package/dist/chat-threads/schema-migrations.js +20 -0
  324. package/dist/chat-threads/store.js +21 -4
  325. package/dist/cli/native-dependencies.d.ts +4 -0
  326. package/dist/cli/native-dependencies.js +15 -0
  327. package/dist/client/AssistantChat.js +47 -15
  328. package/dist/client/ConnectBuilderCard.d.ts +3 -1
  329. package/dist/client/ConnectBuilderCard.js +6 -3
  330. package/dist/client/EnvironmentBadge.d.ts +1 -1
  331. package/dist/client/EnvironmentBadge.js +40 -5
  332. package/dist/client/MultiTabAssistantChat.d.ts +1 -1
  333. package/dist/client/MultiTabAssistantChat.js +35 -14
  334. package/dist/client/agent-chat/index.d.ts +1 -1
  335. package/dist/client/agent-chat/index.js +1 -1
  336. package/dist/client/agent-page/use-jobs.d.ts +2 -1
  337. package/dist/client/agent-page/use-jobs.js +3 -5
  338. package/dist/client/agent-sidebar-state.js +3 -1
  339. package/dist/client/blocks/library/code-tabs.js +5 -0
  340. package/dist/client/blocks/library/code.js +1 -0
  341. package/dist/client/chat/message-components.d.ts +7 -0
  342. package/dist/client/chat/message-components.js +1 -1
  343. package/dist/client/chat/run-recovery.js +5 -2
  344. package/dist/client/chat/tool-call-display.js +9 -3
  345. package/dist/client/chat-first/apps-rail.js +2 -2
  346. package/dist/client/chat-model-groups.d.ts +12 -0
  347. package/dist/client/chat-model-groups.js +3 -2
  348. package/dist/client/error-format.js +12 -0
  349. package/dist/client/integrations/GoogleProductLogo.d.ts +5 -0
  350. package/dist/client/integrations/GoogleProductLogo.js +45 -0
  351. package/dist/client/integrations/index.d.ts +2 -0
  352. package/dist/client/integrations/index.js +2 -0
  353. package/dist/client/integrations/workspace-provider-oauth.d.ts +8 -0
  354. package/dist/client/integrations/workspace-provider-oauth.js +13 -0
  355. package/dist/client/navigation/index.d.ts +1 -0
  356. package/dist/client/navigation/index.js +1 -0
  357. package/dist/client/resources/mcp-integration-catalog.js +0 -29
  358. package/dist/client/route-state.js +6 -0
  359. package/dist/client/settings/SettingsTabsPage.js +10 -6
  360. package/dist/client/sharing/ShareButton.js +11 -2
  361. package/dist/client/use-chat-models.d.ts +6 -0
  362. package/dist/client/use-chat-models.js +10 -0
  363. package/dist/client/use-db-sync.js +27 -9
  364. package/dist/client/workspace-app-navigation.d.ts +10 -0
  365. package/dist/client/workspace-app-navigation.js +38 -0
  366. package/dist/collab/struct-routes.d.ts +1 -1
  367. package/dist/connections/catalog.d.ts +111 -9
  368. package/dist/connections/catalog.js +86 -30
  369. package/dist/db/create-get-db.js +18 -0
  370. package/dist/db/ddl-guard.d.ts +0 -4
  371. package/dist/db/ddl-guard.js +46 -0
  372. package/dist/deploy/build.d.ts +32 -0
  373. package/dist/deploy/build.js +241 -16
  374. package/dist/deploy/function-bundle.d.ts +45 -0
  375. package/dist/deploy/function-bundle.js +337 -0
  376. package/dist/deploy/workspace-deploy.js +19 -1
  377. package/dist/eject/workspace-connections.js +4 -0
  378. package/dist/email-catalog/registry.d.ts +4 -0
  379. package/dist/email-catalog/registry.js +79 -14
  380. package/dist/extensions/content-patch.js +14 -2
  381. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  382. package/dist/integrations/plugin.d.ts +10 -0
  383. package/dist/integrations/plugin.js +40 -6
  384. package/dist/jobs/actions/run-automation-now.d.ts +2 -1
  385. package/dist/jobs/actions/run-automation-now.js +11 -5
  386. package/dist/jobs/frontmatter.js +53 -2
  387. package/dist/jobs/run-now.d.ts +11 -1
  388. package/dist/jobs/run-now.js +42 -7
  389. package/dist/jobs/scheduler.d.ts +1 -0
  390. package/dist/jobs/scheduler.js +2 -1
  391. package/dist/localization/core-messages/ar-SA.js +4 -1
  392. package/dist/localization/core-messages/de-DE.js +4 -1
  393. package/dist/localization/core-messages/en-US.d.ts +4 -1
  394. package/dist/localization/core-messages/en-US.js +4 -1
  395. package/dist/localization/core-messages/es-ES.js +4 -1
  396. package/dist/localization/core-messages/fr-FR.js +4 -1
  397. package/dist/localization/core-messages/hi-IN.js +4 -1
  398. package/dist/localization/core-messages/ja-JP.js +4 -1
  399. package/dist/localization/core-messages/ko-KR.js +4 -1
  400. package/dist/localization/core-messages/pt-BR.js +4 -1
  401. package/dist/localization/core-messages/zh-CN.js +4 -1
  402. package/dist/localization/core-messages/zh-TW.js +4 -1
  403. package/dist/localization/core-messages.d.ts +4 -1
  404. package/dist/localization/default-messages.d.ts +2 -5
  405. package/dist/localization/default-messages.js +2 -5
  406. package/dist/mcp/build-server.d.ts +9 -0
  407. package/dist/mcp/build-server.js +37 -8
  408. package/dist/mcp-client/oauth-client.d.ts +7 -0
  409. package/dist/mcp-client/oauth-client.js +12 -1
  410. package/dist/notifications/routes.d.ts +1 -1
  411. package/dist/oauth-tokens/index.d.ts +1 -1
  412. package/dist/oauth-tokens/index.js +1 -1
  413. package/dist/oauth-tokens/lifecycle.d.ts +11 -0
  414. package/dist/oauth-tokens/lifecycle.js +17 -0
  415. package/dist/oauth-tokens/store.js +7 -0
  416. package/dist/observability/posthog-ai.d.ts +15 -1
  417. package/dist/observability/posthog-ai.js +24 -12
  418. package/dist/observability/traces.js +158 -28
  419. package/dist/onboarding/app-profile.js +2 -2
  420. package/dist/onboarding/plugin.js +10 -2
  421. package/dist/onboarding/types.d.ts +2 -0
  422. package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
  423. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  424. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  425. package/dist/provider-api/index.js +2 -0
  426. package/dist/resources/handlers.d.ts +1 -1
  427. package/dist/resources/store.js +13 -4
  428. package/dist/scripts/agent-engines/list-agent-engines.js +29 -3
  429. package/dist/scripts/db/check-scoping.js +9 -6
  430. package/dist/secrets/register-framework-secrets.js +1 -1
  431. package/dist/secrets/routes.d.ts +6 -6
  432. package/dist/server/action-discovery.js +5 -0
  433. package/dist/server/agent-chat/action-filters-a2a.d.ts +27 -3
  434. package/dist/server/agent-chat/action-filters-a2a.js +48 -9
  435. package/dist/server/agent-chat-plugin.js +36 -9
  436. package/dist/server/agent-discovery.js +43 -20
  437. package/dist/server/auth.js +18 -16
  438. package/dist/server/beta-opt-out-html.js +45 -4
  439. package/dist/server/better-auth-instance.d.ts +2 -1
  440. package/dist/server/better-auth-instance.js +23 -7
  441. package/dist/server/builder-browser.d.ts +4 -0
  442. package/dist/server/builder-browser.js +23 -1
  443. package/dist/server/builder-design-systems.d.ts +4 -1
  444. package/dist/server/builder-design-systems.js +87 -6
  445. package/dist/server/builder-oauth.d.ts +1 -7
  446. package/dist/server/builder-oauth.js +80 -163
  447. package/dist/server/core-routes-plugin.d.ts +29 -0
  448. package/dist/server/core-routes-plugin.js +113 -21
  449. package/dist/server/default-plugins.d.ts +18 -0
  450. package/dist/server/default-plugins.js +22 -0
  451. package/dist/server/edge.d.ts +1 -0
  452. package/dist/server/edge.js +1 -0
  453. package/dist/server/framework-request-handler.js +31 -3
  454. package/dist/server/google-oauth.d.ts +3 -0
  455. package/dist/server/google-oauth.js +3 -0
  456. package/dist/server/index.d.ts +4 -4
  457. package/dist/server/index.js +3 -3
  458. package/dist/server/onboarding-html.js +37 -3
  459. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  460. package/dist/server/workspace-provider-oauth.js +72 -20
  461. package/dist/shared/agent-sidebar-url.d.ts +1 -0
  462. package/dist/shared/agent-sidebar-url.js +1 -0
  463. package/dist/shared/environment-lanes.d.ts +2 -0
  464. package/dist/shared/environment-lanes.js +3 -1
  465. package/dist/shared/index.d.ts +3 -1
  466. package/dist/shared/index.js +3 -1
  467. package/dist/shared/surface-visibility.d.ts +31 -0
  468. package/dist/shared/surface-visibility.js +57 -0
  469. package/dist/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  470. package/dist/templates/chat/app/routes.ts +3 -1
  471. package/dist/templates/chat/vitest.config.ts +8 -0
  472. package/dist/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  473. package/dist/templates/default/app/routes.ts +3 -1
  474. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  475. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
  476. package/dist/tracking/registry.d.ts +11 -0
  477. package/dist/tracking/registry.js +5 -2
  478. package/dist/triggers/actions.js +10 -3
  479. package/dist/usage/store.js +23 -3
  480. package/dist/user-profile/actions/get-auth-methods.js +18 -5
  481. package/dist/vite/client.js +24 -5
  482. package/docs/content/actions-access-control.mdx +43 -4
  483. package/docs/content/actions-defining.mdx +16 -0
  484. package/docs/content/template-clips-capture-everywhere.mdx +29 -30
  485. package/docs/content/template-clips-developers.mdx +4 -4
  486. package/docs/content/template-clips.mdx +3 -1
  487. package/package.json +3 -3
  488. package/src/eject/workspace-connections.ts +4 -0
  489. package/src/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  490. package/src/templates/chat/app/routes.ts +3 -1
  491. package/src/templates/chat/vitest.config.ts +8 -0
  492. package/src/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  493. package/src/templates/default/app/routes.ts +3 -1
  494. package/src/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  495. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
  496. /package/corpus/templates/dispatch/app/routes/{apps.$appId.tsx → apps.$appId.$.tsx} +0 -0
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "Copiar diagnósticos",
32
32
  "aboutAgentNative.unknown": "Desconhecida",
33
33
  "common.agent": "Agente",
34
+ "agentPanel.mode": "Modo",
35
+ "agentPanel.uiMode": "Interface",
34
36
  "common.cancel": "Cancelar",
35
37
  "common.collapse": "Recolher",
36
38
  "common.connect": "Conectar",
@@ -406,7 +408,7 @@ const messages = {
406
408
  "errorMessages.gatewayNoDetails": "O gateway do modelo não retornou detalhes do erro, e o chat não pôde ser recuperado. Aguarde um momento e tente novamente. Se o problema persistir, inicie um novo chat.",
407
409
  "errorMessages.inactivityTimeout": "A conexão com o agente expirou antes da conclusão. Você pode continuar a partir do trabalho parcial ou tentar novamente.",
408
410
  "errorMessages.invalidToolSchema": "O esquema de uma ferramenta era inválido, então o modelo rejeitou a solicitação antes de iniciá-la. Você pode ignorar a ferramenta inválida e tentar novamente.",
409
- "errorMessages.noProviderConnected": "Nenhum provedor de LLM está conectado. Abra “Gerenciar agente” → “LLM” para este app e conecte o Builder.io ou adicione uma chave de provedor.",
411
+ "errorMessages.noProviderConnected": "Nenhum provedor de LLM está conectado. Abra Configurações > Agente > Provedores de IA e conecte o Builder.io (nível gratuito disponível) ou adicione uma chave de provedor.",
410
412
  "errorMessages.openBuilderSpaceSettings": "Abrir as configurações do espaço do Builder",
411
413
  "errorMessages.providerAuthentication": "O provedor do modelo rejeitou a chave de API salva. Atualize-a em Configurações → Integrações → Chaves de API e tente novamente.",
412
414
  "errorMessages.providerConfiguration": "Este modelo não pode usar ferramentas com as configurações atuais. Troque de modelo em Configurações e tente novamente.",
@@ -505,6 +507,7 @@ const messages = {
505
507
  "share.linkCanStillOpen": "Pessoas com o link ainda podem abrir isto.",
506
508
  "share.loading": "Carregando...",
507
509
  "share.loadMore": "Ver mais",
510
+ "share.loadFailed": "Não foi possível carregar as configurações de compartilhamento.",
508
511
  "share.loadPeopleFailed": "Não foi possível carregar pessoas.",
509
512
  "share.noAccess": "Ninguém tem acesso ainda.",
510
513
  "share.noMatches": "Nenhuma correspondência.",
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "复制诊断信息",
32
32
  "aboutAgentNative.unknown": "未知",
33
33
  "common.agent": "智能体",
34
+ "agentPanel.mode": "模式",
35
+ "agentPanel.uiMode": "界面",
34
36
  "common.cancel": "取消",
35
37
  "common.collapse": "收起",
36
38
  "common.connect": "连接",
@@ -260,7 +262,7 @@ const messages = {
260
262
  "errorMessages.gatewayNoDetails": "模型网关未返回错误详情,聊天无法恢复。请稍等片刻后重试;如果问题持续出现,请开始新聊天。",
261
263
  "errorMessages.inactivityTimeout": "智能体连接在完成前超时。您可以从已完成的部分继续,也可以重试。",
262
264
  "errorMessages.invalidToolSchema": "工具架构无效,因此模型在请求开始前拒绝了该请求。可以跳过无效工具并重试请求。",
263
- "errorMessages.noProviderConnected": "尚未连接任何 LLM 提供商。打开此应用的“管理智能体”→“LLM”,然后连接 Builder.io 或添加提供商密钥。",
265
+ "errorMessages.noProviderConnected": "尚未连接任何 LLM 提供商。打开设置 > 智能体 > AI 提供商,然后连接 Builder.io(提供免费套餐)或添加提供商密钥。",
264
266
  "errorMessages.openBuilderSpaceSettings": "打开 Builder 空间设置",
265
267
  "errorMessages.providerAuthentication": "模型提供商拒绝了已保存的 API 密钥。请在设置 → 集成 → API 密钥中更新密钥,然后重试。",
266
268
  "errorMessages.providerConfiguration": "此模型无法在当前设置下使用工具。请在设置中切换模型,然后重试。",
@@ -442,6 +444,7 @@ const messages = {
442
444
  "share.hideInSearch": "在搜索中隐藏",
443
445
  "share.linkCanStillOpen": "拥有链接的人员仍可打开此内容。",
444
446
  "share.loadMore": "加载更多",
447
+ "share.loadFailed": "无法加载共享设置。",
445
448
  "share.loadPeopleFailed": "无法加载人员。",
446
449
  "share.loading": "正在加载...",
447
450
  "share.noAccess": "尚无任何人拥有访问权限。",
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "複製診斷資訊",
32
32
  "aboutAgentNative.unknown": "未知",
33
33
  "common.agent": "代理",
34
+ "agentPanel.mode": "模式",
35
+ "agentPanel.uiMode": "介面",
34
36
  "common.cancel": "取消",
35
37
  "common.collapse": "收合",
36
38
  "common.connect": "連線",
@@ -260,7 +262,7 @@ const messages = {
260
262
  "errorMessages.gatewayNoDetails": "模型閘道未傳回錯誤詳細資訊,聊天無法復原。請稍候再試;如果問題持續發生,請開始新聊天。",
261
263
  "errorMessages.inactivityTimeout": "代理連線在完成前逾時。您可以從已完成的部分繼續,也可以重試。",
262
264
  "errorMessages.invalidToolSchema": "工具結構描述無效,因此模型在要求開始前便拒絕了要求。您可以略過無效工具並重試要求。",
263
- "errorMessages.noProviderConnected": "尚未連接任何 LLM 提供商。開啟此應用程式的「管理代理程式」→「LLM」,然後連接 Builder.io 或新增提供商金鑰。",
265
+ "errorMessages.noProviderConnected": "尚未連接任何 LLM 提供商。開啟設定 > 代理程式 > AI 提供商,然後連接 Builder.io(提供免費方案)或新增提供商金鑰。",
264
266
  "errorMessages.openBuilderSpaceSettings": "開啟 Builder 空間設定",
265
267
  "errorMessages.providerAuthentication": "模型供應商拒絕了已儲存的 API 金鑰。請在設定 → 整合 → API 金鑰中更新金鑰,然後重試。",
266
268
  "errorMessages.providerConfiguration": "這個模型無法在目前設定下使用工具。請在設定中切換模型,然後重試。",
@@ -442,6 +444,7 @@ const messages = {
442
444
  "share.hideInSearch": "在搜尋中隱藏",
443
445
  "share.linkCanStillOpen": "擁有連結的人員仍可開啟這個項目。",
444
446
  "share.loadMore": "載入更多",
447
+ "share.loadFailed": "無法載入分享設定。",
445
448
  "share.loadPeopleFailed": "無法載入人員。",
446
449
  "share.loading": "載入中...",
447
450
  "share.noAccess": "尚無任何人擁有存取權。",
@@ -33,6 +33,8 @@ export declare const englishAgentChatMessages: {
33
33
  readonly "aboutAgentNative.copyDiagnostics": "Copy diagnostics";
34
34
  readonly "aboutAgentNative.unknown": "Unknown";
35
35
  readonly "common.agent": "Agent";
36
+ readonly "agentPanel.mode": "Mode";
37
+ readonly "agentPanel.uiMode": "UI";
36
38
  readonly "common.cancel": "Cancel";
37
39
  readonly "common.collapse": "Collapse";
38
40
  readonly "common.connect": "Connect";
@@ -264,7 +266,7 @@ export declare const englishAgentChatMessages: {
264
266
  readonly "errorMessages.gatewayNoDetails": "The model gateway returned no error details and the chat couldn't recover. Wait a moment and retry, or start a new chat if it keeps happening.";
265
267
  readonly "errorMessages.inactivityTimeout": "The agent connection timed out before it could finish. You can continue from the partial work or retry.";
266
268
  readonly "errorMessages.invalidToolSchema": "A tool schema was invalid, so the model rejected the request before it started. The invalid tool can be skipped and the request retried.";
267
- readonly "errorMessages.noProviderConnected": "No LLM provider is connected. Open this app's Manage agent > LLM, then connect Builder.io or add a provider key.";
269
+ readonly "errorMessages.noProviderConnected": "No LLM provider is connected. Open Settings > Agent > AI providers, then connect Builder.io (free tier available) or add a provider key.";
268
270
  readonly "errorMessages.openBuilderSpaceSettings": "Open Builder space settings";
269
271
  readonly "errorMessages.providerAuthentication": "The model provider rejected the saved API key. Update the key in Settings → Integrations → API keys, then retry.";
270
272
  readonly "errorMessages.providerConfiguration": "This model can't use tools with the current settings. Switch models in Settings, then retry.";
@@ -449,6 +451,7 @@ export declare const englishAgentChatMessages: {
449
451
  readonly "share.linkCanStillOpen": "People with the link can still open this.";
450
452
  readonly "share.loading": "Loading...";
451
453
  readonly "share.loadMore": "Load more";
454
+ readonly "share.loadFailed": "Couldn't load sharing settings.";
452
455
  readonly "share.loadPeopleFailed": "Could not load people.";
453
456
  readonly "share.noAccess": "No one has access yet.";
454
457
  readonly "share.noMatches": "No matches.";
@@ -422,6 +422,8 @@ declare const messages: {
422
422
  downloadDesktop: string;
423
423
  chatMode: string;
424
424
  chat: string;
425
+ mode: string;
426
+ uiMode: string;
425
427
  cliTerminalMode: string;
426
428
  cli: string;
427
429
  workspaceMode: string;
@@ -1126,11 +1128,6 @@ declare const messages: {
1126
1128
  useCase: string;
1127
1129
  setupNote: string;
1128
1130
  };
1129
- googleWorkspace: {
1130
- description: string;
1131
- useCase: string;
1132
- setupNote: string;
1133
- };
1134
1131
  gitlab: {
1135
1132
  description: string;
1136
1133
  useCase: string;
@@ -428,6 +428,8 @@ const messages = {
428
428
  downloadDesktop: "Download Desktop",
429
429
  chatMode: "Chat mode",
430
430
  chat: "Chat",
431
+ mode: "Mode",
432
+ uiMode: "UI",
431
433
  cliTerminalMode: "CLI terminal mode",
432
434
  cli: "CLI",
433
435
  workspaceMode: "Files, agents, skills, and tasks",
@@ -1132,11 +1134,6 @@ const messages = {
1132
1134
  useCase: "Observability, metrics, logs, traces, dashboards",
1133
1135
  setupNote: "Grafana Cloud MCP is in public preview and requires Grafana Cloud Assistant MCP access. It is hosted Grafana Cloud only; self-hosted Grafana needs the local MCP server.",
1134
1136
  },
1135
- googleWorkspace: {
1136
- description: "Search Google Workspace data through its remote MCP server.",
1137
- useCase: "Workspace search across Gmail, Drive, Calendar, Chat, Docs, Sheets, Slides",
1138
- setupNote: "Google Workspace MCP is in Developer Preview. Enable the relevant Google Workspace and MCP APIs, configure an OAuth consent screen and client, then authorize the products you want to use.",
1139
- },
1140
1137
  gitlab: {
1141
1138
  description: "Read and manage GitLab projects, issues, and merge requests.",
1142
1139
  useCase: "Repositories, issues, merge requests, CI/CD, code analytics",
@@ -189,6 +189,15 @@ export interface MCPRequestMeta {
189
189
  * results simply fall back to their deep-link text.
190
190
  */
191
191
  export declare function isMcpAppsInlineEnabled(identity: MCPCallerIdentity | undefined): boolean;
192
+ /**
193
+ * Connector-catalog membership declared on the actions themselves.
194
+ *
195
+ * This is `mcp.connectorCatalog` with the list inverted into the action files,
196
+ * so a rename moves the declaration with the action instead of stranding a
197
+ * dead string in a plugin config. Both forms feed the same set and an app can
198
+ * run either or both while it migrates.
199
+ */
200
+ export declare function declaredMcpToolNames(actions: Record<string, ActionEntry>): string[];
192
201
  export declare function isAuthenticatedReadAction(entry: ActionEntry): boolean;
193
202
  export declare function isAutoReadExcludedActionName(name: string): boolean;
194
203
  /**
@@ -18,6 +18,7 @@
18
18
  * — it can be bundled into the serverless function alongside `mountMCP`.
19
19
  */
20
20
  import { MCP_APP_EXTENSION_ID, MCP_APP_MIME_TYPE, MCP_APP_RESOURCE_URI_META_KEY, } from "../action.js";
21
+ import { isActionExposedToExternalAgents } from "../action.js";
21
22
  import { isMcpActionResult } from "../mcp-client/app-result.js";
22
23
  import { getConfiguredAppBasePath } from "../server/app-base-path.js";
23
24
  import { buildDeepLink, toAbsoluteOpenUrl, toDesktopOpenUrl, toVsCodeOpenUrl, } from "../server/deep-link.js";
@@ -177,6 +178,34 @@ function scopeToolSearchToAdvertised(advertised) {
177
178
  },
178
179
  };
179
180
  }
181
+ /**
182
+ * Drop every action this request's surface must not reach at all.
183
+ *
184
+ * Applied to `actions` — the whole surface this request can reach — and not
185
+ * just to the advertised listing, because on the `--full-catalog` tier
186
+ * `actions` IS the callable set (see the `tools/call` handler below). An
187
+ * external-agent opt-out that only hid the schema would leave the action
188
+ * callable by name, which is the same "hidden but reachable" bug the
189
+ * `withoutToolSearch` comment above exists to prevent.
190
+ *
191
+ * The in-app agent never comes through here, so its tool list is unaffected.
192
+ */
193
+ function withoutExternalOptOuts(actions) {
194
+ return Object.fromEntries(Object.entries(actions).filter(([, entry]) => isActionExposedToExternalAgents(entry)));
195
+ }
196
+ /**
197
+ * Connector-catalog membership declared on the actions themselves.
198
+ *
199
+ * This is `mcp.connectorCatalog` with the list inverted into the action files,
200
+ * so a rename moves the declaration with the action instead of stranding a
201
+ * dead string in a plugin config. Both forms feed the same set and an app can
202
+ * run either or both while it migrates.
203
+ */
204
+ export function declaredMcpToolNames(actions) {
205
+ return Object.entries(actions)
206
+ .filter(([, entry]) => entry.mcpTool === true)
207
+ .map(([name]) => name);
208
+ }
180
209
  const COMPACT_MCP_APP_CATALOG_BUILTINS = new Set([
181
210
  "list_apps",
182
211
  "open_app",
@@ -1170,9 +1199,7 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
1170
1199
  // Strip from `actions`, not just the advertised set: on the full-catalog tier
1171
1200
  // `actions` IS the callable surface, so filtering only the listing would
1172
1201
  // leave `tool-search` callable but invisible.
1173
- const actions = flatCatalog
1174
- ? withoutToolSearch(mergedActions)
1175
- : mergedActions;
1202
+ const actions = withoutExternalOptOuts(flatCatalog ? withoutToolSearch(mergedActions) : mergedActions);
1176
1203
  const visibleActions = Object.fromEntries(Object.entries(actions).filter(([, entry]) => isActionVisibleForOAuthScope(entry, effectiveIdentity?.oauthScopes)));
1177
1204
  // Compact/connector is the DEFAULT for every caller — hosted connectors,
1178
1205
  // code clients (Claude Code / Cursor / Codex), and the local CLI alike. The
@@ -1187,15 +1214,17 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
1187
1214
  const autoReadNames = autoAuthenticatedReadNames(visibleActions, config);
1188
1215
  const connectorNames = new Set([
1189
1216
  ...(config.connectorCatalog ?? []),
1217
+ ...declaredMcpToolNames(visibleActions),
1190
1218
  ...autoReadNames,
1191
1219
  ]);
1192
1220
  const denyNames = externalAgentDenySet(config);
1193
1221
  const automaticConnectorPolicyActive = config.externalAgents?.authenticatedReads === "auto";
1194
- // Connector-catalog tier: when a template declares a connector allow-list,
1195
- // serve exactly that curated surface plus any explicitly annotated
1196
- // authenticated reads from `externalAgents.authenticatedReads: "auto"`.
1197
- // This stays compact by default and keeps db-exec / seed-* / extension /
1198
- // browser-session footguns off the external surface.
1222
+ // Connector-catalog tier: when a template declares a connector allow-list —
1223
+ // as `mcp.connectorCatalog` names or as `mcpTool: true` on the actions
1224
+ // themselves — serve exactly that curated surface plus any explicitly
1225
+ // annotated authenticated reads from `externalAgents.authenticatedReads:
1226
+ // "auto"`. This stays compact by default and keeps db-exec / seed-* /
1227
+ // extension / browser-session footguns off the external surface.
1199
1228
  const connectorCatalogActive = !appCatalog &&
1200
1229
  (connectorNames.size > 0 || automaticConnectorPolicyActive) &&
1201
1230
  !fullCatalogRequested;
@@ -74,6 +74,7 @@ export declare class McpOAuthClientProvider implements OAuthClientProvider {
74
74
  }
75
75
  export declare function startMcpOAuthAuthorization(options: McpOAuthProviderOptions & {
76
76
  scope?: string;
77
+ resourceMetadataUrl?: string;
77
78
  }): Promise<McpOAuthStartResult>;
78
79
  export declare function finishMcpOAuthAuthorization(options: McpOAuthProviderOptions & {
79
80
  authorizationCode: string;
@@ -99,6 +100,12 @@ export declare function getMcpOAuthConnectionState(options: {
99
100
  scopeId: string;
100
101
  serverUrl: string;
101
102
  }): Promise<OAuthCredentialState<McpOAuthCredentialBundle>>;
103
+ export declare function markMcpOAuthReconnectRequired(options: {
104
+ key: string;
105
+ scope: "user" | "org";
106
+ scopeId: string;
107
+ serverUrl: string;
108
+ }): Promise<boolean>;
102
109
  export declare function deleteMcpOAuthCredentials(options: {
103
110
  key: string;
104
111
  scope: "user" | "org";
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import { auth, refreshAuthorization, validateAuthorizationResponseIssuer, } from "@modelcontextprotocol/client";
10
10
  import { ssrfSafeFetch } from "../extensions/url-safety.js";
11
- import { readOAuthCredentialState, resolveOAuthCredentialAccess, revokeOAuthCredential, saveOAuthCredential, } from "../oauth-tokens/lifecycle.js";
11
+ import { readOAuthCredentialState, resolveOAuthCredentialAccess, markOAuthReconnectRequired, revokeOAuthCredential, saveOAuthCredential, } from "../oauth-tokens/lifecycle.js";
12
12
  import { validateRemoteUrl } from "./remote-url.js";
13
13
  const TOKEN_EXPIRY_SKEW_MS = 60_000;
14
14
  const MAX_OAUTH_REDIRECTS = 5;
@@ -312,6 +312,9 @@ export async function startMcpOAuthAuthorization(options) {
312
312
  const result = await auth(provider, {
313
313
  serverUrl: options.serverUrl,
314
314
  scope: options.scope,
315
+ ...(options.resourceMetadataUrl
316
+ ? { resourceMetadataUrl: new URL(options.resourceMetadataUrl) }
317
+ : {}),
315
318
  fetchFn: guardedOAuthFetch(),
316
319
  });
317
320
  if (result !== "REDIRECT" || !provider.authorizationRedirect) {
@@ -408,6 +411,14 @@ export async function getMcpOAuthConnectionState(options) {
408
411
  validateCredential: (credential) => serverUrlsMatch(credential.serverUrl, serverUrl),
409
412
  });
410
413
  }
414
+ export async function markMcpOAuthReconnectRequired(options) {
415
+ const serverUrl = canonicalServerUrl(options.serverUrl);
416
+ return markOAuthReconnectRequired(credentialIdentity({ ...options, serverUrl }), {
417
+ allowLegacy: true,
418
+ legacyAccountKey: true,
419
+ validateCredential: (credential) => serverUrlsMatch(credential.serverUrl, serverUrl),
420
+ });
421
+ }
411
422
  export async function deleteMcpOAuthCredentials(options) {
412
423
  if (!options.serverUrl)
413
424
  return false;
@@ -28,6 +28,6 @@ export declare function createNotificationsHandler(): import("h3").EventHandlerW
28
28
  } | {
29
29
  count?: undefined;
30
30
  updated?: undefined;
31
- error?: undefined;
32
31
  ok: boolean;
32
+ error?: undefined;
33
33
  }>>;
@@ -1,3 +1,3 @@
1
1
  export { getOAuthTokens, getOAuthTokenSnapshot, OAuthAccountOwnedByOtherUserError, saveOAuthTokens, replaceOAuthTokensIfRevision, deleteOAuthTokens, deleteOAuthTokensIfRevision, listOAuthAccounts, listOAuthAccountsByOwner, hasOAuthTokens, setOAuthDisplayName, } from "./store.js";
2
- export { readOAuthCredentialState, resolveOAuthCredentialAccess, revokeOAuthCredential, saveOAuthCredential, type OAuthCredential, type OAuthCredentialIdentity, type OAuthCredentialOwner, type OAuthCredentialState, type OAuthRevocationResult, } from "./lifecycle.js";
2
+ export { readOAuthCredentialState, resolveOAuthCredentialAccess, markOAuthReconnectRequired, revokeOAuthCredential, saveOAuthCredential, type OAuthCredential, type OAuthCredentialIdentity, type OAuthCredentialOwner, type OAuthCredentialState, type OAuthRevocationResult, } from "./lifecycle.js";
3
3
  export { refreshExpiringGoogleTokens, startGoogleTokenRefreshLoop, } from "./google-refresh.js";
@@ -1,3 +1,3 @@
1
1
  export { getOAuthTokens, getOAuthTokenSnapshot, OAuthAccountOwnedByOtherUserError, saveOAuthTokens, replaceOAuthTokensIfRevision, deleteOAuthTokens, deleteOAuthTokensIfRevision, listOAuthAccounts, listOAuthAccountsByOwner, hasOAuthTokens, setOAuthDisplayName, } from "./store.js";
2
- export { readOAuthCredentialState, resolveOAuthCredentialAccess, revokeOAuthCredential, saveOAuthCredential, } from "./lifecycle.js";
2
+ export { readOAuthCredentialState, resolveOAuthCredentialAccess, markOAuthReconnectRequired, revokeOAuthCredential, saveOAuthCredential, } from "./lifecycle.js";
3
3
  export { refreshExpiringGoogleTokens, startGoogleTokenRefreshLoop, } from "./google-refresh.js";
@@ -67,6 +67,17 @@ export declare function readOAuthCredentialState<T extends OAuthCredential = OAu
67
67
  now?: number;
68
68
  validateCredential?: (credential: T) => boolean;
69
69
  }): Promise<OAuthCredentialState<T>>;
70
+ /**
71
+ * Force a stored credential into `reconnect_required` without a refresh attempt.
72
+ * For a token the provider rejected server-side (e.g. a 401/403) while it still
73
+ * looks valid locally, so the credential itself carries the reconnect signal
74
+ * instead of a side channel. Returns false when there is nothing to mark.
75
+ */
76
+ export declare function markOAuthReconnectRequired<T extends OAuthCredential = OAuthCredential>(identity: OAuthCredentialIdentity, options?: {
77
+ allowLegacy?: boolean;
78
+ legacyAccountKey?: boolean;
79
+ validateCredential?: (credential: T) => boolean;
80
+ }): Promise<boolean>;
70
81
  export declare function resolveOAuthCredentialAccess<T extends OAuthCredential = OAuthCredential>(identity: OAuthCredentialIdentity, options: {
71
82
  refresh: (context: OAuthRefreshContext<T>) => Promise<T>;
72
83
  allowLegacy?: boolean;
@@ -232,6 +232,23 @@ export async function readOAuthCredentialState(identity, options = {}) {
232
232
  async function markReconnectRequired(identity, snapshot, legacyAccountKey) {
233
233
  await replaceOAuthTokensIfRevision(identity.provider, storageAccountId(identity, legacyAccountKey), snapshot.storageOwner, snapshot.revision, snapshot.legacyRevision, snapshot.storageVersion, withLifecycle(identity, snapshot.credential, "refresh_failed"));
234
234
  }
235
+ /**
236
+ * Force a stored credential into `reconnect_required` without a refresh attempt.
237
+ * For a token the provider rejected server-side (e.g. a 401/403) while it still
238
+ * looks valid locally, so the credential itself carries the reconnect signal
239
+ * instead of a side channel. Returns false when there is nothing to mark.
240
+ */
241
+ export async function markOAuthReconnectRequired(identity, options = {}) {
242
+ const stored = await readStoredOAuthCredentialState(identity, {
243
+ allowLegacy: options.allowLegacy,
244
+ legacyAccountKey: options.legacyAccountKey,
245
+ validateCredential: options.validateCredential,
246
+ });
247
+ if (stored.kind === "missing" || stored.kind === "malformed")
248
+ return false;
249
+ await markReconnectRequired(identity, stored, options.legacyAccountKey === true);
250
+ return true;
251
+ }
235
252
  export async function resolveOAuthCredentialAccess(identity, options) {
236
253
  assertIdentity(identity);
237
254
  const dependencies = { ...defaultDependencies, ...options.dependencies };
@@ -318,6 +318,13 @@ export async function saveOAuthTokens(provider, accountId, tokens, owner) {
318
318
  ...(existingTokens ?? {}),
319
319
  ...cleanedIncomingTokens,
320
320
  };
321
+ const existingScope = existingTokens?.scope;
322
+ const incomingScope = cleanedIncomingTokens.scope;
323
+ if (typeof existingScope === "string" && typeof incomingScope === "string") {
324
+ tokensToStore.scope = Array.from(new Set(`${existingScope} ${incomingScope}`
325
+ .split(/[\s,]+/)
326
+ .filter((scope) => scope.length > 0))).join(" ");
327
+ }
321
328
  const result = await client.execute({
322
329
  sql: isPostgres()
323
330
  ? `INSERT INTO ${table} (provider, account_id, owner, display_name, tokens, updated_at, revision) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT (provider, account_id) DO UPDATE SET owner=EXCLUDED.owner, display_name=COALESCE(EXCLUDED.display_name, ${table}.display_name), tokens=EXCLUDED.tokens, updated_at=EXCLUDED.updated_at, revision=GREATEST(COALESCE(${table}.revision, 0) + 1, EXCLUDED.revision) WHERE ${table}.owner = EXCLUDED.owner OR (LOWER(${table}.owner) = LOWER(EXCLUDED.owner) AND LOWER(${table}.owner) LIKE 'user:%' AND LOWER(EXCLUDED.owner) LIKE 'user:%')`
@@ -12,6 +12,18 @@
12
12
  * PostHog's `$session_id`: the latter is the browser session used for session
13
13
  * replay, and the two are different lifetimes.
14
14
  *
15
+ * PostHog DERIVES a trace's latency, tokens and cost from its children — its
16
+ * trace query sums `$ai_latency` over every event whose `$ai_parent_id` is the
17
+ * trace or absent, and sums tokens/cost over `$ai_generation` / `$ai_embedding`
18
+ * only. So the `$ai_trace` event carries none of those: an `$ai_latency` here
19
+ * was counted *in addition to* the generation's and reported roughly twice the
20
+ * real duration. Run totals ride along under plain names for the non-PostHog
21
+ * backends, which have no such aggregation.
22
+ *
23
+ * Custom properties do NOT take an `$ai_` prefix. That namespace is PostHog's
24
+ * schema, and a name it does not define today it may define tomorrow with
25
+ * different meaning — `input_truncated` / `spans_dropped` cannot collide.
26
+ *
15
27
  * Content (`$ai_input` / `$ai_output_choices` / `$ai_input_state` /
16
28
  * `$ai_output_state`) is gated on config and always OMITTED when disabled.
17
29
  * Sending `[]` instead would be indistinguishable from a run that genuinely had
@@ -49,7 +61,9 @@ export interface AiTraceEventInput {
49
61
  spanName: string;
50
62
  model: string;
51
63
  provider: string;
52
- latencySeconds: number;
64
+ /** Wall-clock duration of the whole run. Reported under `duration_ms`, not
65
+ * `$ai_latency` — see the aggregation note at the top of this file. */
66
+ durationMs: number;
53
67
  isError: boolean;
54
68
  error?: AiErrorDetail;
55
69
  inputTokens?: number;
@@ -12,6 +12,18 @@
12
12
  * PostHog's `$session_id`: the latter is the browser session used for session
13
13
  * replay, and the two are different lifetimes.
14
14
  *
15
+ * PostHog DERIVES a trace's latency, tokens and cost from its children — its
16
+ * trace query sums `$ai_latency` over every event whose `$ai_parent_id` is the
17
+ * trace or absent, and sums tokens/cost over `$ai_generation` / `$ai_embedding`
18
+ * only. So the `$ai_trace` event carries none of those: an `$ai_latency` here
19
+ * was counted *in addition to* the generation's and reported roughly twice the
20
+ * real duration. Run totals ride along under plain names for the non-PostHog
21
+ * backends, which have no such aggregation.
22
+ *
23
+ * Custom properties do NOT take an `$ai_` prefix. That namespace is PostHog's
24
+ * schema, and a name it does not define today it may define tomorrow with
25
+ * different meaning — `input_truncated` / `spans_dropped` cannot collide.
26
+ *
15
27
  * Content (`$ai_input` / `$ai_output_choices` / `$ai_input_state` /
16
28
  * `$ai_output_state`) is gated on config and always OMITTED when disabled.
17
29
  * Sending `[]` instead would be indistinguishable from a run that genuinely had
@@ -26,7 +38,7 @@ import { boundedText } from "../tracking/redaction.js";
26
38
  export const MAX_AI_CONTENT_BYTES = 128 * 1024;
27
39
  /** Hard ceiling on emitted `$ai_span` events per run. */
28
40
  export const MAX_AI_SPANS_PER_RUN = 100;
29
- function trackAiEvent(name, properties, userId) {
41
+ function trackAiEvent(name, properties, userId, occurredAt) {
30
42
  for (const key of Object.keys(properties)) {
31
43
  if (properties[key] === undefined)
32
44
  delete properties[key];
@@ -34,7 +46,7 @@ function trackAiEvent(name, properties, userId) {
34
46
  try {
35
47
  void import("../tracking/registry.js")
36
48
  .then(({ track }) => {
37
- track(name, properties, { userId: userId ?? undefined });
49
+ track(name, properties, { userId: userId ?? undefined, occurredAt });
38
50
  })
39
51
  .catch(() => { });
40
52
  // coercion-ok: a throw here would break the run it is observing
@@ -84,19 +96,19 @@ export function emitAiTraceEvent(input) {
84
96
  $ai_span_name: input.spanName,
85
97
  $ai_model: input.model,
86
98
  $ai_provider: input.provider,
87
- $ai_latency: input.latencySeconds,
88
99
  $ai_is_error: input.isError,
89
100
  $ai_error: input.error,
90
- $ai_input_tokens: input.inputTokens,
91
- $ai_output_tokens: input.outputTokens,
92
- $ai_total_cost_usd: input.costUsd,
101
+ duration_ms: Math.round(input.durationMs),
102
+ input_tokens: input.inputTokens,
103
+ output_tokens: input.outputTokens,
104
+ cost_usd: input.costUsd,
93
105
  $ai_input_state: inputContent?.value,
94
106
  $ai_output_state: outputContent?.value,
95
- $ai_input_truncated: inputContent?.truncated || undefined,
96
- $ai_output_truncated: outputContent?.truncated || undefined,
107
+ input_truncated: inputContent?.truncated || undefined,
108
+ output_truncated: outputContent?.truncated || undefined,
97
109
  $session_id: input.browserSessionId,
98
110
  created_at: new Date(input.createdAt).toISOString(),
99
- }, input.userId);
111
+ }, input.userId, input.createdAt);
100
112
  }
101
113
  export function emitAiSpanEvent(input) {
102
114
  const inputContent = input.inputState === undefined
@@ -117,11 +129,11 @@ export function emitAiSpanEvent(input) {
117
129
  $ai_error: input.error,
118
130
  $ai_input_state: inputContent?.value,
119
131
  $ai_output_state: outputContent?.value,
120
- $ai_input_truncated: inputContent?.truncated || undefined,
121
- $ai_output_truncated: outputContent?.truncated || undefined,
132
+ input_truncated: inputContent?.truncated || undefined,
133
+ output_truncated: outputContent?.truncated || undefined,
122
134
  $session_id: input.browserSessionId,
123
135
  created_at: new Date(input.createdAt).toISOString(),
124
- }, input.userId);
136
+ }, input.userId, input.createdAt);
125
137
  }
126
138
  /**
127
139
  * Emit PostHog's documented manual feedback event for an LLM trace.