@agent-native/core 0.85.7 → 0.86.1

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 (1132) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +133 -1
  3. package/corpus/core/README.md +0 -11
  4. package/corpus/core/docs/content/cloneable-saas.mdx +0 -1
  5. package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
  6. package/corpus/core/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
  7. package/corpus/core/docs/content/locales/ar-SA/sharing.mdx +1 -2
  8. package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
  9. package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +23 -7
  10. package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +1 -1
  11. package/corpus/core/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
  12. package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
  13. package/corpus/core/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
  14. package/corpus/core/docs/content/locales/de-DE/sharing.mdx +1 -2
  15. package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +2 -3
  16. package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +23 -7
  17. package/corpus/core/docs/content/locales/de-DE/tracking.mdx +1 -1
  18. package/corpus/core/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
  19. package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
  20. package/corpus/core/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
  21. package/corpus/core/docs/content/locales/es-ES/sharing.mdx +1 -2
  22. package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +2 -3
  23. package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +23 -7
  24. package/corpus/core/docs/content/locales/es-ES/tracking.mdx +1 -1
  25. package/corpus/core/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
  26. package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
  27. package/corpus/core/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
  28. package/corpus/core/docs/content/locales/fr-FR/sharing.mdx +1 -2
  29. package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
  30. package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +23 -7
  31. package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +1 -1
  32. package/corpus/core/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
  33. package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
  34. package/corpus/core/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
  35. package/corpus/core/docs/content/locales/hi-IN/sharing.mdx +1 -2
  36. package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
  37. package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +23 -7
  38. package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +1 -1
  39. package/corpus/core/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
  40. package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
  41. package/corpus/core/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
  42. package/corpus/core/docs/content/locales/ja-JP/sharing.mdx +1 -2
  43. package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
  44. package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +23 -7
  45. package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +1 -1
  46. package/corpus/core/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
  47. package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
  48. package/corpus/core/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
  49. package/corpus/core/docs/content/locales/ko-KR/sharing.mdx +1 -2
  50. package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
  51. package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +23 -7
  52. package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +1 -1
  53. package/corpus/core/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
  54. package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
  55. package/corpus/core/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
  56. package/corpus/core/docs/content/locales/pt-BR/sharing.mdx +1 -2
  57. package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
  58. package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +23 -7
  59. package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +1 -1
  60. package/corpus/core/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
  61. package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
  62. package/corpus/core/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
  63. package/corpus/core/docs/content/locales/zh-CN/sharing.mdx +1 -2
  64. package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
  65. package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +23 -7
  66. package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +1 -1
  67. package/corpus/core/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
  68. package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
  69. package/corpus/core/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
  70. package/corpus/core/docs/content/locales/zh-TW/sharing.mdx +1 -2
  71. package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
  72. package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +23 -7
  73. package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +1 -1
  74. package/corpus/core/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
  75. package/corpus/core/docs/content/plan-plugin.mdx +12 -11
  76. package/corpus/core/docs/content/sharing.mdx +1 -2
  77. package/corpus/core/docs/content/skills-guide.mdx +4 -3
  78. package/corpus/core/docs/content/template-plan.mdx +37 -6
  79. package/corpus/core/docs/content/tracking.mdx +1 -1
  80. package/corpus/core/docs/content/workspace-connections.mdx +1 -1
  81. package/corpus/core/package.json +7 -6
  82. package/corpus/core/src/agent/run-store.ts +1 -1
  83. package/corpus/core/src/chat-threads/store.ts +73 -11
  84. package/corpus/core/src/checkpoints/store.ts +13 -2
  85. package/corpus/core/src/cli/create.ts +3 -4
  86. package/corpus/core/src/cli/design-connect.ts +469 -9
  87. package/corpus/core/src/cli/index.ts +13 -0
  88. package/corpus/core/src/cli/plan-local.ts +281 -24
  89. package/corpus/core/src/cli/skills.ts +177 -21
  90. package/corpus/core/src/cli/templates-meta.ts +0 -13
  91. package/corpus/core/src/cli/visualize-repo.ts +715 -0
  92. package/corpus/core/src/client/AgentPanel.tsx +10 -0
  93. package/corpus/core/src/client/AssistantChat.tsx +194 -21
  94. package/corpus/core/src/client/ErrorBoundary.tsx +67 -12
  95. package/corpus/core/src/client/ErrorReportActions.tsx +69 -0
  96. package/corpus/core/src/client/FeedbackButton.tsx +8 -4
  97. package/corpus/core/src/client/agent-chat-adapter.ts +6 -5
  98. package/corpus/core/src/client/app-providers.tsx +2 -2
  99. package/corpus/core/src/client/collab/index.ts +31 -0
  100. package/corpus/core/src/client/components/LiveCursorOverlay.tsx +16 -1
  101. package/corpus/core/src/client/components/PresenceBar.tsx +14 -1
  102. package/corpus/core/src/client/components/RecentEditHighlights.tsx +219 -0
  103. package/corpus/core/src/client/components/RemoteSelectionRings.tsx +40 -6
  104. package/corpus/core/src/client/db-admin/DbAdminPage.tsx +41 -13
  105. package/corpus/core/src/client/db-admin/SqlEditor.tsx +10 -3
  106. package/corpus/core/src/client/db-admin/TableEditor.tsx +12 -5
  107. package/corpus/core/src/client/db-admin/useAgentSync.ts +10 -3
  108. package/corpus/core/src/client/db-admin/useDbAdmin.ts +65 -16
  109. package/corpus/core/src/client/error-reporting.ts +100 -0
  110. package/corpus/core/src/client/index.ts +59 -0
  111. package/corpus/core/src/client/org/OrgSwitcher.tsx +0 -4
  112. package/corpus/core/src/client/org/RequireActiveOrg.tsx +12 -0
  113. package/corpus/core/src/client/rich-markdown-editor/SharedRichEditor.tsx +49 -32
  114. package/corpus/core/src/client/rich-markdown-editor/index.ts +6 -0
  115. package/corpus/core/src/client/rich-markdown-editor/surgical-apply.ts +192 -0
  116. package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +59 -8
  117. package/corpus/core/src/client/session-replay.ts +181 -15
  118. package/corpus/core/src/client/sse-event-processor.ts +90 -1
  119. package/corpus/core/src/client/use-action.ts +123 -25
  120. package/corpus/core/src/client/use-agent-engine-configured.ts +7 -1
  121. package/corpus/core/src/client/use-chat-threads.ts +18 -7
  122. package/corpus/core/src/client/use-db-sync.ts +104 -19
  123. package/corpus/core/src/client/visual-style-controls.tsx +1088 -0
  124. package/corpus/core/src/collab/agent-presence.ts +191 -62
  125. package/corpus/core/src/collab/awareness.ts +83 -6
  126. package/corpus/core/src/collab/client.ts +89 -146
  127. package/corpus/core/src/collab/index.ts +34 -0
  128. package/corpus/core/src/collab/recent-edits.ts +171 -0
  129. package/corpus/core/src/collab/undo.ts +432 -0
  130. package/corpus/core/src/collab/ydoc-manager.ts +68 -0
  131. package/corpus/core/src/connections/catalog.ts +2 -3
  132. package/corpus/core/src/db/create-get-db.ts +86 -1
  133. package/corpus/core/src/db/ensure-additive-columns.ts +430 -0
  134. package/corpus/core/src/db/index.ts +6 -0
  135. package/corpus/core/src/db/migrations.ts +236 -35
  136. package/corpus/core/src/db-admin/index.ts +26 -0
  137. package/corpus/core/src/db-admin/operations.ts +87 -49
  138. package/corpus/core/src/jobs/scheduler.ts +17 -14
  139. package/corpus/core/src/localization/default-messages.ts +4 -0
  140. package/corpus/core/src/observability/traces.ts +182 -1
  141. package/corpus/core/src/org/context.ts +79 -2
  142. package/corpus/core/src/server/agent-chat-plugin.ts +10 -6
  143. package/corpus/core/src/server/auth-marketing.ts +0 -11
  144. package/corpus/core/src/server/auth.ts +11 -4
  145. package/corpus/core/src/server/builder-design-systems.ts +328 -9
  146. package/corpus/core/src/server/collab-plugin.ts +56 -13
  147. package/corpus/core/src/server/design-token-utils.ts +1 -1
  148. package/corpus/core/src/server/fusion-app.ts +447 -0
  149. package/corpus/core/src/server/index.ts +28 -0
  150. package/corpus/core/src/server/onboarding-html.ts +3 -4
  151. package/corpus/core/src/server/poll-events.ts +14 -2
  152. package/corpus/core/src/server/poll.ts +219 -12
  153. package/corpus/core/src/server/schema-prompt.ts +28 -9
  154. package/corpus/core/src/settings/store.ts +33 -2
  155. package/corpus/core/src/sharing/actions/set-resource-visibility.ts +2 -0
  156. package/corpus/core/src/sharing/actions/share-resource.ts +3 -0
  157. package/corpus/core/src/sharing/actions/unshare-resource.ts +2 -0
  158. package/corpus/core/src/styles/agent-native.css +0 -5
  159. package/corpus/core/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
  160. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
  161. package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
  162. package/corpus/core/src/templates/default/app/root.tsx +47 -0
  163. package/corpus/core/src/templates/default/package.json +3 -3
  164. package/corpus/core/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
  165. package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
  166. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
  167. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
  168. package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
  169. package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
  170. package/corpus/core/src/tracking/providers.ts +22 -1
  171. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +15 -0
  172. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +20 -5
  173. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +8 -0
  174. package/corpus/templates/analytics/AGENTS.md +35 -6
  175. package/corpus/templates/analytics/actions/delete-db-admin-connection.ts +19 -0
  176. package/corpus/templates/analytics/actions/list-db-admin-connections.ts +18 -0
  177. package/corpus/templates/analytics/actions/navigate.ts +28 -4
  178. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
  179. package/corpus/templates/analytics/actions/save-db-admin-connection.ts +33 -0
  180. package/corpus/templates/analytics/actions/view-screen.ts +65 -0
  181. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +23 -1
  182. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -0
  183. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +21 -0
  184. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +16 -0
  185. package/corpus/templates/analytics/app/i18n/zh-TW.ts +36 -1
  186. package/corpus/templates/analytics/app/i18n-data.ts +361 -10
  187. package/corpus/templates/analytics/app/pages/Agents.tsx +512 -0
  188. package/corpus/templates/analytics/app/pages/DataSources.tsx +11 -1
  189. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +76 -40
  190. package/corpus/templates/analytics/app/pages/sessions/session-replay-devtools.ts +5 -0
  191. package/corpus/templates/analytics/app/routes/agents.tsx +10 -0
  192. package/corpus/templates/analytics/changelog/2026-07-03-agent-admin-tools-page.md +6 -0
  193. package/corpus/templates/analytics/changelog/2026-07-03-agent-llm-observability-dashboard.md +6 -0
  194. package/corpus/templates/analytics/changelog/2026-07-03-connect-other-app-databases-from-analytics.md +6 -0
  195. package/corpus/templates/analytics/changelog/2026-07-03-session-recordings-now-include-response-bodies-for-5xx-error.md +6 -0
  196. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +34 -0
  197. package/corpus/templates/analytics/docs/schemas/tracked-events.md +6 -0
  198. package/corpus/templates/analytics/package.json +3 -3
  199. package/corpus/templates/analytics/seeds/dashboards/agent-observability-llm.json +173 -0
  200. package/corpus/templates/analytics/server/db/schema.ts +27 -0
  201. package/corpus/templates/analytics/server/jobs/analytics-alerts.ts +23 -5
  202. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +58 -13
  203. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +23 -0
  204. package/corpus/templates/analytics/server/lib/dashboard-seeds.ts +5 -0
  205. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +458 -0
  206. package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +120 -8
  207. package/corpus/templates/analytics/server/lib/session-replay.ts +3 -2
  208. package/corpus/templates/analytics/server/plugins/db.ts +128 -2
  209. package/corpus/templates/analytics/server/routes/[base]/_agent-native/analytics-db-admin/[...path].ts +1 -0
  210. package/corpus/templates/analytics/server/routes/_agent-native/analytics-db-admin/[...path].ts +160 -0
  211. package/corpus/templates/analytics/server/routes/api/session-replay/agent-diagnostics.json.get.ts +45 -1
  212. package/corpus/templates/analytics/shared/session-replay-diagnostics.ts +10 -0
  213. package/corpus/templates/assets/.agents/skills/real-time-collab/SKILL.md +82 -19
  214. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +15 -0
  215. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +8 -0
  216. package/corpus/templates/assets/package.json +3 -3
  217. package/corpus/templates/assets/server/plugins/db.ts +63 -2
  218. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +15 -0
  219. package/corpus/templates/brain/package.json +3 -3
  220. package/corpus/templates/brain/server/plugins/db.ts +75 -2
  221. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +15 -0
  222. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +8 -0
  223. package/corpus/templates/calendar/package.json +3 -3
  224. package/corpus/templates/calendar/server/plugins/db.ts +64 -2
  225. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +15 -0
  226. package/corpus/templates/chat/package.json +3 -3
  227. package/corpus/templates/clips/actions/finalize-recording.ts +50 -40
  228. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +8 -6
  229. package/corpus/templates/clips/app/routes/share.$shareId.tsx +3 -3
  230. package/corpus/templates/clips/changelog/2026-07-03-mobile-recording-pages-keep-videos-in-a-16-9-player-with-act.md +6 -0
  231. package/corpus/templates/clips/package.json +3 -3
  232. package/corpus/templates/clips/server/lib/recording-upload-state.ts +56 -0
  233. package/corpus/templates/clips/server/plugins/db.ts +68 -1
  234. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +27 -3
  235. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +15 -0
  236. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +8 -0
  237. package/corpus/templates/content/actions/edit-document.ts +48 -1
  238. package/corpus/templates/content/actions/list-documents.ts +101 -94
  239. package/corpus/templates/content/actions/search-documents.ts +19 -3
  240. package/corpus/templates/content/actions/update-document.ts +54 -1
  241. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +127 -7
  242. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +97 -2
  243. package/corpus/templates/content/app/root.tsx +9 -0
  244. package/corpus/templates/content/changelog/2026-07-03-agent-document-edits-now-appear-as-a-live-collaborator-prese.md +6 -0
  245. package/corpus/templates/content/changelog/2026-07-03-document-search-and-list-views-load-faster-on-large-workspac.md +6 -0
  246. package/corpus/templates/content/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.md +6 -0
  247. package/corpus/templates/content/package.json +3 -3
  248. package/corpus/templates/content/server/plugins/db.ts +57 -1
  249. package/corpus/templates/design/.agents/skills/full-app-build/SKILL.md +140 -0
  250. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +20 -0
  251. package/corpus/templates/design/AGENTS.md +63 -19
  252. package/corpus/templates/design/actions/add-fusion-screens.ts +91 -0
  253. package/corpus/templates/design/actions/apply-a11y-fix.ts +5 -1
  254. package/corpus/templates/design/actions/apply-component-prop-edit.ts +10 -2
  255. package/corpus/templates/design/actions/apply-fusion-edits.ts +161 -0
  256. package/corpus/templates/design/actions/apply-visual-edit.ts +34 -1
  257. package/corpus/templates/design/actions/create-component.ts +5 -1
  258. package/corpus/templates/design/actions/create-fusion-app.ts +202 -0
  259. package/corpus/templates/design/actions/deploy-fusion-app.ts +123 -0
  260. package/corpus/templates/design/actions/edit-design.ts +13 -16
  261. package/corpus/templates/design/actions/get-design-system.ts +21 -0
  262. package/corpus/templates/design/actions/get-fusion-deploy-status.ts +86 -0
  263. package/corpus/templates/design/actions/index-design-system-with-builder.ts +14 -37
  264. package/corpus/templates/design/actions/list-fusion-edits.ts +96 -0
  265. package/corpus/templates/design/actions/list-local-files.ts +133 -0
  266. package/corpus/templates/design/actions/push-fusion-app.ts +62 -0
  267. package/corpus/templates/design/actions/queue-fusion-edit.ts +112 -0
  268. package/corpus/templates/design/actions/read-local-file.ts +139 -0
  269. package/corpus/templates/design/actions/send-fusion-message.ts +69 -0
  270. package/corpus/templates/design/actions/sync-fusion-app.ts +196 -0
  271. package/corpus/templates/design/actions/write-local-file.ts +115 -14
  272. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +12 -0
  273. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +379 -0
  274. package/corpus/templates/design/app/components/design/EditPanel.tsx +149 -73
  275. package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +328 -0
  276. package/corpus/templates/design/app/components/design/LayersPanel.tsx +148 -30
  277. package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +1 -1
  278. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +567 -6
  279. package/corpus/templates/design/app/components/design/TweaksPanel.tsx +7 -98
  280. package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +85 -0
  281. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +466 -0
  282. package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +114 -0
  283. package/corpus/templates/design/app/components/design/code-workbench/commands.ts +339 -0
  284. package/corpus/templates/design/app/components/design/code-workbench/editor/Breadcrumbs.tsx +42 -0
  285. package/corpus/templates/design/app/components/design/code-workbench/editor/BufferSync.tsx +128 -0
  286. package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +372 -0
  287. package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +268 -0
  288. package/corpus/templates/design/app/components/design/code-workbench/editor/StatusBar.tsx +208 -0
  289. package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-setup.ts +61 -0
  290. package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme-palette.ts +191 -0
  291. package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme.ts +29 -0
  292. package/corpus/templates/design/app/components/design/code-workbench/editor/status-bar-lang.ts +21 -0
  293. package/corpus/templates/design/app/components/design/code-workbench/editor/tab-drag.ts +27 -0
  294. package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +161 -0
  295. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +555 -0
  296. package/corpus/templates/design/app/components/design/code-workbench/explorer/file-icons.tsx +115 -0
  297. package/corpus/templates/design/app/components/design/code-workbench/format/format-on-open.ts +65 -0
  298. package/corpus/templates/design/app/components/design/code-workbench/format/prettier-format.ts +182 -0
  299. package/corpus/templates/design/app/components/design/code-workbench/model-registry.ts +133 -0
  300. package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +563 -0
  301. package/corpus/templates/design/app/components/design/code-workbench/quickinput/fuzzy.ts +170 -0
  302. package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +508 -0
  303. package/corpus/templates/design/app/components/design/code-workbench/search/search-engine.ts +280 -0
  304. package/corpus/templates/design/app/components/design/code-workbench/store.tsx +782 -0
  305. package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +39 -0
  306. package/corpus/templates/design/app/components/design/code-workbench/workspace/inline-provider.ts +196 -0
  307. package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +177 -0
  308. package/corpus/templates/design/app/components/design/code-workbench/workspace/tree.ts +110 -0
  309. package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +103 -0
  310. package/corpus/templates/design/app/components/design/code-workbench-theme.ts +68 -0
  311. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +127 -10
  312. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +52 -29
  313. package/corpus/templates/design/app/components/design/inspector/index.ts +9 -0
  314. package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +56 -0
  315. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +80 -1
  316. package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +6 -16
  317. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +6 -0
  318. package/corpus/templates/design/app/i18n/zh-TW.ts +17 -15
  319. package/corpus/templates/design/app/i18n-data.ts +185 -160
  320. package/corpus/templates/design/app/pages/DesignEditor.tsx +1474 -175
  321. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +32 -14
  322. package/corpus/templates/design/app/pages/Index.tsx +90 -17
  323. package/corpus/templates/design/changelog/2026-07-03-design-system-setup-now-indexes-figma-code-and-design-md-sou.md +6 -0
  324. package/corpus/templates/design/changelog/2026-07-03-the-ai-now-edits-like-a-collaborator-on-canvas-its-cursor-gl.md +6 -0
  325. package/corpus/templates/design/changelog/2026-07-03-the-code-editor-is-easier-to-use-with-top-sidebar-tabs-clear.md +6 -0
  326. package/corpus/templates/design/changelog/2026-07-03-the-code-panel-is-now-a-full-vs-code-style-editor-with-a-fil.md +6 -0
  327. package/corpus/templates/design/package.json +4 -3
  328. package/corpus/templates/design/server/db/schema.ts +31 -0
  329. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +16 -106
  330. package/corpus/templates/design/server/lib/fusion-screens.ts +246 -0
  331. package/corpus/templates/design/server/plugins/db.ts +89 -2
  332. package/corpus/templates/design/shared/collab-selection.ts +52 -0
  333. package/corpus/templates/design/shared/full-app.ts +126 -0
  334. package/corpus/templates/design/shared/pen-path.ts +296 -0
  335. package/corpus/templates/dispatch/package.json +3 -3
  336. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +15 -0
  337. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +8 -0
  338. package/corpus/templates/forms/package.json +3 -3
  339. package/corpus/templates/forms/server/plugins/db.ts +62 -2
  340. package/corpus/templates/macros/package.json +3 -3
  341. package/corpus/templates/macros/server/plugins/db.ts +63 -2
  342. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +15 -0
  343. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +8 -0
  344. package/corpus/templates/mail/app/root.tsx +60 -1
  345. package/corpus/templates/mail/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.md +6 -0
  346. package/corpus/templates/mail/package.json +3 -3
  347. package/corpus/templates/mail/server/lib/contact-frequency.ts +42 -15
  348. package/corpus/templates/mail/server/plugins/db.ts +63 -2
  349. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +15 -0
  350. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +9 -3
  351. package/corpus/templates/plan/.agents/skills/visualize-repo/SKILL.md +92 -0
  352. package/corpus/templates/plan/actions/export-visual-plan.ts +5 -0
  353. package/corpus/templates/plan/actions/get-local-plan-folder.ts +4 -22
  354. package/corpus/templates/plan/actions/get-plan-version.ts +6 -16
  355. package/corpus/templates/plan/actions/list-plan-versions.ts +48 -20
  356. package/corpus/templates/plan/actions/patch-visual-plan-source.ts +41 -1
  357. package/corpus/templates/plan/actions/promote-local-plan-folder.ts +4 -22
  358. package/corpus/templates/plan/actions/update-local-plan-comments.ts +4 -2
  359. package/corpus/templates/plan/actions/update-local-plan-folder.ts +4 -22
  360. package/corpus/templates/plan/actions/update-visual-plan.ts +60 -1
  361. package/corpus/templates/plan/agent-native.app-skill.json +10 -0
  362. package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +138 -39
  363. package/corpus/templates/plan/app/components/editor/usePlanUndoStack.ts +165 -23
  364. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +80 -4
  365. package/corpus/templates/plan/app/global.css +11 -9
  366. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +10 -1
  367. package/corpus/templates/plan/app/hooks/use-plan-presence.ts +66 -0
  368. package/corpus/templates/plan/app/i18n/ar-SA.ts +3 -0
  369. package/corpus/templates/plan/app/i18n/de-DE.ts +4 -0
  370. package/corpus/templates/plan/app/i18n/en-US.ts +4 -0
  371. package/corpus/templates/plan/app/i18n/es-ES.ts +4 -0
  372. package/corpus/templates/plan/app/i18n/fr-FR.ts +4 -0
  373. package/corpus/templates/plan/app/i18n/hi-IN.ts +3 -0
  374. package/corpus/templates/plan/app/i18n/ja-JP.ts +4 -0
  375. package/corpus/templates/plan/app/i18n/ko-KR.ts +4 -0
  376. package/corpus/templates/plan/app/i18n/pt-BR.ts +4 -0
  377. package/corpus/templates/plan/app/i18n/zh-CN.ts +3 -0
  378. package/corpus/templates/plan/app/i18n/zh-TW.ts +3 -0
  379. package/corpus/templates/plan/app/pages/PlansPage.tsx +289 -66
  380. package/corpus/templates/plan/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.md +6 -0
  381. package/corpus/templates/plan/changelog/2026-07-03-local-visual-plans-and-recaps-can-save-comments-without-sign.md +6 -0
  382. package/corpus/templates/plan/changelog/2026-07-03-plan-tabs-render-nested-text-instead-of-raw-json.md +6 -0
  383. package/corpus/templates/plan/changelog/2026-07-03-plans-are-now-fully-real-time-collaborative-multiple-people-.md +6 -0
  384. package/corpus/templates/plan/changelog/2026-07-03-plans-open-and-refresh-faster-especially-long-lived-plans-wi.md +6 -0
  385. package/corpus/templates/plan/changelog/2026-07-03-undo-now-survives-agent-edits-cmd-z-keeps-working-on-your-ow.md +6 -0
  386. package/corpus/templates/plan/package.json +5 -3
  387. package/corpus/templates/plan/server/db/schema.ts +12 -0
  388. package/corpus/templates/plan/server/lib/local-plan-kind.ts +25 -0
  389. package/corpus/templates/plan/server/lib/plan-versions.ts +83 -1
  390. package/corpus/templates/plan/server/lib/public-action-paths.ts +0 -2
  391. package/corpus/templates/plan/server/plans.ts +26 -3
  392. package/corpus/templates/plan/server/plugins/db.ts +105 -2
  393. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +8 -4
  394. package/corpus/templates/slides/AGENTS.md +11 -3
  395. package/corpus/templates/slides/actions/_agent-presence.ts +48 -0
  396. package/corpus/templates/slides/actions/add-slide.ts +16 -18
  397. package/corpus/templates/slides/actions/get-design-system.ts +21 -0
  398. package/corpus/templates/slides/actions/import-file.ts +15 -7
  399. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +14 -37
  400. package/corpus/templates/slides/actions/patch-deck.ts +4 -2
  401. package/corpus/templates/slides/actions/update-slide.ts +114 -77
  402. package/corpus/templates/slides/actions/view-screen.ts +39 -0
  403. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +32 -8
  404. package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +47 -3
  405. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +34 -39
  406. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +507 -72
  407. package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +346 -0
  408. package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +56 -6
  409. package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +46 -96
  410. package/corpus/templates/slides/app/components/layout/Layout.tsx +6 -1
  411. package/corpus/templates/slides/app/components/visual-editor/SaveStatusIndicator.tsx +8 -1
  412. package/corpus/templates/slides/app/context/DeckContext.tsx +589 -176
  413. package/corpus/templates/slides/app/hooks/use-deck-presence.ts +84 -42
  414. package/corpus/templates/slides/app/i18n/ar-SA.ts +54 -7
  415. package/corpus/templates/slides/app/i18n/de-DE.ts +53 -8
  416. package/corpus/templates/slides/app/i18n/en-US.ts +54 -7
  417. package/corpus/templates/slides/app/i18n/es-ES.ts +53 -8
  418. package/corpus/templates/slides/app/i18n/fr-FR.ts +53 -8
  419. package/corpus/templates/slides/app/i18n/hi-IN.ts +54 -7
  420. package/corpus/templates/slides/app/i18n/ja-JP.ts +53 -8
  421. package/corpus/templates/slides/app/i18n/ko-KR.ts +53 -7
  422. package/corpus/templates/slides/app/i18n/pt-BR.ts +53 -8
  423. package/corpus/templates/slides/app/i18n/zh-CN.ts +54 -7
  424. package/corpus/templates/slides/app/i18n/zh-TW.ts +54 -7
  425. package/corpus/templates/slides/app/lib/canvas-zoom.ts +16 -1
  426. package/corpus/templates/slides/app/pages/DeckEditor.tsx +28 -16
  427. package/corpus/templates/slides/changelog/2026-07-03-design-system-setup-now-indexes-figma-code-and-design-md-sou.md +6 -0
  428. package/corpus/templates/slides/changelog/2026-07-03-figma-style-slide-editing.md +6 -0
  429. package/corpus/templates/slides/changelog/2026-07-03-see-the-ai-working-with-you-when-the-agent-edits-a-slide-it-.md +6 -0
  430. package/corpus/templates/slides/changelog/2026-07-03-slide-editing-now-keeps-thumbnails-speaker-notes-styling-and.md +6 -0
  431. package/corpus/templates/slides/changelog/2026-07-03-undo-redo-is-now-precise-and-safe-with-collaborators-it-only.md +6 -0
  432. package/corpus/templates/slides/package.json +3 -3
  433. package/corpus/templates/slides/server/handlers/decks.ts +31 -3
  434. package/corpus/templates/slides/server/lib/builder-design-system-proxy.ts +16 -104
  435. package/corpus/templates/slides/server/plugins/db.ts +65 -2
  436. package/corpus/templates/videos/netlify.toml +1 -12
  437. package/dist/agent/run-store.js +1 -1
  438. package/dist/agent/run-store.js.map +1 -1
  439. package/dist/chat-threads/store.d.ts +9 -1
  440. package/dist/chat-threads/store.d.ts.map +1 -1
  441. package/dist/chat-threads/store.js +63 -11
  442. package/dist/chat-threads/store.js.map +1 -1
  443. package/dist/checkpoints/store.d.ts.map +1 -1
  444. package/dist/checkpoints/store.js +10 -2
  445. package/dist/checkpoints/store.js.map +1 -1
  446. package/dist/cli/create.d.ts.map +1 -1
  447. package/dist/cli/create.js +3 -5
  448. package/dist/cli/create.js.map +1 -1
  449. package/dist/cli/design-connect.d.ts +49 -1
  450. package/dist/cli/design-connect.d.ts.map +1 -1
  451. package/dist/cli/design-connect.js +414 -9
  452. package/dist/cli/design-connect.js.map +1 -1
  453. package/dist/cli/index.js +12 -0
  454. package/dist/cli/index.js.map +1 -1
  455. package/dist/cli/plan-local.d.ts +24 -0
  456. package/dist/cli/plan-local.d.ts.map +1 -1
  457. package/dist/cli/plan-local.js +188 -20
  458. package/dist/cli/plan-local.js.map +1 -1
  459. package/dist/cli/skills.d.ts +3 -1
  460. package/dist/cli/skills.d.ts.map +1 -1
  461. package/dist/cli/skills.js +173 -21
  462. package/dist/cli/skills.js.map +1 -1
  463. package/dist/cli/templates-meta.d.ts.map +1 -1
  464. package/dist/cli/templates-meta.js +0 -14
  465. package/dist/cli/templates-meta.js.map +1 -1
  466. package/dist/cli/visualize-repo.d.ts +49 -0
  467. package/dist/cli/visualize-repo.d.ts.map +1 -0
  468. package/dist/cli/visualize-repo.js +561 -0
  469. package/dist/cli/visualize-repo.js.map +1 -0
  470. package/dist/client/AgentPanel.d.ts.map +1 -1
  471. package/dist/client/AgentPanel.js +2 -1
  472. package/dist/client/AgentPanel.js.map +1 -1
  473. package/dist/client/AssistantChat.d.ts.map +1 -1
  474. package/dist/client/AssistantChat.js +175 -18
  475. package/dist/client/AssistantChat.js.map +1 -1
  476. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  477. package/dist/client/ErrorBoundary.js +37 -2
  478. package/dist/client/ErrorBoundary.js.map +1 -1
  479. package/dist/client/ErrorReportActions.d.ts +13 -0
  480. package/dist/client/ErrorReportActions.d.ts.map +1 -0
  481. package/dist/client/ErrorReportActions.js +14 -0
  482. package/dist/client/ErrorReportActions.js.map +1 -0
  483. package/dist/client/FeedbackButton.d.ts +3 -1
  484. package/dist/client/FeedbackButton.d.ts.map +1 -1
  485. package/dist/client/FeedbackButton.js +6 -5
  486. package/dist/client/FeedbackButton.js.map +1 -1
  487. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  488. package/dist/client/agent-chat-adapter.js +6 -5
  489. package/dist/client/agent-chat-adapter.js.map +1 -1
  490. package/dist/client/app-providers.d.ts +2 -2
  491. package/dist/client/app-providers.js.map +1 -1
  492. package/dist/client/collab/index.d.ts +4 -1
  493. package/dist/client/collab/index.d.ts.map +1 -1
  494. package/dist/client/collab/index.js +3 -0
  495. package/dist/client/collab/index.js.map +1 -1
  496. package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
  497. package/dist/client/components/LiveCursorOverlay.js +11 -3
  498. package/dist/client/components/LiveCursorOverlay.js.map +1 -1
  499. package/dist/client/components/PresenceBar.d.ts.map +1 -1
  500. package/dist/client/components/PresenceBar.js +6 -1
  501. package/dist/client/components/PresenceBar.js.map +1 -1
  502. package/dist/client/components/RecentEditHighlights.d.ts +43 -0
  503. package/dist/client/components/RecentEditHighlights.d.ts.map +1 -0
  504. package/dist/client/components/RecentEditHighlights.js +146 -0
  505. package/dist/client/components/RecentEditHighlights.js.map +1 -0
  506. package/dist/client/components/RemoteSelectionRings.d.ts +9 -0
  507. package/dist/client/components/RemoteSelectionRings.d.ts.map +1 -1
  508. package/dist/client/components/RemoteSelectionRings.js +22 -8
  509. package/dist/client/components/RemoteSelectionRings.js.map +1 -1
  510. package/dist/client/db-admin/DbAdminPage.d.ts +9 -1
  511. package/dist/client/db-admin/DbAdminPage.d.ts.map +1 -1
  512. package/dist/client/db-admin/DbAdminPage.js +17 -13
  513. package/dist/client/db-admin/DbAdminPage.js.map +1 -1
  514. package/dist/client/db-admin/SqlEditor.d.ts +3 -1
  515. package/dist/client/db-admin/SqlEditor.d.ts.map +1 -1
  516. package/dist/client/db-admin/SqlEditor.js +3 -3
  517. package/dist/client/db-admin/SqlEditor.js.map +1 -1
  518. package/dist/client/db-admin/TableEditor.d.ts +3 -1
  519. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  520. package/dist/client/db-admin/TableEditor.js +6 -6
  521. package/dist/client/db-admin/TableEditor.js.map +1 -1
  522. package/dist/client/db-admin/useAgentSync.d.ts +3 -2
  523. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
  524. package/dist/client/db-admin/useAgentSync.js +8 -4
  525. package/dist/client/db-admin/useAgentSync.js.map +1 -1
  526. package/dist/client/db-admin/useDbAdmin.d.ts +11 -7
  527. package/dist/client/db-admin/useDbAdmin.d.ts.map +1 -1
  528. package/dist/client/db-admin/useDbAdmin.js +45 -20
  529. package/dist/client/db-admin/useDbAdmin.js.map +1 -1
  530. package/dist/client/error-reporting.d.ts +19 -0
  531. package/dist/client/error-reporting.d.ts.map +1 -0
  532. package/dist/client/error-reporting.js +71 -0
  533. package/dist/client/error-reporting.js.map +1 -0
  534. package/dist/client/index.d.ts +8 -1
  535. package/dist/client/index.d.ts.map +1 -1
  536. package/dist/client/index.js +9 -0
  537. package/dist/client/index.js.map +1 -1
  538. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  539. package/dist/client/org/OrgSwitcher.js +1 -3
  540. package/dist/client/org/OrgSwitcher.js.map +1 -1
  541. package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
  542. package/dist/client/org/RequireActiveOrg.js +2 -1
  543. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  544. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +8 -1
  545. package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
  546. package/dist/client/rich-markdown-editor/SharedRichEditor.js +8 -2
  547. package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
  548. package/dist/client/rich-markdown-editor/index.d.ts +1 -0
  549. package/dist/client/rich-markdown-editor/index.d.ts.map +1 -1
  550. package/dist/client/rich-markdown-editor/index.js +1 -0
  551. package/dist/client/rich-markdown-editor/index.js.map +1 -1
  552. package/dist/client/rich-markdown-editor/surgical-apply.d.ts +66 -0
  553. package/dist/client/rich-markdown-editor/surgical-apply.d.ts.map +1 -0
  554. package/dist/client/rich-markdown-editor/surgical-apply.js +147 -0
  555. package/dist/client/rich-markdown-editor/surgical-apply.js.map +1 -0
  556. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +18 -2
  557. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  558. package/dist/client/rich-markdown-editor/useCollabReconcile.js +39 -8
  559. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  560. package/dist/client/session-replay.d.ts +10 -1
  561. package/dist/client/session-replay.d.ts.map +1 -1
  562. package/dist/client/session-replay.js +134 -7
  563. package/dist/client/session-replay.js.map +1 -1
  564. package/dist/client/sse-event-processor.d.ts.map +1 -1
  565. package/dist/client/sse-event-processor.js +81 -1
  566. package/dist/client/sse-event-processor.js.map +1 -1
  567. package/dist/client/use-action.d.ts +24 -0
  568. package/dist/client/use-action.d.ts.map +1 -1
  569. package/dist/client/use-action.js +109 -27
  570. package/dist/client/use-action.js.map +1 -1
  571. package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
  572. package/dist/client/use-agent-engine-configured.js +7 -1
  573. package/dist/client/use-agent-engine-configured.js.map +1 -1
  574. package/dist/client/use-chat-threads.d.ts.map +1 -1
  575. package/dist/client/use-chat-threads.js +11 -3
  576. package/dist/client/use-chat-threads.js.map +1 -1
  577. package/dist/client/use-db-sync.d.ts +36 -0
  578. package/dist/client/use-db-sync.d.ts.map +1 -1
  579. package/dist/client/use-db-sync.js +68 -12
  580. package/dist/client/use-db-sync.js.map +1 -1
  581. package/dist/client/visual-style-controls.d.ts +90 -0
  582. package/dist/client/visual-style-controls.d.ts.map +1 -0
  583. package/dist/client/visual-style-controls.js +499 -0
  584. package/dist/client/visual-style-controls.js.map +1 -0
  585. package/dist/collab/agent-presence.d.ts +51 -5
  586. package/dist/collab/agent-presence.d.ts.map +1 -1
  587. package/dist/collab/agent-presence.js +144 -58
  588. package/dist/collab/agent-presence.js.map +1 -1
  589. package/dist/collab/awareness-store.d.ts +32 -0
  590. package/dist/collab/awareness-store.d.ts.map +1 -0
  591. package/dist/collab/awareness-store.js +0 -0
  592. package/dist/collab/awareness-store.js.map +1 -0
  593. package/dist/collab/awareness.d.ts +12 -1
  594. package/dist/collab/awareness.d.ts.map +1 -1
  595. package/dist/collab/awareness.js +53 -5
  596. package/dist/collab/awareness.js.map +1 -1
  597. package/dist/collab/client.d.ts +2 -0
  598. package/dist/collab/client.d.ts.map +1 -1
  599. package/dist/collab/client.js +79 -119
  600. package/dist/collab/client.js.map +1 -1
  601. package/dist/collab/index.d.ts +3 -1
  602. package/dist/collab/index.d.ts.map +1 -1
  603. package/dist/collab/index.js +5 -1
  604. package/dist/collab/index.js.map +1 -1
  605. package/dist/collab/recent-edits.d.ts +87 -0
  606. package/dist/collab/recent-edits.d.ts.map +1 -0
  607. package/dist/collab/recent-edits.js +116 -0
  608. package/dist/collab/recent-edits.js.map +1 -0
  609. package/dist/collab/routes.d.ts +1 -1
  610. package/dist/collab/undo.d.ts +121 -0
  611. package/dist/collab/undo.d.ts.map +1 -0
  612. package/dist/collab/undo.js +244 -0
  613. package/dist/collab/undo.js.map +1 -0
  614. package/dist/collab/ydoc-manager.d.ts +10 -0
  615. package/dist/collab/ydoc-manager.d.ts.map +1 -1
  616. package/dist/collab/ydoc-manager.js +57 -0
  617. package/dist/collab/ydoc-manager.js.map +1 -1
  618. package/dist/connections/catalog.d.ts +2 -2
  619. package/dist/connections/catalog.d.ts.map +1 -1
  620. package/dist/connections/catalog.js +1 -1
  621. package/dist/connections/catalog.js.map +1 -1
  622. package/dist/db/create-get-db.d.ts +22 -0
  623. package/dist/db/create-get-db.d.ts.map +1 -1
  624. package/dist/db/create-get-db.js +73 -1
  625. package/dist/db/create-get-db.js.map +1 -1
  626. package/dist/db/ensure-additive-columns.d.ts +93 -0
  627. package/dist/db/ensure-additive-columns.d.ts.map +1 -0
  628. package/dist/db/ensure-additive-columns.js +355 -0
  629. package/dist/db/ensure-additive-columns.js.map +1 -0
  630. package/dist/db/index.d.ts +1 -0
  631. package/dist/db/index.d.ts.map +1 -1
  632. package/dist/db/index.js +1 -0
  633. package/dist/db/index.js.map +1 -1
  634. package/dist/db/migrations.d.ts +70 -0
  635. package/dist/db/migrations.d.ts.map +1 -1
  636. package/dist/db/migrations.js +196 -33
  637. package/dist/db/migrations.js.map +1 -1
  638. package/dist/db-admin/index.d.ts +3 -0
  639. package/dist/db-admin/index.d.ts.map +1 -0
  640. package/dist/db-admin/index.js +2 -0
  641. package/dist/db-admin/index.js.map +1 -0
  642. package/dist/db-admin/operations.d.ts +26 -5
  643. package/dist/db-admin/operations.d.ts.map +1 -1
  644. package/dist/db-admin/operations.js +66 -55
  645. package/dist/db-admin/operations.js.map +1 -1
  646. package/dist/jobs/scheduler.js +17 -10
  647. package/dist/jobs/scheduler.js.map +1 -1
  648. package/dist/localization/default-messages.d.ts +3 -0
  649. package/dist/localization/default-messages.d.ts.map +1 -1
  650. package/dist/localization/default-messages.js +3 -0
  651. package/dist/localization/default-messages.js.map +1 -1
  652. package/dist/notifications/routes.d.ts +2 -2
  653. package/dist/observability/routes.d.ts +2 -2
  654. package/dist/observability/traces.d.ts.map +1 -1
  655. package/dist/observability/traces.js +155 -1
  656. package/dist/observability/traces.js.map +1 -1
  657. package/dist/org/context.d.ts +7 -0
  658. package/dist/org/context.d.ts.map +1 -1
  659. package/dist/org/context.js +54 -2
  660. package/dist/org/context.js.map +1 -1
  661. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  662. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  663. package/dist/server/agent-chat-plugin.js +10 -6
  664. package/dist/server/agent-chat-plugin.js.map +1 -1
  665. package/dist/server/auth-marketing.d.ts.map +1 -1
  666. package/dist/server/auth-marketing.js +0 -10
  667. package/dist/server/auth-marketing.js.map +1 -1
  668. package/dist/server/auth.d.ts.map +1 -1
  669. package/dist/server/auth.js +6 -4
  670. package/dist/server/auth.js.map +1 -1
  671. package/dist/server/builder-design-systems.d.ts +61 -0
  672. package/dist/server/builder-design-systems.d.ts.map +1 -1
  673. package/dist/server/builder-design-systems.js +219 -14
  674. package/dist/server/builder-design-systems.js.map +1 -1
  675. package/dist/server/collab-plugin.d.ts.map +1 -1
  676. package/dist/server/collab-plugin.js +45 -13
  677. package/dist/server/collab-plugin.js.map +1 -1
  678. package/dist/server/design-token-utils.d.ts +1 -1
  679. package/dist/server/design-token-utils.js +1 -1
  680. package/dist/server/design-token-utils.js.map +1 -1
  681. package/dist/server/fusion-app.d.ts +107 -0
  682. package/dist/server/fusion-app.d.ts.map +1 -0
  683. package/dist/server/fusion-app.js +371 -0
  684. package/dist/server/fusion-app.js.map +1 -0
  685. package/dist/server/index.d.ts +2 -1
  686. package/dist/server/index.d.ts.map +1 -1
  687. package/dist/server/index.js +2 -1
  688. package/dist/server/index.js.map +1 -1
  689. package/dist/server/onboarding-html.d.ts.map +1 -1
  690. package/dist/server/onboarding-html.js +3 -4
  691. package/dist/server/onboarding-html.js.map +1 -1
  692. package/dist/server/poll-events.d.ts +2 -0
  693. package/dist/server/poll-events.d.ts.map +1 -1
  694. package/dist/server/poll-events.js +7 -2
  695. package/dist/server/poll-events.js.map +1 -1
  696. package/dist/server/poll.d.ts +47 -3
  697. package/dist/server/poll.d.ts.map +1 -1
  698. package/dist/server/poll.js +176 -10
  699. package/dist/server/poll.js.map +1 -1
  700. package/dist/server/schema-prompt.d.ts.map +1 -1
  701. package/dist/server/schema-prompt.js +24 -7
  702. package/dist/server/schema-prompt.js.map +1 -1
  703. package/dist/settings/store.d.ts.map +1 -1
  704. package/dist/settings/store.js +32 -3
  705. package/dist/settings/store.js.map +1 -1
  706. package/dist/sharing/actions/set-resource-visibility.js +2 -0
  707. package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
  708. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  709. package/dist/sharing/actions/share-resource.js +3 -0
  710. package/dist/sharing/actions/share-resource.js.map +1 -1
  711. package/dist/sharing/actions/unshare-resource.js +2 -0
  712. package/dist/sharing/actions/unshare-resource.js.map +1 -1
  713. package/dist/styles/agent-native.css +0 -5
  714. package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
  715. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
  716. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
  717. package/dist/templates/default/app/root.tsx +47 -0
  718. package/dist/templates/default/package.json +3 -3
  719. package/dist/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
  720. package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
  721. package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
  722. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
  723. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
  724. package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
  725. package/dist/tracking/providers.d.ts.map +1 -1
  726. package/dist/tracking/providers.js +17 -1
  727. package/dist/tracking/providers.js.map +1 -1
  728. package/docs/content/cloneable-saas.mdx +0 -1
  729. package/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
  730. package/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
  731. package/docs/content/locales/ar-SA/sharing.mdx +1 -2
  732. package/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
  733. package/docs/content/locales/ar-SA/template-plan.mdx +23 -7
  734. package/docs/content/locales/ar-SA/tracking.mdx +1 -1
  735. package/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
  736. package/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
  737. package/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
  738. package/docs/content/locales/de-DE/sharing.mdx +1 -2
  739. package/docs/content/locales/de-DE/skills-guide.mdx +2 -3
  740. package/docs/content/locales/de-DE/template-plan.mdx +23 -7
  741. package/docs/content/locales/de-DE/tracking.mdx +1 -1
  742. package/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
  743. package/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
  744. package/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
  745. package/docs/content/locales/es-ES/sharing.mdx +1 -2
  746. package/docs/content/locales/es-ES/skills-guide.mdx +2 -3
  747. package/docs/content/locales/es-ES/template-plan.mdx +23 -7
  748. package/docs/content/locales/es-ES/tracking.mdx +1 -1
  749. package/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
  750. package/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
  751. package/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
  752. package/docs/content/locales/fr-FR/sharing.mdx +1 -2
  753. package/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
  754. package/docs/content/locales/fr-FR/template-plan.mdx +23 -7
  755. package/docs/content/locales/fr-FR/tracking.mdx +1 -1
  756. package/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
  757. package/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
  758. package/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
  759. package/docs/content/locales/hi-IN/sharing.mdx +1 -2
  760. package/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
  761. package/docs/content/locales/hi-IN/template-plan.mdx +23 -7
  762. package/docs/content/locales/hi-IN/tracking.mdx +1 -1
  763. package/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
  764. package/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
  765. package/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
  766. package/docs/content/locales/ja-JP/sharing.mdx +1 -2
  767. package/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
  768. package/docs/content/locales/ja-JP/template-plan.mdx +23 -7
  769. package/docs/content/locales/ja-JP/tracking.mdx +1 -1
  770. package/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
  771. package/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
  772. package/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
  773. package/docs/content/locales/ko-KR/sharing.mdx +1 -2
  774. package/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
  775. package/docs/content/locales/ko-KR/template-plan.mdx +23 -7
  776. package/docs/content/locales/ko-KR/tracking.mdx +1 -1
  777. package/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
  778. package/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
  779. package/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
  780. package/docs/content/locales/pt-BR/sharing.mdx +1 -2
  781. package/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
  782. package/docs/content/locales/pt-BR/template-plan.mdx +23 -7
  783. package/docs/content/locales/pt-BR/tracking.mdx +1 -1
  784. package/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
  785. package/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
  786. package/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
  787. package/docs/content/locales/zh-CN/sharing.mdx +1 -2
  788. package/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
  789. package/docs/content/locales/zh-CN/template-plan.mdx +23 -7
  790. package/docs/content/locales/zh-CN/tracking.mdx +1 -1
  791. package/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
  792. package/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
  793. package/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
  794. package/docs/content/locales/zh-TW/sharing.mdx +1 -2
  795. package/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
  796. package/docs/content/locales/zh-TW/template-plan.mdx +23 -7
  797. package/docs/content/locales/zh-TW/tracking.mdx +1 -1
  798. package/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
  799. package/docs/content/plan-plugin.mdx +12 -11
  800. package/docs/content/sharing.mdx +1 -2
  801. package/docs/content/skills-guide.mdx +4 -3
  802. package/docs/content/template-plan.mdx +37 -6
  803. package/docs/content/tracking.mdx +1 -1
  804. package/docs/content/workspace-connections.mdx +1 -1
  805. package/package.json +7 -6
  806. package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
  807. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
  808. package/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
  809. package/src/templates/default/app/root.tsx +47 -0
  810. package/src/templates/default/package.json +3 -3
  811. package/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
  812. package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
  813. package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
  814. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
  815. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
  816. package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
  817. package/corpus/core/docs/content/locales/ar-SA/template-videos.mdx +0 -336
  818. package/corpus/core/docs/content/locales/de-DE/template-videos.mdx +0 -336
  819. package/corpus/core/docs/content/locales/es-ES/template-videos.mdx +0 -336
  820. package/corpus/core/docs/content/locales/fr-FR/template-videos.mdx +0 -336
  821. package/corpus/core/docs/content/locales/hi-IN/template-videos.mdx +0 -336
  822. package/corpus/core/docs/content/locales/ja-JP/template-videos.mdx +0 -336
  823. package/corpus/core/docs/content/locales/ko-KR/template-videos.mdx +0 -336
  824. package/corpus/core/docs/content/locales/pt-BR/template-videos.mdx +0 -336
  825. package/corpus/core/docs/content/locales/zh-CN/template-videos.mdx +0 -334
  826. package/corpus/core/docs/content/locales/zh-TW/template-videos.mdx +0 -334
  827. package/corpus/core/docs/content/template-videos.mdx +0 -332
  828. package/corpus/templates/design/app/components/design/CodeWorkbenchHost.tsx +0 -697
  829. package/corpus/templates/slides/app/components/editor/CodeEditor.tsx +0 -49
  830. package/corpus/templates/videos/.agents/skills/actions/SKILL.md +0 -432
  831. package/corpus/templates/videos/.agents/skills/animation-tracks/SKILL.md +0 -99
  832. package/corpus/templates/videos/.agents/skills/capture-learnings/SKILL.md +0 -76
  833. package/corpus/templates/videos/.agents/skills/composition-management/SKILL.md +0 -106
  834. package/corpus/templates/videos/.agents/skills/create-skill/SKILL.md +0 -221
  835. package/corpus/templates/videos/.agents/skills/delegate-to-agent/SKILL.md +0 -263
  836. package/corpus/templates/videos/.agents/skills/frontend-design/SKILL.md +0 -112
  837. package/corpus/templates/videos/.agents/skills/security/SKILL.md +0 -263
  838. package/corpus/templates/videos/.agents/skills/self-modifying-code/SKILL.md +0 -88
  839. package/corpus/templates/videos/.agents/skills/shadcn-ui/SKILL.md +0 -95
  840. package/corpus/templates/videos/.builder/ANIMATED_PROPERTIES.md +0 -335
  841. package/corpus/templates/videos/.builder/KEYFRAME_SYNC.md +0 -166
  842. package/corpus/templates/videos/.builder/SEAMLESS_SYNC.md +0 -211
  843. package/corpus/templates/videos/.builder/rules/deploy-app.mdc +0 -22
  844. package/corpus/templates/videos/.builder/rules/organize-ui.mdc +0 -9
  845. package/corpus/templates/videos/.builder/skills/remotion/SKILL.md +0 -29
  846. package/corpus/templates/videos/.builder/skills/remotion/rules/animations.md +0 -27
  847. package/corpus/templates/videos/.builder/skills/remotion/rules/assets.md +0 -43
  848. package/corpus/templates/videos/.builder/skills/remotion/rules/audio.md +0 -58
  849. package/corpus/templates/videos/.builder/skills/remotion/rules/compositions.md +0 -129
  850. package/corpus/templates/videos/.builder/skills/remotion/rules/fonts.md +0 -47
  851. package/corpus/templates/videos/.builder/skills/remotion/rules/images.md +0 -41
  852. package/corpus/templates/videos/.builder/skills/remotion/rules/parameters.md +0 -59
  853. package/corpus/templates/videos/.builder/skills/remotion/rules/sequencing.md +0 -54
  854. package/corpus/templates/videos/.builder/skills/remotion/rules/tailwind.md +0 -11
  855. package/corpus/templates/videos/.builder/skills/remotion/rules/text-animations.md +0 -18
  856. package/corpus/templates/videos/.builder/skills/remotion/rules/timing.md +0 -103
  857. package/corpus/templates/videos/.builder/skills/remotion/rules/transparent-videos.md +0 -35
  858. package/corpus/templates/videos/.builder/skills/remotion/rules/trimming.md +0 -38
  859. package/corpus/templates/videos/.builder/skills/remotion/rules/videos.md +0 -54
  860. package/corpus/templates/videos/.dockerignore +0 -62
  861. package/corpus/templates/videos/.env.example +0 -4
  862. package/corpus/templates/videos/.oxfmtrc.json +0 -8
  863. package/corpus/templates/videos/AGENTS.md +0 -46
  864. package/corpus/templates/videos/CHANGELOG.md +0 -10
  865. package/corpus/templates/videos/DEVELOPING.md +0 -143
  866. package/corpus/templates/videos/README.md +0 -33
  867. package/corpus/templates/videos/actions/analyze-brand-assets.ts +0 -151
  868. package/corpus/templates/videos/actions/apply-design-system.ts +0 -35
  869. package/corpus/templates/videos/actions/create-design-system.ts +0 -84
  870. package/corpus/templates/videos/actions/create-folder.ts +0 -48
  871. package/corpus/templates/videos/actions/db-connect.ts +0 -45
  872. package/corpus/templates/videos/actions/db-health.ts +0 -24
  873. package/corpus/templates/videos/actions/db-status.ts +0 -28
  874. package/corpus/templates/videos/actions/delete-composition.ts +0 -272
  875. package/corpus/templates/videos/actions/delete-folder.ts +0 -27
  876. package/corpus/templates/videos/actions/generate-animated-component.ts +0 -470
  877. package/corpus/templates/videos/actions/get-composition.ts +0 -36
  878. package/corpus/templates/videos/actions/get-design-system.ts +0 -35
  879. package/corpus/templates/videos/actions/import-code.ts +0 -67
  880. package/corpus/templates/videos/actions/import-design-project.ts +0 -42
  881. package/corpus/templates/videos/actions/import-document.ts +0 -125
  882. package/corpus/templates/videos/actions/import-from-url.ts +0 -18
  883. package/corpus/templates/videos/actions/import-github.ts +0 -182
  884. package/corpus/templates/videos/actions/list-compositions.ts +0 -32
  885. package/corpus/templates/videos/actions/list-design-systems.ts +0 -66
  886. package/corpus/templates/videos/actions/list-folders.ts +0 -61
  887. package/corpus/templates/videos/actions/move-composition-to-folder.ts +0 -59
  888. package/corpus/templates/videos/actions/navigate.ts +0 -40
  889. package/corpus/templates/videos/actions/rename-folder.ts +0 -41
  890. package/corpus/templates/videos/actions/run.ts +0 -2
  891. package/corpus/templates/videos/actions/save-composition.ts +0 -114
  892. package/corpus/templates/videos/actions/set-default-design-system.ts +0 -40
  893. package/corpus/templates/videos/actions/update-composition.ts +0 -81
  894. package/corpus/templates/videos/actions/update-design-system.ts +0 -68
  895. package/corpus/templates/videos/actions/validate-compositions.ts +0 -502
  896. package/corpus/templates/videos/actions/view-screen.ts +0 -48
  897. package/corpus/templates/videos/app/components/CameraControls.tsx +0 -442
  898. package/corpus/templates/videos/app/components/CameraToolbar.tsx +0 -437
  899. package/corpus/templates/videos/app/components/CloudUpgrade.tsx +0 -287
  900. package/corpus/templates/videos/app/components/CollabPresenceBar.tsx +0 -81
  901. package/corpus/templates/videos/app/components/CompSettingsEditor.tsx +0 -107
  902. package/corpus/templates/videos/app/components/ComponentLibrarySidebar.tsx +0 -457
  903. package/corpus/templates/videos/app/components/ComponentPropsPanel.tsx +0 -227
  904. package/corpus/templates/videos/app/components/ComponentsSidebar.tsx +0 -70
  905. package/corpus/templates/videos/app/components/CompositionCard.tsx +0 -147
  906. package/corpus/templates/videos/app/components/CurrentElementPanel.tsx +0 -835
  907. package/corpus/templates/videos/app/components/CursorControls.tsx +0 -664
  908. package/corpus/templates/videos/app/components/CursorPositioningOverlay.tsx +0 -238
  909. package/corpus/templates/videos/app/components/LibraryFolderRow.tsx +0 -235
  910. package/corpus/templates/videos/app/components/MotionCurveSelect.tsx +0 -61
  911. package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +0 -192
  912. package/corpus/templates/videos/app/components/PropsEditor.tsx +0 -210
  913. package/corpus/templates/videos/app/components/QuestionFlow.tsx +0 -40
  914. package/corpus/templates/videos/app/components/Sidebar.tsx +0 -609
  915. package/corpus/templates/videos/app/components/StudioHeader.tsx +0 -109
  916. package/corpus/templates/videos/app/components/Timeline.tsx +0 -2067
  917. package/corpus/templates/videos/app/components/TrackPropertiesPanel.tsx +0 -922
  918. package/corpus/templates/videos/app/components/TweaksPanel.tsx +0 -277
  919. package/corpus/templates/videos/app/components/VideoPlayer.tsx +0 -487
  920. package/corpus/templates/videos/app/components/design-system/DesignSystemCard.tsx +0 -134
  921. package/corpus/templates/videos/app/components/design-system/DesignSystemPreview.tsx +0 -176
  922. package/corpus/templates/videos/app/components/design-system/DesignSystemSetup.tsx +0 -707
  923. package/corpus/templates/videos/app/components/keyframes/KeyframeActionButtons.tsx +0 -78
  924. package/corpus/templates/videos/app/components/keyframes/KeyframeNavigation.tsx +0 -59
  925. package/corpus/templates/videos/app/components/keyframes/PropertyNumberInput.tsx +0 -56
  926. package/corpus/templates/videos/app/components/layout/Header.tsx +0 -64
  927. package/corpus/templates/videos/app/components/layout/HeaderActions.tsx +0 -84
  928. package/corpus/templates/videos/app/components/layout/Layout.tsx +0 -132
  929. package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +0 -180
  930. package/corpus/templates/videos/app/components/ui/accordion.tsx +0 -56
  931. package/corpus/templates/videos/app/components/ui/alert-dialog.tsx +0 -139
  932. package/corpus/templates/videos/app/components/ui/alert.tsx +0 -59
  933. package/corpus/templates/videos/app/components/ui/aspect-ratio.tsx +0 -5
  934. package/corpus/templates/videos/app/components/ui/avatar.tsx +0 -48
  935. package/corpus/templates/videos/app/components/ui/badge.tsx +0 -37
  936. package/corpus/templates/videos/app/components/ui/breadcrumb.tsx +0 -115
  937. package/corpus/templates/videos/app/components/ui/button.tsx +0 -57
  938. package/corpus/templates/videos/app/components/ui/calendar.tsx +0 -68
  939. package/corpus/templates/videos/app/components/ui/card.tsx +0 -86
  940. package/corpus/templates/videos/app/components/ui/carousel.tsx +0 -260
  941. package/corpus/templates/videos/app/components/ui/chart.tsx +0 -375
  942. package/corpus/templates/videos/app/components/ui/checkbox.tsx +0 -28
  943. package/corpus/templates/videos/app/components/ui/collapsible.tsx +0 -9
  944. package/corpus/templates/videos/app/components/ui/command.tsx +0 -154
  945. package/corpus/templates/videos/app/components/ui/context-menu.tsx +0 -202
  946. package/corpus/templates/videos/app/components/ui/dialog.tsx +0 -130
  947. package/corpus/templates/videos/app/components/ui/drawer.tsx +0 -116
  948. package/corpus/templates/videos/app/components/ui/dropdown-menu.tsx +0 -212
  949. package/corpus/templates/videos/app/components/ui/form.tsx +0 -177
  950. package/corpus/templates/videos/app/components/ui/hover-card.tsx +0 -27
  951. package/corpus/templates/videos/app/components/ui/input-otp.tsx +0 -69
  952. package/corpus/templates/videos/app/components/ui/input.tsx +0 -22
  953. package/corpus/templates/videos/app/components/ui/label.tsx +0 -24
  954. package/corpus/templates/videos/app/components/ui/menubar.tsx +0 -234
  955. package/corpus/templates/videos/app/components/ui/navigation-menu.tsx +0 -128
  956. package/corpus/templates/videos/app/components/ui/pagination.tsx +0 -121
  957. package/corpus/templates/videos/app/components/ui/popover.tsx +0 -44
  958. package/corpus/templates/videos/app/components/ui/progress.tsx +0 -26
  959. package/corpus/templates/videos/app/components/ui/radio-group.tsx +0 -42
  960. package/corpus/templates/videos/app/components/ui/resizable.tsx +0 -43
  961. package/corpus/templates/videos/app/components/ui/scroll-area.tsx +0 -46
  962. package/corpus/templates/videos/app/components/ui/select.tsx +0 -158
  963. package/corpus/templates/videos/app/components/ui/separator.tsx +0 -29
  964. package/corpus/templates/videos/app/components/ui/sheet.tsx +0 -160
  965. package/corpus/templates/videos/app/components/ui/sidebar.tsx +0 -782
  966. package/corpus/templates/videos/app/components/ui/skeleton.tsx +0 -15
  967. package/corpus/templates/videos/app/components/ui/slider.tsx +0 -26
  968. package/corpus/templates/videos/app/components/ui/sonner.tsx +0 -58
  969. package/corpus/templates/videos/app/components/ui/spinner.tsx +0 -17
  970. package/corpus/templates/videos/app/components/ui/switch.tsx +0 -27
  971. package/corpus/templates/videos/app/components/ui/table.tsx +0 -117
  972. package/corpus/templates/videos/app/components/ui/tabs.tsx +0 -53
  973. package/corpus/templates/videos/app/components/ui/textarea.tsx +0 -23
  974. package/corpus/templates/videos/app/components/ui/toast.tsx +0 -127
  975. package/corpus/templates/videos/app/components/ui/toaster.tsx +0 -33
  976. package/corpus/templates/videos/app/components/ui/toggle-group.tsx +0 -59
  977. package/corpus/templates/videos/app/components/ui/toggle.tsx +0 -43
  978. package/corpus/templates/videos/app/components/ui/tooltip.tsx +0 -30
  979. package/corpus/templates/videos/app/components/ui/use-toast.ts +0 -3
  980. package/corpus/templates/videos/app/config/constants.ts +0 -204
  981. package/corpus/templates/videos/app/contexts/CompositionContext.tsx +0 -437
  982. package/corpus/templates/videos/app/contexts/CurrentElementContext.tsx +0 -247
  983. package/corpus/templates/videos/app/contexts/PlaybackContext.tsx +0 -65
  984. package/corpus/templates/videos/app/contexts/TimelineContext.tsx +0 -433
  985. package/corpus/templates/videos/app/entry.client.tsx +0 -19
  986. package/corpus/templates/videos/app/entry.server.tsx +0 -10
  987. package/corpus/templates/videos/app/global.css +0 -171
  988. package/corpus/templates/videos/app/hooks/use-composition-collab.ts +0 -269
  989. package/corpus/templates/videos/app/hooks/use-composition-design-system.ts +0 -47
  990. package/corpus/templates/videos/app/hooks/use-database-compositions.ts +0 -144
  991. package/corpus/templates/videos/app/hooks/use-db-status.ts +0 -30
  992. package/corpus/templates/videos/app/hooks/use-design-systems.ts +0 -21
  993. package/corpus/templates/videos/app/hooks/use-folders.ts +0 -199
  994. package/corpus/templates/videos/app/hooks/use-mobile.tsx +0 -21
  995. package/corpus/templates/videos/app/hooks/use-navigation-state.ts +0 -52
  996. package/corpus/templates/videos/app/hooks/use-question-flow.ts +0 -14
  997. package/corpus/templates/videos/app/hooks/use-toast.ts +0 -188
  998. package/corpus/templates/videos/app/hooks/useUnsavedChanges.ts +0 -48
  999. package/corpus/templates/videos/app/i18n/ar-SA.ts +0 -446
  1000. package/corpus/templates/videos/app/i18n/de-DE.ts +0 -470
  1001. package/corpus/templates/videos/app/i18n/en-US.ts +0 -452
  1002. package/corpus/templates/videos/app/i18n/es-ES.ts +0 -468
  1003. package/corpus/templates/videos/app/i18n/fr-FR.ts +0 -469
  1004. package/corpus/templates/videos/app/i18n/hi-IN.ts +0 -446
  1005. package/corpus/templates/videos/app/i18n/index.ts +0 -34
  1006. package/corpus/templates/videos/app/i18n/ja-JP.ts +0 -460
  1007. package/corpus/templates/videos/app/i18n/ko-KR.ts +0 -453
  1008. package/corpus/templates/videos/app/i18n/pt-BR.ts +0 -461
  1009. package/corpus/templates/videos/app/i18n/zh-CN.ts +0 -437
  1010. package/corpus/templates/videos/app/i18n/zh-TW.ts +0 -437
  1011. package/corpus/templates/videos/app/lib/database-compositions.ts +0 -67
  1012. package/corpus/templates/videos/app/lib/design-systems.ts +0 -234
  1013. package/corpus/templates/videos/app/lib/tab-id.ts +0 -1
  1014. package/corpus/templates/videos/app/lib/utils.ts +0 -1
  1015. package/corpus/templates/videos/app/pages/ComponentLibrary.tsx +0 -134
  1016. package/corpus/templates/videos/app/pages/ComponentLibraryView.tsx +0 -362
  1017. package/corpus/templates/videos/app/pages/CompositionView.tsx +0 -715
  1018. package/corpus/templates/videos/app/pages/DesignSystems.tsx +0 -180
  1019. package/corpus/templates/videos/app/pages/Index.tsx +0 -258
  1020. package/corpus/templates/videos/app/pages/NewComposition.tsx +0 -95
  1021. package/corpus/templates/videos/app/pages/NotFound.tsx +0 -36
  1022. package/corpus/templates/videos/app/remotion/CameraHost.tsx +0 -223
  1023. package/corpus/templates/videos/app/remotion/animations/useElementAnimations.ts +0 -231
  1024. package/corpus/templates/videos/app/remotion/componentRegistry.ts +0 -473
  1025. package/corpus/templates/videos/app/remotion/components/AnimatedElement.tsx +0 -436
  1026. package/corpus/templates/videos/app/remotion/components/InteractiveElement.tsx +0 -159
  1027. package/corpus/templates/videos/app/remotion/components/InteractiveZoneEditor.tsx +0 -273
  1028. package/corpus/templates/videos/app/remotion/compositions/BlankComposition.tsx +0 -204
  1029. package/corpus/templates/videos/app/remotion/compositions/index.ts +0 -2
  1030. package/corpus/templates/videos/app/remotion/createComponentCursorTrack.ts +0 -132
  1031. package/corpus/templates/videos/app/remotion/docs/CURSOR_TRACKS.md +0 -285
  1032. package/corpus/templates/videos/app/remotion/easingFunctions.ts +0 -255
  1033. package/corpus/templates/videos/app/remotion/hooks/createInteractiveComposition.tsx +0 -283
  1034. package/corpus/templates/videos/app/remotion/hooks/useCursorHistory.ts +0 -72
  1035. package/corpus/templates/videos/app/remotion/hooks/useCursorTypeFromHover.ts +0 -35
  1036. package/corpus/templates/videos/app/remotion/hooks/useEditableZones.tsx +0 -267
  1037. package/corpus/templates/videos/app/remotion/hooks/useHoverAnimation.ts +0 -90
  1038. package/corpus/templates/videos/app/remotion/hooks/useHoverAnimationSmooth.ts +0 -146
  1039. package/corpus/templates/videos/app/remotion/hooks/useInteractiveComponent.ts +0 -711
  1040. package/corpus/templates/videos/app/remotion/hooks/useRegisterInteractiveElement.ts +0 -56
  1041. package/corpus/templates/videos/app/remotion/library-components/Button.tsx +0 -252
  1042. package/corpus/templates/videos/app/remotion/library-components/Card.tsx +0 -241
  1043. package/corpus/templates/videos/app/remotion/library-components/CodePanel.tsx +0 -1005
  1044. package/corpus/templates/videos/app/remotion/library-components/FileItem.tsx +0 -196
  1045. package/corpus/templates/videos/app/remotion/library-components/FolderItem.tsx +0 -199
  1046. package/corpus/templates/videos/app/remotion/library-components/PrimaryButton.tsx +0 -177
  1047. package/corpus/templates/videos/app/remotion/library-components/SecondaryButton.tsx +0 -167
  1048. package/corpus/templates/videos/app/remotion/library-components/SectionHeader.tsx +0 -108
  1049. package/corpus/templates/videos/app/remotion/library-components/TEMPLATE.tsx +0 -211
  1050. package/corpus/templates/videos/app/remotion/library-components/index.ts +0 -10
  1051. package/corpus/templates/videos/app/remotion/registry.ts +0 -91
  1052. package/corpus/templates/videos/app/remotion/testing/animationTestUtils.ts +0 -366
  1053. package/corpus/templates/videos/app/remotion/trackAnimation.ts +0 -179
  1054. package/corpus/templates/videos/app/remotion/trackHelpers.ts +0 -110
  1055. package/corpus/templates/videos/app/remotion/ui-components/Cursor.tsx +0 -182
  1056. package/corpus/templates/videos/app/remotion/ui-components/InteractiveButton.tsx +0 -116
  1057. package/corpus/templates/videos/app/remotion/ui-components/InteractiveCard.tsx +0 -126
  1058. package/corpus/templates/videos/app/remotion/ui-components/index.ts +0 -16
  1059. package/corpus/templates/videos/app/remotion/utils/animationHelpers.ts +0 -444
  1060. package/corpus/templates/videos/app/remotion/utils/interactiveElements.ts +0 -235
  1061. package/corpus/templates/videos/app/remotion/utils/springAnimation.ts +0 -76
  1062. package/corpus/templates/videos/app/root.tsx +0 -165
  1063. package/corpus/templates/videos/app/routes/$.tsx +0 -10
  1064. package/corpus/templates/videos/app/routes/_index.tsx +0 -25
  1065. package/corpus/templates/videos/app/routes/c.$compositionId.tsx +0 -10
  1066. package/corpus/templates/videos/app/routes/components.tsx +0 -10
  1067. package/corpus/templates/videos/app/routes/design-systems.tsx +0 -10
  1068. package/corpus/templates/videos/app/routes/extensions.$id.$slug.tsx +0 -2
  1069. package/corpus/templates/videos/app/routes/extensions.$id.tsx +0 -5
  1070. package/corpus/templates/videos/app/routes/extensions._index.tsx +0 -5
  1071. package/corpus/templates/videos/app/routes/extensions.tsx +0 -5
  1072. package/corpus/templates/videos/app/routes/settings.tsx +0 -88
  1073. package/corpus/templates/videos/app/routes/team.tsx +0 -11
  1074. package/corpus/templates/videos/app/routes.ts +0 -4
  1075. package/corpus/templates/videos/app/state.ts +0 -77
  1076. package/corpus/templates/videos/app/types/elementAnimations.ts +0 -121
  1077. package/corpus/templates/videos/app/types.ts +0 -200
  1078. package/corpus/templates/videos/app/utils/compositionHelpers.ts +0 -445
  1079. package/corpus/templates/videos/app/utils/debug.ts +0 -63
  1080. package/corpus/templates/videos/app/utils/keyframeUtils.ts +0 -331
  1081. package/corpus/templates/videos/app/utils/timelineCoordinates.ts +0 -79
  1082. package/corpus/templates/videos/app/vite-env.d.ts +0 -6
  1083. package/corpus/templates/videos/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +0 -6
  1084. package/corpus/templates/videos/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +0 -6
  1085. package/corpus/templates/videos/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +0 -6
  1086. package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +0 -6
  1087. package/corpus/templates/videos/changelog/2026-06-29-video-layouts-adapt-when-the-agent-sidebar-is-open.md +0 -6
  1088. package/corpus/templates/videos/components.json +0 -20
  1089. package/corpus/templates/videos/data/sync-config.json +0 -3
  1090. package/corpus/templates/videos/docs/examples/create-composition.example.ts +0 -128
  1091. package/corpus/templates/videos/drizzle.config.ts +0 -3
  1092. package/corpus/templates/videos/learnings.defaults.md +0 -5
  1093. package/corpus/templates/videos/package.json +0 -114
  1094. package/corpus/templates/videos/public/agent-native-icon-dark.svg +0 -10
  1095. package/corpus/templates/videos/public/agent-native-icon-light.svg +0 -10
  1096. package/corpus/templates/videos/public/agent-native-logo-dark.svg +0 -21
  1097. package/corpus/templates/videos/public/agent-native-logo-light.svg +0 -21
  1098. package/corpus/templates/videos/public/favicon.svg +0 -1
  1099. package/corpus/templates/videos/public/icon-180.svg +0 -1
  1100. package/corpus/templates/videos/public/icon-192.svg +0 -1
  1101. package/corpus/templates/videos/public/icon-512.svg +0 -1
  1102. package/corpus/templates/videos/public/manifest.json +0 -21
  1103. package/corpus/templates/videos/public/placeholder.svg +0 -1
  1104. package/corpus/templates/videos/public/robots.txt +0 -14
  1105. package/corpus/templates/videos/react-router.config.ts +0 -7
  1106. package/corpus/templates/videos/server/db/index.ts +0 -37
  1107. package/corpus/templates/videos/server/db/schema.ts +0 -55
  1108. package/corpus/templates/videos/server/middleware/auth.ts +0 -15
  1109. package/corpus/templates/videos/server/plugins/agent-chat.ts +0 -29
  1110. package/corpus/templates/videos/server/plugins/auth.ts +0 -14
  1111. package/corpus/templates/videos/server/plugins/collab.ts +0 -11
  1112. package/corpus/templates/videos/server/plugins/core-routes.ts +0 -22
  1113. package/corpus/templates/videos/server/plugins/db.ts +0 -160
  1114. package/corpus/templates/videos/server/routes/[...page].get.ts +0 -5
  1115. package/corpus/templates/videos/server/routes/[...page].head.ts +0 -1
  1116. package/corpus/templates/videos/server/routes/api/save-composition-defaults.post.ts +0 -274
  1117. package/corpus/templates/videos/shared/api.ts +0 -75
  1118. package/corpus/templates/videos/ssr-entry.ts +0 -15
  1119. package/corpus/templates/videos/tsconfig.json +0 -21
  1120. package/corpus/templates/videos/vite.config.ts +0 -19
  1121. package/corpus/templates/videos/vitest.config.ts +0 -16
  1122. package/docs/content/locales/ar-SA/template-videos.mdx +0 -336
  1123. package/docs/content/locales/de-DE/template-videos.mdx +0 -336
  1124. package/docs/content/locales/es-ES/template-videos.mdx +0 -336
  1125. package/docs/content/locales/fr-FR/template-videos.mdx +0 -336
  1126. package/docs/content/locales/hi-IN/template-videos.mdx +0 -336
  1127. package/docs/content/locales/ja-JP/template-videos.mdx +0 -336
  1128. package/docs/content/locales/ko-KR/template-videos.mdx +0 -336
  1129. package/docs/content/locales/pt-BR/template-videos.mdx +0 -336
  1130. package/docs/content/locales/zh-CN/template-videos.mdx +0 -334
  1131. package/docs/content/locales/zh-TW/template-videos.mdx +0 -334
  1132. package/docs/content/template-videos.mdx +0 -332
