@agent-native/core 0.169.1 → 0.171.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 (463) 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/auth.d.ts +1 -0
  294. package/dist/app-config/auth.js +7 -0
  295. package/dist/app-config/configuration-error.d.ts +11 -0
  296. package/dist/app-config/configuration-error.js +14 -0
  297. package/dist/app-config/index.d.ts +1 -0
  298. package/dist/app-config/index.js +1 -0
  299. package/dist/app-config/integrations.d.ts +1 -0
  300. package/dist/app-config/integrations.js +10 -0
  301. package/dist/app-config/plugins.d.ts +34 -0
  302. package/dist/app-config/plugins.js +39 -0
  303. package/dist/app-config/run-lifecycle-invariants.d.ts +18 -9
  304. package/dist/app-config/run-lifecycle-invariants.js +18 -25
  305. package/dist/app-config/schema.d.ts +17 -0
  306. package/dist/app-config/schema.js +2 -0
  307. package/dist/chat-threads/schema-migrations.js +20 -0
  308. package/dist/chat-threads/store.js +21 -4
  309. package/dist/cli/native-dependencies.d.ts +4 -0
  310. package/dist/cli/native-dependencies.js +15 -0
  311. package/dist/client/EnvironmentBadge.d.ts +1 -1
  312. package/dist/client/EnvironmentBadge.js +40 -5
  313. package/dist/client/MultiTabAssistantChat.d.ts +1 -1
  314. package/dist/client/MultiTabAssistantChat.js +35 -14
  315. package/dist/client/agent-chat/index.d.ts +1 -1
  316. package/dist/client/agent-chat/index.js +1 -1
  317. package/dist/client/agent-page/use-jobs.d.ts +2 -1
  318. package/dist/client/agent-page/use-jobs.js +3 -5
  319. package/dist/client/agent-sidebar-state.js +3 -1
  320. package/dist/client/blocks/library/code-tabs.js +5 -0
  321. package/dist/client/blocks/library/code.js +1 -0
  322. package/dist/client/chat-first/apps-rail.js +2 -2
  323. package/dist/client/chat-model-groups.d.ts +12 -0
  324. package/dist/client/chat-model-groups.js +3 -2
  325. package/dist/client/integrations/GoogleProductLogo.d.ts +5 -0
  326. package/dist/client/integrations/GoogleProductLogo.js +45 -0
  327. package/dist/client/integrations/index.d.ts +2 -0
  328. package/dist/client/integrations/index.js +2 -0
  329. package/dist/client/integrations/workspace-provider-oauth.d.ts +8 -0
  330. package/dist/client/integrations/workspace-provider-oauth.js +13 -0
  331. package/dist/client/resources/mcp-integration-catalog.js +0 -29
  332. package/dist/client/settings/SettingsTabsPage.js +10 -6
  333. package/dist/client/sharing/ShareButton.js +11 -2
  334. package/dist/client/use-chat-models.d.ts +6 -0
  335. package/dist/client/use-chat-models.js +10 -0
  336. package/dist/client/use-db-sync.js +27 -9
  337. package/dist/collab/routes.d.ts +1 -1
  338. package/dist/collab/struct-routes.d.ts +1 -1
  339. package/dist/connections/catalog.d.ts +111 -9
  340. package/dist/connections/catalog.js +86 -30
  341. package/dist/db/create-get-db.js +18 -0
  342. package/dist/db/ddl-guard.d.ts +0 -4
  343. package/dist/db/ddl-guard.js +46 -0
  344. package/dist/deploy/build.d.ts +19 -0
  345. package/dist/deploy/build.js +190 -16
  346. package/dist/deploy/function-bundle.d.ts +45 -0
  347. package/dist/deploy/function-bundle.js +337 -0
  348. package/dist/deploy/workspace-deploy.js +19 -1
  349. package/dist/eject/workspace-connections.js +4 -0
  350. package/dist/email-catalog/registry.d.ts +4 -0
  351. package/dist/email-catalog/registry.js +79 -14
  352. package/dist/extensions/content-patch.js +14 -2
  353. package/dist/integrations/plugin.d.ts +10 -0
  354. package/dist/integrations/plugin.js +40 -6
  355. package/dist/jobs/actions/run-automation-now.d.ts +2 -1
  356. package/dist/jobs/actions/run-automation-now.js +11 -5
  357. package/dist/jobs/frontmatter.js +53 -2
  358. package/dist/jobs/run-now.d.ts +11 -1
  359. package/dist/jobs/run-now.js +42 -7
  360. package/dist/jobs/scheduler.d.ts +1 -0
  361. package/dist/jobs/scheduler.js +2 -1
  362. package/dist/localization/core-messages/ar-SA.js +3 -0
  363. package/dist/localization/core-messages/de-DE.js +3 -0
  364. package/dist/localization/core-messages/en-US.d.ts +3 -0
  365. package/dist/localization/core-messages/en-US.js +3 -0
  366. package/dist/localization/core-messages/es-ES.js +3 -0
  367. package/dist/localization/core-messages/fr-FR.js +3 -0
  368. package/dist/localization/core-messages/hi-IN.js +3 -0
  369. package/dist/localization/core-messages/ja-JP.js +3 -0
  370. package/dist/localization/core-messages/ko-KR.js +3 -0
  371. package/dist/localization/core-messages/pt-BR.js +3 -0
  372. package/dist/localization/core-messages/zh-CN.js +3 -0
  373. package/dist/localization/core-messages/zh-TW.js +3 -0
  374. package/dist/localization/core-messages.d.ts +3 -0
  375. package/dist/localization/default-messages.d.ts +2 -5
  376. package/dist/localization/default-messages.js +2 -5
  377. package/dist/mcp/build-server.d.ts +9 -0
  378. package/dist/mcp/build-server.js +37 -8
  379. package/dist/mcp-client/oauth-client.d.ts +7 -0
  380. package/dist/mcp-client/oauth-client.js +12 -1
  381. package/dist/oauth-tokens/index.d.ts +1 -1
  382. package/dist/oauth-tokens/index.js +1 -1
  383. package/dist/oauth-tokens/lifecycle.d.ts +11 -0
  384. package/dist/oauth-tokens/lifecycle.js +17 -0
  385. package/dist/oauth-tokens/store.js +7 -0
  386. package/dist/observability/posthog-ai.d.ts +15 -1
  387. package/dist/observability/posthog-ai.js +24 -12
  388. package/dist/observability/traces.js +158 -28
  389. package/dist/onboarding/app-profile.js +2 -2
  390. package/dist/onboarding/plugin.js +10 -2
  391. package/dist/onboarding/types.d.ts +2 -0
  392. package/dist/provider-api/actions/custom-provider-registration.d.ts +1 -1
  393. package/dist/provider-api/actions/provider-api.d.ts +2 -2
  394. package/dist/provider-api/index.js +2 -0
  395. package/dist/resources/handlers.d.ts +2 -2
  396. package/dist/resources/store.js +13 -4
  397. package/dist/scripts/agent-engines/list-agent-engines.js +29 -3
  398. package/dist/secrets/register-framework-secrets.js +1 -1
  399. package/dist/server/action-discovery.js +5 -0
  400. package/dist/server/agent-chat/action-filters-a2a.d.ts +27 -3
  401. package/dist/server/agent-chat/action-filters-a2a.js +48 -9
  402. package/dist/server/agent-chat-plugin.js +36 -9
  403. package/dist/server/agent-discovery.js +43 -20
  404. package/dist/server/auth.js +18 -16
  405. package/dist/server/beta-opt-out-html.js +45 -4
  406. package/dist/server/better-auth-instance.d.ts +2 -1
  407. package/dist/server/better-auth-instance.js +37 -7
  408. package/dist/server/builder-design-systems.d.ts +4 -1
  409. package/dist/server/builder-design-systems.js +87 -6
  410. package/dist/server/builder-oauth.d.ts +1 -7
  411. package/dist/server/builder-oauth.js +80 -163
  412. package/dist/server/core-routes-plugin.d.ts +29 -0
  413. package/dist/server/core-routes-plugin.js +100 -20
  414. package/dist/server/default-plugins.d.ts +18 -0
  415. package/dist/server/default-plugins.js +22 -0
  416. package/dist/server/edge.d.ts +1 -0
  417. package/dist/server/edge.js +1 -0
  418. package/dist/server/framework-request-handler.js +31 -3
  419. package/dist/server/google-oauth.d.ts +3 -0
  420. package/dist/server/google-oauth.js +3 -0
  421. package/dist/server/index.d.ts +4 -4
  422. package/dist/server/index.js +3 -3
  423. package/dist/server/onboarding-html.js +37 -3
  424. package/dist/server/realtime-token.d.ts +1 -1
  425. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  426. package/dist/server/workspace-provider-oauth.js +72 -20
  427. package/dist/shared/agent-sidebar-url.d.ts +1 -0
  428. package/dist/shared/agent-sidebar-url.js +1 -0
  429. package/dist/shared/environment-lanes.d.ts +2 -0
  430. package/dist/shared/environment-lanes.js +3 -1
  431. package/dist/shared/index.d.ts +3 -1
  432. package/dist/shared/index.js +3 -1
  433. package/dist/shared/surface-visibility.d.ts +31 -0
  434. package/dist/shared/surface-visibility.js +57 -0
  435. package/dist/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  436. package/dist/templates/chat/app/routes.ts +3 -1
  437. package/dist/templates/chat/vitest.config.ts +8 -0
  438. package/dist/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  439. package/dist/templates/default/app/routes.ts +3 -1
  440. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  441. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
  442. package/dist/tracking/registry.d.ts +11 -0
  443. package/dist/tracking/registry.js +5 -2
  444. package/dist/triggers/actions.js +10 -3
  445. package/dist/usage/store.js +23 -3
  446. package/dist/user-profile/actions/get-auth-methods.js +18 -5
  447. package/dist/vite/client.js +33 -7
  448. package/docs/content/actions-access-control.mdx +43 -4
  449. package/docs/content/actions-defining.mdx +16 -0
  450. package/docs/content/authentication.mdx +40 -21
  451. package/docs/content/environment-variables.mdx +1 -0
  452. package/docs/content/template-clips-capture-everywhere.mdx +29 -30
  453. package/docs/content/template-clips-developers.mdx +4 -4
  454. package/docs/content/template-clips.mdx +3 -1
  455. package/package.json +2 -2
  456. package/src/eject/workspace-connections.ts +4 -0
  457. package/src/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  458. package/src/templates/chat/app/routes.ts +3 -1
  459. package/src/templates/chat/vitest.config.ts +8 -0
  460. package/src/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  461. package/src/templates/default/app/routes.ts +3 -1
  462. package/src/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  463. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
