@agent-native/core 0.103.1 → 0.104.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 (565) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +30 -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/extensions/actions.ts +106 -16
  39. package/corpus/core/src/extensions/content-patch.ts +22 -0
  40. package/corpus/core/src/extensions/routes.ts +18 -0
  41. package/corpus/core/src/extensions/store.ts +8 -0
  42. package/corpus/core/src/index.ts +3 -0
  43. package/corpus/core/src/ingestion/docx.ts +158 -0
  44. package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
  45. package/corpus/core/src/ingestion/figma.ts +548 -0
  46. package/corpus/core/src/ingestion/index.ts +107 -0
  47. package/corpus/core/src/ingestion/media.ts +264 -0
  48. package/corpus/core/src/ingestion/notion.ts +121 -0
  49. package/corpus/core/src/ingestion/office.ts +214 -0
  50. package/corpus/core/src/ingestion/orchestration.ts +160 -0
  51. package/corpus/core/src/ingestion/pptx.ts +333 -0
  52. package/corpus/core/src/ingestion/selection.ts +81 -0
  53. package/corpus/core/src/ingestion/website.ts +151 -0
  54. package/corpus/core/src/integrations/plugin.ts +45 -37
  55. package/corpus/core/src/localization/default-messages.ts +35 -12
  56. package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
  57. package/corpus/core/src/observability/traces.ts +5 -3
  58. package/corpus/core/src/provider-api/index.ts +452 -8
  59. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
  60. package/corpus/core/src/search-utils/index.ts +112 -0
  61. package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
  62. package/corpus/core/src/server/action-discovery.ts +33 -8
  63. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  64. package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
  65. package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
  66. package/corpus/core/src/server/core-routes-plugin.ts +12 -0
  67. package/corpus/core/src/server/index.ts +30 -0
  68. package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
  69. package/corpus/core/src/styles/agent-native.css +9 -0
  70. package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
  71. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  72. package/corpus/core/src/templates/workspace-root/.env.example +12 -0
  73. package/corpus/core/src/workspace-connections/index.ts +6 -0
  74. package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
  75. package/corpus/core/src/workspace-connections/store.ts +16 -0
  76. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
  77. package/corpus/templates/analytics/AGENTS.md +9 -0
  78. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
  79. package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
  80. package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
  81. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
  82. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
  83. package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
  84. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
  85. package/corpus/templates/analytics/app/i18n-data.ts +3 -3
  86. package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
  87. package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
  88. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
  89. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
  90. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
  91. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
  92. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
  93. package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
  94. package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
  95. package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
  96. package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
  97. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
  98. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
  99. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
  100. package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
  101. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  102. package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
  103. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
  104. package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
  105. package/corpus/templates/assets/AGENTS.md +10 -0
  106. package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
  107. package/corpus/templates/assets/actions/edit-image.ts +2 -0
  108. package/corpus/templates/assets/actions/generate-asset.ts +52 -0
  109. package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
  110. package/corpus/templates/assets/actions/generate-image.ts +219 -1
  111. package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
  112. package/corpus/templates/assets/actions/refine-image.ts +3 -0
  113. package/corpus/templates/assets/actions/restyle-image.ts +2 -0
  114. package/corpus/templates/assets/agent-native.app-skill.json +4 -0
  115. package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
  116. package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
  117. package/corpus/templates/assets/app/i18n-data.ts +29 -13
  118. package/corpus/templates/assets/app/routes/agent.tsx +7 -1
  119. package/corpus/templates/assets/app/routes/library.tsx +9 -0
  120. package/corpus/templates/assets/app/routes/settings.tsx +3 -0
  121. package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
  122. package/corpus/templates/assets/package.json +1 -0
  123. package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
  124. package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
  125. package/corpus/templates/brain/app/i18n-data.ts +3 -3
  126. package/corpus/templates/brain/app/lib/brain.ts +1 -1
  127. package/corpus/templates/brain/server/lib/search.ts +17 -67
  128. package/corpus/templates/calendar/app/i18n-data.ts +3 -3
  129. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
  130. package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
  131. package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
  132. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
  133. package/corpus/templates/clips/AGENTS.md +4 -0
  134. package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
  135. package/corpus/templates/clips/actions/create-meeting.ts +6 -2
  136. package/corpus/templates/clips/actions/create-organization.ts +3 -2
  137. package/corpus/templates/clips/actions/create-recording.ts +4 -1
  138. package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
  139. package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
  140. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
  141. package/corpus/templates/clips/actions/list-meetings.ts +23 -5
  142. package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
  143. package/corpus/templates/clips/actions/remove-silences.ts +10 -1
  144. package/corpus/templates/clips/actions/request-transcript.ts +53 -11
  145. package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
  146. package/corpus/templates/clips/actions/search-recordings.ts +5 -8
  147. package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
  148. package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
  149. package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
  150. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
  151. package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
  152. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
  153. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
  154. package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
  155. package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
  156. package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
  157. package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
  158. package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
  159. package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
  160. package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
  161. package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
  162. package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
  163. package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
  164. package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
  165. package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
  166. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
  167. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
  168. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
  169. package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
  170. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
  171. package/corpus/templates/clips/app/routes/record.tsx +23 -2
  172. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
  173. package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
  174. package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
  175. package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
  176. package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  177. package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
  178. package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
  179. package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
  180. package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
  181. package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
  182. package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
  183. package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
  184. package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
  185. package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
  186. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  187. package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
  188. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
  189. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
  190. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
  191. package/corpus/templates/clips/desktop/src/app.tsx +66 -28
  192. package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
  193. package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
  194. package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
  195. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
  196. package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
  197. package/corpus/templates/clips/desktop/src/styles.css +13 -11
  198. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
  199. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
  200. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
  201. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
  202. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
  203. package/corpus/templates/clips/server/db/schema.ts +2 -2
  204. package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
  205. package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
  206. package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
  207. package/corpus/templates/clips/server/lib/recordings.ts +40 -1
  208. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  209. package/corpus/templates/clips/server/plugins/db.ts +2 -2
  210. package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
  211. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
  212. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
  213. package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
  214. package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
  215. package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
  216. package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
  217. package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
  218. package/corpus/templates/content/AGENTS.md +9 -0
  219. package/corpus/templates/content/actions/create-document.ts +94 -0
  220. package/corpus/templates/content/actions/edit-document.ts +144 -4
  221. package/corpus/templates/content/actions/update-document.ts +138 -0
  222. package/corpus/templates/content/agent-native.app-skill.json +4 -0
  223. package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
  224. package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
  225. package/corpus/templates/content/app/i18n-data.ts +13 -4
  226. package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
  227. package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
  228. package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
  229. package/corpus/templates/content/package.json +1 -0
  230. package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
  231. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
  232. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
  233. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
  234. package/corpus/templates/design/AGENTS.md +6 -0
  235. package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
  236. package/corpus/templates/design/actions/edit-design.ts +128 -0
  237. package/corpus/templates/design/actions/generate-design.ts +278 -14
  238. package/corpus/templates/design/actions/generate-screens.ts +42 -1
  239. package/corpus/templates/design/agent-native.app-skill.json +4 -0
  240. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
  241. package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
  242. package/corpus/templates/design/app/i18n-data.ts +10 -4
  243. package/corpus/templates/design/app/routes/agent.tsx +2 -1
  244. package/corpus/templates/design/app/routes/settings.tsx +3 -0
  245. package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
  246. package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
  247. package/corpus/templates/design/package.json +1 -0
  248. package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
  249. package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
  250. package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
  251. package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
  252. package/corpus/templates/design/shared/generation-session.ts +7 -0
  253. package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
  254. package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
  255. package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
  256. package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
  257. package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
  258. package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
  259. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
  260. package/corpus/templates/plan/AGENTS.md +21 -1
  261. package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
  262. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
  263. package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
  264. package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
  265. package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
  266. package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
  267. package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
  268. package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
  269. package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
  270. package/corpus/templates/plan/server/plan-mdx.ts +75 -2
  271. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
  272. package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
  273. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
  274. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
  275. package/corpus/templates/slides/AGENTS.md +6 -0
  276. package/corpus/templates/slides/actions/add-slide.ts +230 -14
  277. package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
  278. package/corpus/templates/slides/actions/create-deck.ts +130 -0
  279. package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
  280. package/corpus/templates/slides/actions/import-file.ts +5 -4
  281. package/corpus/templates/slides/actions/patch-deck.ts +200 -10
  282. package/corpus/templates/slides/actions/update-slide.ts +208 -15
  283. package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
  284. package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
  285. package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
  286. package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
  287. package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
  288. package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
  289. package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
  290. package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
  291. package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
  292. package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
  293. package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
  294. package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
  295. package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
  296. package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
  297. package/corpus/templates/slides/app/routes/agent.tsx +7 -1
  298. package/corpus/templates/slides/app/routes/settings.tsx +3 -0
  299. package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
  300. package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
  301. package/corpus/templates/slides/package.json +1 -0
  302. package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
  303. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
  304. package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
  305. package/dist/agent/engine/credential-errors.d.ts +1 -1
  306. package/dist/agent/engine/credential-errors.d.ts.map +1 -1
  307. package/dist/agent/engine/credential-errors.js +2 -2
  308. package/dist/agent/engine/credential-errors.js.map +1 -1
  309. package/dist/agent/production-agent.d.ts.map +1 -1
  310. package/dist/agent/production-agent.js +25 -0
  311. package/dist/agent/production-agent.js.map +1 -1
  312. package/dist/agent/run-store.d.ts.map +1 -1
  313. package/dist/agent/run-store.js +12 -2
  314. package/dist/agent/run-store.js.map +1 -1
  315. package/dist/cli/create.d.ts.map +1 -1
  316. package/dist/cli/create.js +1 -0
  317. package/dist/cli/create.js.map +1 -1
  318. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  319. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  320. package/dist/cli/skills-content/visual-plan-skill.js +30 -11
  321. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  322. package/dist/cli/templates-meta.d.ts.map +1 -1
  323. package/dist/cli/templates-meta.js +4 -3
  324. package/dist/cli/templates-meta.js.map +1 -1
  325. package/dist/client/AgentAskPopover.d.ts +11 -0
  326. package/dist/client/AgentAskPopover.d.ts.map +1 -0
  327. package/dist/client/AgentAskPopover.js +30 -0
  328. package/dist/client/AgentAskPopover.js.map +1 -0
  329. package/dist/client/AgentChatHome.d.ts +1 -1
  330. package/dist/client/AgentChatHome.d.ts.map +1 -1
  331. package/dist/client/AgentChatHome.js +2 -2
  332. package/dist/client/AgentChatHome.js.map +1 -1
  333. package/dist/client/AgentPanel.d.ts +9 -19
  334. package/dist/client/AgentPanel.d.ts.map +1 -1
  335. package/dist/client/AgentPanel.js +119 -80
  336. package/dist/client/AgentPanel.js.map +1 -1
  337. package/dist/client/AssistantChat.d.ts.map +1 -1
  338. package/dist/client/AssistantChat.js +4 -4
  339. package/dist/client/AssistantChat.js.map +1 -1
  340. package/dist/client/MultiTabAssistantChat.d.ts +3 -9
  341. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  342. package/dist/client/MultiTabAssistantChat.js +49 -189
  343. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  344. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  345. package/dist/client/agent-chat-adapter.js +12 -1
  346. package/dist/client/agent-chat-adapter.js.map +1 -1
  347. package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
  348. package/dist/client/agent-page/AgentContextTab.js +26 -28
  349. package/dist/client/agent-page/AgentContextTab.js.map +1 -1
  350. package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
  351. package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
  352. package/dist/client/agent-page/AgentEmptyState.js +6 -0
  353. package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
  354. package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
  355. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  356. package/dist/client/agent-page/AgentJobsTab.js +90 -58
  357. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  358. package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
  359. package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
  360. package/dist/client/agent-page/AgentTabFrame.js +7 -0
  361. package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
  362. package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
  363. package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
  364. package/dist/client/agent-page/AgentTabsPage.js +135 -99
  365. package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
  366. package/dist/client/agent-page/types.d.ts +1 -1
  367. package/dist/client/agent-page/types.d.ts.map +1 -1
  368. package/dist/client/agent-page/types.js.map +1 -1
  369. package/dist/client/analytics.d.ts +10 -3
  370. package/dist/client/analytics.d.ts.map +1 -1
  371. package/dist/client/analytics.js +37 -2
  372. package/dist/client/analytics.js.map +1 -1
  373. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  374. package/dist/client/chat/run-recovery.js +10 -3
  375. package/dist/client/chat/run-recovery.js.map +1 -1
  376. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  377. package/dist/client/composer/PromptComposer.js +2 -2
  378. package/dist/client/composer/PromptComposer.js.map +1 -1
  379. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  380. package/dist/client/composer/TiptapComposer.js +15 -3
  381. package/dist/client/composer/TiptapComposer.js.map +1 -1
  382. package/dist/client/dynamic-suggestions.js +3 -3
  383. package/dist/client/dynamic-suggestions.js.map +1 -1
  384. package/dist/client/index.d.ts +4 -3
  385. package/dist/client/index.d.ts.map +1 -1
  386. package/dist/client/index.js +3 -2
  387. package/dist/client/index.js.map +1 -1
  388. package/dist/client/resources/ResourceTree.d.ts +5 -1
  389. package/dist/client/resources/ResourceTree.d.ts.map +1 -1
  390. package/dist/client/resources/ResourceTree.js +74 -5
  391. package/dist/client/resources/ResourceTree.js.map +1 -1
  392. package/dist/client/resources/ResourcesPanel.d.ts +11 -2
  393. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  394. package/dist/client/resources/ResourcesPanel.js +105 -31
  395. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  396. package/dist/client/session-replay.d.ts +28 -0
  397. package/dist/client/session-replay.d.ts.map +1 -1
  398. package/dist/client/session-replay.js +122 -8
  399. package/dist/client/session-replay.js.map +1 -1
  400. package/dist/client/settings/AutomationsSection.d.ts +3 -1
  401. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  402. package/dist/client/settings/AutomationsSection.js +16 -6
  403. package/dist/client/settings/AutomationsSection.js.map +1 -1
  404. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  405. package/dist/client/settings/SettingsPanel.js +3 -3
  406. package/dist/client/settings/SettingsPanel.js.map +1 -1
  407. package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
  408. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  409. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  410. package/dist/client/settings/agent-settings-search.js +2 -2
  411. package/dist/client/settings/agent-settings-search.js.map +1 -1
  412. package/dist/client/use-chat-threads.d.ts +2 -0
  413. package/dist/client/use-chat-threads.d.ts.map +1 -1
  414. package/dist/client/use-chat-threads.js.map +1 -1
  415. package/dist/collab/routes.d.ts +1 -1
  416. package/dist/connections/catalog.d.ts +41 -7
  417. package/dist/connections/catalog.d.ts.map +1 -1
  418. package/dist/connections/catalog.js +40 -7
  419. package/dist/connections/catalog.js.map +1 -1
  420. package/dist/db/index.d.ts +2 -2
  421. package/dist/db/index.d.ts.map +1 -1
  422. package/dist/db/index.js +2 -2
  423. package/dist/db/index.js.map +1 -1
  424. package/dist/extensions/actions.d.ts.map +1 -1
  425. package/dist/extensions/actions.js +85 -15
  426. package/dist/extensions/actions.js.map +1 -1
  427. package/dist/extensions/content-patch.d.ts +4 -0
  428. package/dist/extensions/content-patch.d.ts.map +1 -1
  429. package/dist/extensions/content-patch.js +18 -0
  430. package/dist/extensions/content-patch.js.map +1 -1
  431. package/dist/extensions/routes.d.ts.map +1 -1
  432. package/dist/extensions/routes.js +14 -0
  433. package/dist/extensions/routes.js.map +1 -1
  434. package/dist/extensions/store.d.ts +1 -0
  435. package/dist/extensions/store.d.ts.map +1 -1
  436. package/dist/extensions/store.js +4 -1
  437. package/dist/extensions/store.js.map +1 -1
  438. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  439. package/dist/index.d.ts +1 -1
  440. package/dist/index.d.ts.map +1 -1
  441. package/dist/index.js +1 -1
  442. package/dist/index.js.map +1 -1
  443. package/dist/ingestion/docx.d.ts +16 -0
  444. package/dist/ingestion/docx.d.ts.map +1 -0
  445. package/dist/ingestion/docx.js +129 -0
  446. package/dist/ingestion/docx.js.map +1 -0
  447. package/dist/ingestion/figma-node-to-html.d.ts +304 -0
  448. package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
  449. package/dist/ingestion/figma-node-to-html.js +1292 -0
  450. package/dist/ingestion/figma-node-to-html.js.map +1 -0
  451. package/dist/ingestion/figma.d.ts +115 -0
  452. package/dist/ingestion/figma.d.ts.map +1 -0
  453. package/dist/ingestion/figma.js +399 -0
  454. package/dist/ingestion/figma.js.map +1 -0
  455. package/dist/ingestion/index.d.ts +11 -0
  456. package/dist/ingestion/index.d.ts.map +1 -0
  457. package/dist/ingestion/index.js +11 -0
  458. package/dist/ingestion/index.js.map +1 -0
  459. package/dist/ingestion/media.d.ts +36 -0
  460. package/dist/ingestion/media.d.ts.map +1 -0
  461. package/dist/ingestion/media.js +178 -0
  462. package/dist/ingestion/media.js.map +1 -0
  463. package/dist/ingestion/notion.d.ts +12 -0
  464. package/dist/ingestion/notion.d.ts.map +1 -0
  465. package/dist/ingestion/notion.js +104 -0
  466. package/dist/ingestion/notion.js.map +1 -0
  467. package/dist/ingestion/office.d.ts +45 -0
  468. package/dist/ingestion/office.d.ts.map +1 -0
  469. package/dist/ingestion/office.js +141 -0
  470. package/dist/ingestion/office.js.map +1 -0
  471. package/dist/ingestion/orchestration.d.ts +52 -0
  472. package/dist/ingestion/orchestration.d.ts.map +1 -0
  473. package/dist/ingestion/orchestration.js +89 -0
  474. package/dist/ingestion/orchestration.js.map +1 -0
  475. package/dist/ingestion/pptx.d.ts +28 -0
  476. package/dist/ingestion/pptx.d.ts.map +1 -0
  477. package/dist/ingestion/pptx.js +255 -0
  478. package/dist/ingestion/pptx.js.map +1 -0
  479. package/dist/ingestion/selection.d.ts +20 -0
  480. package/dist/ingestion/selection.d.ts.map +1 -0
  481. package/dist/ingestion/selection.js +52 -0
  482. package/dist/ingestion/selection.js.map +1 -0
  483. package/dist/ingestion/website.d.ts +27 -0
  484. package/dist/ingestion/website.d.ts.map +1 -0
  485. package/dist/ingestion/website.js +100 -0
  486. package/dist/ingestion/website.js.map +1 -0
  487. package/dist/integrations/plugin.d.ts.map +1 -1
  488. package/dist/integrations/plugin.js +32 -27
  489. package/dist/integrations/plugin.js.map +1 -1
  490. package/dist/localization/default-messages.d.ts +22 -0
  491. package/dist/localization/default-messages.d.ts.map +1 -1
  492. package/dist/localization/default-messages.js +31 -9
  493. package/dist/localization/default-messages.js.map +1 -1
  494. package/dist/notifications/routes.d.ts +1 -1
  495. package/dist/observability/hosted-model-experiment.d.ts +39 -0
  496. package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
  497. package/dist/observability/hosted-model-experiment.js +90 -0
  498. package/dist/observability/hosted-model-experiment.js.map +1 -0
  499. package/dist/observability/traces.d.ts.map +1 -1
  500. package/dist/observability/traces.js +5 -3
  501. package/dist/observability/traces.js.map +1 -1
  502. package/dist/progress/routes.d.ts +1 -1
  503. package/dist/provider-api/index.d.ts +35 -4
  504. package/dist/provider-api/index.d.ts.map +1 -1
  505. package/dist/provider-api/index.js +339 -8
  506. package/dist/provider-api/index.js.map +1 -1
  507. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  508. package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
  509. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  510. package/dist/search-utils/index.d.ts +12 -0
  511. package/dist/search-utils/index.d.ts.map +1 -0
  512. package/dist/search-utils/index.js +95 -0
  513. package/dist/search-utils/index.js.map +1 -0
  514. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  515. package/dist/secrets/register-framework-secrets.js +57 -0
  516. package/dist/secrets/register-framework-secrets.js.map +1 -1
  517. package/dist/server/action-discovery.d.ts +8 -0
  518. package/dist/server/action-discovery.d.ts.map +1 -1
  519. package/dist/server/action-discovery.js +26 -9
  520. package/dist/server/action-discovery.js.map +1 -1
  521. package/dist/server/agent-chat/framework-prompts.js +2 -2
  522. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  523. package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
  524. package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
  525. package/dist/server/agent-chat/prompt-resources.js +95 -0
  526. package/dist/server/agent-chat/prompt-resources.js.map +1 -1
  527. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  528. package/dist/server/agent-chat-plugin.js +7 -0
  529. package/dist/server/agent-chat-plugin.js.map +1 -1
  530. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  531. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  532. package/dist/server/core-routes-plugin.js +5 -0
  533. package/dist/server/core-routes-plugin.js.map +1 -1
  534. package/dist/server/index.d.ts +5 -1
  535. package/dist/server/index.d.ts.map +1 -1
  536. package/dist/server/index.js +5 -1
  537. package/dist/server/index.js.map +1 -1
  538. package/dist/server/workspace-provider-oauth.d.ts +48 -0
  539. package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
  540. package/dist/server/workspace-provider-oauth.js +415 -0
  541. package/dist/server/workspace-provider-oauth.js.map +1 -0
  542. package/dist/styles/agent-native.css +9 -0
  543. package/dist/templates/chat/app/i18n/en-US.ts +3 -3
  544. package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
  545. package/dist/templates/default/app/i18n/en-US.ts +3 -3
  546. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  547. package/dist/templates/workspace-root/.env.example +12 -0
  548. package/dist/workspace-connections/index.d.ts +1 -0
  549. package/dist/workspace-connections/index.d.ts.map +1 -1
  550. package/dist/workspace-connections/index.js +1 -0
  551. package/dist/workspace-connections/index.js.map +1 -1
  552. package/dist/workspace-connections/lifecycle.d.ts +16 -0
  553. package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
  554. package/dist/workspace-connections/lifecycle.js +14 -0
  555. package/dist/workspace-connections/lifecycle.js.map +1 -0
  556. package/dist/workspace-connections/store.d.ts.map +1 -1
  557. package/dist/workspace-connections/store.js +16 -0
  558. package/dist/workspace-connections/store.js.map +1 -1
  559. package/package.json +10 -3
  560. package/src/templates/chat/app/i18n/en-US.ts +3 -3
  561. package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
  562. package/src/templates/chat/app/lib/agent-page.tsx +10 -1
  563. package/src/templates/default/app/i18n/en-US.ts +3 -3
  564. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
  565. package/src/templates/workspace-root/.env.example +12 -0
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/workspace-connections/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport {\n listWorkspaceConnectionProviders,\n type WorkspaceConnectionCapability,\n type WorkspaceConnectionProvider,\n type WorkspaceConnectionTemplateUse,\n} from \"../connections/catalog.js\";\nimport {\n getDbExec,\n intType,\n isPostgres,\n isUniqueViolation,\n retryOnDdlRace,\n safeJsonParse,\n type DbExec,\n} from \"../db/client.js\";\nimport {\n ensureColumnExists,\n ensureIndexExists,\n ensureTableExists,\n} from \"../db/ddl-guard.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\n\nexport type WorkspaceConnectionStatus =\n | \"connected\"\n | \"checking\"\n | \"needs_reauth\"\n | \"error\"\n | \"disabled\";\n\nexport interface WorkspaceConnectionCredentialRef {\n key: string;\n scope?: \"user\" | \"org\" | \"workspace\";\n provider?: string;\n label?: string;\n [key: string]: unknown;\n}\n\nexport interface WorkspaceConnection {\n id: string;\n provider: string;\n label: string;\n accountId: string | null;\n accountLabel: string | null;\n status: WorkspaceConnectionStatus;\n scopes: string[];\n config: Record<string, unknown>;\n allowedApps: string[];\n credentialRefs: WorkspaceConnectionCredentialRef[];\n ownerEmail: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n lastUsedAt?: string | null;\n lastCheckedAt: string | null;\n lastError: string | null;\n}\n\nexport type SerializedWorkspaceConnection = WorkspaceConnection;\n\nexport interface WorkspaceConnectionGrant {\n id: string;\n connectionId: string;\n provider: string;\n appId: string;\n scopes: string[];\n config: Record<string, unknown>;\n credentialRefs: WorkspaceConnectionCredentialRef[];\n grantedByEmail: string;\n ownerEmail: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n lastUsedAt?: string | null;\n}\n\nexport type SerializedWorkspaceConnectionGrant = WorkspaceConnectionGrant;\n\nexport interface ListWorkspaceConnectionsOptions {\n provider?: string;\n appId?: string;\n includeDisabled?: boolean;\n}\n\nexport interface ListWorkspaceConnectionGrantsOptions {\n connectionId?: string;\n appId?: string;\n provider?: string;\n}\n\nexport interface ListWorkspaceConnectionsForAppOptions {\n appId: string;\n provider?: string;\n includeDisabled?: boolean;\n}\n\nexport interface ResolveWorkspaceConnectionForAppOptions extends ListWorkspaceConnectionsForAppOptions {\n connectionId?: string;\n requireConnected?: boolean;\n}\n\nexport interface UpsertWorkspaceConnectionInput {\n id?: string;\n provider: string;\n label?: string;\n accountId?: string | null;\n accountLabel?: string | null;\n status?: WorkspaceConnectionStatus;\n scopes?: string[];\n config?: Record<string, unknown>;\n allowedApps?: string[];\n credentialRefs?: WorkspaceConnectionCredentialRef[];\n lastCheckedAt?: Date | number | string | null;\n lastError?: string | null;\n}\n\nexport interface UpsertWorkspaceConnectionGrantInput {\n id?: string;\n connectionId: string;\n appId: string;\n provider?: string;\n scopes?: string[];\n config?: Record<string, unknown>;\n credentialRefs?: WorkspaceConnectionCredentialRef[];\n}\n\nexport type WorkspaceConnectionAppAccessMode =\n | \"all-apps\"\n | \"allowed-app\"\n | \"explicit-grant\"\n | \"unavailable\";\n\nexport interface WorkspaceConnectionAppAccess {\n appId: string;\n available: boolean;\n mode: WorkspaceConnectionAppAccessMode;\n reason: string;\n grantId: string | null;\n}\n\nexport type WorkspaceConnectionGrantState =\n | \"connected\"\n | \"granted\"\n | \"needs_grant\"\n | \"not_connected\";\n\nexport type WorkspaceConnectionGrantAvailability =\n | \"available\"\n | \"needs_grant\"\n | \"not_connected\";\n\nexport type WorkspaceConnectionProviderReadinessStatus =\n | \"ready\"\n | \"checking\"\n | \"needs_credentials\"\n | \"needs_attention\"\n | \"disabled\"\n | \"not_configured\";\n\nexport interface WorkspaceConnectionPublicCredentialRef {\n key: string;\n scope?: string;\n provider?: string;\n label?: string;\n source: \"connection\" | \"grant\";\n}\n\nexport interface WorkspaceConnectionExplicitGrantSummary {\n id: string;\n appId: string;\n scopes: string[];\n credentialRefs: WorkspaceConnectionPublicCredentialRef[];\n updatedAt: string;\n lastUsedAt: string | null;\n}\n\nexport interface WorkspaceConnectionForAppSummary {\n id: string;\n label: string;\n provider: string;\n accountId: string | null;\n accountLabel: string | null;\n status: WorkspaceConnectionStatus;\n grantedToApp: boolean;\n grantScope: \"all-apps\" | \"selected-apps\";\n appAccess: WorkspaceConnectionAppAccess;\n allowedApps: string[];\n credentialRefs: WorkspaceConnectionPublicCredentialRef[];\n lastUsedAt: string | null;\n lastCheckedAt: string | null;\n lastError: string | null;\n explicitGrant: WorkspaceConnectionExplicitGrantSummary | null;\n}\n\nexport interface WorkspaceConnectionForApp extends SerializedWorkspaceConnection {\n appAccess: WorkspaceConnectionAppAccess;\n explicitGrant: SerializedWorkspaceConnectionGrant | null;\n}\n\nexport interface ResolvedWorkspaceConnectionForApp {\n available: boolean;\n connection: WorkspaceConnectionForApp | null;\n appAccess: WorkspaceConnectionAppAccess | null;\n reason: string;\n}\n\nexport interface WorkspaceConnectionProviderAppSummary {\n appId: string;\n provider: string;\n grantState: WorkspaceConnectionGrantState;\n grantAvailability: WorkspaceConnectionGrantAvailability;\n grantAvailabilityMessage: string;\n connectionCount: number;\n grantedConnectionCount: number;\n activeConnectionCount: number;\n ungrantedConnectionCount: number;\n unhealthyGrantedConnectionCount: number;\n explicitGrantCount: number;\n credentialRefCount: number;\n hasWorkspaceConnection: boolean;\n hasGrantedWorkspaceConnection: boolean;\n hasActiveWorkspaceConnection: boolean;\n lastUsedAt: string | null;\n statuses: WorkspaceConnectionStatus[];\n connections: WorkspaceConnectionForAppSummary[];\n}\n\nexport interface WorkspaceConnectionProviderReadiness {\n status: WorkspaceConnectionProviderReadinessStatus;\n connectionCount: number;\n activeConnectionCount: number;\n readyConnectionCount: number;\n requiredCredentialKeys: string[];\n missingRequiredCredentialKeys: string[];\n appGrant: WorkspaceConnectionProviderAppSummary | null;\n}\n\nexport interface WorkspaceConnectionProviderLike {\n id: string;\n label?: string;\n credentialKeys?: readonly {\n key: string;\n required?: boolean;\n }[];\n}\n\nexport interface SummarizeWorkspaceConnectionProviderForAppOptions {\n providerId: string;\n appId: string;\n connections: SerializedWorkspaceConnection[];\n grants?: SerializedWorkspaceConnectionGrant[];\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface SummarizeWorkspaceConnectionProviderReadinessOptions {\n provider: WorkspaceConnectionProviderLike;\n connections: SerializedWorkspaceConnection[];\n grants?: SerializedWorkspaceConnectionGrant[];\n appId?: string;\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface ListWorkspaceConnectionProviderCatalogForAppOptions {\n appId: string;\n provider?: string;\n capability?: WorkspaceConnectionCapability;\n templateUse?: WorkspaceConnectionTemplateUse;\n includeDisabled?: boolean;\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface MarkWorkspaceConnectionUsedOptions {\n connectionId: string;\n appId?: string | null;\n usedAt?: Date | number | string | null;\n}\n\nexport interface MarkWorkspaceConnectionUsedResult {\n connectionUpdated: boolean;\n grantUpdated: boolean;\n lastUsedAt: string;\n}\n\nexport interface WorkspaceConnectionProviderCatalogForAppItem extends WorkspaceConnectionProvider {\n workspaceConnection: WorkspaceConnectionProviderAppSummary;\n readiness: WorkspaceConnectionProviderReadiness;\n}\n\nexport interface WorkspaceConnectionProviderCatalogForApp {\n appId: string;\n providers: WorkspaceConnectionProviderCatalogForAppItem[];\n connections: SerializedWorkspaceConnection[];\n grants: SerializedWorkspaceConnectionGrant[];\n counts: {\n providers: number;\n connections: number;\n grants: number;\n readyProviders: number;\n };\n}\n\nlet _initPromise: Promise<void> | undefined;\n\nfunction workspaceConnectionsTable(): string {\n return isPostgres()\n ? \"public.workspace_connections\"\n : \"workspace_connections\";\n}\n\nfunction workspaceConnectionGrantsTable(): string {\n return isPostgres()\n ? \"public.workspace_connection_grants\"\n : \"workspace_connection_grants\";\n}\n\nfunction isDuplicateColumnError(err: unknown): boolean {\n const code = String((err as { code?: unknown })?.code ?? \"\");\n const message = String((err as { message?: unknown })?.message ?? err)\n .toLowerCase()\n .trim();\n return (\n code === \"42701\" ||\n message.includes(\"duplicate column\") ||\n message.includes(\"already exists\")\n );\n}\n\nasync function ensureColumn(\n client: DbExec,\n table: string,\n name: string,\n definition: string,\n): Promise<void> {\n try {\n await retryOnDdlRace(() =>\n client.execute(\n isPostgres()\n ? `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS ${name} ${definition}`\n : `ALTER TABLE ${table} ADD COLUMN ${name} ${definition}`,\n ),\n );\n } catch (err) {\n if (!isDuplicateColumnError(err)) throw err;\n }\n}\n\nasync function ensureWorkspaceConnectionColumns(\n client: DbExec,\n table: string,\n): Promise<void> {\n await ensureColumn(client, table, \"provider\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"label\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"account_id\", \"TEXT\");\n await ensureColumn(client, table, \"account_label\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"status\",\n \"TEXT NOT NULL DEFAULT 'connected'\",\n );\n await ensureColumn(\n client,\n table,\n \"scopes_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"config_json\",\n \"TEXT NOT NULL DEFAULT '{}'\",\n );\n await ensureColumn(\n client,\n table,\n \"allowed_apps_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"credential_refs_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(client, table, \"owner_email\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"org_id\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"created_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(\n client,\n table,\n \"updated_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(client, table, \"last_checked_at\", intType());\n await ensureColumn(client, table, \"last_used_at\", intType());\n await ensureColumn(client, table, \"last_error\", \"TEXT\");\n}\n\nasync function ensureWorkspaceConnectionGrantColumns(\n client: DbExec,\n table: string,\n): Promise<void> {\n await ensureColumn(\n client,\n table,\n \"connection_id\",\n \"TEXT NOT NULL DEFAULT ''\",\n );\n await ensureColumn(client, table, \"provider\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"app_id\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(\n client,\n table,\n \"scopes_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"config_json\",\n \"TEXT NOT NULL DEFAULT '{}'\",\n );\n await ensureColumn(\n client,\n table,\n \"credential_refs_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"granted_by_email\",\n \"TEXT NOT NULL DEFAULT ''\",\n );\n await ensureColumn(client, table, \"owner_email\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"org_id\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"created_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(\n client,\n table,\n \"updated_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(client, table, \"last_used_at\", intType());\n}\n\nexport async function ensureWorkspaceConnectionsTable(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const grantsTable = workspaceConnectionGrantsTable();\n\n const createConnectionsSql = `\n CREATE TABLE IF NOT EXISTS ${table} (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL DEFAULT '',\n label TEXT NOT NULL DEFAULT '',\n account_id TEXT,\n account_label TEXT,\n status TEXT NOT NULL DEFAULT 'connected',\n scopes_json TEXT NOT NULL DEFAULT '[]',\n config_json TEXT NOT NULL DEFAULT '{}',\n allowed_apps_json TEXT NOT NULL DEFAULT '[]',\n credential_refs_json TEXT NOT NULL DEFAULT '[]',\n owner_email TEXT NOT NULL DEFAULT '',\n org_id TEXT,\n created_at ${intType()} NOT NULL DEFAULT 0,\n updated_at ${intType()} NOT NULL DEFAULT 0,\n last_used_at ${intType()},\n last_checked_at ${intType()},\n last_error TEXT\n )\n `;\n const createGrantsSql = `\n CREATE TABLE IF NOT EXISTS ${grantsTable} (\n id TEXT PRIMARY KEY,\n connection_id TEXT NOT NULL DEFAULT '',\n provider TEXT NOT NULL DEFAULT '',\n app_id TEXT NOT NULL DEFAULT '',\n scopes_json TEXT NOT NULL DEFAULT '[]',\n config_json TEXT NOT NULL DEFAULT '{}',\n credential_refs_json TEXT NOT NULL DEFAULT '[]',\n granted_by_email TEXT NOT NULL DEFAULT '',\n owner_email TEXT NOT NULL DEFAULT '',\n org_id TEXT,\n created_at ${intType()} NOT NULL DEFAULT 0,\n updated_at ${intType()} NOT NULL DEFAULT 0,\n last_used_at ${intType()}\n )\n `;\n\n if (isPostgres()) {\n // PG-guard: probe information_schema / pg_indexes first (no lock) and\n // only issue DDL when the table/column/index is actually missing,\n // wrapped in a transaction-scoped lock_timeout so a contended lock\n // fails fast. Uses unqualified table names for the probe (the helpers\n // always search the `public` schema).\n\n // --- workspace_connections ---\n await ensureTableExists(\"workspace_connections\", createConnectionsSql);\n await ensureColumnExists(\n \"workspace_connections\",\n \"provider\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS provider TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"label\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS label TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"account_id\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS account_id TEXT`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"account_label\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS account_label TEXT`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"status\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS status TEXT NOT NULL DEFAULT 'connected'`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"scopes_json\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS scopes_json TEXT NOT NULL DEFAULT '[]'`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"config_json\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS config_json TEXT NOT NULL DEFAULT '{}'`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"allowed_apps_json\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS allowed_apps_json TEXT NOT NULL DEFAULT '[]'`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"credential_refs_json\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS credential_refs_json TEXT NOT NULL DEFAULT '[]'`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"owner_email\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS owner_email TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"org_id\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS org_id TEXT`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"created_at\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS created_at ${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"updated_at\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS updated_at ${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"last_checked_at\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS last_checked_at ${intType()}`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"last_used_at\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS last_used_at ${intType()}`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"last_error\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS last_error TEXT`,\n );\n await ensureIndexExists(\n \"idx_workspace_connections_scope_provider\",\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_scope_provider ON ${table} (org_id, owner_email, provider)`,\n );\n await ensureIndexExists(\n \"idx_workspace_connections_updated_at\",\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_updated_at ON ${table} (updated_at)`,\n );\n\n // --- workspace_connection_grants ---\n await ensureTableExists(\"workspace_connection_grants\", createGrantsSql);\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"connection_id\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS connection_id TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"provider\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS provider TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"app_id\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS app_id TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"scopes_json\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS scopes_json TEXT NOT NULL DEFAULT '[]'`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"config_json\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS config_json TEXT NOT NULL DEFAULT '{}'`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"credential_refs_json\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS credential_refs_json TEXT NOT NULL DEFAULT '[]'`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"granted_by_email\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS granted_by_email TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"owner_email\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS owner_email TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"org_id\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS org_id TEXT`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"created_at\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS created_at ${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"updated_at\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS updated_at ${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"last_used_at\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS last_used_at ${intType()}`,\n );\n await ensureIndexExists(\n \"idx_workspace_connection_grants_connection_app\",\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_connection_grants_connection_app ON ${grantsTable} (connection_id, app_id)`,\n );\n await ensureIndexExists(\n \"idx_workspace_connection_grants_scope_app\",\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_scope_app ON ${grantsTable} (org_id, owner_email, app_id)`,\n );\n await ensureIndexExists(\n \"idx_workspace_connection_grants_updated_at\",\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_updated_at ON ${grantsTable} (updated_at)`,\n );\n return;\n }\n\n // SQLite (local dev): no ACCESS EXCLUSIVE lock problem — keep existing\n // retryOnDdlRace + ensureColumn behaviour.\n await retryOnDdlRace(() => client.execute(createConnectionsSql));\n await ensureWorkspaceConnectionColumns(client, table);\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_scope_provider ON ${table} (org_id, owner_email, provider)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_updated_at ON ${table} (updated_at)`,\n ),\n );\n await retryOnDdlRace(() => client.execute(createGrantsSql));\n await ensureWorkspaceConnectionGrantColumns(client, grantsTable);\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_connection_grants_connection_app ON ${grantsTable} (connection_id, app_id)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_scope_app ON ${grantsTable} (org_id, owner_email, app_id)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_updated_at ON ${grantsTable} (updated_at)`,\n ),\n );\n })().catch((err) => {\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nfunction requireWorkspaceConnectionScope(): {\n ownerEmail: string;\n orgId: string | null;\n} {\n const ownerEmail = getRequestUserEmail()?.trim().toLowerCase();\n if (!ownerEmail) {\n throw new Error(\"Workspace connections require an authenticated user.\");\n }\n return {\n ownerEmail,\n orgId: getRequestOrgId()?.trim() || null,\n };\n}\n\nfunction scopedWhere(\n scope: ReturnType<typeof requireWorkspaceConnectionScope>,\n): { sql: string; args: string[] } {\n if (scope.orgId) {\n return { sql: \"org_id = ?\", args: [scope.orgId] };\n }\n return {\n sql: \"owner_email = ? AND org_id IS NULL\",\n args: [scope.ownerEmail],\n };\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nfunction normalizeRequiredString(value: unknown, label: string): string {\n const normalized = typeof value === \"string\" ? value.trim() : \"\";\n if (!normalized) {\n throw new Error(`${label} is required.`);\n }\n return normalized;\n}\n\nfunction normalizeObject(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n return value as Record<string, unknown>;\n}\n\nfunction normalizeCredentialRefs(\n value: unknown,\n): WorkspaceConnectionCredentialRef[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter(\n (entry): entry is WorkspaceConnectionCredentialRef =>\n !!entry &&\n typeof entry === \"object\" &&\n !Array.isArray(entry) &&\n typeof (entry as WorkspaceConnectionCredentialRef).key === \"string\",\n )\n .map((entry) => sanitizeCredentialRef(entry))\n .filter((entry) => entry.key.trim().length > 0);\n}\n\nfunction normalizeStatus(value: unknown): WorkspaceConnectionStatus {\n if (\n value === \"checking\" ||\n value === \"needs_reauth\" ||\n value === \"error\" ||\n value === \"disabled\"\n ) {\n return value;\n }\n return \"connected\";\n}\n\nfunction millis(\n value: Date | number | string | null | undefined,\n): number | null {\n if (value == null) return null;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n const parsed = Date.parse(String(value));\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction iso(value: unknown): string | null {\n if (value == null) return null;\n const num = Number(value);\n if (!Number.isFinite(num) || num <= 0) return null;\n return new Date(num).toISOString();\n}\n\nconst SECRET_KEYS = new Set([\n \"apikey\",\n \"authorization\",\n \"clientsecret\",\n \"cookie\",\n \"password\",\n \"privatekey\",\n \"refreshtoken\",\n \"secret\",\n \"token\",\n \"accesstoken\",\n]);\n\nfunction normalizedKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nfunction sanitizeJson(value: unknown, allowCredentialRefKey = false): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => sanitizeJson(entry, allowCredentialRefKey));\n }\n if (!value || typeof value !== \"object\") return value;\n\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = normalizedKey(key);\n if (\n SECRET_KEYS.has(normalized) &&\n !(allowCredentialRefKey && normalized === \"key\")\n ) {\n result[key] = \"[redacted]\";\n continue;\n }\n result[key] = sanitizeJson(entry, allowCredentialRefKey);\n }\n return result;\n}\n\nfunction sanitizeConfig(\n config: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n return sanitizeJson(normalizeObject(config), false) as Record<\n string,\n unknown\n >;\n}\n\nfunction sanitizeCredentialRef(\n ref: WorkspaceConnectionCredentialRef,\n): WorkspaceConnectionCredentialRef {\n const sanitized = sanitizeJson(ref, true) as WorkspaceConnectionCredentialRef;\n if (Object.prototype.hasOwnProperty.call(sanitized, \"value\")) {\n sanitized.value = \"[redacted]\";\n }\n return sanitized;\n}\n\nfunction parseRow(row: Record<string, unknown>): WorkspaceConnection {\n return serializeWorkspaceConnection({\n id: String(row.id),\n provider: String(row.provider ?? \"\"),\n label: String(row.label ?? \"\"),\n accountId: row.account_id == null ? null : String(row.account_id),\n accountLabel: row.account_label == null ? null : String(row.account_label),\n status: normalizeStatus(row.status),\n scopes: normalizeStringArray(safeJsonParse<unknown>(row.scopes_json, [])),\n config: normalizeObject(safeJsonParse<unknown>(row.config_json, {})),\n allowedApps: normalizeStringArray(\n safeJsonParse<unknown>(row.allowed_apps_json, []),\n ),\n credentialRefs: normalizeCredentialRefs(\n safeJsonParse<unknown>(row.credential_refs_json, []),\n ),\n ownerEmail: String(row.owner_email ?? \"\"),\n orgId: row.org_id == null ? null : String(row.org_id),\n createdAt: iso(row.created_at) ?? new Date(0).toISOString(),\n updatedAt: iso(row.updated_at) ?? new Date(0).toISOString(),\n lastUsedAt: iso(row.last_used_at),\n lastCheckedAt: iso(row.last_checked_at),\n lastError: row.last_error == null ? null : String(row.last_error),\n });\n}\n\nfunction parseGrantRow(row: Record<string, unknown>): WorkspaceConnectionGrant {\n return serializeWorkspaceConnectionGrant({\n id: String(row.id),\n connectionId: String(row.connection_id ?? \"\"),\n provider: String(row.provider ?? \"\"),\n appId: String(row.app_id ?? \"\"),\n scopes: normalizeStringArray(safeJsonParse<unknown>(row.scopes_json, [])),\n config: normalizeObject(safeJsonParse<unknown>(row.config_json, {})),\n credentialRefs: normalizeCredentialRefs(\n safeJsonParse<unknown>(row.credential_refs_json, []),\n ),\n grantedByEmail: String(row.granted_by_email ?? \"\"),\n ownerEmail: String(row.owner_email ?? \"\"),\n orgId: row.org_id == null ? null : String(row.org_id),\n createdAt: iso(row.created_at) ?? new Date(0).toISOString(),\n updatedAt: iso(row.updated_at) ?? new Date(0).toISOString(),\n lastUsedAt: iso(row.last_used_at),\n });\n}\n\nexport function serializeWorkspaceConnection(\n connection: WorkspaceConnection,\n): SerializedWorkspaceConnection {\n return {\n ...connection,\n scopes: normalizeStringArray(connection.scopes),\n config: sanitizeConfig(connection.config),\n allowedApps: normalizeStringArray(connection.allowedApps),\n credentialRefs: normalizeCredentialRefs(connection.credentialRefs),\n };\n}\n\nexport function serializeWorkspaceConnectionGrant(\n grant: WorkspaceConnectionGrant,\n): SerializedWorkspaceConnectionGrant {\n return {\n ...grant,\n scopes: normalizeStringArray(grant.scopes),\n config: sanitizeConfig(grant.config),\n credentialRefs: normalizeCredentialRefs(grant.credentialRefs),\n };\n}\n\nexport function getWorkspaceConnectionAppAccess(\n connection: Pick<\n SerializedWorkspaceConnection,\n \"id\" | \"allowedApps\" | \"label\"\n >,\n appId: string,\n grants: Pick<\n SerializedWorkspaceConnectionGrant,\n \"id\" | \"connectionId\" | \"appId\"\n >[] = [],\n): WorkspaceConnectionAppAccess {\n const normalizedAppId = appId.trim();\n if (!normalizedAppId) {\n return {\n appId: normalizedAppId,\n available: false,\n mode: \"unavailable\",\n reason: \"No app id was provided.\",\n grantId: null,\n };\n }\n\n if (connection.allowedApps.length === 0) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"all-apps\",\n reason: \"Connection is available to every app in the workspace.\",\n grantId: null,\n };\n }\n\n if (connection.allowedApps.includes(normalizedAppId)) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"allowed-app\",\n reason: `Connection is directly allowed for ${normalizedAppId}.`,\n grantId: null,\n };\n }\n\n const explicitGrant = grants.find(\n (grant) =>\n grant.connectionId === connection.id && grant.appId === normalizedAppId,\n );\n if (explicitGrant) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"explicit-grant\",\n reason: `Connection has an explicit grant for ${normalizedAppId}.`,\n grantId: explicitGrant.id,\n };\n }\n\n return {\n appId: normalizedAppId,\n available: false,\n mode: \"unavailable\",\n reason: `Grant ${normalizedAppId} access before this connection can be reused by the app.`,\n grantId: null,\n };\n}\n\nexport function workspaceConnectionIsAvailableToApp(\n connection: Pick<\n SerializedWorkspaceConnection,\n \"id\" | \"allowedApps\" | \"label\"\n >,\n appId: string,\n grants: Pick<\n SerializedWorkspaceConnectionGrant,\n \"id\" | \"connectionId\" | \"appId\"\n >[] = [],\n): boolean {\n return getWorkspaceConnectionAppAccess(connection, appId, grants).available;\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return Array.from(\n new Set(values.map((value) => value.trim()).filter(Boolean)),\n );\n}\n\nfunction latestIso(values: Array<string | null | undefined>): string | null {\n const latest = values.reduce<number | null>((current, value) => {\n const parsed = value ? Date.parse(value) : NaN;\n if (!Number.isFinite(parsed)) return current;\n return current == null || parsed > current ? parsed : current;\n }, null);\n return latest == null ? null : new Date(latest).toISOString();\n}\n\nfunction publicCredentialRefs(\n refs: WorkspaceConnectionCredentialRef[],\n source: WorkspaceConnectionPublicCredentialRef[\"source\"],\n): WorkspaceConnectionPublicCredentialRef[] {\n return refs.map((ref) => ({\n key: ref.key,\n scope: ref.scope,\n provider: ref.provider,\n label: ref.label,\n source,\n }));\n}\n\nfunction grantsForConnection(\n connectionId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n appId?: string,\n): SerializedWorkspaceConnectionGrant[] {\n return grants.filter(\n (grant) =>\n grant.connectionId === connectionId && (!appId || grant.appId === appId),\n );\n}\n\nfunction explicitGrantForConnection(\n connectionId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n appId?: string,\n): SerializedWorkspaceConnectionGrant | undefined {\n return grantsForConnection(connectionId, grants, appId)[0];\n}\n\nfunction connectionForApp(\n connection: SerializedWorkspaceConnection,\n appId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n): WorkspaceConnectionForApp {\n const normalizedAppId = appId.trim();\n const appAccess = getWorkspaceConnectionAppAccess(\n connection,\n normalizedAppId,\n grants,\n );\n return {\n ...connection,\n appAccess,\n explicitGrant:\n explicitGrantForConnection(connection.id, grants, normalizedAppId) ??\n null,\n };\n}\n\nfunction serializeConnectionForApp(\n connection: SerializedWorkspaceConnection,\n appId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n): WorkspaceConnectionForAppSummary {\n const explicitGrant = explicitGrantForConnection(\n connection.id,\n grants,\n appId,\n );\n const appAccess = getWorkspaceConnectionAppAccess(connection, appId, grants);\n return {\n id: connection.id,\n label: connection.label,\n provider: connection.provider,\n accountId: connection.accountId,\n accountLabel: connection.accountLabel,\n status: connection.status,\n grantedToApp: appAccess.available,\n grantScope:\n connection.allowedApps.length === 0 ? \"all-apps\" : \"selected-apps\",\n appAccess,\n allowedApps: connection.allowedApps,\n credentialRefs: publicCredentialRefs(\n connection.credentialRefs,\n \"connection\",\n ),\n lastUsedAt: latestIso([connection.lastUsedAt, explicitGrant?.lastUsedAt]),\n lastCheckedAt: connection.lastCheckedAt,\n lastError: connection.lastError,\n explicitGrant: explicitGrant\n ? {\n id: explicitGrant.id,\n appId: explicitGrant.appId,\n scopes: explicitGrant.scopes,\n credentialRefs: publicCredentialRefs(\n explicitGrant.credentialRefs,\n \"grant\",\n ),\n updatedAt: explicitGrant.updatedAt,\n lastUsedAt: explicitGrant.lastUsedAt ?? null,\n }\n : null,\n };\n}\n\nfunction grantAvailabilityMessage(\n grantState: WorkspaceConnectionGrantState,\n providerId: string,\n appId: string,\n): string {\n switch (grantState) {\n case \"connected\":\n return `${appId} has an active ${providerId} workspace connection.`;\n case \"granted\":\n return `${appId} has ${providerId} access, but the granted connection is not connected yet.`;\n case \"needs_grant\":\n return `A ${providerId} workspace connection exists; grant ${appId} access to reuse it.`;\n case \"not_connected\":\n default:\n return `No shared ${providerId} workspace connection is available yet.`;\n }\n}\n\nexport function summarizeWorkspaceConnectionProviderForApp({\n providerId,\n appId,\n connections,\n grants = [],\n includeConnections = \"granted\",\n}: SummarizeWorkspaceConnectionProviderForAppOptions): WorkspaceConnectionProviderAppSummary {\n const normalizedProviderId = providerId.trim();\n const normalizedAppId = appId.trim();\n const allConnections = connections.filter(\n (connection) => connection.provider === normalizedProviderId,\n );\n const grantedConnections = allConnections.filter(\n (connection) =>\n getWorkspaceConnectionAppAccess(connection, normalizedAppId, grants)\n .available,\n );\n const connectedConnections = grantedConnections.filter(\n (connection) => connection.status === \"connected\",\n );\n const ungrantedConnectionCount =\n allConnections.length - grantedConnections.length;\n const unhealthyGrantedConnectionCount =\n grantedConnections.length - connectedConnections.length;\n const grantState: WorkspaceConnectionGrantState = connectedConnections.length\n ? \"connected\"\n : grantedConnections.length\n ? \"granted\"\n : allConnections.length\n ? \"needs_grant\"\n : \"not_connected\";\n const explicitGrantCount = allConnections.reduce(\n (count, connection) =>\n explicitGrantForConnection(connection.id, grants, normalizedAppId)\n ? count + 1\n : count,\n 0,\n );\n const credentialRefCount = allConnections.reduce((count, connection) => {\n const explicitGrant = explicitGrantForConnection(\n connection.id,\n grants,\n normalizedAppId,\n );\n return (\n count +\n connection.credentialRefs.length +\n (explicitGrant?.credentialRefs.length ?? 0)\n );\n }, 0);\n const visibleConnections =\n includeConnections === \"all\" ? allConnections : grantedConnections;\n const lastUsedAt = latestIso(\n grantedConnections.flatMap((connection) => [\n connection.lastUsedAt,\n explicitGrantForConnection(connection.id, grants, normalizedAppId)\n ?.lastUsedAt,\n ]),\n );\n\n return {\n appId: normalizedAppId,\n provider: normalizedProviderId,\n grantState,\n grantAvailability:\n grantState === \"connected\" || grantState === \"granted\"\n ? \"available\"\n : grantState,\n grantAvailabilityMessage: grantAvailabilityMessage(\n grantState,\n normalizedProviderId,\n normalizedAppId,\n ),\n connectionCount: allConnections.length,\n grantedConnectionCount: grantedConnections.length,\n activeConnectionCount: connectedConnections.length,\n ungrantedConnectionCount,\n unhealthyGrantedConnectionCount,\n explicitGrantCount,\n credentialRefCount,\n hasWorkspaceConnection: allConnections.length > 0,\n hasGrantedWorkspaceConnection: grantedConnections.length > 0,\n hasActiveWorkspaceConnection: connectedConnections.length > 0,\n lastUsedAt,\n statuses: uniqueStrings(\n allConnections.map((connection) => connection.status),\n ) as WorkspaceConnectionStatus[],\n connections: visibleConnections.map((connection) =>\n serializeConnectionForApp(connection, normalizedAppId, grants),\n ),\n };\n}\n\nfunction requiredCredentialKeys(provider: WorkspaceConnectionProviderLike) {\n return uniqueStrings(\n (provider.credentialKeys ?? [])\n .filter((credential) => credential.required ?? false)\n .map((credential) => credential.key),\n );\n}\n\nfunction missingRequiredCredentialKeys(\n provider: WorkspaceConnectionProviderLike,\n connection: SerializedWorkspaceConnection,\n grants: SerializedWorkspaceConnectionGrant[] = [],\n): string[] {\n const available = new Set(\n [\n ...connection.credentialRefs,\n ...grants.flatMap((grant) => grant.credentialRefs),\n ]\n .map((ref) => ref.key.trim())\n .filter(Boolean),\n );\n return requiredCredentialKeys(provider).filter((key) => !available.has(key));\n}\n\nexport function summarizeWorkspaceConnectionProviderReadiness({\n provider,\n connections,\n grants = [],\n appId,\n includeConnections,\n}: SummarizeWorkspaceConnectionProviderReadinessOptions): WorkspaceConnectionProviderReadiness {\n const providerConnections = connections.filter(\n (connection) => connection.provider === provider.id,\n );\n const activeConnections = providerConnections.filter(\n (connection) => connection.status !== \"disabled\",\n );\n const attentionConnections = activeConnections.filter(\n (connection) =>\n connection.status === \"error\" ||\n connection.status === \"needs_reauth\" ||\n Boolean(connection.lastError),\n );\n const missingKeys = uniqueStrings(\n activeConnections.flatMap((connection) =>\n missingRequiredCredentialKeys(\n provider,\n connection,\n grantsForConnection(connection.id, grants, appId),\n ),\n ),\n );\n const readyConnections = activeConnections.filter(\n (connection) =>\n connection.status === \"connected\" &&\n missingRequiredCredentialKeys(\n provider,\n connection,\n grantsForConnection(connection.id, grants, appId),\n ).length === 0,\n );\n const checkingConnections = activeConnections.filter(\n (connection) => connection.status === \"checking\",\n );\n\n let status: WorkspaceConnectionProviderReadinessStatus = \"not_configured\";\n if (readyConnections.length > 0) {\n status = \"ready\";\n } else if (attentionConnections.length > 0) {\n status = \"needs_attention\";\n } else if (missingKeys.length > 0) {\n status = \"needs_credentials\";\n } else if (checkingConnections.length > 0) {\n status = \"checking\";\n } else if (providerConnections.length > 0) {\n status = \"disabled\";\n }\n\n return {\n status,\n connectionCount: providerConnections.length,\n activeConnectionCount: activeConnections.length,\n readyConnectionCount: readyConnections.length,\n requiredCredentialKeys: requiredCredentialKeys(provider),\n missingRequiredCredentialKeys: missingKeys,\n appGrant: appId\n ? summarizeWorkspaceConnectionProviderForApp({\n providerId: provider.id,\n appId,\n connections,\n grants,\n includeConnections,\n })\n : null,\n };\n}\n\nexport async function listWorkspaceConnectionProviderCatalogForApp({\n appId,\n provider,\n capability,\n templateUse,\n includeDisabled = true,\n includeConnections = \"all\",\n}: ListWorkspaceConnectionProviderCatalogForAppOptions): Promise<WorkspaceConnectionProviderCatalogForApp> {\n const [connections, grants] = await Promise.all([\n listWorkspaceConnections({ provider, includeDisabled }),\n listWorkspaceConnectionGrants({ provider, appId }),\n ]);\n const providers = listWorkspaceConnectionProviders({\n capability,\n templateUse,\n })\n .filter((item) => !provider || item.id === provider)\n .map((item) => {\n const workspaceConnection = summarizeWorkspaceConnectionProviderForApp({\n providerId: item.id,\n appId,\n connections,\n grants,\n includeConnections,\n });\n const readiness = summarizeWorkspaceConnectionProviderReadiness({\n provider: item,\n connections,\n grants,\n appId,\n includeConnections,\n });\n return {\n ...item,\n workspaceConnection,\n readiness,\n };\n });\n\n return {\n appId,\n providers,\n connections,\n grants,\n counts: {\n providers: providers.length,\n connections: connections.length,\n grants: grants.length,\n readyProviders: providers.filter(\n (item) => item.readiness.status === \"ready\",\n ).length,\n },\n };\n}\n\nexport async function listWorkspaceConnectionsForApp({\n appId,\n provider,\n includeDisabled = false,\n}: ListWorkspaceConnectionsForAppOptions): Promise<\n WorkspaceConnectionForApp[]\n> {\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"listWorkspaceConnectionsForApp appId\",\n );\n const [connections, grants] = await Promise.all([\n listWorkspaceConnections({ provider, includeDisabled }),\n listWorkspaceConnectionGrants({ provider, appId: normalizedAppId }),\n ]);\n\n return connections\n .map((connection) => connectionForApp(connection, normalizedAppId, grants))\n .filter((connection) => connection.appAccess.available);\n}\n\nexport async function resolveWorkspaceConnectionForApp({\n appId,\n provider,\n includeDisabled = false,\n connectionId,\n requireConnected = false,\n}: ResolveWorkspaceConnectionForAppOptions): Promise<ResolvedWorkspaceConnectionForApp> {\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"resolveWorkspaceConnectionForApp appId\",\n );\n const normalizedConnectionId = connectionId?.trim();\n const requestedConnections = await listWorkspaceConnections({\n provider,\n includeDisabled: includeDisabled || Boolean(normalizedConnectionId),\n });\n const candidateConnections = normalizedConnectionId\n ? requestedConnections.filter(\n (connection) => connection.id === normalizedConnectionId,\n )\n : requestedConnections;\n const grants = await listWorkspaceConnectionGrants({\n provider,\n appId: normalizedAppId,\n connectionId: normalizedConnectionId,\n });\n\n if (normalizedConnectionId && candidateConnections.length === 0) {\n return {\n available: false,\n connection: null,\n appAccess: null,\n reason: `Workspace connection \"${normalizedConnectionId}\" was not found in the current request scope.`,\n };\n }\n\n for (const connection of candidateConnections) {\n const connectionWithAccess = connectionForApp(\n connection,\n normalizedAppId,\n grants,\n );\n\n if (!connectionWithAccess.appAccess.available) {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: connectionWithAccess.appAccess.reason,\n };\n }\n continue;\n }\n\n if (!includeDisabled && connection.status === \"disabled\") {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: `Workspace connection \"${connection.id}\" is disabled.`,\n };\n }\n continue;\n }\n\n if (requireConnected && connection.status !== \"connected\") {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: `Workspace connection \"${connection.id}\" is ${connection.status}; a connected workspace connection is required.`,\n };\n }\n continue;\n }\n\n return {\n available: true,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: connectionWithAccess.appAccess.reason,\n };\n }\n\n return {\n available: false,\n connection: null,\n appAccess: null,\n reason: provider\n ? `No available ${provider} workspace connection was found for ${normalizedAppId}.`\n : `No available workspace connection was found for ${normalizedAppId}.`,\n };\n}\n\nasync function getGrantedConnectionIdsForApp(\n client: DbExec,\n scope: ReturnType<typeof requireWorkspaceConnectionScope>,\n appId: string,\n): Promise<Set<string>> {\n const table = workspaceConnectionGrantsTable();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT connection_id FROM ${table} WHERE app_id = ? AND ${where.sql}`,\n args: [appId, ...where.args],\n });\n return new Set(\n rows\n .map((row) =>\n String((row as Record<string, unknown>).connection_id ?? \"\"),\n )\n .filter(Boolean),\n );\n}\n\nexport async function listWorkspaceConnections(\n options: ListWorkspaceConnectionsOptions = {},\n): Promise<SerializedWorkspaceConnection[]> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const clauses = [where.sql];\n const args: unknown[] = [...where.args];\n const appId = options.appId?.trim();\n\n if (options.provider) {\n clauses.push(\"provider = ?\");\n args.push(options.provider);\n }\n if (!options.includeDisabled) {\n clauses.push(\"status != ?\");\n args.push(\"disabled\");\n }\n\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE ${clauses.join(\n \" AND \",\n )} ORDER BY updated_at DESC`,\n args,\n });\n\n const connections = rows.map((row) =>\n parseRow(row as Record<string, unknown>),\n );\n if (!appId) return connections;\n\n const grantedConnectionIds = await getGrantedConnectionIdsForApp(\n client,\n scope,\n appId,\n );\n return connections.filter(\n (connection) =>\n connection.allowedApps.length === 0 ||\n connection.allowedApps.includes(appId) ||\n grantedConnectionIds.has(connection.id),\n );\n}\n\nexport async function getWorkspaceConnection(\n id: string,\n): Promise<SerializedWorkspaceConnection | null> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE id = ? AND ${where.sql} LIMIT 1`,\n args: [id, ...where.args],\n });\n if (rows.length === 0) return null;\n return parseRow(rows[0] as Record<string, unknown>);\n}\n\nexport async function upsertWorkspaceConnection(\n input: UpsertWorkspaceConnectionInput,\n): Promise<SerializedWorkspaceConnection> {\n await ensureWorkspaceConnectionsTable();\n const provider = input.provider.trim();\n if (!provider) {\n throw new Error(\"upsertWorkspaceConnection requires a provider.\");\n }\n\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const id = input.id?.trim() || randomUUID();\n const now = Date.now();\n const label = input.label?.trim() || input.accountLabel?.trim() || provider;\n const status = normalizeStatus(input.status);\n const scopes = normalizeStringArray(input.scopes);\n const config = sanitizeConfig(input.config);\n const allowedApps = normalizeStringArray(input.allowedApps);\n const credentialRefs = normalizeCredentialRefs(input.credentialRefs);\n const lastCheckedAt = millis(input.lastCheckedAt);\n const lastError = input.lastError ?? null;\n\n const update = await client.execute({\n sql: `UPDATE ${table}\n SET provider = ?, label = ?, account_id = ?, account_label = ?,\n status = ?, scopes_json = ?, config_json = ?, allowed_apps_json = ?,\n credential_refs_json = ?, updated_at = ?, last_checked_at = ?,\n last_error = ?\n WHERE id = ? AND ${where.sql}`,\n args: [\n provider,\n label,\n input.accountId ?? null,\n input.accountLabel ?? null,\n status,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(allowedApps),\n JSON.stringify(credentialRefs),\n now,\n lastCheckedAt,\n lastError,\n id,\n ...where.args,\n ],\n });\n\n if (update.rowsAffected === 0) {\n try {\n await client.execute({\n sql: `INSERT INTO ${table}\n (id, provider, label, account_id, account_label, status,\n scopes_json, config_json, allowed_apps_json, credential_refs_json,\n owner_email, org_id, created_at, updated_at, last_checked_at,\n last_error)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n provider,\n label,\n input.accountId ?? null,\n input.accountLabel ?? null,\n status,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(allowedApps),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n scope.orgId,\n now,\n now,\n lastCheckedAt,\n lastError,\n ],\n });\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw new Error(\n `Workspace connection \"${id}\" already exists outside the current request scope.`,\n );\n }\n throw err;\n }\n }\n\n const connection = await getWorkspaceConnection(id);\n if (!connection) {\n throw new Error(`Workspace connection \"${id}\" was not found after upsert.`);\n }\n return connection;\n}\n\nexport async function listWorkspaceConnectionGrants(\n options: ListWorkspaceConnectionGrantsOptions = {},\n): Promise<SerializedWorkspaceConnectionGrant[]> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const clauses = [where.sql];\n const args: unknown[] = [...where.args];\n const connectionId = options.connectionId?.trim();\n const appId = options.appId?.trim();\n const provider = options.provider?.trim();\n\n if (connectionId) {\n clauses.push(\"connection_id = ?\");\n args.push(connectionId);\n }\n if (appId) {\n clauses.push(\"app_id = ?\");\n args.push(appId);\n }\n if (provider) {\n clauses.push(\"provider = ?\");\n args.push(provider);\n }\n\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE ${clauses.join(\n \" AND \",\n )} ORDER BY updated_at DESC`,\n args,\n });\n\n return rows.map((row) => parseGrantRow(row as Record<string, unknown>));\n}\n\nexport async function getWorkspaceConnectionGrant(\n connectionId: string,\n appId: string,\n): Promise<SerializedWorkspaceConnectionGrant | null> {\n await ensureWorkspaceConnectionsTable();\n const normalizedConnectionId = normalizeRequiredString(\n connectionId,\n \"getWorkspaceConnectionGrant connectionId\",\n );\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"getWorkspaceConnectionGrant appId\",\n );\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE connection_id = ? AND app_id = ? AND ${where.sql} LIMIT 1`,\n args: [normalizedConnectionId, normalizedAppId, ...where.args],\n });\n if (rows.length === 0) return null;\n return parseGrantRow(rows[0] as Record<string, unknown>);\n}\n\nexport async function markWorkspaceConnectionUsed({\n connectionId,\n appId,\n usedAt,\n}: MarkWorkspaceConnectionUsedOptions): Promise<MarkWorkspaceConnectionUsedResult> {\n await ensureWorkspaceConnectionsTable();\n const normalizedConnectionId = normalizeRequiredString(\n connectionId,\n \"markWorkspaceConnectionUsed connectionId\",\n );\n const normalizedAppId = appId?.trim();\n const usedAtMillis = millis(usedAt) ?? Date.now();\n const client = getDbExec();\n const connectionsTable = workspaceConnectionsTable();\n const grantsTable = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n\n const connectionUpdate = await client.execute({\n sql: `UPDATE ${connectionsTable} SET last_used_at = ? WHERE id = ? AND ${where.sql}`,\n args: [usedAtMillis, normalizedConnectionId, ...where.args],\n });\n\n let grantUpdated = false;\n if (normalizedAppId) {\n const grantUpdate = await client.execute({\n sql: `UPDATE ${grantsTable} SET last_used_at = ? WHERE connection_id = ? AND app_id = ? AND ${where.sql}`,\n args: [\n usedAtMillis,\n normalizedConnectionId,\n normalizedAppId,\n ...where.args,\n ],\n });\n grantUpdated = grantUpdate.rowsAffected > 0;\n }\n\n return {\n connectionUpdated: connectionUpdate.rowsAffected > 0,\n grantUpdated,\n lastUsedAt: new Date(usedAtMillis).toISOString(),\n };\n}\n\nexport async function upsertWorkspaceConnectionGrant(\n input: UpsertWorkspaceConnectionGrantInput,\n): Promise<SerializedWorkspaceConnectionGrant> {\n await ensureWorkspaceConnectionsTable();\n const connectionId = normalizeRequiredString(\n input.connectionId,\n \"upsertWorkspaceConnectionGrant connectionId\",\n );\n const appId = normalizeRequiredString(\n input.appId,\n \"upsertWorkspaceConnectionGrant appId\",\n );\n\n const connection = await getWorkspaceConnection(connectionId);\n if (!connection) {\n throw new Error(\n `Workspace connection \"${connectionId}\" was not found in the current request scope.`,\n );\n }\n\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const id = input.id?.trim() || randomUUID();\n const now = Date.now();\n const provider = input.provider?.trim() || connection.provider;\n const scopes = normalizeStringArray(input.scopes);\n const config = sanitizeConfig(input.config);\n const credentialRefs = normalizeCredentialRefs(input.credentialRefs);\n\n const update = await client.execute({\n sql: `UPDATE ${table}\n SET provider = ?, scopes_json = ?, config_json = ?,\n credential_refs_json = ?, granted_by_email = ?, updated_at = ?\n WHERE connection_id = ? AND app_id = ? AND ${where.sql}`,\n args: [\n provider,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n now,\n connectionId,\n appId,\n ...where.args,\n ],\n });\n\n if (update.rowsAffected === 0) {\n try {\n await client.execute({\n sql: `INSERT INTO ${table}\n (id, connection_id, provider, app_id, scopes_json, config_json,\n credential_refs_json, granted_by_email, owner_email, org_id,\n created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n connectionId,\n provider,\n appId,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n scope.ownerEmail,\n scope.orgId,\n now,\n now,\n ],\n });\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw new Error(\n `Workspace connection grant for \"${connectionId}\" and \"${appId}\" already exists outside the current request scope.`,\n );\n }\n throw err;\n }\n }\n\n const grant = await getWorkspaceConnectionGrant(connectionId, appId);\n if (!grant) {\n throw new Error(\n `Workspace connection grant for \"${connectionId}\" and \"${appId}\" was not found after upsert.`,\n );\n }\n return grant;\n}\n\nexport async function revokeWorkspaceConnectionGrant(\n connectionId: string,\n appId: string,\n): Promise<boolean> {\n await ensureWorkspaceConnectionsTable();\n const normalizedConnectionId = normalizeRequiredString(\n connectionId,\n \"revokeWorkspaceConnectionGrant connectionId\",\n );\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"revokeWorkspaceConnectionGrant appId\",\n );\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const result = await client.execute({\n sql: `DELETE FROM ${table} WHERE connection_id = ? AND app_id = ? AND ${where.sql}`,\n args: [normalizedConnectionId, normalizedAppId, ...where.args],\n });\n return result.rowsAffected > 0;\n}\n\nexport async function deleteWorkspaceConnection(id: string): Promise<boolean> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const grantsTable = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const result = await client.execute({\n sql: `DELETE FROM ${table} WHERE id = ? AND ${where.sql}`,\n args: [id, ...where.args],\n });\n if (result.rowsAffected > 0) {\n await client.execute({\n sql: `DELETE FROM ${grantsTable} WHERE connection_id = ? AND ${where.sql}`,\n args: [id, ...where.args],\n });\n }\n return result.rowsAffected > 0;\n}\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/workspace-connections/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\n\nimport {\n listWorkspaceConnectionProviders,\n type WorkspaceConnectionCapability,\n type WorkspaceConnectionProvider,\n type WorkspaceConnectionTemplateUse,\n} from \"../connections/catalog.js\";\nimport {\n getDbExec,\n intType,\n isPostgres,\n isUniqueViolation,\n retryOnDdlRace,\n safeJsonParse,\n type DbExec,\n} from \"../db/client.js\";\nimport {\n ensureColumnExists,\n ensureIndexExists,\n ensureTableExists,\n} from \"../db/ddl-guard.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\nimport { notifyWorkspaceConnectionLifecycle } from \"./lifecycle.js\";\n\nexport type WorkspaceConnectionStatus =\n | \"connected\"\n | \"checking\"\n | \"needs_reauth\"\n | \"error\"\n | \"disabled\";\n\nexport interface WorkspaceConnectionCredentialRef {\n key: string;\n scope?: \"user\" | \"org\" | \"workspace\";\n provider?: string;\n label?: string;\n [key: string]: unknown;\n}\n\nexport interface WorkspaceConnection {\n id: string;\n provider: string;\n label: string;\n accountId: string | null;\n accountLabel: string | null;\n status: WorkspaceConnectionStatus;\n scopes: string[];\n config: Record<string, unknown>;\n allowedApps: string[];\n credentialRefs: WorkspaceConnectionCredentialRef[];\n ownerEmail: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n lastUsedAt?: string | null;\n lastCheckedAt: string | null;\n lastError: string | null;\n}\n\nexport type SerializedWorkspaceConnection = WorkspaceConnection;\n\nexport interface WorkspaceConnectionGrant {\n id: string;\n connectionId: string;\n provider: string;\n appId: string;\n scopes: string[];\n config: Record<string, unknown>;\n credentialRefs: WorkspaceConnectionCredentialRef[];\n grantedByEmail: string;\n ownerEmail: string;\n orgId: string | null;\n createdAt: string;\n updatedAt: string;\n lastUsedAt?: string | null;\n}\n\nexport type SerializedWorkspaceConnectionGrant = WorkspaceConnectionGrant;\n\nexport interface ListWorkspaceConnectionsOptions {\n provider?: string;\n appId?: string;\n includeDisabled?: boolean;\n}\n\nexport interface ListWorkspaceConnectionGrantsOptions {\n connectionId?: string;\n appId?: string;\n provider?: string;\n}\n\nexport interface ListWorkspaceConnectionsForAppOptions {\n appId: string;\n provider?: string;\n includeDisabled?: boolean;\n}\n\nexport interface ResolveWorkspaceConnectionForAppOptions extends ListWorkspaceConnectionsForAppOptions {\n connectionId?: string;\n requireConnected?: boolean;\n}\n\nexport interface UpsertWorkspaceConnectionInput {\n id?: string;\n provider: string;\n label?: string;\n accountId?: string | null;\n accountLabel?: string | null;\n status?: WorkspaceConnectionStatus;\n scopes?: string[];\n config?: Record<string, unknown>;\n allowedApps?: string[];\n credentialRefs?: WorkspaceConnectionCredentialRef[];\n lastCheckedAt?: Date | number | string | null;\n lastError?: string | null;\n}\n\nexport interface UpsertWorkspaceConnectionGrantInput {\n id?: string;\n connectionId: string;\n appId: string;\n provider?: string;\n scopes?: string[];\n config?: Record<string, unknown>;\n credentialRefs?: WorkspaceConnectionCredentialRef[];\n}\n\nexport type WorkspaceConnectionAppAccessMode =\n | \"all-apps\"\n | \"allowed-app\"\n | \"explicit-grant\"\n | \"unavailable\";\n\nexport interface WorkspaceConnectionAppAccess {\n appId: string;\n available: boolean;\n mode: WorkspaceConnectionAppAccessMode;\n reason: string;\n grantId: string | null;\n}\n\nexport type WorkspaceConnectionGrantState =\n | \"connected\"\n | \"granted\"\n | \"needs_grant\"\n | \"not_connected\";\n\nexport type WorkspaceConnectionGrantAvailability =\n | \"available\"\n | \"needs_grant\"\n | \"not_connected\";\n\nexport type WorkspaceConnectionProviderReadinessStatus =\n | \"ready\"\n | \"checking\"\n | \"needs_credentials\"\n | \"needs_attention\"\n | \"disabled\"\n | \"not_configured\";\n\nexport interface WorkspaceConnectionPublicCredentialRef {\n key: string;\n scope?: string;\n provider?: string;\n label?: string;\n source: \"connection\" | \"grant\";\n}\n\nexport interface WorkspaceConnectionExplicitGrantSummary {\n id: string;\n appId: string;\n scopes: string[];\n credentialRefs: WorkspaceConnectionPublicCredentialRef[];\n updatedAt: string;\n lastUsedAt: string | null;\n}\n\nexport interface WorkspaceConnectionForAppSummary {\n id: string;\n label: string;\n provider: string;\n accountId: string | null;\n accountLabel: string | null;\n status: WorkspaceConnectionStatus;\n grantedToApp: boolean;\n grantScope: \"all-apps\" | \"selected-apps\";\n appAccess: WorkspaceConnectionAppAccess;\n allowedApps: string[];\n credentialRefs: WorkspaceConnectionPublicCredentialRef[];\n lastUsedAt: string | null;\n lastCheckedAt: string | null;\n lastError: string | null;\n explicitGrant: WorkspaceConnectionExplicitGrantSummary | null;\n}\n\nexport interface WorkspaceConnectionForApp extends SerializedWorkspaceConnection {\n appAccess: WorkspaceConnectionAppAccess;\n explicitGrant: SerializedWorkspaceConnectionGrant | null;\n}\n\nexport interface ResolvedWorkspaceConnectionForApp {\n available: boolean;\n connection: WorkspaceConnectionForApp | null;\n appAccess: WorkspaceConnectionAppAccess | null;\n reason: string;\n}\n\nexport interface WorkspaceConnectionProviderAppSummary {\n appId: string;\n provider: string;\n grantState: WorkspaceConnectionGrantState;\n grantAvailability: WorkspaceConnectionGrantAvailability;\n grantAvailabilityMessage: string;\n connectionCount: number;\n grantedConnectionCount: number;\n activeConnectionCount: number;\n ungrantedConnectionCount: number;\n unhealthyGrantedConnectionCount: number;\n explicitGrantCount: number;\n credentialRefCount: number;\n hasWorkspaceConnection: boolean;\n hasGrantedWorkspaceConnection: boolean;\n hasActiveWorkspaceConnection: boolean;\n lastUsedAt: string | null;\n statuses: WorkspaceConnectionStatus[];\n connections: WorkspaceConnectionForAppSummary[];\n}\n\nexport interface WorkspaceConnectionProviderReadiness {\n status: WorkspaceConnectionProviderReadinessStatus;\n connectionCount: number;\n activeConnectionCount: number;\n readyConnectionCount: number;\n requiredCredentialKeys: string[];\n missingRequiredCredentialKeys: string[];\n appGrant: WorkspaceConnectionProviderAppSummary | null;\n}\n\nexport interface WorkspaceConnectionProviderLike {\n id: string;\n label?: string;\n credentialKeys?: readonly {\n key: string;\n required?: boolean;\n }[];\n}\n\nexport interface SummarizeWorkspaceConnectionProviderForAppOptions {\n providerId: string;\n appId: string;\n connections: SerializedWorkspaceConnection[];\n grants?: SerializedWorkspaceConnectionGrant[];\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface SummarizeWorkspaceConnectionProviderReadinessOptions {\n provider: WorkspaceConnectionProviderLike;\n connections: SerializedWorkspaceConnection[];\n grants?: SerializedWorkspaceConnectionGrant[];\n appId?: string;\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface ListWorkspaceConnectionProviderCatalogForAppOptions {\n appId: string;\n provider?: string;\n capability?: WorkspaceConnectionCapability;\n templateUse?: WorkspaceConnectionTemplateUse;\n includeDisabled?: boolean;\n includeConnections?: \"all\" | \"granted\";\n}\n\nexport interface MarkWorkspaceConnectionUsedOptions {\n connectionId: string;\n appId?: string | null;\n usedAt?: Date | number | string | null;\n}\n\nexport interface MarkWorkspaceConnectionUsedResult {\n connectionUpdated: boolean;\n grantUpdated: boolean;\n lastUsedAt: string;\n}\n\nexport interface WorkspaceConnectionProviderCatalogForAppItem extends WorkspaceConnectionProvider {\n workspaceConnection: WorkspaceConnectionProviderAppSummary;\n readiness: WorkspaceConnectionProviderReadiness;\n}\n\nexport interface WorkspaceConnectionProviderCatalogForApp {\n appId: string;\n providers: WorkspaceConnectionProviderCatalogForAppItem[];\n connections: SerializedWorkspaceConnection[];\n grants: SerializedWorkspaceConnectionGrant[];\n counts: {\n providers: number;\n connections: number;\n grants: number;\n readyProviders: number;\n };\n}\n\nlet _initPromise: Promise<void> | undefined;\n\nfunction workspaceConnectionsTable(): string {\n return isPostgres()\n ? \"public.workspace_connections\"\n : \"workspace_connections\";\n}\n\nfunction workspaceConnectionGrantsTable(): string {\n return isPostgres()\n ? \"public.workspace_connection_grants\"\n : \"workspace_connection_grants\";\n}\n\nfunction isDuplicateColumnError(err: unknown): boolean {\n const code = String((err as { code?: unknown })?.code ?? \"\");\n const message = String((err as { message?: unknown })?.message ?? err)\n .toLowerCase()\n .trim();\n return (\n code === \"42701\" ||\n message.includes(\"duplicate column\") ||\n message.includes(\"already exists\")\n );\n}\n\nasync function ensureColumn(\n client: DbExec,\n table: string,\n name: string,\n definition: string,\n): Promise<void> {\n try {\n await retryOnDdlRace(() =>\n client.execute(\n isPostgres()\n ? `ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS ${name} ${definition}`\n : `ALTER TABLE ${table} ADD COLUMN ${name} ${definition}`,\n ),\n );\n } catch (err) {\n if (!isDuplicateColumnError(err)) throw err;\n }\n}\n\nasync function ensureWorkspaceConnectionColumns(\n client: DbExec,\n table: string,\n): Promise<void> {\n await ensureColumn(client, table, \"provider\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"label\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"account_id\", \"TEXT\");\n await ensureColumn(client, table, \"account_label\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"status\",\n \"TEXT NOT NULL DEFAULT 'connected'\",\n );\n await ensureColumn(\n client,\n table,\n \"scopes_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"config_json\",\n \"TEXT NOT NULL DEFAULT '{}'\",\n );\n await ensureColumn(\n client,\n table,\n \"allowed_apps_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"credential_refs_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(client, table, \"owner_email\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"org_id\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"created_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(\n client,\n table,\n \"updated_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(client, table, \"last_checked_at\", intType());\n await ensureColumn(client, table, \"last_used_at\", intType());\n await ensureColumn(client, table, \"last_error\", \"TEXT\");\n}\n\nasync function ensureWorkspaceConnectionGrantColumns(\n client: DbExec,\n table: string,\n): Promise<void> {\n await ensureColumn(\n client,\n table,\n \"connection_id\",\n \"TEXT NOT NULL DEFAULT ''\",\n );\n await ensureColumn(client, table, \"provider\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"app_id\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(\n client,\n table,\n \"scopes_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"config_json\",\n \"TEXT NOT NULL DEFAULT '{}'\",\n );\n await ensureColumn(\n client,\n table,\n \"credential_refs_json\",\n \"TEXT NOT NULL DEFAULT '[]'\",\n );\n await ensureColumn(\n client,\n table,\n \"granted_by_email\",\n \"TEXT NOT NULL DEFAULT ''\",\n );\n await ensureColumn(client, table, \"owner_email\", \"TEXT NOT NULL DEFAULT ''\");\n await ensureColumn(client, table, \"org_id\", \"TEXT\");\n await ensureColumn(\n client,\n table,\n \"created_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(\n client,\n table,\n \"updated_at\",\n `${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumn(client, table, \"last_used_at\", intType());\n}\n\nexport async function ensureWorkspaceConnectionsTable(): Promise<void> {\n if (!_initPromise) {\n _initPromise = (async () => {\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const grantsTable = workspaceConnectionGrantsTable();\n\n const createConnectionsSql = `\n CREATE TABLE IF NOT EXISTS ${table} (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL DEFAULT '',\n label TEXT NOT NULL DEFAULT '',\n account_id TEXT,\n account_label TEXT,\n status TEXT NOT NULL DEFAULT 'connected',\n scopes_json TEXT NOT NULL DEFAULT '[]',\n config_json TEXT NOT NULL DEFAULT '{}',\n allowed_apps_json TEXT NOT NULL DEFAULT '[]',\n credential_refs_json TEXT NOT NULL DEFAULT '[]',\n owner_email TEXT NOT NULL DEFAULT '',\n org_id TEXT,\n created_at ${intType()} NOT NULL DEFAULT 0,\n updated_at ${intType()} NOT NULL DEFAULT 0,\n last_used_at ${intType()},\n last_checked_at ${intType()},\n last_error TEXT\n )\n `;\n const createGrantsSql = `\n CREATE TABLE IF NOT EXISTS ${grantsTable} (\n id TEXT PRIMARY KEY,\n connection_id TEXT NOT NULL DEFAULT '',\n provider TEXT NOT NULL DEFAULT '',\n app_id TEXT NOT NULL DEFAULT '',\n scopes_json TEXT NOT NULL DEFAULT '[]',\n config_json TEXT NOT NULL DEFAULT '{}',\n credential_refs_json TEXT NOT NULL DEFAULT '[]',\n granted_by_email TEXT NOT NULL DEFAULT '',\n owner_email TEXT NOT NULL DEFAULT '',\n org_id TEXT,\n created_at ${intType()} NOT NULL DEFAULT 0,\n updated_at ${intType()} NOT NULL DEFAULT 0,\n last_used_at ${intType()}\n )\n `;\n\n if (isPostgres()) {\n // PG-guard: probe information_schema / pg_indexes first (no lock) and\n // only issue DDL when the table/column/index is actually missing,\n // wrapped in a transaction-scoped lock_timeout so a contended lock\n // fails fast. Uses unqualified table names for the probe (the helpers\n // always search the `public` schema).\n\n // --- workspace_connections ---\n await ensureTableExists(\"workspace_connections\", createConnectionsSql);\n await ensureColumnExists(\n \"workspace_connections\",\n \"provider\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS provider TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"label\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS label TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"account_id\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS account_id TEXT`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"account_label\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS account_label TEXT`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"status\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS status TEXT NOT NULL DEFAULT 'connected'`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"scopes_json\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS scopes_json TEXT NOT NULL DEFAULT '[]'`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"config_json\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS config_json TEXT NOT NULL DEFAULT '{}'`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"allowed_apps_json\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS allowed_apps_json TEXT NOT NULL DEFAULT '[]'`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"credential_refs_json\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS credential_refs_json TEXT NOT NULL DEFAULT '[]'`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"owner_email\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS owner_email TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"org_id\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS org_id TEXT`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"created_at\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS created_at ${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"updated_at\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS updated_at ${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"last_checked_at\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS last_checked_at ${intType()}`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"last_used_at\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS last_used_at ${intType()}`,\n );\n await ensureColumnExists(\n \"workspace_connections\",\n \"last_error\",\n `ALTER TABLE workspace_connections ADD COLUMN IF NOT EXISTS last_error TEXT`,\n );\n await ensureIndexExists(\n \"idx_workspace_connections_scope_provider\",\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_scope_provider ON ${table} (org_id, owner_email, provider)`,\n );\n await ensureIndexExists(\n \"idx_workspace_connections_updated_at\",\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_updated_at ON ${table} (updated_at)`,\n );\n\n // --- workspace_connection_grants ---\n await ensureTableExists(\"workspace_connection_grants\", createGrantsSql);\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"connection_id\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS connection_id TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"provider\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS provider TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"app_id\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS app_id TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"scopes_json\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS scopes_json TEXT NOT NULL DEFAULT '[]'`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"config_json\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS config_json TEXT NOT NULL DEFAULT '{}'`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"credential_refs_json\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS credential_refs_json TEXT NOT NULL DEFAULT '[]'`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"granted_by_email\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS granted_by_email TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"owner_email\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS owner_email TEXT NOT NULL DEFAULT ''`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"org_id\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS org_id TEXT`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"created_at\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS created_at ${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"updated_at\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS updated_at ${intType()} NOT NULL DEFAULT 0`,\n );\n await ensureColumnExists(\n \"workspace_connection_grants\",\n \"last_used_at\",\n `ALTER TABLE workspace_connection_grants ADD COLUMN IF NOT EXISTS last_used_at ${intType()}`,\n );\n await ensureIndexExists(\n \"idx_workspace_connection_grants_connection_app\",\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_connection_grants_connection_app ON ${grantsTable} (connection_id, app_id)`,\n );\n await ensureIndexExists(\n \"idx_workspace_connection_grants_scope_app\",\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_scope_app ON ${grantsTable} (org_id, owner_email, app_id)`,\n );\n await ensureIndexExists(\n \"idx_workspace_connection_grants_updated_at\",\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_updated_at ON ${grantsTable} (updated_at)`,\n );\n return;\n }\n\n // SQLite (local dev): no ACCESS EXCLUSIVE lock problem — keep existing\n // retryOnDdlRace + ensureColumn behaviour.\n await retryOnDdlRace(() => client.execute(createConnectionsSql));\n await ensureWorkspaceConnectionColumns(client, table);\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_scope_provider ON ${table} (org_id, owner_email, provider)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connections_updated_at ON ${table} (updated_at)`,\n ),\n );\n await retryOnDdlRace(() => client.execute(createGrantsSql));\n await ensureWorkspaceConnectionGrantColumns(client, grantsTable);\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE UNIQUE INDEX IF NOT EXISTS idx_workspace_connection_grants_connection_app ON ${grantsTable} (connection_id, app_id)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_scope_app ON ${grantsTable} (org_id, owner_email, app_id)`,\n ),\n );\n await retryOnDdlRace(() =>\n client.execute(\n `CREATE INDEX IF NOT EXISTS idx_workspace_connection_grants_updated_at ON ${grantsTable} (updated_at)`,\n ),\n );\n })().catch((err) => {\n _initPromise = undefined;\n throw err;\n });\n }\n return _initPromise;\n}\n\nfunction requireWorkspaceConnectionScope(): {\n ownerEmail: string;\n orgId: string | null;\n} {\n const ownerEmail = getRequestUserEmail()?.trim().toLowerCase();\n if (!ownerEmail) {\n throw new Error(\"Workspace connections require an authenticated user.\");\n }\n return {\n ownerEmail,\n orgId: getRequestOrgId()?.trim() || null,\n };\n}\n\nfunction scopedWhere(\n scope: ReturnType<typeof requireWorkspaceConnectionScope>,\n): { sql: string; args: string[] } {\n if (scope.orgId) {\n return { sql: \"org_id = ?\", args: [scope.orgId] };\n }\n return {\n sql: \"owner_email = ? AND org_id IS NULL\",\n args: [scope.ownerEmail],\n };\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter((entry): entry is string => typeof entry === \"string\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\nfunction normalizeRequiredString(value: unknown, label: string): string {\n const normalized = typeof value === \"string\" ? value.trim() : \"\";\n if (!normalized) {\n throw new Error(`${label} is required.`);\n }\n return normalized;\n}\n\nfunction normalizeObject(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n return value as Record<string, unknown>;\n}\n\nfunction normalizeCredentialRefs(\n value: unknown,\n): WorkspaceConnectionCredentialRef[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter(\n (entry): entry is WorkspaceConnectionCredentialRef =>\n !!entry &&\n typeof entry === \"object\" &&\n !Array.isArray(entry) &&\n typeof (entry as WorkspaceConnectionCredentialRef).key === \"string\",\n )\n .map((entry) => sanitizeCredentialRef(entry))\n .filter((entry) => entry.key.trim().length > 0);\n}\n\nfunction normalizeStatus(value: unknown): WorkspaceConnectionStatus {\n if (\n value === \"checking\" ||\n value === \"needs_reauth\" ||\n value === \"error\" ||\n value === \"disabled\"\n ) {\n return value;\n }\n return \"connected\";\n}\n\nfunction millis(\n value: Date | number | string | null | undefined,\n): number | null {\n if (value == null) return null;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n const parsed = Date.parse(String(value));\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction iso(value: unknown): string | null {\n if (value == null) return null;\n const num = Number(value);\n if (!Number.isFinite(num) || num <= 0) return null;\n return new Date(num).toISOString();\n}\n\nconst SECRET_KEYS = new Set([\n \"apikey\",\n \"authorization\",\n \"clientsecret\",\n \"cookie\",\n \"password\",\n \"privatekey\",\n \"refreshtoken\",\n \"secret\",\n \"token\",\n \"accesstoken\",\n]);\n\nfunction normalizedKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\nfunction sanitizeJson(value: unknown, allowCredentialRefKey = false): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => sanitizeJson(entry, allowCredentialRefKey));\n }\n if (!value || typeof value !== \"object\") return value;\n\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n const normalized = normalizedKey(key);\n if (\n SECRET_KEYS.has(normalized) &&\n !(allowCredentialRefKey && normalized === \"key\")\n ) {\n result[key] = \"[redacted]\";\n continue;\n }\n result[key] = sanitizeJson(entry, allowCredentialRefKey);\n }\n return result;\n}\n\nfunction sanitizeConfig(\n config: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n return sanitizeJson(normalizeObject(config), false) as Record<\n string,\n unknown\n >;\n}\n\nfunction sanitizeCredentialRef(\n ref: WorkspaceConnectionCredentialRef,\n): WorkspaceConnectionCredentialRef {\n const sanitized = sanitizeJson(ref, true) as WorkspaceConnectionCredentialRef;\n if (Object.prototype.hasOwnProperty.call(sanitized, \"value\")) {\n sanitized.value = \"[redacted]\";\n }\n return sanitized;\n}\n\nfunction parseRow(row: Record<string, unknown>): WorkspaceConnection {\n return serializeWorkspaceConnection({\n id: String(row.id),\n provider: String(row.provider ?? \"\"),\n label: String(row.label ?? \"\"),\n accountId: row.account_id == null ? null : String(row.account_id),\n accountLabel: row.account_label == null ? null : String(row.account_label),\n status: normalizeStatus(row.status),\n scopes: normalizeStringArray(safeJsonParse<unknown>(row.scopes_json, [])),\n config: normalizeObject(safeJsonParse<unknown>(row.config_json, {})),\n allowedApps: normalizeStringArray(\n safeJsonParse<unknown>(row.allowed_apps_json, []),\n ),\n credentialRefs: normalizeCredentialRefs(\n safeJsonParse<unknown>(row.credential_refs_json, []),\n ),\n ownerEmail: String(row.owner_email ?? \"\"),\n orgId: row.org_id == null ? null : String(row.org_id),\n createdAt: iso(row.created_at) ?? new Date(0).toISOString(),\n updatedAt: iso(row.updated_at) ?? new Date(0).toISOString(),\n lastUsedAt: iso(row.last_used_at),\n lastCheckedAt: iso(row.last_checked_at),\n lastError: row.last_error == null ? null : String(row.last_error),\n });\n}\n\nfunction parseGrantRow(row: Record<string, unknown>): WorkspaceConnectionGrant {\n return serializeWorkspaceConnectionGrant({\n id: String(row.id),\n connectionId: String(row.connection_id ?? \"\"),\n provider: String(row.provider ?? \"\"),\n appId: String(row.app_id ?? \"\"),\n scopes: normalizeStringArray(safeJsonParse<unknown>(row.scopes_json, [])),\n config: normalizeObject(safeJsonParse<unknown>(row.config_json, {})),\n credentialRefs: normalizeCredentialRefs(\n safeJsonParse<unknown>(row.credential_refs_json, []),\n ),\n grantedByEmail: String(row.granted_by_email ?? \"\"),\n ownerEmail: String(row.owner_email ?? \"\"),\n orgId: row.org_id == null ? null : String(row.org_id),\n createdAt: iso(row.created_at) ?? new Date(0).toISOString(),\n updatedAt: iso(row.updated_at) ?? new Date(0).toISOString(),\n lastUsedAt: iso(row.last_used_at),\n });\n}\n\nexport function serializeWorkspaceConnection(\n connection: WorkspaceConnection,\n): SerializedWorkspaceConnection {\n return {\n ...connection,\n scopes: normalizeStringArray(connection.scopes),\n config: sanitizeConfig(connection.config),\n allowedApps: normalizeStringArray(connection.allowedApps),\n credentialRefs: normalizeCredentialRefs(connection.credentialRefs),\n };\n}\n\nexport function serializeWorkspaceConnectionGrant(\n grant: WorkspaceConnectionGrant,\n): SerializedWorkspaceConnectionGrant {\n return {\n ...grant,\n scopes: normalizeStringArray(grant.scopes),\n config: sanitizeConfig(grant.config),\n credentialRefs: normalizeCredentialRefs(grant.credentialRefs),\n };\n}\n\nexport function getWorkspaceConnectionAppAccess(\n connection: Pick<\n SerializedWorkspaceConnection,\n \"id\" | \"allowedApps\" | \"label\"\n >,\n appId: string,\n grants: Pick<\n SerializedWorkspaceConnectionGrant,\n \"id\" | \"connectionId\" | \"appId\"\n >[] = [],\n): WorkspaceConnectionAppAccess {\n const normalizedAppId = appId.trim();\n if (!normalizedAppId) {\n return {\n appId: normalizedAppId,\n available: false,\n mode: \"unavailable\",\n reason: \"No app id was provided.\",\n grantId: null,\n };\n }\n\n if (connection.allowedApps.length === 0) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"all-apps\",\n reason: \"Connection is available to every app in the workspace.\",\n grantId: null,\n };\n }\n\n if (connection.allowedApps.includes(normalizedAppId)) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"allowed-app\",\n reason: `Connection is directly allowed for ${normalizedAppId}.`,\n grantId: null,\n };\n }\n\n const explicitGrant = grants.find(\n (grant) =>\n grant.connectionId === connection.id && grant.appId === normalizedAppId,\n );\n if (explicitGrant) {\n return {\n appId: normalizedAppId,\n available: true,\n mode: \"explicit-grant\",\n reason: `Connection has an explicit grant for ${normalizedAppId}.`,\n grantId: explicitGrant.id,\n };\n }\n\n return {\n appId: normalizedAppId,\n available: false,\n mode: \"unavailable\",\n reason: `Grant ${normalizedAppId} access before this connection can be reused by the app.`,\n grantId: null,\n };\n}\n\nexport function workspaceConnectionIsAvailableToApp(\n connection: Pick<\n SerializedWorkspaceConnection,\n \"id\" | \"allowedApps\" | \"label\"\n >,\n appId: string,\n grants: Pick<\n SerializedWorkspaceConnectionGrant,\n \"id\" | \"connectionId\" | \"appId\"\n >[] = [],\n): boolean {\n return getWorkspaceConnectionAppAccess(connection, appId, grants).available;\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return Array.from(\n new Set(values.map((value) => value.trim()).filter(Boolean)),\n );\n}\n\nfunction latestIso(values: Array<string | null | undefined>): string | null {\n const latest = values.reduce<number | null>((current, value) => {\n const parsed = value ? Date.parse(value) : NaN;\n if (!Number.isFinite(parsed)) return current;\n return current == null || parsed > current ? parsed : current;\n }, null);\n return latest == null ? null : new Date(latest).toISOString();\n}\n\nfunction publicCredentialRefs(\n refs: WorkspaceConnectionCredentialRef[],\n source: WorkspaceConnectionPublicCredentialRef[\"source\"],\n): WorkspaceConnectionPublicCredentialRef[] {\n return refs.map((ref) => ({\n key: ref.key,\n scope: ref.scope,\n provider: ref.provider,\n label: ref.label,\n source,\n }));\n}\n\nfunction grantsForConnection(\n connectionId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n appId?: string,\n): SerializedWorkspaceConnectionGrant[] {\n return grants.filter(\n (grant) =>\n grant.connectionId === connectionId && (!appId || grant.appId === appId),\n );\n}\n\nfunction explicitGrantForConnection(\n connectionId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n appId?: string,\n): SerializedWorkspaceConnectionGrant | undefined {\n return grantsForConnection(connectionId, grants, appId)[0];\n}\n\nfunction connectionForApp(\n connection: SerializedWorkspaceConnection,\n appId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n): WorkspaceConnectionForApp {\n const normalizedAppId = appId.trim();\n const appAccess = getWorkspaceConnectionAppAccess(\n connection,\n normalizedAppId,\n grants,\n );\n return {\n ...connection,\n appAccess,\n explicitGrant:\n explicitGrantForConnection(connection.id, grants, normalizedAppId) ??\n null,\n };\n}\n\nfunction serializeConnectionForApp(\n connection: SerializedWorkspaceConnection,\n appId: string,\n grants: SerializedWorkspaceConnectionGrant[],\n): WorkspaceConnectionForAppSummary {\n const explicitGrant = explicitGrantForConnection(\n connection.id,\n grants,\n appId,\n );\n const appAccess = getWorkspaceConnectionAppAccess(connection, appId, grants);\n return {\n id: connection.id,\n label: connection.label,\n provider: connection.provider,\n accountId: connection.accountId,\n accountLabel: connection.accountLabel,\n status: connection.status,\n grantedToApp: appAccess.available,\n grantScope:\n connection.allowedApps.length === 0 ? \"all-apps\" : \"selected-apps\",\n appAccess,\n allowedApps: connection.allowedApps,\n credentialRefs: publicCredentialRefs(\n connection.credentialRefs,\n \"connection\",\n ),\n lastUsedAt: latestIso([connection.lastUsedAt, explicitGrant?.lastUsedAt]),\n lastCheckedAt: connection.lastCheckedAt,\n lastError: connection.lastError,\n explicitGrant: explicitGrant\n ? {\n id: explicitGrant.id,\n appId: explicitGrant.appId,\n scopes: explicitGrant.scopes,\n credentialRefs: publicCredentialRefs(\n explicitGrant.credentialRefs,\n \"grant\",\n ),\n updatedAt: explicitGrant.updatedAt,\n lastUsedAt: explicitGrant.lastUsedAt ?? null,\n }\n : null,\n };\n}\n\nfunction grantAvailabilityMessage(\n grantState: WorkspaceConnectionGrantState,\n providerId: string,\n appId: string,\n): string {\n switch (grantState) {\n case \"connected\":\n return `${appId} has an active ${providerId} workspace connection.`;\n case \"granted\":\n return `${appId} has ${providerId} access, but the granted connection is not connected yet.`;\n case \"needs_grant\":\n return `A ${providerId} workspace connection exists; grant ${appId} access to reuse it.`;\n case \"not_connected\":\n default:\n return `No shared ${providerId} workspace connection is available yet.`;\n }\n}\n\nexport function summarizeWorkspaceConnectionProviderForApp({\n providerId,\n appId,\n connections,\n grants = [],\n includeConnections = \"granted\",\n}: SummarizeWorkspaceConnectionProviderForAppOptions): WorkspaceConnectionProviderAppSummary {\n const normalizedProviderId = providerId.trim();\n const normalizedAppId = appId.trim();\n const allConnections = connections.filter(\n (connection) => connection.provider === normalizedProviderId,\n );\n const grantedConnections = allConnections.filter(\n (connection) =>\n getWorkspaceConnectionAppAccess(connection, normalizedAppId, grants)\n .available,\n );\n const connectedConnections = grantedConnections.filter(\n (connection) => connection.status === \"connected\",\n );\n const ungrantedConnectionCount =\n allConnections.length - grantedConnections.length;\n const unhealthyGrantedConnectionCount =\n grantedConnections.length - connectedConnections.length;\n const grantState: WorkspaceConnectionGrantState = connectedConnections.length\n ? \"connected\"\n : grantedConnections.length\n ? \"granted\"\n : allConnections.length\n ? \"needs_grant\"\n : \"not_connected\";\n const explicitGrantCount = allConnections.reduce(\n (count, connection) =>\n explicitGrantForConnection(connection.id, grants, normalizedAppId)\n ? count + 1\n : count,\n 0,\n );\n const credentialRefCount = allConnections.reduce((count, connection) => {\n const explicitGrant = explicitGrantForConnection(\n connection.id,\n grants,\n normalizedAppId,\n );\n return (\n count +\n connection.credentialRefs.length +\n (explicitGrant?.credentialRefs.length ?? 0)\n );\n }, 0);\n const visibleConnections =\n includeConnections === \"all\" ? allConnections : grantedConnections;\n const lastUsedAt = latestIso(\n grantedConnections.flatMap((connection) => [\n connection.lastUsedAt,\n explicitGrantForConnection(connection.id, grants, normalizedAppId)\n ?.lastUsedAt,\n ]),\n );\n\n return {\n appId: normalizedAppId,\n provider: normalizedProviderId,\n grantState,\n grantAvailability:\n grantState === \"connected\" || grantState === \"granted\"\n ? \"available\"\n : grantState,\n grantAvailabilityMessage: grantAvailabilityMessage(\n grantState,\n normalizedProviderId,\n normalizedAppId,\n ),\n connectionCount: allConnections.length,\n grantedConnectionCount: grantedConnections.length,\n activeConnectionCount: connectedConnections.length,\n ungrantedConnectionCount,\n unhealthyGrantedConnectionCount,\n explicitGrantCount,\n credentialRefCount,\n hasWorkspaceConnection: allConnections.length > 0,\n hasGrantedWorkspaceConnection: grantedConnections.length > 0,\n hasActiveWorkspaceConnection: connectedConnections.length > 0,\n lastUsedAt,\n statuses: uniqueStrings(\n allConnections.map((connection) => connection.status),\n ) as WorkspaceConnectionStatus[],\n connections: visibleConnections.map((connection) =>\n serializeConnectionForApp(connection, normalizedAppId, grants),\n ),\n };\n}\n\nfunction requiredCredentialKeys(provider: WorkspaceConnectionProviderLike) {\n return uniqueStrings(\n (provider.credentialKeys ?? [])\n .filter((credential) => credential.required ?? false)\n .map((credential) => credential.key),\n );\n}\n\nfunction missingRequiredCredentialKeys(\n provider: WorkspaceConnectionProviderLike,\n connection: SerializedWorkspaceConnection,\n grants: SerializedWorkspaceConnectionGrant[] = [],\n): string[] {\n const available = new Set(\n [\n ...connection.credentialRefs,\n ...grants.flatMap((grant) => grant.credentialRefs),\n ]\n .map((ref) => ref.key.trim())\n .filter(Boolean),\n );\n return requiredCredentialKeys(provider).filter((key) => !available.has(key));\n}\n\nexport function summarizeWorkspaceConnectionProviderReadiness({\n provider,\n connections,\n grants = [],\n appId,\n includeConnections,\n}: SummarizeWorkspaceConnectionProviderReadinessOptions): WorkspaceConnectionProviderReadiness {\n const providerConnections = connections.filter(\n (connection) => connection.provider === provider.id,\n );\n const activeConnections = providerConnections.filter(\n (connection) => connection.status !== \"disabled\",\n );\n const attentionConnections = activeConnections.filter(\n (connection) =>\n connection.status === \"error\" ||\n connection.status === \"needs_reauth\" ||\n Boolean(connection.lastError),\n );\n const missingKeys = uniqueStrings(\n activeConnections.flatMap((connection) =>\n missingRequiredCredentialKeys(\n provider,\n connection,\n grantsForConnection(connection.id, grants, appId),\n ),\n ),\n );\n const readyConnections = activeConnections.filter(\n (connection) =>\n connection.status === \"connected\" &&\n missingRequiredCredentialKeys(\n provider,\n connection,\n grantsForConnection(connection.id, grants, appId),\n ).length === 0,\n );\n const checkingConnections = activeConnections.filter(\n (connection) => connection.status === \"checking\",\n );\n\n let status: WorkspaceConnectionProviderReadinessStatus = \"not_configured\";\n if (readyConnections.length > 0) {\n status = \"ready\";\n } else if (attentionConnections.length > 0) {\n status = \"needs_attention\";\n } else if (missingKeys.length > 0) {\n status = \"needs_credentials\";\n } else if (checkingConnections.length > 0) {\n status = \"checking\";\n } else if (providerConnections.length > 0) {\n status = \"disabled\";\n }\n\n return {\n status,\n connectionCount: providerConnections.length,\n activeConnectionCount: activeConnections.length,\n readyConnectionCount: readyConnections.length,\n requiredCredentialKeys: requiredCredentialKeys(provider),\n missingRequiredCredentialKeys: missingKeys,\n appGrant: appId\n ? summarizeWorkspaceConnectionProviderForApp({\n providerId: provider.id,\n appId,\n connections,\n grants,\n includeConnections,\n })\n : null,\n };\n}\n\nexport async function listWorkspaceConnectionProviderCatalogForApp({\n appId,\n provider,\n capability,\n templateUse,\n includeDisabled = true,\n includeConnections = \"all\",\n}: ListWorkspaceConnectionProviderCatalogForAppOptions): Promise<WorkspaceConnectionProviderCatalogForApp> {\n const [connections, grants] = await Promise.all([\n listWorkspaceConnections({ provider, includeDisabled }),\n listWorkspaceConnectionGrants({ provider, appId }),\n ]);\n const providers = listWorkspaceConnectionProviders({\n capability,\n templateUse,\n })\n .filter((item) => !provider || item.id === provider)\n .map((item) => {\n const workspaceConnection = summarizeWorkspaceConnectionProviderForApp({\n providerId: item.id,\n appId,\n connections,\n grants,\n includeConnections,\n });\n const readiness = summarizeWorkspaceConnectionProviderReadiness({\n provider: item,\n connections,\n grants,\n appId,\n includeConnections,\n });\n return {\n ...item,\n workspaceConnection,\n readiness,\n };\n });\n\n return {\n appId,\n providers,\n connections,\n grants,\n counts: {\n providers: providers.length,\n connections: connections.length,\n grants: grants.length,\n readyProviders: providers.filter(\n (item) => item.readiness.status === \"ready\",\n ).length,\n },\n };\n}\n\nexport async function listWorkspaceConnectionsForApp({\n appId,\n provider,\n includeDisabled = false,\n}: ListWorkspaceConnectionsForAppOptions): Promise<\n WorkspaceConnectionForApp[]\n> {\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"listWorkspaceConnectionsForApp appId\",\n );\n const [connections, grants] = await Promise.all([\n listWorkspaceConnections({ provider, includeDisabled }),\n listWorkspaceConnectionGrants({ provider, appId: normalizedAppId }),\n ]);\n\n return connections\n .map((connection) => connectionForApp(connection, normalizedAppId, grants))\n .filter((connection) => connection.appAccess.available);\n}\n\nexport async function resolveWorkspaceConnectionForApp({\n appId,\n provider,\n includeDisabled = false,\n connectionId,\n requireConnected = false,\n}: ResolveWorkspaceConnectionForAppOptions): Promise<ResolvedWorkspaceConnectionForApp> {\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"resolveWorkspaceConnectionForApp appId\",\n );\n const normalizedConnectionId = connectionId?.trim();\n const requestedConnections = await listWorkspaceConnections({\n provider,\n includeDisabled: includeDisabled || Boolean(normalizedConnectionId),\n });\n const candidateConnections = normalizedConnectionId\n ? requestedConnections.filter(\n (connection) => connection.id === normalizedConnectionId,\n )\n : requestedConnections;\n const grants = await listWorkspaceConnectionGrants({\n provider,\n appId: normalizedAppId,\n connectionId: normalizedConnectionId,\n });\n\n if (normalizedConnectionId && candidateConnections.length === 0) {\n return {\n available: false,\n connection: null,\n appAccess: null,\n reason: `Workspace connection \"${normalizedConnectionId}\" was not found in the current request scope.`,\n };\n }\n\n for (const connection of candidateConnections) {\n const connectionWithAccess = connectionForApp(\n connection,\n normalizedAppId,\n grants,\n );\n\n if (!connectionWithAccess.appAccess.available) {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: connectionWithAccess.appAccess.reason,\n };\n }\n continue;\n }\n\n if (!includeDisabled && connection.status === \"disabled\") {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: `Workspace connection \"${connection.id}\" is disabled.`,\n };\n }\n continue;\n }\n\n if (requireConnected && connection.status !== \"connected\") {\n if (normalizedConnectionId) {\n return {\n available: false,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: `Workspace connection \"${connection.id}\" is ${connection.status}; a connected workspace connection is required.`,\n };\n }\n continue;\n }\n\n return {\n available: true,\n connection: connectionWithAccess,\n appAccess: connectionWithAccess.appAccess,\n reason: connectionWithAccess.appAccess.reason,\n };\n }\n\n return {\n available: false,\n connection: null,\n appAccess: null,\n reason: provider\n ? `No available ${provider} workspace connection was found for ${normalizedAppId}.`\n : `No available workspace connection was found for ${normalizedAppId}.`,\n };\n}\n\nasync function getGrantedConnectionIdsForApp(\n client: DbExec,\n scope: ReturnType<typeof requireWorkspaceConnectionScope>,\n appId: string,\n): Promise<Set<string>> {\n const table = workspaceConnectionGrantsTable();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT connection_id FROM ${table} WHERE app_id = ? AND ${where.sql}`,\n args: [appId, ...where.args],\n });\n return new Set(\n rows\n .map((row) =>\n String((row as Record<string, unknown>).connection_id ?? \"\"),\n )\n .filter(Boolean),\n );\n}\n\nexport async function listWorkspaceConnections(\n options: ListWorkspaceConnectionsOptions = {},\n): Promise<SerializedWorkspaceConnection[]> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const clauses = [where.sql];\n const args: unknown[] = [...where.args];\n const appId = options.appId?.trim();\n\n if (options.provider) {\n clauses.push(\"provider = ?\");\n args.push(options.provider);\n }\n if (!options.includeDisabled) {\n clauses.push(\"status != ?\");\n args.push(\"disabled\");\n }\n\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE ${clauses.join(\n \" AND \",\n )} ORDER BY updated_at DESC`,\n args,\n });\n\n const connections = rows.map((row) =>\n parseRow(row as Record<string, unknown>),\n );\n if (!appId) return connections;\n\n const grantedConnectionIds = await getGrantedConnectionIdsForApp(\n client,\n scope,\n appId,\n );\n return connections.filter(\n (connection) =>\n connection.allowedApps.length === 0 ||\n connection.allowedApps.includes(appId) ||\n grantedConnectionIds.has(connection.id),\n );\n}\n\nexport async function getWorkspaceConnection(\n id: string,\n): Promise<SerializedWorkspaceConnection | null> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE id = ? AND ${where.sql} LIMIT 1`,\n args: [id, ...where.args],\n });\n if (rows.length === 0) return null;\n return parseRow(rows[0] as Record<string, unknown>);\n}\n\nexport async function upsertWorkspaceConnection(\n input: UpsertWorkspaceConnectionInput,\n): Promise<SerializedWorkspaceConnection> {\n await ensureWorkspaceConnectionsTable();\n const provider = input.provider.trim();\n if (!provider) {\n throw new Error(\"upsertWorkspaceConnection requires a provider.\");\n }\n\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const id = input.id?.trim() || randomUUID();\n const now = Date.now();\n const label = input.label?.trim() || input.accountLabel?.trim() || provider;\n const status = normalizeStatus(input.status);\n const scopes = normalizeStringArray(input.scopes);\n const config = sanitizeConfig(input.config);\n const allowedApps = normalizeStringArray(input.allowedApps);\n const credentialRefs = normalizeCredentialRefs(input.credentialRefs);\n const lastCheckedAt = millis(input.lastCheckedAt);\n const lastError = input.lastError ?? null;\n\n const update = await client.execute({\n sql: `UPDATE ${table}\n SET provider = ?, label = ?, account_id = ?, account_label = ?,\n status = ?, scopes_json = ?, config_json = ?, allowed_apps_json = ?,\n credential_refs_json = ?, updated_at = ?, last_checked_at = ?,\n last_error = ?\n WHERE id = ? AND ${where.sql}`,\n args: [\n provider,\n label,\n input.accountId ?? null,\n input.accountLabel ?? null,\n status,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(allowedApps),\n JSON.stringify(credentialRefs),\n now,\n lastCheckedAt,\n lastError,\n id,\n ...where.args,\n ],\n });\n\n if (update.rowsAffected === 0) {\n try {\n await client.execute({\n sql: `INSERT INTO ${table}\n (id, provider, label, account_id, account_label, status,\n scopes_json, config_json, allowed_apps_json, credential_refs_json,\n owner_email, org_id, created_at, updated_at, last_checked_at,\n last_error)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n provider,\n label,\n input.accountId ?? null,\n input.accountLabel ?? null,\n status,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(allowedApps),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n scope.orgId,\n now,\n now,\n lastCheckedAt,\n lastError,\n ],\n });\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw new Error(\n `Workspace connection \"${id}\" already exists outside the current request scope.`,\n );\n }\n throw err;\n }\n }\n\n const connection = await getWorkspaceConnection(id);\n if (!connection) {\n throw new Error(`Workspace connection \"${id}\" was not found after upsert.`);\n }\n return connection;\n}\n\nexport async function listWorkspaceConnectionGrants(\n options: ListWorkspaceConnectionGrantsOptions = {},\n): Promise<SerializedWorkspaceConnectionGrant[]> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const clauses = [where.sql];\n const args: unknown[] = [...where.args];\n const connectionId = options.connectionId?.trim();\n const appId = options.appId?.trim();\n const provider = options.provider?.trim();\n\n if (connectionId) {\n clauses.push(\"connection_id = ?\");\n args.push(connectionId);\n }\n if (appId) {\n clauses.push(\"app_id = ?\");\n args.push(appId);\n }\n if (provider) {\n clauses.push(\"provider = ?\");\n args.push(provider);\n }\n\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE ${clauses.join(\n \" AND \",\n )} ORDER BY updated_at DESC`,\n args,\n });\n\n return rows.map((row) => parseGrantRow(row as Record<string, unknown>));\n}\n\nexport async function getWorkspaceConnectionGrant(\n connectionId: string,\n appId: string,\n): Promise<SerializedWorkspaceConnectionGrant | null> {\n await ensureWorkspaceConnectionsTable();\n const normalizedConnectionId = normalizeRequiredString(\n connectionId,\n \"getWorkspaceConnectionGrant connectionId\",\n );\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"getWorkspaceConnectionGrant appId\",\n );\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const { rows } = await client.execute({\n sql: `SELECT * FROM ${table} WHERE connection_id = ? AND app_id = ? AND ${where.sql} LIMIT 1`,\n args: [normalizedConnectionId, normalizedAppId, ...where.args],\n });\n if (rows.length === 0) return null;\n return parseGrantRow(rows[0] as Record<string, unknown>);\n}\n\nexport async function markWorkspaceConnectionUsed({\n connectionId,\n appId,\n usedAt,\n}: MarkWorkspaceConnectionUsedOptions): Promise<MarkWorkspaceConnectionUsedResult> {\n await ensureWorkspaceConnectionsTable();\n const normalizedConnectionId = normalizeRequiredString(\n connectionId,\n \"markWorkspaceConnectionUsed connectionId\",\n );\n const normalizedAppId = appId?.trim();\n const usedAtMillis = millis(usedAt) ?? Date.now();\n const client = getDbExec();\n const connectionsTable = workspaceConnectionsTable();\n const grantsTable = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n\n const connectionUpdate = await client.execute({\n sql: `UPDATE ${connectionsTable} SET last_used_at = ? WHERE id = ? AND ${where.sql}`,\n args: [usedAtMillis, normalizedConnectionId, ...where.args],\n });\n\n let grantUpdated = false;\n if (normalizedAppId) {\n const grantUpdate = await client.execute({\n sql: `UPDATE ${grantsTable} SET last_used_at = ? WHERE connection_id = ? AND app_id = ? AND ${where.sql}`,\n args: [\n usedAtMillis,\n normalizedConnectionId,\n normalizedAppId,\n ...where.args,\n ],\n });\n grantUpdated = grantUpdate.rowsAffected > 0;\n }\n\n return {\n connectionUpdated: connectionUpdate.rowsAffected > 0,\n grantUpdated,\n lastUsedAt: new Date(usedAtMillis).toISOString(),\n };\n}\n\nexport async function upsertWorkspaceConnectionGrant(\n input: UpsertWorkspaceConnectionGrantInput,\n): Promise<SerializedWorkspaceConnectionGrant> {\n await ensureWorkspaceConnectionsTable();\n const connectionId = normalizeRequiredString(\n input.connectionId,\n \"upsertWorkspaceConnectionGrant connectionId\",\n );\n const appId = normalizeRequiredString(\n input.appId,\n \"upsertWorkspaceConnectionGrant appId\",\n );\n\n const connection = await getWorkspaceConnection(connectionId);\n if (!connection) {\n throw new Error(\n `Workspace connection \"${connectionId}\" was not found in the current request scope.`,\n );\n }\n\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const id = input.id?.trim() || randomUUID();\n const now = Date.now();\n const provider = input.provider?.trim() || connection.provider;\n const scopes = normalizeStringArray(input.scopes);\n const config = sanitizeConfig(input.config);\n const credentialRefs = normalizeCredentialRefs(input.credentialRefs);\n\n const update = await client.execute({\n sql: `UPDATE ${table}\n SET provider = ?, scopes_json = ?, config_json = ?,\n credential_refs_json = ?, granted_by_email = ?, updated_at = ?\n WHERE connection_id = ? AND app_id = ? AND ${where.sql}`,\n args: [\n provider,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n now,\n connectionId,\n appId,\n ...where.args,\n ],\n });\n\n if (update.rowsAffected === 0) {\n try {\n await client.execute({\n sql: `INSERT INTO ${table}\n (id, connection_id, provider, app_id, scopes_json, config_json,\n credential_refs_json, granted_by_email, owner_email, org_id,\n created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n id,\n connectionId,\n provider,\n appId,\n JSON.stringify(scopes),\n JSON.stringify(config),\n JSON.stringify(credentialRefs),\n scope.ownerEmail,\n scope.ownerEmail,\n scope.orgId,\n now,\n now,\n ],\n });\n } catch (err) {\n if (isUniqueViolation(err)) {\n throw new Error(\n `Workspace connection grant for \"${connectionId}\" and \"${appId}\" already exists outside the current request scope.`,\n );\n }\n throw err;\n }\n }\n\n const grant = await getWorkspaceConnectionGrant(connectionId, appId);\n if (!grant) {\n throw new Error(\n `Workspace connection grant for \"${connectionId}\" and \"${appId}\" was not found after upsert.`,\n );\n }\n return grant;\n}\n\nexport async function revokeWorkspaceConnectionGrant(\n connectionId: string,\n appId: string,\n): Promise<boolean> {\n await ensureWorkspaceConnectionsTable();\n const normalizedConnectionId = normalizeRequiredString(\n connectionId,\n \"revokeWorkspaceConnectionGrant connectionId\",\n );\n const normalizedAppId = normalizeRequiredString(\n appId,\n \"revokeWorkspaceConnectionGrant appId\",\n );\n const client = getDbExec();\n const table = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const result = await client.execute({\n sql: `DELETE FROM ${table} WHERE connection_id = ? AND app_id = ? AND ${where.sql}`,\n args: [normalizedConnectionId, normalizedAppId, ...where.args],\n });\n if (result.rowsAffected > 0) {\n await notifyWorkspaceConnectionLifecycle({\n type: \"grant-revoked\",\n connectionId: normalizedConnectionId,\n appId: normalizedAppId,\n ownerEmail: scope.ownerEmail,\n orgId: scope.orgId,\n });\n }\n return result.rowsAffected > 0;\n}\n\nexport async function deleteWorkspaceConnection(id: string): Promise<boolean> {\n await ensureWorkspaceConnectionsTable();\n const client = getDbExec();\n const table = workspaceConnectionsTable();\n const grantsTable = workspaceConnectionGrantsTable();\n const scope = requireWorkspaceConnectionScope();\n const where = scopedWhere(scope);\n const result = await client.execute({\n sql: `DELETE FROM ${table} WHERE id = ? AND ${where.sql}`,\n args: [id, ...where.args],\n });\n if (result.rowsAffected > 0) {\n await client.execute({\n sql: `DELETE FROM ${grantsTable} WHERE connection_id = ? AND ${where.sql}`,\n args: [id, ...where.args],\n });\n await notifyWorkspaceConnectionLifecycle({\n type: \"connection-deleted\",\n connectionId: id,\n ownerEmail: scope.ownerEmail,\n orgId: scope.orgId,\n });\n }\n return result.rowsAffected > 0;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.103.1",
3
+ "version": "0.104.0",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -48,6 +48,8 @@
48
48
  "./server/request-context": "./dist/server/request-context.js",
49
49
  "./server/design-token-utils": "./dist/server/design-token-utils.js",
50
50
  "./integrations": "./dist/integrations/index.js",
51
+ "./ingestion": "./dist/ingestion/index.js",
52
+ "./search-utils": "./dist/search-utils/index.js",
51
53
  "./automation": "./dist/automation/index.js",
52
54
  "./brand-kit": "./dist/brand-kit/index.js",
53
55
  "./brand-kit/fig": "./dist/brand-kit/fig/index.js",
@@ -336,7 +338,7 @@
336
338
  "y-protocols": "^1.0.7",
337
339
  "yjs": "^13.6.31",
338
340
  "zod": "^4.3.6",
339
- "@agent-native/recap-cli": "0.4.1",
341
+ "@agent-native/recap-cli": "0.4.2",
340
342
  "@agent-native/toolkit": "^0.4.10"
341
343
  },
342
344
  "devDependencies": {
@@ -511,7 +513,12 @@
511
513
  },
512
514
  "optionalDependencies": {
513
515
  "@opentelemetry/api": "^1.9.1",
514
- "playwright": "^1.61.1"
516
+ "fast-xml-parser": "^5.10.1",
517
+ "jszip": "^3.10.1",
518
+ "mammoth": "^1.12.0",
519
+ "officeparser": "^7.3.0",
520
+ "playwright": "^1.61.1",
521
+ "sharp": "^0.35.3"
515
522
  },
516
523
  "engines": {
517
524
  "node": ">=22.22.0"
@@ -11,10 +11,10 @@ const messages = {
11
11
  "Manage team members, organization access, and shared workspace preferences.",
12
12
  openTeamSettings: "Open team settings",
13
13
  openResourceSettings: "Open resource settings",
14
- agentTitle: "Agent settings",
14
+ agentTitle: "Agent workspace",
15
15
  agentDescription:
16
- "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
17
- openAgentSettings: "Open agent settings",
16
+ "Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
17
+ openAgentSettings: "Open agent workspace",
18
18
  },
19
19
  chat: {
20
20
  archiveChat: "Archive Chat",
@@ -13,6 +13,8 @@ function LegacyAgentChatSurface({
13
13
  }: {
14
14
  mode?: "panel" | "page";
15
15
  className?: string;
16
+ showHeader?: boolean;
17
+ showTabBar?: boolean;
16
18
  }) {
17
19
  return <div data-agent-page={mode} className={className} />;
18
20
  }
@@ -35,11 +37,18 @@ describe("resolveAgentPageComponent", () => {
35
37
  AgentPage as (props: { appName?: string }) => ReactElement
36
38
  )({
37
39
  appName: "Chat",
38
- }) as ReactElement<{ mode?: "panel" | "page"; className?: string }>;
40
+ }) as ReactElement<{
41
+ mode?: "panel" | "page";
42
+ className?: string;
43
+ showHeader?: boolean;
44
+ showTabBar?: boolean;
45
+ }>;
39
46
 
40
47
  expect(element.type).toBe(LegacyAgentChatSurface);
41
48
  expect(element.props.mode).toBe("page");
42
49
  expect(element.props.className).toBe("h-full");
50
+ expect(element.props.showHeader).toBe(false);
51
+ expect(element.props.showTabBar).toBe(false);
43
52
  });
44
53
 
45
54
  it("keeps the legacy fallback component identity stable", () => {
@@ -8,6 +8,8 @@ type AgentClientModule = {
8
8
  AgentChatSurface: ComponentType<{
9
9
  mode?: "panel" | "page";
10
10
  className?: string;
11
+ showHeader?: boolean;
12
+ showTabBar?: boolean;
11
13
  }>;
12
14
  AgentTabsPage?: ComponentType<AgentPageProps>;
13
15
  };
@@ -33,7 +35,14 @@ export function resolveAgentPageComponent(
33
35
  if (existing) return existing;
34
36
 
35
37
  const legacyAgentPage = function LegacyAgentPage() {
36
- return <client.AgentChatSurface mode="page" className="h-full" />;
38
+ return (
39
+ <client.AgentChatSurface
40
+ mode="page"
41
+ className="h-full"
42
+ showHeader={false}
43
+ showTabBar={false}
44
+ />
45
+ );
37
46
  };
38
47
  legacyAgentPages.set(client, legacyAgentPage);
39
48
  return legacyAgentPage;
@@ -18,10 +18,10 @@ const messages = {
18
18
  languageDescription:
19
19
  "Choose the interface language. This preference is saved for your account.",
20
20
  languageLabel: "Interface language",
21
- agentTitle: "Agent settings",
21
+ agentTitle: "Agent workspace",
22
22
  agentDescription:
23
- "Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.",
24
- openAgentSettings: "Open agent settings",
23
+ "Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
24
+ openAgentSettings: "Open agent workspace",
25
25
  workspaceTitle: "Workspace",
26
26
  workspaceDescription: "Manage team access and shared workspace resources.",
27
27
  openTeamSettings: "Open team settings",