@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
@@ -3,6 +3,7 @@ import { getRequestHeader } from "h3";
3
3
  import { createRemoteJWKSet, jwtVerify } from "jose";
4
4
  import { AGENT_BACKGROUND_PROCESSOR_FIELD, AGENT_BACKGROUND_PROCESSOR_INTEGRATION, isInBackgroundFunctionRuntime, } from "../agent/durable-background.js";
5
5
  import { abortRun } from "../agent/run-manager.js";
6
+ import { AppConfigurationError, getAppConfig } from "../app-config/index.js";
6
7
  import { isServerlessRuntime } from "../db/client.js";
7
8
  import { getOrgContext, resolveOrgIdForEmail } from "../org/context.js";
8
9
  import { loadResourcesForPrompt } from "../server/agent-chat-plugin.js";
@@ -229,6 +230,28 @@ export const BUILT_IN_INTEGRATION_ADAPTER_IDS = Object.freeze(BUILT_IN_INTEGRATI
229
230
  export function createBuiltInIntegrationAdapters() {
230
231
  return BUILT_IN_INTEGRATION_ADAPTER_FACTORIES.map(({ create }) => create());
231
232
  }
233
+ /**
234
+ * Narrow the adapter set to `integrations.platforms`, when a deployment
235
+ * declares one.
236
+ *
237
+ * A configured name that matches no adapter throws instead of being ignored:
238
+ * the whole point of the allow-list is that the operator knows which platforms
239
+ * are live, and silently mounting a set nobody named — or mounting nothing
240
+ * because of a typo — is the failure this switch is supposed to prevent.
241
+ */
242
+ export function applyConfiguredPlatformAllowList(adapters) {
243
+ const allowed = getAppConfig().integrations.platforms;
244
+ if (!allowed)
245
+ return adapters;
246
+ const available = new Set(adapters.map((adapter) => adapter.platform));
247
+ const unknown = allowed.filter((platform) => !available.has(platform));
248
+ if (unknown.length > 0) {
249
+ throw new AppConfigurationError(`[agent-native] integrations.platforms names ${unknown.join(", ")}, which no mounted adapter provides. ` +
250
+ `Available: ${[...available].join(", ") || "(none)"}.`);
251
+ }
252
+ const allowedSet = new Set(allowed);
253
+ return adapters.filter((adapter) => allowedSet.has(adapter.platform));
254
+ }
232
255
  const INTEGRATION_SYSTEM_PROMPT = `You are an AI agent responding via a messaging platform integration (Slack, Microsoft Teams, Discord interactions, Telegram, WhatsApp, etc.).
233
256
 
234
257
  You have the same capabilities as the web chat agent. Use your tools to help the user.
@@ -573,8 +596,8 @@ export function createIntegrationsPlugin(options) {
573
596
  }
574
597
  return async (nitroApp) => {
575
598
  markDefaultPluginProvided(nitroApp, "integrations");
576
- const adapters = options?.adapters ??
577
- mergeIntegrationAdapters(createBuiltInIntegrationAdapters(), options?.adapterOverrides);
599
+ const adapters = applyConfiguredPlatformAllowList(options?.adapters ??
600
+ mergeIntegrationAdapters(createBuiltInIntegrationAdapters(), options?.adapterOverrides));
578
601
  const adapterMap = new Map();
579
602
  for (const adapter of adapters) {
580
603
  adapterMap.set(adapter.platform, adapter);
@@ -619,6 +642,17 @@ export function createIntegrationsPlugin(options) {
619
642
  const initialToolNames = Object.keys(localActions);
620
643
  const h3 = getH3App(nitroApp);
621
644
  const P = `${FRAMEWORK_ROUTE_PREFIX}/integrations`;
645
+ // Routes mounted under a platform's own name rather than reached through
646
+ // the `/:platform/...` catch-all. The catch-all 404s a platform the
647
+ // allow-list dropped because it resolves an adapter first; these are
648
+ // registered by literal path, so they would outlive the platform they
649
+ // belong to unless the same allow-list gates the registration.
650
+ const allowedPlatforms = getAppConfig().integrations.platforms;
651
+ const mountForPlatform = (platform, path, handler) => {
652
+ if (allowedPlatforms && !allowedPlatforms.includes(platform))
653
+ return;
654
+ h3.use(path, handler);
655
+ };
622
656
  async function enqueueSystemNotice(event, incoming, text, opts) {
623
657
  if (!text.trim())
624
658
  return;
@@ -1921,7 +1955,7 @@ export function createIntegrationsPlugin(options) {
1921
1955
  return { ok: true, continuationId };
1922
1956
  }));
1923
1957
  // ─── Slack native action controls ─────────────────────────────
1924
- h3.use(`${P}/slack/interactions`, defineEventHandler(async (event) => {
1958
+ mountForPlatform("slack", `${P}/slack/interactions`, defineEventHandler(async (event) => {
1925
1959
  if (getMethod(event) !== "POST") {
1926
1960
  setResponseStatus(event, 405);
1927
1961
  return { error: "Method not allowed" };
@@ -2195,7 +2229,7 @@ export function createIntegrationsPlugin(options) {
2195
2229
  return { error: "unsupported memory action" };
2196
2230
  }));
2197
2231
  // ─── Managed Slack OAuth ──────────────────────────────────────
2198
- h3.use(`${P}/slack/manifest`, defineEventHandler(async (event) => {
2232
+ mountForPlatform("slack", `${P}/slack/manifest`, defineEventHandler(async (event) => {
2199
2233
  if (getMethod(event) !== "GET") {
2200
2234
  setResponseStatus(event, 405);
2201
2235
  return { error: "Method not allowed" };
@@ -2216,7 +2250,7 @@ export function createIntegrationsPlugin(options) {
2216
2250
  interactivityRequestUrl,
2217
2251
  });
2218
2252
  }));
2219
- h3.use(`${P}/slack/oauth/install`, defineEventHandler(async (event) => {
2253
+ mountForPlatform("slack", `${P}/slack/oauth/install`, defineEventHandler(async (event) => {
2220
2254
  if (getMethod(event) !== "GET") {
2221
2255
  setResponseStatus(event, 405);
2222
2256
  return { error: "Method not allowed" };
@@ -2270,7 +2304,7 @@ export function createIntegrationsPlugin(options) {
2270
2304
  return sendRedirect(event, buildSlackAuthorizeUrl({ clientId, redirectUri, state }), 302);
2271
2305
  });
2272
2306
  }));
2273
- h3.use(`${P}/slack/oauth/callback`, defineEventHandler(async (event) => {
2307
+ mountForPlatform("slack", `${P}/slack/oauth/callback`, defineEventHandler(async (event) => {
2274
2308
  if (getMethod(event) !== "GET") {
2275
2309
  setResponseStatus(event, 405);
2276
2310
  return { error: "Method not allowed" };
@@ -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",