@@ -1,4 +1,4 @@
1
- import { getDbExec } from "@agent-native/core/db";
1
+ import { getDbExec, isPostgres } from "@agent-native/core/db";
2
2
  import { runWithRequestContext } from "@agent-native/core/server";
3
3
  import { and, eq, isNull, lt, or } from "drizzle-orm";
4
4
 
@@ -1072,6 +1072,130 @@ export function scopedAnalyticsSql(
1072
1072
  return { sql: rewritten, args };
1073
1073
  }
1074
1074
 
1075
+ /**
1076
+ * Dashboard panel SQL (seeded and agent/user-authored) is written against
1077
+ * PostgreSQL date/JSON syntax — `to_char`/`INTERVAL`/`::date`/`::jsonb ->>` —
1078
+ * because that's the dialect this app runs against in production. A local
1079
+ * SQLite dev database doesn't understand any of that and throws a syntax
1080
+ * error before a row is ever read. Rather than hand-rewrite every seeded
1081
+ * panel's SQL (this app also lets the agent/UI author new first-party SQL
1082
+ * panels through this exact same execution path), translate the handful of
1083
+ * Postgres-only shapes this query surface actually produces into SQLite
1084
+ * equivalents right here at the execution boundary. PostgreSQL SQL is never
1085
+ * touched: this only runs when the active database is not Postgres.
1086
+ */
1087
+ export function toSqliteCompatibleFirstPartySql(sql: string): string {
1088
+ let out = sql;
1089
+
1090
+ // properties::jsonb ->> 'key' -> json_extract(properties, '$."key"')
1091
+ // (a quoted JSON path member tolerates keys like "$ai_model" that start
1092
+ // with a character SQLite's unquoted path syntax can't lead with).
1093
+ out = out.replace(
1094
+ /([A-Za-z_][A-Za-z0-9_.]*)::jsonb\s*->>\s*'([^']*)'/g,
1095
+ (_match, column: string, key: string) =>
1096
+ `json_extract(${column}, '$."${key}"')`,
1097
+ );
1098
+
1099
+ // Postgres chr(N) -> SQLite char(N).
1100
+ out = out.replace(/\bchr\(/g, "char(");
1101
+
1102
+ // Any other Postgres type cast (::date, ::float, ::timestamptz, ...) is a
1103
+ // no-op on SQLite's dynamically-typed columns.
1104
+ out = out.replace(/::[A-Za-z_][A-Za-z0-9_]*/g, "");
1105
+
1106
+ // to_char(date_trunc('week', X), 'YYYY-MM-DD') -> Monday of X's week.
1107
+ // ('weekday 0' finds the next Sunday, '-6 days' steps back to that week's
1108
+ // Monday, matching Postgres's ISO week truncation.)
1109
+ out = out.replace(
1110
+ /to_char\(\s*date_trunc\(\s*'week'\s*,\s*([^()]+?)\s*\)\s*,\s*'YYYY-MM-DD'\s*\)/g,
1111
+ (_match, expr: string) => `date(${expr}, 'weekday 0', '-6 days')`,
1112
+ );
1113
+
1114
+ // <dateish-expr> (+|-) INTERVAL 'N days' -> the same day count applied
1115
+ // through SQLite's julian-day arithmetic, immediately reformatted back to
1116
+ // 'YYYY-MM-DD' text. Re-wrapping right away (instead of leaving a bare
1117
+ // julian-day number) matters: this expression sometimes appears outside
1118
+ // any to_char() call, compared directly against a text date column, and
1119
+ // SQLite treats any numeric value as less than any text value — a bare
1120
+ // number here would make that comparison silently always-true.
1121
+ out = out.replace(
1122
+ /([A-Za-z_][A-Za-z0-9_.]*|CURRENT_DATE)\s*(\+|-)\s*INTERVAL\s*'(\d+)\s*days?'/g,
1123
+ (_match, base: string, op: string, days: string) => {
1124
+ const juliandayBase = base === "CURRENT_DATE" ? "'now'" : base;
1125
+ return `date(julianday(${juliandayBase}) ${op} ${days})`;
1126
+ },
1127
+ );
1128
+
1129
+ // <dateish-expr ending in "date"> (+|-) <identifier> (no INTERVAL
1130
+ // keyword) — e.g. `bounds.start_date + offsets.n` in a generated date
1131
+ // series. Scoped to identifiers ending in "date" so unrelated integer
1132
+ // arithmetic (e.g. building the offsets themselves) is left alone.
1133
+ out = out.replace(
1134
+ /([A-Za-z_][A-Za-z0-9_.]*date)\s*(\+|-)\s*([A-Za-z_][A-Za-z0-9_.]*)/g,
1135
+ (_match, base: string, op: string, rhs: string) =>
1136
+ `date(julianday(${base}) ${op} ${rhs})`,
1137
+ );
1138
+
1139
+ // Every surviving to_char(expr, 'YYYY-MM-DD') now wraps an expr that
1140
+ // already evaluates to 'YYYY-MM-DD' text (a bare CURRENT_DATE, or one of
1141
+ // the date(...) forms produced above) — unwrap the call instead of
1142
+ // re-wrapping it. A regex can't balance the arbitrarily nested parens
1143
+ // `date(julianday(...) ...)` can produce, so walk the string instead.
1144
+ out = unwrapPostgresToChar(out);
1145
+
1146
+ return out;
1147
+ }
1148
+
1149
+ /**
1150
+ * Finds each top-level `to_char(expr, 'YYYY-MM-DD')` call and replaces it
1151
+ * with `expr` alone. Balances parens by hand rather than by regex so nested
1152
+ * calls (`date(julianday(...) - 7)`) unwrap correctly regardless of depth.
1153
+ */
1154
+ function unwrapPostgresToChar(sql: string): string {
1155
+ const marker = "to_char(";
1156
+ let out = "";
1157
+ let i = 0;
1158
+ while (i < sql.length) {
1159
+ const idx = sql.indexOf(marker, i);
1160
+ if (idx === -1) {
1161
+ out += sql.slice(i);
1162
+ break;
1163
+ }
1164
+ out += sql.slice(i, idx);
1165
+ const openParen = idx + marker.length - 1;
1166
+ let depth = 0;
1167
+ let closeParen = openParen;
1168
+ for (; closeParen < sql.length; closeParen++) {
1169
+ if (sql[closeParen] === "(") depth++;
1170
+ else if (sql[closeParen] === ")") {
1171
+ depth--;
1172
+ if (depth === 0) break;
1173
+ }
1174
+ }
1175
+ const inner = sql.slice(openParen + 1, closeParen);
1176
+ let innerDepth = 0;
1177
+ let topLevelCommaIdx = -1;
1178
+ for (let k = 0; k < inner.length; k++) {
1179
+ if (inner[k] === "(") innerDepth++;
1180
+ else if (inner[k] === ")") innerDepth--;
1181
+ else if (inner[k] === "," && innerDepth === 0) topLevelCommaIdx = k;
1182
+ }
1183
+ const expr =
1184
+ topLevelCommaIdx === -1 ? inner : inner.slice(0, topLevelCommaIdx);
1185
+ const format =
1186
+ topLevelCommaIdx === -1 ? "" : inner.slice(topLevelCommaIdx + 1).trim();
1187
+ if (format === "'YYYY-MM-DD'") {
1188
+ out += expr.trim();
1189
+ } else {
1190
+ // Not the to_char(expr, 'YYYY-MM-DD') shape this app's SQL uses;
1191
+ // leave it untouched rather than guess at unfamiliar formats.
1192
+ out += sql.slice(idx, closeParen + 1);
1193
+ }
1194
+ i = closeParen + 1;
1195
+ }
1196
+ return out;
1197
+ }
1198
+
1075
1199
  function valueType(value: unknown): string {
1076
1200
  if (typeof value === "number") return "number";
1077
1201
  if (typeof value === "boolean") return "boolean";
@@ -1141,7 +1265,13 @@ export async function queryFirstPartyAnalytics(
1141
1265
  return queryFirstPartyAnalyticsInBigQuery(scoped.sql, scoped.args, table);
1142
1266
  }
1143
1267
  const scoped = scopedAnalyticsSql(sql, scope);
1144
- const wrappedSql = `SELECT * FROM (${scoped.sql}) AS first_party_analytics_query LIMIT ${MAX_QUERY_ROWS}`;
1268
+ // Dashboard SQL is authored against Postgres date/JSON syntax; translate
1269
+ // it for a non-Postgres sql-store (local SQLite dev) at the last possible
1270
+ // moment so Postgres itself never sees a rewritten query.
1271
+ const dialectSql = isPostgres()
1272
+ ? scoped.sql
1273
+ : toSqliteCompatibleFirstPartySql(scoped.sql);
1274
+ const wrappedSql = `SELECT * FROM (${dialectSql}) AS first_party_analytics_query LIMIT ${MAX_QUERY_ROWS}`;
1145
1275
  const timeoutMs = Math.max(
1146
1276
  1,
1147
1277
  options.timeoutMs ?? FIRST_PARTY_ANALYTICS_QUERY_TIMEOUT_MS,
@@ -466,8 +466,10 @@ export async function resolveUsersWithCoverage(
466
466
  }
467
467
 
468
468
  const unresolvedUserIds = [...unresolvedUsers];
469
- for (const id of unresolvedUserIds) {
470
- results[id] = fallbackSlackUser(id);
469
+ if (!directoryError) {
470
+ for (const id of unresolvedUserIds) {
471
+ results[id] = fallbackSlackUser(id);
472
+ }
471
473
  }
472
474
 
473
475
  // Resolve bot users from messages that have bot_id but no user
@@ -14,7 +14,12 @@ export default mergeConfig(
14
14
  },
15
15
  test: {
16
16
  include: ["**/*.{test,spec}.?(c|m)[jt]s?(x)"],
17
- exclude: ["**/node_modules/**", "**/.git/**", "**/dist/**"],
17
+ exclude: [
18
+ "**/node_modules/**",
19
+ "**/.git/**",
20
+ "**/dist/**",
21
+ "**/.react-router/**",
22
+ ],
18
23
  },
19
24
  }),
20
25
  );
