@agent-native/core 0.103.1 → 0.105.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 (568) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +61 -0
  3. package/corpus/core/package.json +9 -2
  4. package/corpus/core/src/agent/engine/credential-errors.ts +2 -2
  5. package/corpus/core/src/agent/production-agent.ts +30 -0
  6. package/corpus/core/src/agent/run-store.ts +12 -2
  7. package/corpus/core/src/cli/create.ts +1 -0
  8. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +30 -11
  9. package/corpus/core/src/cli/templates-meta.ts +4 -3
  10. package/corpus/core/src/client/AgentAskPopover.tsx +89 -0
  11. package/corpus/core/src/client/AgentChatHome.tsx +4 -0
  12. package/corpus/core/src/client/AgentPanel.tsx +321 -223
  13. package/corpus/core/src/client/AssistantChat.tsx +6 -10
  14. package/corpus/core/src/client/MultiTabAssistantChat.tsx +53 -372
  15. package/corpus/core/src/client/agent-chat-adapter.ts +13 -1
  16. package/corpus/core/src/client/agent-page/AgentContextTab.tsx +133 -149
  17. package/corpus/core/src/client/agent-page/AgentEmptyState.tsx +44 -0
  18. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +153 -82
  19. package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +39 -0
  20. package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +368 -356
  21. package/corpus/core/src/client/agent-page/types.ts +1 -1
  22. package/corpus/core/src/client/analytics.ts +51 -5
  23. package/corpus/core/src/client/chat/run-recovery.tsx +12 -4
  24. package/corpus/core/src/client/composer/PromptComposer.tsx +5 -15
  25. package/corpus/core/src/client/composer/TiptapComposer.tsx +32 -3
  26. package/corpus/core/src/client/dynamic-suggestions.ts +3 -3
  27. package/corpus/core/src/client/index.ts +16 -1
  28. package/corpus/core/src/client/resources/ResourceTree.tsx +249 -38
  29. package/corpus/core/src/client/resources/ResourcesPanel.tsx +307 -140
  30. package/corpus/core/src/client/session-replay.ts +158 -5
  31. package/corpus/core/src/client/settings/AutomationsSection.tsx +30 -10
  32. package/corpus/core/src/client/settings/SettingsPanel.tsx +3 -2
  33. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +2 -0
  34. package/corpus/core/src/client/settings/agent-settings-search.ts +2 -2
  35. package/corpus/core/src/client/use-chat-threads.ts +2 -0
  36. package/corpus/core/src/connections/catalog.ts +49 -7
  37. package/corpus/core/src/db/index.ts +6 -1
  38. package/corpus/core/src/deploy/build.ts +23 -0
  39. package/corpus/core/src/extensions/actions.ts +106 -16
  40. package/corpus/core/src/extensions/content-patch.ts +22 -0
  41. package/corpus/core/src/extensions/routes.ts +18 -0
  42. package/corpus/core/src/extensions/store.ts +8 -0
  43. package/corpus/core/src/index.ts +3 -0
  44. package/corpus/core/src/ingestion/docx.ts +158 -0
  45. package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
  46. package/corpus/core/src/ingestion/figma.ts +548 -0
  47. package/corpus/core/src/ingestion/index.ts +107 -0
  48. package/corpus/core/src/ingestion/media.ts +264 -0
  49. package/corpus/core/src/ingestion/notion.ts +121 -0
  50. package/corpus/core/src/ingestion/office.ts +214 -0
  51. package/corpus/core/src/ingestion/orchestration.ts +160 -0
  52. package/corpus/core/src/ingestion/pptx.ts +333 -0
  53. package/corpus/core/src/ingestion/selection.ts +81 -0
  54. package/corpus/core/src/ingestion/website.ts +151 -0
  55. package/corpus/core/src/integrations/plugin.ts +45 -37
  56. package/corpus/core/src/localization/default-messages.ts +35 -12
  57. package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
  58. package/corpus/core/src/observability/traces.ts +5 -3
  59. package/corpus/core/src/provider-api/index.ts +452 -8
  60. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
  61. package/corpus/core/src/search-utils/index.ts +112 -0
  62. package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
  63. package/corpus/core/src/server/action-discovery.ts +33 -8
  64. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  65. package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
  66. package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
  67. package/corpus/core/src/server/core-routes-plugin.ts +12 -0
  68. package/corpus/core/src/server/index.ts +30 -0
  69. package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
  70. package/corpus/core/src/styles/agent-native.css +9 -0
  71. package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
  72. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  73. package/corpus/core/src/templates/workspace-root/.env.example +12 -0
  74. package/corpus/core/src/workspace-connections/index.ts +6 -0
  75. package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
  76. package/corpus/core/src/workspace-connections/store.ts +16 -0
  77. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
  78. package/corpus/templates/analytics/AGENTS.md +9 -0
  79. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
  80. package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
  81. package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
  82. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
  83. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
  84. package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
  85. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
  86. package/corpus/templates/analytics/app/i18n-data.ts +3 -3
  87. package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
  88. package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
  89. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
  91. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
  92. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
  93. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
  97. package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
  98. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
  99. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
  100. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
  101. package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
  102. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  103. package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
  104. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
  105. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
  106. package/corpus/templates/assets/AGENTS.md +10 -0
  107. package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
  108. package/corpus/templates/assets/actions/edit-image.ts +2 -0
  109. package/corpus/templates/assets/actions/generate-asset.ts +52 -0
  110. package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
  111. package/corpus/templates/assets/actions/generate-image.ts +219 -1
  112. package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
  113. package/corpus/templates/assets/actions/refine-image.ts +3 -0
  114. package/corpus/templates/assets/actions/restyle-image.ts +2 -0
  115. package/corpus/templates/assets/agent-native.app-skill.json +4 -0
  116. package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
  117. package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
  118. package/corpus/templates/assets/app/i18n-data.ts +29 -13
  119. package/corpus/templates/assets/app/routes/agent.tsx +7 -1
  120. package/corpus/templates/assets/app/routes/library.tsx +9 -0
  121. package/corpus/templates/assets/app/routes/settings.tsx +3 -0
  122. package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
  123. package/corpus/templates/assets/package.json +1 -0
  124. package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
  125. package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
  126. package/corpus/templates/brain/app/i18n-data.ts +3 -3
  127. package/corpus/templates/brain/app/lib/brain.ts +1 -1
  128. package/corpus/templates/brain/server/lib/search.ts +17 -67
  129. package/corpus/templates/calendar/app/i18n-data.ts +3 -3
  130. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
  131. package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
  132. package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
  133. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
  134. package/corpus/templates/clips/AGENTS.md +4 -0
  135. package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
  136. package/corpus/templates/clips/actions/create-meeting.ts +6 -2
  137. package/corpus/templates/clips/actions/create-organization.ts +3 -2
  138. package/corpus/templates/clips/actions/create-recording.ts +4 -1
  139. package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
  140. package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
  141. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
  142. package/corpus/templates/clips/actions/list-meetings.ts +23 -5
  143. package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
  144. package/corpus/templates/clips/actions/remove-silences.ts +10 -1
  145. package/corpus/templates/clips/actions/request-transcript.ts +53 -11
  146. package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
  147. package/corpus/templates/clips/actions/search-recordings.ts +5 -8
  148. package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
  149. package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
  150. package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
  151. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
  152. package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
  153. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
  154. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
  155. package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
  156. package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
  157. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
  158. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  159. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  160. package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
  161. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  162. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  163. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  164. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  165. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  166. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  167. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
  168. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
  169. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
  170. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
  171. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
  172. package/corpus/templates/clips/app/routes/record.tsx +23 -2
  173. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
  174. package/corpus/templates/clips/app/routes.ts +3 -1
  175. package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
  176. package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
  177. package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
  178. package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
  180. package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
  181. package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
  182. package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
  183. package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
  184. package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
  185. package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
  186. package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
  187. package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
  188. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  189. package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
  190. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
  191. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
  192. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
  193. package/corpus/templates/clips/desktop/src/app.tsx +66 -28
  194. package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
  195. package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
  196. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
  197. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
  198. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
  199. package/corpus/templates/clips/desktop/src/styles.css +13 -11
  200. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
  201. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
  202. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
  203. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
  204. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
  205. package/corpus/templates/clips/server/db/schema.ts +2 -2
  206. package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
  207. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
  208. package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
  209. package/corpus/templates/clips/server/lib/recordings.ts +40 -1
  210. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  211. package/corpus/templates/clips/server/plugins/db.ts +2 -2
  212. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
  213. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
  214. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
  215. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
  216. package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
  217. package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
  218. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
  219. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
  220. package/corpus/templates/content/AGENTS.md +9 -0
  221. package/corpus/templates/content/actions/create-document.ts +94 -0
  222. package/corpus/templates/content/actions/edit-document.ts +144 -4
  223. package/corpus/templates/content/actions/update-document.ts +138 -0
  224. package/corpus/templates/content/agent-native.app-skill.json +4 -0
  225. package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
  226. package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
  227. package/corpus/templates/content/app/i18n-data.ts +13 -4
  228. package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
  229. package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
  230. package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
  231. package/corpus/templates/content/package.json +1 -0
  232. package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
  233. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
  234. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
  235. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
  236. package/corpus/templates/design/AGENTS.md +6 -0
  237. package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
  238. package/corpus/templates/design/actions/edit-design.ts +128 -0
  239. package/corpus/templates/design/actions/generate-design.ts +278 -14
  240. package/corpus/templates/design/actions/generate-screens.ts +42 -1
  241. package/corpus/templates/design/agent-native.app-skill.json +4 -0
  242. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
  243. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  244. package/corpus/templates/design/app/i18n-data.ts +10 -4
  245. package/corpus/templates/design/app/routes/agent.tsx +2 -1
  246. package/corpus/templates/design/app/routes/settings.tsx +3 -0
  247. package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
  248. package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  249. package/corpus/templates/design/package.json +1 -0
  250. package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
  251. package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
  252. package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
  253. package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
  254. package/corpus/templates/design/shared/generation-session.ts +7 -0
  255. package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
  256. package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
  257. package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
  258. package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
  259. package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
  260. package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
  261. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
  262. package/corpus/templates/plan/AGENTS.md +21 -1
  263. package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
  264. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
  265. package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
  266. package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
  267. package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
  268. package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
  269. package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
  270. package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
  271. package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
  272. package/corpus/templates/plan/server/plan-mdx.ts +75 -2
  273. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
  274. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
  275. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
  276. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
  277. package/corpus/templates/slides/AGENTS.md +6 -0
  278. package/corpus/templates/slides/actions/add-slide.ts +230 -14
  279. package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
  280. package/corpus/templates/slides/actions/create-deck.ts +130 -0
  281. package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
  282. package/corpus/templates/slides/actions/import-file.ts +5 -4
  283. package/corpus/templates/slides/actions/patch-deck.ts +200 -10
  284. package/corpus/templates/slides/actions/update-slide.ts +208 -15
  285. package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
  286. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
  287. package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
  288. package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
  289. package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
  290. package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
  291. package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
  292. package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
  293. package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
  294. package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
  295. package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
  296. package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
  297. package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
  298. package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
  299. package/corpus/templates/slides/app/routes/agent.tsx +7 -1
  300. package/corpus/templates/slides/app/routes/settings.tsx +3 -0
  301. package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
  302. package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
  303. package/corpus/templates/slides/package.json +1 -0
  304. package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
  305. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
  306. package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
  307. package/dist/agent/engine/credential-errors.d.ts +1 -1
  308. package/dist/agent/engine/credential-errors.d.ts.map +1 -1
  309. package/dist/agent/engine/credential-errors.js +2 -2
  310. package/dist/agent/engine/credential-errors.js.map +1 -1
  311. package/dist/agent/production-agent.d.ts.map +1 -1
  312. package/dist/agent/production-agent.js +25 -0
  313. package/dist/agent/production-agent.js.map +1 -1
  314. package/dist/agent/run-store.d.ts.map +1 -1
  315. package/dist/agent/run-store.js +12 -2
  316. package/dist/agent/run-store.js.map +1 -1
  317. package/dist/cli/create.d.ts.map +1 -1
  318. package/dist/cli/create.js +1 -0
  319. package/dist/cli/create.js.map +1 -1
  320. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  321. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  322. package/dist/cli/skills-content/visual-plan-skill.js +30 -11
  323. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  324. package/dist/cli/templates-meta.d.ts.map +1 -1
  325. package/dist/cli/templates-meta.js +4 -3
  326. package/dist/cli/templates-meta.js.map +1 -1
  327. package/dist/client/AgentAskPopover.d.ts +11 -0
  328. package/dist/client/AgentAskPopover.d.ts.map +1 -0
  329. package/dist/client/AgentAskPopover.js +30 -0
  330. package/dist/client/AgentAskPopover.js.map +1 -0
  331. package/dist/client/AgentChatHome.d.ts +1 -1
  332. package/dist/client/AgentChatHome.d.ts.map +1 -1
  333. package/dist/client/AgentChatHome.js +2 -2
  334. package/dist/client/AgentChatHome.js.map +1 -1
  335. package/dist/client/AgentPanel.d.ts +9 -19
  336. package/dist/client/AgentPanel.d.ts.map +1 -1
  337. package/dist/client/AgentPanel.js +119 -80
  338. package/dist/client/AgentPanel.js.map +1 -1
  339. package/dist/client/AssistantChat.d.ts.map +1 -1
  340. package/dist/client/AssistantChat.js +4 -4
  341. package/dist/client/AssistantChat.js.map +1 -1
  342. package/dist/client/MultiTabAssistantChat.d.ts +3 -9
  343. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  344. package/dist/client/MultiTabAssistantChat.js +49 -189
  345. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  346. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  347. package/dist/client/agent-chat-adapter.js +12 -1
  348. package/dist/client/agent-chat-adapter.js.map +1 -1
  349. package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
  350. package/dist/client/agent-page/AgentContextTab.js +26 -28
  351. package/dist/client/agent-page/AgentContextTab.js.map +1 -1
  352. package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
  353. package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
  354. package/dist/client/agent-page/AgentEmptyState.js +6 -0
  355. package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
  356. package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
  357. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  358. package/dist/client/agent-page/AgentJobsTab.js +90 -58
  359. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  360. package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
  361. package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
  362. package/dist/client/agent-page/AgentTabFrame.js +7 -0
  363. package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
  364. package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
  365. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  366. package/dist/client/agent-page/AgentTabsPage.js +135 -99
  367. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  368. package/dist/client/agent-page/types.d.ts +1 -1
  369. package/dist/client/agent-page/types.d.ts.map +1 -1
  370. package/dist/client/agent-page/types.js.map +1 -1
  371. package/dist/client/analytics.d.ts +10 -3
  372. package/dist/client/analytics.d.ts.map +1 -1
  373. package/dist/client/analytics.js +37 -2
  374. package/dist/client/analytics.js.map +1 -1
  375. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  376. package/dist/client/chat/run-recovery.js +10 -3
  377. package/dist/client/chat/run-recovery.js.map +1 -1
  378. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  379. package/dist/client/composer/PromptComposer.js +2 -2
  380. package/dist/client/composer/PromptComposer.js.map +1 -1
  381. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  382. package/dist/client/composer/TiptapComposer.js +15 -3
  383. package/dist/client/composer/TiptapComposer.js.map +1 -1
  384. package/dist/client/dynamic-suggestions.js +3 -3
  385. package/dist/client/dynamic-suggestions.js.map +1 -1
  386. package/dist/client/index.d.ts +4 -3
  387. package/dist/client/index.d.ts.map +1 -1
  388. package/dist/client/index.js +3 -2
  389. package/dist/client/index.js.map +1 -1
  390. package/dist/client/resources/ResourceTree.d.ts +5 -1
  391. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  392. package/dist/client/resources/ResourceTree.js +74 -5
  393. package/dist/client/resources/ResourceTree.js.map +1 -1
  394. package/dist/client/resources/ResourcesPanel.d.ts +11 -2
  395. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  396. package/dist/client/resources/ResourcesPanel.js +105 -31
  397. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  398. package/dist/client/session-replay.d.ts +28 -0
  399. package/dist/client/session-replay.d.ts.map +1 -1
  400. package/dist/client/session-replay.js +122 -8
  401. package/dist/client/session-replay.js.map +1 -1
  402. package/dist/client/settings/AutomationsSection.d.ts +3 -1
  403. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  404. package/dist/client/settings/AutomationsSection.js +16 -6
  405. package/dist/client/settings/AutomationsSection.js.map +1 -1
  406. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  407. package/dist/client/settings/SettingsPanel.js +3 -3
  408. package/dist/client/settings/SettingsPanel.js.map +1 -1
  409. package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
  410. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  411. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  412. package/dist/client/settings/agent-settings-search.js +2 -2
  413. package/dist/client/settings/agent-settings-search.js.map +1 -1
  414. package/dist/client/use-chat-threads.d.ts +2 -0
  415. package/dist/client/use-chat-threads.d.ts.map +1 -1
  416. package/dist/client/use-chat-threads.js.map +1 -1
  417. package/dist/connections/catalog.d.ts +41 -7
  418. package/dist/connections/catalog.d.ts.map +1 -1
  419. package/dist/connections/catalog.js +40 -7
  420. package/dist/connections/catalog.js.map +1 -1
  421. package/dist/db/index.d.ts +2 -2
  422. package/dist/db/index.d.ts.map +1 -1
  423. package/dist/db/index.js +2 -2
  424. package/dist/db/index.js.map +1 -1
  425. package/dist/deploy/build.d.ts.map +1 -1
  426. package/dist/deploy/build.js +17 -0
  427. package/dist/deploy/build.js.map +1 -1
  428. package/dist/extensions/actions.d.ts.map +1 -1
  429. package/dist/extensions/actions.js +85 -15
  430. package/dist/extensions/actions.js.map +1 -1
  431. package/dist/extensions/content-patch.d.ts +4 -0
  432. package/dist/extensions/content-patch.d.ts.map +1 -1
  433. package/dist/extensions/content-patch.js +18 -0
  434. package/dist/extensions/content-patch.js.map +1 -1
  435. package/dist/extensions/routes.d.ts.map +1 -1
  436. package/dist/extensions/routes.js +14 -0
  437. package/dist/extensions/routes.js.map +1 -1
  438. package/dist/extensions/store.d.ts +1 -0
  439. package/dist/extensions/store.d.ts.map +1 -1
  440. package/dist/extensions/store.js +4 -1
  441. package/dist/extensions/store.js.map +1 -1
  442. package/dist/index.d.ts +1 -1
  443. package/dist/index.d.ts.map +1 -1
  444. package/dist/index.js +1 -1
  445. package/dist/index.js.map +1 -1
  446. package/dist/ingestion/docx.d.ts +16 -0
  447. package/dist/ingestion/docx.d.ts.map +1 -0
  448. package/dist/ingestion/docx.js +129 -0
  449. package/dist/ingestion/docx.js.map +1 -0
  450. package/dist/ingestion/figma-node-to-html.d.ts +304 -0
  451. package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
  452. package/dist/ingestion/figma-node-to-html.js +1292 -0
  453. package/dist/ingestion/figma-node-to-html.js.map +1 -0
  454. package/dist/ingestion/figma.d.ts +115 -0
  455. package/dist/ingestion/figma.d.ts.map +1 -0
  456. package/dist/ingestion/figma.js +399 -0
  457. package/dist/ingestion/figma.js.map +1 -0
  458. package/dist/ingestion/index.d.ts +11 -0
  459. package/dist/ingestion/index.d.ts.map +1 -0
  460. package/dist/ingestion/index.js +11 -0
  461. package/dist/ingestion/index.js.map +1 -0
  462. package/dist/ingestion/media.d.ts +36 -0
  463. package/dist/ingestion/media.d.ts.map +1 -0
  464. package/dist/ingestion/media.js +178 -0
  465. package/dist/ingestion/media.js.map +1 -0
  466. package/dist/ingestion/notion.d.ts +12 -0
  467. package/dist/ingestion/notion.d.ts.map +1 -0
  468. package/dist/ingestion/notion.js +104 -0
  469. package/dist/ingestion/notion.js.map +1 -0
  470. package/dist/ingestion/office.d.ts +45 -0
  471. package/dist/ingestion/office.d.ts.map +1 -0
  472. package/dist/ingestion/office.js +141 -0
  473. package/dist/ingestion/office.js.map +1 -0
  474. package/dist/ingestion/orchestration.d.ts +52 -0
  475. package/dist/ingestion/orchestration.d.ts.map +1 -0
  476. package/dist/ingestion/orchestration.js +89 -0
  477. package/dist/ingestion/orchestration.js.map +1 -0
  478. package/dist/ingestion/pptx.d.ts +28 -0
  479. package/dist/ingestion/pptx.d.ts.map +1 -0
  480. package/dist/ingestion/pptx.js +255 -0
  481. package/dist/ingestion/pptx.js.map +1 -0
  482. package/dist/ingestion/selection.d.ts +20 -0
  483. package/dist/ingestion/selection.d.ts.map +1 -0
  484. package/dist/ingestion/selection.js +52 -0
  485. package/dist/ingestion/selection.js.map +1 -0
  486. package/dist/ingestion/website.d.ts +27 -0
  487. package/dist/ingestion/website.d.ts.map +1 -0
  488. package/dist/ingestion/website.js +100 -0
  489. package/dist/ingestion/website.js.map +1 -0
  490. package/dist/integrations/plugin.d.ts.map +1 -1
  491. package/dist/integrations/plugin.js +32 -27
  492. package/dist/integrations/plugin.js.map +1 -1
  493. package/dist/localization/default-messages.d.ts +22 -0
  494. package/dist/localization/default-messages.d.ts.map +1 -1
  495. package/dist/localization/default-messages.js +31 -9
  496. package/dist/localization/default-messages.js.map +1 -1
  497. package/dist/notifications/routes.d.ts +2 -2
  498. package/dist/observability/hosted-model-experiment.d.ts +39 -0
  499. package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
  500. package/dist/observability/hosted-model-experiment.js +90 -0
  501. package/dist/observability/hosted-model-experiment.js.map +1 -0
  502. package/dist/observability/routes.d.ts +5 -5
  503. package/dist/observability/traces.d.ts.map +1 -1
  504. package/dist/observability/traces.js +5 -3
  505. package/dist/observability/traces.js.map +1 -1
  506. package/dist/provider-api/index.d.ts +35 -4
  507. package/dist/provider-api/index.d.ts.map +1 -1
  508. package/dist/provider-api/index.js +339 -8
  509. package/dist/provider-api/index.js.map +1 -1
  510. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  511. package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
  512. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  513. package/dist/search-utils/index.d.ts +12 -0
  514. package/dist/search-utils/index.d.ts.map +1 -0
  515. package/dist/search-utils/index.js +95 -0
  516. package/dist/search-utils/index.js.map +1 -0
  517. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  518. package/dist/secrets/register-framework-secrets.js +57 -0
  519. package/dist/secrets/register-framework-secrets.js.map +1 -1
  520. package/dist/secrets/routes.d.ts +9 -9
  521. package/dist/server/action-discovery.d.ts +8 -0
  522. package/dist/server/action-discovery.d.ts.map +1 -1
  523. package/dist/server/action-discovery.js +26 -9
  524. package/dist/server/action-discovery.js.map +1 -1
  525. package/dist/server/agent-chat/framework-prompts.js +2 -2
  526. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  527. package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
  528. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
  529. package/dist/server/agent-chat/prompt-resources.js +95 -0
  530. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  531. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  532. package/dist/server/agent-chat-plugin.js +7 -0
  533. package/dist/server/agent-chat-plugin.js.map +1 -1
  534. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  535. package/dist/server/core-routes-plugin.js +5 -0
  536. package/dist/server/core-routes-plugin.js.map +1 -1
  537. package/dist/server/index.d.ts +5 -1
  538. package/dist/server/index.d.ts.map +1 -1
  539. package/dist/server/index.js +5 -1
  540. package/dist/server/index.js.map +1 -1
  541. package/dist/server/workspace-provider-oauth.d.ts +48 -0
  542. package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
  543. package/dist/server/workspace-provider-oauth.js +415 -0
  544. package/dist/server/workspace-provider-oauth.js.map +1 -0
  545. package/dist/styles/agent-native.css +9 -0
  546. package/dist/templates/chat/app/i18n/en-US.ts +3 -3
  547. package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
  548. package/dist/templates/default/app/i18n/en-US.ts +3 -3
  549. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  550. package/dist/templates/workspace-root/.env.example +12 -0
  551. package/dist/workspace-connections/index.d.ts +1 -0
  552. package/dist/workspace-connections/index.d.ts.map +1 -1
  553. package/dist/workspace-connections/index.js +1 -0
  554. package/dist/workspace-connections/index.js.map +1 -1
  555. package/dist/workspace-connections/lifecycle.d.ts +16 -0
  556. package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
  557. package/dist/workspace-connections/lifecycle.js +14 -0
  558. package/dist/workspace-connections/lifecycle.js.map +1 -0
  559. package/dist/workspace-connections/store.d.ts.map +1 -1
  560. package/dist/workspace-connections/store.js +16 -0
  561. package/dist/workspace-connections/store.js.map +1 -1
  562. package/package.json +10 -3
  563. package/src/templates/chat/app/i18n/en-US.ts +3 -3
  564. package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
  565. package/src/templates/chat/app/lib/agent-page.tsx +10 -1
  566. package/src/templates/default/app/i18n/en-US.ts +3 -3
  567. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  568. package/src/templates/workspace-root/.env.example +12 -0