@@ -1 +1 @@
1
- {"version":3,"file":"ydoc-manager.js","sourceRoot":"","sources":["../../src/collab/ydoc-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Server-side Yjs document manager with LRU caching and SQL persistence.\n *\n * Performance notes:\n * - `getDoc()` loads from the DB once on cache miss; subsequent calls return\n * the cached Y.Doc directly with no DB I/O.\n * - Mutations no longer call `applyStoredState()` unconditionally on every\n * write. The defensive re-read from the DB happens only inside\n * `persistMergedState` (needed for the CAS version read), not as a\n * separate SELECT before applying the new update. This removes the\n * redundant double-read that the previous implementation performed on\n * every write even on a hot cache.\n * - Compaction: when the stored blob is >4x the freshly encoded state, the\n * GC'd encoding is stored instead (removes accumulated Yjs tombstones,\n * preventing unbounded blob growth without any background jobs).\n */\n\nimport * as Y from \"yjs\";\n\nimport { emitCollabUpdate } from \"./emitter.js\";\nimport {\n applyJsonDiff,\n applyJsonPatch,\n yDocToJson,\n initYDocWithJson,\n type PatchOp,\n} from \"./json-to-yjs.js\";\nimport {\n loadYDocRecord,\n loadYDocState,\n saveYDocState,\n trySaveYDocState,\n} from \"./storage.js\";\nimport { uint8ArrayToBase64 } from \"./storage.js\";\nimport { applyTextToYDoc, initYDocWithText } from \"./text-to-yjs.js\";\nimport { searchAndReplaceInYXml, extractTextFromYXml } from \"./xml-ops.js\";\n\nconst DEFAULT_FIELD = \"content\";\nconst MAX_CACHE = 50;\n\n/**\n * Compaction ratio threshold. When the stored state byte count exceeds\n * COMPACTION_RATIO × the freshly encoded state, write the compact form\n * (strips accumulated tombstones). A value of 4 means: compact when the\n * stored blob is 4× larger than necessary.\n */\nconst COMPACTION_RATIO = 4;\n\ninterface CacheEntry {\n doc: Y.Doc;\n lastAccess: number;\n}\n\nconst _cache = new Map<string, CacheEntry>();\nconst _writeLocks = new Map<string, Promise<void>>();\n// Coalesces concurrent cache-miss loads for the same docId. Without this, two\n// simultaneous getDoc() callers both miss the cache, both build a Y.Doc and\n// apply stored state, and the second _cache.set silently orphans the first\n// doc (a memory leak that grows with concurrent read traffic).\nconst _loadLocks = new Map<string, Promise<Y.Doc>>();\n\nfunction evictIfNeeded(): void {\n if (_cache.size <= MAX_CACHE) return;\n // Evict least-recently-accessed entry\n let oldest: string | null = null;\n let oldestTime = Infinity;\n for (const [id, entry] of _cache) {\n if (entry.lastAccess < oldestTime) {\n oldestTime = entry.lastAccess;\n oldest = id;\n }\n }\n if (oldest) {\n const entry = _cache.get(oldest);\n entry?.doc.destroy();\n _cache.delete(oldest);\n }\n}\n\nasync function withDocWriteLock<T>(\n docId: string,\n fn: () => Promise<T>,\n): Promise<T> {\n const previous = _writeLocks.get(docId) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const chained = previous.catch(() => {}).then(() => current);\n _writeLocks.set(docId, chained);\n\n await previous.catch(() => {});\n try {\n return await fn();\n } finally {\n release();\n if (_writeLocks.get(docId) === chained) {\n _writeLocks.delete(docId);\n }\n }\n}\n\n/**\n * Build state to persist. If the stored blob is significantly larger than\n * the freshly encoded state, store the compact (GC'd) form instead to\n * prevent unbounded blob growth from accumulated tombstones.\n */\nfunction buildStateToStore(doc: Y.Doc, storedByteCount: number): Uint8Array {\n const encoded = Y.encodeStateAsUpdate(doc);\n if (\n storedByteCount > 0 &&\n storedByteCount > encoded.length * COMPACTION_RATIO\n ) {\n // Stored blob is much larger than needed — return the GC'd encoding.\n return encoded;\n }\n return encoded;\n}\n\n/**\n * Persist the merged doc state with CAS retry on conflict.\n *\n * REMOVED: the unconditional `applyStoredState()` that was called on every\n * write path before this function. The only DB read is the `loadYDocRecord`\n * call here — needed to get the CAS version and merge any concurrent writes\n * from OTHER processes. Within this process, the in-memory doc is already\n * up-to-date because mutations are serialized by withDocWriteLock.\n */\nasync function persistMergedState(\n docId: string,\n doc: Y.Doc,\n getTextSnapshot: () => string,\n): Promise<void> {\n for (let attempt = 0; attempt < 5; attempt++) {\n // One DB read per persist attempt. On first attempt this is the only read\n // on the write path (previously there was an unconditional second read\n // before the update was applied). On retry attempts it re-reads to get the\n // latest version after a CAS conflict.\n const latest = await loadYDocRecord(docId);\n if (latest?.state && latest.state.length > 0) {\n Y.applyUpdate(doc, latest.state);\n }\n\n const stateToStore = buildStateToStore(doc, latest?.state?.length ?? 0);\n const saved = await trySaveYDocState(\n docId,\n stateToStore,\n getTextSnapshot(),\n latest?.version ?? null,\n );\n if (saved) return;\n }\n\n // All CAS attempts failed — fall back to unconditional save.\n await saveYDocState(docId, Y.encodeStateAsUpdate(doc), getTextSnapshot());\n}\n\n/**\n * Get or load a Yjs document by ID. Creates a new empty doc if none exists.\n */\nexport async function getDoc(docId: string): Promise<Y.Doc> {\n const cached = _cache.get(docId);\n if (cached) {\n cached.lastAccess = Date.now();\n return cached.doc;\n }\n\n const inFlight = _loadLocks.get(docId);\n if (inFlight) return inFlight;\n\n const load = (async () => {\n // Re-check the cache: a concurrent writer (or loader) may have populated it\n // between our miss above and acquiring this load slot.\n const reCached = _cache.get(docId);\n if (reCached) {\n reCached.lastAccess = Date.now();\n return reCached.doc;\n }\n\n const doc = new Y.Doc();\n const stored = await loadYDocState(docId);\n if (stored && stored.length > 0) {\n Y.applyUpdate(doc, stored);\n }\n\n evictIfNeeded();\n _cache.set(docId, { doc, lastAccess: Date.now() });\n return doc;\n })();\n\n _loadLocks.set(docId, load);\n try {\n return await load;\n } finally {\n _loadLocks.delete(docId);\n }\n}\n\n/**\n * Apply a binary Yjs update (from a client) to a document.\n * Persists the result and emits a change event.\n */\nexport async function applyUpdate(\n docId: string,\n update: Uint8Array,\n requestSource?: string,\n): Promise<void> {\n return withDocWriteLock(docId, async () => {\n const doc = await getDoc(docId);\n // The cached doc is already up-to-date from the initial load or a previous\n // write in this process. No redundant applyStoredState() here — cross-\n // process writes are merged inside persistMergedState when needed.\n Y.applyUpdate(doc, update);\n\n await persistMergedState(docId, doc, () =>\n doc.getText(DEFAULT_FIELD).toString(),\n );\n\n emitCollabUpdate(docId, uint8ArrayToBase64(update), requestSource);\n });\n}\n\n/**\n * Apply a text change to a document. Computes the minimal diff and\n * converts it to Yjs operations.\n *\n * Returns the text snapshot after the update.\n */\nexport async function applyText(\n docId: string,\n newText: string,\n fieldName: string = DEFAULT_FIELD,\n requestSource?: string,\n): Promise<string> {\n return withDocWriteLock(docId, async () => {\n const doc = await getDoc(docId);\n const update = applyTextToYDoc(doc, fieldName, newText, \"server\");\n\n if (update.length === 0) {\n return doc.getText(fieldName).toString();\n }\n\n await persistMergedState(docId, doc, () =>\n doc.getText(fieldName).toString(),\n );\n\n emitCollabUpdate(docId, uint8ArrayToBase64(update), requestSource);\n return doc.getText(fieldName).toString();\n });\n}\n\n/**\n * Search-and-replace text within a Y.XmlFragment (ProseMirror tree).\n * Produces minimal Yjs operations for cursor-preserving updates.\n *\n * Returns whether the text was found and the binary update.\n */\nexport async function searchAndReplace(\n docId: string,\n find: string,\n replace: string,\n requestSource?: string,\n): Promise<{ found: boolean; update: Uint8Array }> {\n return withDocWriteLock(docId, async () => {\n const doc = await getDoc(docId);\n const fragment = doc.getXmlFragment(\"default\");\n\n // Capture the update produced by the transaction\n let update: Uint8Array = new Uint8Array(0);\n const handler = (u: Uint8Array) => {\n update = u;\n };\n doc.on(\"update\", handler);\n\n let found = false;\n doc.transact(() => {\n found = searchAndReplaceInYXml(fragment, find, replace);\n }, \"agent\");\n\n doc.off(\"update\", handler);\n\n if (!found || update.length === 0) {\n return { found: false, update: new Uint8Array(0) };\n }\n\n await persistMergedState(docId, doc, () => extractTextFromYXml(fragment));\n emitCollabUpdate(docId, uint8ArrayToBase64(update), requestSource);\n\n return { found: true, update };\n });\n}\n\n/**\n * Get the current text content of a document field.\n */\nexport async function getText(\n docId: string,\n fieldName: string = DEFAULT_FIELD,\n): Promise<string> {\n const doc = await getDoc(docId);\n return doc.getText(fieldName).toString();\n}\n\n/**\n * Get the full document state as a Uint8Array.\n */\nexport async function getState(docId: string): Promise<Uint8Array> {\n const doc = await getDoc(docId);\n return Y.encodeStateAsUpdate(doc);\n}\n\n/**\n * Get an incremental update relative to a client's state vector.\n */\nexport async function getIncUpdate(\n docId: string,\n clientStateVector: Uint8Array,\n): Promise<Uint8Array> {\n const doc = await getDoc(docId);\n return Y.encodeStateAsUpdate(doc, clientStateVector);\n}\n\n/**\n * Seed a document from existing text content (for migration).\n * Only seeds if no collab state exists yet.\n */\nexport async function seedFromText(\n docId: string,\n text: string,\n fieldName: string = DEFAULT_FIELD,\n): Promise<void> {\n return withDocWriteLock(docId, async () => {\n const existing = await loadYDocState(docId);\n if (existing && existing.length > 0) return; // Already seeded\n\n const { doc, state } = initYDocWithText(fieldName, text);\n await saveYDocState(docId, state, text);\n\n // Cache the doc\n evictIfNeeded();\n _cache.set(docId, { doc, lastAccess: Date.now() });\n });\n}\n\n// ─── Structured JSON Operations ─────────────────────────────────────\n\n/**\n * Apply a full JSON update to a document. Computes the minimal diff\n * and converts it to Yjs operations on Y.Map/Y.Array.\n */\nexport async function applyJson(\n docId: string,\n newJson: any,\n fieldName: string = \"data\",\n _type: \"map\" | \"array\" = \"map\",\n requestSource?: string,\n): Promise<void> {\n return withDocWriteLock(docId, async () => {\n const doc = await getDoc(docId);\n const update = applyJsonDiff(doc, fieldName, newJson, \"server\");\n\n if (update.length === 0) return;\n\n // Snapshot the doc's actual post-merge state, not the caller-supplied\n // `newJson` — persistMergedState may re-apply newer DB state to resolve\n // concurrent writes, so `newJson` can be stale. Matches applyPatchOps.\n await persistMergedState(docId, doc, () =>\n JSON.stringify(yDocToJson(doc, fieldName)),\n );\n\n emitCollabUpdate(docId, uint8ArrayToBase64(update), requestSource);\n });\n}\n\n/**\n * Apply surgical JSON patch operations to a document.\n */\nexport async function applyPatchOps(\n docId: string,\n ops: PatchOp[],\n fieldName: string = \"data\",\n requestSource?: string,\n): Promise<void> {\n return withDocWriteLock(docId, async () => {\n const doc = await getDoc(docId);\n const update = applyJsonPatch(doc, fieldName, ops, \"server\");\n\n if (update.length === 0) return;\n\n await persistMergedState(docId, doc, () =>\n JSON.stringify(yDocToJson(doc, fieldName)),\n );\n\n emitCollabUpdate(docId, uint8ArrayToBase64(update), requestSource);\n });\n}\n\n/**\n * Get the current JSON state of a document field.\n */\nexport async function getJson(\n docId: string,\n fieldName: string = \"data\",\n): Promise<any> {\n const doc = await getDoc(docId);\n return yDocToJson(doc, fieldName);\n}\n\n/**\n * Seed a document from existing JSON content (for migration).\n * Only seeds if no collab state exists yet.\n */\nexport async function seedFromJson(\n docId: string,\n json: any,\n fieldName: string = \"data\",\n type: \"map\" | \"array\" = \"map\",\n): Promise<void> {\n return withDocWriteLock(docId, async () => {\n const existing = await loadYDocState(docId);\n if (existing && existing.length > 0) return; // Already seeded\n\n const { doc, state } = initYDocWithJson(fieldName, json, type);\n await saveYDocState(docId, state, JSON.stringify(json));\n\n // Cache the doc\n evictIfNeeded();\n _cache.set(docId, { doc, lastAccess: Date.now() });\n });\n}\n\n/**\n * Release a document from the in-memory cache.\n */\nexport function releaseDoc(docId: string): void {\n const entry = _cache.get(docId);\n if (entry) {\n entry.doc.destroy();\n _cache.delete(docId);\n }\n}\n"]}
1
+ {"version":3,"file":"ydoc-manager.js","sourceRoot":"","sources":["../../src/collab/ydoc-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Server-side Yjs document manager with LRU caching and SQL persistence.\n *\n * Performance notes:\n * - `getDoc()` loads from the DB once on cache miss; subsequent calls return\n * the cached Y.Doc directly with no DB I/O.\n * - Mutations no longer call `applyStoredState()` unconditionally on every\n * write. The defensive re-read from the DB happens only inside\n * `persistMergedState` (needed for the CAS version read), not as a\n * separate SELECT before applying the new update. This removes the\n * redundant double-read that the previous implementation performed on\n * every write even on a hot cache.\n * - Compaction: when the stored blob is >4x the freshly encoded state, the\n * GC'd encoding is stored instead (removes accumulated Yjs tombstones,\n * preventing unbounded blob growth without any background jobs).\n */\n\nimport * as Y from \"yjs\";\n\nimport { emitCollabUpdate } from \"./emitter.js\";\nimport {\n applyJsonDiff,\n applyJsonPatch,\n yDocToJson,\n initYDocWithJson,\n type PatchOp,\n} from \"./json-to-yjs.js\";\nimport {\n loadYDocRecord,\n loadYDocState,\n saveYDocState,\n trySaveYDocState,\n} from \"./storage.js\";\nimport { uint8ArrayToBase64 } from \"./storage.js\";\nimport { applyTextToYDoc, initYDocWithText } from \"./text-to-yjs.js\";\nimport { searchAndReplaceInYXml, extractTextFromYXml } from \"./xml-ops.js\";\n\nconst DEFAULT_FIELD = \"content\";\nconst MAX_CACHE = 50;\n\n/**\n * Auto-presence: any agent-sourced write produces visible presence and\n * lingering edit attribution without the calling action having to wire\n * agentEnterDocument/agentLeaveDocument itself. Dynamic import avoids a\n * static cycle (agent-presence.ts imports searchAndReplace from this module).\n */\nfunction touchAgentPresence(\n docId: string,\n requestSource: string | undefined,\n edit: { descriptor: Record<string, unknown>; label?: string } | null,\n): void {\n if (requestSource !== \"agent\") return;\n import(\"./agent-presence.js\")\n .then((mod) => {\n mod.agentTouchDocument(docId, edit ? { edit: edit as any } : undefined);\n })\n .catch(() => {\n // Presence is best-effort; never fail the write for it.\n });\n}\n\n/**\n * Compute a small \"what changed\" descriptor from a text diff by trimming the\n * common prefix/suffix. Used for lingering edit highlights client-side.\n */\nexport function computeTextEditDescriptor(\n oldText: string,\n newText: string,\n): { kind: \"text\"; quote: string } | { kind: \"doc\" } {\n let start = 0;\n const maxStart = Math.min(oldText.length, newText.length);\n while (start < maxStart && oldText[start] === newText[start]) start++;\n\n let endOld = oldText.length;\n let endNew = newText.length;\n while (\n endOld > start &&\n endNew > start &&\n oldText[endOld - 1] === newText[endNew - 1]\n ) {\n endOld--;\n endNew--;\n }\n\n const inserted = newText.slice(start, endNew).trim();\n if (inserted.length > 0) {\n return { kind: \"text\", quote: inserted.slice(0, 120) };\n }\n return { kind: \"doc\" };\n}\n\n/**\n * Compaction ratio threshold. When the stored state byte count exceeds\n * COMPACTION_RATIO × the freshly encoded state, write the compact form\n * (strips accumulated tombstones). A value of 4 means: compact when the\n * stored blob is 4× larger than necessary.\n */\nconst COMPACTION_RATIO = 4;\n\ninterface CacheEntry {\n doc: Y.Doc;\n lastAccess: number;\n}\n\nconst _cache = new Map<string, CacheEntry>();\nconst _writeLocks = new Map<string, Promise<void>>();\n// Coalesces concurrent cache-miss loads for the same docId. Without this, two\n// simultaneous getDoc() callers both miss the cache, both build a Y.Doc and\n// apply stored state, and the second _cache.set silently orphans the first\n// doc (a memory leak that grows with concurrent read traffic).\nconst _loadLocks = new Map<string, Promise<Y.Doc>>();\n\nfunction evictIfNeeded(): void {\n if (_cache.size <= MAX_CACHE) return;\n // Evict least-recently-accessed entry\n let oldest: string | null = null;\n let oldestTime = Infinity;\n for (const [id, entry] of _cache) {\n if (entry.lastAccess < oldestTime) {\n oldestTime = entry.lastAccess;\n oldest = id;\n }\n }\n if (oldest) {\n const entry = _cache.get(oldest);\n entry?.doc.destroy();\n _cache.delete(oldest);\n }\n}\n\nasync function withDocWriteLock<T>(\n docId: string,\n fn: () => Promise<T>,\n): Promise<T> {\n const previous = _writeLocks.get(docId) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const chained = previous.catch(() => {}).then(() => current);\n _writeLocks.set(docId, chained);\n\n await previous.catch(() => {});\n try {\n return await fn();\n } finally {\n release();\n if (_writeLocks.get(docId) === chained) {\n _writeLocks.delete(docId);\n }\n }\n}\n\n/**\n * Build state to persist. If the stored blob is significantly larger than\n * the freshly encoded state, store the compact (GC'd) form instead to\n * prevent unbounded blob growth from accumulated tombstones.\n */\nfunction buildStateToStore(doc: Y.Doc, storedByteCount: number): Uint8Array {\n const encoded = Y.encodeStateAsUpdate(doc);\n if (\n storedByteCount > 0 &&\n storedByteCount > encoded.length * COMPACTION_RATIO\n ) {\n // Stored blob is much larger than needed — return the GC'd encoding.\n return encoded;\n }\n return encoded;\n}\n\n/**\n * Persist the merged doc state with CAS retry on conflict.\n *\n * REMOVED: the unconditional `applyStoredState()` that was called on every\n * write path before this function. The only DB read is the `loadYDocRecord`\n * call here — needed to get the CAS version and merge any concurrent writes\n * from OTHER processes. Within this process, the in-memory doc is already\n * up-to-date because mutations are serialized by withDocWriteLock.\n */\nasync function persistMergedState(\n docId: string,\n doc: Y.Doc,\n getTextSnapshot: () => string,\n): Promise<void> {\n for (let attempt = 0; attempt < 5; attempt++) {\n // One DB read per persist attempt. On first attempt this is the only read\n // on the write path (previously there was an unconditional second read\n // before the update was applied). On retry attempts it re-reads to get the\n // latest version after a CAS conflict.\n const latest = await loadYDocRecord(docId);\n if (latest?.state && latest.state.length > 0) {\n Y.applyUpdate(doc, latest.state);\n }\n\n const stateToStore = buildStateToStore(doc, latest?.state?.length ?? 0);\n const saved = await trySaveYDocState(\n docId,\n stateToStore,\n getTextSnapshot(),\n latest?.version ?? null,\n );\n if (saved) return;\n }\n\n // All CAS attempts failed — fall back to unconditional save.\n await saveYDocState(docId, Y.encodeStateAsUpdate(doc), getTextSnapshot());\n}\n\n/**\n * Get or load a Yjs document by ID. Creates a new empty doc if none exists.\n */\nexport async function getDoc(docId: string): Promise<Y.Doc> {\n const cached = _cache.get(docId);\n if (cached) {\n cached.lastAccess = Date.now();\n return cached.doc;\n }\n\n const inFlight = _loadLocks.get(docId);\n if (inFlight) return inFlight;\n\n const load = (async () => {\n // Re-check the cache: a concurrent writer (or loader) may have populated it\n // between our miss above and acquiring this load slot.\n const reCached = _cache.get(docId);\n if (reCached) {\n reCached.lastAccess = Date.now();\n return reCached.doc;\n }\n\n const doc = new Y.Doc();\n const stored = await loadYDocState(docId);\n if (stored && stored.length > 0) {\n Y.applyUpdate(doc, stored);\n }\n\n evictIfNeeded();\n _cache.set(docId, { doc, lastAccess: Date.now() });\n return doc;\n })();\n\n _loadLocks.set(docId, load);\n try {\n return await load;\n } finally {\n _loadLocks.delete(docId);\n }\n}\n\n/**\n * Apply a binary Yjs update (from a client) to a document.\n * Persists the result and emits a change event.\n */\nexport async function applyUpdate(\n docId: string,\n update: Uint8Array,\n requestSource?: string,\n): Promise<void> {\n return withDocWriteLock(docId, async () => {\n const doc = await getDoc(docId);\n // The cached doc is already up-to-date from the initial load or a previous\n // write in this process. No redundant applyStoredState() here — cross-\n // process writes are merged inside persistMergedState when needed.\n Y.applyUpdate(doc, update);\n\n await persistMergedState(docId, doc, () =>\n doc.getText(DEFAULT_FIELD).toString(),\n );\n\n emitCollabUpdate(docId, uint8ArrayToBase64(update), requestSource);\n });\n}\n\n/**\n * Apply a text change to a document. Computes the minimal diff and\n * converts it to Yjs operations.\n *\n * Returns the text snapshot after the update.\n */\nexport async function applyText(\n docId: string,\n newText: string,\n fieldName: string = DEFAULT_FIELD,\n requestSource?: string,\n): Promise<string> {\n return withDocWriteLock(docId, async () => {\n const doc = await getDoc(docId);\n const oldText = doc.getText(fieldName).toString();\n const update = applyTextToYDoc(doc, fieldName, newText, \"server\");\n\n if (update.length === 0) {\n return doc.getText(fieldName).toString();\n }\n\n await persistMergedState(docId, doc, () =>\n doc.getText(fieldName).toString(),\n );\n\n emitCollabUpdate(docId, uint8ArrayToBase64(update), requestSource);\n touchAgentPresence(docId, requestSource, {\n descriptor: computeTextEditDescriptor(oldText, newText),\n });\n return doc.getText(fieldName).toString();\n });\n}\n\n/**\n * Search-and-replace text within a Y.XmlFragment (ProseMirror tree).\n * Produces minimal Yjs operations for cursor-preserving updates.\n *\n * Returns whether the text was found and the binary update.\n */\nexport async function searchAndReplace(\n docId: string,\n find: string,\n replace: string,\n requestSource?: string,\n): Promise<{ found: boolean; update: Uint8Array }> {\n return withDocWriteLock(docId, async () => {\n const doc = await getDoc(docId);\n const fragment = doc.getXmlFragment(\"default\");\n\n // Capture the update produced by the transaction\n let update: Uint8Array = new Uint8Array(0);\n const handler = (u: Uint8Array) => {\n update = u;\n };\n doc.on(\"update\", handler);\n\n let found = false;\n doc.transact(() => {\n found = searchAndReplaceInYXml(fragment, find, replace);\n }, \"agent\");\n\n doc.off(\"update\", handler);\n\n if (!found || update.length === 0) {\n return { found: false, update: new Uint8Array(0) };\n }\n\n await persistMergedState(docId, doc, () => extractTextFromYXml(fragment));\n emitCollabUpdate(docId, uint8ArrayToBase64(update), requestSource);\n touchAgentPresence(docId, requestSource, {\n descriptor: {\n kind: \"text\",\n quote: (replace || find).slice(0, 120),\n },\n });\n\n return { found: true, update };\n });\n}\n\n/**\n * Get the current text content of a document field.\n */\nexport async function getText(\n docId: string,\n fieldName: string = DEFAULT_FIELD,\n): Promise<string> {\n const doc = await getDoc(docId);\n return doc.getText(fieldName).toString();\n}\n\n/**\n * Get the full document state as a Uint8Array.\n */\nexport async function getState(docId: string): Promise<Uint8Array> {\n const doc = await getDoc(docId);\n return Y.encodeStateAsUpdate(doc);\n}\n\n/**\n * Get an incremental update relative to a client's state vector.\n */\nexport async function getIncUpdate(\n docId: string,\n clientStateVector: Uint8Array,\n): Promise<Uint8Array> {\n const doc = await getDoc(docId);\n return Y.encodeStateAsUpdate(doc, clientStateVector);\n}\n\n/**\n * Seed a document from existing text content (for migration).\n * Only seeds if no collab state exists yet.\n */\nexport async function seedFromText(\n docId: string,\n text: string,\n fieldName: string = DEFAULT_FIELD,\n): Promise<void> {\n return withDocWriteLock(docId, async () => {\n const existing = await loadYDocState(docId);\n if (existing && existing.length > 0) return; // Already seeded\n\n const { doc, state } = initYDocWithText(fieldName, text);\n await saveYDocState(docId, state, text);\n\n // Cache the doc\n evictIfNeeded();\n _cache.set(docId, { doc, lastAccess: Date.now() });\n });\n}\n\n// ─── Structured JSON Operations ─────────────────────────────────────\n\n/**\n * Apply a full JSON update to a document. Computes the minimal diff\n * and converts it to Yjs operations on Y.Map/Y.Array.\n */\nexport async function applyJson(\n docId: string,\n newJson: any,\n fieldName: string = \"data\",\n _type: \"map\" | \"array\" = \"map\",\n requestSource?: string,\n): Promise<void> {\n return withDocWriteLock(docId, async () => {\n const doc = await getDoc(docId);\n const update = applyJsonDiff(doc, fieldName, newJson, \"server\");\n\n if (update.length === 0) return;\n\n // Snapshot the doc's actual post-merge state, not the caller-supplied\n // `newJson` — persistMergedState may re-apply newer DB state to resolve\n // concurrent writes, so `newJson` can be stale. Matches applyPatchOps.\n await persistMergedState(docId, doc, () =>\n JSON.stringify(yDocToJson(doc, fieldName)),\n );\n\n emitCollabUpdate(docId, uint8ArrayToBase64(update), requestSource);\n touchAgentPresence(docId, requestSource, { descriptor: { kind: \"doc\" } });\n });\n}\n\n/**\n * Apply surgical JSON patch operations to a document.\n */\nexport async function applyPatchOps(\n docId: string,\n ops: PatchOp[],\n fieldName: string = \"data\",\n requestSource?: string,\n): Promise<void> {\n return withDocWriteLock(docId, async () => {\n const doc = await getDoc(docId);\n const update = applyJsonPatch(doc, fieldName, ops, \"server\");\n\n if (update.length === 0) return;\n\n await persistMergedState(docId, doc, () =>\n JSON.stringify(yDocToJson(doc, fieldName)),\n );\n\n emitCollabUpdate(docId, uint8ArrayToBase64(update), requestSource);\n touchAgentPresence(docId, requestSource, {\n descriptor: {\n kind: \"paths\",\n paths: ops.slice(0, 5).map((op) => op.path),\n },\n });\n });\n}\n\n/**\n * Get the current JSON state of a document field.\n */\nexport async function getJson(\n docId: string,\n fieldName: string = \"data\",\n): Promise<any> {\n const doc = await getDoc(docId);\n return yDocToJson(doc, fieldName);\n}\n\n/**\n * Seed a document from existing JSON content (for migration).\n * Only seeds if no collab state exists yet.\n */\nexport async function seedFromJson(\n docId: string,\n json: any,\n fieldName: string = \"data\",\n type: \"map\" | \"array\" = \"map\",\n): Promise<void> {\n return withDocWriteLock(docId, async () => {\n const existing = await loadYDocState(docId);\n if (existing && existing.length > 0) return; // Already seeded\n\n const { doc, state } = initYDocWithJson(fieldName, json, type);\n await saveYDocState(docId, state, JSON.stringify(json));\n\n // Cache the doc\n evictIfNeeded();\n _cache.set(docId, { doc, lastAccess: Date.now() });\n });\n}\n\n/**\n * Release a document from the in-memory cache.\n */\nexport function releaseDoc(docId: string): void {\n const entry = _cache.get(docId);\n if (entry) {\n entry.doc.destroy();\n _cache.delete(docId);\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  export type WorkspaceConnectionCapability = "search" | "import" | "messages" | "meetings" | "crm" | "code" | "docs";
2
- export type WorkspaceConnectionTemplateUse = "analytics" | "brain" | "calendar" | "clips" | "content" | "design" | "dispatch" | "forms" | "mail" | "slides" | "videos";
2
+ export type WorkspaceConnectionTemplateUse = "analytics" | "brain" | "calendar" | "clips" | "content" | "design" | "dispatch" | "forms" | "mail" | "slides";
3
3
  export type WorkspaceConnectionProviderId = "slack" | "github" | "notion" | "gmail" | "google_drive" | "hubspot" | "granola" | "clips" | "generic";
4
4
  export interface WorkspaceConnectionCredentialKey {
5
5
  key: string;
@@ -116,7 +116,7 @@ export declare const WORKSPACE_CONNECTION_PROVIDERS: readonly [{
116
116
  readonly description: "Agent-native Clips exports and recordings for transcript import and searchable meeting context.";
117
117
  readonly credentialKeys: readonly [];
118
118
  readonly capabilities: readonly ["search", "import", "meetings"];
119
- readonly recommendedTemplateUses: readonly ["brain", "clips", "videos"];
119
+ readonly recommendedTemplateUses: readonly ["brain", "clips"];
120
120
  }, {
121
121
  readonly id: "generic";
122
122
  readonly label: "Generic";
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/connections/catalog.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,6BAA6B,GACrC,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,UAAU,GACV,KAAK,GACL,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,MAAM,8BAA8B,GACtC,WAAW,GACX,OAAO,GACP,UAAU,GACV,OAAO,GACP,SAAS,GACT,QAAQ,GACR,UAAU,GACV,OAAO,GACP,MAAM,GACN,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,MAAM,6BAA6B,GACrC,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,cAAc,GACd,SAAS,GACT,SAAS,GACT,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,WAAW,gCAAgC;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,6BAA6B,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,SAAS,gCAAgC,EAAE,CAAC;IAC5D,YAAY,EAAE,SAAS,6BAA6B,EAAE,CAAC;IACvD,uBAAuB,EAAE,SAAS,8BAA8B,EAAE,CAAC;CACpE;AAED,MAAM,WAAW,uCAAuC;IACtD,UAAU,CAAC,EAAE,6BAA6B,CAAC;IAC3C,WAAW,CAAC,EAAE,8BAA8B,CAAC;CAC9C;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,CAAC,CAAC,SAAS,2BAA2B,EAC3C,QAAQ,EAAE,CAAC,GAAG,CAAC,CAEhB;AAED,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsJgB,CAAC;AAO5D,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE,uCAA4C,GACpD,2BAA2B,EAAE,CAsB/B;AAED,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,MAAM,GACT,2BAA2B,GAAG,SAAS,CAGzC;AAED,wBAAgB,+BAA+B,CAC7C,EAAE,EAAE,MAAM,GACT,EAAE,IAAI,6BAA6B,CAErC;AAED,wBAAgB,2CAA2C,CACzD,WAAW,EAAE,8BAA8B,GAC1C,2BAA2B,EAAE,CAE/B;AAED,wBAAgB,6CAA6C,CAC3D,UAAU,EAAE,6BAA6B,GACxC,2BAA2B,EAAE,CAE/B;AAED,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,2BAA2B,GAAG,MAAM,EAClD,UAAU,EAAE,6BAA6B,GACxC,OAAO,CAMT"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/connections/catalog.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,6BAA6B,GACrC,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,UAAU,GACV,KAAK,GACL,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,MAAM,8BAA8B,GACtC,WAAW,GACX,OAAO,GACP,UAAU,GACV,OAAO,GACP,SAAS,GACT,QAAQ,GACR,UAAU,GACV,OAAO,GACP,MAAM,GACN,QAAQ,CAAC;AAEb,MAAM,MAAM,6BAA6B,GACrC,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,cAAc,GACd,SAAS,GACT,SAAS,GACT,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,WAAW,gCAAgC;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,6BAA6B,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,SAAS,gCAAgC,EAAE,CAAC;IAC5D,YAAY,EAAE,SAAS,6BAA6B,EAAE,CAAC;IACvD,uBAAuB,EAAE,SAAS,8BAA8B,EAAE,CAAC;CACpE;AAED,MAAM,WAAW,uCAAuC;IACtD,UAAU,CAAC,EAAE,6BAA6B,CAAC;IAC3C,WAAW,CAAC,EAAE,8BAA8B,CAAC;CAC9C;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,CAAC,CAAC,SAAS,2BAA2B,EAC3C,QAAQ,EAAE,CAAC,GAAG,CAAC,CAEhB;AAED,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsJgB,CAAC;AAO5D,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE,uCAA4C,GACpD,2BAA2B,EAAE,CAsB/B;AAED,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,MAAM,GACT,2BAA2B,GAAG,SAAS,CAGzC;AAED,wBAAgB,+BAA+B,CAC7C,EAAE,EAAE,MAAM,GACT,EAAE,IAAI,6BAA6B,CAErC;AAED,wBAAgB,2CAA2C,CACzD,WAAW,EAAE,8BAA8B,GAC1C,2BAA2B,EAAE,CAE/B;AAED,wBAAgB,6CAA6C,CAC3D,UAAU,EAAE,6BAA6B,GACxC,2BAA2B,EAAE,CAE/B;AAED,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,2BAA2B,GAAG,MAAM,EAClD,UAAU,EAAE,6BAA6B,GACxC,OAAO,CAMT"}
@@ -121,7 +121,7 @@ export const WORKSPACE_CONNECTION_PROVIDERS = [
121
121
  description: "Agent-native Clips exports and recordings for transcript import and searchable meeting context.",
122
122
  credentialKeys: [],
123
123
  capabilities: ["search", "import", "meetings"],
124
- recommendedTemplateUses: ["brain", "clips", "videos"],
124
+ recommendedTemplateUses: ["brain", "clips"],
125
125
  }),
126
126
  defineWorkspaceConnectionProvider({
127
127
  id: "generic",
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/connections/catalog.ts"],"names":[],"mappings":"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","sourcesContent":["export type WorkspaceConnectionCapability =\n | \"search\"\n | \"import\"\n | \"messages\"\n | \"meetings\"\n | \"crm\"\n | \"code\"\n | \"docs\";\n\nexport type WorkspaceConnectionTemplateUse =\n | \"analytics\"\n | \"brain\"\n | \"calendar\"\n | \"clips\"\n | \"content\"\n | \"design\"\n | \"dispatch\"\n | \"forms\"\n | \"mail\"\n | \"slides\"\n | \"videos\";\n\nexport type WorkspaceConnectionProviderId =\n | \"slack\"\n | \"github\"\n | \"notion\"\n | \"gmail\"\n | \"google_drive\"\n | \"hubspot\"\n | \"granola\"\n | \"clips\"\n | \"generic\";\n\nexport interface WorkspaceConnectionCredentialKey {\n key: string;\n label: string;\n description?: string;\n required?: boolean;\n}\n\nexport interface WorkspaceConnectionProvider {\n id: WorkspaceConnectionProviderId;\n label: string;\n description: string;\n credentialKeys: readonly WorkspaceConnectionCredentialKey[];\n capabilities: readonly WorkspaceConnectionCapability[];\n recommendedTemplateUses: readonly WorkspaceConnectionTemplateUse[];\n}\n\nexport interface ListWorkspaceConnectionProvidersOptions {\n capability?: WorkspaceConnectionCapability;\n templateUse?: WorkspaceConnectionTemplateUse;\n}\n\nexport function defineWorkspaceConnectionProvider<\n const T extends WorkspaceConnectionProvider,\n>(provider: T): T {\n return provider;\n}\n\nexport const WORKSPACE_CONNECTION_PROVIDERS = [\n defineWorkspaceConnectionProvider({\n id: \"slack\",\n label: \"Slack\",\n description:\n \"Workspace conversations and channel history for company memory, support workflows, and messaging automations.\",\n credentialKeys: [\n {\n key: \"SLACK_BOT_TOKEN\",\n label: \"Slack bot token\",\n description:\n \"Bot token with the smallest channel and history scopes needed by the template.\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"messages\"],\n recommendedTemplateUses: [\"brain\", \"dispatch\", \"analytics\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"github\",\n label: \"GitHub\",\n description:\n \"Repository, issue, pull request, and code context for product memory, engineering workflows, and analytics.\",\n credentialKeys: [\n {\n key: \"GITHUB_TOKEN\",\n label: \"GitHub token\",\n description:\n \"Fine-grained token or app credential scoped to the repositories the workspace should access.\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"code\", \"docs\"],\n recommendedTemplateUses: [\"brain\", \"analytics\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"notion\",\n label: \"Notion\",\n description:\n \"Workspace docs, wikis, pages, and databases for knowledge capture and search.\",\n credentialKeys: [\n {\n key: \"NOTION_API_KEY\",\n label: \"Notion API key\",\n description:\n \"Integration secret with access to the pages or databases shared with the integration.\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"docs\"],\n recommendedTemplateUses: [\"brain\", \"content\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"gmail\",\n label: \"Gmail\",\n description:\n \"Mailbox messages and threads for search, triage, customer context, and agent replies.\",\n credentialKeys: [\n {\n key: \"GOOGLE_CLIENT_ID\",\n label: \"Google OAuth client ID\",\n required: true,\n },\n {\n key: \"GOOGLE_CLIENT_SECRET\",\n label: \"Google OAuth client secret\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"messages\"],\n recommendedTemplateUses: [\"mail\", \"brain\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"google_drive\",\n label: \"Google Drive\",\n description:\n \"Drive files, Docs, Sheets, and Slides for document search and import workflows.\",\n credentialKeys: [\n {\n key: \"GOOGLE_CLIENT_ID\",\n label: \"Google OAuth client ID\",\n required: true,\n },\n {\n key: \"GOOGLE_CLIENT_SECRET\",\n label: \"Google OAuth client secret\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"docs\"],\n recommendedTemplateUses: [\"brain\", \"content\", \"slides\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"hubspot\",\n label: \"HubSpot\",\n description:\n \"CRM records, companies, contacts, deals, and engagement history for customer-aware apps.\",\n credentialKeys: [\n {\n key: \"HUBSPOT_PRIVATE_APP_TOKEN\",\n label: \"HubSpot private app token\",\n description:\n \"Private app token scoped to the CRM objects the workspace needs.\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"crm\"],\n recommendedTemplateUses: [\"analytics\", \"brain\", \"mail\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"granola\",\n label: \"Granola\",\n description:\n \"Meeting notes and transcripts for company memory and follow-up workflows.\",\n credentialKeys: [\n {\n key: \"GRANOLA_API_KEY\",\n label: \"Granola API key\",\n description:\n \"API key for accessible team notes; templates should respect Granola's workspace visibility.\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"meetings\", \"docs\"],\n recommendedTemplateUses: [\"brain\", \"calendar\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"clips\",\n label: \"Clips\",\n description:\n \"Agent-native Clips exports and recordings for transcript import and searchable meeting context.\",\n credentialKeys: [],\n capabilities: [\"search\", \"import\", \"meetings\"],\n recommendedTemplateUses: [\"brain\", \"clips\", \"videos\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"generic\",\n label: \"Generic\",\n description:\n \"Custom webhooks, CSV exports, transcript drops, and one-off sources that do not need a first-class provider yet.\",\n credentialKeys: [],\n capabilities: [\"search\", \"import\", \"docs\"],\n recommendedTemplateUses: [\n \"brain\",\n \"analytics\",\n \"content\",\n \"dispatch\",\n \"forms\",\n ],\n }),\n] as const satisfies readonly WorkspaceConnectionProvider[];\n\nconst PROVIDERS_BY_ID = new Map<\n WorkspaceConnectionProviderId,\n WorkspaceConnectionProvider\n>(WORKSPACE_CONNECTION_PROVIDERS.map((provider) => [provider.id, provider]));\n\nexport function listWorkspaceConnectionProviders(\n options: ListWorkspaceConnectionProvidersOptions = {},\n): WorkspaceConnectionProvider[] {\n return WORKSPACE_CONNECTION_PROVIDERS.filter((provider) => {\n if (\n options.capability &&\n !includesWorkspaceConnectionCapability(\n provider.capabilities,\n options.capability,\n )\n ) {\n return false;\n }\n if (\n options.templateUse &&\n !includesWorkspaceConnectionTemplateUse(\n provider.recommendedTemplateUses,\n options.templateUse,\n )\n ) {\n return false;\n }\n return true;\n }).map((provider) => ({ ...provider }));\n}\n\nexport function getWorkspaceConnectionProvider(\n id: string,\n): WorkspaceConnectionProvider | undefined {\n const provider = PROVIDERS_BY_ID.get(id as WorkspaceConnectionProviderId);\n return provider ? { ...provider } : undefined;\n}\n\nexport function isWorkspaceConnectionProviderId(\n id: string,\n): id is WorkspaceConnectionProviderId {\n return PROVIDERS_BY_ID.has(id as WorkspaceConnectionProviderId);\n}\n\nexport function listWorkspaceConnectionProvidersForTemplate(\n templateUse: WorkspaceConnectionTemplateUse,\n): WorkspaceConnectionProvider[] {\n return listWorkspaceConnectionProviders({ templateUse });\n}\n\nexport function listWorkspaceConnectionProvidersForCapability(\n capability: WorkspaceConnectionCapability,\n): WorkspaceConnectionProvider[] {\n return listWorkspaceConnectionProviders({ capability });\n}\n\nexport function workspaceConnectionProviderSupports(\n providerOrId: WorkspaceConnectionProvider | string,\n capability: WorkspaceConnectionCapability,\n): boolean {\n const provider =\n typeof providerOrId === \"string\"\n ? getWorkspaceConnectionProvider(providerOrId)\n : providerOrId;\n return provider?.capabilities.includes(capability) ?? false;\n}\n\nfunction includesWorkspaceConnectionCapability(\n capabilities: readonly WorkspaceConnectionCapability[],\n capability: WorkspaceConnectionCapability,\n): boolean {\n return capabilities.includes(capability);\n}\n\nfunction includesWorkspaceConnectionTemplateUse(\n templateUses: readonly WorkspaceConnectionTemplateUse[],\n templateUse: WorkspaceConnectionTemplateUse,\n): boolean {\n return templateUses.includes(templateUse);\n}\n"]}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/connections/catalog.ts"],"names":[],"mappings":"AAqDA,MAAM,UAAU,iCAAiC,CAE/C,QAAW;IACX,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,iCAAiC,CAAC;QAChC,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,OAAO;QACd,WAAW,EACT,+GAA+G;QACjH,cAAc,EAAE;YACd;gBACE,GAAG,EAAE,iBAAiB;gBACtB,KAAK,EAAE,iBAAiB;gBACxB,WAAW,EACT,gFAAgF;gBAClF,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC9C,uBAAuB,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC;KAC5D,CAAC;IACF,iCAAiC,CAAC;QAChC,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,WAAW,EACT,6GAA6G;QAC/G,cAAc,EAAE;YACd;gBACE,GAAG,EAAE,cAAc;gBACnB,KAAK,EAAE,cAAc;gBACrB,WAAW,EACT,8FAA8F;gBAChG,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QAClD,uBAAuB,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC;KAC5D,CAAC;IACF,iCAAiC,CAAC;QAChC,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,WAAW,EACT,+EAA+E;QACjF,cAAc,EAAE;YACd;gBACE,GAAG,EAAE,gBAAgB;gBACrB,KAAK,EAAE,gBAAgB;gBACvB,WAAW,EACT,uFAAuF;gBACzF,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;QAC1C,uBAAuB,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC;KAC1D,CAAC;IACF,iCAAiC,CAAC;QAChC,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,OAAO;QACd,WAAW,EACT,uFAAuF;QACzF,cAAc,EAAE;YACd;gBACE,GAAG,EAAE,kBAAkB;gBACvB,KAAK,EAAE,wBAAwB;gBAC/B,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,GAAG,EAAE,sBAAsB;gBAC3B,KAAK,EAAE,4BAA4B;gBACnC,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC9C,uBAAuB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC;KACvD,CAAC;IACF,iCAAiC,CAAC;QAChC,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,iFAAiF;QACnF,cAAc,EAAE;YACd;gBACE,GAAG,EAAE,kBAAkB;gBACvB,KAAK,EAAE,wBAAwB;gBAC/B,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,GAAG,EAAE,sBAAsB;gBAC3B,KAAK,EAAE,4BAA4B;gBACnC,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;QAC1C,uBAAuB,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;KACpE,CAAC;IACF,iCAAiC,CAAC;QAChC,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,WAAW,EACT,0FAA0F;QAC5F,cAAc,EAAE;YACd;gBACE,GAAG,EAAE,2BAA2B;gBAChC,KAAK,EAAE,2BAA2B;gBAClC,WAAW,EACT,kEAAkE;gBACpE,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC;QACzC,uBAAuB,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC;KACpE,CAAC;IACF,iCAAiC,CAAC;QAChC,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,WAAW,EACT,2EAA2E;QAC7E,cAAc,EAAE;YACd;gBACE,GAAG,EAAE,iBAAiB;gBACtB,KAAK,EAAE,iBAAiB;gBACxB,WAAW,EACT,6FAA6F;gBAC/F,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC;QACtD,uBAAuB,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC;KAC3D,CAAC;IACF,iCAAiC,CAAC;QAChC,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,OAAO;QACd,WAAW,EACT,iGAAiG;QACnG,cAAc,EAAE,EAAE;QAClB,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC;QAC9C,uBAAuB,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;KAC5C,CAAC;IACF,iCAAiC,CAAC;QAChC,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,WAAW,EACT,kHAAkH;QACpH,cAAc,EAAE,EAAE;QAClB,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;QAC1C,uBAAuB,EAAE;YACvB,OAAO;YACP,WAAW;YACX,SAAS;YACT,UAAU;YACV,OAAO;SACR;KACF,CAAC;CACuD,CAAC;AAE5D,MAAM,eAAe,GAAG,IAAI,GAAG,CAG7B,8BAA8B,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AAE7E,MAAM,UAAU,gCAAgC,CAC9C,OAAO,GAA4C,EAAE;IAErD,OAAO,8BAA8B,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;QACxD,IACE,OAAO,CAAC,UAAU;YAClB,CAAC,qCAAqC,CACpC,QAAQ,CAAC,YAAY,EACrB,OAAO,CAAC,UAAU,CACnB,EACD,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IACE,OAAO,CAAC,WAAW;YACnB,CAAC,sCAAsC,CACrC,QAAQ,CAAC,uBAAuB,EAChC,OAAO,CAAC,WAAW,CACpB,EACD,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,EAAU;IAEV,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,EAAmC,CAAC,CAAC;IAC1E,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,EAAU;IAEV,OAAO,eAAe,CAAC,GAAG,CAAC,EAAmC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,2CAA2C,CACzD,WAA2C;IAE3C,OAAO,gCAAgC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,6CAA6C,CAC3D,UAAyC;IAEzC,OAAO,gCAAgC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,YAAkD,EAClD,UAAyC;IAEzC,MAAM,QAAQ,GACZ,OAAO,YAAY,KAAK,QAAQ;QAC9B,CAAC,CAAC,8BAA8B,CAAC,YAAY,CAAC;QAC9C,CAAC,CAAC,YAAY,CAAC;IACnB,OAAO,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;AAC9D,CAAC;AAED,SAAS,qCAAqC,CAC5C,YAAsD,EACtD,UAAyC;IAEzC,OAAO,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,sCAAsC,CAC7C,YAAuD,EACvD,WAA2C;IAE3C,OAAO,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["export type WorkspaceConnectionCapability =\n | \"search\"\n | \"import\"\n | \"messages\"\n | \"meetings\"\n | \"crm\"\n | \"code\"\n | \"docs\";\n\nexport type WorkspaceConnectionTemplateUse =\n | \"analytics\"\n | \"brain\"\n | \"calendar\"\n | \"clips\"\n | \"content\"\n | \"design\"\n | \"dispatch\"\n | \"forms\"\n | \"mail\"\n | \"slides\";\n\nexport type WorkspaceConnectionProviderId =\n | \"slack\"\n | \"github\"\n | \"notion\"\n | \"gmail\"\n | \"google_drive\"\n | \"hubspot\"\n | \"granola\"\n | \"clips\"\n | \"generic\";\n\nexport interface WorkspaceConnectionCredentialKey {\n key: string;\n label: string;\n description?: string;\n required?: boolean;\n}\n\nexport interface WorkspaceConnectionProvider {\n id: WorkspaceConnectionProviderId;\n label: string;\n description: string;\n credentialKeys: readonly WorkspaceConnectionCredentialKey[];\n capabilities: readonly WorkspaceConnectionCapability[];\n recommendedTemplateUses: readonly WorkspaceConnectionTemplateUse[];\n}\n\nexport interface ListWorkspaceConnectionProvidersOptions {\n capability?: WorkspaceConnectionCapability;\n templateUse?: WorkspaceConnectionTemplateUse;\n}\n\nexport function defineWorkspaceConnectionProvider<\n const T extends WorkspaceConnectionProvider,\n>(provider: T): T {\n return provider;\n}\n\nexport const WORKSPACE_CONNECTION_PROVIDERS = [\n defineWorkspaceConnectionProvider({\n id: \"slack\",\n label: \"Slack\",\n description:\n \"Workspace conversations and channel history for company memory, support workflows, and messaging automations.\",\n credentialKeys: [\n {\n key: \"SLACK_BOT_TOKEN\",\n label: \"Slack bot token\",\n description:\n \"Bot token with the smallest channel and history scopes needed by the template.\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"messages\"],\n recommendedTemplateUses: [\"brain\", \"dispatch\", \"analytics\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"github\",\n label: \"GitHub\",\n description:\n \"Repository, issue, pull request, and code context for product memory, engineering workflows, and analytics.\",\n credentialKeys: [\n {\n key: \"GITHUB_TOKEN\",\n label: \"GitHub token\",\n description:\n \"Fine-grained token or app credential scoped to the repositories the workspace should access.\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"code\", \"docs\"],\n recommendedTemplateUses: [\"brain\", \"analytics\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"notion\",\n label: \"Notion\",\n description:\n \"Workspace docs, wikis, pages, and databases for knowledge capture and search.\",\n credentialKeys: [\n {\n key: \"NOTION_API_KEY\",\n label: \"Notion API key\",\n description:\n \"Integration secret with access to the pages or databases shared with the integration.\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"docs\"],\n recommendedTemplateUses: [\"brain\", \"content\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"gmail\",\n label: \"Gmail\",\n description:\n \"Mailbox messages and threads for search, triage, customer context, and agent replies.\",\n credentialKeys: [\n {\n key: \"GOOGLE_CLIENT_ID\",\n label: \"Google OAuth client ID\",\n required: true,\n },\n {\n key: \"GOOGLE_CLIENT_SECRET\",\n label: \"Google OAuth client secret\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"messages\"],\n recommendedTemplateUses: [\"mail\", \"brain\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"google_drive\",\n label: \"Google Drive\",\n description:\n \"Drive files, Docs, Sheets, and Slides for document search and import workflows.\",\n credentialKeys: [\n {\n key: \"GOOGLE_CLIENT_ID\",\n label: \"Google OAuth client ID\",\n required: true,\n },\n {\n key: \"GOOGLE_CLIENT_SECRET\",\n label: \"Google OAuth client secret\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"docs\"],\n recommendedTemplateUses: [\"brain\", \"content\", \"slides\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"hubspot\",\n label: \"HubSpot\",\n description:\n \"CRM records, companies, contacts, deals, and engagement history for customer-aware apps.\",\n credentialKeys: [\n {\n key: \"HUBSPOT_PRIVATE_APP_TOKEN\",\n label: \"HubSpot private app token\",\n description:\n \"Private app token scoped to the CRM objects the workspace needs.\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"crm\"],\n recommendedTemplateUses: [\"analytics\", \"brain\", \"mail\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"granola\",\n label: \"Granola\",\n description:\n \"Meeting notes and transcripts for company memory and follow-up workflows.\",\n credentialKeys: [\n {\n key: \"GRANOLA_API_KEY\",\n label: \"Granola API key\",\n description:\n \"API key for accessible team notes; templates should respect Granola's workspace visibility.\",\n required: true,\n },\n ],\n capabilities: [\"search\", \"import\", \"meetings\", \"docs\"],\n recommendedTemplateUses: [\"brain\", \"calendar\", \"dispatch\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"clips\",\n label: \"Clips\",\n description:\n \"Agent-native Clips exports and recordings for transcript import and searchable meeting context.\",\n credentialKeys: [],\n capabilities: [\"search\", \"import\", \"meetings\"],\n recommendedTemplateUses: [\"brain\", \"clips\"],\n }),\n defineWorkspaceConnectionProvider({\n id: \"generic\",\n label: \"Generic\",\n description:\n \"Custom webhooks, CSV exports, transcript drops, and one-off sources that do not need a first-class provider yet.\",\n credentialKeys: [],\n capabilities: [\"search\", \"import\", \"docs\"],\n recommendedTemplateUses: [\n \"brain\",\n \"analytics\",\n \"content\",\n \"dispatch\",\n \"forms\",\n ],\n }),\n] as const satisfies readonly WorkspaceConnectionProvider[];\n\nconst PROVIDERS_BY_ID = new Map<\n WorkspaceConnectionProviderId,\n WorkspaceConnectionProvider\n>(WORKSPACE_CONNECTION_PROVIDERS.map((provider) => [provider.id, provider]));\n\nexport function listWorkspaceConnectionProviders(\n options: ListWorkspaceConnectionProvidersOptions = {},\n): WorkspaceConnectionProvider[] {\n return WORKSPACE_CONNECTION_PROVIDERS.filter((provider) => {\n if (\n options.capability &&\n !includesWorkspaceConnectionCapability(\n provider.capabilities,\n options.capability,\n )\n ) {\n return false;\n }\n if (\n options.templateUse &&\n !includesWorkspaceConnectionTemplateUse(\n provider.recommendedTemplateUses,\n options.templateUse,\n )\n ) {\n return false;\n }\n return true;\n }).map((provider) => ({ ...provider }));\n}\n\nexport function getWorkspaceConnectionProvider(\n id: string,\n): WorkspaceConnectionProvider | undefined {\n const provider = PROVIDERS_BY_ID.get(id as WorkspaceConnectionProviderId);\n return provider ? { ...provider } : undefined;\n}\n\nexport function isWorkspaceConnectionProviderId(\n id: string,\n): id is WorkspaceConnectionProviderId {\n return PROVIDERS_BY_ID.has(id as WorkspaceConnectionProviderId);\n}\n\nexport function listWorkspaceConnectionProvidersForTemplate(\n templateUse: WorkspaceConnectionTemplateUse,\n): WorkspaceConnectionProvider[] {\n return listWorkspaceConnectionProviders({ templateUse });\n}\n\nexport function listWorkspaceConnectionProvidersForCapability(\n capability: WorkspaceConnectionCapability,\n): WorkspaceConnectionProvider[] {\n return listWorkspaceConnectionProviders({ capability });\n}\n\nexport function workspaceConnectionProviderSupports(\n providerOrId: WorkspaceConnectionProvider | string,\n capability: WorkspaceConnectionCapability,\n): boolean {\n const provider =\n typeof providerOrId === \"string\"\n ? getWorkspaceConnectionProvider(providerOrId)\n : providerOrId;\n return provider?.capabilities.includes(capability) ?? false;\n}\n\nfunction includesWorkspaceConnectionCapability(\n capabilities: readonly WorkspaceConnectionCapability[],\n capability: WorkspaceConnectionCapability,\n): boolean {\n return capabilities.includes(capability);\n}\n\nfunction includesWorkspaceConnectionTemplateUse(\n templateUses: readonly WorkspaceConnectionTemplateUse[],\n templateUse: WorkspaceConnectionTemplateUse,\n): boolean {\n return templateUses.includes(templateUse);\n}\n"]}
@@ -37,6 +37,28 @@ export declare function buildResilientNeonPool(pool: {
37
37
  end(): Promise<void>;
38
38
  on(event: string, listener: (...args: any[]) => void): unknown;
39
39
  }): typeof pool;
40
+ /**
41
+ * Wraps a postgres.js client so Drizzle queries on the non-Neon Postgres
42
+ * path get the same withDbTimeout + retryOnConnectionError protection as
43
+ * every other Postgres path (raw DbExec postgres.js, raw DbExec Neon, and
44
+ * the Drizzle Neon pool above). Without this, one hung query on a BYO
45
+ * Postgres deployment stalls its request forever.
46
+ *
47
+ * Drizzle's postgres-js session only calls `client.unsafe(query, params)` —
48
+ * awaited directly for row-object results or via `.values()` for row-array
49
+ * results — plus `client.begin(...)` for transactions. We interpose on
50
+ * `unsafe` with a lazy thenable that re-issues the query per retry attempt,
51
+ * and leave transactions unwrapped (same rule as the Neon wrapper: the
52
+ * driver manages the sticky connection inside `begin`).
53
+ *
54
+ * Retry-safety mirrors buildResilientNeonPool: reads retry freely on
55
+ * connection-class errors; writes retry only on CONNECT_TIMEOUT (postgres.js
56
+ * raises it before the statement is ever sent), so writes can't
57
+ * double-execute.
58
+ */
59
+ export declare function buildResilientPostgresJsClient<T extends {
60
+ unsafe(query: string, params?: any[], options?: any): any;
61
+ }>(client: T): T;
40
62
  /**
41
63
  * Neon's pooler endpoints cold-start in 5–10s. Serverless environments
42
64
  * (Netlify Functions, Vercel Edge, CF Workers) have short cold-start
@@ -1 +1 @@
1
- {"version":3,"file":"create-get-db.d.ts","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAkDzD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACxB,KAAK,CACH,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EAAE,GACX,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC;CAChE,GAAG,OAAO,IAAI,CAyFd;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAK9C;AA6HD,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,SA0HpD,cAAc,CAAC,CAAC,CAAC,CASpC"}
1
+ {"version":3,"file":"create-get-db.d.ts","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAkDzD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACxB,KAAK,CACH,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EAAE,GACX,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC;CAChE,GAAG,OAAO,IAAI,CAyFd;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,8BAA8B,CAC5C,CAAC,SAAS;IACR,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;CAC3D,EACD,MAAM,EAAE,CAAC,GAAG,CAAC,CAyDd;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAK9C;AA6HD,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,SA6HpD,cAAc,CAAC,CAAC,CAAC,CASpC"}
@@ -126,6 +126,75 @@ export function buildResilientNeonPool(pool) {
126
126
  },
127
127
  });
128
128
  }
129
+ /**
130
+ * Wraps a postgres.js client so Drizzle queries on the non-Neon Postgres
131
+ * path get the same withDbTimeout + retryOnConnectionError protection as
132
+ * every other Postgres path (raw DbExec postgres.js, raw DbExec Neon, and
133
+ * the Drizzle Neon pool above). Without this, one hung query on a BYO
134
+ * Postgres deployment stalls its request forever.
135
+ *
136
+ * Drizzle's postgres-js session only calls `client.unsafe(query, params)` —
137
+ * awaited directly for row-object results or via `.values()` for row-array
138
+ * results — plus `client.begin(...)` for transactions. We interpose on
139
+ * `unsafe` with a lazy thenable that re-issues the query per retry attempt,
140
+ * and leave transactions unwrapped (same rule as the Neon wrapper: the
141
+ * driver manages the sticky connection inside `begin`).
142
+ *
143
+ * Retry-safety mirrors buildResilientNeonPool: reads retry freely on
144
+ * connection-class errors; writes retry only on CONNECT_TIMEOUT (postgres.js
145
+ * raises it before the statement is ever sent), so writes can't
146
+ * double-execute.
147
+ */
148
+ export function buildResilientPostgresJsClient(client) {
149
+ const wrapUnsafe = (query, params, options) => {
150
+ const isRead = isSqlRead(query);
151
+ const runAttempt = (mode) => async () => {
152
+ const pending = client.unsafe(query, params, options);
153
+ return withDbTimeout("query", async () => (mode === "values" ? pending.values() : pending), dbOpTimeoutMs(), () => {
154
+ // Best-effort cancel so the timed-out statement doesn't keep
155
+ // occupying one of the (small, serverless-capped) pool slots.
156
+ try {
157
+ pending.cancel?.();
158
+ }
159
+ catch {
160
+ // ignore — cancellation is advisory
161
+ }
162
+ });
163
+ };
164
+ const execute = async (mode) => {
165
+ if (isRead)
166
+ return retryOnConnectionError(runAttempt(mode));
167
+ try {
168
+ return await runAttempt(mode)();
169
+ }
170
+ catch (err) {
171
+ // Connect timeout fires before the statement is sent → one retry is
172
+ // safe even for writes.
173
+ if (isConnectionError(err) &&
174
+ err?.code === "CONNECT_TIMEOUT") {
175
+ return runAttempt(mode)();
176
+ }
177
+ throw err;
178
+ }
179
+ };
180
+ // Lazy thenable mirroring the slice of postgres.js's PendingQuery
181
+ // surface that Drizzle uses: `await q` or `await q.values()`.
182
+ return {
183
+ then: (onFulfilled, onRejected) => execute("rows").then(onFulfilled, onRejected),
184
+ catch: (onRejected) => execute("rows").catch(onRejected),
185
+ finally: (onFinally) => execute("rows").finally(onFinally),
186
+ values: () => execute("values"),
187
+ };
188
+ };
189
+ return new Proxy(client, {
190
+ get(target, prop) {
191
+ if (prop === "unsafe")
192
+ return wrapUnsafe;
193
+ const val = target[prop];
194
+ return typeof val === "function" ? val.bind(target) : val;
195
+ },
196
+ });
197
+ }
129
198
  /**
130
199
  * Neon's pooler endpoints cold-start in 5–10s. Serverless environments
131
200
  * (Netlify Functions, Vercel Edge, CF Workers) have short cold-start
@@ -302,7 +371,7 @@ export function createGetDb(schema) {
302
371
  // concurrent frozen instances don't exhaust Neon/Postgres'
303
372
  // connection limit ("Max client connections reached").
304
373
  const client = postgres(url, pgPoolOptions(url));
305
- _db = drizzle(client, { schema });
374
+ _db = drizzle(buildResilientPostgresJsClient(client), { schema });
306
375
  });
307
376
  }
308
377
  }
@@ -312,6 +381,9 @@ export function createGetDb(schema) {
312
381
  getBetterSqliteDrizzle(),
313
382
  ]).then(([sqliteUrl, { drizzle, Database }]) => {
314
383
  const sqlite = new Database(sqliteFilenameFromUrl(sqliteUrl));
384
+ // Wait up to 10s for a concurrent writer instead of failing fast
385
+ // with SQLITE_BUSY — mirrors the raw DbExec SQLite path in client.ts.
386
+ sqlite.pragma("busy_timeout = 10000");
315
387
  sqlite.pragma("journal_mode = WAL");
316
388
  const db = drizzle(sqlite, { schema });
317
389
  _db = patchBetterSqliteTransactions(db, sqlite);
@@ -1 +1 @@
1
- {"version":3,"file":"create-get-db.js","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGtD,OAAO,EACL,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,aAAa,EACb,WAAW,EACX,yBAAyB,EACzB,aAAa,EACb,sBAAsB,EACtB,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,0EAA0E;AAC1E,IAAI,UAAgE,CAAC;AACrE,SAAS,YAAY;IACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;YACvB,MAAM,CAAC,yBAAyB,CAAC;YACjC,MAAM,CAAC,UAAU,CAAC;SACnB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,QAAQ,EAAE,KAAK,CAAC,OAAO;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,IAAI,sBAAwE,CAAC;AAC7E,SAAS,wBAAwB;IAC/B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC;YACnC,MAAM,CAAC,6BAA6B,CAAC;YACrC,MAAM,CAAC,0BAA0B,CAAC;SACnC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC,CAAC;IACN,CAAC;IACD,OAAO,sBAAsB,CAAC;AAChC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAQtC;IACC,6EAA6E;IAC7E,2EAA2E;IAC3E,oEAAoE;IACpE,MAAM,cAAc,GAAG,KAAK,EAC1B,GAAW,EACX,IAAY,EACqC,EAAE;QACnD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAE9B,MAAM,UAAU,GAAG,KAAK,IAGrB,EAAE;YACH,yEAAyE;YACzE,2EAA2E;YAC3E,IAAI,eAAe,GAAG,KAAK,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,SAAS,EACT,GAAG,EAAE,CACH,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE;gBAC7B,gEAAgE;gBAChE,2CAA2C;gBAC3C,IAAI,eAAe;oBAAE,CAAC,CAAC,OAAO,EAAE,CAAC;gBACjC,OAAO,CAAC,CAAC;YACX,CAAC,CAAC,EACJ,aAAa,EAAE,EACf,GAAG,EAAE;gBACH,eAAe,GAAG,IAAI,CAAC;YACzB,CAAC,CACF,CAAC;YAEF,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM,aAAa,GAAG,CAAC,GAAqB,EAAE,EAAE;gBAC9C,IAAI,QAAQ;oBAAE,OAAO;gBACrB,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC,CAAC;YAEF,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,OAAO,EACP,GAAG,EAAE,CACH,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAG1B,EACJ,aAAa,EAAE,EACf,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAC1B,CAAC;gBACF,aAAa,EAAE,CAAC;gBAChB,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,aAAa,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACzD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,uEAAuE;YACvE,OAAO,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAED,sEAAsE;QACtE,wEAAwE;QACxE,0EAA0E;QAC1E,mEAAmE;QACnE,oBAAoB;QACpB,IAAI,CAAC;YACH,OAAO,MAAM,UAAU,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mEAAmE;YACnE,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAK,GAAW,EAAE,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACvE,OAAO,UAAU,EAAE,CAAC;YACtB,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,uEAAuE;IACvE,2EAA2E;IAC3E,6EAA6E;IAC7E,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE;QACrB,GAAG,CAAC,MAAM,EAAE,IAAI;YACd,IAAI,IAAI,KAAK,OAAO;gBAAE,OAAO,cAAc,CAAC;YAC5C,MAAM,GAAG,GAAI,MAAc,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC5D,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,wEAAwE;IACxE,0EAA0E;IAC1E,sDAAsD;IACtD,OAAO,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,IAAI,iBAAwD,CAAC;AAC7D,SAAS,mBAAmB;IAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAClE,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC,CAAC;IACN,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,IAAI,oBAA0E,CAAC;AAC/E,SAAS,sBAAsB;IAC7B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC;YACjC,MAAM,CAAC,4BAA4B,CAAC;YACpC,MAAM,CAAC,gBAAgB,CAAC;SACzB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,QAAQ,EAAE,SAAS,CAAC,OAAO;SAC5B,CAAC,CAAC,CAAC;IACN,CAAC;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,6BAA6B,CAEpC,EAAM,EAAE,MAA+D;IACvE,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,SAAS,oBAAoB,CAC3B,mBAA4C;QAE5C,OAAO,KAAK,UAAU,gBAAgB,CACpC,EAA4B;YAE5B,wEAAwE;YACxE,sEAAsE;YACtE,qEAAqE;YACrE,4DAA4D;YAC5D,IAAI,UAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,mBAAmB,CAAC,CAAC,EAAW,EAAE,EAAE;oBAClC,UAAU,GAAG,EAAE,CAAC;oBAChB,MAAM,WAAW,CAAC;gBACpB,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,KAAK,WAAW;oBAAE,MAAM,CAAC,CAAC;YACjC,CAAC;YAED,yEAAyE;YACzE,MAAM,EAAE,GAAG,UAAmD,CAAC;YAC/D,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;gBAC/C,EAAE,CAAC,WAAW,GAAG,oBAAoB,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;YACpC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,EAAE,GAAG,YAAY,EAAE,YAAY,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;gBACrB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC5B,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;oBACvC,QAAQ,GAAG,IAAI,CAAC;oBAChB,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,IAAI,CAAC;4BACH,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;4BAC3C,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;wBACzC,CAAC;wBAAC,MAAM,CAAC;4BACP,yDAAyD;wBAC3D,CAAC;oBACH,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC;YAED,kDAAkD;YAClD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC/B,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtB,SAAS,GAAG,IAAI,CAAC;gBACjB,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,IAAI,CAAC;wBACH,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAC1B,CAAC;oBAAC,MAAM,CAAC;wBACP,iDAAiD;oBACnD,CAAC;gBACH,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,WAAW,GAAG,oBAAoB,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,+EAA+E;AAC/E,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAEzC,MAAM,UAAU,WAAW,CAAoC,MAAS;IACtE,IAAI,GAAQ,CAAC;IACb,IAAI,QAAkC,CAAC;IAEvC,SAAS,SAAS;QAChB,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,GAAG,GAAG,cAAc,CAAC,oBAAoB,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAE7B,+DAA+D;QAC/D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;YACnC,IAAI,EAAE,EAAE,CAAC;gBACP,GAAG,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAiC,CAAC;gBAChE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChC,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,QAAQ,GAAG,iBAAiB,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBACxD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;gBAC1C,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3B,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,QAAQ,GAAG,wBAAwB,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;oBAC/D,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC;wBACvB,gBAAgB,EAAE,GAAG;wBACrB,GAAG,EAAE,WAAW,EAAE;qBACnB,CAAC,CAAC;oBACH,yBAAyB,CAAC,OAAO,CAAC,CAAC;oBACnC,qEAAqE;oBACrE,oEAAoE;oBACpE,qEAAqE;oBACrE,+DAA+D;oBAC/D,MAAM,IAAI,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;oBAC7C,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBAClC,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;oBACvD,+DAA+D;oBAC/D,2DAA2D;oBAC3D,uDAAuD;oBACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;oBACjD,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpC,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;gBACrB,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACpE,sBAAsB,EAAE;aACzB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE;gBAC7C,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC9D,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACpC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBACvC,GAAG,GAAG,6BAA6B,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,mBAAmB,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;gBACpD,GAAG,GAAG,OAAO,CAAC;oBACZ,UAAU,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,oBAAoB,EAAE,EAAE;oBACtD,MAAM;iBACP,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;;OAOG;IACH,SAAS,eAAe,CACtB,KAAmB,EACnB,KAAqD;QAErD,OAAO,IAAI,KAAK,CAAC,cAAa,CAAQ,EAAE;YACtC,GAAG,CAAC,OAAO,EAAE,IAAI;gBACf,gDAAgD;gBAChD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;wBAC9B,IAAI,MAAM,GAAQ,GAAG,CAAC;wBACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;4BACzB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BAC9B,MAAM;gCACJ,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;wBACnE,CAAC;wBACD,OAAO,MAAM,CAAC;oBAChB,CAAC,CAAC,CAAC;oBACH,OAAQ,OAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC9C,CAAC;gBACD,mEAAmE;gBACnE,oEAAoE;gBACpE,OAAO,eAAe,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI;gBAC3B,yEAAyE;gBACzE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzC,OAAO,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC1C,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,SAAS,KAAK;QACZ,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QACpB,SAAS,EAAE,CAAC;QACZ,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QAEpB,OAAO,eAAe,CAAC,QAAS,EAAE,EAAE,CAAsB,CAAC;IAC7D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { drizzle as drizzleD1 } from \"drizzle-orm/d1\";\nimport type { LibSQLDatabase } from \"drizzle-orm/libsql\";\n\nimport {\n getDialect,\n getDatabaseUrl,\n getDatabaseAuthToken,\n isLocalSqliteUrl,\n isPgliteUrl,\n isConnectionError,\n getPgliteClient,\n loadPgliteDrizzle,\n prepareLocalSqliteUrl,\n sqliteFilenameFromUrl,\n pgPoolOptions,\n neonPoolMax,\n attachNeonPoolErrorLogger,\n withDbTimeout,\n retryOnConnectionError,\n dbOpTimeoutMs,\n} from \"./client.js\";\n\n// Lazy driver loaders — cached promises so dynamic import only runs once.\nlet _pgDrizzle: Promise<{ drizzle: any; postgres: any }> | undefined;\nfunction getPgDrizzle() {\n if (!_pgDrizzle) {\n _pgDrizzle = Promise.all([\n import(\"drizzle-orm/postgres-js\"),\n import(\"postgres\"),\n ]).then(([drizzleMod, pgMod]) => ({\n drizzle: drizzleMod.drizzle,\n postgres: pgMod.default,\n }));\n }\n return _pgDrizzle;\n}\n\nlet _neonServerlessDrizzle: Promise<{ drizzle: any; Pool: any }> | undefined;\nfunction getNeonServerlessDrizzle() {\n if (!_neonServerlessDrizzle) {\n _neonServerlessDrizzle = Promise.all([\n import(\"drizzle-orm/neon-serverless\"),\n import(\"@neondatabase/serverless\"),\n ]).then(([drizzleMod, neonMod]) => ({\n drizzle: drizzleMod.drizzle,\n Pool: neonMod.Pool,\n }));\n }\n return _neonServerlessDrizzle;\n}\n\n/**\n * Returns true when a SQL string starts with a SELECT-class verb.\n * Used by the Neon resilience wrapper to decide retry safety:\n * - reads (SELECT) → retryable on any connection-class error\n * - writes (INSERT/UPDATE/DELETE/…) → only retryable on errors that\n * provably occurred BEFORE the statement was sent (e.g. an acquire /\n * connect timeout). Post-send write failures must propagate to the caller\n * to avoid double-execution.\n */\nexport function isSqlRead(sql: string): boolean {\n return /^\\s*(SELECT|WITH\\s)/i.test(sql);\n}\n\n/**\n * Wraps a @neondatabase/serverless Pool so every query goes through\n * the same withDbTimeout + retryOnConnectionError resilience that the\n * raw DbExec path in client.ts uses. This protects Drizzle queries\n * (which bypass DbExec) from the frozen-WebSocket failure mode documented\n * in client.ts (~lines 378–408).\n *\n * Retry-safety rule (prevents double-execution on writes):\n * - Reads (SELECT / WITH …): retry freely on any connection-class error.\n * - Writes: only retry when the error occurred during connection acquire\n * (i.e. withDbTimeout \"connect\" timed out before the statement was ever\n * sent). Post-send failures on writes are rethrown immediately.\n *\n * Transactions: we do NOT wrap individual queries inside a drizzle\n * transaction — drizzle-neon-serverless manages the session itself, so\n * interposing a per-query client acquire/release would break the sticky\n * connection the transaction needs. The pool-level error logger still fires\n * on idle-client drops inside transactions.\n */\nexport function buildResilientNeonPool(pool: {\n connect(): Promise<any>;\n query(\n sql: string,\n args?: any[],\n ): Promise<{ rows: unknown[]; rowCount?: number }>;\n end(): Promise<void>;\n on(event: string, listener: (...args: any[]) => void): unknown;\n}): typeof pool {\n // Preserve all original pool methods and properties; only override `connect`\n // and `query` at the Pool level (used by drizzle's neon-serverless adapter\n // when it calls pool.query() directly, e.g. outside a transaction).\n const resilientQuery = async (\n sql: string,\n args?: any[],\n ): Promise<{ rows: unknown[]; rowCount?: number }> => {\n const isRead = isSqlRead(sql);\n\n const runAttempt = async (): Promise<{\n rows: unknown[];\n rowCount?: number;\n }> => {\n // Bound the pool.connect() acquire — a frozen Neon WebSocket stalls here\n // before the query ever starts, so a query-level timeout alone won't help.\n let acquireTimedOut = false;\n const client = await withDbTimeout(\n \"connect\",\n () =>\n pool.connect().then((c: any) => {\n // If we already gave up on this slot, immediately release it so\n // the scarce pool connection isn't leaked.\n if (acquireTimedOut) c.release();\n return c;\n }),\n dbOpTimeoutMs(),\n () => {\n acquireTimedOut = true;\n },\n );\n\n let released = false;\n const releaseClient = (err?: Error | boolean) => {\n if (released) return;\n released = true;\n client.release(err);\n };\n\n try {\n const result = await withDbTimeout(\n \"query\",\n () =>\n client.query(sql, args ?? []) as Promise<{\n rows: unknown[];\n rowCount?: number;\n }>,\n dbOpTimeoutMs(),\n () => releaseClient(true),\n );\n releaseClient();\n return result;\n } catch (err) {\n releaseClient(isConnectionError(err) ? true : undefined);\n throw err;\n }\n };\n\n if (isRead) {\n // Reads: retry on any connection-class error (safe — no side effects).\n return retryOnConnectionError(runAttempt);\n }\n\n // Writes: attempt once. If the acquire itself times out (error occurs\n // before the statement was sent), that produces a CONNECT_TIMEOUT which\n // isConnectionError() recognises → retry is safe. Any error that surfaces\n // AFTER the statement was sent must propagate immediately to avoid\n // double-execution.\n try {\n return await runAttempt();\n } catch (err) {\n // acquire-timeout fires before the statement → safe to retry once.\n if (isConnectionError(err) && (err as any)?.code === \"CONNECT_TIMEOUT\") {\n return runAttempt();\n }\n throw err;\n }\n };\n\n // Return a proxy so every pool property/method is forwarded as-is, but\n // pool.query() goes through the resilient wrapper. drizzle-neon-serverless\n // calls pool.connect() for transactions and pool.query() for simple queries.\n return new Proxy(pool, {\n get(target, prop) {\n if (prop === \"query\") return resilientQuery;\n const val = (target as any)[prop];\n return typeof val === \"function\" ? val.bind(target) : val;\n },\n });\n}\n\n/**\n * Neon's pooler endpoints cold-start in 5–10s. Serverless environments\n * (Netlify Functions, Vercel Edge, CF Workers) have short cold-start\n * budgets of their own, and `postgres-js` opens a raw TCP connection on\n * port 5432 that can't negotiate around Neon's wake-up window — every\n * request after an idle period 502s. `@neondatabase/serverless` rides\n * over WebSockets (HTTP/443 upgrade) and handles Neon wake-up\n * transparently, supports transactions, and works in every serverless\n * runtime we deploy to, so we prefer it whenever the URL points at Neon.\n */\nexport function isNeonUrl(url: string): boolean {\n // Must match neon.tech followed by port/path/query/end — include `?` so\n // URLs like `postgres://…@ep.neon.tech?sslmode=require` (no explicit port\n // or path) still route through the serverless driver.\n return /\\.neon\\.tech([:/?]|$)/.test(url);\n}\n\nlet _libsqlWebDrizzle: Promise<{ drizzle: any }> | undefined;\nfunction getLibsqlWebDrizzle() {\n if (!_libsqlWebDrizzle) {\n _libsqlWebDrizzle = import(\"drizzle-orm/libsql/web\").then((mod) => ({\n drizzle: mod.drizzle,\n }));\n }\n return _libsqlWebDrizzle;\n}\n\nlet _betterSqliteDrizzle: Promise<{ drizzle: any; Database: any }> | undefined;\nfunction getBetterSqliteDrizzle() {\n if (!_betterSqliteDrizzle) {\n _betterSqliteDrizzle = Promise.all([\n import(\"drizzle-orm/better-sqlite3\"),\n import(\"better-sqlite3\"),\n ]).then(([drizzleMod, sqliteMod]) => ({\n drizzle: drizzleMod.drizzle,\n Database: sqliteMod.default,\n }));\n }\n return _betterSqliteDrizzle;\n}\n\n/**\n * Patch a drizzle-orm/better-sqlite3 instance so that db.transaction(async …)\n * works. The native better-sqlite3 Transaction wrapper is sync-only — passing\n * an async callback throws \"Transaction function cannot return a promise\".\n *\n * This wrapper bypasses the native path by issuing raw SQL control statements\n * on the single better-sqlite3 connection, which is safe because:\n * - better-sqlite3 is single-connection (no concurrency inside one process)\n * - the framework serialises all async work through one Database instance\n *\n * Nesting: if a transaction is already open (sqlite.inTransaction === true),\n * SAVEPOINT / RELEASE / ROLLBACK TO is used instead of BEGIN / COMMIT /\n * ROLLBACK, matching drizzle's own BetterSQLiteTransaction.transaction().\n *\n * The patched transaction also patches the tx object it passes to the callback\n * so that nested async calls (tx.transaction(async …)) work recursively.\n */\nfunction patchBetterSqliteTransactions<\n DB extends { transaction: (...args: any[]) => any; session: any },\n>(db: DB, sqlite: { inTransaction: boolean; exec: (sql: string) => void }): DB {\n let savepointSeq = 0;\n\n function makeAsyncTransaction(\n originalTransaction: (...args: any[]) => any,\n ): (...args: any[]) => Promise<unknown> {\n return async function asyncTransaction(\n cb: (tx: unknown) => unknown,\n ): Promise<unknown> {\n // Extract the drizzle tx proxy synchronously — call the original with a\n // stub that captures the tx arg then immediately throws a sentinel so\n // better-sqlite3's native wrapper rolls back the stub and re-throws.\n // The sentinel is caught here and never propagates further.\n let capturedTx: unknown;\n try {\n originalTransaction((tx: unknown) => {\n capturedTx = tx;\n throw _EXTRACT_TX;\n });\n } catch (e) {\n if (e !== _EXTRACT_TX) throw e;\n }\n\n // Recursively patch the nested tx so tx.transaction(async …) also works.\n const tx = capturedTx as { transaction: (...a: any[]) => any };\n if (tx && typeof tx.transaction === \"function\") {\n tx.transaction = makeAsyncTransaction(tx.transaction.bind(tx));\n }\n\n const nested = sqlite.inTransaction;\n if (nested) {\n const sp = `sp_async_${++savepointSeq}`;\n sqlite.exec(`SAVEPOINT ${sp}`);\n let released = false;\n try {\n const result = await cb(tx);\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\n released = true;\n return result;\n } catch (err) {\n if (!released) {\n try {\n sqlite.exec(`ROLLBACK TO SAVEPOINT ${sp}`);\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\n } catch {\n /* ignore: connection may already be in an error state */\n }\n }\n throw err;\n }\n }\n\n // Top-level: BEGIN IMMEDIATE … COMMIT / ROLLBACK.\n sqlite.exec(\"BEGIN IMMEDIATE\");\n let committed = false;\n try {\n const result = await cb(tx);\n sqlite.exec(\"COMMIT\");\n committed = true;\n return result;\n } catch (err) {\n if (!committed) {\n try {\n sqlite.exec(\"ROLLBACK\");\n } catch {\n /* swallow: connection may already be unusable */\n }\n }\n throw err;\n }\n };\n }\n\n db.transaction = makeAsyncTransaction(db.transaction.bind(db));\n return db;\n}\n\n/** Sentinel thrown inside the tx-extraction stub — never escapes the catch. */\nconst _EXTRACT_TX = Symbol(\"extract-tx\");\n\nexport function createGetDb<T extends Record<string, unknown>>(schema: T) {\n let _db: any;\n let _dbReady: Promise<any> | undefined;\n\n function startInit(): Promise<any> {\n if (_dbReady) return _dbReady;\n\n const url = getDatabaseUrl(\"file:./data/app.db\");\n const dialect = getDialect();\n\n // D1 only if dialect detected it (DATABASE_URL takes priority)\n if (dialect === \"d1\") {\n const d1 = globalThis.__cf_env?.DB;\n if (d1) {\n _db = drizzleD1(d1, { schema }) as unknown as LibSQLDatabase<T>;\n _dbReady = Promise.resolve(_db);\n return _dbReady;\n }\n }\n\n if (isPgliteUrl(url)) {\n _dbReady = loadPgliteDrizzle().then(async ({ drizzle }) => {\n const client = await getPgliteClient(url);\n _db = drizzle({ client, schema });\n });\n return _dbReady;\n }\n\n if (dialect === \"postgres\") {\n if (isNeonUrl(url)) {\n _dbReady = getNeonServerlessDrizzle().then(({ drizzle, Pool }) => {\n const rawPool = new Pool({\n connectionString: url,\n max: neonPoolMax(),\n });\n attachNeonPoolErrorLogger(rawPool);\n // Wrap the pool with the resilience layer so Drizzle queries get the\n // same withDbTimeout + retryOnConnectionError protection as the raw\n // DbExec path in client.ts. Reads retry freely; writes only retry on\n // acquire-timeout (pre-send) errors to avoid double-execution.\n const pool = buildResilientNeonPool(rawPool);\n _db = drizzle(pool, { schema });\n });\n } else {\n _dbReady = getPgDrizzle().then(({ drizzle, postgres }) => {\n // pgPoolOptions caps the pool to a small size on serverless so\n // concurrent frozen instances don't exhaust Neon/Postgres'\n // connection limit (\"Max client connections reached\").\n const client = postgres(url, pgPoolOptions(url));\n _db = drizzle(client, { schema });\n });\n }\n } else if (isLocalSqliteUrl(url)) {\n _dbReady = Promise.all([\n prepareLocalSqliteUrl(url.startsWith(\"file:\") ? url : `file:${url}`),\n getBetterSqliteDrizzle(),\n ]).then(([sqliteUrl, { drizzle, Database }]) => {\n const sqlite = new Database(sqliteFilenameFromUrl(sqliteUrl));\n sqlite.pragma(\"journal_mode = WAL\");\n const db = drizzle(sqlite, { schema });\n _db = patchBetterSqliteTransactions(db, sqlite);\n });\n } else {\n _dbReady = getLibsqlWebDrizzle().then(({ drizzle }) => {\n _db = drizzle({\n connection: { url, authToken: getDatabaseAuthToken() },\n schema,\n });\n });\n }\n return _dbReady;\n }\n\n /**\n * Create a lazy proxy that records property accesses and method calls,\n * then replays them on the real DB once init completes. Supports\n * Drizzle's chained API: db.select().from(table).where(...).\n *\n * When `.then()` is called (i.e. the chain is awaited), the proxy\n * awaits _dbReady and replays the recorded chain on the real _db.\n */\n function createLazyProxy(\n ready: Promise<any>,\n chain: Array<{ prop: string | symbol; args?: any[] }>,\n ): any {\n return new Proxy(function () {} as any, {\n get(_target, prop) {\n // When awaited, replay the chain on the real db\n if (prop === \"then\" || prop === \"catch\" || prop === \"finally\") {\n const promise = ready.then(() => {\n let result: any = _db;\n for (const step of chain) {\n const val = result[step.prop];\n result =\n typeof val === \"function\" ? val.apply(result, step.args) : val;\n }\n return result;\n });\n return (promise as any)[prop].bind(promise);\n }\n // Symbol.toStringTag, Symbol.iterator, etc. — return another proxy\n // Property access (e.g. db.query) — record and return another proxy\n return createLazyProxy(ready, [...chain, { prop }]);\n },\n apply(_target, _thisArg, args) {\n // Method call (e.g. .from(table)) — record args and return another proxy\n if (chain.length === 0) return createLazyProxy(ready, []);\n const last = chain[chain.length - 1];\n const newChain = chain.slice(0, -1);\n newChain.push({ prop: last.prop, args });\n return createLazyProxy(ready, newChain);\n },\n });\n }\n\n /**\n * Get the Drizzle DB instance. Kicks off lazy init on first call.\n * If the async init hasn't completed yet, returns a lazy Proxy that\n * records the Drizzle chain (select/from/where/etc.) and replays it\n * once the DB driver finishes loading. Since callers always `await`\n * the final result, the proxy is transparent.\n */\n function getDb(): LibSQLDatabase<T> {\n if (_db) return _db;\n startInit();\n if (_db) return _db;\n\n return createLazyProxy(_dbReady!, []) as LibSQLDatabase<T>;\n }\n\n return getDb;\n}\n"]}
1
+ {"version":3,"file":"create-get-db.js","sourceRoot":"","sources":["../../src/db/create-get-db.ts"],"names":[],"mappings":"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","sourcesContent":["import { drizzle as drizzleD1 } from \"drizzle-orm/d1\";\nimport type { LibSQLDatabase } from \"drizzle-orm/libsql\";\n\nimport {\n getDialect,\n getDatabaseUrl,\n getDatabaseAuthToken,\n isLocalSqliteUrl,\n isPgliteUrl,\n isConnectionError,\n getPgliteClient,\n loadPgliteDrizzle,\n prepareLocalSqliteUrl,\n sqliteFilenameFromUrl,\n pgPoolOptions,\n neonPoolMax,\n attachNeonPoolErrorLogger,\n withDbTimeout,\n retryOnConnectionError,\n dbOpTimeoutMs,\n} from \"./client.js\";\n\n// Lazy driver loaders — cached promises so dynamic import only runs once.\nlet _pgDrizzle: Promise<{ drizzle: any; postgres: any }> | undefined;\nfunction getPgDrizzle() {\n if (!_pgDrizzle) {\n _pgDrizzle = Promise.all([\n import(\"drizzle-orm/postgres-js\"),\n import(\"postgres\"),\n ]).then(([drizzleMod, pgMod]) => ({\n drizzle: drizzleMod.drizzle,\n postgres: pgMod.default,\n }));\n }\n return _pgDrizzle;\n}\n\nlet _neonServerlessDrizzle: Promise<{ drizzle: any; Pool: any }> | undefined;\nfunction getNeonServerlessDrizzle() {\n if (!_neonServerlessDrizzle) {\n _neonServerlessDrizzle = Promise.all([\n import(\"drizzle-orm/neon-serverless\"),\n import(\"@neondatabase/serverless\"),\n ]).then(([drizzleMod, neonMod]) => ({\n drizzle: drizzleMod.drizzle,\n Pool: neonMod.Pool,\n }));\n }\n return _neonServerlessDrizzle;\n}\n\n/**\n * Returns true when a SQL string starts with a SELECT-class verb.\n * Used by the Neon resilience wrapper to decide retry safety:\n * - reads (SELECT) → retryable on any connection-class error\n * - writes (INSERT/UPDATE/DELETE/…) → only retryable on errors that\n * provably occurred BEFORE the statement was sent (e.g. an acquire /\n * connect timeout). Post-send write failures must propagate to the caller\n * to avoid double-execution.\n */\nexport function isSqlRead(sql: string): boolean {\n return /^\\s*(SELECT|WITH\\s)/i.test(sql);\n}\n\n/**\n * Wraps a @neondatabase/serverless Pool so every query goes through\n * the same withDbTimeout + retryOnConnectionError resilience that the\n * raw DbExec path in client.ts uses. This protects Drizzle queries\n * (which bypass DbExec) from the frozen-WebSocket failure mode documented\n * in client.ts (~lines 378–408).\n *\n * Retry-safety rule (prevents double-execution on writes):\n * - Reads (SELECT / WITH …): retry freely on any connection-class error.\n * - Writes: only retry when the error occurred during connection acquire\n * (i.e. withDbTimeout \"connect\" timed out before the statement was ever\n * sent). Post-send failures on writes are rethrown immediately.\n *\n * Transactions: we do NOT wrap individual queries inside a drizzle\n * transaction — drizzle-neon-serverless manages the session itself, so\n * interposing a per-query client acquire/release would break the sticky\n * connection the transaction needs. The pool-level error logger still fires\n * on idle-client drops inside transactions.\n */\nexport function buildResilientNeonPool(pool: {\n connect(): Promise<any>;\n query(\n sql: string,\n args?: any[],\n ): Promise<{ rows: unknown[]; rowCount?: number }>;\n end(): Promise<void>;\n on(event: string, listener: (...args: any[]) => void): unknown;\n}): typeof pool {\n // Preserve all original pool methods and properties; only override `connect`\n // and `query` at the Pool level (used by drizzle's neon-serverless adapter\n // when it calls pool.query() directly, e.g. outside a transaction).\n const resilientQuery = async (\n sql: string,\n args?: any[],\n ): Promise<{ rows: unknown[]; rowCount?: number }> => {\n const isRead = isSqlRead(sql);\n\n const runAttempt = async (): Promise<{\n rows: unknown[];\n rowCount?: number;\n }> => {\n // Bound the pool.connect() acquire — a frozen Neon WebSocket stalls here\n // before the query ever starts, so a query-level timeout alone won't help.\n let acquireTimedOut = false;\n const client = await withDbTimeout(\n \"connect\",\n () =>\n pool.connect().then((c: any) => {\n // If we already gave up on this slot, immediately release it so\n // the scarce pool connection isn't leaked.\n if (acquireTimedOut) c.release();\n return c;\n }),\n dbOpTimeoutMs(),\n () => {\n acquireTimedOut = true;\n },\n );\n\n let released = false;\n const releaseClient = (err?: Error | boolean) => {\n if (released) return;\n released = true;\n client.release(err);\n };\n\n try {\n const result = await withDbTimeout(\n \"query\",\n () =>\n client.query(sql, args ?? []) as Promise<{\n rows: unknown[];\n rowCount?: number;\n }>,\n dbOpTimeoutMs(),\n () => releaseClient(true),\n );\n releaseClient();\n return result;\n } catch (err) {\n releaseClient(isConnectionError(err) ? true : undefined);\n throw err;\n }\n };\n\n if (isRead) {\n // Reads: retry on any connection-class error (safe — no side effects).\n return retryOnConnectionError(runAttempt);\n }\n\n // Writes: attempt once. If the acquire itself times out (error occurs\n // before the statement was sent), that produces a CONNECT_TIMEOUT which\n // isConnectionError() recognises → retry is safe. Any error that surfaces\n // AFTER the statement was sent must propagate immediately to avoid\n // double-execution.\n try {\n return await runAttempt();\n } catch (err) {\n // acquire-timeout fires before the statement → safe to retry once.\n if (isConnectionError(err) && (err as any)?.code === \"CONNECT_TIMEOUT\") {\n return runAttempt();\n }\n throw err;\n }\n };\n\n // Return a proxy so every pool property/method is forwarded as-is, but\n // pool.query() goes through the resilient wrapper. drizzle-neon-serverless\n // calls pool.connect() for transactions and pool.query() for simple queries.\n return new Proxy(pool, {\n get(target, prop) {\n if (prop === \"query\") return resilientQuery;\n const val = (target as any)[prop];\n return typeof val === \"function\" ? val.bind(target) : val;\n },\n });\n}\n\n/**\n * Wraps a postgres.js client so Drizzle queries on the non-Neon Postgres\n * path get the same withDbTimeout + retryOnConnectionError protection as\n * every other Postgres path (raw DbExec postgres.js, raw DbExec Neon, and\n * the Drizzle Neon pool above). Without this, one hung query on a BYO\n * Postgres deployment stalls its request forever.\n *\n * Drizzle's postgres-js session only calls `client.unsafe(query, params)` —\n * awaited directly for row-object results or via `.values()` for row-array\n * results — plus `client.begin(...)` for transactions. We interpose on\n * `unsafe` with a lazy thenable that re-issues the query per retry attempt,\n * and leave transactions unwrapped (same rule as the Neon wrapper: the\n * driver manages the sticky connection inside `begin`).\n *\n * Retry-safety mirrors buildResilientNeonPool: reads retry freely on\n * connection-class errors; writes retry only on CONNECT_TIMEOUT (postgres.js\n * raises it before the statement is ever sent), so writes can't\n * double-execute.\n */\nexport function buildResilientPostgresJsClient<\n T extends {\n unsafe(query: string, params?: any[], options?: any): any;\n },\n>(client: T): T {\n const wrapUnsafe = (query: string, params?: any[], options?: any) => {\n const isRead = isSqlRead(query);\n\n const runAttempt = (mode: \"rows\" | \"values\") => async (): Promise<any> => {\n const pending = client.unsafe(query, params, options);\n return withDbTimeout(\n \"query\",\n async () => (mode === \"values\" ? pending.values() : pending),\n dbOpTimeoutMs(),\n () => {\n // Best-effort cancel so the timed-out statement doesn't keep\n // occupying one of the (small, serverless-capped) pool slots.\n try {\n pending.cancel?.();\n } catch {\n // ignore — cancellation is advisory\n }\n },\n );\n };\n\n const execute = async (mode: \"rows\" | \"values\"): Promise<any> => {\n if (isRead) return retryOnConnectionError(runAttempt(mode));\n try {\n return await runAttempt(mode)();\n } catch (err) {\n // Connect timeout fires before the statement is sent → one retry is\n // safe even for writes.\n if (\n isConnectionError(err) &&\n (err as any)?.code === \"CONNECT_TIMEOUT\"\n ) {\n return runAttempt(mode)();\n }\n throw err;\n }\n };\n\n // Lazy thenable mirroring the slice of postgres.js's PendingQuery\n // surface that Drizzle uses: `await q` or `await q.values()`.\n return {\n then: (onFulfilled?: any, onRejected?: any) =>\n execute(\"rows\").then(onFulfilled, onRejected),\n catch: (onRejected?: any) => execute(\"rows\").catch(onRejected),\n finally: (onFinally?: any) => execute(\"rows\").finally(onFinally),\n values: () => execute(\"values\"),\n };\n };\n\n return new Proxy(client as any, {\n get(target, prop) {\n if (prop === \"unsafe\") return wrapUnsafe;\n const val = target[prop];\n return typeof val === \"function\" ? val.bind(target) : val;\n },\n }) as T;\n}\n\n/**\n * Neon's pooler endpoints cold-start in 5–10s. Serverless environments\n * (Netlify Functions, Vercel Edge, CF Workers) have short cold-start\n * budgets of their own, and `postgres-js` opens a raw TCP connection on\n * port 5432 that can't negotiate around Neon's wake-up window — every\n * request after an idle period 502s. `@neondatabase/serverless` rides\n * over WebSockets (HTTP/443 upgrade) and handles Neon wake-up\n * transparently, supports transactions, and works in every serverless\n * runtime we deploy to, so we prefer it whenever the URL points at Neon.\n */\nexport function isNeonUrl(url: string): boolean {\n // Must match neon.tech followed by port/path/query/end — include `?` so\n // URLs like `postgres://…@ep.neon.tech?sslmode=require` (no explicit port\n // or path) still route through the serverless driver.\n return /\\.neon\\.tech([:/?]|$)/.test(url);\n}\n\nlet _libsqlWebDrizzle: Promise<{ drizzle: any }> | undefined;\nfunction getLibsqlWebDrizzle() {\n if (!_libsqlWebDrizzle) {\n _libsqlWebDrizzle = import(\"drizzle-orm/libsql/web\").then((mod) => ({\n drizzle: mod.drizzle,\n }));\n }\n return _libsqlWebDrizzle;\n}\n\nlet _betterSqliteDrizzle: Promise<{ drizzle: any; Database: any }> | undefined;\nfunction getBetterSqliteDrizzle() {\n if (!_betterSqliteDrizzle) {\n _betterSqliteDrizzle = Promise.all([\n import(\"drizzle-orm/better-sqlite3\"),\n import(\"better-sqlite3\"),\n ]).then(([drizzleMod, sqliteMod]) => ({\n drizzle: drizzleMod.drizzle,\n Database: sqliteMod.default,\n }));\n }\n return _betterSqliteDrizzle;\n}\n\n/**\n * Patch a drizzle-orm/better-sqlite3 instance so that db.transaction(async …)\n * works. The native better-sqlite3 Transaction wrapper is sync-only — passing\n * an async callback throws \"Transaction function cannot return a promise\".\n *\n * This wrapper bypasses the native path by issuing raw SQL control statements\n * on the single better-sqlite3 connection, which is safe because:\n * - better-sqlite3 is single-connection (no concurrency inside one process)\n * - the framework serialises all async work through one Database instance\n *\n * Nesting: if a transaction is already open (sqlite.inTransaction === true),\n * SAVEPOINT / RELEASE / ROLLBACK TO is used instead of BEGIN / COMMIT /\n * ROLLBACK, matching drizzle's own BetterSQLiteTransaction.transaction().\n *\n * The patched transaction also patches the tx object it passes to the callback\n * so that nested async calls (tx.transaction(async …)) work recursively.\n */\nfunction patchBetterSqliteTransactions<\n DB extends { transaction: (...args: any[]) => any; session: any },\n>(db: DB, sqlite: { inTransaction: boolean; exec: (sql: string) => void }): DB {\n let savepointSeq = 0;\n\n function makeAsyncTransaction(\n originalTransaction: (...args: any[]) => any,\n ): (...args: any[]) => Promise<unknown> {\n return async function asyncTransaction(\n cb: (tx: unknown) => unknown,\n ): Promise<unknown> {\n // Extract the drizzle tx proxy synchronously — call the original with a\n // stub that captures the tx arg then immediately throws a sentinel so\n // better-sqlite3's native wrapper rolls back the stub and re-throws.\n // The sentinel is caught here and never propagates further.\n let capturedTx: unknown;\n try {\n originalTransaction((tx: unknown) => {\n capturedTx = tx;\n throw _EXTRACT_TX;\n });\n } catch (e) {\n if (e !== _EXTRACT_TX) throw e;\n }\n\n // Recursively patch the nested tx so tx.transaction(async …) also works.\n const tx = capturedTx as { transaction: (...a: any[]) => any };\n if (tx && typeof tx.transaction === \"function\") {\n tx.transaction = makeAsyncTransaction(tx.transaction.bind(tx));\n }\n\n const nested = sqlite.inTransaction;\n if (nested) {\n const sp = `sp_async_${++savepointSeq}`;\n sqlite.exec(`SAVEPOINT ${sp}`);\n let released = false;\n try {\n const result = await cb(tx);\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\n released = true;\n return result;\n } catch (err) {\n if (!released) {\n try {\n sqlite.exec(`ROLLBACK TO SAVEPOINT ${sp}`);\n sqlite.exec(`RELEASE SAVEPOINT ${sp}`);\n } catch {\n /* ignore: connection may already be in an error state */\n }\n }\n throw err;\n }\n }\n\n // Top-level: BEGIN IMMEDIATE … COMMIT / ROLLBACK.\n sqlite.exec(\"BEGIN IMMEDIATE\");\n let committed = false;\n try {\n const result = await cb(tx);\n sqlite.exec(\"COMMIT\");\n committed = true;\n return result;\n } catch (err) {\n if (!committed) {\n try {\n sqlite.exec(\"ROLLBACK\");\n } catch {\n /* swallow: connection may already be unusable */\n }\n }\n throw err;\n }\n };\n }\n\n db.transaction = makeAsyncTransaction(db.transaction.bind(db));\n return db;\n}\n\n/** Sentinel thrown inside the tx-extraction stub — never escapes the catch. */\nconst _EXTRACT_TX = Symbol(\"extract-tx\");\n\nexport function createGetDb<T extends Record<string, unknown>>(schema: T) {\n let _db: any;\n let _dbReady: Promise<any> | undefined;\n\n function startInit(): Promise<any> {\n if (_dbReady) return _dbReady;\n\n const url = getDatabaseUrl(\"file:./data/app.db\");\n const dialect = getDialect();\n\n // D1 only if dialect detected it (DATABASE_URL takes priority)\n if (dialect === \"d1\") {\n const d1 = globalThis.__cf_env?.DB;\n if (d1) {\n _db = drizzleD1(d1, { schema }) as unknown as LibSQLDatabase<T>;\n _dbReady = Promise.resolve(_db);\n return _dbReady;\n }\n }\n\n if (isPgliteUrl(url)) {\n _dbReady = loadPgliteDrizzle().then(async ({ drizzle }) => {\n const client = await getPgliteClient(url);\n _db = drizzle({ client, schema });\n });\n return _dbReady;\n }\n\n if (dialect === \"postgres\") {\n if (isNeonUrl(url)) {\n _dbReady = getNeonServerlessDrizzle().then(({ drizzle, Pool }) => {\n const rawPool = new Pool({\n connectionString: url,\n max: neonPoolMax(),\n });\n attachNeonPoolErrorLogger(rawPool);\n // Wrap the pool with the resilience layer so Drizzle queries get the\n // same withDbTimeout + retryOnConnectionError protection as the raw\n // DbExec path in client.ts. Reads retry freely; writes only retry on\n // acquire-timeout (pre-send) errors to avoid double-execution.\n const pool = buildResilientNeonPool(rawPool);\n _db = drizzle(pool, { schema });\n });\n } else {\n _dbReady = getPgDrizzle().then(({ drizzle, postgres }) => {\n // pgPoolOptions caps the pool to a small size on serverless so\n // concurrent frozen instances don't exhaust Neon/Postgres'\n // connection limit (\"Max client connections reached\").\n const client = postgres(url, pgPoolOptions(url));\n _db = drizzle(buildResilientPostgresJsClient(client), { schema });\n });\n }\n } else if (isLocalSqliteUrl(url)) {\n _dbReady = Promise.all([\n prepareLocalSqliteUrl(url.startsWith(\"file:\") ? url : `file:${url}`),\n getBetterSqliteDrizzle(),\n ]).then(([sqliteUrl, { drizzle, Database }]) => {\n const sqlite = new Database(sqliteFilenameFromUrl(sqliteUrl));\n // Wait up to 10s for a concurrent writer instead of failing fast\n // with SQLITE_BUSY — mirrors the raw DbExec SQLite path in client.ts.\n sqlite.pragma(\"busy_timeout = 10000\");\n sqlite.pragma(\"journal_mode = WAL\");\n const db = drizzle(sqlite, { schema });\n _db = patchBetterSqliteTransactions(db, sqlite);\n });\n } else {\n _dbReady = getLibsqlWebDrizzle().then(({ drizzle }) => {\n _db = drizzle({\n connection: { url, authToken: getDatabaseAuthToken() },\n schema,\n });\n });\n }\n return _dbReady;\n }\n\n /**\n * Create a lazy proxy that records property accesses and method calls,\n * then replays them on the real DB once init completes. Supports\n * Drizzle's chained API: db.select().from(table).where(...).\n *\n * When `.then()` is called (i.e. the chain is awaited), the proxy\n * awaits _dbReady and replays the recorded chain on the real _db.\n */\n function createLazyProxy(\n ready: Promise<any>,\n chain: Array<{ prop: string | symbol; args?: any[] }>,\n ): any {\n return new Proxy(function () {} as any, {\n get(_target, prop) {\n // When awaited, replay the chain on the real db\n if (prop === \"then\" || prop === \"catch\" || prop === \"finally\") {\n const promise = ready.then(() => {\n let result: any = _db;\n for (const step of chain) {\n const val = result[step.prop];\n result =\n typeof val === \"function\" ? val.apply(result, step.args) : val;\n }\n return result;\n });\n return (promise as any)[prop].bind(promise);\n }\n // Symbol.toStringTag, Symbol.iterator, etc. — return another proxy\n // Property access (e.g. db.query) — record and return another proxy\n return createLazyProxy(ready, [...chain, { prop }]);\n },\n apply(_target, _thisArg, args) {\n // Method call (e.g. .from(table)) — record args and return another proxy\n if (chain.length === 0) return createLazyProxy(ready, []);\n const last = chain[chain.length - 1];\n const newChain = chain.slice(0, -1);\n newChain.push({ prop: last.prop, args });\n return createLazyProxy(ready, newChain);\n },\n });\n }\n\n /**\n * Get the Drizzle DB instance. Kicks off lazy init on first call.\n * If the async init hasn't completed yet, returns a lazy Proxy that\n * records the Drizzle chain (select/from/where/etc.) and replays it\n * once the DB driver finishes loading. Since callers always `await`\n * the final result, the proxy is transparent.\n */\n function getDb(): LibSQLDatabase<T> {\n if (_db) return _db;\n startInit();\n if (_db) return _db;\n\n return createLazyProxy(_dbReady!, []) as LibSQLDatabase<T>;\n }\n\n return getDb;\n}\n"]}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Boot-time convergence for columns Drizzle's schema declares but a
3
+ * pre-existing table is missing.
4
+ *
5
+ * Lives in its own module (like `./widen-columns.js`) so stores/plugins can
6
+ * import it without every `vi.mock("../db/client.js")` test needing to stub
7
+ * it: the helper resolves `isPostgres()` / `getDbExec()` through `client.js`,
8
+ * so a test that mocks the client to SQLite makes the Postgres introspection
9
+ * path a no-op automatically.
10
+ *
11
+ * ## Why
12
+ *
13
+ * `CREATE TABLE IF NOT EXISTS` only runs the CREATE the first time a table is
14
+ * created — once it exists, adding a column to the Drizzle schema (e.g.
15
+ * `schema.ts`) does nothing to already-existing rows unless a hand-written
16
+ * `ALTER TABLE ... ADD COLUMN` migration ships alongside it. Fresh dev
17
+ * databases mask this because the CREATE always includes every declared
18
+ * column; only long-lived, pre-existing production tables are missing the
19
+ * new column. Forgetting the migration turns every query that references the
20
+ * column into a Postgres `42703 (undefined_column)` — e.g.
21
+ * `session_recordings.network_error_count`, which 500'd every
22
+ * `list-session-recordings` call.
23
+ *
24
+ * `ensureAdditiveColumns()` is belt-and-braces for that failure mode: after
25
+ * the authoritative hand-written migrations run, diff each Drizzle table's
26
+ * declared columns against the live table and additively patch any gap. It
27
+ * is NOT a replacement for migrations — it never touches indexes, data
28
+ * transforms, or existing columns, and a hand-written migration should still
29
+ * ship for every schema change. This is a safety net for the case where one
30
+ * doesn't.
31
+ *
32
+ * ## Safety rules (hard)
33
+ *
34
+ * - Additive only: never drops, renames, retypes, or otherwise touches a
35
+ * column that already exists on the live table.
36
+ * - A `NOT NULL` column is only ever added when it has a renderable default
37
+ * (so existing rows get a valid value in the same statement). If it has no
38
+ * renderable default, it is added as nullable when the Drizzle declaration
39
+ * allows null, else the column is SKIPPED entirely with a loud log line
40
+ * naming the column and the reason.
41
+ * - Only simple literal defaults are rendered: numbers, strings, booleans,
42
+ * and `sql` template defaults that stringify to one of a small allow-listed
43
+ * set of safe constants (see `renderDefaultLiteral`). Any other `sql`
44
+ * default is NOT rendered — the column is added without a `DEFAULT` (and
45
+ * without `NOT NULL`, per the rule above) rather than risk interpolating
46
+ * unsafe SQL.
47
+ * - All identifiers (table/column names) are validated against a strict
48
+ * `[A-Za-z_][A-Za-z0-9_]*` pattern and double-quoted; no value from a row or
49
+ * from user data is ever interpolated into the generated SQL.
50
+ * - If the table itself does not exist yet, this is a no-op — table creation
51
+ * owns bringing every declared column into existence for a brand-new table.
52
+ * - Idempotent and best-effort: a failure on one column is logged and does
53
+ * not abort the rest, and a total failure (e.g. `information_schema`
54
+ * unreadable) must never crash boot — the caller decides whether/how to
55
+ * surface `errors` in the returned summary.
56
+ */
57
+ import { type DbExec } from "./client.js";
58
+ export interface EnsureAdditiveColumnsLogger {
59
+ info: (message: string) => void;
60
+ warn: (message: string) => void;
61
+ error: (message: string) => void;
62
+ }
63
+ export interface EnsureAdditiveColumnsOptions {
64
+ db: DbExec;
65
+ /** Drizzle table objects (from `pgTable`/`sqliteTable`, or the dialect-agnostic `table()` helper). */
66
+ tables: unknown[];
67
+ logger?: EnsureAdditiveColumnsLogger;
68
+ }
69
+ export interface EnsureAdditiveColumnsResult {
70
+ /** `"table.column"` entries that were successfully added. */
71
+ applied: string[];
72
+ /** Declared columns that were intentionally left unpatched, with why. */
73
+ skipped: Array<{
74
+ column: string;
75
+ reason: string;
76
+ }>;
77
+ /** `"table.column"` entries whose ALTER failed unexpectedly (logged, non-fatal). */
78
+ errors: Array<{
79
+ column: string;
80
+ error: string;
81
+ }>;
82
+ }
83
+ /**
84
+ * Diff each declared Drizzle table's columns against the live database and
85
+ * additively `ALTER TABLE ... ADD COLUMN` any that are missing. See the
86
+ * module docstring for the full safety-rule contract.
87
+ *
88
+ * Call this once at boot, immediately after the authoritative hand-written
89
+ * migrations have run. Never throws — every failure path is captured in the
90
+ * returned summary instead so a boot-time caller can log-and-continue.
91
+ */
92
+ export declare function ensureAdditiveColumns(options: EnsureAdditiveColumnsOptions): Promise<EnsureAdditiveColumnsResult>;
93
+ //# sourceMappingURL=ensure-additive-columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure-additive-columns.d.ts","sourceRoot":"","sources":["../../src/db/ensure-additive-columns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAItD,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AA4BD,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,sGAAsG;IACtG,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,2BAA2B,CAAC;CACtC;AAED,MAAM,WAAW,2BAA2B;IAC1C,6DAA6D;IAC7D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yEAAyE;IACzE,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,oFAAoF;IACpF,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAiLD;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAgHtC"}