@@ -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
 
@@ -20,11 +20,13 @@ import {
20
20
  } from "@agent-native/core/client/host";
21
21
  import { useT } from "@agent-native/core/client/i18n";
22
22
  import {
23
- AGENT_NATIVE_EMBED_MESSAGE_TYPES,
24
- createAgentNativeEmbedEnvelope,
25
23
  createEmbeddedAppBridge,
26
24
  type EmbeddedAppBridge,
27
- } from "@agent-native/core/embedding";
25
+ } from "@agent-native/core/embedding/bridge";
26
+ import {
27
+ AGENT_NATIVE_EMBED_MESSAGE_TYPES,
28
+ createAgentNativeEmbedEnvelope,
29
+ } from "@agent-native/core/embedding/protocol";
28
30
  import {
29
31
  EMBED_MODE_QUERY_PARAM,
30
32
  EMBED_TOKEN_QUERY_PARAM,
@@ -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 Library page (and the /brand-kits, /libraries, and /picker links that redirect to it) getting stuck on a loading spinner instead of showing your folders and assets.
@@ -14,7 +14,12 @@ export default mergeConfig(
14
14
  },
15
15
  test: {
16
16
  include: ["**/*.{test,spec}.?(c|m)[jt]s?(x)"],
17
- exclude: ["**/node_modules/**", "**/.git/**", "**/dist/**"],
17
+ exclude: [
18
+ "**/node_modules/**",
19
+ "**/.git/**",
20
+ "**/dist/**",
21
+ "**/.react-router/**",
22
+ ],
18
23
  },
19
24
  }),
