@agent-native/core 0.91.2 → 0.92.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 (538) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +31 -0
  3. package/corpus/core/docs/content/faq.mdx +17 -0
  4. package/corpus/core/docs/content/notifications.mdx +12 -6
  5. package/corpus/core/package.json +1 -1
  6. package/corpus/core/src/agent/production-agent.ts +140 -46
  7. package/corpus/core/src/agent/tool-search.ts +71 -4
  8. package/corpus/core/src/application-state/store.ts +12 -1
  9. package/corpus/core/src/cli/index.ts +20 -0
  10. package/corpus/core/src/cli/upgrade.ts +798 -0
  11. package/corpus/core/src/client/AssistantChat.tsx +28 -15
  12. package/corpus/core/src/client/HighlightedCodeBlock.tsx +20 -3
  13. package/corpus/core/src/client/PoweredByBadge.tsx +1 -8
  14. package/corpus/core/src/client/agent-chat-adapter.ts +68 -16
  15. package/corpus/core/src/client/chat/message-components.tsx +85 -8
  16. package/corpus/core/src/client/chat/tool-call-display.tsx +355 -144
  17. package/corpus/core/src/client/chat/widgets/DataTableWidget.tsx +52 -1
  18. package/corpus/core/src/client/code-agent-chat-adapter.ts +2 -9
  19. package/corpus/core/src/client/db-admin/TableEditor.tsx +49 -0
  20. package/corpus/core/src/client/db-admin/export-utils.ts +13 -4
  21. package/corpus/core/src/client/db-admin/useAgentSync.ts +72 -0
  22. package/corpus/core/src/client/error-capture.ts +69 -7
  23. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +5 -1
  24. package/corpus/core/src/client/extensions/ExtensionViewer.tsx +53 -8
  25. package/corpus/core/src/client/extensions/InlineExtensionFrame.tsx +5 -1
  26. package/corpus/core/src/client/extensions/portable-extension.ts +1 -0
  27. package/corpus/core/src/client/org/OrgSwitcher.tsx +12 -9
  28. package/corpus/core/src/client/org/TeamPage.tsx +77 -71
  29. package/corpus/core/src/client/session-replay.ts +3 -97
  30. package/corpus/core/src/client/settings/SettingsPanel.tsx +738 -441
  31. package/corpus/core/src/client/settings/SettingsSection.tsx +161 -17
  32. package/corpus/core/src/client/settings/SettingsTabsPage.tsx +25 -9
  33. package/corpus/core/src/client/sse-event-processor.ts +29 -2
  34. package/corpus/core/src/db-admin/agent-tools.ts +8 -2
  35. package/corpus/core/src/db-admin/operations.ts +116 -4
  36. package/corpus/core/src/db-admin/routes.ts +1 -0
  37. package/corpus/core/src/db-admin/types.ts +4 -0
  38. package/corpus/core/src/extensions/actions.ts +113 -5
  39. package/corpus/core/src/extensions/html-shell.ts +5 -4
  40. package/corpus/core/src/extensions/routes.ts +10 -0
  41. package/corpus/core/src/navigation/index.ts +1 -1
  42. package/corpus/core/src/notifications/channels.ts +88 -25
  43. package/corpus/core/src/notifications/registry.ts +17 -3
  44. package/corpus/core/src/notifications/types.ts +4 -1
  45. package/corpus/core/src/resources/handlers.ts +10 -8
  46. package/corpus/core/src/server/agent-chat-plugin.ts +7 -3
  47. package/corpus/core/src/server/poll.ts +293 -8
  48. package/corpus/core/src/server/request-context.ts +7 -0
  49. package/corpus/core/src/styles/agent-conversation.css +1 -1
  50. package/corpus/core/src/styles/agent-native.css +27 -0
  51. package/corpus/core/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  52. package/corpus/core/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  53. package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  54. package/corpus/core/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  55. package/corpus/core/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  56. package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  57. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  58. package/corpus/core/src/templates/default/AGENTS.md +14 -5
  59. package/corpus/core/src/templates/default/package.json +2 -1
  60. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  61. package/corpus/core/src/templates/headless/AGENTS.md +13 -3
  62. package/corpus/core/src/templates/headless/package.json +1 -0
  63. package/corpus/core/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  64. package/corpus/core/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  65. package/corpus/core/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  66. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  67. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  68. package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  69. package/corpus/core/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  70. package/corpus/core/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  71. package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  72. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  73. package/corpus/core/src/templates/workspace-core/AGENTS.md +7 -1
  74. package/corpus/core/src/templates/workspace-root/AGENTS.md +17 -5
  75. package/corpus/core/src/templates/workspace-root/package.json +1 -0
  76. package/corpus/templates/analytics/.agents/skills/actions/SKILL.md +5 -0
  77. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
  78. package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +1 -1
  79. package/corpus/templates/analytics/.agents/skills/security/SKILL.md +7 -0
  80. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +20 -2
  81. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +5 -6
  82. package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +5 -1
  83. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  84. package/corpus/templates/analytics/AGENTS.md +39 -18
  85. package/corpus/templates/analytics/actions/capture-test-error.ts +4 -0
  86. package/corpus/templates/analytics/actions/get-analytics-alert-rule-defaults.ts +23 -0
  87. package/corpus/templates/analytics/actions/get-error-issue.ts +1 -1
  88. package/corpus/templates/analytics/actions/list-analysis-revisions.ts +40 -0
  89. package/corpus/templates/analytics/actions/list-dashboard-revisions.ts +40 -0
  90. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +299 -0
  91. package/corpus/templates/analytics/actions/navigate.ts +4 -2
  92. package/corpus/templates/analytics/actions/restore-analysis-revision.ts +43 -0
  93. package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +68 -0
  94. package/corpus/templates/analytics/actions/save-analytics-alert-rule.ts +14 -0
  95. package/corpus/templates/analytics/actions/save-monitor.ts +15 -1
  96. package/corpus/templates/analytics/actions/view-screen.ts +24 -0
  97. package/corpus/templates/analytics/app/components/analysis/AnalysisHistoryPanel.tsx +181 -0
  98. package/corpus/templates/analytics/app/components/dashboard/DashboardHistoryPanel.tsx +184 -0
  99. package/corpus/templates/analytics/app/components/dashboard/DataTable.tsx +41 -6
  100. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +122 -11
  101. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +22 -16
  102. package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
  103. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +27 -21
  104. package/corpus/templates/analytics/app/hooks/use-analysis-revisions.ts +43 -0
  105. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +110 -0
  106. package/corpus/templates/analytics/app/hooks/use-dashboard-revisions.ts +43 -0
  107. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +8 -3
  108. package/corpus/templates/analytics/app/i18n/zh-TW.ts +64 -2
  109. package/corpus/templates/analytics/app/i18n-data.ts +783 -3
  110. package/corpus/templates/analytics/app/pages/Agents.tsx +359 -19
  111. package/corpus/templates/analytics/app/pages/Settings.tsx +3 -2
  112. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +34 -1
  113. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +28 -0
  114. package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +18 -1
  115. package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +7 -10
  116. package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +8 -2
  117. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueDetail.tsx +479 -23
  118. package/corpus/templates/analytics/app/pages/monitoring/errors/IssueList.tsx +0 -9
  119. package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +11 -0
  120. package/corpus/templates/analytics/app/pages/monitoring/errors/types.ts +9 -1
  121. package/corpus/templates/analytics/app/pages/monitoring/uptime/MonitorFormPage.tsx +157 -35
  122. package/corpus/templates/analytics/app/pages/monitoring/uptime/i18n.ts +17 -2
  123. package/corpus/templates/analytics/app/pages/monitoring/uptime/types.ts +4 -0
  124. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +80 -220
  125. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -99
  126. package/corpus/templates/analytics/app/pages/settings/AlertRulesSettingsCard.tsx +262 -104
  127. package/corpus/templates/analytics/app/routes/team.tsx +1 -1
  128. package/corpus/templates/analytics/changelog/2026-07-08-admins-can-audit-dashboard-usage-ownership-and-cleanup-signa.md +6 -0
  129. package/corpus/templates/analytics/changelog/2026-07-08-agent-monitoring-stays-available-to-non-admins.md +6 -0
  130. package/corpus/templates/analytics/changelog/2026-07-08-alert-rules-are-easier-to-scan-expand-and-edit-from-settings.md +6 -0
  131. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-forms-remember-last-email-recipients.md +6 -0
  132. package/corpus/templates/analytics/changelog/2026-07-08-analytics-alert-rules-can-now-use-per-rule-slack-and-webhook.md +6 -0
  133. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +5 -0
  134. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-tables-keep-their-size-while-loading.md +6 -0
  135. package/corpus/templates/analytics/changelog/2026-07-08-dashboard-usage-now-counts-explorer-dashboard-traffic.md +6 -0
  136. package/corpus/templates/analytics/changelog/2026-07-08-demo-mode-session-emails-are-filtered-and-anonymized.md +6 -0
  137. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-adds-stack-traces-and-frequency-bars.md +6 -0
  138. package/corpus/templates/analytics/changelog/2026-07-08-error-issue-detail-now-shows-the-latest-occurrence-message-a.md +6 -0
  139. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-errors-only-show-test-action-when-empty.md +6 -0
  140. package/corpus/templates/analytics/changelog/2026-07-08-monitoring-uptime-and-errors-tabs-now-clearly-show-which-view-is-active.md +6 -0
  141. package/corpus/templates/analytics/changelog/2026-07-08-production-session-replay-now-requires-private-blob-storage-.md +6 -0
  142. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-uses-stock-rrweb-sizing-again-so-recorded.md +6 -0
  143. package/corpus/templates/analytics/changelog/2026-07-08-shared-extension-links-now-show-a-clear-message-when-you-do-.md +6 -0
  144. package/corpus/templates/analytics/changelog/2026-07-08-sidebar-dashboard-menus-now-open-above-the-dashboard-canvas.md +6 -0
  145. package/corpus/templates/analytics/changelog/2026-07-08-team-settings-show-access-controls-next-to-member-lists.md +6 -0
  146. package/corpus/templates/analytics/changelog/2026-07-08-uptime-alerting-clarifies-in-app-inbox-vs-email-and-lets-you-paste-slack-or-webhook-urls-per-monitor.md +6 -0
  147. package/corpus/templates/analytics/changelog/2026-07-08-uptime-monitors-now-use-a-10-second-request-timeout-by-defau.md +6 -0
  148. package/corpus/templates/analytics/docs/uptime-monitoring.md +13 -11
  149. package/corpus/templates/analytics/server/db/schema-monitoring.ts +5 -1
  150. package/corpus/templates/analytics/server/db/schema.ts +56 -0
  151. package/corpus/templates/analytics/server/lib/analytics-alerts.ts +92 -0
  152. package/corpus/templates/analytics/server/lib/dashboards-store.ts +334 -5
  153. package/corpus/templates/analytics/server/lib/error-capture.ts +231 -36
  154. package/corpus/templates/analytics/server/lib/session-replay.ts +114 -8
  155. package/corpus/templates/analytics/server/lib/uptime-monitors.ts +65 -16
  156. package/corpus/templates/analytics/server/plugins/db.ts +122 -2
  157. package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +1 -0
  158. package/corpus/templates/assets/.agents/skills/actions/SKILL.md +5 -0
  159. package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +1 -1
  160. package/corpus/templates/assets/.agents/skills/security/SKILL.md +7 -0
  161. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +20 -2
  162. package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +5 -1
  163. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  164. package/corpus/templates/assets/AGENTS.md +4 -0
  165. package/corpus/templates/assets/app/routes/settings.tsx +1 -1
  166. package/corpus/templates/assets/app/routes/team.tsx +1 -1
  167. package/corpus/templates/brain/.agents/skills/actions/SKILL.md +5 -0
  168. package/corpus/templates/brain/.agents/skills/adding-a-feature/SKILL.md +5 -0
  169. package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +1 -1
  170. package/corpus/templates/brain/.agents/skills/security/SKILL.md +7 -0
  171. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +20 -2
  172. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  173. package/corpus/templates/brain/AGENTS.md +4 -0
  174. package/corpus/templates/brain/app/routes/team.tsx +1 -1
  175. package/corpus/templates/calendar/.agents/skills/actions/SKILL.md +5 -0
  176. package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +1 -1
  177. package/corpus/templates/calendar/.agents/skills/security/SKILL.md +7 -0
  178. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +20 -2
  179. package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +5 -1
  180. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  181. package/corpus/templates/calendar/AGENTS.md +4 -0
  182. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +11 -2
  183. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +21 -8
  184. package/corpus/templates/calendar/app/components/calendar/MonthView.tsx +7 -1
  185. package/corpus/templates/calendar/app/components/calendar/WeekView.tsx +11 -2
  186. package/corpus/templates/calendar/app/lib/popover-click-guard.ts +48 -4
  187. package/corpus/templates/calendar/app/pages/Settings.tsx +1 -1
  188. package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
  189. package/corpus/templates/calendar/changelog/2026-07-08-clicking-empty-calendar-space-closes-an-open-event-popover-b.md +6 -0
  190. package/corpus/templates/chat/.agents/skills/actions/SKILL.md +5 -0
  191. package/corpus/templates/chat/.agents/skills/adding-a-feature/SKILL.md +5 -0
  192. package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +1 -1
  193. package/corpus/templates/chat/.agents/skills/security/SKILL.md +7 -0
  194. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +20 -2
  195. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  196. package/corpus/templates/chat/AGENTS.md +4 -0
  197. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  198. package/corpus/templates/chat/app/routes/settings.tsx +2 -2
  199. package/corpus/templates/chat/app/routes/team.tsx +1 -1
  200. package/corpus/templates/clips/.agents/skills/actions/SKILL.md +5 -0
  201. package/corpus/templates/clips/.agents/skills/security/SKILL.md +7 -0
  202. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +20 -2
  203. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  204. package/corpus/templates/clips/AGENTS.md +4 -0
  205. package/corpus/templates/clips/actions/finalize-recording.ts +9 -3
  206. package/corpus/templates/clips/actions/set-thumbnail.ts +11 -2
  207. package/corpus/templates/clips/app/components/meetings/canvas-editor.tsx +1 -7
  208. package/corpus/templates/clips/app/components/player/player-controls.tsx +21 -13
  209. package/corpus/templates/clips/app/components/player/video-player.tsx +30 -75
  210. package/corpus/templates/clips/app/i18n/ar-SA.ts +6 -5
  211. package/corpus/templates/clips/app/i18n/de-DE.ts +6 -6
  212. package/corpus/templates/clips/app/i18n/en-US.ts +6 -5
  213. package/corpus/templates/clips/app/i18n/es-ES.ts +6 -5
  214. package/corpus/templates/clips/app/i18n/fr-FR.ts +6 -6
  215. package/corpus/templates/clips/app/i18n/hi-IN.ts +6 -5
  216. package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -5
  217. package/corpus/templates/clips/app/i18n/ko-KR.ts +6 -5
  218. package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -5
  219. package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -5
  220. package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -5
  221. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +51 -118
  222. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-notes-stay-active-from-tray-and-shortcut-controls.md +6 -0
  223. package/corpus/templates/clips/changelog/2026-07-08-desktop-meeting-popovers-can-start-notes-and-join-the-meetin.md +6 -0
  224. package/corpus/templates/clips/changelog/2026-07-08-hosted-clip-uploads-now-clear-failed-buffered-chunks.md +6 -0
  225. package/corpus/templates/clips/changelog/2026-07-08-hosted-recording-uploads-now-avoid-sql-chunk-storage.md +6 -0
  226. package/corpus/templates/clips/changelog/2026-07-08-meeting-notes-keep-their-recording-state-when-the-desktop.md +6 -0
  227. package/corpus/templates/clips/changelog/2026-07-08-meeting-recaps-now-keep-summaries-action-items-and-transcrip.md +6 -0
  228. package/corpus/templates/clips/changelog/2026-07-08-meeting-reminder-dropdowns-now-expand-fully-instead-of-being.md +6 -0
  229. package/corpus/templates/clips/changelog/2026-07-08-video-playback-controls-now-match-loom-style-5-second-skips-.md +6 -0
  230. package/corpus/templates/clips/desktop/src/app.tsx +123 -3
  231. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +15 -1
  232. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -0
  233. package/corpus/templates/clips/desktop/src/styles.css +23 -1
  234. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +1 -3
  235. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +40 -6
  236. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -2
  237. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +3 -5
  238. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +23 -19
  239. package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +3 -3
  240. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +0 -1
  241. package/corpus/templates/clips/desktop/src-tauri/src/state.rs +5 -0
  242. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -6
  243. package/corpus/templates/clips/server/lib/recording-upload-state.ts +63 -0
  244. package/corpus/templates/clips/server/lib/video-storage.ts +4 -0
  245. package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +19 -13
  246. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +40 -1
  247. package/corpus/templates/content/.agents/skills/actions/SKILL.md +5 -0
  248. package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +1 -1
  249. package/corpus/templates/content/.agents/skills/security/SKILL.md +7 -0
  250. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +20 -2
  251. package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +5 -1
  252. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  253. package/corpus/templates/content/AGENTS.md +4 -0
  254. package/corpus/templates/content/actions/_batch-utils.ts +8 -0
  255. package/corpus/templates/content/actions/_builder-cms-read-client.ts +7 -5
  256. package/corpus/templates/content/actions/_database-source-utils.ts +776 -319
  257. package/corpus/templates/content/actions/_database-utils.ts +6 -1
  258. package/corpus/templates/content/actions/_property-utils.ts +168 -0
  259. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +19 -12
  260. package/corpus/templates/content/actions/bind-content-database-source-field.ts +19 -12
  261. package/corpus/templates/content/actions/delete-document.ts +9 -13
  262. package/corpus/templates/content/actions/refresh-content-database-source.ts +5 -5
  263. package/corpus/templates/content/app/components/editor/body-hydration.ts +35 -11
  264. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +47 -5
  265. package/corpus/templates/content/app/hooks/use-documents.ts +8 -2
  266. package/corpus/templates/content/app/routes/_app.settings.tsx +2 -2
  267. package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
  268. package/corpus/templates/content/changelog/2026-07-08-builder-source-sync-now-completes-reliably-on-hosted-databases.md +6 -0
  269. package/corpus/templates/content/changelog/2026-07-08-fixed-builder-database-sync-so-large-sources-continue-past-t.md +6 -0
  270. package/corpus/templates/content/server/plugins/db.ts +19 -0
  271. package/corpus/templates/design/.agents/skills/actions/SKILL.md +5 -0
  272. package/corpus/templates/design/.agents/skills/security/SKILL.md +7 -0
  273. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +20 -2
  274. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  275. package/corpus/templates/design/AGENTS.md +4 -0
  276. package/corpus/templates/design/actions/take-design-screenshot.ts +12 -9
  277. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -13
  278. package/corpus/templates/design/app/routes/team.tsx +1 -1
  279. package/corpus/templates/design/changelog/2026-07-08-local-images-added-to-designs-now-upload-to-file-storage-ins.md +6 -0
  280. package/corpus/templates/dispatch/.agents/skills/actions/SKILL.md +5 -0
  281. package/corpus/templates/dispatch/.agents/skills/security/SKILL.md +7 -0
  282. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +20 -2
  283. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  284. package/corpus/templates/dispatch/AGENTS.md +4 -0
  285. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
  286. package/corpus/templates/dispatch/app/routes/settings.tsx +2 -2
  287. package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
  288. package/corpus/templates/forms/.agents/skills/actions/SKILL.md +5 -0
  289. package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +1 -1
  290. package/corpus/templates/forms/.agents/skills/security/SKILL.md +7 -0
  291. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +20 -2
  292. package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +5 -1
  293. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  294. package/corpus/templates/forms/AGENTS.md +4 -0
  295. package/corpus/templates/forms/app/routes/_app.settings.tsx +2 -2
  296. package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
  297. package/corpus/templates/forms/shared/navigation.ts +1 -1
  298. package/corpus/templates/macros/.agents/skills/security/SKILL.md +7 -0
  299. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  300. package/corpus/templates/macros/AGENTS.md +4 -0
  301. package/corpus/templates/macros/app/routes/settings.tsx +2 -2
  302. package/corpus/templates/macros/app/routes/team.tsx +1 -1
  303. package/corpus/templates/mail/.agents/skills/actions/SKILL.md +5 -0
  304. package/corpus/templates/mail/.agents/skills/email-drafts/SKILL.md +1 -1
  305. package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +1 -1
  306. package/corpus/templates/mail/.agents/skills/security/SKILL.md +7 -0
  307. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +20 -2
  308. package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +5 -1
  309. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  310. package/corpus/templates/mail/AGENTS.md +4 -0
  311. package/corpus/templates/mail/changelog/2026-07-08-mail-attachments-in-hosted-environments-now-require-file-sto.md +6 -0
  312. package/corpus/templates/mail/server/handlers/media.ts +26 -1
  313. package/corpus/templates/mail/server/lib/outgoing-email.ts +24 -1
  314. package/corpus/templates/mail/server/lib/upload-store.ts +2 -1
  315. package/corpus/templates/plan/.agents/skills/actions/SKILL.md +5 -0
  316. package/corpus/templates/plan/.agents/skills/adding-a-feature/SKILL.md +5 -0
  317. package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +1 -1
  318. package/corpus/templates/plan/.agents/skills/security/SKILL.md +7 -0
  319. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +20 -2
  320. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  321. package/corpus/templates/plan/AGENTS.md +4 -0
  322. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
  323. package/corpus/templates/plan/app/routes/settings.tsx +2 -2
  324. package/corpus/templates/plan/app/routes/team.tsx +1 -1
  325. package/corpus/templates/plan/changelog/2026-07-08-hosted-plan-images-now-require-connected-storage.md +6 -0
  326. package/corpus/templates/plan/server/lib/plan-assets.ts +33 -4
  327. package/corpus/templates/slides/.agents/skills/actions/SKILL.md +5 -0
  328. package/corpus/templates/slides/.agents/skills/security/SKILL.md +7 -0
  329. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +20 -2
  330. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  331. package/corpus/templates/slides/AGENTS.md +4 -0
  332. package/corpus/templates/slides/actions/generate-image-api.ts +15 -3
  333. package/corpus/templates/slides/app/routes/settings.tsx +2 -2
  334. package/corpus/templates/slides/app/routes/team.tsx +1 -1
  335. package/corpus/templates/slides/changelog/2026-07-08-generated-slide-images-now-return-hosted-file-storage-urls-i.md +6 -0
  336. package/corpus/templates/slides/shared/api.ts +1 -1
  337. package/corpus/templates/videos/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  338. package/corpus/templates/voice/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  339. package/dist/agent/production-agent.d.ts +5 -1
  340. package/dist/agent/production-agent.d.ts.map +1 -1
  341. package/dist/agent/production-agent.js +112 -42
  342. package/dist/agent/production-agent.js.map +1 -1
  343. package/dist/agent/tool-search.d.ts +2 -0
  344. package/dist/agent/tool-search.d.ts.map +1 -1
  345. package/dist/agent/tool-search.js +60 -4
  346. package/dist/agent/tool-search.js.map +1 -1
  347. package/dist/application-state/store.d.ts.map +1 -1
  348. package/dist/application-state/store.js +8 -2
  349. package/dist/application-state/store.js.map +1 -1
  350. package/dist/cli/index.js +19 -0
  351. package/dist/cli/index.js.map +1 -1
  352. package/dist/cli/upgrade.d.ts +100 -0
  353. package/dist/cli/upgrade.d.ts.map +1 -0
  354. package/dist/cli/upgrade.js +678 -0
  355. package/dist/cli/upgrade.js.map +1 -0
  356. package/dist/client/AssistantChat.d.ts.map +1 -1
  357. package/dist/client/AssistantChat.js +25 -14
  358. package/dist/client/AssistantChat.js.map +1 -1
  359. package/dist/client/HighlightedCodeBlock.d.ts +2 -0
  360. package/dist/client/HighlightedCodeBlock.d.ts.map +1 -1
  361. package/dist/client/HighlightedCodeBlock.js +10 -1
  362. package/dist/client/HighlightedCodeBlock.js.map +1 -1
  363. package/dist/client/PoweredByBadge.d.ts +1 -1
  364. package/dist/client/PoweredByBadge.d.ts.map +1 -1
  365. package/dist/client/PoweredByBadge.js +3 -9
  366. package/dist/client/PoweredByBadge.js.map +1 -1
  367. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  368. package/dist/client/agent-chat-adapter.js +60 -13
  369. package/dist/client/agent-chat-adapter.js.map +1 -1
  370. package/dist/client/chat/message-components.d.ts.map +1 -1
  371. package/dist/client/chat/message-components.js +61 -8
  372. package/dist/client/chat/message-components.js.map +1 -1
  373. package/dist/client/chat/tool-call-display.d.ts +12 -0
  374. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  375. package/dist/client/chat/tool-call-display.js +136 -42
  376. package/dist/client/chat/tool-call-display.js.map +1 -1
  377. package/dist/client/chat/widgets/DataTableWidget.d.ts.map +1 -1
  378. package/dist/client/chat/widgets/DataTableWidget.js +19 -2
  379. package/dist/client/chat/widgets/DataTableWidget.js.map +1 -1
  380. package/dist/client/code-agent-chat-adapter.js +2 -9
  381. package/dist/client/code-agent-chat-adapter.js.map +1 -1
  382. package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
  383. package/dist/client/db-admin/TableEditor.js +19 -2
  384. package/dist/client/db-admin/TableEditor.js.map +1 -1
  385. package/dist/client/db-admin/export-utils.d.ts +2 -0
  386. package/dist/client/db-admin/export-utils.d.ts.map +1 -1
  387. package/dist/client/db-admin/export-utils.js +11 -3
  388. package/dist/client/db-admin/export-utils.js.map +1 -1
  389. package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
  390. package/dist/client/db-admin/useAgentSync.js +63 -0
  391. package/dist/client/db-admin/useAgentSync.js.map +1 -1
  392. package/dist/client/error-capture.d.ts.map +1 -1
  393. package/dist/client/error-capture.js +41 -7
  394. package/dist/client/error-capture.js.map +1 -1
  395. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  396. package/dist/client/extensions/EmbeddedExtension.js +3 -1
  397. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  398. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  399. package/dist/client/extensions/ExtensionViewer.js +32 -5
  400. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  401. package/dist/client/extensions/InlineExtensionFrame.d.ts.map +1 -1
  402. package/dist/client/extensions/InlineExtensionFrame.js +3 -1
  403. package/dist/client/extensions/InlineExtensionFrame.js.map +1 -1
  404. package/dist/client/extensions/portable-extension.d.ts.map +1 -1
  405. package/dist/client/extensions/portable-extension.js +1 -0
  406. package/dist/client/extensions/portable-extension.js.map +1 -1
  407. package/dist/client/org/OrgSwitcher.d.ts +1 -1
  408. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  409. package/dist/client/org/OrgSwitcher.js +11 -6
  410. package/dist/client/org/OrgSwitcher.js.map +1 -1
  411. package/dist/client/org/TeamPage.d.ts.map +1 -1
  412. package/dist/client/org/TeamPage.js +5 -5
  413. package/dist/client/org/TeamPage.js.map +1 -1
  414. package/dist/client/session-replay.d.ts +0 -8
  415. package/dist/client/session-replay.d.ts.map +1 -1
  416. package/dist/client/session-replay.js +3 -80
  417. package/dist/client/session-replay.js.map +1 -1
  418. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  419. package/dist/client/settings/SettingsPanel.js +89 -33
  420. package/dist/client/settings/SettingsPanel.js.map +1 -1
  421. package/dist/client/settings/SettingsSection.d.ts +19 -4
  422. package/dist/client/settings/SettingsSection.d.ts.map +1 -1
  423. package/dist/client/settings/SettingsSection.js +33 -4
  424. package/dist/client/settings/SettingsSection.js.map +1 -1
  425. package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
  426. package/dist/client/settings/SettingsTabsPage.js +21 -10
  427. package/dist/client/settings/SettingsTabsPage.js.map +1 -1
  428. package/dist/client/sse-event-processor.d.ts +9 -0
  429. package/dist/client/sse-event-processor.d.ts.map +1 -1
  430. package/dist/client/sse-event-processor.js +20 -2
  431. package/dist/client/sse-event-processor.js.map +1 -1
  432. package/dist/db-admin/agent-tools.d.ts.map +1 -1
  433. package/dist/db-admin/agent-tools.js +7 -2
  434. package/dist/db-admin/agent-tools.js.map +1 -1
  435. package/dist/db-admin/operations.d.ts.map +1 -1
  436. package/dist/db-admin/operations.js +90 -4
  437. package/dist/db-admin/operations.js.map +1 -1
  438. package/dist/db-admin/routes.d.ts.map +1 -1
  439. package/dist/db-admin/routes.js +1 -0
  440. package/dist/db-admin/routes.js.map +1 -1
  441. package/dist/db-admin/types.d.ts +4 -0
  442. package/dist/db-admin/types.d.ts.map +1 -1
  443. package/dist/db-admin/types.js.map +1 -1
  444. package/dist/extensions/actions.d.ts.map +1 -1
  445. package/dist/extensions/actions.js +85 -5
  446. package/dist/extensions/actions.js.map +1 -1
  447. package/dist/extensions/html-shell.d.ts +5 -4
  448. package/dist/extensions/html-shell.d.ts.map +1 -1
  449. package/dist/extensions/html-shell.js.map +1 -1
  450. package/dist/extensions/routes.d.ts.map +1 -1
  451. package/dist/extensions/routes.js +8 -0
  452. package/dist/extensions/routes.js.map +1 -1
  453. package/dist/navigation/index.d.ts +1 -1
  454. package/dist/navigation/index.d.ts.map +1 -1
  455. package/dist/navigation/index.js +1 -1
  456. package/dist/navigation/index.js.map +1 -1
  457. package/dist/notifications/channels.d.ts +8 -3
  458. package/dist/notifications/channels.d.ts.map +1 -1
  459. package/dist/notifications/channels.js +61 -22
  460. package/dist/notifications/channels.js.map +1 -1
  461. package/dist/notifications/registry.d.ts.map +1 -1
  462. package/dist/notifications/registry.js +14 -3
  463. package/dist/notifications/registry.js.map +1 -1
  464. package/dist/notifications/types.d.ts +4 -1
  465. package/dist/notifications/types.d.ts.map +1 -1
  466. package/dist/notifications/types.js.map +1 -1
  467. package/dist/resources/handlers.d.ts +5 -0
  468. package/dist/resources/handlers.d.ts.map +1 -1
  469. package/dist/resources/handlers.js +9 -8
  470. package/dist/resources/handlers.js.map +1 -1
  471. package/dist/server/agent-chat-plugin.d.ts +5 -1
  472. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  473. package/dist/server/agent-chat-plugin.js +2 -2
  474. package/dist/server/agent-chat-plugin.js.map +1 -1
  475. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  476. package/dist/server/poll.d.ts +12 -4
  477. package/dist/server/poll.d.ts.map +1 -1
  478. package/dist/server/poll.js +236 -9
  479. package/dist/server/poll.js.map +1 -1
  480. package/dist/server/request-context.d.ts +7 -0
  481. package/dist/server/request-context.d.ts.map +1 -1
  482. package/dist/server/request-context.js.map +1 -1
  483. package/dist/styles/agent-conversation.css +1 -1
  484. package/dist/styles/agent-native.css +27 -0
  485. package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -0
  486. package/dist/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  487. package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  488. package/dist/templates/default/.agents/skills/security/SKILL.md +7 -0
  489. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  490. package/dist/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  491. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  492. package/dist/templates/default/AGENTS.md +14 -5
  493. package/dist/templates/default/package.json +2 -1
  494. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  495. package/dist/templates/headless/AGENTS.md +13 -3
  496. package/dist/templates/headless/package.json +1 -0
  497. package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  498. package/dist/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  499. package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  500. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  501. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  502. package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  503. package/dist/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  504. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  505. package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  506. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  507. package/dist/templates/workspace-core/AGENTS.md +7 -1
  508. package/dist/templates/workspace-root/AGENTS.md +17 -5
  509. package/dist/templates/workspace-root/package.json +1 -0
  510. package/docs/content/faq.mdx +17 -0
  511. package/docs/content/notifications.mdx +12 -6
  512. package/package.json +2 -2
  513. package/src/templates/default/.agents/skills/actions/SKILL.md +5 -0
  514. package/src/templates/default/.agents/skills/adding-a-feature/SKILL.md +5 -0
  515. package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +1 -1
  516. package/src/templates/default/.agents/skills/security/SKILL.md +7 -0
  517. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +20 -2
  518. package/src/templates/default/.agents/skills/storing-data/SKILL.md +5 -1
  519. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  520. package/src/templates/default/AGENTS.md +14 -5
  521. package/src/templates/default/package.json +2 -1
  522. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  523. package/src/templates/headless/AGENTS.md +13 -3
  524. package/src/templates/headless/package.json +1 -0
  525. package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -0
  526. package/src/templates/workspace-core/.agents/skills/adding-a-feature/SKILL.md +5 -0
  527. package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +4 -0
  528. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +6 -0
  529. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +4 -0
  530. package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +1 -1
  531. package/src/templates/workspace-core/.agents/skills/security/SKILL.md +7 -0
  532. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +20 -2
  533. package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +5 -1
  534. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +87 -0
  535. package/src/templates/workspace-core/AGENTS.md +7 -1
  536. package/src/templates/workspace-root/AGENTS.md +17 -5
  537. package/src/templates/workspace-root/package.json +1 -0
  538. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-clamps-ultra-wide-viewports-while-keeping-the.md +0 -6