@@ -3,9 +3,11 @@ import { resolveCredential, } from "../credentials/index.js";
3
3
  import { createSsrfSafeDispatcher, isBlockedExtensionUrlWithDns, } from "../extensions/url-safety.js";
4
4
  import { processWebContent, } from "../extensions/web-content.js";
5
5
  import { deleteOAuthTokens, listOAuthAccountsByOwner, saveOAuthTokens, } from "../oauth-tokens/index.js";
6
+ import { resolveSecret } from "../server/credential-provider.js";
6
7
  import { resolveGoogleProviderCredentialCandidates } from "../server/google-oauth-credentials.js";
7
8
  import { getCredentialContext } from "../server/request-context.js";
8
9
  import { resolveWorkspaceConnectionCredentialForApp } from "../workspace-connections/credentials.js";
10
+ import { resolveWorkspaceConnectionForApp } from "../workspace-connections/store.js";
9
11
  import { createProviderQuotaIdentity, createProviderRequestDedupeKey, executeWithProviderQuota, } from "./quota-governor.js";
10
12
  export { upsertCustomProvider, deleteCustomProvider, listCustomProviders, getCustomProvider, validateCustomBaseUrl, assertCanMutateCustomProviderScope, CustomProviderAuthError, } from "./custom-registry.js";