20
25
  );
@@ -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
 
@@ -0,0 +1 @@
1
+ export * from "@agent-native/toolkit/ui/pointer-lock";
@@ -67,6 +67,7 @@ import {
67
67
  } from "@/components/ui/dropdown-menu";
68
68
  import { Input } from "@/components/ui/input";
69
69
  import { Label } from "@/components/ui/label";
70
+ import { afterBodyPointerUnlock } from "@/components/ui/pointer-lock";
70
71
  import { Progress } from "@/components/ui/progress";
71
72
  import {
72
73
  Select,
@@ -2253,7 +2254,11 @@ export default function SourcesRoute() {
2253
2254
  result,
2254
2255
  sourceKey: form.sourceKey,
2255
2256
  });
2256
- if (handoff) setIngestHandoff(handoff);
2257
+ setSetupOpen(false);
2258
+ if (handoff) {
2259
+ afterBodyPointerUnlock(() => setIngestHandoff(handoff));
2260
+ }
2261
+ return;
2257
2262
  }
2258
2263
  setSetupOpen(false);
2259
2264
  }
@@ -2360,7 +2365,7 @@ export default function SourcesRoute() {
2360
2365
  : undefined
2361
2366
  }
2362
2367
  onSync={() => syncSource.mutate({ sourceId: source.id })}