@@ -1 +1 @@
1
- {"version":3,"file":"agent-tools.js","sourceRoot":"","sources":["../../src/db-admin/agent-tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Dev-only agent tools for the database admin.\n *\n * These mirror the HTTP routes and call the SAME `operations.ts` functions, so\n * the agent can introspect and edit the full database during local development.\n * They are spread into the DEV actions surface ONLY (never `prodActions`) and\n * the dev surface itself is gated to dev + localhost upstream.\n *\n * Complex params (sort / filters / inserts / updates / deletes / params) are\n * accepted as JSON strings and parsed here, matching how the framework's other\n * structured CLI-style tools accept JSON-encoded arguments.\n */\nimport type { ActionEntry } from \"../agent/production-agent.js\";\nimport {\n applyMutations,\n getRows,\n getTableSchema,\n listTables,\n runSql,\n DbAdminConfirmRequiredError,\n} from \"./operations.js\";\nimport type { DbAdminFilter, DbAdminMutation, DbAdminSort } from \"./types.js\";\n\nfunction parseJson<T>(value: unknown, field: string): T | undefined {\n if (value == null || value === \"\") return undefined;\n if (typeof value !== \"string\") return value as T;\n try {\n return JSON.parse(value) as T;\n } catch {\n throw new Error(\n `Invalid JSON for \"${field}\": ${String(value).slice(0, 200)}`,\n );\n }\n}\n\nexport function createDbAdminAgentTools(): Record<string, ActionEntry> {\n return {\n \"db-admin-tables\": {\n tool: {\n description:\n \"DEV ONLY. List every table and view in the full database (unscoped) with row counts. Use to see the whole data model before reading or editing rows.\",\n parameters: { type: \"object\", properties: {} },\n },\n readOnly: true,\n run: async () => JSON.stringify(await listTables()),\n },\n\n \"db-admin-schema\": {\n tool: {\n description:\n \"DEV ONLY. Get the full schema for one table or view: columns, types, nullability, primary key, foreign keys, indexes, and row count.\",\n parameters: {\n type: \"object\",\n properties: {\n table: { type: \"string\", description: \"Table or view name\" },\n },\n required: [\"table\"],\n },\n },\n readOnly: true,\n run: async (args: Record<string, string>) =>\n JSON.stringify(await getTableSchema(String(args.table))),\n },\n\n \"db-admin-rows\": {\n tool: {\n description:\n \"DEV ONLY. Read rows from one table (unscoped) with pagination, sorting, and filters. Returns column metadata, the page of rows, and the total count.\",\n parameters: {\n type: \"object\",\n properties: {\n table: { type: \"string\", description: \"Table or view name\" },\n page: {\n type: \"string\",\n description: \"1-based page number (default 1)\",\n },\n pageSize: {\n type: \"string\",\n description: \"Rows per page (default 50, max 1000)\",\n },\n sort: {\n type: \"string\",\n description:\n 'JSON array of sort specs, e.g. \\'[{\"column\":\"created_at\",\"dir\":\"desc\"}]\\'',\n },\n filters: {\n type: \"string\",\n description:\n 'JSON array of filters, e.g. \\'[{\"column\":\"status\",\"op\":\"eq\",\"value\":\"draft\"}]\\'. Ops: eq, neq, lt, lte, gt, gte, like, ilike, in, is_null, not_null.',\n },\n },\n required: [\"table\"],\n },\n },\n readOnly: true,\n run: async (args: Record<string, string>) => {\n const result = await getRows(String(args.table), {\n page: Number(args.page) || 1,\n pageSize: Number(args.pageSize) || 50,\n sort: parseJson<DbAdminSort[]>(args.sort, \"sort\"),\n filters: parseJson<DbAdminFilter[]>(args.filters, \"filters\"),\n });\n return JSON.stringify(result);\n },\n },\n\n \"db-admin-mutate\": {\n tool: {\n description:\n 'DEV ONLY. Insert, update, and/or delete rows in one table (unscoped — full database access). PREFER THIS over db-exec/db-patch for any database-admin edit, and ALWAYS use it (not db-exec) for tables without owner_email/org_id columns — db-exec auto-scopes to the current user and will match 0 rows on unscoped tables. Pass `dryRun: \"true\"` to get the SQL without executing. Each update/delete must include a where clause.',\n parameters: {\n type: \"object\",\n properties: {\n table: { type: \"string\", description: \"Table name\" },\n inserts: {\n type: \"string\",\n description:\n 'JSON array of row objects to insert, e.g. \\'[{\"id\":\"1\",\"title\":\"Hi\"}]\\'',\n },\n updates: {\n type: \"string\",\n description:\n 'JSON array of {where, set} objects, e.g. \\'[{\"where\":{\"id\":\"1\"},\"set\":{\"title\":\"Bye\"}}]\\'',\n },\n deletes: {\n type: \"string\",\n description: 'JSON array of where objects, e.g. \\'[{\"id\":\"1\"}]\\'',\n },\n dryRun: {\n type: \"string\",\n description: 'Set to \"true\" to return SQL without executing',\n },\n },\n required: [\"table\"],\n },\n },\n run: async (args: Record<string, string>) => {\n const mutation: DbAdminMutation = {\n inserts: parseJson<Record<string, unknown>[]>(\n args.inserts,\n \"inserts\",\n ),\n updates: parseJson<\n { where: Record<string, unknown>; set: Record<string, unknown> }[]\n >(args.updates, \"updates\"),\n deletes: parseJson<Record<string, unknown>[]>(\n args.deletes,\n \"deletes\",\n ),\n dryRun: String(args.dryRun) === \"true\",\n };\n return JSON.stringify(\n await applyMutations(String(args.table), mutation),\n );\n },\n },\n\n \"db-admin-query\": {\n tool: {\n description:\n 'DEV ONLY. Run arbitrary SQL against the full database (unscoped). PREFER THIS over db-query/db-exec for database-admin work and for any table without owner_email/org_id scoping (the scoped tools match 0 rows on those). Bare SELECTs are auto-limited to 100 rows. Destructive statements (DROP / TRUNCATE / unscoped DELETE or UPDATE) require confirmDestructive: \"true\".',\n parameters: {\n type: \"object\",\n properties: {\n sql: { type: \"string\", description: \"SQL statement to run\" },\n params: {\n type: \"string\",\n description:\n \"Optional JSON array of positional bind args for ? placeholders\",\n },\n confirmDestructive: {\n type: \"string\",\n description: 'Set to \"true\" to allow destructive statements',\n },\n },\n required: [\"sql\"],\n },\n },\n run: async (args: Record<string, string>) => {\n try {\n const result = await runSql(\n String(args.sql),\n parseJson<unknown[]>(args.params, \"params\"),\n { confirmDestructive: String(args.confirmDestructive) === \"true\" },\n );\n return JSON.stringify(result);\n } catch (err) {\n if (err instanceof DbAdminConfirmRequiredError) {\n return JSON.stringify({ needsConfirm: true, error: err.message });\n }\n throw err;\n }\n },\n },\n };\n}\n"]}
1
+ {"version":3,"file":"agent-tools.js","sourceRoot":"","sources":["../../src/db-admin/agent-tools.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Dev-only agent tools for the database admin.\n *\n * These mirror the HTTP routes and call the SAME `operations.ts` functions, so\n * the agent can introspect and edit the full database during local development.\n * They are spread into the DEV actions surface ONLY (never `prodActions`) and\n * the dev surface itself is gated to dev + localhost upstream.\n *\n * Complex params (sort / filters / inserts / updates / deletes / params) are\n * accepted as JSON strings and parsed here, matching how the framework's other\n * structured CLI-style tools accept JSON-encoded arguments.\n */\nimport type { ActionEntry } from \"../agent/production-agent.js\";\nimport {\n applyMutations,\n getRows,\n getTableSchema,\n listTables,\n runSql,\n DbAdminConfirmRequiredError,\n} from \"./operations.js\";\nimport type { DbAdminFilter, DbAdminMutation, DbAdminSort } from \"./types.js\";\n\nfunction parseJson<T>(value: unknown, field: string): T | undefined {\n if (value == null || value === \"\") return undefined;\n if (typeof value !== \"string\") return value as T;\n try {\n return JSON.parse(value) as T;\n } catch {\n throw new Error(\n `Invalid JSON for \"${field}\": ${String(value).slice(0, 200)}`,\n );\n }\n}\n\nexport function createDbAdminAgentTools(): Record<string, ActionEntry> {\n return {\n \"db-admin-tables\": {\n tool: {\n description:\n \"DEV ONLY. List every table and view in the full database (unscoped) with row counts. Use to see the whole data model before reading or editing rows.\",\n parameters: { type: \"object\", properties: {} },\n },\n readOnly: true,\n run: async () => JSON.stringify(await listTables()),\n },\n\n \"db-admin-schema\": {\n tool: {\n description:\n \"DEV ONLY. Get the full schema for one table or view: columns, types, nullability, primary key, foreign keys, indexes, and row count.\",\n parameters: {\n type: \"object\",\n properties: {\n table: { type: \"string\", description: \"Table or view name\" },\n },\n required: [\"table\"],\n },\n },\n readOnly: true,\n run: async (args: Record<string, string>) =>\n JSON.stringify(await getTableSchema(String(args.table))),\n },\n\n \"db-admin-rows\": {\n tool: {\n description:\n 'DEV ONLY. Read rows from one table (unscoped) with pagination, sorting, and filters. Large text/JSON cells are previewed by default; pass includeLargeCells: \"true\" only when you need the full value.',\n parameters: {\n type: \"object\",\n properties: {\n table: { type: \"string\", description: \"Table or view name\" },\n page: {\n type: \"string\",\n description: \"1-based page number (default 1)\",\n },\n pageSize: {\n type: \"string\",\n description: \"Rows per page (default 50, max 1000)\",\n },\n sort: {\n type: \"string\",\n description:\n 'JSON array of sort specs, e.g. \\'[{\"column\":\"created_at\",\"dir\":\"desc\"}]\\'',\n },\n filters: {\n type: \"string\",\n description:\n 'JSON array of filters, e.g. \\'[{\"column\":\"status\",\"op\":\"eq\",\"value\":\"draft\"}]\\'. Ops: eq, neq, lt, lte, gt, gte, like, ilike, in, is_null, not_null.',\n },\n includeLargeCells: {\n type: \"string\",\n description:\n 'Set to \"true\" to return full large text/JSON cells instead of previews.',\n },\n },\n required: [\"table\"],\n },\n },\n readOnly: true,\n run: async (args: Record<string, string>) => {\n const result = await getRows(String(args.table), {\n page: Number(args.page) || 1,\n pageSize: Number(args.pageSize) || 50,\n sort: parseJson<DbAdminSort[]>(args.sort, \"sort\"),\n filters: parseJson<DbAdminFilter[]>(args.filters, \"filters\"),\n includeLargeCells: String(args.includeLargeCells) === \"true\",\n });\n return JSON.stringify(result);\n },\n },\n\n \"db-admin-mutate\": {\n tool: {\n description:\n 'DEV ONLY. Insert, update, and/or delete rows in one table (unscoped — full database access). PREFER THIS over db-exec/db-patch for any database-admin edit, and ALWAYS use it (not db-exec) for tables without owner_email/org_id columns — db-exec auto-scopes to the current user and will match 0 rows on unscoped tables. Pass `dryRun: \"true\"` to get the SQL without executing. Each update/delete must include a where clause.',\n parameters: {\n type: \"object\",\n properties: {\n table: { type: \"string\", description: \"Table name\" },\n inserts: {\n type: \"string\",\n description:\n 'JSON array of row objects to insert, e.g. \\'[{\"id\":\"1\",\"title\":\"Hi\"}]\\'',\n },\n updates: {\n type: \"string\",\n description:\n 'JSON array of {where, set} objects, e.g. \\'[{\"where\":{\"id\":\"1\"},\"set\":{\"title\":\"Bye\"}}]\\'',\n },\n deletes: {\n type: \"string\",\n description: 'JSON array of where objects, e.g. \\'[{\"id\":\"1\"}]\\'',\n },\n dryRun: {\n type: \"string\",\n description: 'Set to \"true\" to return SQL without executing',\n },\n },\n required: [\"table\"],\n },\n },\n run: async (args: Record<string, string>) => {\n const mutation: DbAdminMutation = {\n inserts: parseJson<Record<string, unknown>[]>(\n args.inserts,\n \"inserts\",\n ),\n updates: parseJson<\n { where: Record<string, unknown>; set: Record<string, unknown> }[]\n >(args.updates, \"updates\"),\n deletes: parseJson<Record<string, unknown>[]>(\n args.deletes,\n \"deletes\",\n ),\n dryRun: String(args.dryRun) === \"true\",\n };\n return JSON.stringify(\n await applyMutations(String(args.table), mutation),\n );\n },\n },\n\n \"db-admin-query\": {\n tool: {\n description:\n 'DEV ONLY. Run arbitrary SQL against the full database (unscoped). PREFER this over db-query/db-exec for database-admin work and for tables without owner_email/org_id scoping. Bare SELECTs are auto-limited to 100 rows, and large string cells are truncated in the tool result. Destructive statements require confirmDestructive: \"true\".',\n parameters: {\n type: \"object\",\n properties: {\n sql: { type: \"string\", description: \"SQL statement to run\" },\n params: {\n type: \"string\",\n description:\n \"Optional JSON array of positional bind args for ? placeholders\",\n },\n confirmDestructive: {\n type: \"string\",\n description: 'Set to \"true\" to allow destructive statements',\n },\n },\n required: [\"sql\"],\n },\n },\n run: async (args: Record<string, string>) => {\n try {\n const result = await runSql(\n String(args.sql),\n parseJson<unknown[]>(args.params, \"params\"),\n { confirmDestructive: String(args.confirmDestructive) === \"true\" },\n );\n return JSON.stringify(result);\n } catch (err) {\n if (err instanceof DbAdminConfirmRequiredError) {\n return JSON.stringify({ needsConfirm: true, error: err.message });\n }\n throw err;\n }\n },\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/db-admin/operations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAEV,cAAc,EAId,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AA+CD,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IAClE,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B,CAAC,CAwCD;AAuBD,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAK7B;AA+RD,wBAAsB,OAAO,CAC3B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,kBAAkB,EACvB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,iBAAiB,CAAC,CA+B5B;AAyDD,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,eAAe,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,qBAAqB,CAAC,CA+ChC;AAMD,6EAA6E;AAC7E,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,QAAQ,CAAC,YAAY,QAAQ;IAC7B,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAmCD,wBAAsB,MAAM,CAC1B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAC7B,IAAI,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,EAC3C,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAuC7B"}
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/db-admin/operations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAEV,cAAc,EAId,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAWpB,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAgJD,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IAClE,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B,CAAC,CAwCD;AAuBD,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAK7B;AA+RD,wBAAsB,OAAO,CAC3B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,kBAAkB,EACvB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAmC5B;AA6DD,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,eAAe,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,qBAAqB,CAAC,CA+ChC;AAMD,6EAA6E;AAC7E,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,QAAQ,CAAC,YAAY,QAAQ;IAC7B,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAmCD,wBAAsB,MAAM,CAC1B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAC7B,IAAI,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,EAC3C,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,kBAAkB,CAAC,CA2C7B"}
@@ -19,6 +19,8 @@ import { notifyActionChange } from "../server/action-change.js";
19
19
  // Identifier validation + quoting
20
20
  // ---------------------------------------------------------------------------
21
21
  const IDENT_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
22
+ const LARGE_CELL_PREVIEW_CHARS = 16 * 1024;
23
+ const LARGE_CELL_SUFFIX = "\n...[db-admin truncated large cell; request includeLargeCells=true for the full value]";
22
24
  /** Throw on any identifier that isn't a plain `[A-Za-z_][A-Za-z0-9_]*`. */
23
25
  function assertIdent(name, kind = "identifier") {
24
26
  if (typeof name !== "string" || !IDENT_RE.test(name)) {
@@ -39,6 +41,80 @@ function dialect(runtime) {
39
41
  function isPostgresRuntime(runtime) {
40
42
  return dialect(runtime) === "postgres";
41
43
  }
44
+ function isPreviewableLargeColumn(column) {
45
+ const type = column.type.toLowerCase();
46
+ return /\b(text|char|varchar|character|jsonb?|xml|clob)\b/.test(type);
47
+ }
48
+ function markLargeValuePreviewColumns(columns, includeLargeCells) {
49
+ if (includeLargeCells)
50
+ return columns;
51
+ return columns.map((column) => isPreviewableLargeColumn(column)
52
+ ? { ...column, largeValuePreview: true }
53
+ : column);
54
+ }
55
+ function buildRowsSelectList(columns, includeLargeCells) {
56
+ if (includeLargeCells) {
57
+ return columns.map((column) => quoteIdent(column.name)).join(", ");
58
+ }
59
+ return columns
60
+ .map((column) => {
61
+ const quoted = quoteIdent(column.name);
62
+ if (!isPreviewableLargeColumn(column))
63
+ return quoted;
64
+ const textValue = `CAST(${quoted} AS TEXT)`;
65
+ return `CASE WHEN length(${textValue}) > ${LARGE_CELL_PREVIEW_CHARS} THEN substr(${textValue}, 1, ${LARGE_CELL_PREVIEW_CHARS}) || '${LARGE_CELL_SUFFIX.replace(/'/g, "''")}' ELSE ${textValue} END AS ${quoted}`;
66
+ })
67
+ .join(", ");
68
+ }
69
+ function truncateLargeResultCells(rows) {
70
+ let truncatedCells = 0;
71
+ const mapped = rows.map((row) => {
72
+ let changed = false;
73
+ const next = {};
74
+ for (const [key, value] of Object.entries(row)) {
75
+ if (typeof value === "string" &&
76
+ value.length > LARGE_CELL_PREVIEW_CHARS) {
77
+ next[key] =
78
+ `${value.slice(0, LARGE_CELL_PREVIEW_CHARS)}${LARGE_CELL_SUFFIX}`;
79
+ truncatedCells += 1;
80
+ changed = true;
81
+ }
82
+ else {
83
+ next[key] = value;
84
+ }
85
+ }
86
+ return changed ? next : row;
87
+ });
88
+ return { rows: mapped, truncatedCells };
89
+ }
90
+ function countTruncatedResultCells(rows) {
91
+ let truncatedCells = 0;
92
+ for (const row of rows) {
93
+ for (const value of Object.values(row)) {
94
+ if (typeof value === "string" && value.endsWith(LARGE_CELL_SUFFIX)) {
95
+ truncatedCells += 1;
96
+ }
97
+ }
98
+ }
99
+ return truncatedCells;
100
+ }
101
+ function containsLargeCellPreview(value) {
102
+ if (typeof value === "string")
103
+ return value.endsWith(LARGE_CELL_SUFFIX);
104
+ if (Array.isArray(value))
105
+ return value.some(containsLargeCellPreview);
106
+ if (value && typeof value === "object") {
107
+ return Object.values(value).some(containsLargeCellPreview);
108
+ }
109
+ return false;
110
+ }
111
+ function assertNoLargeCellPreviewMutation(row, context) {
112
+ for (const [column, value] of Object.entries(row)) {
113
+ if (containsLargeCellPreview(value)) {
114
+ throw new Error(`Refusing to ${context} with previewed large-cell value in column "${column}". Reload the row with includeLargeCells=true before saving.`);
115
+ }
116
+ }
117
+ }
42
118
  // ---------------------------------------------------------------------------
43
119
  // Notify the UI after a real mutation so polling refetches.
44
120
  // ---------------------------------------------------------------------------
@@ -370,21 +446,25 @@ export async function getRows(table, req, runtime) {
370
446
  const where = buildWhere(req.filters, runtime);
371
447
  const orderBy = buildOrderBy(req.sort);
372
448
  const quoted = quoteIdent(table);
449
+ const includeLargeCells = req.includeLargeCells === true;
450
+ const selectList = buildRowsSelectList(schema.columns, includeLargeCells);
373
451
  const countRes = await client.execute({
374
452
  sql: `SELECT COUNT(*) AS c FROM ${quoted}${where.clause}`,
375
453
  args: where.args,
376
454
  });
377
455
  const total = Number(countRes.rows[0]?.c ?? 0) || 0;
378
456
  const rowsRes = await client.execute({
379
- sql: `SELECT * FROM ${quoted}${where.clause}${orderBy} LIMIT ? OFFSET ?`,
457
+ sql: `SELECT ${selectList} FROM ${quoted}${where.clause}${orderBy} LIMIT ? OFFSET ?`,
380
458
  args: [...where.args, pageSize, offset],
381
459
  });
460
+ const rows = rowsRes.rows;
382
461
  return {
383
- columns: schema.columns,
384
- rows: rowsRes.rows,
462
+ columns: markLargeValuePreviewColumns(schema.columns, includeLargeCells),
463
+ rows,
385
464
  total,
386
465
  page,
387
466
  pageSize,
467
+ truncatedCells: includeLargeCells ? 0 : countTruncatedResultCells(rows),
388
468
  };
389
469
  }
390
470
  // ---------------------------------------------------------------------------
@@ -395,6 +475,7 @@ function buildInsert(table, row) {
395
475
  if (cols.length === 0) {
396
476
  throw new Error("Cannot insert an empty row");
397
477
  }
478
+ assertNoLargeCellPreviewMutation(row, "insert");
398
479
  cols.forEach((c) => assertIdent(c, "column name"));
399
480
  const sql = `INSERT INTO ${quoteIdent(table)} (${cols
400
481
  .map(quoteIdent)
@@ -409,6 +490,8 @@ function buildUpdate(table, set, where) {
409
490
  if (whereCols.length === 0) {
410
491
  throw new Error("Update requires a non-empty where clause");
411
492
  }
493
+ assertNoLargeCellPreviewMutation(set, "update");
494
+ assertNoLargeCellPreviewMutation(where, "match rows");
412
495
  setCols.forEach((c) => assertIdent(c, "column name"));
413
496
  whereCols.forEach((c) => assertIdent(c, "column name"));
414
497
  const setSql = setCols.map((c) => `${quoteIdent(c)} = ?`).join(", ");
@@ -424,6 +507,7 @@ function buildDelete(table, where) {
424
507
  if (whereCols.length === 0) {
425
508
  throw new Error("Delete requires a non-empty where clause");
426
509
  }
510
+ assertNoLargeCellPreviewMutation(where, "delete");
427
511
  whereCols.forEach((c) => assertIdent(c, "column name"));
428
512
  const whereSql = whereCols.map((c) => `${quoteIdent(c)} = ?`).join(" AND ");
429
513
  const sql = `DELETE FROM ${quoteIdent(table)} WHERE ${whereSql}`;
@@ -536,7 +620,8 @@ export async function runSql(sql, params, opts = {}, runtime) {
536
620
  const started = Date.now();
537
621
  const res = await client.execute(params && params.length > 0 ? { sql: finalSql, args: params } : finalSql);
538
622
  const durationMs = Date.now() - started;
539
- const rows = (res.rows ?? []);
623
+ const truncation = truncateLargeResultCells((res.rows ?? []));
624
+ const rows = truncation.rows;
540
625
  const columns = rows.length > 0 && rows[0] && typeof rows[0] === "object"
541
626
  ? Object.keys(rows[0])
542
627
  : [];
@@ -547,6 +632,7 @@ export async function runSql(sql, params, opts = {}, runtime) {
547
632
  rows,
548
633
  rowsAffected: res.rowsAffected ?? 0,
549
634
  durationMs,
635
+ truncatedCells: truncation.truncatedCells,
550
636
  };
551
637
  }
552
638
  //# sourceMappingURL=operations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/db-admin/operations.ts"],"names":[],"mappings":"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","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"]}
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/db-admin/operations.ts"],"names":[],"mappings":"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","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_]*$/;\nconst LARGE_CELL_PREVIEW_CHARS = 16 * 1024;\nconst LARGE_CELL_SUFFIX =\n \"\\n...[db-admin truncated large cell; request includeLargeCells=true for the full value]\";\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\nfunction isPreviewableLargeColumn(column: DbAdminColumn): boolean {\n const type = column.type.toLowerCase();\n return /\\b(text|char|varchar|character|jsonb?|xml|clob)\\b/.test(type);\n}\n\nfunction markLargeValuePreviewColumns(\n columns: DbAdminColumn[],\n includeLargeCells: boolean,\n): DbAdminColumn[] {\n if (includeLargeCells) return columns;\n return columns.map((column) =>\n isPreviewableLargeColumn(column)\n ? { ...column, largeValuePreview: true }\n : column,\n );\n}\n\nfunction buildRowsSelectList(\n columns: DbAdminColumn[],\n includeLargeCells: boolean,\n): string {\n if (includeLargeCells) {\n return columns.map((column) => quoteIdent(column.name)).join(\", \");\n }\n\n return columns\n .map((column) => {\n const quoted = quoteIdent(column.name);\n if (!isPreviewableLargeColumn(column)) return quoted;\n const textValue = `CAST(${quoted} AS TEXT)`;\n return `CASE WHEN length(${textValue}) > ${LARGE_CELL_PREVIEW_CHARS} THEN substr(${textValue}, 1, ${LARGE_CELL_PREVIEW_CHARS}) || '${LARGE_CELL_SUFFIX.replace(/'/g, \"''\")}' ELSE ${textValue} END AS ${quoted}`;\n })\n .join(\", \");\n}\n\nfunction truncateLargeResultCells(rows: Record<string, unknown>[]): {\n rows: Record<string, unknown>[];\n truncatedCells: number;\n} {\n let truncatedCells = 0;\n const mapped = rows.map((row) => {\n let changed = false;\n const next: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row)) {\n if (\n typeof value === \"string\" &&\n value.length > LARGE_CELL_PREVIEW_CHARS\n ) {\n next[key] =\n `${value.slice(0, LARGE_CELL_PREVIEW_CHARS)}${LARGE_CELL_SUFFIX}`;\n truncatedCells += 1;\n changed = true;\n } else {\n next[key] = value;\n }\n }\n return changed ? next : row;\n });\n return { rows: mapped, truncatedCells };\n}\n\nfunction countTruncatedResultCells(rows: Record<string, unknown>[]): number {\n let truncatedCells = 0;\n for (const row of rows) {\n for (const value of Object.values(row)) {\n if (typeof value === \"string\" && value.endsWith(LARGE_CELL_SUFFIX)) {\n truncatedCells += 1;\n }\n }\n }\n return truncatedCells;\n}\n\nfunction containsLargeCellPreview(value: unknown): boolean {\n if (typeof value === \"string\") return value.endsWith(LARGE_CELL_SUFFIX);\n if (Array.isArray(value)) return value.some(containsLargeCellPreview);\n if (value && typeof value === \"object\") {\n return Object.values(value as Record<string, unknown>).some(\n containsLargeCellPreview,\n );\n }\n return false;\n}\n\nfunction assertNoLargeCellPreviewMutation(\n row: Record<string, unknown>,\n context: string,\n): void {\n for (const [column, value] of Object.entries(row)) {\n if (containsLargeCellPreview(value)) {\n throw new Error(\n `Refusing to ${context} with previewed large-cell value in column \"${column}\". Reload the row with includeLargeCells=true before saving.`,\n );\n }\n }\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 const includeLargeCells = req.includeLargeCells === true;\n const selectList = buildRowsSelectList(schema.columns, includeLargeCells);\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 ${selectList} FROM ${quoted}${where.clause}${orderBy} LIMIT ? OFFSET ?`,\n args: [...where.args, pageSize, offset],\n });\n const rows = rowsRes.rows as Record<string, unknown>[];\n\n return {\n columns: markLargeValuePreviewColumns(schema.columns, includeLargeCells),\n rows,\n total,\n page,\n pageSize,\n truncatedCells: includeLargeCells ? 0 : countTruncatedResultCells(rows),\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 assertNoLargeCellPreviewMutation(row, \"insert\");\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 assertNoLargeCellPreviewMutation(set, \"update\");\n assertNoLargeCellPreviewMutation(where, \"match rows\");\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 assertNoLargeCellPreviewMutation(where, \"delete\");\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 truncation = truncateLargeResultCells(\n (res.rows ?? []) as Record<string, unknown>[],\n );\n const rows = truncation.rows;\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 truncatedCells: truncation.truncatedCells,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/db-admin/routes.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAmBD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,GAAG,EACb,OAAO,GAAE,yBAA8B,GACtC,IAAI,CAwGN"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/db-admin/routes.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAmBD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,GAAG,EACb,OAAO,GAAE,yBAA8B,GACtC,IAAI,CAyGN"}
@@ -78,6 +78,7 @@ export function mountDbAdminRoutes(nitroApp, options = {}) {
78
78
  pageSize: Number(body.pageSize) || 50,
79
79
  sort: body.sort,
80
80
  filters: body.filters,
81
+ includeLargeCells: body.includeLargeCells === true,
81
82
  });
82
83
  return { ok: true, ...result };
83
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/db-admin/routes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * HTTP routes for the dev-mode database admin.\n *\n * Mounted under `/_agent-native/db-admin/*`. EVERY handler self-gates on\n * `NODE_ENV === \"development\"` (this is the authoritative gate — see\n * `isDevEnvironment`). Real logins work locally; there is no localhost or\n * `AUTH_MODE=local` shim. The DB admin exposes raw, unscoped full-database\n * access and must NEVER be reachable in a deployed / production-mode app.\n */\nimport {\n defineEventHandler,\n getMethod,\n setResponseHeader,\n setResponseStatus,\n} from \"h3\";\nimport type { H3Event } from \"h3\";\n\nimport { getH3App } from \"../server/framework-request-handler.js\";\nimport { readBody } from \"../server/h3-helpers.js\";\nimport {\n applyMutations,\n getRows,\n getTableSchema,\n listTables,\n runSql,\n DbAdminConfirmRequiredError,\n} from \"./operations.js\";\nimport type { DbAdminMutation, DbAdminRowsRequest } from \"./types.js\";\n\nexport interface MountDbAdminRoutesOptions {\n routePrefix?: string;\n}\n\n/** Authoritative gate for the DB admin: development mode only.\n * Available purely on `NODE_ENV === \"development\"` — real logins work locally\n * and there is no localhost / `AUTH_MODE=local` shim. The normal\n * `/_agent-native/*` auth layer still requires a signed-in user on top of this. */\nfunction isDevEnvironment(): boolean {\n return process.env.NODE_ENV === \"development\";\n}\n\nfunction decodeSegment(value: string | undefined): string | undefined {\n if (!value) return undefined;\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nexport function mountDbAdminRoutes(\n nitroApp: any,\n options: MountDbAdminRoutesOptions = {},\n): void {\n const routePrefix = options.routePrefix ?? \"/_agent-native\";\n const basePath = `${routePrefix}/db-admin`;\n\n getH3App(nitroApp).use(\n basePath,\n defineEventHandler(async (event: H3Event) => {\n setResponseHeader(event, \"Cache-Control\", \"no-store\");\n\n // Authoritative gate: development mode only (NODE_ENV === \"development\").\n if (!isDevEnvironment()) {\n setResponseStatus(event, 403);\n return {\n ok: false,\n error: \"DB admin is only available in development mode.\",\n };\n }\n\n const method = getMethod(event);\n // event.path is relative to the mount base path under h3's .use().\n const raw = (event.path || \"/\").split(\"?\")[0];\n const segments = raw\n .replace(/^\\/+/, \"\")\n .split(\"/\")\n .filter(Boolean)\n .map(decodeSegment);\n\n try {\n // GET /overview\n if (segments[0] === \"overview\" && segments.length === 1) {\n if (method !== \"GET\") return methodNotAllowed(event);\n const result = await listTables();\n return { ok: true, ...result };\n }\n\n // /table/:name/...\n if (segments[0] === \"table\") {\n const name = segments[1];\n if (!name) return badRequest(event, \"Table name is required\");\n const sub = segments[2];\n\n if (sub === \"schema\" && segments.length === 3) {\n if (method !== \"GET\") return methodNotAllowed(event);\n const table = await getTableSchema(name);\n return { ok: true, table };\n }\n\n if (sub === \"rows\" && segments.length === 3) {\n if (method !== \"POST\") return methodNotAllowed(event);\n const body = await readBody<Partial<DbAdminRowsRequest>>(event);\n const result = await getRows(name, {\n page: Number(body.page) || 1,\n pageSize: Number(body.pageSize) || 50,\n sort: body.sort,\n filters: body.filters,\n });\n return { ok: true, ...result };\n }\n\n if (sub === \"mutate\" && segments.length === 3) {\n if (method !== \"POST\") return methodNotAllowed(event);\n const body = await readBody<DbAdminMutation>(event);\n const result = await applyMutations(name, body ?? {});\n return { ok: true, ...result };\n }\n\n return notFound(event, \"Unknown db-admin table route\");\n }\n\n // POST /query\n if (segments[0] === \"query\" && segments.length === 1) {\n if (method !== \"POST\") return methodNotAllowed(event);\n const body = await readBody<{\n sql?: string;\n params?: unknown[];\n confirmDestructive?: boolean;\n }>(event);\n try {\n const result = await runSql(\n String(body.sql ?? \"\"),\n Array.isArray(body.params) ? body.params : undefined,\n { confirmDestructive: body.confirmDestructive === true },\n );\n return { ok: true, ...result };\n } catch (err) {\n if (err instanceof DbAdminConfirmRequiredError) {\n setResponseStatus(event, 400);\n return {\n ok: false,\n error: err.message,\n needsConfirm: true,\n };\n }\n throw err;\n }\n }\n\n return notFound(event, \"Unknown db-admin route\");\n } catch (err) {\n setResponseStatus(event, 500);\n return { ok: false, error: String(err) };\n }\n }),\n );\n}\n\nfunction methodNotAllowed(event: H3Event) {\n setResponseStatus(event, 405);\n return { ok: false, error: \"Method not allowed\" };\n}\n\nfunction badRequest(event: H3Event, error: string) {\n setResponseStatus(event, 400);\n return { ok: false, error };\n}\n\nfunction notFound(event: H3Event, error: string) {\n setResponseStatus(event, 404);\n return { ok: false, error };\n}\n"]}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/db-admin/routes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * HTTP routes for the dev-mode database admin.\n *\n * Mounted under `/_agent-native/db-admin/*`. EVERY handler self-gates on\n * `NODE_ENV === \"development\"` (this is the authoritative gate — see\n * `isDevEnvironment`). Real logins work locally; there is no localhost or\n * `AUTH_MODE=local` shim. The DB admin exposes raw, unscoped full-database\n * access and must NEVER be reachable in a deployed / production-mode app.\n */\nimport {\n defineEventHandler,\n getMethod,\n setResponseHeader,\n setResponseStatus,\n} from \"h3\";\nimport type { H3Event } from \"h3\";\n\nimport { getH3App } from \"../server/framework-request-handler.js\";\nimport { readBody } from \"../server/h3-helpers.js\";\nimport {\n applyMutations,\n getRows,\n getTableSchema,\n listTables,\n runSql,\n DbAdminConfirmRequiredError,\n} from \"./operations.js\";\nimport type { DbAdminMutation, DbAdminRowsRequest } from \"./types.js\";\n\nexport interface MountDbAdminRoutesOptions {\n routePrefix?: string;\n}\n\n/** Authoritative gate for the DB admin: development mode only.\n * Available purely on `NODE_ENV === \"development\"` — real logins work locally\n * and there is no localhost / `AUTH_MODE=local` shim. The normal\n * `/_agent-native/*` auth layer still requires a signed-in user on top of this. */\nfunction isDevEnvironment(): boolean {\n return process.env.NODE_ENV === \"development\";\n}\n\nfunction decodeSegment(value: string | undefined): string | undefined {\n if (!value) return undefined;\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nexport function mountDbAdminRoutes(\n nitroApp: any,\n options: MountDbAdminRoutesOptions = {},\n): void {\n const routePrefix = options.routePrefix ?? \"/_agent-native\";\n const basePath = `${routePrefix}/db-admin`;\n\n getH3App(nitroApp).use(\n basePath,\n defineEventHandler(async (event: H3Event) => {\n setResponseHeader(event, \"Cache-Control\", \"no-store\");\n\n // Authoritative gate: development mode only (NODE_ENV === \"development\").\n if (!isDevEnvironment()) {\n setResponseStatus(event, 403);\n return {\n ok: false,\n error: \"DB admin is only available in development mode.\",\n };\n }\n\n const method = getMethod(event);\n // event.path is relative to the mount base path under h3's .use().\n const raw = (event.path || \"/\").split(\"?\")[0];\n const segments = raw\n .replace(/^\\/+/, \"\")\n .split(\"/\")\n .filter(Boolean)\n .map(decodeSegment);\n\n try {\n // GET /overview\n if (segments[0] === \"overview\" && segments.length === 1) {\n if (method !== \"GET\") return methodNotAllowed(event);\n const result = await listTables();\n return { ok: true, ...result };\n }\n\n // /table/:name/...\n if (segments[0] === \"table\") {\n const name = segments[1];\n if (!name) return badRequest(event, \"Table name is required\");\n const sub = segments[2];\n\n if (sub === \"schema\" && segments.length === 3) {\n if (method !== \"GET\") return methodNotAllowed(event);\n const table = await getTableSchema(name);\n return { ok: true, table };\n }\n\n if (sub === \"rows\" && segments.length === 3) {\n if (method !== \"POST\") return methodNotAllowed(event);\n const body = await readBody<Partial<DbAdminRowsRequest>>(event);\n const result = await getRows(name, {\n page: Number(body.page) || 1,\n pageSize: Number(body.pageSize) || 50,\n sort: body.sort,\n filters: body.filters,\n includeLargeCells: body.includeLargeCells === true,\n });\n return { ok: true, ...result };\n }\n\n if (sub === \"mutate\" && segments.length === 3) {\n if (method !== \"POST\") return methodNotAllowed(event);\n const body = await readBody<DbAdminMutation>(event);\n const result = await applyMutations(name, body ?? {});\n return { ok: true, ...result };\n }\n\n return notFound(event, \"Unknown db-admin table route\");\n }\n\n // POST /query\n if (segments[0] === \"query\" && segments.length === 1) {\n if (method !== \"POST\") return methodNotAllowed(event);\n const body = await readBody<{\n sql?: string;\n params?: unknown[];\n confirmDestructive?: boolean;\n }>(event);\n try {\n const result = await runSql(\n String(body.sql ?? \"\"),\n Array.isArray(body.params) ? body.params : undefined,\n { confirmDestructive: body.confirmDestructive === true },\n );\n return { ok: true, ...result };\n } catch (err) {\n if (err instanceof DbAdminConfirmRequiredError) {\n setResponseStatus(event, 400);\n return {\n ok: false,\n error: err.message,\n needsConfirm: true,\n };\n }\n throw err;\n }\n }\n\n return notFound(event, \"Unknown db-admin route\");\n } catch (err) {\n setResponseStatus(event, 500);\n return { ok: false, error: String(err) };\n }\n }),\n );\n}\n\nfunction methodNotAllowed(event: H3Event) {\n setResponseStatus(event, 405);\n return { ok: false, error: \"Method not allowed\" };\n}\n\nfunction badRequest(event: H3Event, error: string) {\n setResponseStatus(event, 400);\n return { ok: false, error };\n}\n\nfunction notFound(event: H3Event, error: string) {\n setResponseStatus(event, 404);\n return { ok: false, error };\n}\n"]}
@@ -13,6 +13,7 @@ export interface DbAdminColumn {
13
13
  pk: boolean;
14
14
  defaultValue: string | null;
15
15
  autoIncrement?: boolean;
16
+ largeValuePreview?: boolean;
16
17
  }