11
13
  export const PROVIDER_API_IDS = [
@@ -23,6 +25,7 @@ export const PROVIDER_API_IDS = [
23
25
  "gong",
24
26
  "google_calendar",
25
27
  "google_drive",
28
+ "google_slides",
26
29
  "granola",
27
30
  "grafana",
28
31
  "hubspot",
@@ -341,9 +344,12 @@ const PROVIDER_CONFIGS = {
341
344
  label: "Figma REST API",
342
345
  defaultBaseUrl: "https://api.figma.com/v1",
343
346
  auth: {
344
- type: "api-key-header",
347
+ type: "oauth-bearer-or-api-key-header",
348
+ oauthProvider: "figma",
349
+ tokenLabel: "Figma OAuth token",
345
350
  key: "FIGMA_ACCESS_TOKEN",
346
351
  header: "X-Figma-Token",
352
+ workspaceProvider: "figma",
347
353
  },
348
354
  credentialKeys: ["FIGMA_ACCESS_TOKEN"],
349
355
  docsUrls: [
@@ -544,6 +550,7 @@ const PROVIDER_CONFIGS = {
544
550
  type: "oauth-bearer",
545
551
  oauthProvider: "google",
546
552
  tokenLabel: "Google OAuth token",
553
+ workspaceProvider: "google_drive",
547
554
  },
548
555
  credentialKeys: ["GOOGLE_OAUTH_ACCOUNT"],
549
556
  docsUrls: ["https://developers.google.com/drive/api/reference/rest/v3"],
@@ -558,6 +565,35 @@ const PROVIDER_CONFIGS = {
558
565
  "Uses the current user's stored Google OAuth account. Pass accountId when the user has multiple Google accounts connected.",
559
566
  ],
560
567
  },
568
+ google_slides: {
569
+ id: "google_slides",
570
+ label: "Google Slides API",
571
+ defaultBaseUrl: "https://slides.googleapis.com/v1",
572
+ auth: {
573
+ type: "oauth-bearer",
574
+ oauthProvider: "google",
575
+ tokenLabel: "Google OAuth token",
576
+ workspaceProvider: "google_drive",
577
+ },
578
+ credentialKeys: ["GOOGLE_OAUTH_ACCOUNT"],
579
+ docsUrls: [
580
+ "https://developers.google.com/workspace/slides/api/reference/rest",
581
+ ],
582
+ specUrls: ["https://slides.googleapis.com/$discovery/rest?version=v1"],
583
+ allowedHostSuffixes: ["googleapis.com"],
584
+ templateUses: ["brain", "content", "slides", "dispatch"],
585
+ examples: [
586
+ {
587
+ label: "Get presentation with slides and speaker notes",
588
+ method: "GET",
589
+ path: "/presentations/{presentationId}",
590
+ },
591
+ ],
592
+ notes: [
593
+ "Creative context imports use the non-sensitive drive.file scope. A user must choose each presentation through Google Picker before the Slides API can read it; unrestricted Drive-wide discovery is intentionally unavailable.",
594
+ "Uses the current user's stored Google OAuth account. Pass accountId when the user has multiple Google accounts connected.",
595
+ ],
596
+ },
561
597
  granola: {
562
598
  id: "granola",
563
599
  label: "Granola Public API",
@@ -692,13 +728,15 @@ const PROVIDER_CONFIGS = {
692
728
  label: "Notion",
693
729
  defaultBaseUrl: "https://api.notion.com/v1",
694
730
  auth: {
695
- type: "bearer",
696
- keys: ["NOTION_API_KEY"],
731
+ type: "oauth-bearer-or-bearer-key",
732
+ oauthProvider: "notion",
733
+ tokenLabel: "Notion OAuth token",
734
+ key: "NOTION_API_KEY",
697
735
  workspaceProvider: "notion",
698
736
  },
699
737
  credentialKeys: ["NOTION_API_KEY"],
700
738
  docsUrls: ["https://developers.notion.com/reference/intro"],
701
- defaultHeaders: { "Notion-Version": "2022-06-28" },
739
+ defaultHeaders: { "Notion-Version": "2026-03-11" },
702
740
  templateUses: ["analytics", "brain", "content", "dispatch"],
703
741
  examples: [{ label: "Search", method: "POST", path: "/search", body: {} }],
704
742
  },
@@ -1154,6 +1192,41 @@ export async function executeProviderApiRequest(args, runtime) {
1154
1192
  guidance: "This was a raw provider API request. Use provider docs/spec URLs to choose endpoints and include method/path/status plus relevant filters in the methodology. Prefer this escape hatch whenever canned actions are too narrow.",
1155
1193
  };
1156
1194
  }
1195
+ /**
1196
+ * Resolve a provider OAuth token for a trusted server-side UI bridge such as
1197
+ * Google Picker. Callers must keep the result out of agent, MCP, A2A, logs,
1198
+ * persistence, and extension/tool surfaces.
1199
+ */
1200
+ export async function resolveProviderApiOAuthAccessToken(args, runtime) {
1201
+ await assertProviderAllowedAsync(args.provider, runtime);
1202
+ const config = getProviderApiConfig(args.provider);
1203
+ const auth = config.auth;
1204
+ if (auth.type !== "oauth-bearer") {
1205
+ throw new Error(`Provider API ${args.provider} does not use a direct OAuth bearer token.`);
1206
+ }
1207
+ const ctx = requireRuntimeCredentialContext(runtime, config.credentialKeys[0] ?? config.id);
1208
+ const credential = auth.workspaceProvider && args.connectionId
1209
+ ? await resolveConnectionBoundOAuthBearerToken({
1210
+ auth,
1211
+ runtime,
1212
+ ctx,
1213
+ workspaceProvider: auth.workspaceProvider,
1214
+ connectionId: args.connectionId,
1215
+ accountId: args.accountId,
1216
+ })
1217
+ : await resolveOAuthBearerToken({
1218
+ auth,
1219
+ ctx,
1220
+ accountId: args.accountId,
1221
+ });
1222
+ return {
1223
+ accessToken: credential.value,
1224
+ accountId: credential.accountId ?? null,
1225
+ accountLabel: credential.accountLabel ?? null,
1226
+ connectionId: credential.connectionId ?? null,
1227
+ connectionLabel: credential.connectionLabel ?? null,
1228
+ };
1229
+ }
1157
1230
  const GITHUB_REPO_FILES_DEFAULT_MAX = 1_000;
1158
1231
  const GITHUB_REPO_FILES_MAX = 10_000;
1159
1232
  const GITHUB_CODE_SEARCH_DEFAULT_PER_PAGE = 30;
@@ -2110,6 +2183,12 @@ function describeAuth(auth) {
2110
2183
  return "google-service-account";
2111
2184
  if (auth.type === "oauth-bearer")
2112
2185
  return `oauth-bearer:${auth.oauthProvider}`;
2186
+ if (auth.type === "oauth-bearer-or-api-key-header") {
2187
+ return `oauth-bearer:${auth.oauthProvider}-or-api-key-header:${auth.header}`;
2188
+ }
2189
+ if (auth.type === "oauth-bearer-or-bearer-key") {
2190
+ return `oauth-bearer:${auth.oauthProvider}-or-bearer-key:${auth.key}`;
2191
+ }
2113
2192
  return "prometheus-basic-or-bearer";
2114
2193
  }
2115
2194
  function requireRuntimeCredentialContext(runtime, credentialKey) {
@@ -2340,10 +2419,85 @@ async function resolveAuth(config, runtime, ctx, args) {
2340
2419
  }
2341
2420
  if (auth.type === "oauth-bearer") {
2342
2421
  const oauthProvider = runtime.oauthProviderOverrides?.[config.id] ?? auth.oauthProvider;
2343
- const credential = await resolveOAuthBearerToken({
2344
- auth: { ...auth, oauthProvider },
2422
+ const credential = auth.workspaceProvider && args.connectionId
2423
+ ? await resolveConnectionBoundOAuthBearerToken({
2424
+ auth: { ...auth, oauthProvider },
2425
+ runtime,
2426
+ ctx,
2427
+ workspaceProvider: auth.workspaceProvider,
2428
+ connectionId: args.connectionId,
2429
+ accountId: args.accountId,
2430
+ })
2431
+ : await resolveOAuthBearerToken({
2432
+ auth: { ...auth, oauthProvider },
2433
+ ctx,
2434
+ accountId: args.accountId,
2435
+ });
2436
+ return {
2437
+ headers: { Authorization: `Bearer ${credential.value}` },
2438
+ credentialSources: [omitCredentialValue(credential)],
2439
+ secretValues: [credential.value],
2440
+ };
2441
+ }
2442
+ if (auth.type === "oauth-bearer-or-api-key-header") {
2443
+ if (args.connectionId) {
2444
+ const credential = await resolveConnectionBoundOAuthBearerToken({
2445
+ auth: {
2446
+ type: "oauth-bearer",
2447
+ oauthProvider: auth.oauthProvider,
2448
+ tokenLabel: auth.tokenLabel,
2449
+ },
2450
+ runtime,
2451
+ ctx,
2452
+ connectionId: args.connectionId,
2453
+ accountId: args.accountId,
2454
+ workspaceProvider: auth.workspaceProvider,
2455
+ });
2456
+ return {
2457
+ headers: { Authorization: `Bearer ${credential.value}` },
2458
+ credentialSources: [omitCredentialValue(credential)],
2459
+ secretValues: [credential.value],
2460
+ };
2461
+ }
2462
+ const credential = await resolveRequiredCredential({
2463
+ provider: config.id,
2464
+ workspaceProvider: auth.workspaceProvider,
2465
+ key: auth.key,
2345
2466
  ctx,
2346
- accountId: args.accountId,
2467
+ runtime,
2468
+ });
2469
+ return {
2470
+ headers: { [auth.header]: credential.value },
2471
+ credentialSources: [omitCredentialValue(credential)],
2472
+ secretValues: [credential.value],
2473
+ };
2474
+ }
2475
+ if (auth.type === "oauth-bearer-or-bearer-key") {
2476
+ if (args.connectionId) {
2477
+ const credential = await resolveConnectionBoundOAuthBearerToken({
2478
+ auth: {
2479
+ type: "oauth-bearer",
2480
+ oauthProvider: auth.oauthProvider,
2481
+ tokenLabel: auth.tokenLabel,
2482
+ },
2483
+ runtime,
2484
+ ctx,
2485
+ connectionId: args.connectionId,
2486
+ accountId: args.accountId,
2487
+ workspaceProvider: auth.workspaceProvider,
2488
+ });
2489
+ return {
2490
+ headers: { Authorization: `Bearer ${credential.value}` },
2491
+ credentialSources: [omitCredentialValue(credential)],
2492
+ secretValues: [credential.value],
2493
+ };
2494
+ }
2495
+ const credential = await resolveRequiredCredential({
2496
+ provider: config.id,
2497
+ workspaceProvider: auth.workspaceProvider,
2498
+ key: auth.key,
2499
+ ctx,
2500
+ runtime,
2347
2501
  });
2348
2502
  return {
2349
2503
  headers: { Authorization: `Bearer ${credential.value}` },
@@ -2526,6 +2680,39 @@ async function resolveOAuthBearerToken(options) {
2526
2680
  accountLabel: account.displayName,
2527
2681
  };
2528
2682
  }
2683
+ async function resolveConnectionBoundOAuthBearerToken(options) {
2684
+ const requestedConnectionId = options.connectionId?.trim();
2685
+ if (!requestedConnectionId) {
2686
+ throw new Error(`${options.auth.tokenLabel} requires an explicit workspace connection selection.`);
2687
+ }
2688
+ const resolved = await resolveWorkspaceConnectionForApp({
2689
+ appId: options.runtime.appId,
2690
+ provider: options.workspaceProvider,
2691
+ connectionId: requestedConnectionId,
2692
+ requireConnected: true,
2693
+ });
2694
+ if (!resolved.available || !resolved.connection) {
2695
+ throw new Error(resolved.reason);
2696
+ }
2697
+ const connectionAccountId = resolved.connection.accountId?.trim();
2698
+ if (!connectionAccountId) {
2699
+ throw new Error(`${options.auth.tokenLabel} workspace connection ${requestedConnectionId} is missing its OAuth account binding.`);
2700
+ }
2701
+ const requestedAccountId = options.accountId?.trim();
2702
+ if (requestedAccountId && requestedAccountId !== connectionAccountId) {
2703
+ throw new Error(`${options.auth.tokenLabel} account ${requestedAccountId} does not match workspace connection ${requestedConnectionId}.`);
2704
+ }
2705
+ const credential = await resolveOAuthBearerToken({
2706
+ auth: options.auth,
2707
+ ctx: options.ctx,
2708
+ accountId: connectionAccountId,
2709
+ });
2710
+ return {
2711
+ ...credential,
2712
+ connectionId: resolved.connection.id,
2713
+ connectionLabel: resolved.connection.label,
2714
+ };
2715
+ }
2529
2716
  async function getValidOAuthAccessToken(options) {
2530
2717
  const accessToken = options.tokens.access_token ?? options.tokens.accessToken ?? "";
2531
2718
  if (!accessToken) {
@@ -2544,10 +2731,145 @@ async function getValidOAuthAccessToken(options) {
2544
2731
  options.oauthProvider === "google-docs") {
2545
2732
  return refreshGoogleOAuthToken(options, refreshToken);
2546
2733
  }
2734
+ if (options.oauthProvider === "figma") {
2735
+ return refreshFigmaOAuthToken(options, refreshToken);
2736
+ }
2737
+ if (options.oauthProvider === "notion") {
2738
+ return refreshNotionOAuthToken(options, refreshToken);
2739
+ }
2547
2740
  throw new Error(`${options.oauthProvider} OAuth token is expired and automatic refresh is not configured for provider-api.`);
2548
2741
  }
2742
+ async function refreshFigmaOAuthToken(options, refreshToken) {
2743
+ const [clientId, clientSecret] = await Promise.all([
2744
+ resolveSecret("FIGMA_CLIENT_ID"),
2745
+ resolveSecret("FIGMA_CLIENT_SECRET"),
2746
+ ]);
2747
+ if (!clientId || !clientSecret) {
2748
+ throw new Error("FIGMA_CLIENT_ID and FIGMA_CLIENT_SECRET are required to refresh Figma OAuth tokens.");
2749
+ }
2750
+ const { response, data } = await fetchBoundedOAuthRefreshJson("https://api.figma.com/v1/oauth/token", {
2751
+ method: "POST",
2752
+ headers: {
2753
+ Authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString("base64")}`,
2754
+ "Content-Type": "application/x-www-form-urlencoded",
2755
+ },
2756
+ body: new URLSearchParams({
2757
+ grant_type: "refresh_token",
2758
+ refresh_token: refreshToken,
2759
+ }),
2760
+ }, "Figma");
2761
+ if (!response.ok || !data.access_token) {
2762
+ throw new Error(`Figma OAuth refresh failed (${response.status}).`);
2763
+ }
2764
+ const updated = {
2765
+ ...options.tokens,
2766
+ access_token: data.access_token,
2767
+ token_type: data.token_type ?? "bearer",
2768
+ expiry_date: Date.now() + (data.expires_in ?? 3600) * 1_000,
2769
+ refresh_token: data.refresh_token ?? refreshToken,
2770
+ };
2771
+ await saveOAuthTokens(options.oauthProvider, options.accountId, updated, options.ownerEmail);
2772
+ return data.access_token;
2773
+ }
2774
+ async function refreshNotionOAuthToken(options, refreshToken) {
2775
+ const [clientId, clientSecret] = await Promise.all([
2776
+ resolveSecret("NOTION_CLIENT_ID"),
2777
+ resolveSecret("NOTION_CLIENT_SECRET"),
2778
+ ]);
2779
+ if (!clientId || !clientSecret) {
2780
+ throw new Error("NOTION_CLIENT_ID and NOTION_CLIENT_SECRET are required to refresh Notion OAuth tokens.");
2781
+ }
2782
+ const { response, data } = await fetchBoundedOAuthRefreshJson("https://api.notion.com/v1/oauth/token", {
2783
+ method: "POST",
2784
+ headers: {
2785
+ Authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString("base64")}`,
2786
+ "Content-Type": "application/json",
2787
+ "Notion-Version": "2026-03-11",
2788
+ },
2789
+ body: JSON.stringify({
2790
+ grant_type: "refresh_token",
2791
+ refresh_token: refreshToken,
2792
+ }),
2793
+ }, "Notion");
2794
+ if (!response.ok || !data.access_token) {
2795
+ throw new Error(`Notion OAuth refresh failed (${response.status}).`);
2796
+ }
2797
+ const updated = {
2798
+ ...options.tokens,
2799
+ access_token: data.access_token,
2800
+ token_type: data.token_type ?? "bearer",
2801
+ expiry_date: Date.now() + (data.expires_in ?? 3600) * 1_000,
2802
+ refresh_token: data.refresh_token ?? refreshToken,
2803
+ };
2804
+ await saveOAuthTokens(options.oauthProvider, options.accountId, updated, options.ownerEmail);
2805
+ return data.access_token;
2806
+ }
2807
+ const OAUTH_REFRESH_TIMEOUT_MS = 10_000;
2808
+ const OAUTH_REFRESH_MAX_BYTES = 256 * 1024;
2809
+ async function fetchBoundedOAuthRefreshJson(url, init, providerLabel) {
2810
+ let response;
2811
+ try {
2812
+ response = await fetch(url, {
2813
+ ...init,
2814
+ signal: AbortSignal.timeout(OAUTH_REFRESH_TIMEOUT_MS),
2815
+ });
2816
+ }
2817
+ catch {
2818
+ throw new Error(`${providerLabel} OAuth refresh request failed.`);
2819
+ }
2820
+ const declaredLength = Number(response.headers.get("content-length"));
2821
+ if (Number.isFinite(declaredLength) &&
2822
+ declaredLength > OAUTH_REFRESH_MAX_BYTES) {
2823
+ throw new Error(`${providerLabel} OAuth refresh response exceeded the size limit.`);
2824
+ }
2825
+ if (!response.body)
2826
+ return { response, data: {} };
2827
+ const reader = response.body.getReader();
2828
+ const chunks = [];
2829
+ let length = 0;
2830
+ try {
2831
+ while (true) {
2832
+ const chunk = await reader.read();
2833
+ if (chunk.done)
2834
+ break;
2835
+ length += chunk.value.byteLength;
2836
+ if (length > OAUTH_REFRESH_MAX_BYTES) {
2837
+ await reader.cancel();
2838
+ break;
2839
+ }
2840
+ chunks.push(chunk.value);
2841
+ }
2842
+ }
2843
+ catch {
2844
+ throw new Error(`${providerLabel} OAuth refresh request failed.`);
2845
+ }
2846
+ if (length > OAUTH_REFRESH_MAX_BYTES) {
2847
+ throw new Error(`${providerLabel} OAuth refresh response exceeded the size limit.`);
2848
+ }
2849
+ try {
2850
+ const parsed = JSON.parse(Buffer.concat(chunks).toString("utf8"));
2851
+ return {
2852
+ response,
2853
+ data: parsed && typeof parsed === "object" && !Array.isArray(parsed)
2854
+ ? parsed
2855
+ : {},
2856
+ };
2857
+ }
2858
+ catch {
2859
+ return { response, data: {} };
2860
+ }
2861
+ }
2549
2862
  async function refreshGoogleOAuthToken(options, refreshToken) {
2550
- const credentialCandidates = resolveGoogleProviderCredentialCandidates();
2863
+ const [scopedClientId, scopedClientSecret] = await Promise.all([
2864
+ resolveSecret("GOOGLE_CLIENT_ID"),
2865
+ resolveSecret("GOOGLE_CLIENT_SECRET"),
2866
+ ]);
2867
+ const credentialCandidates = dedupeGoogleOAuthCredentials([
2868
+ ...(scopedClientId && scopedClientSecret
2869
+ ? [{ clientId: scopedClientId, clientSecret: scopedClientSecret }]
2870
+ : []),
2871
+ ...resolveGoogleProviderCredentialCandidates(),
2872
+ ]);
2551
2873
  if (!credentialCandidates.length) {
2552
2874
  throw new Error("GOOGLE_CLIENT_ID/SECRET not set for Google OAuth refresh.");
2553
2875
  }
@@ -2591,6 +2913,15 @@ async function refreshGoogleOAuthToken(options, refreshToken) {
2591
2913
  await saveOAuthTokens(options.oauthProvider, options.accountId, merged, options.ownerEmail);
2592
2914
  return data.access_token;
2593
2915
  }
2916
+ function dedupeGoogleOAuthCredentials(candidates) {
2917
+ const seen = new Set();
2918
+ return candidates.filter((candidate) => {
2919
+ if (seen.has(candidate.clientId))
2920
+ return false;
2921
+ seen.add(candidate.clientId);
2922
+ return true;
2923
+ });
2924
+ }
2594
2925
  function normalizeMethod(method) {
2595
2926
  const normalized = String(method || "GET").toUpperCase();
2596
2927
  if (normalized === "GET" ||