2363
- onTune={() => openEdit(source)}
2368
+ onTune={() => afterBodyPointerUnlock(() => openEdit(source))}
2364
2369
  onImportMarkdown={() => setMarkdownImportSource(source)}
2365
2370
  onArchive={() => setArchiveSource(source)}
2366
2371
  />
@@ -2451,7 +2456,7 @@ export default function SourcesRoute() {
2451
2456
  }
2452
2457
  onAddSource={(provider) => {
2453
2458
  setAdvancedOpen(false);
2454
- openCreate(provider);
2459
+ afterBodyPointerUnlock(() => openCreate(provider));
2455
2460
  }}
2456
2461
  />
2457
2462
  </div>
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-22
4
+ ---
5
+
6
+ Tuning or adding a source no longer leaves the Sources page unresponsive.
@@ -11,6 +11,7 @@ export default mergeConfig(
11
11
  "**/dist/**",
12
12
  "**/.output/**",
13
13
  "**/.{idea,git,cache,output,temp}/**",
14
+ "**/.react-router/**",
14
15
  ],
15
16
  },
16
17
  }),
@@ -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
 
@@ -1,21 +1,100 @@
1
1
  import { defineAction } from "@agent-native/core";
2
- import { accessFilter } from "@agent-native/core/sharing";
3
- import { desc } from "drizzle-orm";
2
+ import {
3
+ getRequestOrgId,
4
+ getRequestUserEmail,
5
+ } from "@agent-native/core/server/request-context";
6
+ import {
7
+ accessFilter,
8
+ ROLE_RANK,
9
+ type ShareRole,
10
+ } from "@agent-native/core/sharing";
11
+ import { and, desc, eq, inArray, or, sql } from "drizzle-orm";
4
12
  import { z } from "zod";
