@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,18 +1,19 @@
1
1
  /**
2
- * Dev-mode database admin operations.
2
+ * Database admin operations.
3
3
  *
4
4
  * Pure, dialect-agnostic, RAW/UNSCOPED helpers backing the Supabase-Studio-like
5
5
  * DB admin. These run the FULL database with no per-user `accessFilter`
6
- * scoping they are a developer tool, gated to dev + localhost at the route
7
- * and agent-tool layers. Do NOT call these from any production-reachable
8
- * surface.
6
+ * scoping. Callers MUST gate access before invoking them. The built-in core
7
+ * route gates this to dev + localhost; production-reachable surfaces must pass
8
+ * an explicit runtime for the target database and enforce their own admin-only
9
+ * checks before reading or mutating.
9
10
  *
10
11
  * All access goes through the unified `getDbExec()` client, which uses `?`
11
12
  * placeholders (auto-converted to `$1,$2,…` for Postgres) and returns rows
12
13
  * keyed by column name. Identifiers are validated against a strict pattern and
13
14
  * always double-quoted; values are ALWAYS parameterized — never interpolated.
14
15
  */
15
- import { getDbExec, getDialect, isPostgres } from "../db/client.js";
16
+ import { getDbExec, getDialect, } from "../db/client.js";
16
17
  import { notifyActionChange } from "../server/action-change.js";
17
18
  // ---------------------------------------------------------------------------
18
19
  // Identifier validation + quoting
