@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
@@ -152,6 +152,23 @@ const BRAND_ICON_LINK_CLASS =
152
152
  const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
153
153
  const BOOKING_SLOT_STEP_MINUTES = 30;
154
154
 
155
+ function canEditBookingLink(link: BookingLink | null | undefined) {
156
+ return (
157
+ !link?.accessRole ||
158
+ link.accessRole === "owner" ||
159
+ link.accessRole === "admin" ||
160
+ link.accessRole === "editor"
161
+ );
162
+ }
163
+
164
+ function canDeleteBookingLink(link: BookingLink | null | undefined) {
165
+ return (
166
+ !link?.accessRole ||
167
+ link.accessRole === "owner" ||
168
+ link.accessRole === "admin"
169
+ );
170
+ }
171
+
155
172
  type DraftLink = {
156
173
  id?: string;
157
174
  title: string;
@@ -785,6 +802,8 @@ export default function BookingLinksPage({
785
802
  () => bookingLinks.find((link) => link.id === selectedId) ?? null,
786
803
  [bookingLinks, selectedId],
787
804
  );
805
+ const canEditSelectedLink = canEditBookingLink(selectedLink);
806
+ const canDeleteSelectedLink = canDeleteBookingLink(selectedLink);
788
807
 
789
808
  useEffect(() => {
790
809
  if (!selectedLink) {
@@ -1067,19 +1086,21 @@ export default function BookingLinksPage({
1067
1086
  <TooltipContent>{t("bookingLinks.openLink")}</TooltipContent>
1068
1087
  </Tooltip>
1069
1088
  </TooltipProvider>
1070
- <Button
1071
- type="button"
1072
- size="sm"
1073
- onClick={() => void handleSaveRef.current()}
1074
- disabled={updateBookingLink.isPending || !hasUnsavedChanges}
1075
- className="h-8 px-3"
1076
- >
1077
- {updateBookingLink.isPending
1078
- ? t("common.saving")
1079
- : hasUnsavedChanges
1080
- ? t("eventDialog.saveChanges")
1081
- : t("bookingLinks.saved")}
1082
- </Button>
1089
+ {canEditSelectedLink && (
1090
+ <Button
1091
+ type="button"
1092
+ size="sm"
1093
+ onClick={() => void handleSaveRef.current()}
1094
+ disabled={updateBookingLink.isPending || !hasUnsavedChanges}
1095
+ className="h-8 px-3"
1096
+ >
1097
+ {updateBookingLink.isPending
1098
+ ? t("common.saving")
1099
+ : hasUnsavedChanges
1100
+ ? t("eventDialog.saveChanges")
1101
+ : t("bookingLinks.saved")}
1102
+ </Button>
1103
+ )}
1083
1104
  </div>
1084
1105
  ) : null,
1085
1106
  };
@@ -1091,6 +1112,7 @@ export default function BookingLinksPage({
1091
1112
  previewUrl,
1092
1113
  updateBookingLink.isPending,
1093
1114
  hasUnsavedChanges,
1115
+ canEditSelectedLink,
1094
1116
  navigate,
1095
1117
  activeTab,
1096
1118
  t,
@@ -1160,7 +1182,7 @@ export default function BookingLinksPage({
1160
1182
  </div>
1161
1183
  </div>
1162
1184
  ) : selectedLink ? (
1163
- <>
1185
+ <fieldset disabled={!canEditSelectedLink} className="contents">
1164
1186
  {/* Title */}
1165
1187
  <div className="space-y-2">
1166
1188
  <Label htmlFor="booking-link-title">
@@ -1474,47 +1496,50 @@ export default function BookingLinksPage({
1474
1496
  </p>
1475
1497
  </div>
1476
1498
  <Switch
1499
+ aria-label={t("bookingLinks.linkVisibility")}
1477
1500
  checked={draft.isActive}
1478
1501
  onCheckedChange={(checked) =>
1479
1502
  setDraft((prev) => ({ ...prev, isActive: checked }))
1480
1503
  }
1481
1504
  />
1482
1505
  </div>
1483
- <AlertDialog>
1484
- <AlertDialogTrigger asChild>
1485
- <button
1486
- type="button"
1487
- className="flex items-center gap-1.5 text-xs text-muted-foreground hover:text-destructive"
1488
- >
1489
- <IconTrash className="h-3.5 w-3.5" />
1490
- {t("eventForm.delete")}
1491
- </button>
1492
- </AlertDialogTrigger>
1493
- <AlertDialogContent>
1494
- <AlertDialogHeader>
1495
- <AlertDialogTitle>
1496
- {t("bookingLinks.deleteBookingLink")}
1497
- </AlertDialogTitle>
1498
- <AlertDialogDescription>
1499
- {t("bookingLinks.deleteDescriptionPrefix")}{" "}
1500
- <span className="font-medium text-foreground">
1501
- {draft.title}
1502
- </span>{" "}
1503
- {t("bookingLinks.deleteDescriptionSuffix")}
1504
- </AlertDialogDescription>
1505
- </AlertDialogHeader>
1506
- <AlertDialogFooter>
1507
- <AlertDialogCancel>
1508
- {t("eventForm.cancel")}
1509
- </AlertDialogCancel>
1510
- <AlertDialogAction onClick={handleDelete}>
1506
+ {canDeleteSelectedLink && (
1507
+ <AlertDialog>
1508
+ <AlertDialogTrigger asChild>
1509
+ <button
1510
+ type="button"
1511
+ className="flex items-center gap-1.5 text-xs text-muted-foreground hover:text-destructive"
1512
+ >
1513
+ <IconTrash className="h-3.5 w-3.5" />
1511
1514
  {t("eventForm.delete")}
1512
- </AlertDialogAction>
1513
- </AlertDialogFooter>
1514
- </AlertDialogContent>
1515
- </AlertDialog>
1515
+ </button>
1516
+ </AlertDialogTrigger>
1517
+ <AlertDialogContent>
1518
+ <AlertDialogHeader>
1519
+ <AlertDialogTitle>
1520
+ {t("bookingLinks.deleteBookingLink")}
1521
+ </AlertDialogTitle>
1522
+ <AlertDialogDescription>
1523
+ {t("bookingLinks.deleteDescriptionPrefix")}{" "}
1524
+ <span className="font-medium text-foreground">
1525
+ {draft.title}
1526
+ </span>{" "}
1527
+ {t("bookingLinks.deleteDescriptionSuffix")}
1528
+ </AlertDialogDescription>
1529
+ </AlertDialogHeader>
1530
+ <AlertDialogFooter>
1531
+ <AlertDialogCancel>
1532
+ {t("eventForm.cancel")}
1533
+ </AlertDialogCancel>
1534
+ <AlertDialogAction onClick={handleDelete}>
1535
+ {t("eventForm.delete")}
1536
+ </AlertDialogAction>
1537
+ </AlertDialogFooter>
1538
+ </AlertDialogContent>
1539
+ </AlertDialog>
1540
+ )}
1516
1541
  </div>
1517
- </>
1542
+ </fieldset>
1518
1543
  ) : null}
1519
1544
  </div>
1520
1545
 
@@ -1624,6 +1649,7 @@ export default function BookingLinksPage({
1624
1649
  ) : (
1625
1650
  <div className="space-y-3">
1626
1651
  {bookingLinks.map((link) => {
1652
+ const canEdit = canEditBookingLink(link);
1627
1653
  const durations =
1628
1654
  link.durations && link.durations.length > 0
1629
1655
  ? link.durations
@@ -1716,58 +1742,60 @@ export default function BookingLinksPage({
1716
1742
  </>
1717
1743
  )}
1718
1744
 
1719
- <DropdownMenu>
1720
- <DropdownMenuTrigger asChild>
1721
- <button
1722
- type="button"
1723
- onClick={(e) => e.stopPropagation()}
1724
- className="flex h-9 w-9 items-center justify-center rounded-full border border-border text-muted-foreground hover:text-foreground hover:bg-accent/60"
1725
- >
1726
- <IconDotsVertical className="h-4 w-4" />
1727
- </button>
1728
- </DropdownMenuTrigger>
1729
- <DropdownMenuContent align="end">
1730
- <DropdownMenuItem asChild>
1731
- <Link to={`/booking-links/${link.id}`}>
1732
- {t("eventForm.edit")}
1733
- </Link>
1734
- </DropdownMenuItem>
1735
- <DropdownMenuItem
1736
- onClick={() => {
1737
- updateBookingLink.mutate(
1738
- {
1739
- id: link.id,
1740
- title: link.title,
1741
- slug: link.slug,
1742
- duration: durations[0] ?? link.duration,
1743
- durations: link.durations,
1744
- hosts: link.hosts,
1745
- description: link.description,
1746
- customFields: link.customFields,
1747
- conferencing: link.conferencing,
1748
- color: link.color,
1749
- isActive: !link.isActive,
1750
- },
1751
- {
1752
- onSuccess: () =>
1753
- toast.success(
1754
- t(
1755
- link.isActive
1756
- ? "bookingLinks.linkDisabled"
1757
- : "bookingLinks.linkEnabled",
1758
- { title: link.title },
1745
+ {canEdit && (
1746
+ <DropdownMenu>
1747
+ <DropdownMenuTrigger asChild>
1748
+ <button
1749
+ type="button"
1750
+ onClick={(e) => e.stopPropagation()}
1751
+ className="flex h-9 w-9 items-center justify-center rounded-full border border-border text-muted-foreground hover:text-foreground hover:bg-accent/60"
1752
+ >
1753
+ <IconDotsVertical className="h-4 w-4" />
1754
+ </button>
1755
+ </DropdownMenuTrigger>
1756
+ <DropdownMenuContent align="end">
1757
+ <DropdownMenuItem asChild>
1758
+ <Link to={`/booking-links/${link.id}`}>
1759
+ {t("eventForm.edit")}
1760
+ </Link>
1761
+ </DropdownMenuItem>
1762
+ <DropdownMenuItem
1763
+ onClick={() => {
1764
+ updateBookingLink.mutate(
1765
+ {
1766
+ id: link.id,
1767
+ title: link.title,
1768
+ slug: link.slug,
1769
+ duration: durations[0] ?? link.duration,
1770
+ durations: link.durations,
1771
+ hosts: link.hosts,
1772
+ description: link.description,
1773
+ customFields: link.customFields,
1774
+ conferencing: link.conferencing,
1775
+ color: link.color,
1776
+ isActive: !link.isActive,
1777
+ },
1778
+ {
1779
+ onSuccess: () =>
1780
+ toast.success(
1781
+ t(
1782
+ link.isActive
1783
+ ? "bookingLinks.linkDisabled"
1784
+ : "bookingLinks.linkEnabled",
1785
+ { title: link.title },
1786
+ ),
1759
1787
  ),
1760
- ),
1761
- },
1762
- );
1763
- }}
1764
- >
1765
- {link.isActive
1766
- ? t("bookingLinks.disable")
1767
- : t("bookingLinks.enable")}
1768
- </DropdownMenuItem>
1769
- </DropdownMenuContent>
1770
- </DropdownMenu>
1788
+ },
1789
+ );
1790
+ }}
1791
+ >
1792
+ {link.isActive
1793
+ ? t("bookingLinks.disable")
1794
+ : t("bookingLinks.enable")}
1795
+ </DropdownMenuItem>
1796
+ </DropdownMenuContent>
1797
+ </DropdownMenu>
1798
+ )}
1771
1799
  </div>
1772
1800
  </div>
1773
1801
  </div>
@@ -2026,6 +2026,7 @@ export default function CalendarView() {
2026
2026
  onClose={() => setSidebarEvent(null)}
2027
2027
  onDelete={handleDeleteEvent}
2028
2028
  onTitleSave={handleTitleSave}
2029
+ timezone={displayTimezone}
2029
2030
  />
2030
2031
  )}
2031
2032
 
@@ -1,6 +1,7 @@
1
1
  import { ChangelogSettingsCard } from "@agent-native/core/client/changelog";
2
2
  import { callAction } from "@agent-native/core/client/hooks";
3
3
  import { LanguagePicker, useT } from "@agent-native/core/client/i18n";
4
+ import { startWorkspaceProviderOAuth } from "@agent-native/core/client/integrations";
4
5
  import { TeamPage } from "@agent-native/core/client/org";
5
6
  import {
6
7
  AccountSettingsCard,
@@ -51,7 +52,6 @@ import { Separator } from "@/components/ui/separator";
51
52
  import { Textarea } from "@/components/ui/textarea";
52
53
  import {
53
54
  useGoogleAuthStatus,
54
- useGoogleAuthUrl,
55
55
  useGoogleDesktopAuth,
56
56
  useDisconnectGoogle,
57
57
  } from "@/hooks/use-google-auth";
@@ -86,8 +86,6 @@ export default function Settings() {
86
86
  const zoomStatus = useZoomStatus();
87
87
  const connectZoom = useConnectZoom();
88
88
  const disconnectZoom = useDisconnectZoom();
89
- const [wantAuthUrl, setWantAuthUrl] = useState(false);
90
- const authUrl = useGoogleAuthUrl(wantAuthUrl);
91
89
  const canOfferGoogleOAuthSetup = shouldOfferGoogleOAuthSetup();
92
90
 
93
91
  const [timezone, setTimezone] = useState("");
@@ -131,24 +129,19 @@ export default function Settings() {
131
129
  });
132
130
  return;
133
131
  }
134
- setWantAuthUrl(true);
132
+ const returnPath = `${window.location.pathname}${window.location.search}`;
133
+ startWorkspaceProviderOAuth("google_calendar", {
134
+ appId: "calendar",
135
+ returnPath,
136
+ scope: "user",
137
+ });
135
138
  }
136
139
 
137
- useEffect(() => {
138
- if (!wantAuthUrl || !authUrl.data?.url) return;
139
- setWantAuthUrl(false);
140
- window.open(authUrl.data.url, "_blank");
141
- }, [wantAuthUrl, authUrl.data]);
142
-
143
- useEffect(() => {
144
- if (authUrl.error) {
145
- toast.error(authUrl.error.message);
146
- setWantAuthUrl(false);
147
- }
148
- }, [authUrl.error]);
149
-
150
140
  async function handleDisconnect() {
151
- const accounts = googleStatus.data?.accounts ?? [];
141
+ const accounts = (googleStatus.data?.accounts ?? []).filter(
142
+ (account) => !account.shared,
143
+ );
144
+ if (accounts.length === 0) return;
152
145
  try {
153
146
  for (const account of accounts) {
154
147
  await disconnectGoogle.mutateAsync(account.email);
@@ -278,71 +271,85 @@ export default function Settings() {
278
271
  </SettingsGroup>
279
272
 
280
273
  {/* Google Calendar Connection */}
281
- <Card id="google-calendar" className="scroll-mt-16">
282
- <CardHeader>
283
- <CardTitle className="text-lg">
284
- {t("settings.googleCalendar")}
285
- </CardTitle>
286
- <CardDescription>
287
- {t("settings.googleDescription")}
288
- </CardDescription>
289
- </CardHeader>
290
- <CardContent>
291
- <div className="flex items-center justify-between">
292
- <div className="flex items-center gap-3">
293
- {googleStatus.data?.connected ? (
294
- <>
295
- <IconCircleCheck className="h-5 w-5 text-emerald-600 dark:text-emerald-400" />
296
- <div>
297
- <p className="text-sm font-medium">
298
- {t("common.connected")}
299
- </p>
300
- {googleStatus.data.accounts?.length > 0 && (
301
- <p className="text-xs text-muted-foreground">
302
- {googleStatus.data.accounts
303
- .map((a) => a.email)
304
- .join(", ")}
274
+ {(googleStatus.isError ||
275
+ googleStatus.data?.connected ||
276
+ googleStatus.data?.configured === true ||
277
+ canOfferGoogleOAuthSetup) && (
278
+ <Card id="google-calendar" className="scroll-mt-16">
279
+ <CardHeader>
280
+ <CardTitle className="text-lg">
281
+ {t("settings.googleCalendar")}
282
+ </CardTitle>
283
+ <CardDescription>
284
+ {t("settings.googleDescription")}
285
+ </CardDescription>
286
+ </CardHeader>
287
+ <CardContent>
288
+ <div className="flex items-center justify-between">
289
+ <div className="flex items-center gap-3">
290
+ {googleStatus.data?.connected ? (
291
+ <>
292
+ <IconCircleCheck className="h-5 w-5 text-emerald-600 dark:text-emerald-400" />
293
+ <div>
294
+ <p className="text-sm font-medium">
295
+ {t("common.connected")}
305
296
  </p>
306
- )}
307
- </div>
308
- </>
309
- ) : (
310
- <>
311
- <IconCircleX className="h-5 w-5 text-muted-foreground" />
312
- <p className="text-sm text-muted-foreground">
313
- {t("common.notConnected")}
314
- </p>
315
- </>
316
- )}
317
- </div>
297
+ {googleStatus.data.accounts?.length > 0 && (
298
+ <p className="text-xs text-muted-foreground">
299
+ {googleStatus.data.accounts
300
+ .map((a) => a.email)
301
+ .join(", ")}
302
+ </p>
303
+ )}
304
+ </div>
305
+ </>
306
+ ) : (
307
+ <>
308
+ <IconCircleX className="h-5 w-5 text-muted-foreground" />
309
+ <p className="text-sm text-muted-foreground">
310
+ {t("common.notConnected")}
311
+ </p>
312
+ </>
313
+ )}
314
+ </div>
318
315
 
319
- {googleStatus.data?.connected ? (
320
- <Button
321
- variant="outline"
322
- size="sm"
323
- onClick={handleDisconnect}
324
- disabled={disconnectGoogle.isPending}
325
- >
326
- <IconUnlink className="me-1.5 h-3.5 w-3.5" />
327
- {t("common.disconnect")}
328
- </Button>
329
- ) : (
330
- <Button
331
- size="sm"
332
- onClick={handleConnect}
333
- disabled={
334
- authUrl.isLoading ||
335
- authUrl.isFetching ||
336
- isGoogleDesktopAuthPending
337
- }
338
- >
339
- <IconExternalLink className="me-1.5 h-3.5 w-3.5" />
340
- {t("common.connect")}
341
- </Button>
342
- )}
343
- </div>
344
- </CardContent>
345
- </Card>
316
+ {googleStatus.isError ? (
317
+ <Button
318
+ variant="outline"
319
+ size="sm"
320
+ onClick={() => void googleStatus.refetch()}
321
+ disabled={googleStatus.isFetching}
322
+ >
323
+ {t("common.retry")}
324
+ </Button>
325
+ ) : googleStatus.data?.connected &&
326
+ googleStatus.data.accounts.some(
327
+ (account) => !account.shared,
328
+ ) ? (
329
+ <Button
330
+ variant="outline"
331
+ size="sm"
332
+ onClick={handleDisconnect}
333
+ disabled={disconnectGoogle.isPending}
334
+ >
335
+ <IconUnlink className="me-1.5 h-3.5 w-3.5" />
336
+ {t("common.disconnect")}
337
+ </Button>
338
+ ) : googleStatus.data?.configured === true ||
339
+ canOfferGoogleOAuthSetup ? (
340
+ <Button
341
+ size="sm"
342
+ onClick={handleConnect}
343
+ disabled={isGoogleDesktopAuthPending}
344
+ >
345
+ <IconExternalLink className="me-1.5 h-3.5 w-3.5" />
346
+ {t("common.connect")}
347
+ </Button>
348
+ ) : null}
349
+ </div>
350
+ </CardContent>
351
+ </Card>
352
+ )}
346
353
 
347
354
  <Card id="zoom" className="scroll-mt-16">
348
355
  <CardHeader>
@@ -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
+ Booking link visibility controls now respect shared access and keep disabled links hidden when edited.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-22
4
+ ---
5
+
6
+ Clicking an out-of-office event's marker no longer creates a new draft event at an unrelated time
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-22
4
+ ---
5
+
6
+ Opening an event's details now shows its time in your calendar timezone instead of the timezone it was originally created in.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-08-22
4
+ ---
5
+
6
+ Google Calendar can now connect with the shared Google OAuth app in one click
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-22
4
+ ---
5
+
6
+ Overlapping events now split the available width so each one's edge stays visible instead of being covered by the event on top of it.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-22
4
+ ---
5
+
6
+ Public booking pages now offer time slots from the host's weekly schedule even when the host hasn't connected Google Calendar
@@ -567,17 +567,15 @@ export async function getConflictItems({
567
567
  );
568
568
  const freeBusyResolvedHosts = new Set<string>();
569
569
 
570
+ // Google is an availability enhancement, not a requirement: an owner who
571
+ // hasn't connected Google still has a schedule-only availability computed
572
+ // below from the weekly schedule and existing SQL bookings. Only actual
573
+ // Google failures (free/busy errors, event-listing errors, thrown
574
+ // exceptions) mark availability unavailable — not "not connected".
570
575
  const ownerConnected = ownerEmail
571
576
  ? await googleCalendar.isConnected(ownerEmail)
572
577
  : false;
573
578
 
574
- if (ownerEmail && !ownerConnected) {
575
- return {
576
- items: [],
577
- unavailableReason: formatAvailabilityUnavailableReason(ownerEmail),
578
- };
579
- }
580
-
581
579
  if (ownerConnected) {
582
580
  try {
583
581
  const [freeBusy, googleEventsResult] = await Promise.all([
@@ -5,6 +5,7 @@ import {
5
5
  isElectron,
6
6
  getAppUrl,
7
7
  GOOGLE_PRIMARY_PROVIDER_CREDENTIAL_KEYS,
8
+ hasWorkspaceProviderOAuthCredentials,
8
9
  resolveGoogleSignInCredentials,
9
10
  resolveGoogleProviderCredentialCandidatesWithReader,
10
11
  resolveOAuthRedirectUri,
@@ -687,7 +688,12 @@ export const handleGoogleAddAccountCallback = defineEventHandler(
687
688
  export const getGoogleStatus = defineEventHandler(async (event: H3Event) => {
688
689
  try {
689
690
  const session = await getSession(event);
690
- return await getAuthStatus(session?.email, session?.orgId);
691
+ const status = await getAuthStatus(session?.email, session?.orgId);
692
+ const configured = await runWithRequestContext(
693
+ { userEmail: session?.email, orgId: session?.orgId },
694
+ () => hasWorkspaceProviderOAuthCredentials("google_calendar"),
695
+ );
696
+ return { ...status, configured };
691
697
  } catch (error: any) {
692
698
  setResponseStatus(event, 500);
693
699
  return { error: error.message };
@@ -708,7 +714,9 @@ export const disconnectGoogle = defineEventHandler(async (event: H3Event) => {
708
714
  return { error: "email is required" };
709
715
  }
710
716
  const owned = await getAuthStatus(session.email, session.orgId);
711
- const isOwned = owned.accounts.some((a) => a.email === targetEmail);
717
+ const isOwned = owned.accounts.some(
718
+ (a) => a.email === targetEmail && !a.shared,
719
+ );
712
720
  if (!isOwned) {
713
721
  setResponseStatus(event, 403);
714
722
  return { error: "Cannot disconnect an account you don't own" };