5
13
 
6
14
  import { getDb, schema } from "../server/db/index.js";
7
15
  import { rowToBookingLink } from "../server/lib/booking-link-utils.js";
8
16
 
17
+ type EffectiveRole = "owner" | ShareRole;
18
+
19
+ function normalizeEmail(email: string | undefined): string | null {
20
+ const normalized = email?.trim().toLowerCase();
21
+ return normalized || null;
22
+ }
23
+
24
+ function strongerRole(current: ShareRole | null, next: ShareRole): ShareRole {
25
+ if (!current || ROLE_RANK[next] > ROLE_RANK[current]) return next;
26
+ return current;
27
+ }
28
+
9
29
  export default defineAction({
10
30
  description: "List all booking links",
11
31
  schema: z.object({}),
12
32
  http: { method: "GET" },
13
33
  run: async () => {
14
- const rows = await getDb()
34
+ const db = getDb();
35
+ const userEmail = normalizeEmail(getRequestUserEmail());
36
+ const orgId = getRequestOrgId();
37
+ const rows = await db
15
38
  .select()
16
39
  .from(schema.bookingLinks)
17
40
  .where(accessFilter(schema.bookingLinks, schema.bookingLinkShares))
18
41
  .orderBy(desc(schema.bookingLinks.updatedAt));
19
- return rows.map(rowToBookingLink);
42
+
43
+ if (rows.length === 0) return [];
44
+
45
+ const principalClauses: NonNullable<ReturnType<typeof and>>[] = [];
46
+ if (userEmail) {
47
+ principalClauses.push(
48
+ and(
49
+ eq(schema.bookingLinkShares.principalType, "user"),
50
+ sql`lower(${schema.bookingLinkShares.principalId}) = ${userEmail}`,
51
+ )!,
52
+ );
53
+ }
54
+ if (orgId) {
55
+ principalClauses.push(
56
+ and(
57
+ eq(schema.bookingLinkShares.principalType, "org"),
58
+ eq(schema.bookingLinkShares.principalId, orgId),
59
+ )!,
60
+ );
61
+ }
62
+
63
+ const shareRoleById = new Map<string, ShareRole>();
64
+ if (principalClauses.length > 0) {
65
+ const shareRows = await db
66
+ .select({
67
+ resourceId: schema.bookingLinkShares.resourceId,
68
+ role: schema.bookingLinkShares.role,
69
+ })
70
+ .from(schema.bookingLinkShares)
71
+ .where(
72
+ and(
73
+ inArray(
74
+ schema.bookingLinkShares.resourceId,
75
+ rows.map((row) => row.id),
76
+ ),
77
+ or(...principalClauses),
78
+ ),
79
+ );
80
+ for (const share of shareRows) {
81
+ shareRoleById.set(
82
+ share.resourceId,
83
+ strongerRole(shareRoleById.get(share.resourceId) ?? null, share.role),
84
+ );
85
+ }
86
+ }
87
+
88
+ return rows.map((row) => {
89
+ let role: EffectiveRole = shareRoleById.get(row.id) ?? "viewer";
90
+ if (
91
+ userEmail &&
92
+ normalizeEmail(row.ownerEmail) === userEmail &&
93
+ (!row.orgId || row.orgId === orgId)
94
+ ) {
95
+ role = "owner";
96
+ }
97
+ return { ...rowToBookingLink(row), accessRole: role };
98
+ });
20
99
  },
21
100
  });
