@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,5 +1,6 @@
1
1
  declare const _default: import("../../action.js").ActionDefinition<{
2
- name: string;
2
+ name?: string;
3
+ path?: string;
3
4
  scope?: "organization" | "personal";
4
5
  }, import("../run-now.js").QueuedAutomationRun>;
5
6
  export default _default;
@@ -2,13 +2,18 @@ import { z } from "zod";
2
2
  import { defineAction } from "../../action.js";
3
3
  import { queueAutomationRunNow } from "../run-now.js";
4
4
  export default defineAction({
5
- description: "Run one personal or organization automation immediately. This is an explicit send/run action and may perform the automation's real side effects.",
5
+ description: "Run one personal or organization automation immediately. This is an explicit send/run action and may perform the automation's real side effects. Pass a flat `name` or a nested `path` such as jobs/factories/<id>/factory-slack-feedback.md — not both.",
6
6
  agentTool: false,
7
- schema: z.object({
8
- name: z.string().min(1),
7
+ schema: z
8
+ .object({
9
+ name: z.string().min(1).optional(),
10
+ path: z.string().min(1).optional(),
9
11
  scope: z.enum(["personal", "organization"]).default("personal"),
12
+ })
13
+ .refine((value) => Boolean(value.name) !== Boolean(value.path), {
14
+ message: "Specify either an automation name or a path, not both.",
10
15
  }),
11
- run: async ({ name, scope }, ctx) => {
16
+ run: async ({ name, path, scope }, ctx) => {
12
17
  if (!ctx?.userEmail)
13
18
  throw new Error("Not authenticated.");
14
19
  return queueAutomationRunNow({
@@ -16,7 +21,8 @@ export default defineAction({
16
21
  orgId: ctx.orgId,
17
22
  appId: ctx.appId,
18
23
  scope,
19
- name,
24
+ ...(path ? { path } : { name }),
25
+ requestHeaders: ctx.requestHeaders,
20
26
  });
21
27
  },
22
28
  });
@@ -20,6 +20,44 @@ const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n)?([\s\S]*)$/;
20
20
  const DELEGATED_POLICY_ID_RE = /^[a-z0-9][a-z0-9._:-]{0,127}$/i;
21
21
  const EXECUTION_ID_RE = /^[a-z0-9][a-z0-9._:-]{0,127}$/i;
22
22
  const REMOTE_ID_RE = /^[a-z0-9][a-z0-9@+._:/-]{0,511}$/i;
23
+ const EXTRA_FRONTMATTER_LINES = Symbol("extraFrontmatterLines");
24
+ const KNOWN_FRONTMATTER_FIELDS = new Set([
25
+ "schedule",
26
+ "enabled",
27
+ "timezone",
28
+ "createdBy",
29
+ "orgId",
30
+ "runAs",
31
+ "lastRun",
32
+ "lastCheck",
33
+ "lastStatus",
34
+ "lastError",
35
+ "nextRun",
36
+ "originScopeId",
37
+ "deliveryPlatform",
38
+ "deliveryDestination",
39
+ "deliveryThreadRef",
40
+ "deliveryTenantId",
41
+ "model",
42
+ "maxIterations",
43
+ "maxRunInputTokens",
44
+ "mcpTools",
45
+ "triggerType",
46
+ "event",
47
+ "condition",
48
+ "mode",
49
+ "domain",
50
+ "appId",
51
+ "executionHostId",
52
+ "executionEngine",
53
+ "executionCwd",
54
+ "remoteRequestId",
55
+ "remoteCommandId",
56
+ "remoteRunId",
57
+ "remoteAutomationRunId",
58
+ "remoteAdvanceSchedule",
59
+ "delegatedPolicyId",
60
+ ]);
23
61
  function assertBoundedFrontmatterValue(value, label, pattern) {
24
62
  if (value === undefined)
25
63
  return;
@@ -216,11 +254,23 @@ export function parseJobResource(content) {
216
254
  };
217
255
  }
218
256
  const meta = { schedule: "", enabled: true };
257
+ const extraLines = [];
219
258
  for (const line of match[1].split(/\r?\n/)) {
220
259
  const colonIdx = line.indexOf(":");
221
- if (colonIdx === -1)
260
+ if (colonIdx === -1) {
261
+ if (line.trim())
262
+ extraLines.push(line);
222
263
  continue;
223
- parseKnownField(meta, line.slice(0, colonIdx).trim(), line.slice(colonIdx + 1));
264
+ }
265
+ const key = line.slice(0, colonIdx).trim();
266
+ if (!KNOWN_FRONTMATTER_FIELDS.has(key)) {
267
+ extraLines.push(line);
268
+ continue;
269
+ }
270
+ parseKnownField(meta, key, line.slice(colonIdx + 1));
271
+ }
272
+ if (extraLines.length) {
273
+ meta[EXTRA_FRONTMATTER_LINES] = extraLines;
224
274
  }
225
275
  return {
226
276
  meta,
@@ -307,6 +357,7 @@ export function buildJobResourceContent(meta, body) {
307
357
  if (meta.mcpTools?.length) {
308
358
  lines.push(`mcpTools: ${JSON.stringify(meta.mcpTools)}`);
309
359
  }
360
+ lines.push(...(meta[EXTRA_FRONTMATTER_LINES] ?? []));
310
361
  lines.push("---", "", body);
311
362
  return lines.join("\n");
312
363
  }
@@ -4,7 +4,16 @@ export interface RunAutomationNowInput {
4
4
  orgId?: string | null;
5
5
  appId?: string | null;
6
6
  scope: AutomationScope;
7
- name: string;
7
+ /** Inbound request headers used to dispatch back to this exact local host. */
8
+ requestHeaders?: Headers;
9
+ /** Flat automation name, resolved as `jobs/<name>.md`. */
10
+ name?: string;
11
+ /**
12
+ * Full resource path for an automation the caller already resolved. Required
13
+ * for automations nested under `jobs/` (e.g. per-factory jobs), whose names
14
+ * contain a slash and cannot round-trip through `name`.
15
+ */
16
+ path?: string;
8
17
  }
9
18
  export interface QueuedAutomationRun {
10
19
  queued: true;
@@ -19,4 +28,5 @@ export declare function queueAutomationRunNow(input: RunAutomationNowInput): Pro
19
28
  */
20
29
  export declare function redispatchUnclaimedAutomationRuns(options?: {
21
30
  appId?: string | null;
31
+ requestHeaders?: Headers;
22
32
  }): Promise<number>;
@@ -5,11 +5,12 @@ import { organizationResourceOwner, resourceGetByPath, } from "../resources/stor
5
5
  import { fireInternalDispatch } from "../server/self-dispatch.js";
6
6
  import { parseJobResource } from "./frontmatter.js";
7
7
  import { listUnclaimedAutomationRuns, startAutomationRun, } from "./run-history.js";
8
- async function dispatchAutomationRun(historyId) {
8
+ async function dispatchAutomationRun(historyId, requestHeaders) {
9
9
  const dispatchPath = resolveAgentChatProcessRunDispatchPath();
10
10
  await fireInternalDispatch({
11
11
  path: dispatchPath,
12
12
  taskId: historyId,
13
+ ...(requestHeaders ? { event: { headers: requestHeaders } } : {}),
13
14
  body: {
14
15
  [AGENT_CHAT_BACKGROUND_RUN_FIELD]: {
15
16
  runId: historyId,
@@ -23,6 +24,9 @@ async function dispatchAutomationRun(historyId) {
23
24
  : {}),
24
25
  });
25
26
  }
27
+ function automationName(path) {
28
+ return path.replace(/^jobs\//, "").replace(/\.md$/, "");
29
+ }
26
30
  function ownerForScope(input) {
27
31
  if (input.scope === "personal")
28
32
  return input.userEmail.trim().toLowerCase();
@@ -31,15 +35,43 @@ function ownerForScope(input) {
31
35
  }
32
36
  return organizationResourceOwner(input.orgId);
33
37
  }
34
- export async function queueAutomationRunNow(input) {
35
- const name = input.name.trim();
38
+ /**
39
+ * One place decides which resource a run-now request means. Callers that
40
+ * already hold the resource pass `path`; callers that only know a flat slug
41
+ * pass `name`. Accepting both at once would let two disagreeing identifiers
42
+ * silently pick a winner.
43
+ */
44
+ function resolveAutomationTarget(input) {
45
+ const path = input.path?.trim();
46
+ const name = input.name?.trim();
47
+ if (path && name) {
48
+ throw Object.assign(new Error("Specify either an automation name or a path, not both."), { statusCode: 400 });
49
+ }
50
+ if (path) {
51
+ const segments = path.split("/");
52
+ const valid = segments[0] === "jobs" &&
53
+ segments.length > 1 &&
54
+ path.endsWith(".md") &&
55
+ !path.includes("\\") &&
56
+ segments.every((segment) => segment && segment !== "." && segment !== "..");
57
+ if (!valid) {
58
+ throw Object.assign(new Error("A valid automation path is required."), {
59
+ statusCode: 400,
60
+ });
61
+ }
62
+ return { path, name: automationName(path) };
63
+ }
36
64
  if (!name || name.includes("/") || name.endsWith(".md")) {
37
65
  throw Object.assign(new Error("A valid automation name is required."), {
38
66
  statusCode: 400,
39
67
  });
40
68
  }
69
+ return { path: `jobs/${name}.md`, name };
70
+ }
71
+ export async function queueAutomationRunNow(input) {
72
+ const { path, name } = resolveAutomationTarget(input);
41
73
  const owner = ownerForScope(input);
42
- const resource = await resourceGetByPath(owner, `jobs/${name}.md`);
74
+ const resource = await resourceGetByPath(owner, path);
43
75
  if (!resource) {
44
76
  throw Object.assign(new Error(`Automation "${name}" not found.`), {
45
77
  statusCode: 404,
@@ -56,7 +88,10 @@ export async function queueAutomationRunNow(input) {
56
88
  }
57
89
  // A manual-run request is a guaranteed app request even on hosts without a
58
90
  // durable timer. Use it to recover older rows before adding the new one.
59
- await redispatchUnclaimedAutomationRuns({ appId: input.appId }).catch((error) => {
91
+ await redispatchUnclaimedAutomationRuns({
92
+ appId: input.appId,
93
+ requestHeaders: input.requestHeaders,
94
+ }).catch((error) => {
60
95
  console.warn("[automations] Could not sweep queued runs before run-now:", error);
61
96
  });
62
97
  const historyId = await startAutomationRun({
@@ -69,7 +104,7 @@ export async function queueAutomationRunNow(input) {
69
104
  dispatchPending: true,
70
105
  });
71
106
  try {
72
- await dispatchAutomationRun(historyId);
107
+ await dispatchAutomationRun(historyId, input.requestHeaders);
73
108
  }
74
109
  catch (error) {
75
110
  const message = error instanceof Error ? error.message : "Background dispatch failed";
@@ -88,7 +123,7 @@ export async function redispatchUnclaimedAutomationRuns(options) {
88
123
  let attempted = 0;
89
124
  for (const run of runs) {
90
125
  try {
91
- await dispatchAutomationRun(run.id);
126
+ await dispatchAutomationRun(run.id, options?.requestHeaders);
92
127
  attempted += 1;
93
128
  }
94
129
  catch (error) {
@@ -38,6 +38,7 @@ interface JobExecutionResult {
38
38
  /** Execute one stored automation without changing its scheduled next run. */
39
39
  export declare function runJobNow(owner: string, name: string, deps: SchedulerDeps, options?: {
40
40
  historyId?: string;
41
+ path?: string;
41
42
  }): Promise<JobExecutionResult>;
42
43
  /** Process a durable run-now history row exactly once in the background worker. */
43
44
  export declare function runQueuedAutomation(historyId: string, deps: SchedulerDeps): Promise<{
@@ -553,7 +553,7 @@ async function executeJob(resource, meta, body, deps, now, options = {}) {
553
553
  }
554
554
  /** Execute one stored automation without changing its scheduled next run. */
555
555
  export async function runJobNow(owner, name, deps, options = {}) {
556
- const path = `jobs/${name}.md`;
556
+ const path = options.path ?? `jobs/${name}.md`;
557
557
  const resource = await resourceGetByPath(owner, path);
558
558
  if (!resource)
559
559
  throw new Error(`Automation "${name}" not found.`);
@@ -581,6 +581,7 @@ export async function runQueuedAutomation(historyId, deps) {
581
581
  }
582
582
  const result = await runJobNow(queued.owner, queued.automation, deps, {
583
583
  historyId,
584
+ path: queued.path,
584
585
  });
585
586
  return {
586
587
  skipped: false,
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "نسخ بيانات التشخيص",
32
32
  "aboutAgentNative.unknown": "غير معروف",
33
33
  "common.agent": "الوكيل",
34
+ "agentPanel.mode": "الوضع",
35
+ "agentPanel.uiMode": "واجهة المستخدم",
34
36
  "common.cancel": "إلغاء",
35
37
  "common.collapse": "طي",
36
38
  "common.connect": "اتصال",
@@ -463,6 +465,7 @@ const messages = {
463
465
  "share.linkCanStillOpen": "لا يزال بإمكان من لديه الرابط فتحه.",
464
466
  "share.loading": "جارٍ التحميل...",
465
467
  "share.loadMore": "تحميل المزيد",
468
+ "share.loadFailed": "تعذّر تحميل إعدادات المشاركة.",
466
469
  "share.loadPeopleFailed": "تعذّر تحميل الأشخاص.",
467
470
  "share.noAccess": "لا أحد لديه صلاحية الوصول حتى الآن.",
468
471
  "share.noMatches": "لا توجد نتائج مطابقة.",
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "Diagnosedaten kopieren",
32
32
  "aboutAgentNative.unknown": "Unbekannt",
33
33
  "common.agent": "Agent",
34
+ "agentPanel.mode": "Modus",
35
+ "agentPanel.uiMode": "Benutzeroberfläche",
34
36
  "common.cancel": "Abbrechen",
35
37
  "common.collapse": "Einklappen",
36
38
  "common.connect": "Verbinden",
@@ -498,6 +500,7 @@ const messages = {
498
500
  "share.linkCanStillOpen": "Personen mit dem Link können dies weiterhin öffnen.",
499
501
  "share.loading": "Laden...",
500
502
  "share.loadMore": "Mehr laden",
503
+ "share.loadFailed": "Freigabeeinstellungen konnten nicht geladen werden.",
501
504
  "share.loadPeopleFailed": "Es konnten keine Personen geladen werden.",
502
505
  "share.noAccess": "Noch hat niemand Zugriff.",
503
506
  "share.noMatches": "Keine Übereinstimmungen.",
@@ -31,6 +31,8 @@ declare const messages: {
31
31
  readonly "aboutAgentNative.copyDiagnostics": "Copy diagnostics";
32
32
  readonly "aboutAgentNative.unknown": "Unknown";
33
33
  readonly "common.agent": "Agent";
34
+ readonly "agentPanel.mode": "Mode";
35
+ readonly "agentPanel.uiMode": "UI";
34
36
  readonly "common.cancel": "Cancel";
35
37
  readonly "common.collapse": "Collapse";
36
38
  readonly "common.connect": "Connect";
@@ -447,6 +449,7 @@ declare const messages: {
447
449
  readonly "share.linkCanStillOpen": "People with the link can still open this.";
448
450
  readonly "share.loading": "Loading...";
449
451
  readonly "share.loadMore": "Load more";
452
+ readonly "share.loadFailed": "Couldn't load sharing settings.";
450
453
  readonly "share.loadPeopleFailed": "Could not load people.";
451
454
  readonly "share.noAccess": "No one has access yet.";
452
455
  readonly "share.noMatches": "No matches.";
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "Copy diagnostics",
32
32
  "aboutAgentNative.unknown": "Unknown",
33
33
  "common.agent": "Agent",
34
+ "agentPanel.mode": "Mode",
35
+ "agentPanel.uiMode": "UI",
34
36
  "common.cancel": "Cancel",
35
37
  "common.collapse": "Collapse",
36
38
  "common.connect": "Connect",
@@ -447,6 +449,7 @@ const messages = {
447
449
  "share.linkCanStillOpen": "People with the link can still open this.",
448
450
  "share.loading": "Loading...",
449
451
  "share.loadMore": "Load more",
452
+ "share.loadFailed": "Couldn't load sharing settings.",
450
453
  "share.loadPeopleFailed": "Could not load people.",
451
454
  "share.noAccess": "No one has access yet.",
452
455
  "share.noMatches": "No matches.",
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "Copiar diagnóstico",
32
32
  "aboutAgentNative.unknown": "Desconocida",
33
33
  "common.agent": "Agente",
34
+ "agentPanel.mode": "Modo",
35
+ "agentPanel.uiMode": "Interfaz de usuario",
34
36
  "common.cancel": "Cancelar",
35
37
  "common.collapse": "Contraer",
36
38
  "common.connect": "Conectar",
@@ -505,6 +507,7 @@ const messages = {
505
507
  "share.linkCanStillOpen": "Las personas con el enlace aún pueden abrirlo.",
506
508
  "share.loading": "Cargando...",
507
509
  "share.loadMore": "Cargar más",
510
+ "share.loadFailed": "No se pudo cargar la configuración de uso compartido.",
508
511
  "share.loadPeopleFailed": "No se pudieron cargar las personas.",
509
512
  "share.noAccess": "Nadie tiene acceso todavía.",
510
513
  "share.noMatches": "Sin coincidencias.",
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "Copier les diagnostics",
32
32
  "aboutAgentNative.unknown": "Inconnue",
33
33
  "common.agent": "Agent",
34
+ "agentPanel.mode": "Mode",
35
+ "agentPanel.uiMode": "Interface utilisateur",
34
36
  "common.cancel": "Annuler",
35
37
  "common.collapse": "Réduire",
36
38
  "common.connect": "Connecter",
@@ -505,6 +507,7 @@ const messages = {
505
507
  "share.linkCanStillOpen": "Les personnes disposant du lien peuvent toujours l'ouvrir.",
506
508
  "share.loading": "Chargement...",
507
509
  "share.loadMore": "Afficher plus",
510
+ "share.loadFailed": "Impossible de charger les paramètres de partage.",
508
511
  "share.loadPeopleFailed": "Impossible de charger des personnes.",
509
512
  "share.noAccess": "Personne n'y a encore accès.",
510
513
  "share.noMatches": "Aucun résultat.",
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "डायग्नोस्टिक कॉपी करें",
32
32
  "aboutAgentNative.unknown": "अज्ञात",
33
33
  "common.agent": "एजेंट",
34
+ "agentPanel.mode": "मोड",
35
+ "agentPanel.uiMode": "यूआई",
34
36
  "common.cancel": "रद्द करें",
35
37
  "common.collapse": "समेटें",
36
38
  "common.connect": "कनेक्ट करें",
@@ -447,6 +449,7 @@ const messages = {
447
449
  "share.linkCanStillOpen": "लिंक वाले लोग इसे फिर भी खोल सकते हैं।",
448
450
  "share.loading": "लोड हो रहा है...",
449
451
  "share.loadMore": "और लोड करें",
452
+ "share.loadFailed": "साझाकरण सेटिंग्स लोड नहीं की जा सकीं।",
450
453
  "share.loadPeopleFailed": "लोगों को लोड नहीं किया जा सका।",
451
454
  "share.noAccess": "अभी किसी के पास एक्सेस नहीं है।",
452
455
  "share.noMatches": "कोई मिलान नहीं मिला।",
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "診断情報をコピー",
32
32
  "aboutAgentNative.unknown": "不明",
33
33
  "common.agent": "エージェント",
34
+ "agentPanel.mode": "モード",
35
+ "agentPanel.uiMode": "UI",
34
36
  "common.cancel": "キャンセル",
35
37
  "common.collapse": "折りたたむ",
36
38
  "common.connect": "接続",
@@ -442,6 +444,7 @@ const messages = {
442
444
  "share.hideInSearch": "検索結果に表示しない",
443
445
  "share.linkCanStillOpen": "リンクを知っているユーザーは引き続き開くことができます。",
444
446
  "share.loadMore": "さらに読み込む",
447
+ "share.loadFailed": "共有設定を読み込めませんでした。",
445
448
  "share.loadPeopleFailed": "ユーザーを読み込めませんでした。",
446
449
  "share.loading": "読み込み中...",
447
450
  "share.noAccess": "アクセスできるユーザーはまだいません。",
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "진단 정보 복사",
32
32
  "aboutAgentNative.unknown": "알 수 없음",
33
33
  "common.agent": "에이전트",
34
+ "agentPanel.mode": "모드",
35
+ "agentPanel.uiMode": "UI",
34
36
  "common.cancel": "취소",
35
37
  "common.collapse": "접기",
36
38
  "common.connect": "연결",
@@ -442,6 +444,7 @@ const messages = {
442
444
  "share.hideInSearch": "검색에서 숨기기",
443
445
  "share.linkCanStillOpen": "링크가 있는 사용자는 계속 열 수 있습니다.",
444
446
  "share.loadMore": "더 불러오기",
447
+ "share.loadFailed": "공유 설정을 불러올 수 없습니다.",
445
448
  "share.loadPeopleFailed": "사용자를 불러올 수 없습니다.",
446
449
  "share.loading": "불러오는 중...",
447
450
  "share.noAccess": "아직 접근 권한이 있는 사용자가 없습니다.",
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "Copiar diagnósticos",
32
32
  "aboutAgentNative.unknown": "Desconhecida",
33
33
  "common.agent": "Agente",
34
+ "agentPanel.mode": "Modo",
35
+ "agentPanel.uiMode": "Interface",
34
36
  "common.cancel": "Cancelar",
35
37
  "common.collapse": "Recolher",
36
38
  "common.connect": "Conectar",
@@ -505,6 +507,7 @@ const messages = {
505
507
  "share.linkCanStillOpen": "Pessoas com o link ainda podem abrir isto.",
506
508
  "share.loading": "Carregando...",
507
509
  "share.loadMore": "Ver mais",
510
+ "share.loadFailed": "Não foi possível carregar as configurações de compartilhamento.",
508
511
  "share.loadPeopleFailed": "Não foi possível carregar pessoas.",
509
512
  "share.noAccess": "Ninguém tem acesso ainda.",
510
513
  "share.noMatches": "Nenhuma correspondência.",
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "复制诊断信息",
32
32
  "aboutAgentNative.unknown": "未知",
33
33
  "common.agent": "智能体",
34
+ "agentPanel.mode": "模式",
35
+ "agentPanel.uiMode": "界面",
34
36
  "common.cancel": "取消",
35
37
  "common.collapse": "收起",
36
38
  "common.connect": "连接",
@@ -442,6 +444,7 @@ const messages = {
442
444
  "share.hideInSearch": "在搜索中隐藏",
443
445
  "share.linkCanStillOpen": "拥有链接的人员仍可打开此内容。",
444
446
  "share.loadMore": "加载更多",
447
+ "share.loadFailed": "无法加载共享设置。",
445
448
  "share.loadPeopleFailed": "无法加载人员。",
446
449
  "share.loading": "正在加载...",
447
450
  "share.noAccess": "尚无任何人拥有访问权限。",
@@ -31,6 +31,8 @@ const messages = {
31
31
  "aboutAgentNative.copyDiagnostics": "複製診斷資訊",
32
32
  "aboutAgentNative.unknown": "未知",
33
33
  "common.agent": "代理",
34
+ "agentPanel.mode": "模式",
35
+ "agentPanel.uiMode": "介面",
34
36
  "common.cancel": "取消",
35
37
  "common.collapse": "收合",
36
38
  "common.connect": "連線",
@@ -442,6 +444,7 @@ const messages = {
442
444
  "share.hideInSearch": "在搜尋中隱藏",
443
445
  "share.linkCanStillOpen": "擁有連結的人員仍可開啟這個項目。",
444
446
  "share.loadMore": "載入更多",
447
+ "share.loadFailed": "無法載入分享設定。",
445
448
  "share.loadPeopleFailed": "無法載入人員。",
446
449
  "share.loading": "載入中...",
447
450
  "share.noAccess": "尚無任何人擁有存取權。",
@@ -33,6 +33,8 @@ export declare const englishAgentChatMessages: {
33
33
  readonly "aboutAgentNative.copyDiagnostics": "Copy diagnostics";
34
34
  readonly "aboutAgentNative.unknown": "Unknown";
35
35
  readonly "common.agent": "Agent";
36
+ readonly "agentPanel.mode": "Mode";
37
+ readonly "agentPanel.uiMode": "UI";
36
38
  readonly "common.cancel": "Cancel";
37
39
  readonly "common.collapse": "Collapse";
38
40
  readonly "common.connect": "Connect";
@@ -449,6 +451,7 @@ export declare const englishAgentChatMessages: {
449
451
  readonly "share.linkCanStillOpen": "People with the link can still open this.";
450
452
  readonly "share.loading": "Loading...";
451
453
  readonly "share.loadMore": "Load more";
454
+ readonly "share.loadFailed": "Couldn't load sharing settings.";
452
455
  readonly "share.loadPeopleFailed": "Could not load people.";
453
456
  readonly "share.noAccess": "No one has access yet.";
454
457
  readonly "share.noMatches": "No matches.";
@@ -422,6 +422,8 @@ declare const messages: {
422
422
  downloadDesktop: string;
423
423
  chatMode: string;
424
424
  chat: string;
425
+ mode: string;
426
+ uiMode: string;
425
427
  cliTerminalMode: string;
426
428
  cli: string;
427
429
  workspaceMode: string;
@@ -1126,11 +1128,6 @@ declare const messages: {
1126
1128
  useCase: string;
1127
1129
  setupNote: string;
1128
1130
  };
1129
- googleWorkspace: {
1130
- description: string;
1131
- useCase: string;
1132
- setupNote: string;
1133
- };
1134
1131
  gitlab: {
1135
1132
  description: string;
1136
1133
  useCase: string;
@@ -428,6 +428,8 @@ const messages = {
428
428
  downloadDesktop: "Download Desktop",
429
429
  chatMode: "Chat mode",
430
430
  chat: "Chat",
431
+ mode: "Mode",
432
+ uiMode: "UI",
431
433
  cliTerminalMode: "CLI terminal mode",
432
434
  cli: "CLI",
433
435
  workspaceMode: "Files, agents, skills, and tasks",
@@ -1132,11 +1134,6 @@ const messages = {
1132
1134
  useCase: "Observability, metrics, logs, traces, dashboards",
1133
1135
  setupNote: "Grafana Cloud MCP is in public preview and requires Grafana Cloud Assistant MCP access. It is hosted Grafana Cloud only; self-hosted Grafana needs the local MCP server.",
1134
1136
  },
1135
- googleWorkspace: {
1136
- description: "Search Google Workspace data through its remote MCP server.",
1137
- useCase: "Workspace search across Gmail, Drive, Calendar, Chat, Docs, Sheets, Slides",
1138
- setupNote: "Google Workspace MCP is in Developer Preview. Enable the relevant Google Workspace and MCP APIs, configure an OAuth consent screen and client, then authorize the products you want to use.",
1139
- },
1140
1137
  gitlab: {
1141
1138
  description: "Read and manage GitLab projects, issues, and merge requests.",
1142
1139
  useCase: "Repositories, issues, merge requests, CI/CD, code analytics",
@@ -189,6 +189,15 @@ export interface MCPRequestMeta {
189
189
  * results simply fall back to their deep-link text.
190
190
  */
191
191
  export declare function isMcpAppsInlineEnabled(identity: MCPCallerIdentity | undefined): boolean;
192
+ /**
193
+ * Connector-catalog membership declared on the actions themselves.
194
+ *
195
+ * This is `mcp.connectorCatalog` with the list inverted into the action files,
196
+ * so a rename moves the declaration with the action instead of stranding a
197
+ * dead string in a plugin config. Both forms feed the same set and an app can
198
+ * run either or both while it migrates.
199
+ */
200
+ export declare function declaredMcpToolNames(actions: Record<string, ActionEntry>): string[];
192
201
  export declare function isAuthenticatedReadAction(entry: ActionEntry): boolean;
193
202
  export declare function isAutoReadExcludedActionName(name: string): boolean;
194
203
  /**
@@ -18,6 +18,7 @@
18
18
  * — it can be bundled into the serverless function alongside `mountMCP`.
19
19
  */
20
20
  import { MCP_APP_EXTENSION_ID, MCP_APP_MIME_TYPE, MCP_APP_RESOURCE_URI_META_KEY, } from "../action.js";
21
+ import { isActionExposedToExternalAgents } from "../action.js";
21
22
  import { isMcpActionResult } from "../mcp-client/app-result.js";
22
23
  import { getConfiguredAppBasePath } from "../server/app-base-path.js";
23
24
  import { buildDeepLink, toAbsoluteOpenUrl, toDesktopOpenUrl, toVsCodeOpenUrl, } from "../server/deep-link.js";
@@ -177,6 +178,34 @@ function scopeToolSearchToAdvertised(advertised) {
177
178
  },
178
179
  };
179
180
  }
181
+ /**
182
+ * Drop every action this request's surface must not reach at all.
183
+ *
184
+ * Applied to `actions` — the whole surface this request can reach — and not
185
+ * just to the advertised listing, because on the `--full-catalog` tier
186
+ * `actions` IS the callable set (see the `tools/call` handler below). An
187
+ * external-agent opt-out that only hid the schema would leave the action
188
+ * callable by name, which is the same "hidden but reachable" bug the
189
+ * `withoutToolSearch` comment above exists to prevent.
190
+ *
191
+ * The in-app agent never comes through here, so its tool list is unaffected.
192
+ */
193
+ function withoutExternalOptOuts(actions) {
194
+ return Object.fromEntries(Object.entries(actions).filter(([, entry]) => isActionExposedToExternalAgents(entry)));
195
+ }
196
+ /**
197
+ * Connector-catalog membership declared on the actions themselves.
198
+ *
199
+ * This is `mcp.connectorCatalog` with the list inverted into the action files,
200
+ * so a rename moves the declaration with the action instead of stranding a
201
+ * dead string in a plugin config. Both forms feed the same set and an app can
202
+ * run either or both while it migrates.
203
+ */
204
+ export function declaredMcpToolNames(actions) {
205
+ return Object.entries(actions)
206
+ .filter(([, entry]) => entry.mcpTool === true)
207
+ .map(([name]) => name);
208
+ }
180
209
  const COMPACT_MCP_APP_CATALOG_BUILTINS = new Set([
181
210
  "list_apps",
182
211
  "open_app",
@@ -1170,9 +1199,7 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
1170
1199
  // Strip from `actions`, not just the advertised set: on the full-catalog tier
1171
1200
  // `actions` IS the callable surface, so filtering only the listing would
1172
1201
  // leave `tool-search` callable but invisible.
1173
- const actions = flatCatalog
1174
- ? withoutToolSearch(mergedActions)
1175
- : mergedActions;
1202
+ const actions = withoutExternalOptOuts(flatCatalog ? withoutToolSearch(mergedActions) : mergedActions);
1176
1203
  const visibleActions = Object.fromEntries(Object.entries(actions).filter(([, entry]) => isActionVisibleForOAuthScope(entry, effectiveIdentity?.oauthScopes)));
1177
1204
  // Compact/connector is the DEFAULT for every caller — hosted connectors,
1178
1205
  // code clients (Claude Code / Cursor / Codex), and the local CLI alike. The
@@ -1187,15 +1214,17 @@ export async function createMCPServerForRequest(config, identity, requestMeta) {
1187
1214
  const autoReadNames = autoAuthenticatedReadNames(visibleActions, config);
1188
1215
  const connectorNames = new Set([
1189
1216
  ...(config.connectorCatalog ?? []),
1217
+ ...declaredMcpToolNames(visibleActions),
1190
1218
  ...autoReadNames,
1191
1219
  ]);
1192
1220
  const denyNames = externalAgentDenySet(config);
1193
1221
  const automaticConnectorPolicyActive = config.externalAgents?.authenticatedReads === "auto";
1194
- // Connector-catalog tier: when a template declares a connector allow-list,
1195
- // serve exactly that curated surface plus any explicitly annotated
1196
- // authenticated reads from `externalAgents.authenticatedReads: "auto"`.
1197
- // This stays compact by default and keeps db-exec / seed-* / extension /
1198
- // browser-session footguns off the external surface.
1222
+ // Connector-catalog tier: when a template declares a connector allow-list —
1223
+ // as `mcp.connectorCatalog` names or as `mcpTool: true` on the actions
1224
+ // themselves — serve exactly that curated surface plus any explicitly
1225
+ // annotated authenticated reads from `externalAgents.authenticatedReads:
1226
+ // "auto"`. This stays compact by default and keeps db-exec / seed-* /
1227
+ // extension / browser-session footguns off the external surface.
1199
1228
  const connectorCatalogActive = !appCatalog &&
1200
1229
  (connectorNames.size > 0 || automaticConnectorPolicyActive) &&
1201
1230
  !fullCatalogRequested;