@@ -29,13 +30,23 @@ function assertIdent(name, kind = "identifier") {
29
30
  function quoteIdent(name) {
30
31
  return `"${assertIdent(name)}"`;
31
32
  }
32
- function dialect() {
33
- return getDialect();
33
+ function db(runtime) {
34
+ return runtime?.db ?? getDbExec();
35
+ }
36
+ function dialect(runtime) {
37
+ return (runtime?.dialect ?? getDialect());
38
+ }
39
+ function isPostgresRuntime(runtime) {
40
+ return dialect(runtime) === "postgres";
34
41
  }
35
42
  // ---------------------------------------------------------------------------
36
43
  // Notify the UI after a real mutation so polling refetches.
37
44
  // ---------------------------------------------------------------------------
38
- async function notifyDbAdminChange() {
45
+ async function notifyDbAdminChange(runtime) {
46
+ if (runtime?.notifyChange) {
47
+ await runtime.notifyChange();
48
+ return;
49
+ }
39
50
  // The UI keys on useChangeVersions(["db-admin","action"]). notifyActionChange
40
51
  // records a "db-admin" change AND a marker; the action route layer's generic
41
52
  // "action" source is covered by passing the db-admin action name through the
@@ -45,11 +56,11 @@ async function notifyDbAdminChange() {
45
56
  // ---------------------------------------------------------------------------
46
57
  // listTables
47
58
  // ---------------------------------------------------------------------------
48
- export async function listTables() {
49
- const db = getDbExec();
59
+ export async function listTables(runtime) {
60
+ const client = db(runtime);
50
61
  const summaries = [];
51
- if (isPostgres()) {
52
- const res = await db.execute(`SELECT table_name AS name, table_type AS type
62
+ if (isPostgresRuntime(runtime)) {
63
+ const res = await client.execute(`SELECT table_name AS name, table_type AS type
53
64
  FROM information_schema.tables
54
65
  WHERE table_schema = 'public'
55
66
  AND table_type IN ('BASE TABLE', 'VIEW')
@@ -60,12 +71,12 @@ export async function listTables() {
60
71
  summaries.push({
61
72
  name,
62
73
  type,
63
- rowCount: type === "view" ? null : await safeRowCount(name),
74
+ rowCount: type === "view" ? null : await safeRowCount(name, runtime),
64
75
  });
65
76
  }
66
77
  }
67
78
  else {
68
- const res = await db.execute(`SELECT name, type FROM sqlite_master
79
+ const res = await client.execute(`SELECT name, type FROM sqlite_master
69
80
  WHERE type IN ('table', 'view')
70
81
  AND name NOT LIKE 'sqlite_%'
71
82
  ORDER BY name`);
@@ -75,16 +86,16 @@ export async function listTables() {
75
86
  summaries.push({
76
87
  name,
77
88
  type,
78
- rowCount: type === "view" ? null : await safeRowCount(name),
89
+ rowCount: type === "view" ? null : await safeRowCount(name, runtime),
79
90
  });
80
91
  }
81
92
  }
82
- return { dialect: dialect(), tables: summaries };
93
+ return { dialect: dialect(runtime), tables: summaries };
83
94
  }
84
- async function safeRowCount(table) {
95
+ async function safeRowCount(table, runtime) {
85
96
  try {
86
- const db = getDbExec();
87
- const res = await db.execute(`SELECT COUNT(*) AS c FROM ${quoteIdent(table)}`);
97
+ const client = db(runtime);
98
+ const res = await client.execute(`SELECT COUNT(*) AS c FROM ${quoteIdent(table)}`);
88
99
  const c = res.rows[0]?.c;
89
100
  const n = Number(c);
90
101
  return Number.isFinite(n) ? n : null;
@@ -96,21 +107,21 @@ async function safeRowCount(table) {
96
107
  // ---------------------------------------------------------------------------
97
108
  // getTableSchema
98
109
  // ---------------------------------------------------------------------------
99
- export async function getTableSchema(table) {
110
+ export async function getTableSchema(table, runtime) {
100
111
  assertIdent(table, "table name");
101
- return isPostgres()
102
- ? getTableSchemaPostgres(table)
103
- : getTableSchemaSqlite(table);
112
+ return isPostgresRuntime(runtime)
113
+ ? getTableSchemaPostgres(table, runtime)
114
+ : getTableSchemaSqlite(table, runtime);
104
115
  }
105
- async function getTableSchemaPostgres(table) {
106
- const db = getDbExec();
107
- const typeRes = await db.execute({
116
+ async function getTableSchemaPostgres(table, runtime) {
117
+ const client = db(runtime);
118
+ const typeRes = await client.execute({
108
119
  sql: `SELECT table_type AS type FROM information_schema.tables
109
120
  WHERE table_schema = 'public' AND table_name = ?`,
110
121
  args: [table],
111
122
  });
112
123
  const type = typeRes.rows[0]?.type === "VIEW" ? "view" : "table";
113
- const colRes = await db.execute({
124
+ const colRes = await client.execute({
114
125
  sql: `SELECT
115
126
  column_name AS name,
116
127
  data_type AS type,
@@ -121,7 +132,7 @@ async function getTableSchemaPostgres(table) {
121
132
  ORDER BY ordinal_position`,
122
133
  args: [table],
123
134
  });
124
- const pkRes = await db.execute({
135
+ const pkRes = await client.execute({
125
136
  sql: `SELECT kcu.column_name AS col
126
137
  FROM information_schema.table_constraints tc
127
138
  JOIN information_schema.key_column_usage kcu
@@ -135,7 +146,7 @@ async function getTableSchemaPostgres(table) {
135
146
  });
136
147
  const primaryKey = pkRes.rows.map((r) => String(r.col));
137
148
  const pkSet = new Set(primaryKey);
138
- const fkRes = await db.execute({
149
+ const fkRes = await client.execute({
139
150
  sql: `SELECT
140
151
  kcu.column_name AS col,
141
152
  ccu.table_name AS ref_table,
@@ -157,7 +168,7 @@ async function getTableSchemaPostgres(table) {
157
168
  refTable: String(r.ref_table),
158
169
  refColumn: String(r.ref_col),
159
170
  }));
160
- const idxRes = await db.execute({
171
+ const idxRes = await client.execute({
161
172
  sql: `SELECT indexname AS name, indexdef AS def
162
173
  FROM pg_indexes
163
174
  WHERE schemaname = 'public' AND tablename = ?`,
@@ -200,17 +211,17 @@ async function getTableSchemaPostgres(table) {
200
211
  primaryKey,
201
212
  foreignKeys,
202
213
  indexes,
203
- rowCount: type === "view" ? null : await safeRowCount(table),
214
+ rowCount: type === "view" ? null : await safeRowCount(table, runtime),
204
215
  };
205
216
  }
206
- async function getTableSchemaSqlite(table) {
207
- const db = getDbExec();
208
- const typeRes = await db.execute({
217
+ async function getTableSchemaSqlite(table, runtime) {
218
+ const client = db(runtime);
219
+ const typeRes = await client.execute({
209
220
  sql: `SELECT type FROM sqlite_master WHERE name = ? AND type IN ('table','view')`,
210
221
  args: [table],
211
222
  });
212
223
  const type = typeRes.rows[0]?.type === "view" ? "view" : "table";
213
- const colRes = await db.execute(`PRAGMA table_info(${quoteIdent(table)})`);
224
+ const colRes = await client.execute(`PRAGMA table_info(${quoteIdent(table)})`);
214
225
  const columns = colRes.rows.map((r) => {
215
226
  const name = String(r.name);
216
227
  const dflt = r.dflt_value;
@@ -234,19 +245,19 @@ async function getTableSchemaSqlite(table) {
234
245
  pkCol.autoIncrement = true;
235
246
  }
236
247
  }
237
- const fkRes = await db.execute(`PRAGMA foreign_key_list(${quoteIdent(table)})`);
248
+ const fkRes = await client.execute(`PRAGMA foreign_key_list(${quoteIdent(table)})`);
238
249
  const foreignKeys = fkRes.rows.map((r) => ({
239
250
  column: String(r.from),
240
251
  refTable: String(r.table),
241
252
  refColumn: String(r.to),
242
253
  }));
243
- const idxListRes = await db.execute(`PRAGMA index_list(${quoteIdent(table)})`);
254
+ const idxListRes = await client.execute(`PRAGMA index_list(${quoteIdent(table)})`);
244
255
  const indexes = [];
245
256
  for (const idx of idxListRes.rows) {
246
257
  const idxName = String(idx.name);
247
258
  if (idxName.startsWith("sqlite_"))
248
259
  continue;
249
- const infoRes = await db.execute(`PRAGMA index_info(${quoteIdent(idxName)})`);
260
+ const infoRes = await client.execute(`PRAGMA index_info(${quoteIdent(idxName)})`);
250
261
  indexes.push({
251
262
  name: idxName,
252
263
  unique: Number(idx.unique) === 1,
@@ -262,7 +273,7 @@ async function getTableSchemaSqlite(table) {
262
273
  primaryKey,
263
274
  foreignKeys,
264
275
  indexes,
265
- rowCount: type === "view" ? null : await safeRowCount(table),
276
+ rowCount: type === "view" ? null : await safeRowCount(table, runtime),
266
277
  };
267
278
  }
268
279
  // ---------------------------------------------------------------------------
@@ -291,7 +302,7 @@ const OP_SQL = {
291
302
  like: "LIKE",
292
303
  };
293
304
  /** Build a parameterized WHERE clause + args from filters. */
294
- function buildWhere(filters) {
305
+ function buildWhere(filters, runtime) {
295
306
  if (!filters || filters.length === 0)
296
307
  return { clause: "", args: [] };
297
308
  const parts = [];
@@ -322,7 +333,7 @@ function buildWhere(filters) {
322
333
  case "ilike": {
323
334
  // SQLite LIKE is case-insensitive for ASCII by default; Postgres has
324
335
  // a dedicated ILIKE operator.
325
- if (isPostgres()) {
336
+ if (isPostgresRuntime(runtime)) {
326
337
  parts.push(`${col} ILIKE ?`);
327
338
  }
328
339
  else {
@@ -349,22 +360,22 @@ function buildOrderBy(sort) {
349
360
  });
350
361
  return ` ORDER BY ${parts.join(", ")}`;
351
362
  }
352
- export async function getRows(table, req) {
363
+ export async function getRows(table, req, runtime) {
353
364
  assertIdent(table, "table name");
354
- const db = getDbExec();
355
- const schema = await getTableSchema(table);
365
+ const client = db(runtime);
366
+ const schema = await getTableSchema(table, runtime);
356
367
  const page = Math.max(1, Math.floor(req.page) || 1);
357
368
  const pageSize = Math.min(1000, Math.max(1, Math.floor(req.pageSize) || 50));
358
369
  const offset = (page - 1) * pageSize;
359
- const where = buildWhere(req.filters);
370
+ const where = buildWhere(req.filters, runtime);
360
371
  const orderBy = buildOrderBy(req.sort);
361
372
  const quoted = quoteIdent(table);
362
- const countRes = await db.execute({
373
+ const countRes = await client.execute({
363
374
  sql: `SELECT COUNT(*) AS c FROM ${quoted}${where.clause}`,
364
375
  args: where.args,
365
376
  });
366
377
  const total = Number(countRes.rows[0]?.c ?? 0) || 0;
367
- const rowsRes = await db.execute({
378
+ const rowsRes = await client.execute({
368
379
  sql: `SELECT * FROM ${quoted}${where.clause}${orderBy} LIMIT ? OFFSET ?`,
369
380
  args: [...where.args, pageSize, offset],
370
381
  });
@@ -418,7 +429,7 @@ function buildDelete(table, where) {
418
429
  const sql = `DELETE FROM ${quoteIdent(table)} WHERE ${whereSql}`;
419
430
  return { sql, args: whereCols.map((c) => where[c]) };
420
431
  }
421
- export async function applyMutations(table, m) {
432
+ export async function applyMutations(table, m, runtime) {
422
433
  assertIdent(table, "table name");
423
434
  const statements = [];
424
435
  for (const row of m.inserts ?? [])
@@ -443,12 +454,12 @@ export async function applyMutations(table, m) {
443
454
  // sequentially. A failure mid-batch surfaces as a thrown error with the
444
455
  // counts accumulated so far; callers should treat a partial batch as a
445
456
  // failure and re-run with a corrected payload.
446
- const db = getDbExec();
457
+ const client = db(runtime);
447
458
  const insertCount = m.inserts?.length ?? 0;
448
459
  const updateCount = m.updates?.length ?? 0;
449
460
  let executed = 0;
450
461
  for (const stmt of statements) {
451
- const res = await db.execute({ sql: stmt.sql, args: stmt.args });
462
+ const res = await client.execute({ sql: stmt.sql, args: stmt.args });
452
463
  if (executed < insertCount) {
453
464
  result.inserted += 1;
454
465
  }
@@ -461,7 +472,7 @@ export async function applyMutations(table, m) {
461
472
  executed += 1;
462
473
  }
463
474
  if (statements.length > 0)
464
- await notifyDbAdminChange();
475
+ await notifyDbAdminChange(runtime);
465
476
  return result;
466
477
  }
467
478
  // ---------------------------------------------------------------------------
@@ -508,7 +519,7 @@ function isBareSelectWithoutLimit(sql) {
508
519
  return false;
509
520
  return true;
510
521
  }
511
- export async function runSql(sql, params, opts = {}) {
522
+ export async function runSql(sql, params, opts = {}, runtime) {
512
523
  if (typeof sql !== "string" || !sql.trim()) {
513
524
  throw new Error("SQL is required");
514
525
  }
@@ -521,16 +532,16 @@ export async function runSql(sql, params, opts = {}) {
521
532
  if (isBareSelectWithoutLimit(finalSql)) {
522
533
  finalSql = `${finalSql} LIMIT 100`;
523
534
  }
524
- const db = getDbExec();
535
+ const client = db(runtime);
525
536
  const started = Date.now();
526
- const res = await db.execute(params && params.length > 0 ? { sql: finalSql, args: params } : finalSql);
537
+ const res = await client.execute(params && params.length > 0 ? { sql: finalSql, args: params } : finalSql);
527
538
  const durationMs = Date.now() - started;
528
539
  const rows = (res.rows ?? []);
529
540
  const columns = rows.length > 0 && rows[0] && typeof rows[0] === "object"
530
541
  ? Object.keys(rows[0])
531
542
  : [];
532
543
  if (isMutatingSql(finalSql))
533
- await notifyDbAdminChange();
544
+ await notifyDbAdminChange(runtime);
534
545
  return {
535
546
  columns,
536
547
  rows,
@@ -1 +1 @@
1
- {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/db-admin/operations.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Dev-mode database admin operations.\n *\n * Pure, dialect-agnostic, RAW/UNSCOPED helpers backing the Supabase-Studio-like\n * DB admin. These run the FULL database with no per-user `accessFilter`\n * scoping — they are a developer tool, gated to dev + localhost at the route\n * and agent-tool layers. Do NOT call these from any production-reachable\n * surface.\n *\n * All access goes through the unified `getDbExec()` client, which uses `?`\n * placeholders (auto-converted to `$1,$2,…` for Postgres) and returns rows\n * keyed by column name. Identifiers are validated against a strict pattern and\n * always double-quoted; values are ALWAYS parameterized — never interpolated.\n */\nimport { getDbExec, getDialect, isPostgres } from \"../db/client.js\";\nimport { notifyActionChange } from \"../server/action-change.js\";\nimport type {\n DbAdminColumn,\n DbAdminDialect,\n DbAdminFilter,\n DbAdminForeignKey,\n DbAdminIndex,\n DbAdminMutation,\n DbAdminMutationResult,\n DbAdminQueryResult,\n DbAdminRowsRequest,\n DbAdminRowsResult,\n DbAdminTableSchema,\n DbAdminTableSummary,\n} from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Identifier validation + quoting\n// ---------------------------------------------------------------------------\n\nconst IDENT_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/** Throw on any identifier that isn't a plain `[A-Za-z_][A-Za-z0-9_]*`. */\nfunction assertIdent(name: string, kind = \"identifier\"): string {\n if (typeof name !== \"string\" || !IDENT_RE.test(name)) {\n throw new Error(`Invalid ${kind}: ${JSON.stringify(name)}`);\n }\n return name;\n}\n\n/** Double-quote an already-validated identifier (valid in PG and SQLite). */\nfunction quoteIdent(name: string): string {\n return `\"${assertIdent(name)}\"`;\n}\n\nfunction dialect(): DbAdminDialect {\n return getDialect();\n}\n\n// ---------------------------------------------------------------------------\n// Notify the UI after a real mutation so polling refetches.\n// ---------------------------------------------------------------------------\n\nasync function notifyDbAdminChange(): Promise<void> {\n // The UI keys on useChangeVersions([\"db-admin\",\"action\"]). notifyActionChange\n // records a \"db-admin\" change AND a marker; the action route layer's generic\n // \"action\" source is covered by passing the db-admin action name through the\n // same primitive that the action surface uses.\n await notifyActionChange({ actionName: \"db-admin\" }).catch(() => {});\n}\n\n// ---------------------------------------------------------------------------\n// listTables\n// ---------------------------------------------------------------------------\n\nexport async function listTables(): Promise<{\n dialect: DbAdminDialect;\n tables: DbAdminTableSummary[];\n}> {\n const db = getDbExec();\n const summaries: DbAdminTableSummary[] = [];\n\n if (isPostgres()) {\n const res = await db.execute(\n `SELECT table_name AS name, table_type AS type\n FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_type IN ('BASE TABLE', 'VIEW')\n ORDER BY table_name`,\n );\n for (const row of res.rows) {\n const name = String((row as any).name);\n const type = (row as any).type === \"VIEW\" ? \"view\" : \"table\";\n summaries.push({\n name,\n type,\n rowCount: type === \"view\" ? null : await safeRowCount(name),\n });\n }\n } else {\n const res = await db.execute(\n `SELECT name, type FROM sqlite_master\n WHERE type IN ('table', 'view')\n AND name NOT LIKE 'sqlite_%'\n ORDER BY name`,\n );\n for (const row of res.rows) {\n const name = String((row as any).name);\n const type = (row as any).type === \"view\" ? \"view\" : \"table\";\n summaries.push({\n name,\n type,\n rowCount: type === \"view\" ? null : await safeRowCount(name),\n });\n }\n }\n\n return { dialect: dialect(), tables: summaries };\n}\n\nasync function safeRowCount(table: string): Promise<number | null> {\n try {\n const db = getDbExec();\n const res = await db.execute(\n `SELECT COUNT(*) AS c FROM ${quoteIdent(table)}`,\n );\n const c = (res.rows[0] as any)?.c;\n const n = Number(c);\n return Number.isFinite(n) ? n : null;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// getTableSchema\n// ---------------------------------------------------------------------------\n\nexport async function getTableSchema(\n table: string,\n): Promise<DbAdminTableSchema> {\n assertIdent(table, \"table name\");\n return isPostgres()\n ? getTableSchemaPostgres(table)\n : getTableSchemaSqlite(table);\n}\n\nasync function getTableSchemaPostgres(\n table: string,\n): Promise<DbAdminTableSchema> {\n const db = getDbExec();\n\n const typeRes = await db.execute({\n sql: `SELECT table_type AS type FROM information_schema.tables\n WHERE table_schema = 'public' AND table_name = ?`,\n args: [table],\n });\n const type = (typeRes.rows[0] as any)?.type === \"VIEW\" ? \"view\" : \"table\";\n\n const colRes = await db.execute({\n sql: `SELECT\n column_name AS name,\n data_type AS type,\n CASE WHEN is_nullable = 'NO' THEN 0 ELSE 1 END AS nullable,\n column_default AS dflt\n FROM information_schema.columns\n WHERE table_schema = 'public' AND table_name = ?\n ORDER BY ordinal_position`,\n args: [table],\n });\n\n const pkRes = await db.execute({\n sql: `SELECT kcu.column_name AS col\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n WHERE tc.table_name = ?\n AND tc.table_schema = 'public'\n AND tc.constraint_type = 'PRIMARY KEY'\n ORDER BY kcu.ordinal_position`,\n args: [table],\n });\n const primaryKey = pkRes.rows.map((r) => String((r as any).col));\n const pkSet = new Set(primaryKey);\n\n const fkRes = await db.execute({\n sql: `SELECT\n kcu.column_name AS col,\n ccu.table_name AS ref_table,\n ccu.column_name AS ref_col\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage ccu\n ON tc.constraint_name = ccu.constraint_name\n AND tc.table_schema = ccu.table_schema\n WHERE tc.table_name = ?\n AND tc.table_schema = 'public'\n AND tc.constraint_type = 'FOREIGN KEY'`,\n args: [table],\n });\n const foreignKeys: DbAdminForeignKey[] = fkRes.rows.map((r) => ({\n column: String((r as any).col),\n refTable: String((r as any).ref_table),\n refColumn: String((r as any).ref_col),\n }));\n\n const idxRes = await db.execute({\n sql: `SELECT indexname AS name, indexdef AS def\n FROM pg_indexes\n WHERE schemaname = 'public' AND tablename = ?`,\n args: [table],\n });\n const indexes: DbAdminIndex[] = idxRes.rows.map((r) => {\n const def = String((r as any).def ?? \"\");\n const colMatch = def.match(/\\(([^)]+)\\)/);\n const columns = colMatch\n ? colMatch[1]\n .split(\",\")\n .map((c) => c.trim().replace(/^\"|\"$/g, \"\"))\n .filter(Boolean)\n : [];\n return {\n name: String((r as any).name),\n unique: /\\bUNIQUE\\b/i.test(def),\n columns,\n };\n });\n\n const columns: DbAdminColumn[] = colRes.rows.map((r) => {\n const name = String((r as any).name);\n const dflt = (r as any).dflt;\n const defaultValue = dflt == null ? null : String(dflt);\n return {\n name,\n type: String((r as any).type ?? \"ANY\"),\n nullable: Number((r as any).nullable) === 1,\n pk: pkSet.has(name),\n defaultValue,\n // Postgres serial/identity columns default to a sequence call.\n autoIncrement:\n defaultValue != null &&\n (/nextval\\(/i.test(defaultValue) || /identity/i.test(defaultValue)),\n };\n });\n\n return {\n name: table,\n type,\n columns,\n primaryKey,\n foreignKeys,\n indexes,\n rowCount: type === \"view\" ? null : await safeRowCount(table),\n };\n}\n\nasync function getTableSchemaSqlite(\n table: string,\n): Promise<DbAdminTableSchema> {\n const db = getDbExec();\n\n const typeRes = await db.execute({\n sql: `SELECT type FROM sqlite_master WHERE name = ? AND type IN ('table','view')`,\n args: [table],\n });\n const type = (typeRes.rows[0] as any)?.type === \"view\" ? \"view\" : \"table\";\n\n const colRes = await db.execute(`PRAGMA table_info(${quoteIdent(table)})`);\n const columns: DbAdminColumn[] = colRes.rows.map((r) => {\n const name = String((r as any).name);\n const dflt = (r as any).dflt_value;\n return {\n name,\n type: String((r as any).type ?? \"ANY\") || \"ANY\",\n nullable: Number((r as any).notnull) === 0,\n pk: Number((r as any).pk) > 0,\n defaultValue: dflt == null ? null : String(dflt),\n };\n });\n\n // PK order follows the pk index from table_info (1-based, 0 = not pk).\n const primaryKey = colRes.rows\n .filter((r) => Number((r as any).pk) > 0)\n .sort((a, b) => Number((a as any).pk) - Number((b as any).pk))\n .map((r) => String((r as any).name));\n\n // INTEGER PRIMARY KEY in SQLite is an alias for the rowid (autoincrementing).\n if (primaryKey.length === 1) {\n const pkCol = columns.find((c) => c.name === primaryKey[0]);\n if (pkCol && /^integer$/i.test(pkCol.type)) {\n pkCol.autoIncrement = true;\n }\n }\n\n const fkRes = await db.execute(\n `PRAGMA foreign_key_list(${quoteIdent(table)})`,\n );\n const foreignKeys: DbAdminForeignKey[] = fkRes.rows.map((r) => ({\n column: String((r as any).from),\n refTable: String((r as any).table),\n refColumn: String((r as any).to),\n }));\n\n const idxListRes = await db.execute(\n `PRAGMA index_list(${quoteIdent(table)})`,\n );\n const indexes: DbAdminIndex[] = [];\n for (const idx of idxListRes.rows) {\n const idxName = String((idx as any).name);\n if (idxName.startsWith(\"sqlite_\")) continue;\n const infoRes = await db.execute(\n `PRAGMA index_info(${quoteIdent(idxName)})`,\n );\n indexes.push({\n name: idxName,\n unique: Number((idx as any).unique) === 1,\n columns: infoRes.rows\n .map((c) => (c as any).name)\n .filter((n): n is string => typeof n === \"string\"),\n });\n }\n\n return {\n name: table,\n type,\n columns,\n primaryKey,\n foreignKeys,\n indexes,\n rowCount: type === \"view\" ? null : await safeRowCount(table),\n };\n}\n\n// ---------------------------------------------------------------------------\n// getRows\n// ---------------------------------------------------------------------------\n\nconst SAFE_OPS = new Set([\n \"eq\",\n \"neq\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"like\",\n \"ilike\",\n \"in\",\n \"is_null\",\n \"not_null\",\n]);\n\nconst OP_SQL: Record<string, string> = {\n eq: \"=\",\n neq: \"<>\",\n lt: \"<\",\n lte: \"<=\",\n gt: \">\",\n gte: \">=\",\n like: \"LIKE\",\n};\n\n/** Build a parameterized WHERE clause + args from filters. */\nfunction buildWhere(filters: DbAdminFilter[] | undefined): {\n clause: string;\n args: unknown[];\n} {\n if (!filters || filters.length === 0) return { clause: \"\", args: [] };\n const parts: string[] = [];\n const args: unknown[] = [];\n for (const f of filters) {\n const col = quoteIdent(f.column);\n if (!SAFE_OPS.has(f.op)) {\n throw new Error(`Invalid filter op: ${JSON.stringify(f.op)}`);\n }\n switch (f.op) {\n case \"is_null\":\n parts.push(`${col} IS NULL`);\n break;\n case \"not_null\":\n parts.push(`${col} IS NOT NULL`);\n break;\n case \"in\": {\n const values = Array.isArray(f.value) ? f.value : [f.value];\n if (values.length === 0) {\n // `col IN ()` is invalid SQL; an empty set matches nothing.\n parts.push(`1 = 0`);\n break;\n }\n parts.push(`${col} IN (${values.map(() => \"?\").join(\", \")})`);\n args.push(...values);\n break;\n }\n case \"ilike\": {\n // SQLite LIKE is case-insensitive for ASCII by default; Postgres has\n // a dedicated ILIKE operator.\n if (isPostgres()) {\n parts.push(`${col} ILIKE ?`);\n } else {\n parts.push(`${col} LIKE ?`);\n }\n args.push(f.value);\n break;\n }\n default: {\n parts.push(`${col} ${OP_SQL[f.op]} ?`);\n args.push(f.value);\n break;\n }\n }\n }\n return { clause: parts.length ? ` WHERE ${parts.join(\" AND \")}` : \"\", args };\n}\n\nfunction buildOrderBy(sort: DbAdminRowsRequest[\"sort\"]): string {\n if (!sort || sort.length === 0) return \"\";\n const parts = sort.map((s) => {\n const dir = s.dir === \"desc\" ? \"DESC\" : \"ASC\";\n return `${quoteIdent(s.column)} ${dir}`;\n });\n return ` ORDER BY ${parts.join(\", \")}`;\n}\n\nexport async function getRows(\n table: string,\n req: DbAdminRowsRequest,\n): Promise<DbAdminRowsResult> {\n assertIdent(table, \"table name\");\n const db = getDbExec();\n const schema = await getTableSchema(table);\n\n const page = Math.max(1, Math.floor(req.page) || 1);\n const pageSize = Math.min(1000, Math.max(1, Math.floor(req.pageSize) || 50));\n const offset = (page - 1) * pageSize;\n\n const where = buildWhere(req.filters);\n const orderBy = buildOrderBy(req.sort);\n const quoted = quoteIdent(table);\n\n const countRes = await db.execute({\n sql: `SELECT COUNT(*) AS c FROM ${quoted}${where.clause}`,\n args: where.args,\n });\n const total = Number((countRes.rows[0] as any)?.c ?? 0) || 0;\n\n const rowsRes = await db.execute({\n sql: `SELECT * FROM ${quoted}${where.clause}${orderBy} LIMIT ? OFFSET ?`,\n args: [...where.args, pageSize, offset],\n });\n\n return {\n columns: schema.columns,\n rows: rowsRes.rows as Record<string, unknown>[],\n total,\n page,\n pageSize,\n };\n}\n\n// ---------------------------------------------------------------------------\n// applyMutations\n// ---------------------------------------------------------------------------\n\nfunction buildInsert(\n table: string,\n row: Record<string, unknown>,\n): { sql: string; args: unknown[] } {\n const cols = Object.keys(row);\n if (cols.length === 0) {\n throw new Error(\"Cannot insert an empty row\");\n }\n cols.forEach((c) => assertIdent(c, \"column name\"));\n const sql = `INSERT INTO ${quoteIdent(table)} (${cols\n .map(quoteIdent)\n .join(\", \")}) VALUES (${cols.map(() => \"?\").join(\", \")})`;\n return { sql, args: cols.map((c) => row[c]) };\n}\n\nfunction buildUpdate(\n table: string,\n set: Record<string, unknown>,\n where: Record<string, unknown>,\n): { sql: string; args: unknown[] } {\n const setCols = Object.keys(set);\n const whereCols = Object.keys(where);\n if (setCols.length === 0) throw new Error(\"Update requires a non-empty set\");\n if (whereCols.length === 0) {\n throw new Error(\"Update requires a non-empty where clause\");\n }\n setCols.forEach((c) => assertIdent(c, \"column name\"));\n whereCols.forEach((c) => assertIdent(c, \"column name\"));\n const setSql = setCols.map((c) => `${quoteIdent(c)} = ?`).join(\", \");\n const whereSql = whereCols.map((c) => `${quoteIdent(c)} = ?`).join(\" AND \");\n const sql = `UPDATE ${quoteIdent(table)} SET ${setSql} WHERE ${whereSql}`;\n return {\n sql,\n args: [...setCols.map((c) => set[c]), ...whereCols.map((c) => where[c])],\n };\n}\n\nfunction buildDelete(\n table: string,\n where: Record<string, unknown>,\n): { sql: string; args: unknown[] } {\n const whereCols = Object.keys(where);\n if (whereCols.length === 0) {\n throw new Error(\"Delete requires a non-empty where clause\");\n }\n whereCols.forEach((c) => assertIdent(c, \"column name\"));\n const whereSql = whereCols.map((c) => `${quoteIdent(c)} = ?`).join(\" AND \");\n const sql = `DELETE FROM ${quoteIdent(table)} WHERE ${whereSql}`;\n return { sql, args: whereCols.map((c) => where[c]) };\n}\n\nexport async function applyMutations(\n table: string,\n m: DbAdminMutation,\n): Promise<DbAdminMutationResult> {\n assertIdent(table, \"table name\");\n\n const statements: { sql: string; args: unknown[] }[] = [];\n for (const row of m.inserts ?? []) statements.push(buildInsert(table, row));\n for (const u of m.updates ?? []) {\n statements.push(buildUpdate(table, u.set, u.where));\n }\n for (const where of m.deletes ?? []) {\n statements.push(buildDelete(table, where));\n }\n\n const result: DbAdminMutationResult = {\n sql: statements.map((s) => s.sql),\n inserted: 0,\n updated: 0,\n deleted: 0,\n };\n\n if (m.dryRun) {\n // dryRun returns the SQL strings WITHOUT executing.\n return result;\n }\n\n // getDbExec() does not expose a transaction handle, so statements run\n // sequentially. A failure mid-batch surfaces as a thrown error with the\n // counts accumulated so far; callers should treat a partial batch as a\n // failure and re-run with a corrected payload.\n const db = getDbExec();\n const insertCount = m.inserts?.length ?? 0;\n const updateCount = m.updates?.length ?? 0;\n\n let executed = 0;\n for (const stmt of statements) {\n const res = await db.execute({ sql: stmt.sql, args: stmt.args });\n if (executed < insertCount) {\n result.inserted += 1;\n } else if (executed < insertCount + updateCount) {\n result.updated += res.rowsAffected || 0;\n } else {\n result.deleted += res.rowsAffected || 0;\n }\n executed += 1;\n }\n\n if (statements.length > 0) await notifyDbAdminChange();\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// runSql\n// ---------------------------------------------------------------------------\n\n/** Error thrown when a destructive statement is run without confirmation. */\nexport class DbAdminConfirmRequiredError extends Error {\n readonly needsConfirm = true;\n constructor(message: string) {\n super(message);\n this.name = \"DbAdminConfirmRequiredError\";\n }\n}\n\n/** Strip `--` line comments and `/* *\\/` block comments from SQL. */\nfunction stripComments(sql: string): string {\n return sql.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \" \").replace(/--[^\\n\\r]*/g, \" \");\n}\n\nfunction isMutatingSql(sql: string): boolean {\n const head = stripComments(sql).trim().toLowerCase();\n return /^(insert|update|delete|replace|create|alter|drop|truncate|merge|pragma\\s+\\w+\\s*=)/.test(\n head,\n );\n}\n\n/** Detect destructive ops on comment-stripped SQL. */\nfunction isDestructiveSql(sql: string): boolean {\n const cleaned = stripComments(sql).trim();\n const lower = cleaned.toLowerCase();\n if (/^drop\\b/.test(lower)) return true;\n if (/^truncate\\b/.test(lower)) return true;\n if (/^delete\\b/.test(lower) && !/\\bwhere\\b/.test(lower)) return true;\n if (/^update\\b/.test(lower) && !/\\bwhere\\b/.test(lower)) return true;\n return false;\n}\n\n/** A leading SELECT (or CTE that ends in SELECT) with no LIMIT clause. */\nfunction isBareSelectWithoutLimit(sql: string): boolean {\n const cleaned = stripComments(sql).trim();\n const lower = cleaned.toLowerCase();\n const isSelect = /^(select|with)\\b/.test(lower);\n if (!isSelect) return false;\n if (/\\blimit\\b/.test(lower)) return false;\n return true;\n}\n\nexport async function runSql(\n sql: string,\n params: unknown[] | undefined,\n opts: { confirmDestructive?: boolean } = {},\n): Promise<DbAdminQueryResult> {\n if (typeof sql !== \"string\" || !sql.trim()) {\n throw new Error(\"SQL is required\");\n }\n\n if (isDestructiveSql(sql) && !opts.confirmDestructive) {\n throw new DbAdminConfirmRequiredError(\n \"This statement is destructive (DROP / TRUNCATE / unscoped DELETE or UPDATE). Re-run with confirmDestructive: true to proceed.\",\n );\n }\n\n // Guardrail: auto-append LIMIT 100 to a bare SELECT so an accidental\n // full-table scan can't dump a huge result set.\n let finalSql = sql.trim().replace(/;\\s*$/, \"\");\n if (isBareSelectWithoutLimit(finalSql)) {\n finalSql = `${finalSql} LIMIT 100`;\n }\n\n const db = getDbExec();\n const started = Date.now();\n const res = await db.execute(\n params && params.length > 0 ? { sql: finalSql, args: params } : finalSql,\n );\n const durationMs = Date.now() - started;\n\n const rows = (res.rows ?? []) as Record<string, unknown>[];\n const columns =\n rows.length > 0 && rows[0] && typeof rows[0] === \"object\"\n ? Object.keys(rows[0])\n : [];\n\n if (isMutatingSql(finalSql)) await notifyDbAdminChange();\n\n return {\n columns,\n rows,\n rowsAffected: res.rowsAffected ?? 0,\n durationMs,\n };\n}\n"]}
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/db-admin/operations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EACL,SAAS,EACT,UAAU,GAGX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAgBhE,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,0BAA0B,CAAC;AAQ5C,2EAA2E;AAC3E,SAAS,WAAW,CAAC,IAAY,EAAE,IAAI,GAAG,YAAY;IACpD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAC7E,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AAClC,CAAC;AAED,SAAS,EAAE,CAAC,OAAwB;IAClC,OAAO,OAAO,EAAE,EAAE,IAAI,SAAS,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,OAAO,CAAC,OAAwB;IACvC,OAAO,CAAC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,CAAmB,CAAC;AAC9D,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAwB;IACjD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC;AACzC,CAAC;AAED,8EAA8E;AAC9E,4DAA4D;AAC5D,8EAA8E;AAE9E,KAAK,UAAU,mBAAmB,CAAC,OAAwB;IACzD,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;QAC1B,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IACD,8EAA8E;IAC9E,6EAA6E;IAC7E,6EAA6E;IAC7E,+CAA+C;IAC/C,MAAM,kBAAkB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAwB;IAIvD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,SAAS,GAA0B,EAAE,CAAC;IAE5C,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAC9B;;;;2BAIqB,CACtB,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,CAAE,GAAW,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,IAAI,GAAI,GAAW,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7D,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI;gBACJ,IAAI;gBACJ,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC;aACrE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAC9B;;;qBAGe,CAChB,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,CAAE,GAAW,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,IAAI,GAAI,GAAW,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7D,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI;gBACJ,IAAI;gBACJ,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC;aACrE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,KAAa,EACb,OAAwB;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAC9B,6BAA6B,UAAU,CAAC,KAAK,CAAC,EAAE,CACjD,CAAC;QACF,MAAM,CAAC,GAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,OAAwB;IAExB,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACjC,OAAO,iBAAiB,CAAC,OAAO,CAAC;QAC/B,CAAC,CAAC,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC;QACxC,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,KAAa,EACb,OAAwB;IAExB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAE3B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACnC,GAAG,EAAE;2DACkD;QACvD,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,CAAC,CAAC;IACH,MAAM,IAAI,GAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAE1E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAClC,GAAG,EAAE;;;;;;;oCAO2B;QAChC,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACjC,GAAG,EAAE;;;;;;;;wCAQ+B;QACpC,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAE,CAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAElC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACjC,GAAG,EAAE;;;;;;;;;;;;;mDAa0C;QAC/C,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,CAAC,CAAC;IACH,MAAM,WAAW,GAAwB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,MAAM,EAAE,MAAM,CAAE,CAAS,CAAC,GAAG,CAAC;QAC9B,QAAQ,EAAE,MAAM,CAAE,CAAS,CAAC,SAAS,CAAC;QACtC,SAAS,EAAE,MAAM,CAAE,CAAS,CAAC,OAAO,CAAC;KACtC,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QAClC,GAAG,EAAE;;wDAE+C;QACpD,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,CAAC,CAAC;IACH,MAAM,OAAO,GAAmB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACpD,MAAM,GAAG,GAAG,MAAM,CAAE,CAAS,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,QAAQ;YACtB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;iBACR,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;iBAC1C,MAAM,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,EAAE,CAAC;QACP,OAAO;YACL,IAAI,EAAE,MAAM,CAAE,CAAS,CAAC,IAAI,CAAC;YAC7B,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;YAC/B,OAAO;SACR,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAoB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrD,MAAM,IAAI,GAAG,MAAM,CAAE,CAAS,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAI,CAAS,CAAC,IAAI,CAAC;QAC7B,MAAM,YAAY,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxD,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,MAAM,CAAE,CAAS,CAAC,IAAI,IAAI,KAAK,CAAC;YACtC,QAAQ,EAAE,MAAM,CAAE,CAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC3C,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YACnB,YAAY;YACZ,+DAA+D;YAC/D,aAAa,EACX,YAAY,IAAI,IAAI;gBACpB,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SACtE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,KAAK;QACX,IAAI;QACJ,OAAO;QACP,UAAU;QACV,WAAW;QACX,OAAO;QACP,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,KAAa,EACb,OAAwB;IAExB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAE3B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACnC,GAAG,EAAE,4EAA4E;QACjF,IAAI,EAAE,CAAC,KAAK,CAAC;KACd,CAAC,CAAC;IACH,MAAM,IAAI,GAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAE1E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CACjC,qBAAqB,UAAU,CAAC,KAAK,CAAC,GAAG,CAC1C,CAAC;IACF,MAAM,OAAO,GAAoB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACrD,MAAM,IAAI,GAAG,MAAM,CAAE,CAAS,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAI,CAAS,CAAC,UAAU,CAAC;QACnC,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,MAAM,CAAE,CAAS,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK;YAC/C,QAAQ,EAAE,MAAM,CAAE,CAAS,CAAC,OAAO,CAAC,KAAK,CAAC;YAC1C,EAAE,EAAE,MAAM,CAAE,CAAS,CAAC,EAAE,CAAC,GAAG,CAAC;YAC7B,YAAY,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;SACjD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAE,CAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;SACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAE,CAAS,CAAC,EAAE,CAAC,GAAG,MAAM,CAAE,CAAS,CAAC,EAAE,CAAC,CAAC;SAC7D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAE,CAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvC,8EAA8E;IAC9E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAChC,2BAA2B,UAAU,CAAC,KAAK,CAAC,GAAG,CAChD,CAAC;IACF,MAAM,WAAW,GAAwB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,MAAM,EAAE,MAAM,CAAE,CAAS,CAAC,IAAI,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAE,CAAS,CAAC,KAAK,CAAC;QAClC,SAAS,EAAE,MAAM,CAAE,CAAS,CAAC,EAAE,CAAC;KACjC,CAAC,CAAC,CAAC;IAEJ,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,CACrC,qBAAqB,UAAU,CAAC,KAAK,CAAC,GAAG,CAC1C,CAAC;IACF,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,CAAE,GAAW,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAC5C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAClC,qBAAqB,UAAU,CAAC,OAAO,CAAC,GAAG,CAC5C,CAAC;QACF,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,MAAM,CAAE,GAAW,CAAC,MAAM,CAAC,KAAK,CAAC;YACzC,OAAO,EAAE,OAAO,CAAC,IAAI;iBAClB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAS,CAAC,IAAI,CAAC;iBAC3B,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;SACrD,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK;QACX,IAAI;QACJ,OAAO;QACP,UAAU;QACV,WAAW;QACX,OAAO;QACP,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,MAAM;IACN,OAAO;IACP,IAAI;IACJ,SAAS;IACT,UAAU;CACX,CAAC,CAAC;AAEH,MAAM,MAAM,GAA2B;IACrC,EAAE,EAAE,GAAG;IACP,GAAG,EAAE,IAAI;IACT,EAAE,EAAE,GAAG;IACP,GAAG,EAAE,IAAI;IACT,EAAE,EAAE,GAAG;IACP,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,8DAA8D;AAC9D,SAAS,UAAU,CACjB,OAAoC,EACpC,OAAwB;IAKxB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACtE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC;YACb,KAAK,SAAS;gBACZ,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;gBAC7B,MAAM;YACR,KAAK,UAAU;gBACb,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,IAAI,EAAE,CAAC;gBACV,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxB,4DAA4D;oBAC5D,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACpB,MAAM;gBACR,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,QAAQ,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC9D,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;gBACrB,MAAM;YACR,CAAC;YACD,KAAK,OAAO,EAAE,CAAC;gBACb,qEAAqE;gBACrE,8BAA8B;gBAC9B,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;gBAC9B,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACnB,MAAM;YACR,CAAC;YACD,SAAS,CAAC;gBACR,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,YAAY,CAAC,IAAgC;IACpD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9C,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IACH,OAAO,aAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAa,EACb,GAAuB,EACvB,OAAwB;IAExB,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEpD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;IAErC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACpC,GAAG,EAAE,6BAA6B,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE;QACzD,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAS,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACnC,GAAG,EAAE,iBAAiB,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,OAAO,mBAAmB;QACxE,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;KACxC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,OAAO,CAAC,IAAiC;QAC/C,KAAK;QACL,IAAI;QACJ,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,SAAS,WAAW,CAClB,KAAa,EACb,GAA4B;IAE5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,eAAe,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI;SAClD,GAAG,CAAC,UAAU,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC5D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAClB,KAAa,EACb,GAA4B,EAC5B,KAA8B;IAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC7E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IACtD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,UAAU,UAAU,CAAC,KAAK,CAAC,QAAQ,MAAM,UAAU,QAAQ,EAAE,CAAC;IAC1E,OAAO;QACL,GAAG;QACH,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KACzE,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,KAAa,EACb,KAA8B;IAE9B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,eAAe,UAAU,CAAC,KAAK,CAAC,UAAU,QAAQ,EAAE,CAAC;IACjE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,CAAkB,EAClB,OAAwB;IAExB,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAEjC,MAAM,UAAU,GAAuC,EAAE,CAAC;IAC1D,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE;QAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5E,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAChC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,MAAM,GAA0B;QACpC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACjC,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;KACX,CAAC;IAEF,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,oDAAoD;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sEAAsE;IACtE,wEAAwE;IACxE,uEAAuE;IACvE,+CAA+C;IAC/C,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;IAE3C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC3B,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,QAAQ,GAAG,WAAW,GAAG,WAAW,EAAE,CAAC;YAChD,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,QAAQ,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,6EAA6E;AAC7E,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAC3C,YAAY,GAAG,IAAI,CAAC;IAC7B,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAED,qEAAqE;AACrE,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrD,OAAO,mFAAmF,CAAC,IAAI,CAC7F,IAAI,CACL,CAAC;AACJ,CAAC;AAED,sDAAsD;AACtD,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0EAA0E;AAC1E,SAAS,wBAAwB,CAAC,GAAW;IAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,GAAW,EACX,MAA6B,EAC7B,IAAI,GAAqC,EAAE,EAC3C,OAAwB;IAExB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtD,MAAM,IAAI,2BAA2B,CACnC,+HAA+H,CAChI,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,gDAAgD;IAChD,IAAI,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/C,IAAI,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,QAAQ,GAAG,GAAG,QAAQ,YAAY,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAC9B,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CACzE,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;IAExC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAA8B,CAAC;IAC3D,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;QACvD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,aAAa,CAAC,QAAQ,CAAC;QAAE,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAEhE,OAAO;QACL,OAAO;QACP,IAAI;QACJ,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,CAAC;QACnC,UAAU;KACX,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Database admin operations.\n *\n * Pure, dialect-agnostic, RAW/UNSCOPED helpers backing the Supabase-Studio-like\n * DB admin. These run the FULL database with no per-user `accessFilter`\n * scoping. Callers MUST gate access before invoking them. The built-in core\n * route gates this to dev + localhost; production-reachable surfaces must pass\n * an explicit runtime for the target database and enforce their own admin-only\n * checks before reading or mutating.\n *\n * All access goes through the unified `getDbExec()` client, which uses `?`\n * placeholders (auto-converted to `$1,$2,…` for Postgres) and returns rows\n * keyed by column name. Identifiers are validated against a strict pattern and\n * always double-quoted; values are ALWAYS parameterized — never interpolated.\n */\nimport {\n getDbExec,\n getDialect,\n type DbExec,\n type Dialect,\n} from \"../db/client.js\";\nimport { notifyActionChange } from \"../server/action-change.js\";\nimport type {\n DbAdminColumn,\n DbAdminDialect,\n DbAdminFilter,\n DbAdminForeignKey,\n DbAdminIndex,\n DbAdminMutation,\n DbAdminMutationResult,\n DbAdminQueryResult,\n DbAdminRowsRequest,\n DbAdminRowsResult,\n DbAdminTableSchema,\n DbAdminTableSummary,\n} from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Identifier validation + quoting\n// ---------------------------------------------------------------------------\n\nconst IDENT_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport interface DbAdminRuntime {\n db?: DbExec;\n dialect?: Dialect;\n notifyChange?: () => Promise<void>;\n}\n\n/** Throw on any identifier that isn't a plain `[A-Za-z_][A-Za-z0-9_]*`. */\nfunction assertIdent(name: string, kind = \"identifier\"): string {\n if (typeof name !== \"string\" || !IDENT_RE.test(name)) {\n throw new Error(`Invalid ${kind}: ${JSON.stringify(name)}`);\n }\n return name;\n}\n\n/** Double-quote an already-validated identifier (valid in PG and SQLite). */\nfunction quoteIdent(name: string): string {\n return `\"${assertIdent(name)}\"`;\n}\n\nfunction db(runtime?: DbAdminRuntime): DbExec {\n return runtime?.db ?? getDbExec();\n}\n\nfunction dialect(runtime?: DbAdminRuntime): DbAdminDialect {\n return (runtime?.dialect ?? getDialect()) as DbAdminDialect;\n}\n\nfunction isPostgresRuntime(runtime?: DbAdminRuntime): boolean {\n return dialect(runtime) === \"postgres\";\n}\n\n// ---------------------------------------------------------------------------\n// Notify the UI after a real mutation so polling refetches.\n// ---------------------------------------------------------------------------\n\nasync function notifyDbAdminChange(runtime?: DbAdminRuntime): Promise<void> {\n if (runtime?.notifyChange) {\n await runtime.notifyChange();\n return;\n }\n // The UI keys on useChangeVersions([\"db-admin\",\"action\"]). notifyActionChange\n // records a \"db-admin\" change AND a marker; the action route layer's generic\n // \"action\" source is covered by passing the db-admin action name through the\n // same primitive that the action surface uses.\n await notifyActionChange({ actionName: \"db-admin\" }).catch(() => {});\n}\n\n// ---------------------------------------------------------------------------\n// listTables\n// ---------------------------------------------------------------------------\n\nexport async function listTables(runtime?: DbAdminRuntime): Promise<{\n dialect: DbAdminDialect;\n tables: DbAdminTableSummary[];\n}> {\n const client = db(runtime);\n const summaries: DbAdminTableSummary[] = [];\n\n if (isPostgresRuntime(runtime)) {\n const res = await client.execute(\n `SELECT table_name AS name, table_type AS type\n FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_type IN ('BASE TABLE', 'VIEW')\n ORDER BY table_name`,\n );\n for (const row of res.rows) {\n const name = String((row as any).name);\n const type = (row as any).type === \"VIEW\" ? \"view\" : \"table\";\n summaries.push({\n name,\n type,\n rowCount: type === \"view\" ? null : await safeRowCount(name, runtime),\n });\n }\n } else {\n const res = await client.execute(\n `SELECT name, type FROM sqlite_master\n WHERE type IN ('table', 'view')\n AND name NOT LIKE 'sqlite_%'\n ORDER BY name`,\n );\n for (const row of res.rows) {\n const name = String((row as any).name);\n const type = (row as any).type === \"view\" ? \"view\" : \"table\";\n summaries.push({\n name,\n type,\n rowCount: type === \"view\" ? null : await safeRowCount(name, runtime),\n });\n }\n }\n\n return { dialect: dialect(runtime), tables: summaries };\n}\n\nasync function safeRowCount(\n table: string,\n runtime?: DbAdminRuntime,\n): Promise<number | null> {\n try {\n const client = db(runtime);\n const res = await client.execute(\n `SELECT COUNT(*) AS c FROM ${quoteIdent(table)}`,\n );\n const c = (res.rows[0] as any)?.c;\n const n = Number(c);\n return Number.isFinite(n) ? n : null;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// getTableSchema\n// ---------------------------------------------------------------------------\n\nexport async function getTableSchema(\n table: string,\n runtime?: DbAdminRuntime,\n): Promise<DbAdminTableSchema> {\n assertIdent(table, \"table name\");\n return isPostgresRuntime(runtime)\n ? getTableSchemaPostgres(table, runtime)\n : getTableSchemaSqlite(table, runtime);\n}\n\nasync function getTableSchemaPostgres(\n table: string,\n runtime?: DbAdminRuntime,\n): Promise<DbAdminTableSchema> {\n const client = db(runtime);\n\n const typeRes = await client.execute({\n sql: `SELECT table_type AS type FROM information_schema.tables\n WHERE table_schema = 'public' AND table_name = ?`,\n args: [table],\n });\n const type = (typeRes.rows[0] as any)?.type === \"VIEW\" ? \"view\" : \"table\";\n\n const colRes = await client.execute({\n sql: `SELECT\n column_name AS name,\n data_type AS type,\n CASE WHEN is_nullable = 'NO' THEN 0 ELSE 1 END AS nullable,\n column_default AS dflt\n FROM information_schema.columns\n WHERE table_schema = 'public' AND table_name = ?\n ORDER BY ordinal_position`,\n args: [table],\n });\n\n const pkRes = await client.execute({\n sql: `SELECT kcu.column_name AS col\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n WHERE tc.table_name = ?\n AND tc.table_schema = 'public'\n AND tc.constraint_type = 'PRIMARY KEY'\n ORDER BY kcu.ordinal_position`,\n args: [table],\n });\n const primaryKey = pkRes.rows.map((r) => String((r as any).col));\n const pkSet = new Set(primaryKey);\n\n const fkRes = await client.execute({\n sql: `SELECT\n kcu.column_name AS col,\n ccu.table_name AS ref_table,\n ccu.column_name AS ref_col\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage ccu\n ON tc.constraint_name = ccu.constraint_name\n AND tc.table_schema = ccu.table_schema\n WHERE tc.table_name = ?\n AND tc.table_schema = 'public'\n AND tc.constraint_type = 'FOREIGN KEY'`,\n args: [table],\n });\n const foreignKeys: DbAdminForeignKey[] = fkRes.rows.map((r) => ({\n column: String((r as any).col),\n refTable: String((r as any).ref_table),\n refColumn: String((r as any).ref_col),\n }));\n\n const idxRes = await client.execute({\n sql: `SELECT indexname AS name, indexdef AS def\n FROM pg_indexes\n WHERE schemaname = 'public' AND tablename = ?`,\n args: [table],\n });\n const indexes: DbAdminIndex[] = idxRes.rows.map((r) => {\n const def = String((r as any).def ?? \"\");\n const colMatch = def.match(/\\(([^)]+)\\)/);\n const columns = colMatch\n ? colMatch[1]\n .split(\",\")\n .map((c) => c.trim().replace(/^\"|\"$/g, \"\"))\n .filter(Boolean)\n : [];\n return {\n name: String((r as any).name),\n unique: /\\bUNIQUE\\b/i.test(def),\n columns,\n };\n });\n\n const columns: DbAdminColumn[] = colRes.rows.map((r) => {\n const name = String((r as any).name);\n const dflt = (r as any).dflt;\n const defaultValue = dflt == null ? null : String(dflt);\n return {\n name,\n type: String((r as any).type ?? \"ANY\"),\n nullable: Number((r as any).nullable) === 1,\n pk: pkSet.has(name),\n defaultValue,\n // Postgres serial/identity columns default to a sequence call.\n autoIncrement:\n defaultValue != null &&\n (/nextval\\(/i.test(defaultValue) || /identity/i.test(defaultValue)),\n };\n });\n\n return {\n name: table,\n type,\n columns,\n primaryKey,\n foreignKeys,\n indexes,\n rowCount: type === \"view\" ? null : await safeRowCount(table, runtime),\n };\n}\n\nasync function getTableSchemaSqlite(\n table: string,\n runtime?: DbAdminRuntime,\n): Promise<DbAdminTableSchema> {\n const client = db(runtime);\n\n const typeRes = await client.execute({\n sql: `SELECT type FROM sqlite_master WHERE name = ? AND type IN ('table','view')`,\n args: [table],\n });\n const type = (typeRes.rows[0] as any)?.type === \"view\" ? \"view\" : \"table\";\n\n const colRes = await client.execute(\n `PRAGMA table_info(${quoteIdent(table)})`,\n );\n const columns: DbAdminColumn[] = colRes.rows.map((r) => {\n const name = String((r as any).name);\n const dflt = (r as any).dflt_value;\n return {\n name,\n type: String((r as any).type ?? \"ANY\") || \"ANY\",\n nullable: Number((r as any).notnull) === 0,\n pk: Number((r as any).pk) > 0,\n defaultValue: dflt == null ? null : String(dflt),\n };\n });\n\n // PK order follows the pk index from table_info (1-based, 0 = not pk).\n const primaryKey = colRes.rows\n .filter((r) => Number((r as any).pk) > 0)\n .sort((a, b) => Number((a as any).pk) - Number((b as any).pk))\n .map((r) => String((r as any).name));\n\n // INTEGER PRIMARY KEY in SQLite is an alias for the rowid (autoincrementing).\n if (primaryKey.length === 1) {\n const pkCol = columns.find((c) => c.name === primaryKey[0]);\n if (pkCol && /^integer$/i.test(pkCol.type)) {\n pkCol.autoIncrement = true;\n }\n }\n\n const fkRes = await client.execute(\n `PRAGMA foreign_key_list(${quoteIdent(table)})`,\n );\n const foreignKeys: DbAdminForeignKey[] = fkRes.rows.map((r) => ({\n column: String((r as any).from),\n refTable: String((r as any).table),\n refColumn: String((r as any).to),\n }));\n\n const idxListRes = await client.execute(\n `PRAGMA index_list(${quoteIdent(table)})`,\n );\n const indexes: DbAdminIndex[] = [];\n for (const idx of idxListRes.rows) {\n const idxName = String((idx as any).name);\n if (idxName.startsWith(\"sqlite_\")) continue;\n const infoRes = await client.execute(\n `PRAGMA index_info(${quoteIdent(idxName)})`,\n );\n indexes.push({\n name: idxName,\n unique: Number((idx as any).unique) === 1,\n columns: infoRes.rows\n .map((c) => (c as any).name)\n .filter((n): n is string => typeof n === \"string\"),\n });\n }\n\n return {\n name: table,\n type,\n columns,\n primaryKey,\n foreignKeys,\n indexes,\n rowCount: type === \"view\" ? null : await safeRowCount(table, runtime),\n };\n}\n\n// ---------------------------------------------------------------------------\n// getRows\n// ---------------------------------------------------------------------------\n\nconst SAFE_OPS = new Set([\n \"eq\",\n \"neq\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"like\",\n \"ilike\",\n \"in\",\n \"is_null\",\n \"not_null\",\n]);\n\nconst OP_SQL: Record<string, string> = {\n eq: \"=\",\n neq: \"<>\",\n lt: \"<\",\n lte: \"<=\",\n gt: \">\",\n gte: \">=\",\n like: \"LIKE\",\n};\n\n/** Build a parameterized WHERE clause + args from filters. */\nfunction buildWhere(\n filters: DbAdminFilter[] | undefined,\n runtime?: DbAdminRuntime,\n): {\n clause: string;\n args: unknown[];\n} {\n if (!filters || filters.length === 0) return { clause: \"\", args: [] };\n const parts: string[] = [];\n const args: unknown[] = [];\n for (const f of filters) {\n const col = quoteIdent(f.column);\n if (!SAFE_OPS.has(f.op)) {\n throw new Error(`Invalid filter op: ${JSON.stringify(f.op)}`);\n }\n switch (f.op) {\n case \"is_null\":\n parts.push(`${col} IS NULL`);\n break;\n case \"not_null\":\n parts.push(`${col} IS NOT NULL`);\n break;\n case \"in\": {\n const values = Array.isArray(f.value) ? f.value : [f.value];\n if (values.length === 0) {\n // `col IN ()` is invalid SQL; an empty set matches nothing.\n parts.push(`1 = 0`);\n break;\n }\n parts.push(`${col} IN (${values.map(() => \"?\").join(\", \")})`);\n args.push(...values);\n break;\n }\n case \"ilike\": {\n // SQLite LIKE is case-insensitive for ASCII by default; Postgres has\n // a dedicated ILIKE operator.\n if (isPostgresRuntime(runtime)) {\n parts.push(`${col} ILIKE ?`);\n } else {\n parts.push(`${col} LIKE ?`);\n }\n args.push(f.value);\n break;\n }\n default: {\n parts.push(`${col} ${OP_SQL[f.op]} ?`);\n args.push(f.value);\n break;\n }\n }\n }\n return { clause: parts.length ? ` WHERE ${parts.join(\" AND \")}` : \"\", args };\n}\n\nfunction buildOrderBy(sort: DbAdminRowsRequest[\"sort\"]): string {\n if (!sort || sort.length === 0) return \"\";\n const parts = sort.map((s) => {\n const dir = s.dir === \"desc\" ? \"DESC\" : \"ASC\";\n return `${quoteIdent(s.column)} ${dir}`;\n });\n return ` ORDER BY ${parts.join(\", \")}`;\n}\n\nexport async function getRows(\n table: string,\n req: DbAdminRowsRequest,\n runtime?: DbAdminRuntime,\n): Promise<DbAdminRowsResult> {\n assertIdent(table, \"table name\");\n const client = db(runtime);\n const schema = await getTableSchema(table, runtime);\n\n const page = Math.max(1, Math.floor(req.page) || 1);\n const pageSize = Math.min(1000, Math.max(1, Math.floor(req.pageSize) || 50));\n const offset = (page - 1) * pageSize;\n\n const where = buildWhere(req.filters, runtime);\n const orderBy = buildOrderBy(req.sort);\n const quoted = quoteIdent(table);\n\n const countRes = await client.execute({\n sql: `SELECT COUNT(*) AS c FROM ${quoted}${where.clause}`,\n args: where.args,\n });\n const total = Number((countRes.rows[0] as any)?.c ?? 0) || 0;\n\n const rowsRes = await client.execute({\n sql: `SELECT * FROM ${quoted}${where.clause}${orderBy} LIMIT ? OFFSET ?`,\n args: [...where.args, pageSize, offset],\n });\n\n return {\n columns: schema.columns,\n rows: rowsRes.rows as Record<string, unknown>[],\n total,\n page,\n pageSize,\n };\n}\n\n// ---------------------------------------------------------------------------\n// applyMutations\n// ---------------------------------------------------------------------------\n\nfunction buildInsert(\n table: string,\n row: Record<string, unknown>,\n): { sql: string; args: unknown[] } {\n const cols = Object.keys(row);\n if (cols.length === 0) {\n throw new Error(\"Cannot insert an empty row\");\n }\n cols.forEach((c) => assertIdent(c, \"column name\"));\n const sql = `INSERT INTO ${quoteIdent(table)} (${cols\n .map(quoteIdent)\n .join(\", \")}) VALUES (${cols.map(() => \"?\").join(\", \")})`;\n return { sql, args: cols.map((c) => row[c]) };\n}\n\nfunction buildUpdate(\n table: string,\n set: Record<string, unknown>,\n where: Record<string, unknown>,\n): { sql: string; args: unknown[] } {\n const setCols = Object.keys(set);\n const whereCols = Object.keys(where);\n if (setCols.length === 0) throw new Error(\"Update requires a non-empty set\");\n if (whereCols.length === 0) {\n throw new Error(\"Update requires a non-empty where clause\");\n }\n setCols.forEach((c) => assertIdent(c, \"column name\"));\n whereCols.forEach((c) => assertIdent(c, \"column name\"));\n const setSql = setCols.map((c) => `${quoteIdent(c)} = ?`).join(\", \");\n const whereSql = whereCols.map((c) => `${quoteIdent(c)} = ?`).join(\" AND \");\n const sql = `UPDATE ${quoteIdent(table)} SET ${setSql} WHERE ${whereSql}`;\n return {\n sql,\n args: [...setCols.map((c) => set[c]), ...whereCols.map((c) => where[c])],\n };\n}\n\nfunction buildDelete(\n table: string,\n where: Record<string, unknown>,\n): { sql: string; args: unknown[] } {\n const whereCols = Object.keys(where);\n if (whereCols.length === 0) {\n throw new Error(\"Delete requires a non-empty where clause\");\n }\n whereCols.forEach((c) => assertIdent(c, \"column name\"));\n const whereSql = whereCols.map((c) => `${quoteIdent(c)} = ?`).join(\" AND \");\n const sql = `DELETE FROM ${quoteIdent(table)} WHERE ${whereSql}`;\n return { sql, args: whereCols.map((c) => where[c]) };\n}\n\nexport async function applyMutations(\n table: string,\n m: DbAdminMutation,\n runtime?: DbAdminRuntime,\n): Promise<DbAdminMutationResult> {\n assertIdent(table, \"table name\");\n\n const statements: { sql: string; args: unknown[] }[] = [];\n for (const row of m.inserts ?? []) statements.push(buildInsert(table, row));\n for (const u of m.updates ?? []) {\n statements.push(buildUpdate(table, u.set, u.where));\n }\n for (const where of m.deletes ?? []) {\n statements.push(buildDelete(table, where));\n }\n\n const result: DbAdminMutationResult = {\n sql: statements.map((s) => s.sql),\n inserted: 0,\n updated: 0,\n deleted: 0,\n };\n\n if (m.dryRun) {\n // dryRun returns the SQL strings WITHOUT executing.\n return result;\n }\n\n // getDbExec() does not expose a transaction handle, so statements run\n // sequentially. A failure mid-batch surfaces as a thrown error with the\n // counts accumulated so far; callers should treat a partial batch as a\n // failure and re-run with a corrected payload.\n const client = db(runtime);\n const insertCount = m.inserts?.length ?? 0;\n const updateCount = m.updates?.length ?? 0;\n\n let executed = 0;\n for (const stmt of statements) {\n const res = await client.execute({ sql: stmt.sql, args: stmt.args });\n if (executed < insertCount) {\n result.inserted += 1;\n } else if (executed < insertCount + updateCount) {\n result.updated += res.rowsAffected || 0;\n } else {\n result.deleted += res.rowsAffected || 0;\n }\n executed += 1;\n }\n\n if (statements.length > 0) await notifyDbAdminChange(runtime);\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// runSql\n// ---------------------------------------------------------------------------\n\n/** Error thrown when a destructive statement is run without confirmation. */\nexport class DbAdminConfirmRequiredError extends Error {\n readonly needsConfirm = true;\n constructor(message: string) {\n super(message);\n this.name = \"DbAdminConfirmRequiredError\";\n }\n}\n\n/** Strip `--` line comments and `/* *\\/` block comments from SQL. */\nfunction stripComments(sql: string): string {\n return sql.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \" \").replace(/--[^\\n\\r]*/g, \" \");\n}\n\nfunction isMutatingSql(sql: string): boolean {\n const head = stripComments(sql).trim().toLowerCase();\n return /^(insert|update|delete|replace|create|alter|drop|truncate|merge|pragma\\s+\\w+\\s*=)/.test(\n head,\n );\n}\n\n/** Detect destructive ops on comment-stripped SQL. */\nfunction isDestructiveSql(sql: string): boolean {\n const cleaned = stripComments(sql).trim();\n const lower = cleaned.toLowerCase();\n if (/^drop\\b/.test(lower)) return true;\n if (/^truncate\\b/.test(lower)) return true;\n if (/^delete\\b/.test(lower) && !/\\bwhere\\b/.test(lower)) return true;\n if (/^update\\b/.test(lower) && !/\\bwhere\\b/.test(lower)) return true;\n return false;\n}\n\n/** A leading SELECT (or CTE that ends in SELECT) with no LIMIT clause. */\nfunction isBareSelectWithoutLimit(sql: string): boolean {\n const cleaned = stripComments(sql).trim();\n const lower = cleaned.toLowerCase();\n const isSelect = /^(select|with)\\b/.test(lower);\n if (!isSelect) return false;\n if (/\\blimit\\b/.test(lower)) return false;\n return true;\n}\n\nexport async function runSql(\n sql: string,\n params: unknown[] | undefined,\n opts: { confirmDestructive?: boolean } = {},\n runtime?: DbAdminRuntime,\n): Promise<DbAdminQueryResult> {\n if (typeof sql !== \"string\" || !sql.trim()) {\n throw new Error(\"SQL is required\");\n }\n\n if (isDestructiveSql(sql) && !opts.confirmDestructive) {\n throw new DbAdminConfirmRequiredError(\n \"This statement is destructive (DROP / TRUNCATE / unscoped DELETE or UPDATE). Re-run with confirmDestructive: true to proceed.\",\n );\n }\n\n // Guardrail: auto-append LIMIT 100 to a bare SELECT so an accidental\n // full-table scan can't dump a huge result set.\n let finalSql = sql.trim().replace(/;\\s*$/, \"\");\n if (isBareSelectWithoutLimit(finalSql)) {\n finalSql = `${finalSql} LIMIT 100`;\n }\n\n const client = db(runtime);\n const started = Date.now();\n const res = await client.execute(\n params && params.length > 0 ? { sql: finalSql, args: params } : finalSql,\n );\n const durationMs = Date.now() - started;\n\n const rows = (res.rows ?? []) as Record<string, unknown>[];\n const columns =\n rows.length > 0 && rows[0] && typeof rows[0] === \"object\"\n ? Object.keys(rows[0])\n : [];\n\n if (isMutatingSql(finalSql)) await notifyDbAdminChange(runtime);\n\n return {\n columns,\n rows,\n rowsAffected: res.rowsAffected ?? 0,\n durationMs,\n };\n}\n"]}
@@ -353,13 +353,12 @@ async function executeJob(resource, meta, body, deps, now) {
353
353
  const softTimeoutMs = resolveRunSoftTimeoutMs(undefined, {
354
354
  useHostedDefault: true,
355
355
  });
356
- // Hard-abort backstop: 5 minutes. On hosted runtimes the soft-timeout
357
- // will fire first; locally this is the only guard.
358
- const hardAbortTimer = setTimeout(() => {
359
- // startRun's abort controller handles this below, but we still need
360
- // the handle to clear it in the finally block.
361
- }, 5 * 60 * 1000);
362
356
  let jobError = null;
357
+ // Hard-abort backstop: 5 minutes. On hosted runtimes the soft-timeout
358
+ // will fire first; locally this is the only guard. Cleared when the
359
+ // run completes so finished jobs don't leave a live timer keeping the
360
+ // process/event loop alive for the remainder of the window.
361
+ let hardAbortTimer = null;
363
362
  await new Promise((resolve, reject) => {
364
363
  const activeRun = startRun(runId, thread.id, async (send, signal) => {
365
364
  try {
@@ -381,6 +380,10 @@ async function executeJob(resource, meta, body, deps, now) {
381
380
  },
382
381
  // onComplete: run finished (completed or aborted)
383
382
  async (run) => {
383
+ if (hardAbortTimer) {
384
+ clearTimeout(hardAbortTimer);
385
+ hardAbortTimer = null;
386
+ }
384
387
  if (run.status === "completed") {
385
388
  resolve();
386
389
  }
@@ -391,10 +394,10 @@ async function executeJob(resource, meta, body, deps, now) {
391
394
  softTimeoutMs,
392
395
  // turnId defaults to runId — fine for single-turn jobs
393
396
  });
394
- // Hard-abort backstop: abort the run-manager's own controller after
395
- // 5 minutes if it hasn't finished naturally.
396
- clearTimeout(hardAbortTimer);
397
- setTimeout(() => {
397
+ // Abort the run-manager's own controller after 5 minutes if the
398
+ // run hasn't finished naturally.
399
+ hardAbortTimer = setTimeout(() => {
400
+ hardAbortTimer = null;
398
401
  if (activeRun.status === "running") {
399
402
  activeRun.abort.abort("job_hard_timeout");
400
403
  reject(new Error("Job timed out after 5 minutes"));
@@ -403,6 +406,10 @@ async function executeJob(resource, meta, body, deps, now) {
403
406
  }).catch((err) => {
404
407
  jobError = err;
405
408
  });
409
+ if (hardAbortTimer) {
410
+ clearTimeout(hardAbortTimer);
411
+ hardAbortTimer = null;
412
+ }
406
413
  if (jobError)
407
414
  throw jobError;
408
415
  // Success — update status. Compute the next run from completion time,