@agent-native/core 0.169.1 → 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 (459) 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/query-agent-native-analytics.ts +1 -1
  6. package/corpus/templates/analytics/app/i18n-data.ts +28 -0
  7. package/corpus/templates/analytics/app/pages/Agents.tsx +25 -1
  8. package/corpus/templates/analytics/app/routes/$.tsx +10 -0
  9. package/corpus/templates/analytics/app/routes.ts +3 -1
  10. package/corpus/templates/analytics/changelog/2026-08-22-fixed-the-agent-native-templates-first-party-dashboard-panel.md +6 -0
  11. package/corpus/templates/analytics/changelog/2026-08-22-org-admin-panels-no-longer-report-a-database-error-as-a-per.md +9 -0
  12. package/corpus/templates/analytics/changelog/2026-08-22-slack-requests-report-invalid-inputs.md +6 -0
  13. package/corpus/templates/analytics/changelog/2026-08-22-unknown-analytics-links-now-return-a-real-not-found-status.md +6 -0
  14. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +2 -1
  15. package/corpus/templates/analytics/docs/schemas/tracked-events.md +2 -0
  16. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +29 -7
  17. package/corpus/templates/analytics/server/handlers/slack.ts +59 -5
  18. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +11 -6
  19. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +132 -2
  20. package/corpus/templates/analytics/server/lib/slack.ts +4 -2
  21. package/corpus/templates/analytics/vitest.config.ts +6 -1
  22. package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +11 -4
  23. package/corpus/templates/assets/app/routes/library.tsx +5 -3
  24. package/corpus/templates/assets/app/routes.ts +3 -1
  25. package/corpus/templates/assets/changelog/2026-08-22-library-page-loads-again-instead-of-crashing-on-open.md +6 -0
  26. package/corpus/templates/assets/vitest.config.ts +6 -1
  27. package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +11 -4
  28. package/corpus/templates/brain/app/components/ui/pointer-lock.ts +1 -0
  29. package/corpus/templates/brain/app/routes/sources.tsx +8 -3
  30. package/corpus/templates/brain/changelog/2026-08-22-tuning-or-adding-a-source-no-longer-leaves-the-sources-page.md +6 -0
  31. package/corpus/templates/brain/vitest.config.ts +1 -0
  32. package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +11 -4
  33. package/corpus/templates/calendar/actions/list-booking-links.ts +83 -4
  34. package/corpus/templates/calendar/actions/update-booking-link.ts +4 -3
  35. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +11 -3
  36. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +1 -1
  37. package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +103 -44
  38. package/corpus/templates/calendar/app/components/calendar/OutOfOfficeEvent.tsx +28 -24
  39. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +9 -2
  40. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +47 -58
  41. package/corpus/templates/calendar/app/hooks/use-booking-links.ts +5 -1
  42. package/corpus/templates/calendar/app/lib/event-layout.ts +52 -26
  43. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +126 -98
  44. package/corpus/templates/calendar/app/pages/CalendarView.tsx +1 -0
  45. package/corpus/templates/calendar/app/pages/Settings.tsx +88 -81
  46. package/corpus/templates/calendar/app/routes.ts +3 -1
  47. package/corpus/templates/calendar/changelog/2026-08-22-booking-link-visibility-respects-shared-access.md +6 -0
  48. package/corpus/templates/calendar/changelog/2026-08-22-clicking-an-out-of-office-event-s-marker-no-longer-creates-a.md +6 -0
  49. package/corpus/templates/calendar/changelog/2026-08-22-event-detail-views-now-show-your-calendar-timezone.md +6 -0
  50. package/corpus/templates/calendar/changelog/2026-08-22-google-calendar-can-now-connect-with-the-shared-google-oauth.md +6 -0
  51. package/corpus/templates/calendar/changelog/2026-08-22-overlapping-events-now-show-each-others-boundaries.md +6 -0
  52. package/corpus/templates/calendar/changelog/2026-08-22-public-booking-pages-now-offer-time-slots-from-the-host-s-we.md +6 -0
  53. package/corpus/templates/calendar/server/handlers/bookings.ts +5 -7
  54. package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -2
  55. package/corpus/templates/calendar/server/lib/google-calendar.ts +139 -14
  56. package/corpus/templates/calendar/server/onboarding.ts +85 -0
  57. package/corpus/templates/calendar/server/plugins/agent-chat.ts +2 -0
  58. package/corpus/templates/calendar/shared/api.ts +9 -1
  59. package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  60. package/corpus/templates/chat/app/routes.ts +3 -1
  61. package/corpus/templates/chat/vitest.config.ts +8 -0
  62. package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +11 -4
  63. package/corpus/templates/clips/actions/get-meeting.ts +9 -4
  64. package/corpus/templates/clips/actions/list-recordings.ts +16 -3
  65. package/corpus/templates/clips/actions/search-meetings.ts +1 -0
  66. package/corpus/templates/clips/actions/view-screen.ts +8 -1
  67. package/corpus/templates/clips/app/components/meetings/meeting-history-row.tsx +32 -1
  68. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +1 -1
  69. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +29 -1
  70. package/corpus/templates/clips/app/i18n/en-US.ts +5 -0
  71. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +33 -4
  72. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +1 -0
  73. package/corpus/templates/clips/app/routes/access-request.approve.tsx +16 -9
  74. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +17 -7
  75. package/corpus/templates/clips/app/routes/share.$shareId.tsx +17 -7
  76. package/corpus/templates/clips/changelog/2026-08-21-camera-bubble-black-circle.md +6 -0
  77. package/corpus/templates/clips/changelog/2026-08-22-screen-recordings-respect-the-microphone-toggle.md +6 -0
  78. package/corpus/templates/clips/changelog/2026-08-22-the-recordings-library-no-longer-fails-right-after-server-start.md +6 -0
  79. package/corpus/templates/clips/changelog/2026-08-23-the-agent-can-see-your-library-right-after-server-start.md +6 -0
  80. package/corpus/templates/clips/chrome-extension/src/background.ts +1 -2
  81. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +39 -7
  82. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +21 -25
  83. package/corpus/templates/clips/desktop/src/app.tsx +53 -24
  84. package/corpus/templates/clips/desktop/src/lib/bubble-playback.ts +68 -0
  85. package/corpus/templates/clips/desktop/src/lib/recorder.ts +3 -0
  86. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +72 -14
  87. package/corpus/templates/clips/desktop/src/lib/updater.ts +8 -3
  88. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +162 -20
  89. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +43 -6
  90. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +150 -13
  91. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +12 -0
  92. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +28 -3
  93. package/corpus/templates/clips/server/lib/emails.ts +17 -33
  94. package/corpus/templates/content/.agents/skills/secrets/SKILL.md +11 -4
  95. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +140 -15
  96. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +12 -14
  97. package/corpus/templates/content/app/components/ui/pointer-lock.ts +1 -0
  98. package/corpus/templates/content/app/hooks/use-content-database.ts +18 -2
  99. package/corpus/templates/content/app/hooks/use-local-storage.ts +38 -22
  100. package/corpus/templates/content/app/i18n-data.ts +25 -0
  101. package/corpus/templates/content/app/routes.ts +3 -1
  102. package/corpus/templates/content/changelog/2026-08-22-code-blocks-inserted-from-the-slash-menu-no-longer-get-stuck.md +6 -0
  103. package/corpus/templates/content/changelog/2026-08-22-the-sidebar-page-tree-no-longer-flashes-empty-after-creating-a-page.md +6 -0
  104. package/corpus/templates/content/docs/solutions/2026-08-21-content-mermaid-rendering-shape.md +233 -0
  105. package/corpus/templates/content/server/plugins/agent-chat.ts +9 -2
  106. package/corpus/templates/content/vitest.config.ts +7 -1
  107. package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +11 -4
  108. package/corpus/templates/design/.agents/skills/secrets/SKILL.md +11 -4
  109. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +1383 -88
  110. package/corpus/templates/design/actions/generate-design.ts +98 -47
  111. package/corpus/templates/design/actions/get-design-system.ts +6 -1
  112. package/corpus/templates/design/actions/refresh-design-system-with-builder.ts +146 -0
  113. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +70 -26
  114. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +284 -136
  115. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2057 -141
  116. package/corpus/templates/design/app/components/design/editor/DesignBottomToolbar.tsx +6 -2
  117. package/corpus/templates/design/app/components/design/editor/DesignWorkspaceRail.tsx +4 -4
  118. package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +10 -1
  119. package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +19 -2
  120. package/corpus/templates/design/app/components/design/multi-screen/types.ts +9 -2
  121. package/corpus/templates/design/app/components/layout/Header.tsx +15 -0
  122. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -2
  123. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +11 -4
  124. package/corpus/templates/design/app/i18n-data.ts +1 -0
  125. package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +12 -0
  126. package/corpus/templates/design/app/lib/design-system-data.ts +68 -0
  127. package/corpus/templates/design/app/pages/DesignEditor.tsx +77 -35
  128. package/corpus/templates/design/app/pages/DesignSystems.tsx +136 -42
  129. package/corpus/templates/design/app/pages/Index.tsx +2 -0
  130. package/corpus/templates/design/app/pages/Templates.tsx +0 -10
  131. package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +10 -0
  132. package/corpus/templates/design/app/pages/design-editor/collab-sync.ts +50 -0
  133. package/corpus/templates/design/app/pages/design-editor/commands/apply-design-editor-command.ts +1 -1
  134. package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +10 -8
  135. package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +6 -6
  136. package/corpus/templates/design/app/pages/design-editor/commands/apply-pending-visual-styles-with-agent.ts +1 -1
  137. package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +18 -7
  138. package/corpus/templates/design/app/pages/design-editor/commands/escape-hotkey.ts +4 -90
  139. package/corpus/templates/design/app/pages/design-editor/commands/layer-marquee-selection-change.ts +2 -1
  140. package/corpus/templates/design/app/pages/design-editor/commands/layer-selection-change.ts +4 -3
  141. package/corpus/templates/design/app/pages/design-editor/commands/screen-element-select.ts +12 -2
  142. package/corpus/templates/design/app/pages/design-editor/commands/screen-visual-style-change.ts +9 -2
  143. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-move-semantic-handoff.ts +1 -1
  144. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-semantic-handoff.ts +1 -1
  145. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-state-semantic-handoff.ts +1 -1
  146. package/corpus/templates/design/app/pages/design-editor/commands/start-sidebar-resize.ts +1 -1
  147. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +11 -1
  148. package/corpus/templates/design/app/pages/design-editor/effects/adopt-db-file-content.ts +11 -19
  149. package/corpus/templates/design/app/pages/design-editor/effects/observe-collab-text.ts +6 -6
  150. package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +1 -1
  151. package/corpus/templates/design/app/pages/design-editor/effects/seed-collab-content.ts +12 -15
  152. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +5 -59
  153. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +8 -0
  154. package/corpus/templates/design/app/pages/design-editor/types.ts +3 -3
  155. package/corpus/templates/design/app/routes.ts +3 -1
  156. package/corpus/templates/design/changelog/2026-08-20-canvas-edits-patch-the-frame-instead-of-rebuilding-it.md +6 -0
  157. package/corpus/templates/design/changelog/2026-08-21-builder-design-system-imports-reconcile-after-indexing.md +6 -0
  158. package/corpus/templates/design/changelog/2026-08-21-draw-mode-needs-shift-y.md +6 -0
  159. package/corpus/templates/design/changelog/2026-08-21-eyedropper-shortcut.md +6 -0
  160. package/corpus/templates/design/changelog/2026-08-21-figma-style-alignment-guides-and-snapping.md +6 -0
  161. package/corpus/templates/design/changelog/2026-08-21-group-transforms-keep-the-selection.md +6 -0
  162. package/corpus/templates/design/changelog/2026-08-21-inspector-fields-keep-focus-on-enter.md +6 -0
  163. package/corpus/templates/design/changelog/2026-08-21-pen-alt-keeps-the-incoming-handle.md +6 -0
  164. package/corpus/templates/design/changelog/2026-08-21-pen-on-the-board-creates-one-vector.md +6 -0
  165. package/corpus/templates/design/changelog/2026-08-21-scale-a-multi-selection-from-the-group-handles.md +6 -0
  166. package/corpus/templates/design/changelog/2026-08-21-scale-resizes-text-with-the-object.md +6 -0
  167. package/corpus/templates/design/changelog/2026-08-21-selecting-another-object-keeps-the-scale-tool-armed.md +6 -0
  168. package/corpus/templates/design/changelog/2026-08-21-the-shape-tool-remembers-the-shape-you-picked.md +6 -0
  169. package/corpus/templates/design/changelog/2026-08-21-vectors-drawn-in-a-frame-land-where-you-drew-them.md +6 -0
  170. package/corpus/templates/design/changelog/2026-08-22-multi-screen-generation-no-longer-loses-a-saved-screens-layo.md +6 -0
  171. package/corpus/templates/design/changelog/2026-08-22-rename-and-search-fields-are-labeled-for-screen-readers.md +6 -0
  172. package/corpus/templates/design/package.json +2 -0
  173. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +311 -0
  174. package/corpus/templates/design/shared/canvas-math.ts +612 -206
  175. package/corpus/templates/design/shared/pen-path.ts +37 -0
  176. package/corpus/templates/design/vitest.config.ts +7 -1
  177. package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +11 -4
  178. package/corpus/templates/dispatch/actions/list-workspace-connections.ts +34 -3
  179. package/corpus/templates/dispatch/app/routes/integrations.tsx +55 -21
  180. package/corpus/templates/dispatch/app/routes.ts +3 -1
  181. package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +11 -4
  182. package/corpus/templates/factory/.env.example +2 -7
  183. package/corpus/templates/factory/AGENTS.md +3 -0
  184. package/corpus/templates/factory/README.md +5 -3
  185. package/corpus/templates/factory/actions/create-factory.ts +16 -3
  186. package/corpus/templates/factory/actions/get-slack-feedback-context.ts +2 -0
  187. package/corpus/templates/factory/actions/get-triage-item.ts +2 -0
  188. package/corpus/templates/factory/actions/list-factory-audit.ts +116 -36
  189. package/corpus/templates/factory/actions/list-factory-automations.ts +2 -1
  190. package/corpus/templates/factory/actions/list-triage-items.ts +22 -19
  191. package/corpus/templates/factory/actions/run-factory-automation.ts +7 -3
  192. package/corpus/templates/factory/actions/save-factory-automation.ts +5 -2
  193. package/corpus/templates/factory/actions/save-triage-config.ts +2 -8
  194. package/corpus/templates/factory/actions/start-builder-for-item.ts +21 -0
  195. package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +229 -297
  196. package/corpus/templates/factory/app/components/factory/FactorySettingsView.tsx +397 -247
  197. package/corpus/templates/factory/app/components/factory/FactorySourceSettingsGroup.tsx +33 -0
  198. package/corpus/templates/factory/app/components/factory/NewFactoryForm.tsx +202 -162
  199. package/corpus/templates/factory/app/i18n/en-US.ts +32 -4
  200. package/corpus/templates/factory/app/routes/factory.tsx +84 -11
  201. package/corpus/templates/factory/app/routes.ts +3 -1
  202. package/corpus/templates/factory/changelog/2026-08-21-activity-runs-use-automation-display-names.md +6 -0
  203. package/corpus/templates/factory/changelog/2026-08-21-create-and-settings-source-cards.md +6 -0
  204. package/corpus/templates/factory/changelog/2026-08-21-keep-automations-visible-while-running.md +6 -0
  205. package/corpus/templates/factory/changelog/2026-08-21-nested-factory-automations-can-poll.md +6 -0
  206. package/corpus/templates/factory/changelog/2026-08-21-settings-sticky-unsaved-bar.md +6 -0
  207. package/corpus/templates/factory/server/connectors/credentials.ts +10 -5
  208. package/corpus/templates/factory/server/lib/factory-audit-report.ts +412 -0
  209. package/corpus/templates/factory/server/lib/factory-config-reconcile.ts +321 -0
  210. package/corpus/templates/factory/server/lib/factory-scope.ts +25 -2
  211. package/corpus/templates/factory/server/lib/require-factory-automation.ts +13 -4
  212. package/corpus/templates/factory/server/plugins/factory-migrations.ts +148 -4
  213. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +4 -6
  214. package/corpus/templates/factory/vitest.config.ts +17 -2
  215. package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +11 -4
  216. package/corpus/templates/forms/app/routes/_app.settings.tsx +4 -1
  217. package/corpus/templates/forms/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  218. package/corpus/templates/forms/server/lib/public-form-ssr.ts +11 -1
  219. package/corpus/templates/forms/vitest.config.ts +1 -0
  220. package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +11 -4
  221. package/corpus/templates/macros/app/routes.ts +3 -1
  222. package/corpus/templates/macros/vitest.config.ts +6 -1
  223. package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +11 -4
  224. package/corpus/templates/mail/actions/manage-gmail-filters.ts +10 -2
  225. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +100 -37
  226. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +14 -2
  227. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +66 -36
  228. package/corpus/templates/mail/app/hooks/use-google-auth.ts +2 -0
  229. package/corpus/templates/mail/app/lib/google-oauth-setup.ts +17 -0
  230. package/corpus/templates/mail/app/pages/InboxPage.tsx +69 -9
  231. package/corpus/templates/mail/app/routes/$.tsx +9 -0
  232. package/corpus/templates/mail/app/routes/$view.$threadId.tsx +23 -1
  233. package/corpus/templates/mail/app/routes/$view.tsx +47 -1
  234. package/corpus/templates/mail/app/routes.ts +3 -1
  235. package/corpus/templates/mail/changelog/2026-08-22-gmail-can-now-connect-with-the-shared-google-oauth.md +6 -0
  236. package/corpus/templates/mail/changelog/2026-08-22-gmail-filters-now-shows-the-real-error.md +6 -0
  237. package/corpus/templates/mail/changelog/2026-08-22-unknown-mail-urls-now-show-the-404-page.md +6 -0
  238. package/corpus/templates/mail/server/handlers/google-auth.ts +11 -2
  239. package/corpus/templates/mail/server/lib/google-auth.ts +92 -12
  240. package/corpus/templates/mail/server/onboarding.ts +66 -18
  241. package/corpus/templates/mail/vitest.config.ts +6 -1
  242. package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +11 -4
  243. package/corpus/templates/plan/app/routes/settings.tsx +4 -1
  244. package/corpus/templates/plan/app/routes.ts +3 -1
  245. package/corpus/templates/plan/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  246. package/corpus/templates/plan/netlify.toml +1 -1
  247. package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +11 -4
  248. package/corpus/templates/slides/actions/patch-deck.ts +79 -10
  249. package/corpus/templates/slides/actions/update-slide.ts +11 -1
  250. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +14 -4
  251. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -52
  252. package/corpus/templates/slides/app/components/editor/GoogleDocImportHint.tsx +8 -53
  253. package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +9 -75
  254. package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +8 -60
  255. package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +10 -2
  256. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +19 -7
  257. package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +49 -36
  258. package/corpus/templates/slides/app/routes/access-request.approve.tsx +16 -9
  259. package/corpus/templates/slides/app/routes.ts +3 -1
  260. package/corpus/templates/slides/changelog/2026-08-22-already-uploaded-chat-images-are-no-longer-dropped.md +6 -0
  261. package/corpus/templates/slides/changelog/2026-08-22-google-drive-and-slides-can-now-connect-with-the-shared-google-oauth.md +6 -0
  262. package/corpus/templates/slides/changelog/2026-08-22-multi-slide-repairs-now-report-slides-that-still-overflow.md +6 -0
  263. package/corpus/templates/slides/changelog/2026-08-22-update-slide-now-reports-which-batched-edit-was-skipped.md +6 -0
  264. package/corpus/templates/slides/server/handlers/google-docs-auth.ts +52 -1
  265. package/corpus/templates/slides/server/lib/chat-attachments.ts +29 -3
  266. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +66 -16
  267. package/corpus/templates/slides/server/lib/slide-content-patch.ts +13 -2
  268. package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -2
  269. package/corpus/templates/slides/tsconfig.json +5 -0
  270. package/corpus/templates/slides/vitest.config.ts +6 -1
  271. package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +11 -4
  272. package/corpus/templates/tasks/app/routes/settings.tsx +4 -1
  273. package/corpus/templates/tasks/app/routes.ts +3 -1
  274. package/corpus/templates/tasks/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  275. package/corpus/templates/tasks/vitest.config.ts +7 -1
  276. package/dist/action.d.ts +91 -0
  277. package/dist/action.js +50 -0
  278. package/dist/agent/abort-reasons.d.ts +38 -0
  279. package/dist/agent/abort-reasons.js +49 -0
  280. package/dist/agent/engine/ai-sdk-engine.js +8 -5
  281. package/dist/agent/engine/anthropic-engine.js +7 -5
  282. package/dist/agent/engine/first-event-timeout.d.ts +42 -17
  283. package/dist/agent/engine/first-event-timeout.js +67 -25
  284. package/dist/agent/production-agent.d.ts +23 -0
  285. package/dist/agent/production-agent.js +107 -102
  286. package/dist/agent/run-loop-with-resume.d.ts +2 -28
  287. package/dist/agent/run-loop-with-resume.js +25 -40
  288. package/dist/agent/run-manager.js +5 -4
  289. package/dist/agent/run-store.d.ts +55 -0
  290. package/dist/agent/run-store.js +124 -1
  291. package/dist/agent/tool-search.js +2 -1
  292. package/dist/agent/types.d.ts +9 -4
  293. package/dist/app-config/configuration-error.d.ts +11 -0
  294. package/dist/app-config/configuration-error.js +14 -0
  295. package/dist/app-config/index.d.ts +1 -0
  296. package/dist/app-config/index.js +1 -0
  297. package/dist/app-config/integrations.d.ts +1 -0
  298. package/dist/app-config/integrations.js +10 -0
  299. package/dist/app-config/plugins.d.ts +34 -0
  300. package/dist/app-config/plugins.js +39 -0
  301. package/dist/app-config/run-lifecycle-invariants.d.ts +18 -9
  302. package/dist/app-config/run-lifecycle-invariants.js +18 -25
  303. package/dist/app-config/schema.d.ts +16 -0
  304. package/dist/app-config/schema.js +2 -0
  305. package/dist/chat-threads/schema-migrations.js +20 -0
  306. package/dist/chat-threads/store.js +21 -4
  307. package/dist/cli/native-dependencies.d.ts +4 -0
  308. package/dist/cli/native-dependencies.js +15 -0
  309. package/dist/client/EnvironmentBadge.d.ts +1 -1
  310. package/dist/client/EnvironmentBadge.js +40 -5
  311. package/dist/client/MultiTabAssistantChat.d.ts +1 -1
  312. package/dist/client/MultiTabAssistantChat.js +35 -14
  313. package/dist/client/agent-chat/index.d.ts +1 -1
  314. package/dist/client/agent-chat/index.js +1 -1
  315. package/dist/client/agent-page/use-jobs.d.ts +2 -1
  316. package/dist/client/agent-page/use-jobs.js +3 -5
  317. package/dist/client/agent-sidebar-state.js +3 -1
  318. package/dist/client/blocks/library/code-tabs.js +5 -0
  319. package/dist/client/blocks/library/code.js +1 -0
  320. package/dist/client/chat-first/apps-rail.js +2 -2
  321. package/dist/client/chat-model-groups.d.ts +12 -0
  322. package/dist/client/chat-model-groups.js +3 -2
  323. package/dist/client/integrations/GoogleProductLogo.d.ts +5 -0
  324. package/dist/client/integrations/GoogleProductLogo.js +45 -0
  325. package/dist/client/integrations/index.d.ts +2 -0
  326. package/dist/client/integrations/index.js +2 -0
  327. package/dist/client/integrations/workspace-provider-oauth.d.ts +8 -0
  328. package/dist/client/integrations/workspace-provider-oauth.js +13 -0
  329. package/dist/client/resources/mcp-integration-catalog.js +0 -29
  330. package/dist/client/settings/SettingsTabsPage.js +10 -6
  331. package/dist/client/sharing/ShareButton.js +11 -2
  332. package/dist/client/use-chat-models.d.ts +6 -0
  333. package/dist/client/use-chat-models.js +10 -0
  334. package/dist/client/use-db-sync.js +27 -9
  335. package/dist/connections/catalog.d.ts +111 -9
  336. package/dist/connections/catalog.js +86 -30
  337. package/dist/db/create-get-db.js +18 -0
  338. package/dist/db/ddl-guard.d.ts +0 -4
  339. package/dist/db/ddl-guard.js +46 -0
  340. package/dist/deploy/build.d.ts +19 -0
  341. package/dist/deploy/build.js +190 -16
  342. package/dist/deploy/function-bundle.d.ts +45 -0
  343. package/dist/deploy/function-bundle.js +337 -0
  344. package/dist/deploy/workspace-deploy.js +19 -1
  345. package/dist/eject/workspace-connections.js +4 -0
  346. package/dist/email-catalog/registry.d.ts +4 -0
  347. package/dist/email-catalog/registry.js +79 -14
  348. package/dist/extensions/content-patch.js +14 -2
  349. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  350. package/dist/integrations/plugin.d.ts +10 -0
  351. package/dist/integrations/plugin.js +40 -6
  352. package/dist/jobs/actions/run-automation-now.d.ts +2 -1
  353. package/dist/jobs/actions/run-automation-now.js +11 -5
  354. package/dist/jobs/frontmatter.js +53 -2
  355. package/dist/jobs/run-now.d.ts +11 -1
  356. package/dist/jobs/run-now.js +42 -7
  357. package/dist/jobs/scheduler.d.ts +1 -0
  358. package/dist/jobs/scheduler.js +2 -1
  359. package/dist/localization/core-messages/ar-SA.js +3 -0
  360. package/dist/localization/core-messages/de-DE.js +3 -0
  361. package/dist/localization/core-messages/en-US.d.ts +3 -0
  362. package/dist/localization/core-messages/en-US.js +3 -0
  363. package/dist/localization/core-messages/es-ES.js +3 -0
  364. package/dist/localization/core-messages/fr-FR.js +3 -0
  365. package/dist/localization/core-messages/hi-IN.js +3 -0
  366. package/dist/localization/core-messages/ja-JP.js +3 -0
  367. package/dist/localization/core-messages/ko-KR.js +3 -0
  368. package/dist/localization/core-messages/pt-BR.js +3 -0
  369. package/dist/localization/core-messages/zh-CN.js +3 -0
  370. package/dist/localization/core-messages/zh-TW.js +3 -0
  371. package/dist/localization/core-messages.d.ts +3 -0
  372. package/dist/localization/default-messages.d.ts +2 -5
  373. package/dist/localization/default-messages.js +2 -5
  374. package/dist/mcp/build-server.d.ts +9 -0
  375. package/dist/mcp/build-server.js +37 -8
  376. package/dist/mcp-client/oauth-client.d.ts +7 -0
  377. package/dist/mcp-client/oauth-client.js +12 -1
  378. package/dist/oauth-tokens/index.d.ts +1 -1
  379. package/dist/oauth-tokens/index.js +1 -1
  380. package/dist/oauth-tokens/lifecycle.d.ts +11 -0
  381. package/dist/oauth-tokens/lifecycle.js +17 -0
  382. package/dist/oauth-tokens/store.js +7 -0
  383. package/dist/observability/posthog-ai.d.ts +15 -1
  384. package/dist/observability/posthog-ai.js +24 -12
  385. package/dist/observability/routes.d.ts +3 -3
  386. package/dist/observability/traces.js +158 -28
  387. package/dist/onboarding/app-profile.js +2 -2
  388. package/dist/onboarding/plugin.js +10 -2
  389. package/dist/onboarding/types.d.ts +2 -0
  390. package/dist/provider-api/actions/custom-provider-registration.d.ts +1 -1
  391. package/dist/provider-api/actions/provider-api.d.ts +2 -2
  392. package/dist/provider-api/index.js +2 -0
  393. package/dist/resources/store.js +13 -4
  394. package/dist/scripts/agent-engines/list-agent-engines.js +29 -3
  395. package/dist/secrets/register-framework-secrets.js +1 -1
  396. package/dist/server/action-discovery.js +5 -0
  397. package/dist/server/agent-chat/action-filters-a2a.d.ts +27 -3
  398. package/dist/server/agent-chat/action-filters-a2a.js +48 -9
  399. package/dist/server/agent-chat-plugin.js +36 -9
  400. package/dist/server/agent-discovery.js +43 -20
  401. package/dist/server/auth.js +18 -16
  402. package/dist/server/beta-opt-out-html.js +45 -4
  403. package/dist/server/better-auth-instance.d.ts +2 -1
  404. package/dist/server/better-auth-instance.js +23 -7
  405. package/dist/server/builder-design-systems.d.ts +4 -1
  406. package/dist/server/builder-design-systems.js +87 -6
  407. package/dist/server/builder-oauth.d.ts +1 -7
  408. package/dist/server/builder-oauth.js +80 -163
  409. package/dist/server/core-routes-plugin.d.ts +29 -0
  410. package/dist/server/core-routes-plugin.js +100 -20
  411. package/dist/server/default-plugins.d.ts +18 -0
  412. package/dist/server/default-plugins.js +22 -0
  413. package/dist/server/edge.d.ts +1 -0
  414. package/dist/server/edge.js +1 -0
  415. package/dist/server/framework-request-handler.js +31 -3
  416. package/dist/server/google-oauth.d.ts +3 -0
  417. package/dist/server/google-oauth.js +3 -0
  418. package/dist/server/index.d.ts +4 -4
  419. package/dist/server/index.js +3 -3
  420. package/dist/server/onboarding-html.js +37 -3
  421. package/dist/server/realtime-token.d.ts +1 -1
  422. package/dist/server/transcribe-voice.d.ts +1 -1
  423. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  424. package/dist/server/workspace-provider-oauth.js +72 -20
  425. package/dist/shared/agent-sidebar-url.d.ts +1 -0
  426. package/dist/shared/agent-sidebar-url.js +1 -0
  427. package/dist/shared/environment-lanes.d.ts +2 -0
  428. package/dist/shared/environment-lanes.js +3 -1
  429. package/dist/shared/index.d.ts +3 -1
  430. package/dist/shared/index.js +3 -1
  431. package/dist/shared/surface-visibility.d.ts +31 -0
  432. package/dist/shared/surface-visibility.js +57 -0
  433. package/dist/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  434. package/dist/templates/chat/app/routes.ts +3 -1
  435. package/dist/templates/chat/vitest.config.ts +8 -0
  436. package/dist/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  437. package/dist/templates/default/app/routes.ts +3 -1
  438. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  439. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
  440. package/dist/tracking/registry.d.ts +11 -0
  441. package/dist/tracking/registry.js +5 -2
  442. package/dist/triggers/actions.js +10 -3
  443. package/dist/usage/store.js +23 -3
  444. package/dist/user-profile/actions/get-auth-methods.js +18 -5
  445. package/dist/vite/client.js +24 -5
  446. package/docs/content/actions-access-control.mdx +43 -4
  447. package/docs/content/actions-defining.mdx +16 -0
  448. package/docs/content/template-clips-capture-everywhere.mdx +29 -30
  449. package/docs/content/template-clips-developers.mdx +4 -4
  450. package/docs/content/template-clips.mdx +3 -1
  451. package/package.json +2 -2
  452. package/src/eject/workspace-connections.ts +4 -0
  453. package/src/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  454. package/src/templates/chat/app/routes.ts +3 -1
  455. package/src/templates/chat/vitest.config.ts +8 -0
  456. package/src/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  457. package/src/templates/default/app/routes.ts +3 -1
  458. package/src/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  459. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