@@ -57,7 +57,7 @@ export default defineAction({
57
57
  isActive: z.boolean().optional().describe("Whether the link is active"),
58
58
  }),
59
59
  run: async (args) => {
60
- await assertAccess("booking-link", args.id, "editor");
60
+ const access = await assertAccess("booking-link", args.id, "editor");
61
61
 
62
62
  const durationInput = normalizeBookingDurationInput({
63
63
  duration: args.duration,
@@ -90,6 +90,7 @@ export default defineAction({
90
90
  .select({
91
91
  slug: schema.bookingLinks.slug,
92
92
  ownerEmail: schema.bookingLinks.ownerEmail,
93
+ isActive: schema.bookingLinks.isActive,
93
94
  })
94
95
  .from(schema.bookingLinks)
95
96
  .where(eq(schema.bookingLinks.id, args.id));
@@ -116,7 +117,7 @@ export default defineAction({
116
117
  ? JSON.stringify(args.conferencing)
117
118
  : null,
118
119
  color: args.color ? args.color.trim() : null,
119
- isActive: args.isActive ?? true,
120
+ isActive: args.isActive ?? current.isActive,
120
121
  updatedAt: new Date().toISOString(),
121
122
  })
122
123
  .where(eq(schema.bookingLinks.id, args.id));
@@ -140,6 +141,6 @@ export default defineAction({
140
141
  .where(eq(schema.bookingLinks.id, args.id));
141
142
 
142
143
  if (!updated) throw new Error("Booking link not found");
143
- return rowToBookingLink(updated);
144
+ return { ...rowToBookingLink(updated), accessRole: access.role };
144
145
  },
145
146
  });
@@ -74,6 +74,7 @@ interface EventDetailPanelProps {
74
74
  onClose: () => void;
75
75
  onDelete: (eventId: string) => void;
76
76
  onTitleSave?: (eventId: string, title: string, accountEmail?: string) => void;
77
+ timezone?: string;
77
78
  }
78
79
 
79
80
  function formatDuration(start: string, end: string): string {
@@ -121,6 +122,7 @@ export function EventDetailPanel({
121
122
  onClose,
122
123
  onDelete,
123
124
  onTitleSave,
125
+ timezone,
124
126
  }: EventDetailPanelProps) {
125
127
  const t = useT();
126
128
  const workingLocationLabels = createWorkingLocationDisplayLabels(t);
@@ -451,7 +453,9 @@ export function EventDetailPanel({
451
453
  {format(
452
454
  getDisplayDateInTimezone(
453
455
  event.start,
454
- event.startTimeZone ?? event.endTimeZone,
456
+ timezone ??
457
+ event.startTimeZone ??
458
+ event.endTimeZone,
455
459
  ),
456
460
  "h:mm a",
457
461
  )}
@@ -459,7 +463,9 @@ export function EventDetailPanel({
459
463
  {format(
460
464
  getDisplayDateInTimezone(
461
465
  event.end,
462
- event.endTimeZone ?? event.startTimeZone,
466
+ timezone ??
467
+ event.endTimeZone ??
468
+ event.startTimeZone,
463
469
  ),
464
470
  "h:mm a",
465
471
  )}
@@ -471,7 +477,9 @@ export function EventDetailPanel({
471
477
  {format(
472
478
  getDisplayDateInTimezone(
473
479
  event.start,
474
- event.startTimeZone ?? event.endTimeZone,
480
+ timezone ??
481
+ event.startTimeZone ??
482
+ event.endTimeZone,
475
483
  ),
476
484
  "EEE MMM d",
477
485
  )}
@@ -489,7 +489,7 @@ export function EventDetailPopover({
489
489
  const t = useT();
490
490
  const workingLocationLabels = createWorkingLocationDisplayLabels(t);
491
491
  const isMobile = useIsMobile();
492
- const eventTimezone = event.startTimeZone || timezone || getLocalTimezone();
492
+ const eventTimezone = timezone || event.startTimeZone || getLocalTimezone();
493
493
  const [open, setOpen] = useState(defaultOpen);
494
494
  const [editingTitle, setEditingTitle] = useState(
495
495
  defaultOpen ? getEditableEventTitle(event) : "",