17
18
  export interface DbAdminForeignKey {
18
19
  column: string;
@@ -53,6 +54,7 @@ export interface DbAdminRowsRequest {
53
54
  pageSize: number;
54
55
  sort?: DbAdminSort[];
55
56
  filters?: DbAdminFilter[];
57
+ includeLargeCells?: boolean;
56
58
  }
57
59
  export interface DbAdminRowsResult {
58
60
  columns: DbAdminColumn[];
@@ -60,6 +62,7 @@ export interface DbAdminRowsResult {
60
62
  total: number;
61
63
  page: number;
62
64
  pageSize: number;
65
+ truncatedCells?: number;
63
66
  }
64
67
  export interface DbAdminMutation {
65
68
  inserts?: Record<string, unknown>[];
@@ -81,5 +84,6 @@ export interface DbAdminQueryResult {
81
84
  rows: Record<string, unknown>[];
82
85
  rowsAffected: number;
83
86
  durationMs: number;
87
+ truncatedCells?: number;
84
88
  }
85
89
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db-admin/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db-admin/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/db-admin/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG","sourcesContent":["/**\n * Shared contract types for the dev-mode database admin (Supabase-Studio-like).\n *\n * The backend (operations / routes / agent tools) and the frontend both import\n * these so request/response shapes stay in lockstep. Keep this file free of any\n * runtime imports — it is a pure type module.\n */\n\nexport type DbAdminDialect = \"sqlite\" | \"postgres\" | \"d1\";\n\nexport interface DbAdminColumn {\n name: string;\n type: string;\n nullable: boolean;\n pk: boolean;\n defaultValue: string | null;\n autoIncrement?: boolean;\n}\n\nexport interface DbAdminForeignKey {\n column: string;\n refTable: string;\n refColumn: string;\n}\n\nexport interface DbAdminIndex {\n name: string;\n unique: boolean;\n columns: string[];\n}\n\nexport interface DbAdminTableSummary {\n name: string;\n type: \"table\" | \"view\";\n rowCount: number | null;\n}\n\nexport interface DbAdminTableSchema {\n name: string;\n type: \"table\" | \"view\";\n columns: DbAdminColumn[];\n primaryKey: string[];\n foreignKeys: DbAdminForeignKey[];\n indexes: DbAdminIndex[];\n rowCount: number | null;\n}\n\nexport type DbAdminFilterOp =\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\nexport interface DbAdminFilter {\n column: string;\n op: DbAdminFilterOp;\n value?: unknown;\n}\n\nexport interface DbAdminSort {\n column: string;\n dir: \"asc\" | \"desc\";\n}\n\nexport interface DbAdminRowsRequest {\n page: number;\n pageSize: number;\n sort?: DbAdminSort[];\n filters?: DbAdminFilter[];\n}\n\nexport interface DbAdminRowsResult {\n columns: DbAdminColumn[];\n rows: Record<string, unknown>[];\n total: number;\n page: number;\n pageSize: number;\n}\n\nexport interface DbAdminMutation {\n inserts?: Record<string, unknown>[];\n updates?: { where: Record<string, unknown>; set: Record<string, unknown> }[];\n deletes?: Record<string, unknown>[];\n dryRun?: boolean;\n}\n\nexport interface DbAdminMutationResult {\n sql: string[];\n inserted: number;\n updated: number;\n deleted: number;\n}\n\nexport interface DbAdminQueryResult {\n columns: string[];\n rows: Record<string, unknown>[];\n rowsAffected: number;\n durationMs: number;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/db-admin/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG","sourcesContent":["/**\n * Shared contract types for the dev-mode database admin (Supabase-Studio-like).\n *\n * The backend (operations / routes / agent tools) and the frontend both import\n * these so request/response shapes stay in lockstep. Keep this file free of any\n * runtime imports — it is a pure type module.\n */\n\nexport type DbAdminDialect = \"sqlite\" | \"postgres\" | \"d1\";\n\nexport interface DbAdminColumn {\n name: string;\n type: string;\n nullable: boolean;\n pk: boolean;\n defaultValue: string | null;\n autoIncrement?: boolean;\n largeValuePreview?: boolean;\n}\n\nexport interface DbAdminForeignKey {\n column: string;\n refTable: string;\n refColumn: string;\n}\n\nexport interface DbAdminIndex {\n name: string;\n unique: boolean;\n columns: string[];\n}\n\nexport interface DbAdminTableSummary {\n name: string;\n type: \"table\" | \"view\";\n rowCount: number | null;\n}\n\nexport interface DbAdminTableSchema {\n name: string;\n type: \"table\" | \"view\";\n columns: DbAdminColumn[];\n primaryKey: string[];\n foreignKeys: DbAdminForeignKey[];\n indexes: DbAdminIndex[];\n rowCount: number | null;\n}\n\nexport type DbAdminFilterOp =\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\nexport interface DbAdminFilter {\n column: string;\n op: DbAdminFilterOp;\n value?: unknown;\n}\n\nexport interface DbAdminSort {\n column: string;\n dir: \"asc\" | \"desc\";\n}\n\nexport interface DbAdminRowsRequest {\n page: number;\n pageSize: number;\n sort?: DbAdminSort[];\n filters?: DbAdminFilter[];\n includeLargeCells?: boolean;\n}\n\nexport interface DbAdminRowsResult {\n columns: DbAdminColumn[];\n rows: Record<string, unknown>[];\n total: number;\n page: number;\n pageSize: number;\n truncatedCells?: number;\n}\n\nexport interface DbAdminMutation {\n inserts?: Record<string, unknown>[];\n updates?: { where: Record<string, unknown>; set: Record<string, unknown> }[];\n deletes?: Record<string, unknown>[];\n dryRun?: boolean;\n}\n\nexport interface DbAdminMutationResult {\n sql: string[];\n inserted: number;\n updated: number;\n deleted: number;\n}\n\nexport interface DbAdminQueryResult {\n columns: string[];\n rows: Record<string, unknown>[];\n rowsAffected: number;\n durationMs: number;\n truncatedCells?: number;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/extensions/actions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAyChE,wBAAgB,4BAA4B,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA49B1E"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/extensions/actions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AA4ChE,wBAAgB,4BAA4B,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA++B1E"}