@@ -40,7 +40,6 @@
40
40
  "common-room",
41
41
  "exa",
42
42
  "gong",
43
- "google-workspace",
44
43
  "grafana",
45
44
  "intercom",
46
45
  "monday",
@@ -70,7 +69,11 @@
70
69
  "figma",
71
70
  "notion",
72
71
  "gmail",
72
+ "google_calendar",
73
+ "google_docs",
73
74
  "google_drive",
75
+ "google_sheets",
76
+ "google_slides",
74
77
  "hubspot",
75
78
  "salesforce",
76
79
  "jira",
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { spawn } from "node:child_process";
4
4
  import { existsSync, statSync } from "node:fs";
5
+ import { createRequire } from "node:module";
5
6
  import { dirname, join } from "node:path";
6
7
  import { fileURLToPath, pathToFileURL } from "node:url";
7
8
 
@@ -62,14 +63,31 @@ if (!useSourceFallback) {
62
63
 
63
64
  await import(pathToFileURL(distEntry).href);
64
65
  } else {
65
- const child = spawn("tsx", [sourceEntry, ...process.argv.slice(2)], {
66
- stdio: "inherit",
67
- env: process.env,
68
- });
66
+ // Resolve tsx from this package instead of trusting PATH: the fallback is
67
+ // also reached through `node packages/core/bin/agent-native.js`, which runs
68
+ // without node_modules/.bin on PATH.
69
+ let tsxCli;
70
+ try {
71
+ tsxCli = createRequire(import.meta.url).resolve("tsx/cli");
72
+ } catch (error) {
73
+ console.error(
74
+ `agent-native CLI source fallback could not resolve tsx (${error.message}). Run \`pnpm --filter @agent-native/core build\` and try again.`,
75
+ );
76
+ process.exit(1);
77
+ }
78
+
79
+ const child = spawn(
80
+ process.execPath,
81
+ [tsxCli, sourceEntry, ...process.argv.slice(2)],
82
+ {
83
+ stdio: "inherit",
84
+ env: process.env,
85
+ },
86
+ );
69
87
 
70
88
  child.on("error", (error) => {
71
89
  console.error(
72
- `agent-native CLI build output is missing and the source fallback failed: ${error.message}`,
90
+ `agent-native CLI source fallback failed: ${error.message}. Run \`pnpm --filter @agent-native/core build\` and try again.`,
73
91
  );
74
92
  process.exit(1);
75
93
  });
package/corpus/README.md CHANGED
@@ -31,4 +31,4 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
31
31
 
32
32
  ## Generated Counts
33
33
 
34
- - template files: 8525
34
+ - template files: 8585
@@ -19,10 +19,17 @@ data, and generated extension/app content may mention credential **names** such
19
19
  as `OPENAI_API_KEY`, but must not contain real API keys, tokens, webhook URLs,
20
20
  signing secrets, OAuth refresh tokens, or private Builder/customer data.
21
21
 
22
- Secret values are supplied at runtime through deployment configuration, the
23
- encrypted `app_secrets` vault, `saveCredential` / `resolveCredential`, OAuth, or
24
- `${keys.NAME}` substitution. Examples must use obvious placeholders such as
25
- `<OPENAI_API_KEY>` or `${keys.SLACK_WEBHOOK}`, not real-looking copied values.
22
+ Provider secret values are supplied at runtime through the encrypted
23
+ `app_secrets` vault, `saveCredential` / `resolveCredential`, OAuth, or
24
+ `${keys.NAME}` substitution. Deployment configuration is reserved for
25
+ deploy-level secrets and non-provider configuration. Examples must use obvious
26
+ placeholders such as `<OPENAI_API_KEY>` or `${keys.SLACK_WEBHOOK}`, not
27
+ real-looking copied values.
28
+
29
+ Provider credentials and provider account identifiers are workspace data. Use
30
+ standard workspace connections and org/workspace vault scopes; never put them
31
+ in `.env` or deployment environment variables, and never add a provider-specific
32
+ action or startup bootstrap just to write a credential for one organization.
26
33
 
27
34
  ## Credential Modeling Preflight
28
35
 
@@ -48,7 +48,7 @@ function toDataTableResult(result: {
48
48
 
49
49
  export default defineAction({
50
50
  description:
51
- "Query the built-in first-party Analytics source: events recorded through this app's analytics collector endpoint (/track), compact daily rollups updated transactionally with new ingest, identifiable user-day rollups, and session replay summaries recorded through /api/analytics/replay. This source does not require an external provider connection. Use it for questions about app/site traffic, product events, template/app usage, conversions, session recordings, LLM/agent observability, model cost, token volume, latency, and other first-party data collected by this analytics app. Use source-specific actions such as BigQuery, GA4, Mixpanel, PostHog, or Amplitude when the user asks for those sources or the relevant data lives there. SQL may read analytics_events, analytics_event_daily_rollups, analytics_user_days, and session_recordings; session_replay_chunks is intentionally unavailable, and reads are automatically scoped to the current user/org. Prefer analytics_event_daily_rollups for event counts and analytics_user_days for active-user or retention questions. On the Builder.io production organization after the explicit BigQuery cutover, event and rollup reads use partitioned BigQuery tables/views while session_recordings remains in the SQL store; cross-backend joins are not supported. Before a large or historical query, call get-first-party-analytics-health and use a configured external backend when it recommends one: BigQuery supports warehouse SQL and historical analysis, while Amplitude supports product analytics, funnels, and retention. Connecting a backend does not automatically reroute /track events or copy existing Neon events; the migration action performs that explicit prepare, backfill, and cutover sequence. Aggregate, project only needed columns, use bounded recent drill-downs, and add a LIMIT for raw or high-cardinality reads; do not issue an unbounded raw-event scan or paginate a large cohort. An explicit all-time or lifetime request remains all-time, so do not invent a default lower time bound. Safe scoped results are cached for up to five minutes for this agent action. analytics_events columns include event_name, timestamp, event_date, user_id, anonymous_id, user_key, session_id, app, template, signed_in, url, path, hostname, referrer, properties, and context. analytics_event_daily_rollups columns include tenant_key, owner_email, org_id, event_date, event_name, app, template, and event_count. analytics_user_days columns include tenant_key, owner_email, org_id, event_date, and user_key. LLM observability events use event_name = '$ai_generation'; useful properties include $ai_trace_id/run_id, $ai_session_id/thread_id, $ai_model/model, $ai_provider/provider, $ai_input_tokens/input_tokens, $ai_output_tokens/output_tokens, cache_read_tokens, cache_write_tokens, cost_cents_x100, $ai_total_cost_usd/cost_usd, duration_ms/$ai_latency, status, tool_calls, successful_tools, failed_tools, tools, tools_truncated, delegated, delegation_protocol, caller_app, delegation_task_id, a2a_task_id, parent_run_id, parent_turn_id, and error_message/$ai_error. Agent Teams child runs use delegation_protocol = 'agent-team' and retain their own run_id while linking to the launching run through parent_run_id. The bounded tools array contains names, relative start times, durations, statuses, and coarse error classes only, never args or results; failed runs and interrupted tools remain queryable. session_recordings columns include id, session_id, user_id, anonymous_id, user_key, started_at, ended_at, duration_ms, chunk_count, event_count, page_count, error_count, rage_click_count, app, template, status, first_url, last_url, path, hostname, referrer, and metadata.",
51
+ "Query the built-in first-party Analytics source: events recorded through this app's analytics collector endpoint (/track), compact daily rollups updated transactionally with new ingest, identifiable user-day rollups, and session replay summaries recorded through /api/analytics/replay. This source does not require an external provider connection. Use it for questions about app/site traffic, product events, template/app usage, conversions, session recordings, LLM/agent observability, model cost, token volume, latency, and other first-party data collected by this analytics app. Use source-specific actions such as BigQuery, GA4, Mixpanel, PostHog, or Amplitude when the user asks for those sources or the relevant data lives there. SQL may read analytics_events, analytics_event_daily_rollups, analytics_user_days, and session_recordings; session_replay_chunks is intentionally unavailable, and reads are automatically scoped to the current user/org. Prefer analytics_event_daily_rollups for event counts and analytics_user_days for active-user or retention questions. On the Builder.io production organization after the explicit BigQuery cutover, event and rollup reads use partitioned BigQuery tables/views while session_recordings remains in the SQL store; cross-backend joins are not supported. Before a large or historical query, call get-first-party-analytics-health and use a configured external backend when it recommends one: BigQuery supports warehouse SQL and historical analysis, while Amplitude supports product analytics, funnels, and retention. Connecting a backend does not automatically reroute /track events or copy existing Neon events; the migration action performs that explicit prepare, backfill, and cutover sequence. Aggregate, project only needed columns, use bounded recent drill-downs, and add a LIMIT for raw or high-cardinality reads; do not issue an unbounded raw-event scan or paginate a large cohort. An explicit all-time or lifetime request remains all-time, so do not invent a default lower time bound. Safe scoped results are cached for up to five minutes for this agent action. analytics_events columns include event_name, timestamp, event_date, user_id, anonymous_id, user_key, session_id, app, template, signed_in, url, path, hostname, referrer, properties, and context. analytics_event_daily_rollups columns include tenant_key, owner_email, org_id, event_date, event_name, app, template, and event_count. analytics_user_days columns include tenant_key, owner_email, org_id, event_date, and user_key. LLM observability events use event_name = '$ai_generation'; useful properties include $ai_trace_id/run_id, $ai_session_id/thread_id, $ai_model/model, $ai_provider/provider, $ai_input_tokens/input_tokens, $ai_output_tokens/output_tokens, cache_read_tokens, cache_write_tokens, cost_cents_x100, $ai_total_cost_usd/cost_usd, duration_ms (full run, milliseconds), $ai_latency (model time in seconds, run minus tool time), status, tool_calls, successful_tools, failed_tools, tools, tools_truncated, delegated, delegation_protocol, caller_app, delegation_task_id, a2a_task_id, parent_run_id, parent_turn_id, and error_message/$ai_error. Agent Teams child runs use delegation_protocol = 'agent-team' and retain their own run_id while linking to the launching run through parent_run_id. The bounded tools array contains names, relative start times, durations, statuses, and coarse error classes only, never args or results; failed runs and interrupted tools remain queryable. session_recordings columns include id, session_id, user_id, anonymous_id, user_key, started_at, ended_at, duration_ms, chunk_count, event_count, page_count, error_count, rage_click_count, app, template, status, first_url, last_url, path, hostname, referrer, and metadata.",
52
52
  schema: z.object({
53
53
  sql: z
54
54
  .string()
@@ -468,6 +468,9 @@ const enUS = {
468
468
  adminOnlyTitle: "Admin access required",
469
469
  adminOnlyDescription:
470
470
  "Only organization owners and admins can open Analytics admin tools.",
471
+ roleUnavailableTitle: "Couldn't verify your access",
472
+ roleUnavailableDescription:
473
+ "We couldn't check your organization role: {{message}}",
471
474
  notTracked: "Not tracked",
472
475
  visibilityprivate: "Private",
473
476
  visibilityorg: "Shared with org",
@@ -13018,6 +13021,8 @@ const translatedDashboardAdminTranslations = {
13018
13021
  adminOnlyTitle: "需要管理员权限",
13019
13022
  adminOnlyDescription:
13020
13023
  "只有组织所有者和管理员可以打开 Analytics 管理工具。",
13024
+ roleUnavailableTitle: "无法验证你的访问权限",
13025
+ roleUnavailableDescription: "无法检查你的组织角色:{{message}}",
13021
13026
  notTracked: "未跟踪",
13022
13027
  visibilityprivate: "私有",
13023
13028
  visibilityorg: "与组织共享",
@@ -13066,6 +13071,9 @@ const translatedDashboardAdminTranslations = {
13066
13071
  adminOnlyTitle: "Se requiere acceso de administrador",
13067
13072
  adminOnlyDescription:
13068
13073
  "Solo los propietarios y administradores de la organización pueden abrir las herramientas de administración de Analytics.",
13074
+ roleUnavailableTitle: "No se pudo verificar tu acceso",
13075
+ roleUnavailableDescription:
13076
+ "No pudimos comprobar tu rol en la organización: {{message}}",
13069
13077
  notTracked: "No registrado",
13070
13078
  visibilityprivate: "Privado",
13071
13079
  visibilityorg: "Compartido con la organización",
@@ -13114,6 +13122,9 @@ const translatedDashboardAdminTranslations = {
13114
13122
  adminOnlyTitle: "Accès administrateur requis",
13115
13123
  adminOnlyDescription:
13116
13124
  "Seuls les propriétaires et administrateurs de l'organisation peuvent ouvrir les outils d'administration Analytics.",
13125
+ roleUnavailableTitle: "Impossible de vérifier votre accès",
13126
+ roleUnavailableDescription:
13127
+ "Nous n'avons pas pu vérifier votre rôle dans l'organisation : {{message}}",
13117
13128
  notTracked: "Non suivi",
13118
13129
  visibilityprivate: "Privé",
13119
13130
  visibilityorg: "Partagé avec l'organisation",
@@ -13162,6 +13173,9 @@ const translatedDashboardAdminTranslations = {
13162
13173
  adminOnlyTitle: "Adminzugriff erforderlich",
13163
13174
  adminOnlyDescription:
13164
13175
  "Nur Organisationsinhaber und Administratoren können Analytics-Admin-Tools öffnen.",
13176
+ roleUnavailableTitle: "Zugriff konnte nicht überprüft werden",
13177
+ roleUnavailableDescription:
13178
+ "Deine Organisationsrolle konnte nicht überprüft werden: {{message}}",
13165
13179
  notTracked: "Nicht erfasst",
13166
13180
  visibilityprivate: "Privat",
13167
13181
  visibilityorg: "Mit Organisation geteilt",
@@ -13210,6 +13224,9 @@ const translatedDashboardAdminTranslations = {
13210
13224
  adminOnlyTitle: "管理者アクセスが必要です",
13211
13225
  adminOnlyDescription:
13212
13226
  "組織の所有者と管理者のみが Analytics 管理ツールを開けます。",
13227
+ roleUnavailableTitle: "アクセス権を確認できませんでした",
13228
+ roleUnavailableDescription:
13229
+ "組織内のロールを確認できませんでした: {{message}}",
13213
13230
  notTracked: "未追跡",
13214
13231
  visibilityprivate: "非公開",
13215
13232
  visibilityorg: "組織と共有",
@@ -13257,6 +13274,9 @@ const translatedDashboardAdminTranslations = {
13257
13274
  adminOnlyTitle: "관리자 권한 필요",
13258
13275
  adminOnlyDescription:
13259
13276
  "조직 소유자와 관리자만 Analytics 관리 도구를 열 수 있습니다.",
13277
+ roleUnavailableTitle: "접근 권한을 확인할 수 없습니다",
13278
+ roleUnavailableDescription:
13279
+ "조직 역할을 확인하지 못했습니다: {{message}}",
13260
13280
  notTracked: "추적 안 됨",
13261
13281
  visibilityprivate: "비공개",
13262
13282
  visibilityorg: "조직과 공유됨",
@@ -13305,6 +13325,9 @@ const translatedDashboardAdminTranslations = {
13305
13325
  adminOnlyTitle: "Acesso de administrador necessário",
13306
13326
  adminOnlyDescription:
13307
13327
  "Somente proprietários e administradores da organização podem abrir as ferramentas administrativas do Analytics.",
13328
+ roleUnavailableTitle: "Não foi possível verificar seu acesso",
13329
+ roleUnavailableDescription:
13330
+ "Não conseguimos verificar sua função na organização: {{message}}",
13308
13331
  notTracked: "Não rastreado",
13309
13332
  visibilityprivate: "Privado",
13310
13333
  visibilityorg: "Compartilhado com a organização",
@@ -13352,6 +13375,9 @@ const translatedDashboardAdminTranslations = {
13352
13375
  adminOnlyTitle: "एडमिन access आवश्यक है",
13353
13376
  adminOnlyDescription:
13354
13377
  "केवल organization owners और admins Analytics admin tools खोल सकते हैं।",
13378
+ roleUnavailableTitle: "आपका access सत्यापित नहीं किया जा सका",
13379
+ roleUnavailableDescription:
13380
+ "हम आपकी organization role जांच नहीं सके: {{message}}",
13355
13381
  notTracked: "ट्रैक नहीं किया गया",
13356
13382
  visibilityprivate: "निजी",
13357
13383
  visibilityorg: "संगठन के साथ साझा",
@@ -13400,6 +13426,8 @@ const translatedDashboardAdminTranslations = {
13400
13426
  adminOnlyTitle: "مطلوب وصول مسؤول",
13401
13427
  adminOnlyDescription:
13402
13428
  "يمكن لمالكي المؤسسة والمسؤولين فقط فتح أدوات إدارة Analytics.",
13429
+ roleUnavailableTitle: "تعذر التحقق من وصولك",
13430
+ roleUnavailableDescription: "تعذر التحقق من دورك في المؤسسة: {{message}}",
13403
13431
  notTracked: "غير متتبع",
13404
13432
  visibilityprivate: "خاص",
13405
13433
  visibilityorg: "مشترك مع المؤسسة",
@@ -428,7 +428,11 @@ function UsageStatCard({
428
428
 
429
429
  export default function AgentsPage() {
430
430
  const t = useT();
431
- const { canManageOrg, isLoading: orgRoleLoading } = useOrgRole();
431
+ const {
432
+ canManageOrg,
433
+ isLoading: orgRoleLoading,
434
+ error: orgRoleError,
435
+ } = useOrgRole();
432
436
  const [searchParams, setSearchParams] = useSearchParams();
433
437
  const view = parseView(searchParams.get("view"));
434
438
  const selectedConnectionId = searchParams.get("db");
@@ -461,6 +465,26 @@ export default function AgentsPage() {
461
465
  );
462
466
  }
463
467
 
468
+ if (orgRoleError && isAdminView) {
469
+ return (
470
+ <div className="mx-auto flex h-full w-full max-w-7xl items-center justify-center px-4 py-5 lg:px-6">
471
+ <div className="max-w-sm rounded-lg border bg-background p-6 text-center">
472
+ <div className="mx-auto mb-3 flex h-10 w-10 items-center justify-center rounded-full bg-muted">
473
+ <IconAlertTriangle className="h-5 w-5 text-muted-foreground" />
474
+ </div>
475
+ <h1 className="text-sm font-semibold">
476
+ {t("agents.roleUnavailableTitle")}
477
+ </h1>
478
+ <p className="mt-1.5 text-sm leading-6 text-muted-foreground">
479
+ {t("agents.roleUnavailableDescription", {
480
+ message: orgRoleError.message,
481
+ })}
482
+ </p>
483
+ </div>
484
+ </div>
485
+ );
486
+ }
487
+
464
488
  if (!canManageOrg && isAdminView) {
465
489
  return (
466
490
  <div className="mx-auto flex h-full w-full max-w-7xl items-center justify-center px-4 py-5 lg:px-6">
@@ -1,3 +1,5 @@
1
+ import { data } from "react-router";
2
+
1
3
  import { messagesByLocale } from "@/i18n-data";
2
4
  import NotFound from "@/pages/NotFound";
3
5
 
@@ -5,6 +7,14 @@ export function meta() {
5
7
  return [{ title: messagesByLocale["en-US"].routeTitles.notFound }];
6
8
  }
7
9
 
10
+ // The splat route matches every unmatched path, so React Router's "no routes
11
+ // matched" 404 branch never fires here and the response defaults to 200. Set
12
+ // the status explicitly so the shell is served (and CDN-cached) as the
13
+ // not-found page it actually is.
14
+ export function loader() {
15
+ return data(null, { status: 404 });
16
+ }
17
+
8
18
  export default function CatchAllRoute() {
9
19
  return <NotFound />;
10
20
  }
@@ -1,4 +1,6 @@
1
1
  import { type RouteConfig } from "@react-router/dev/routes";
2
2
  import { flatRoutes } from "@react-router/fs-routes";
3
3
 
4
- export default flatRoutes() satisfies RouteConfig;
4
+ export default flatRoutes({
5
+ ignoredRouteFiles: ["**/*.test.{ts,tsx}", "**/*.spec.{ts,tsx}"],
6
+ }) satisfies RouteConfig;
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-22
4
+ ---
5
+
6
+ Fixed the Agent Native Templates (First-party) dashboard panels failing to load on a local SQLite database
@@ -0,0 +1,9 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-22
4
+ ---
5
+
6
+ Org admin panels no longer report a database error as a permission denial. A failed
7
+ organization-role lookup now surfaces as a retryable error instead of silently reading
8
+ as "you are not an owner or admin", which had been 403-ing the usage stats panel for
9
+ real admins whenever the database was briefly unreachable.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-22
4
+ ---
5
+
6
+ Slack analytics requests now reject invalid workspaces and cursors with actionable errors instead of using the wrong workspace or returning a server failure.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-22
4
+ ---
5
+
6
+ Visiting a broken or mistyped Analytics link now returns a real not-found response instead of a silent success.
@@ -128,7 +128,8 @@ Useful query fields live in `properties`:
128
128
  | `cache_read_tokens`, `cache_write_tokens` | Prompt-cache token counts |
129
129
  | `$ai_total_cost_usd`, `cost_usd` | Estimated run cost in USD |
130
130
  | `cost_cents_x100` | Estimated run cost in centicents |
131
- | `$ai_latency`, `duration_ms` | Run duration in seconds / milliseconds |
131
+ | `duration_ms` | Run duration in milliseconds |
132
+ | `$ai_latency` | Model time in seconds (run duration minus tool time), on `$ai_generation` |
132
133
  | `tool_calls`, `successful_tools`, `failed_tools` | Complete tool-call counts |
133
134
  | `tools`, `tools_truncated` | First 50 tool names, offsets, durations, statuses, and error classes, including interrupted calls |
134
135
  | `delegated`, `delegation_protocol`, `caller_app` | Delegated-run attribution |
@@ -29,6 +29,8 @@ Events tracked by application instrumentation and stored in the configured appli
29
29
  `$ai_model`, `$ai_provider`, `$ai_input_tokens`, `$ai_output_tokens`,
30
30
  `$ai_latency`, `$ai_total_cost_usd`, `run_id`, `thread_id`,
31
31
  `cost_cents_x100`, `duration_ms`, `tool_calls`, `status`, and error fields.
32
+ `$ai_latency` is model time in seconds; `duration_ms` is the full run in
33
+ milliseconds, and the two differ by the time spent in tools.
32
34
  A bounded `tools` array records only tool names, relative start times,
33
35
  durations, statuses, and coarse error classes; interrupted tools and failed
34
36
  runs remain visible, and `tools_truncated` marks runs above the 50-entry cap.
@@ -5,7 +5,29 @@ import { existsSync, rmSync, writeFileSync, mkdirSync } from "node:fs";
5
5
  import path from "node:path";
6
6
  import { fileURLToPath, pathToFileURL } from "node:url";
7
7
 
8
- import { cloneServerBundleForFunction } from "@agent-native/core/deploy/function-bundle";
8
+ import {
9
+ cloneServerBundleForFunction,
10
+ pruneBrowserRuntimeFromNonAgentClone,
11
+ pruneSsrIslandFromRewritingClone,
12
+ } from "@agent-native/core/deploy/function-bundle";
13
+
14
+ /**
15
+ * Each sweep worker is a full clone of the server bundle, but its entry rewrites
16
+ * the pathname to one scheduled route. It can reach neither the SSR pages nor an
17
+ * agent turn, yet it shipped both the page island and the 79MB browser runtime —
18
+ * six times over, and Netlify zips every function separately.
19
+ */
20
+ function writeWorkerEntry(dest: string, name: string, source: string): void {
21
+ writeFileSync(path.join(dest, `${name}.mjs`), source);
22
+ const freed =
23
+ pruneSsrIslandFromRewritingClone(dest, source) +
24
+ pruneBrowserRuntimeFromNonAgentClone(dest, source);
25
+ if (freed > 0) {
26
+ console.log(
27
+ `[deploy] Pruned ${(freed / 1024 / 1024).toFixed(1)}MB of unreachable modules from ${name}.`,
28
+ );
29
+ }
30
+ }
9
31
 
10
32
  const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
11
33
  const FUNCTIONS_DIR = path.join(ROOT, ".netlify", "functions-internal");
@@ -164,7 +186,7 @@ export const config = {
164
186
  };
165
187
  `;
166
188
 
167
- writeFileSync(path.join(dest, `${WORKER_NAME}.mjs`), source);
189
+ writeWorkerEntry(dest, WORKER_NAME, source);
168
190
  }
169
191
 
170
192
  function emitAlertScheduledTrigger(token: string) {
@@ -282,7 +304,7 @@ export const config = {
282
304
  };
283
305
  `;
284
306
 
285
- writeFileSync(path.join(dest, `${ALERT_WORKER_NAME}.mjs`), source);
307
+ writeWorkerEntry(dest, ALERT_WORKER_NAME, source);
286
308
  }
287
309
 
288
310
  function emitUptimeScheduledTrigger(token: string) {
@@ -400,7 +422,7 @@ export const config = {
400
422
  };
401
423
  `;
402
424
 
403
- writeFileSync(path.join(dest, `${UPTIME_WORKER_NAME}.mjs`), source);
425
+ writeWorkerEntry(dest, UPTIME_WORKER_NAME, source);
404
426
  }
405
427
 
406
428
  function emitRollupScheduledTrigger(token: string) {
@@ -500,7 +522,7 @@ export const config = {
500
522
  };
501
523
  `;
502
524
 
503
- writeFileSync(path.join(dest, `${ROLLUP_WORKER_NAME}.mjs`), source);
525
+ writeWorkerEntry(dest, ROLLUP_WORKER_NAME, source);
504
526
  }
505
527
 
506
528
  function emitBigQueryScheduledTrigger(token: string) {
@@ -600,7 +622,7 @@ export const config = {
600
622
  };
601
623
  `;
602
624
 
603
- writeFileSync(path.join(dest, `${BIGQUERY_WORKER_NAME}.mjs`), source);
625
+ writeWorkerEntry(dest, BIGQUERY_WORKER_NAME, source);
604
626
  }
605
627
 
606
628
  function emitRetentionScheduledTrigger(token: string) {
@@ -702,7 +724,7 @@ export const config = {
702
724
  };
703
725
  `;
704
726
 
705
- writeFileSync(path.join(dest, `${RETENTION_WORKER_NAME}.mjs`), source);
727
+ writeWorkerEntry(dest, RETENTION_WORKER_NAME, source);
706
728
  }
707
729
 
708
730
  function isDirectRun(): boolean {
@@ -19,8 +19,57 @@ import {
19
19
  type SlackMessage,
20
20
  } from "../lib/slack";
21
21
 
22
- function parseWorkspace(raw?: string): Workspace {
23
- return raw === "secondary" ? "secondary" : "primary";
22
+ export function parseWorkspace(raw?: unknown): Workspace | null {
23
+ if (raw === undefined || raw === null || raw === "" || raw === "primary") {
24
+ return "primary";
25
+ }
26
+ if (raw === "secondary") return "secondary";
27
+ return null;
28
+ }
29
+
30
+ function invalidWorkspace(event: H3Event) {
31
+ setResponseStatus(event, 400);
32
+ return { error: "workspace must be primary or secondary" };
33
+ }
34
+
35
+ export function parseCursorMap(
36
+ raw?: unknown,
37
+ ): { ok: true; value: Record<string, string> } | { ok: false } {
38
+ if (raw === undefined || raw === null || raw === "") {
39
+ return { ok: true, value: {} };
40
+ }
41
+
42
+ try {
43
+ const parsed: unknown = JSON.parse(String(raw));
44
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
45
+ return { ok: false };
46
+ }
47
+ const entries = Object.entries(parsed);
48
+ if (
49
+ entries.some(
50
+ ([, value]) =>
51
+ typeof value !== "string" ||
52
+ !/^\d+(?:\.\d{1,6})?$/.test(value.trim()),
53
+ )
54
+ ) {
55
+ return { ok: false };
56
+ }
57
+ return {
58
+ ok: true,
59
+ value: Object.fromEntries(
60
+ entries.map(([channelId, value]) => [channelId, value.trim()]),
61
+ ),
62
+ };
63
+ } catch {
64
+ return { ok: false };
65
+ }
66
+ }
67
+
68
+ function invalidCursors(event: H3Event) {
69
+ setResponseStatus(event, 400);
70
+ return {
71
+ error: "cursors must be a JSON object of channel IDs to timestamps",
72
+ };
24
73
  }
25
74
 
26
75
  async function requireSlackCredential(event: H3Event, workspace: Workspace) {
@@ -34,6 +83,7 @@ export const handleSlackTeam = defineEventHandler((event) =>
34
83
  try {
35
84
  const { workspace: workspaceParam } = getQuery(event);
36
85
  const workspace = parseWorkspace(workspaceParam as string);
86
+ if (!workspace) return invalidWorkspace(event);
37
87
  const missing = await requireSlackCredential(event, workspace);
38
88
  if (missing) return missing;
39
89
  const team = await getTeamInfo(workspace);
@@ -51,6 +101,7 @@ export const handleSlackChannels = defineEventHandler((event) =>
51
101
  try {
52
102
  const { workspace: workspaceParam, cursor } = getQuery(event);
53
103
  const workspace = parseWorkspace(workspaceParam as string);
104
+ if (!workspace) return invalidWorkspace(event);
54
105
  const missing = await requireSlackCredential(event, workspace);
55
106
  if (missing) return missing;
56
107
  const result = await listChannelsWithCoverage(
@@ -102,6 +153,7 @@ export const handleSlackHistory = defineEventHandler((event) =>
102
153
  cursor,
103
154
  } = getQuery(event);
104
155
  const workspace = parseWorkspace(workspaceParam as string);
156
+ if (!workspace) return invalidWorkspace(event);
105
157
  const missing = await requireSlackCredential(event, workspace);
106
158
  if (missing) return missing;
107
159
  const limit = parseInt((limitParam as string) || "50", 10);
@@ -174,6 +226,7 @@ export const handleSlackMultiHistory = defineEventHandler((event) =>
174
226
  cursors: cursorsParam,
175
227
  } = getQuery(event);
176
228
  const workspace = parseWorkspace(workspaceParam as string);
229
+ if (!workspace) return invalidWorkspace(event);
177
230
  const missing = await requireSlackCredential(event, workspace);
178
231
  if (missing) return missing;
179
232
  // cursors is a JSON-encoded object: { channelId: timestamp }
@@ -188,9 +241,9 @@ export const handleSlackMultiHistory = defineEventHandler((event) =>
188
241
  const channelNamesList = namesParam
189
242
  ? (namesParam as string).split(",")
190
243
  : channelIds;
191
- const cursors: Record<string, string> = cursorsParam
192
- ? JSON.parse(cursorsParam as string)
193
- : {};
244
+ const parsedCursors = parseCursorMap(cursorsParam);
245
+ if (!parsedCursors.ok) return invalidCursors(event);
246
+ const cursors = parsedCursors.value;
194
247
 
195
248
  // Fetch pageSize messages from each channel in parallel while preserving
196
249
  // partial results when the bot is not invited to one of the channels.
@@ -358,6 +411,7 @@ export const handleSlackSearch = defineEventHandler((event) =>
358
411
  try {
359
412
  const { workspace: workspaceParam, query } = getQuery(event);
360
413
  const workspace = parseWorkspace(workspaceParam as string);
414
+ if (!workspace) return invalidWorkspace(event);
361
415
  const missing = await requireSlackCredential(event, workspace);
362
416
  if (missing) return missing;
363
417
 
@@ -69,15 +69,20 @@ async function resolveOrgRole(
69
69
  userEmail: string,
70
70
  orgId: string,
71
71
  ): Promise<string | null> {
72
- try {
73
- const { rows } = await getDbExec().execute({
72
+ // A failed lookup must never collapse into "no role": that reads downstream as
73
+ // a denial and 403s org owners whenever the database is briefly unreachable.
74
+ const { rows } = await getDbExec()
75
+ .execute({
74
76
  sql: `SELECT role FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,
75
77
  args: [orgId, userEmail.toLowerCase()],
78
+ })
79
+ .catch((error: unknown) => {
80
+ throw new DbAdminConnectionError(
81
+ 503,
82
+ `Couldn't verify your organization role: ${redactDbAdminError(error)}`,
83
+ );
76
84
  });
77
- return readString((rows[0] ?? {}) as Record<string, unknown>, "role");
78
- } catch {
79
- return null;
80
- }
85
+ return readString((rows[0] ?? {}) as Record<string, unknown>, "role");
81
86
  }
82
87
 
83
88
  export async function requireAnalyticsAdminContext(input?: {