@schema-weaver/pg-connector 0.0.0-stage → 2.0.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 (1065) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +21 -0
  3. package/README.md +457 -2
  4. package/dist/cjs/audit/chain.d.ts +365 -0
  5. package/dist/cjs/audit/chain.d.ts.map +1 -0
  6. package/dist/cjs/audit/chain.js +959 -0
  7. package/dist/cjs/audit/chain.js.map +1 -0
  8. package/dist/cjs/audit/cloud-client.d.ts +142 -0
  9. package/dist/cjs/audit/cloud-client.d.ts.map +1 -0
  10. package/dist/cjs/audit/cloud-client.js +364 -0
  11. package/dist/cjs/audit/cloud-client.js.map +1 -0
  12. package/dist/cjs/audit/cloud-writer.d.ts +57 -0
  13. package/dist/cjs/audit/cloud-writer.d.ts.map +1 -0
  14. package/dist/cjs/audit/cloud-writer.js +95 -0
  15. package/dist/cjs/audit/cloud-writer.js.map +1 -0
  16. package/dist/cjs/audit/context.d.ts +51 -0
  17. package/dist/cjs/audit/context.d.ts.map +1 -0
  18. package/dist/cjs/audit/context.js +75 -0
  19. package/dist/cjs/audit/context.js.map +1 -0
  20. package/dist/cjs/audit/files.d.ts +111 -0
  21. package/dist/cjs/audit/files.d.ts.map +1 -0
  22. package/dist/cjs/audit/files.js +406 -0
  23. package/dist/cjs/audit/files.js.map +1 -0
  24. package/dist/cjs/audit/index.d.ts +9 -0
  25. package/dist/cjs/audit/index.d.ts.map +1 -0
  26. package/dist/cjs/audit/index.js +68 -0
  27. package/dist/cjs/audit/index.js.map +1 -0
  28. package/dist/cjs/audit/local-writer.d.ts +255 -0
  29. package/dist/cjs/audit/local-writer.d.ts.map +1 -0
  30. package/dist/cjs/audit/local-writer.js +829 -0
  31. package/dist/cjs/audit/local-writer.js.map +1 -0
  32. package/dist/cjs/audit/redact.d.ts +151 -0
  33. package/dist/cjs/audit/redact.d.ts.map +1 -0
  34. package/dist/cjs/audit/redact.js +549 -0
  35. package/dist/cjs/audit/redact.js.map +1 -0
  36. package/dist/cjs/audit/sanitize.d.ts +78 -0
  37. package/dist/cjs/audit/sanitize.d.ts.map +1 -0
  38. package/dist/cjs/audit/sanitize.js +315 -0
  39. package/dist/cjs/audit/sanitize.js.map +1 -0
  40. package/dist/cjs/audit/sink.d.ts +278 -0
  41. package/dist/cjs/audit/sink.d.ts.map +1 -0
  42. package/dist/cjs/audit/sink.js +819 -0
  43. package/dist/cjs/audit/sink.js.map +1 -0
  44. package/dist/cjs/audit/types.d.ts +226 -0
  45. package/dist/cjs/audit/types.d.ts.map +1 -0
  46. package/dist/cjs/audit/types.js +3 -0
  47. package/dist/cjs/audit/types.js.map +1 -0
  48. package/dist/cjs/audit/verify-cache.d.ts +127 -0
  49. package/dist/cjs/audit/verify-cache.d.ts.map +1 -0
  50. package/dist/cjs/audit/verify-cache.js +668 -0
  51. package/dist/cjs/audit/verify-cache.js.map +1 -0
  52. package/dist/cjs/channels/agent-session.d.ts +228 -0
  53. package/dist/cjs/channels/agent-session.d.ts.map +1 -0
  54. package/dist/cjs/channels/agent-session.js +604 -0
  55. package/dist/cjs/channels/agent-session.js.map +1 -0
  56. package/dist/cjs/channels/data-channel.d.ts +181 -0
  57. package/dist/cjs/channels/data-channel.d.ts.map +1 -0
  58. package/dist/cjs/channels/data-channel.js +607 -0
  59. package/dist/cjs/channels/data-channel.js.map +1 -0
  60. package/dist/cjs/channels/reconnect.d.ts +142 -0
  61. package/dist/cjs/channels/reconnect.d.ts.map +1 -0
  62. package/dist/cjs/channels/reconnect.js +247 -0
  63. package/dist/cjs/channels/reconnect.js.map +1 -0
  64. package/dist/cjs/channels/types.d.ts +112 -0
  65. package/dist/cjs/channels/types.d.ts.map +1 -0
  66. package/dist/cjs/channels/types.js +3 -0
  67. package/dist/cjs/channels/types.js.map +1 -0
  68. package/dist/cjs/channels/wake-channel.d.ts +232 -0
  69. package/dist/cjs/channels/wake-channel.d.ts.map +1 -0
  70. package/dist/cjs/channels/wake-channel.js +752 -0
  71. package/dist/cjs/channels/wake-channel.js.map +1 -0
  72. package/dist/cjs/cli/banner.d.ts +2 -0
  73. package/dist/cjs/cli/banner.d.ts.map +1 -0
  74. package/dist/cjs/cli/banner.js +150 -0
  75. package/dist/cjs/cli/banner.js.map +1 -0
  76. package/dist/cjs/cli/commands/agent.d.ts +30 -0
  77. package/dist/cjs/cli/commands/agent.d.ts.map +1 -0
  78. package/dist/cjs/cli/commands/agent.js +214 -0
  79. package/dist/cjs/cli/commands/agent.js.map +1 -0
  80. package/dist/cjs/cli/commands/audit-verify.d.ts +19 -0
  81. package/dist/cjs/cli/commands/audit-verify.d.ts.map +1 -0
  82. package/dist/cjs/cli/commands/audit-verify.js +382 -0
  83. package/dist/cjs/cli/commands/audit-verify.js.map +1 -0
  84. package/dist/cjs/cli/commands/clean.d.ts +23 -0
  85. package/dist/cjs/cli/commands/clean.d.ts.map +1 -0
  86. package/dist/cjs/cli/commands/clean.js +272 -0
  87. package/dist/cjs/cli/commands/clean.js.map +1 -0
  88. package/dist/cjs/cli/commands/config-show.d.ts +2 -0
  89. package/dist/cjs/cli/commands/config-show.d.ts.map +1 -0
  90. package/dist/cjs/cli/commands/config-show.js +10 -0
  91. package/dist/cjs/cli/commands/config-show.js.map +1 -0
  92. package/dist/cjs/cli/commands/config.d.ts +6 -0
  93. package/dist/cjs/cli/commands/config.d.ts.map +1 -0
  94. package/dist/cjs/cli/commands/config.js +266 -0
  95. package/dist/cjs/cli/commands/config.js.map +1 -0
  96. package/dist/cjs/cli/commands/db-add.d.ts +16 -0
  97. package/dist/cjs/cli/commands/db-add.d.ts.map +1 -0
  98. package/dist/cjs/cli/commands/db-add.js +613 -0
  99. package/dist/cjs/cli/commands/db-add.js.map +1 -0
  100. package/dist/cjs/cli/commands/db-edit.d.ts +2 -0
  101. package/dist/cjs/cli/commands/db-edit.d.ts.map +1 -0
  102. package/dist/cjs/cli/commands/db-edit.js +388 -0
  103. package/dist/cjs/cli/commands/db-edit.js.map +1 -0
  104. package/dist/cjs/cli/commands/db-logs.d.ts +3 -0
  105. package/dist/cjs/cli/commands/db-logs.d.ts.map +1 -0
  106. package/dist/cjs/cli/commands/db-logs.js +67 -0
  107. package/dist/cjs/cli/commands/db-logs.js.map +1 -0
  108. package/dist/cjs/cli/commands/db-ls.d.ts +2 -0
  109. package/dist/cjs/cli/commands/db-ls.d.ts.map +1 -0
  110. package/dist/cjs/cli/commands/db-ls.js +118 -0
  111. package/dist/cjs/cli/commands/db-ls.js.map +1 -0
  112. package/dist/cjs/cli/commands/db-query.d.ts +121 -0
  113. package/dist/cjs/cli/commands/db-query.d.ts.map +1 -0
  114. package/dist/cjs/cli/commands/db-query.js +802 -0
  115. package/dist/cjs/cli/commands/db-query.js.map +1 -0
  116. package/dist/cjs/cli/commands/db-remove.d.ts +2 -0
  117. package/dist/cjs/cli/commands/db-remove.d.ts.map +1 -0
  118. package/dist/cjs/cli/commands/db-remove.js +51 -0
  119. package/dist/cjs/cli/commands/db-remove.js.map +1 -0
  120. package/dist/cjs/cli/commands/db-show.d.ts +2 -0
  121. package/dist/cjs/cli/commands/db-show.d.ts.map +1 -0
  122. package/dist/cjs/cli/commands/db-show.js +134 -0
  123. package/dist/cjs/cli/commands/db-show.js.map +1 -0
  124. package/dist/cjs/cli/commands/db-test.d.ts +3 -0
  125. package/dist/cjs/cli/commands/db-test.d.ts.map +1 -0
  126. package/dist/cjs/cli/commands/db-test.js +311 -0
  127. package/dist/cjs/cli/commands/db-test.js.map +1 -0
  128. package/dist/cjs/cli/commands/db.d.ts +11 -0
  129. package/dist/cjs/cli/commands/db.d.ts.map +1 -0
  130. package/dist/cjs/cli/commands/db.js +90 -0
  131. package/dist/cjs/cli/commands/db.js.map +1 -0
  132. package/dist/cjs/cli/commands/debug.d.ts +2 -0
  133. package/dist/cjs/cli/commands/debug.d.ts.map +1 -0
  134. package/dist/cjs/cli/commands/debug.js +241 -0
  135. package/dist/cjs/cli/commands/debug.js.map +1 -0
  136. package/dist/cjs/cli/commands/doctor.d.ts +5 -0
  137. package/dist/cjs/cli/commands/doctor.d.ts.map +1 -0
  138. package/dist/cjs/cli/commands/doctor.js +117 -0
  139. package/dist/cjs/cli/commands/doctor.js.map +1 -0
  140. package/dist/cjs/cli/commands/index.d.ts +10 -0
  141. package/dist/cjs/cli/commands/index.d.ts.map +1 -0
  142. package/dist/cjs/cli/commands/index.js +30 -0
  143. package/dist/cjs/cli/commands/index.js.map +1 -0
  144. package/dist/cjs/cli/commands/init.d.ts +2 -0
  145. package/dist/cjs/cli/commands/init.d.ts.map +1 -0
  146. package/dist/cjs/cli/commands/init.js +199 -0
  147. package/dist/cjs/cli/commands/init.js.map +1 -0
  148. package/dist/cjs/cli/commands/link.d.ts +5 -0
  149. package/dist/cjs/cli/commands/link.d.ts.map +1 -0
  150. package/dist/cjs/cli/commands/link.js +44 -0
  151. package/dist/cjs/cli/commands/link.js.map +1 -0
  152. package/dist/cjs/cli/commands/logs.d.ts +17 -0
  153. package/dist/cjs/cli/commands/logs.d.ts.map +1 -0
  154. package/dist/cjs/cli/commands/logs.js +314 -0
  155. package/dist/cjs/cli/commands/logs.js.map +1 -0
  156. package/dist/cjs/cli/commands/project-show.d.ts +2 -0
  157. package/dist/cjs/cli/commands/project-show.d.ts.map +1 -0
  158. package/dist/cjs/cli/commands/project-show.js +105 -0
  159. package/dist/cjs/cli/commands/project-show.js.map +1 -0
  160. package/dist/cjs/cli/commands/project.d.ts +3 -0
  161. package/dist/cjs/cli/commands/project.d.ts.map +1 -0
  162. package/dist/cjs/cli/commands/project.js +64 -0
  163. package/dist/cjs/cli/commands/project.js.map +1 -0
  164. package/dist/cjs/cli/commands/service.d.ts +123 -0
  165. package/dist/cjs/cli/commands/service.d.ts.map +1 -0
  166. package/dist/cjs/cli/commands/service.js +554 -0
  167. package/dist/cjs/cli/commands/service.js.map +1 -0
  168. package/dist/cjs/cli/commands/start.d.ts +6 -0
  169. package/dist/cjs/cli/commands/start.d.ts.map +1 -0
  170. package/dist/cjs/cli/commands/start.js +308 -0
  171. package/dist/cjs/cli/commands/start.js.map +1 -0
  172. package/dist/cjs/cli/commands/status.d.ts +2 -0
  173. package/dist/cjs/cli/commands/status.d.ts.map +1 -0
  174. package/dist/cjs/cli/commands/status.js +225 -0
  175. package/dist/cjs/cli/commands/status.js.map +1 -0
  176. package/dist/cjs/cli/commands/stop.d.ts +6 -0
  177. package/dist/cjs/cli/commands/stop.d.ts.map +1 -0
  178. package/dist/cjs/cli/commands/stop.js +99 -0
  179. package/dist/cjs/cli/commands/stop.js.map +1 -0
  180. package/dist/cjs/cli/daemon/error-tracker.d.ts +119 -0
  181. package/dist/cjs/cli/daemon/error-tracker.d.ts.map +1 -0
  182. package/dist/cjs/cli/daemon/error-tracker.js +500 -0
  183. package/dist/cjs/cli/daemon/error-tracker.js.map +1 -0
  184. package/dist/cjs/cli/daemon/fault-shutdown.d.ts +144 -0
  185. package/dist/cjs/cli/daemon/fault-shutdown.d.ts.map +1 -0
  186. package/dist/cjs/cli/daemon/fault-shutdown.js +312 -0
  187. package/dist/cjs/cli/daemon/fault-shutdown.js.map +1 -0
  188. package/dist/cjs/cli/daemon/index.d.ts +12 -0
  189. package/dist/cjs/cli/daemon/index.d.ts.map +1 -0
  190. package/dist/cjs/cli/daemon/index.js +23 -0
  191. package/dist/cjs/cli/daemon/index.js.map +1 -0
  192. package/dist/cjs/cli/daemon/pid-file.d.ts +13 -0
  193. package/dist/cjs/cli/daemon/pid-file.d.ts.map +1 -0
  194. package/dist/cjs/cli/daemon/pid-file.js +90 -0
  195. package/dist/cjs/cli/daemon/pid-file.js.map +1 -0
  196. package/dist/cjs/cli/daemon/readiness.d.ts +30 -0
  197. package/dist/cjs/cli/daemon/readiness.d.ts.map +1 -0
  198. package/dist/cjs/cli/daemon/readiness.js +74 -0
  199. package/dist/cjs/cli/daemon/readiness.js.map +1 -0
  200. package/dist/cjs/cli/daemon/runtime.d.ts +366 -0
  201. package/dist/cjs/cli/daemon/runtime.d.ts.map +1 -0
  202. package/dist/cjs/cli/daemon/runtime.js +1343 -0
  203. package/dist/cjs/cli/daemon/runtime.js.map +1 -0
  204. package/dist/cjs/cli/daemon/shutdown.d.ts +7 -0
  205. package/dist/cjs/cli/daemon/shutdown.d.ts.map +1 -0
  206. package/dist/cjs/cli/daemon/shutdown.js +66 -0
  207. package/dist/cjs/cli/daemon/shutdown.js.map +1 -0
  208. package/dist/cjs/cli/daemon/signal-handlers.d.ts +3 -0
  209. package/dist/cjs/cli/daemon/signal-handlers.d.ts.map +1 -0
  210. package/dist/cjs/cli/daemon/signal-handlers.js +27 -0
  211. package/dist/cjs/cli/daemon/signal-handlers.js.map +1 -0
  212. package/dist/cjs/cli/daemon/state.d.ts +157 -0
  213. package/dist/cjs/cli/daemon/state.d.ts.map +1 -0
  214. package/dist/cjs/cli/daemon/state.js +397 -0
  215. package/dist/cjs/cli/daemon/state.js.map +1 -0
  216. package/dist/cjs/cli/daemon/status-file.d.ts +139 -0
  217. package/dist/cjs/cli/daemon/status-file.d.ts.map +1 -0
  218. package/dist/cjs/cli/daemon/status-file.js +88 -0
  219. package/dist/cjs/cli/daemon/status-file.js.map +1 -0
  220. package/dist/cjs/cli/doctor/checks.d.ts +133 -0
  221. package/dist/cjs/cli/doctor/checks.d.ts.map +1 -0
  222. package/dist/cjs/cli/doctor/checks.js +677 -0
  223. package/dist/cjs/cli/doctor/checks.js.map +1 -0
  224. package/dist/cjs/cli/doctor/fixes.d.ts +9 -0
  225. package/dist/cjs/cli/doctor/fixes.d.ts.map +1 -0
  226. package/dist/cjs/cli/doctor/fixes.js +199 -0
  227. package/dist/cjs/cli/doctor/fixes.js.map +1 -0
  228. package/dist/cjs/cli/doctor/index.d.ts +7 -0
  229. package/dist/cjs/cli/doctor/index.d.ts.map +1 -0
  230. package/dist/cjs/cli/doctor/index.js +27 -0
  231. package/dist/cjs/cli/doctor/index.js.map +1 -0
  232. package/dist/cjs/cli/index.d.ts +3 -0
  233. package/dist/cjs/cli/index.d.ts.map +1 -0
  234. package/dist/cjs/cli/index.js +336 -0
  235. package/dist/cjs/cli/index.js.map +1 -0
  236. package/dist/cjs/cli/interactive.d.ts +8 -0
  237. package/dist/cjs/cli/interactive.d.ts.map +1 -0
  238. package/dist/cjs/cli/interactive.js +670 -0
  239. package/dist/cjs/cli/interactive.js.map +1 -0
  240. package/dist/cjs/cli/logs/format.d.ts +13 -0
  241. package/dist/cjs/cli/logs/format.d.ts.map +1 -0
  242. package/dist/cjs/cli/logs/format.js +178 -0
  243. package/dist/cjs/cli/logs/format.js.map +1 -0
  244. package/dist/cjs/cli/logs/index.d.ts +3 -0
  245. package/dist/cjs/cli/logs/index.d.ts.map +1 -0
  246. package/dist/cjs/cli/logs/index.js +13 -0
  247. package/dist/cjs/cli/logs/index.js.map +1 -0
  248. package/dist/cjs/cli/logs/viewer.d.ts +41 -0
  249. package/dist/cjs/cli/logs/viewer.d.ts.map +1 -0
  250. package/dist/cjs/cli/logs/viewer.js +417 -0
  251. package/dist/cjs/cli/logs/viewer.js.map +1 -0
  252. package/dist/cjs/cli/ops/operation-logger.d.ts +63 -0
  253. package/dist/cjs/cli/ops/operation-logger.d.ts.map +1 -0
  254. package/dist/cjs/cli/ops/operation-logger.js +183 -0
  255. package/dist/cjs/cli/ops/operation-logger.js.map +1 -0
  256. package/dist/cjs/cli/palette.d.ts +11 -0
  257. package/dist/cjs/cli/palette.d.ts.map +1 -0
  258. package/dist/cjs/cli/palette.js +243 -0
  259. package/dist/cjs/cli/palette.js.map +1 -0
  260. package/dist/cjs/cli/prompt.d.ts +186 -0
  261. package/dist/cjs/cli/prompt.d.ts.map +1 -0
  262. package/dist/cjs/cli/prompt.js +541 -0
  263. package/dist/cjs/cli/prompt.js.map +1 -0
  264. package/dist/cjs/cli/ui/box.d.ts +21 -0
  265. package/dist/cjs/cli/ui/box.d.ts.map +1 -0
  266. package/dist/cjs/cli/ui/box.js +72 -0
  267. package/dist/cjs/cli/ui/box.js.map +1 -0
  268. package/dist/cjs/cli/ui/clipboard.d.ts +6 -0
  269. package/dist/cjs/cli/ui/clipboard.d.ts.map +1 -0
  270. package/dist/cjs/cli/ui/clipboard.js +78 -0
  271. package/dist/cjs/cli/ui/clipboard.js.map +1 -0
  272. package/dist/cjs/cli/ui/colors.d.ts +57 -0
  273. package/dist/cjs/cli/ui/colors.d.ts.map +1 -0
  274. package/dist/cjs/cli/ui/colors.js +151 -0
  275. package/dist/cjs/cli/ui/colors.js.map +1 -0
  276. package/dist/cjs/cli/ui/index.d.ts +9 -0
  277. package/dist/cjs/cli/ui/index.d.ts.map +1 -0
  278. package/dist/cjs/cli/ui/index.js +55 -0
  279. package/dist/cjs/cli/ui/index.js.map +1 -0
  280. package/dist/cjs/cli/ui/spinner.d.ts +12 -0
  281. package/dist/cjs/cli/ui/spinner.d.ts.map +1 -0
  282. package/dist/cjs/cli/ui/spinner.js +82 -0
  283. package/dist/cjs/cli/ui/spinner.js.map +1 -0
  284. package/dist/cjs/cli/ui/symbols.d.ts +47 -0
  285. package/dist/cjs/cli/ui/symbols.d.ts.map +1 -0
  286. package/dist/cjs/cli/ui/symbols.js +112 -0
  287. package/dist/cjs/cli/ui/symbols.js.map +1 -0
  288. package/dist/cjs/cli/ui/table.d.ts +23 -0
  289. package/dist/cjs/cli/ui/table.d.ts.map +1 -0
  290. package/dist/cjs/cli/ui/table.js +160 -0
  291. package/dist/cjs/cli/ui/table.js.map +1 -0
  292. package/dist/cjs/cli/ui/terminal.d.ts +7 -0
  293. package/dist/cjs/cli/ui/terminal.d.ts.map +1 -0
  294. package/dist/cjs/cli/ui/terminal.js +40 -0
  295. package/dist/cjs/cli/ui/terminal.js.map +1 -0
  296. package/dist/cjs/config/atomic-write.d.ts +69 -0
  297. package/dist/cjs/config/atomic-write.d.ts.map +1 -0
  298. package/dist/cjs/config/atomic-write.js +289 -0
  299. package/dist/cjs/config/atomic-write.js.map +1 -0
  300. package/dist/cjs/config/db-config.d.ts +134 -0
  301. package/dist/cjs/config/db-config.d.ts.map +1 -0
  302. package/dist/cjs/config/db-config.js +594 -0
  303. package/dist/cjs/config/db-config.js.map +1 -0
  304. package/dist/cjs/config/machine-config.d.ts +85 -0
  305. package/dist/cjs/config/machine-config.d.ts.map +1 -0
  306. package/dist/cjs/config/machine-config.js +232 -0
  307. package/dist/cjs/config/machine-config.js.map +1 -0
  308. package/dist/cjs/config/paths.d.ts +64 -0
  309. package/dist/cjs/config/paths.d.ts.map +1 -0
  310. package/dist/cjs/config/paths.js +155 -0
  311. package/dist/cjs/config/paths.js.map +1 -0
  312. package/dist/cjs/config/schema.d.ts +72 -0
  313. package/dist/cjs/config/schema.d.ts.map +1 -0
  314. package/dist/cjs/config/schema.js +197 -0
  315. package/dist/cjs/config/schema.js.map +1 -0
  316. package/dist/cjs/config/token.d.ts +63 -0
  317. package/dist/cjs/config/token.d.ts.map +1 -0
  318. package/dist/cjs/config/token.js +146 -0
  319. package/dist/cjs/config/token.js.map +1 -0
  320. package/dist/cjs/execution/canceller.d.ts +41 -0
  321. package/dist/cjs/execution/canceller.d.ts.map +1 -0
  322. package/dist/cjs/execution/canceller.js +209 -0
  323. package/dist/cjs/execution/canceller.js.map +1 -0
  324. package/dist/cjs/execution/database-lookup.d.ts +56 -0
  325. package/dist/cjs/execution/database-lookup.d.ts.map +1 -0
  326. package/dist/cjs/execution/database-lookup.js +43 -0
  327. package/dist/cjs/execution/database-lookup.js.map +1 -0
  328. package/dist/cjs/execution/dispatcher.d.ts +181 -0
  329. package/dist/cjs/execution/dispatcher.d.ts.map +1 -0
  330. package/dist/cjs/execution/dispatcher.js +1296 -0
  331. package/dist/cjs/execution/dispatcher.js.map +1 -0
  332. package/dist/cjs/execution/function-effects.d.ts +209 -0
  333. package/dist/cjs/execution/function-effects.d.ts.map +1 -0
  334. package/dist/cjs/execution/function-effects.js +596 -0
  335. package/dist/cjs/execution/function-effects.js.map +1 -0
  336. package/dist/cjs/execution/introspection.d.ts +76 -0
  337. package/dist/cjs/execution/introspection.d.ts.map +1 -0
  338. package/dist/cjs/execution/introspection.js +448 -0
  339. package/dist/cjs/execution/introspection.js.map +1 -0
  340. package/dist/cjs/execution/migration-runner.d.ts +128 -0
  341. package/dist/cjs/execution/migration-runner.d.ts.map +1 -0
  342. package/dist/cjs/execution/migration-runner.js +798 -0
  343. package/dist/cjs/execution/migration-runner.js.map +1 -0
  344. package/dist/cjs/execution/non-tx-detector.d.ts +23 -0
  345. package/dist/cjs/execution/non-tx-detector.d.ts.map +1 -0
  346. package/dist/cjs/execution/non-tx-detector.js +218 -0
  347. package/dist/cjs/execution/non-tx-detector.js.map +1 -0
  348. package/dist/cjs/execution/pool.d.ts +229 -0
  349. package/dist/cjs/execution/pool.d.ts.map +1 -0
  350. package/dist/cjs/execution/pool.js +738 -0
  351. package/dist/cjs/execution/pool.js.map +1 -0
  352. package/dist/cjs/execution/query-runner.d.ts +88 -0
  353. package/dist/cjs/execution/query-runner.d.ts.map +1 -0
  354. package/dist/cjs/execution/query-runner.js +751 -0
  355. package/dist/cjs/execution/query-runner.js.map +1 -0
  356. package/dist/cjs/execution/rate-limiter.d.ts +120 -0
  357. package/dist/cjs/execution/rate-limiter.d.ts.map +1 -0
  358. package/dist/cjs/execution/rate-limiter.js +273 -0
  359. package/dist/cjs/execution/rate-limiter.js.map +1 -0
  360. package/dist/cjs/execution/search-path.d.ts +161 -0
  361. package/dist/cjs/execution/search-path.d.ts.map +1 -0
  362. package/dist/cjs/execution/search-path.js +279 -0
  363. package/dist/cjs/execution/search-path.js.map +1 -0
  364. package/dist/cjs/execution/sql-parser.d.ts +195 -0
  365. package/dist/cjs/execution/sql-parser.d.ts.map +1 -0
  366. package/dist/cjs/execution/sql-parser.js +704 -0
  367. package/dist/cjs/execution/sql-parser.js.map +1 -0
  368. package/dist/cjs/execution/statement-classifier.d.ts +103 -0
  369. package/dist/cjs/execution/statement-classifier.d.ts.map +1 -0
  370. package/dist/cjs/execution/statement-classifier.js +535 -0
  371. package/dist/cjs/execution/statement-classifier.js.map +1 -0
  372. package/dist/cjs/execution/types.d.ts +189 -0
  373. package/dist/cjs/execution/types.d.ts.map +1 -0
  374. package/dist/cjs/execution/types.js +28 -0
  375. package/dist/cjs/execution/types.js.map +1 -0
  376. package/dist/cjs/index.d.ts +34 -0
  377. package/dist/cjs/index.d.ts.map +1 -0
  378. package/dist/cjs/index.js +98 -0
  379. package/dist/cjs/index.js.map +1 -0
  380. package/dist/cjs/permissions/auto-upgrade.d.ts +40 -0
  381. package/dist/cjs/permissions/auto-upgrade.d.ts.map +1 -0
  382. package/dist/cjs/permissions/auto-upgrade.js +168 -0
  383. package/dist/cjs/permissions/auto-upgrade.js.map +1 -0
  384. package/dist/cjs/permissions/checker.d.ts +53 -0
  385. package/dist/cjs/permissions/checker.d.ts.map +1 -0
  386. package/dist/cjs/permissions/checker.js +326 -0
  387. package/dist/cjs/permissions/checker.js.map +1 -0
  388. package/dist/cjs/permissions/manual-approval.d.ts +213 -0
  389. package/dist/cjs/permissions/manual-approval.d.ts.map +1 -0
  390. package/dist/cjs/permissions/manual-approval.js +541 -0
  391. package/dist/cjs/permissions/manual-approval.js.map +1 -0
  392. package/dist/cjs/permissions/plan-registry.d.ts +274 -0
  393. package/dist/cjs/permissions/plan-registry.d.ts.map +1 -0
  394. package/dist/cjs/permissions/plan-registry.js +454 -0
  395. package/dist/cjs/permissions/plan-registry.js.map +1 -0
  396. package/dist/cjs/permissions/role-policy.d.ts +217 -0
  397. package/dist/cjs/permissions/role-policy.d.ts.map +1 -0
  398. package/dist/cjs/permissions/role-policy.js +584 -0
  399. package/dist/cjs/permissions/role-policy.js.map +1 -0
  400. package/dist/cjs/permissions/types.d.ts +126 -0
  401. package/dist/cjs/permissions/types.d.ts.map +1 -0
  402. package/dist/cjs/permissions/types.js +3 -0
  403. package/dist/cjs/permissions/types.js.map +1 -0
  404. package/dist/cjs/protocol/constants.d.ts +72 -0
  405. package/dist/cjs/protocol/constants.d.ts.map +1 -0
  406. package/dist/cjs/protocol/constants.js +107 -0
  407. package/dist/cjs/protocol/constants.js.map +1 -0
  408. package/dist/cjs/protocol/envelope.d.ts +165 -0
  409. package/dist/cjs/protocol/envelope.d.ts.map +1 -0
  410. package/dist/cjs/protocol/envelope.js +309 -0
  411. package/dist/cjs/protocol/envelope.js.map +1 -0
  412. package/dist/cjs/protocol/errors.d.ts +33 -0
  413. package/dist/cjs/protocol/errors.d.ts.map +1 -0
  414. package/dist/cjs/protocol/errors.js +391 -0
  415. package/dist/cjs/protocol/errors.js.map +1 -0
  416. package/dist/cjs/protocol/messages.d.ts +327 -0
  417. package/dist/cjs/protocol/messages.d.ts.map +1 -0
  418. package/dist/cjs/protocol/messages.js +3 -0
  419. package/dist/cjs/protocol/messages.js.map +1 -0
  420. package/dist/cjs/protocol/serialize.d.ts +26 -0
  421. package/dist/cjs/protocol/serialize.d.ts.map +1 -0
  422. package/dist/cjs/protocol/serialize.js +71 -0
  423. package/dist/cjs/protocol/serialize.js.map +1 -0
  424. package/dist/cjs/protocol/validate.d.ts +135 -0
  425. package/dist/cjs/protocol/validate.d.ts.map +1 -0
  426. package/dist/cjs/protocol/validate.js +852 -0
  427. package/dist/cjs/protocol/validate.js.map +1 -0
  428. package/dist/esm/audit/chain.d.ts +365 -0
  429. package/dist/esm/audit/chain.d.ts.map +1 -0
  430. package/dist/esm/audit/chain.js +895 -0
  431. package/dist/esm/audit/chain.js.map +1 -0
  432. package/dist/esm/audit/cloud-client.d.ts +142 -0
  433. package/dist/esm/audit/cloud-client.d.ts.map +1 -0
  434. package/dist/esm/audit/cloud-client.js +326 -0
  435. package/dist/esm/audit/cloud-client.js.map +1 -0
  436. package/dist/esm/audit/cloud-writer.d.ts +57 -0
  437. package/dist/esm/audit/cloud-writer.d.ts.map +1 -0
  438. package/dist/esm/audit/cloud-writer.js +91 -0
  439. package/dist/esm/audit/cloud-writer.js.map +1 -0
  440. package/dist/esm/audit/context.d.ts +51 -0
  441. package/dist/esm/audit/context.d.ts.map +1 -0
  442. package/dist/esm/audit/context.js +69 -0
  443. package/dist/esm/audit/context.js.map +1 -0
  444. package/dist/esm/audit/files.d.ts +111 -0
  445. package/dist/esm/audit/files.d.ts.map +1 -0
  446. package/dist/esm/audit/files.js +361 -0
  447. package/dist/esm/audit/files.js.map +1 -0
  448. package/dist/esm/audit/index.d.ts +9 -0
  449. package/dist/esm/audit/index.d.ts.map +1 -0
  450. package/dist/esm/audit/index.js +8 -0
  451. package/dist/esm/audit/index.js.map +1 -0
  452. package/dist/esm/audit/local-writer.d.ts +255 -0
  453. package/dist/esm/audit/local-writer.d.ts.map +1 -0
  454. package/dist/esm/audit/local-writer.js +785 -0
  455. package/dist/esm/audit/local-writer.js.map +1 -0
  456. package/dist/esm/audit/redact.d.ts +151 -0
  457. package/dist/esm/audit/redact.d.ts.map +1 -0
  458. package/dist/esm/audit/redact.js +506 -0
  459. package/dist/esm/audit/redact.js.map +1 -0
  460. package/dist/esm/audit/sanitize.d.ts +78 -0
  461. package/dist/esm/audit/sanitize.d.ts.map +1 -0
  462. package/dist/esm/audit/sanitize.js +307 -0
  463. package/dist/esm/audit/sanitize.js.map +1 -0
  464. package/dist/esm/audit/sink.d.ts +278 -0
  465. package/dist/esm/audit/sink.d.ts.map +1 -0
  466. package/dist/esm/audit/sink.js +782 -0
  467. package/dist/esm/audit/sink.js.map +1 -0
  468. package/dist/esm/audit/types.d.ts +226 -0
  469. package/dist/esm/audit/types.d.ts.map +1 -0
  470. package/dist/esm/audit/types.js +2 -0
  471. package/dist/esm/audit/types.js.map +1 -0
  472. package/dist/esm/audit/verify-cache.d.ts +127 -0
  473. package/dist/esm/audit/verify-cache.d.ts.map +1 -0
  474. package/dist/esm/audit/verify-cache.js +628 -0
  475. package/dist/esm/audit/verify-cache.js.map +1 -0
  476. package/dist/esm/channels/agent-session.d.ts +228 -0
  477. package/dist/esm/channels/agent-session.d.ts.map +1 -0
  478. package/dist/esm/channels/agent-session.js +566 -0
  479. package/dist/esm/channels/agent-session.js.map +1 -0
  480. package/dist/esm/channels/data-channel.d.ts +181 -0
  481. package/dist/esm/channels/data-channel.d.ts.map +1 -0
  482. package/dist/esm/channels/data-channel.js +567 -0
  483. package/dist/esm/channels/data-channel.js.map +1 -0
  484. package/dist/esm/channels/reconnect.d.ts +142 -0
  485. package/dist/esm/channels/reconnect.d.ts.map +1 -0
  486. package/dist/esm/channels/reconnect.js +234 -0
  487. package/dist/esm/channels/reconnect.js.map +1 -0
  488. package/dist/esm/channels/types.d.ts +112 -0
  489. package/dist/esm/channels/types.d.ts.map +1 -0
  490. package/dist/esm/channels/types.js +2 -0
  491. package/dist/esm/channels/types.js.map +1 -0
  492. package/dist/esm/channels/wake-channel.d.ts +232 -0
  493. package/dist/esm/channels/wake-channel.d.ts.map +1 -0
  494. package/dist/esm/channels/wake-channel.js +715 -0
  495. package/dist/esm/channels/wake-channel.js.map +1 -0
  496. package/dist/esm/cli/banner.d.ts +2 -0
  497. package/dist/esm/cli/banner.d.ts.map +1 -0
  498. package/dist/esm/cli/banner.js +114 -0
  499. package/dist/esm/cli/banner.js.map +1 -0
  500. package/dist/esm/cli/commands/agent.d.ts +30 -0
  501. package/dist/esm/cli/commands/agent.d.ts.map +1 -0
  502. package/dist/esm/cli/commands/agent.js +204 -0
  503. package/dist/esm/cli/commands/agent.js.map +1 -0
  504. package/dist/esm/cli/commands/audit-verify.d.ts +19 -0
  505. package/dist/esm/cli/commands/audit-verify.d.ts.map +1 -0
  506. package/dist/esm/cli/commands/audit-verify.js +345 -0
  507. package/dist/esm/cli/commands/audit-verify.js.map +1 -0
  508. package/dist/esm/cli/commands/clean.d.ts +23 -0
  509. package/dist/esm/cli/commands/clean.d.ts.map +1 -0
  510. package/dist/esm/cli/commands/clean.js +235 -0
  511. package/dist/esm/cli/commands/clean.js.map +1 -0
  512. package/dist/esm/cli/commands/config-show.d.ts +2 -0
  513. package/dist/esm/cli/commands/config-show.d.ts.map +1 -0
  514. package/dist/esm/cli/commands/config-show.js +2 -0
  515. package/dist/esm/cli/commands/config-show.js.map +1 -0
  516. package/dist/esm/cli/commands/config.d.ts +6 -0
  517. package/dist/esm/cli/commands/config.d.ts.map +1 -0
  518. package/dist/esm/cli/commands/config.js +259 -0
  519. package/dist/esm/cli/commands/config.js.map +1 -0
  520. package/dist/esm/cli/commands/db-add.d.ts +16 -0
  521. package/dist/esm/cli/commands/db-add.d.ts.map +1 -0
  522. package/dist/esm/cli/commands/db-add.js +576 -0
  523. package/dist/esm/cli/commands/db-add.js.map +1 -0
  524. package/dist/esm/cli/commands/db-edit.d.ts +2 -0
  525. package/dist/esm/cli/commands/db-edit.d.ts.map +1 -0
  526. package/dist/esm/cli/commands/db-edit.js +352 -0
  527. package/dist/esm/cli/commands/db-edit.js.map +1 -0
  528. package/dist/esm/cli/commands/db-logs.d.ts +3 -0
  529. package/dist/esm/cli/commands/db-logs.d.ts.map +1 -0
  530. package/dist/esm/cli/commands/db-logs.js +64 -0
  531. package/dist/esm/cli/commands/db-logs.js.map +1 -0
  532. package/dist/esm/cli/commands/db-ls.d.ts +2 -0
  533. package/dist/esm/cli/commands/db-ls.d.ts.map +1 -0
  534. package/dist/esm/cli/commands/db-ls.js +115 -0
  535. package/dist/esm/cli/commands/db-ls.js.map +1 -0
  536. package/dist/esm/cli/commands/db-query.d.ts +121 -0
  537. package/dist/esm/cli/commands/db-query.d.ts.map +1 -0
  538. package/dist/esm/cli/commands/db-query.js +754 -0
  539. package/dist/esm/cli/commands/db-query.js.map +1 -0
  540. package/dist/esm/cli/commands/db-remove.d.ts +2 -0
  541. package/dist/esm/cli/commands/db-remove.d.ts.map +1 -0
  542. package/dist/esm/cli/commands/db-remove.js +48 -0
  543. package/dist/esm/cli/commands/db-remove.js.map +1 -0
  544. package/dist/esm/cli/commands/db-show.d.ts +2 -0
  545. package/dist/esm/cli/commands/db-show.d.ts.map +1 -0
  546. package/dist/esm/cli/commands/db-show.js +131 -0
  547. package/dist/esm/cli/commands/db-show.js.map +1 -0
  548. package/dist/esm/cli/commands/db-test.d.ts +3 -0
  549. package/dist/esm/cli/commands/db-test.d.ts.map +1 -0
  550. package/dist/esm/cli/commands/db-test.js +307 -0
  551. package/dist/esm/cli/commands/db-test.js.map +1 -0
  552. package/dist/esm/cli/commands/db.d.ts +11 -0
  553. package/dist/esm/cli/commands/db.d.ts.map +1 -0
  554. package/dist/esm/cli/commands/db.js +76 -0
  555. package/dist/esm/cli/commands/db.js.map +1 -0
  556. package/dist/esm/cli/commands/debug.d.ts +2 -0
  557. package/dist/esm/cli/commands/debug.d.ts.map +1 -0
  558. package/dist/esm/cli/commands/debug.js +205 -0
  559. package/dist/esm/cli/commands/debug.js.map +1 -0
  560. package/dist/esm/cli/commands/doctor.d.ts +5 -0
  561. package/dist/esm/cli/commands/doctor.d.ts.map +1 -0
  562. package/dist/esm/cli/commands/doctor.js +114 -0
  563. package/dist/esm/cli/commands/doctor.js.map +1 -0
  564. package/dist/esm/cli/commands/index.d.ts +10 -0
  565. package/dist/esm/cli/commands/index.d.ts.map +1 -0
  566. package/dist/esm/cli/commands/index.js +10 -0
  567. package/dist/esm/cli/commands/index.js.map +1 -0
  568. package/dist/esm/cli/commands/init.d.ts +2 -0
  569. package/dist/esm/cli/commands/init.d.ts.map +1 -0
  570. package/dist/esm/cli/commands/init.js +163 -0
  571. package/dist/esm/cli/commands/init.js.map +1 -0
  572. package/dist/esm/cli/commands/link.d.ts +5 -0
  573. package/dist/esm/cli/commands/link.d.ts.map +1 -0
  574. package/dist/esm/cli/commands/link.js +41 -0
  575. package/dist/esm/cli/commands/link.js.map +1 -0
  576. package/dist/esm/cli/commands/logs.d.ts +17 -0
  577. package/dist/esm/cli/commands/logs.d.ts.map +1 -0
  578. package/dist/esm/cli/commands/logs.js +278 -0
  579. package/dist/esm/cli/commands/logs.js.map +1 -0
  580. package/dist/esm/cli/commands/project-show.d.ts +2 -0
  581. package/dist/esm/cli/commands/project-show.d.ts.map +1 -0
  582. package/dist/esm/cli/commands/project-show.js +69 -0
  583. package/dist/esm/cli/commands/project-show.js.map +1 -0
  584. package/dist/esm/cli/commands/project.d.ts +3 -0
  585. package/dist/esm/cli/commands/project.d.ts.map +1 -0
  586. package/dist/esm/cli/commands/project.js +60 -0
  587. package/dist/esm/cli/commands/project.js.map +1 -0
  588. package/dist/esm/cli/commands/service.d.ts +123 -0
  589. package/dist/esm/cli/commands/service.d.ts.map +1 -0
  590. package/dist/esm/cli/commands/service.js +505 -0
  591. package/dist/esm/cli/commands/service.js.map +1 -0
  592. package/dist/esm/cli/commands/start.d.ts +6 -0
  593. package/dist/esm/cli/commands/start.d.ts.map +1 -0
  594. package/dist/esm/cli/commands/start.js +272 -0
  595. package/dist/esm/cli/commands/start.js.map +1 -0
  596. package/dist/esm/cli/commands/status.d.ts +2 -0
  597. package/dist/esm/cli/commands/status.d.ts.map +1 -0
  598. package/dist/esm/cli/commands/status.js +222 -0
  599. package/dist/esm/cli/commands/status.js.map +1 -0
  600. package/dist/esm/cli/commands/stop.d.ts +6 -0
  601. package/dist/esm/cli/commands/stop.d.ts.map +1 -0
  602. package/dist/esm/cli/commands/stop.js +96 -0
  603. package/dist/esm/cli/commands/stop.js.map +1 -0
  604. package/dist/esm/cli/daemon/error-tracker.d.ts +119 -0
  605. package/dist/esm/cli/daemon/error-tracker.d.ts.map +1 -0
  606. package/dist/esm/cli/daemon/error-tracker.js +451 -0
  607. package/dist/esm/cli/daemon/error-tracker.js.map +1 -0
  608. package/dist/esm/cli/daemon/fault-shutdown.d.ts +144 -0
  609. package/dist/esm/cli/daemon/fault-shutdown.d.ts.map +1 -0
  610. package/dist/esm/cli/daemon/fault-shutdown.js +273 -0
  611. package/dist/esm/cli/daemon/fault-shutdown.js.map +1 -0
  612. package/dist/esm/cli/daemon/index.d.ts +12 -0
  613. package/dist/esm/cli/daemon/index.d.ts.map +1 -0
  614. package/dist/esm/cli/daemon/index.js +7 -0
  615. package/dist/esm/cli/daemon/index.js.map +1 -0
  616. package/dist/esm/cli/daemon/pid-file.d.ts +13 -0
  617. package/dist/esm/cli/daemon/pid-file.d.ts.map +1 -0
  618. package/dist/esm/cli/daemon/pid-file.js +51 -0
  619. package/dist/esm/cli/daemon/pid-file.js.map +1 -0
  620. package/dist/esm/cli/daemon/readiness.d.ts +30 -0
  621. package/dist/esm/cli/daemon/readiness.d.ts.map +1 -0
  622. package/dist/esm/cli/daemon/readiness.js +70 -0
  623. package/dist/esm/cli/daemon/readiness.js.map +1 -0
  624. package/dist/esm/cli/daemon/runtime.d.ts +366 -0
  625. package/dist/esm/cli/daemon/runtime.d.ts.map +1 -0
  626. package/dist/esm/cli/daemon/runtime.js +1284 -0
  627. package/dist/esm/cli/daemon/runtime.js.map +1 -0
  628. package/dist/esm/cli/daemon/shutdown.d.ts +7 -0
  629. package/dist/esm/cli/daemon/shutdown.d.ts.map +1 -0
  630. package/dist/esm/cli/daemon/shutdown.js +63 -0
  631. package/dist/esm/cli/daemon/shutdown.js.map +1 -0
  632. package/dist/esm/cli/daemon/signal-handlers.d.ts +3 -0
  633. package/dist/esm/cli/daemon/signal-handlers.d.ts.map +1 -0
  634. package/dist/esm/cli/daemon/signal-handlers.js +24 -0
  635. package/dist/esm/cli/daemon/signal-handlers.js.map +1 -0
  636. package/dist/esm/cli/daemon/state.d.ts +157 -0
  637. package/dist/esm/cli/daemon/state.d.ts.map +1 -0
  638. package/dist/esm/cli/daemon/state.js +352 -0
  639. package/dist/esm/cli/daemon/state.js.map +1 -0
  640. package/dist/esm/cli/daemon/status-file.d.ts +139 -0
  641. package/dist/esm/cli/daemon/status-file.d.ts.map +1 -0
  642. package/dist/esm/cli/daemon/status-file.js +50 -0
  643. package/dist/esm/cli/daemon/status-file.js.map +1 -0
  644. package/dist/esm/cli/doctor/checks.d.ts +133 -0
  645. package/dist/esm/cli/doctor/checks.d.ts.map +1 -0
  646. package/dist/esm/cli/doctor/checks.js +624 -0
  647. package/dist/esm/cli/doctor/checks.js.map +1 -0
  648. package/dist/esm/cli/doctor/fixes.d.ts +9 -0
  649. package/dist/esm/cli/doctor/fixes.d.ts.map +1 -0
  650. package/dist/esm/cli/doctor/fixes.js +163 -0
  651. package/dist/esm/cli/doctor/fixes.js.map +1 -0
  652. package/dist/esm/cli/doctor/index.d.ts +7 -0
  653. package/dist/esm/cli/doctor/index.d.ts.map +1 -0
  654. package/dist/esm/cli/doctor/index.js +5 -0
  655. package/dist/esm/cli/doctor/index.js.map +1 -0
  656. package/dist/esm/cli/index.d.ts +3 -0
  657. package/dist/esm/cli/index.d.ts.map +1 -0
  658. package/dist/esm/cli/index.js +333 -0
  659. package/dist/esm/cli/index.js.map +1 -0
  660. package/dist/esm/cli/interactive.d.ts +8 -0
  661. package/dist/esm/cli/interactive.d.ts.map +1 -0
  662. package/dist/esm/cli/interactive.js +665 -0
  663. package/dist/esm/cli/interactive.js.map +1 -0
  664. package/dist/esm/cli/logs/format.d.ts +13 -0
  665. package/dist/esm/cli/logs/format.d.ts.map +1 -0
  666. package/dist/esm/cli/logs/format.js +169 -0
  667. package/dist/esm/cli/logs/format.js.map +1 -0
  668. package/dist/esm/cli/logs/index.d.ts +3 -0
  669. package/dist/esm/cli/logs/index.d.ts.map +1 -0
  670. package/dist/esm/cli/logs/index.js +3 -0
  671. package/dist/esm/cli/logs/index.js.map +1 -0
  672. package/dist/esm/cli/logs/viewer.d.ts +41 -0
  673. package/dist/esm/cli/logs/viewer.d.ts.map +1 -0
  674. package/dist/esm/cli/logs/viewer.js +412 -0
  675. package/dist/esm/cli/logs/viewer.js.map +1 -0
  676. package/dist/esm/cli/ops/operation-logger.d.ts +63 -0
  677. package/dist/esm/cli/ops/operation-logger.d.ts.map +1 -0
  678. package/dist/esm/cli/ops/operation-logger.js +142 -0
  679. package/dist/esm/cli/ops/operation-logger.js.map +1 -0
  680. package/dist/esm/cli/palette.d.ts +11 -0
  681. package/dist/esm/cli/palette.d.ts.map +1 -0
  682. package/dist/esm/cli/palette.js +240 -0
  683. package/dist/esm/cli/palette.js.map +1 -0
  684. package/dist/esm/cli/prompt.d.ts +186 -0
  685. package/dist/esm/cli/prompt.d.ts.map +1 -0
  686. package/dist/esm/cli/prompt.js +483 -0
  687. package/dist/esm/cli/prompt.js.map +1 -0
  688. package/dist/esm/cli/ui/box.d.ts +21 -0
  689. package/dist/esm/cli/ui/box.d.ts.map +1 -0
  690. package/dist/esm/cli/ui/box.js +60 -0
  691. package/dist/esm/cli/ui/box.js.map +1 -0
  692. package/dist/esm/cli/ui/clipboard.d.ts +6 -0
  693. package/dist/esm/cli/ui/clipboard.d.ts.map +1 -0
  694. package/dist/esm/cli/ui/clipboard.js +42 -0
  695. package/dist/esm/cli/ui/clipboard.js.map +1 -0
  696. package/dist/esm/cli/ui/colors.d.ts +57 -0
  697. package/dist/esm/cli/ui/colors.d.ts.map +1 -0
  698. package/dist/esm/cli/ui/colors.js +126 -0
  699. package/dist/esm/cli/ui/colors.js.map +1 -0
  700. package/dist/esm/cli/ui/index.d.ts +9 -0
  701. package/dist/esm/cli/ui/index.d.ts.map +1 -0
  702. package/dist/esm/cli/ui/index.js +7 -0
  703. package/dist/esm/cli/ui/index.js.map +1 -0
  704. package/dist/esm/cli/ui/spinner.d.ts +12 -0
  705. package/dist/esm/cli/ui/spinner.d.ts.map +1 -0
  706. package/dist/esm/cli/ui/spinner.js +78 -0
  707. package/dist/esm/cli/ui/spinner.js.map +1 -0
  708. package/dist/esm/cli/ui/symbols.d.ts +47 -0
  709. package/dist/esm/cli/ui/symbols.d.ts.map +1 -0
  710. package/dist/esm/cli/ui/symbols.js +109 -0
  711. package/dist/esm/cli/ui/symbols.js.map +1 -0
  712. package/dist/esm/cli/ui/table.d.ts +23 -0
  713. package/dist/esm/cli/ui/table.d.ts.map +1 -0
  714. package/dist/esm/cli/ui/table.js +156 -0
  715. package/dist/esm/cli/ui/table.js.map +1 -0
  716. package/dist/esm/cli/ui/terminal.d.ts +7 -0
  717. package/dist/esm/cli/ui/terminal.d.ts.map +1 -0
  718. package/dist/esm/cli/ui/terminal.js +32 -0
  719. package/dist/esm/cli/ui/terminal.js.map +1 -0
  720. package/dist/esm/config/atomic-write.d.ts +69 -0
  721. package/dist/esm/config/atomic-write.d.ts.map +1 -0
  722. package/dist/esm/config/atomic-write.js +246 -0
  723. package/dist/esm/config/atomic-write.js.map +1 -0
  724. package/dist/esm/config/db-config.d.ts +134 -0
  725. package/dist/esm/config/db-config.d.ts.map +1 -0
  726. package/dist/esm/config/db-config.js +542 -0
  727. package/dist/esm/config/db-config.js.map +1 -0
  728. package/dist/esm/config/machine-config.d.ts +85 -0
  729. package/dist/esm/config/machine-config.d.ts.map +1 -0
  730. package/dist/esm/config/machine-config.js +190 -0
  731. package/dist/esm/config/machine-config.js.map +1 -0
  732. package/dist/esm/config/paths.d.ts +64 -0
  733. package/dist/esm/config/paths.d.ts.map +1 -0
  734. package/dist/esm/config/paths.js +108 -0
  735. package/dist/esm/config/paths.js.map +1 -0
  736. package/dist/esm/config/schema.d.ts +72 -0
  737. package/dist/esm/config/schema.d.ts.map +1 -0
  738. package/dist/esm/config/schema.js +180 -0
  739. package/dist/esm/config/schema.js.map +1 -0
  740. package/dist/esm/config/token.d.ts +63 -0
  741. package/dist/esm/config/token.d.ts.map +1 -0
  742. package/dist/esm/config/token.js +104 -0
  743. package/dist/esm/config/token.js.map +1 -0
  744. package/dist/esm/execution/canceller.d.ts +41 -0
  745. package/dist/esm/execution/canceller.d.ts.map +1 -0
  746. package/dist/esm/execution/canceller.js +205 -0
  747. package/dist/esm/execution/canceller.js.map +1 -0
  748. package/dist/esm/execution/database-lookup.d.ts +56 -0
  749. package/dist/esm/execution/database-lookup.d.ts.map +1 -0
  750. package/dist/esm/execution/database-lookup.js +38 -0
  751. package/dist/esm/execution/database-lookup.js.map +1 -0
  752. package/dist/esm/execution/dispatcher.d.ts +181 -0
  753. package/dist/esm/execution/dispatcher.d.ts.map +1 -0
  754. package/dist/esm/execution/dispatcher.js +1258 -0
  755. package/dist/esm/execution/dispatcher.js.map +1 -0
  756. package/dist/esm/execution/function-effects.d.ts +209 -0
  757. package/dist/esm/execution/function-effects.d.ts.map +1 -0
  758. package/dist/esm/execution/function-effects.js +586 -0
  759. package/dist/esm/execution/function-effects.js.map +1 -0
  760. package/dist/esm/execution/introspection.d.ts +76 -0
  761. package/dist/esm/execution/introspection.d.ts.map +1 -0
  762. package/dist/esm/execution/introspection.js +442 -0
  763. package/dist/esm/execution/introspection.js.map +1 -0
  764. package/dist/esm/execution/migration-runner.d.ts +128 -0
  765. package/dist/esm/execution/migration-runner.d.ts.map +1 -0
  766. package/dist/esm/execution/migration-runner.js +754 -0
  767. package/dist/esm/execution/migration-runner.js.map +1 -0
  768. package/dist/esm/execution/non-tx-detector.d.ts +23 -0
  769. package/dist/esm/execution/non-tx-detector.d.ts.map +1 -0
  770. package/dist/esm/execution/non-tx-detector.js +215 -0
  771. package/dist/esm/execution/non-tx-detector.js.map +1 -0
  772. package/dist/esm/execution/pool.d.ts +229 -0
  773. package/dist/esm/execution/pool.d.ts.map +1 -0
  774. package/dist/esm/execution/pool.js +685 -0
  775. package/dist/esm/execution/pool.js.map +1 -0
  776. package/dist/esm/execution/query-runner.d.ts +88 -0
  777. package/dist/esm/execution/query-runner.d.ts.map +1 -0
  778. package/dist/esm/execution/query-runner.js +743 -0
  779. package/dist/esm/execution/query-runner.js.map +1 -0
  780. package/dist/esm/execution/rate-limiter.d.ts +120 -0
  781. package/dist/esm/execution/rate-limiter.d.ts.map +1 -0
  782. package/dist/esm/execution/rate-limiter.js +269 -0
  783. package/dist/esm/execution/rate-limiter.js.map +1 -0
  784. package/dist/esm/execution/search-path.d.ts +161 -0
  785. package/dist/esm/execution/search-path.d.ts.map +1 -0
  786. package/dist/esm/execution/search-path.js +270 -0
  787. package/dist/esm/execution/search-path.js.map +1 -0
  788. package/dist/esm/execution/sql-parser.d.ts +195 -0
  789. package/dist/esm/execution/sql-parser.d.ts.map +1 -0
  790. package/dist/esm/execution/sql-parser.js +683 -0
  791. package/dist/esm/execution/sql-parser.js.map +1 -0
  792. package/dist/esm/execution/statement-classifier.d.ts +103 -0
  793. package/dist/esm/execution/statement-classifier.d.ts.map +1 -0
  794. package/dist/esm/execution/statement-classifier.js +526 -0
  795. package/dist/esm/execution/statement-classifier.js.map +1 -0
  796. package/dist/esm/execution/types.d.ts +189 -0
  797. package/dist/esm/execution/types.d.ts.map +1 -0
  798. package/dist/esm/execution/types.js +22 -0
  799. package/dist/esm/execution/types.js.map +1 -0
  800. package/dist/esm/index.d.ts +34 -0
  801. package/dist/esm/index.d.ts.map +1 -0
  802. package/dist/esm/index.js +38 -0
  803. package/dist/esm/index.js.map +1 -0
  804. package/dist/esm/permissions/auto-upgrade.d.ts +40 -0
  805. package/dist/esm/permissions/auto-upgrade.d.ts.map +1 -0
  806. package/dist/esm/permissions/auto-upgrade.js +164 -0
  807. package/dist/esm/permissions/auto-upgrade.js.map +1 -0
  808. package/dist/esm/permissions/checker.d.ts +53 -0
  809. package/dist/esm/permissions/checker.d.ts.map +1 -0
  810. package/dist/esm/permissions/checker.js +322 -0
  811. package/dist/esm/permissions/checker.js.map +1 -0
  812. package/dist/esm/permissions/manual-approval.d.ts +213 -0
  813. package/dist/esm/permissions/manual-approval.d.ts.map +1 -0
  814. package/dist/esm/permissions/manual-approval.js +503 -0
  815. package/dist/esm/permissions/manual-approval.js.map +1 -0
  816. package/dist/esm/permissions/plan-registry.d.ts +274 -0
  817. package/dist/esm/permissions/plan-registry.d.ts.map +1 -0
  818. package/dist/esm/permissions/plan-registry.js +450 -0
  819. package/dist/esm/permissions/plan-registry.js.map +1 -0
  820. package/dist/esm/permissions/role-policy.d.ts +217 -0
  821. package/dist/esm/permissions/role-policy.d.ts.map +1 -0
  822. package/dist/esm/permissions/role-policy.js +570 -0
  823. package/dist/esm/permissions/role-policy.js.map +1 -0
  824. package/dist/esm/permissions/types.d.ts +126 -0
  825. package/dist/esm/permissions/types.d.ts.map +1 -0
  826. package/dist/esm/permissions/types.js +2 -0
  827. package/dist/esm/permissions/types.js.map +1 -0
  828. package/dist/esm/protocol/constants.d.ts +72 -0
  829. package/dist/esm/protocol/constants.d.ts.map +1 -0
  830. package/dist/esm/protocol/constants.js +104 -0
  831. package/dist/esm/protocol/constants.js.map +1 -0
  832. package/dist/esm/protocol/envelope.d.ts +165 -0
  833. package/dist/esm/protocol/envelope.d.ts.map +1 -0
  834. package/dist/esm/protocol/envelope.js +263 -0
  835. package/dist/esm/protocol/envelope.js.map +1 -0
  836. package/dist/esm/protocol/errors.d.ts +33 -0
  837. package/dist/esm/protocol/errors.d.ts.map +1 -0
  838. package/dist/esm/protocol/errors.js +384 -0
  839. package/dist/esm/protocol/errors.js.map +1 -0
  840. package/dist/esm/protocol/messages.d.ts +327 -0
  841. package/dist/esm/protocol/messages.d.ts.map +1 -0
  842. package/dist/esm/protocol/messages.js +2 -0
  843. package/dist/esm/protocol/messages.js.map +1 -0
  844. package/dist/esm/protocol/serialize.d.ts +26 -0
  845. package/dist/esm/protocol/serialize.d.ts.map +1 -0
  846. package/dist/esm/protocol/serialize.js +63 -0
  847. package/dist/esm/protocol/serialize.js.map +1 -0
  848. package/dist/esm/protocol/validate.d.ts +135 -0
  849. package/dist/esm/protocol/validate.d.ts.map +1 -0
  850. package/dist/esm/protocol/validate.js +830 -0
  851. package/dist/esm/protocol/validate.js.map +1 -0
  852. package/dist/types/audit/chain.d.ts +365 -0
  853. package/dist/types/audit/chain.d.ts.map +1 -0
  854. package/dist/types/audit/cloud-client.d.ts +142 -0
  855. package/dist/types/audit/cloud-client.d.ts.map +1 -0
  856. package/dist/types/audit/cloud-writer.d.ts +57 -0
  857. package/dist/types/audit/cloud-writer.d.ts.map +1 -0
  858. package/dist/types/audit/context.d.ts +51 -0
  859. package/dist/types/audit/context.d.ts.map +1 -0
  860. package/dist/types/audit/files.d.ts +111 -0
  861. package/dist/types/audit/files.d.ts.map +1 -0
  862. package/dist/types/audit/index.d.ts +9 -0
  863. package/dist/types/audit/index.d.ts.map +1 -0
  864. package/dist/types/audit/local-writer.d.ts +255 -0
  865. package/dist/types/audit/local-writer.d.ts.map +1 -0
  866. package/dist/types/audit/redact.d.ts +151 -0
  867. package/dist/types/audit/redact.d.ts.map +1 -0
  868. package/dist/types/audit/sanitize.d.ts +78 -0
  869. package/dist/types/audit/sanitize.d.ts.map +1 -0
  870. package/dist/types/audit/sink.d.ts +278 -0
  871. package/dist/types/audit/sink.d.ts.map +1 -0
  872. package/dist/types/audit/types.d.ts +226 -0
  873. package/dist/types/audit/types.d.ts.map +1 -0
  874. package/dist/types/audit/verify-cache.d.ts +127 -0
  875. package/dist/types/audit/verify-cache.d.ts.map +1 -0
  876. package/dist/types/channels/agent-session.d.ts +228 -0
  877. package/dist/types/channels/agent-session.d.ts.map +1 -0
  878. package/dist/types/channels/data-channel.d.ts +181 -0
  879. package/dist/types/channels/data-channel.d.ts.map +1 -0
  880. package/dist/types/channels/reconnect.d.ts +142 -0
  881. package/dist/types/channels/reconnect.d.ts.map +1 -0
  882. package/dist/types/channels/types.d.ts +112 -0
  883. package/dist/types/channels/types.d.ts.map +1 -0
  884. package/dist/types/channels/wake-channel.d.ts +232 -0
  885. package/dist/types/channels/wake-channel.d.ts.map +1 -0
  886. package/dist/types/cli/banner.d.ts +2 -0
  887. package/dist/types/cli/banner.d.ts.map +1 -0
  888. package/dist/types/cli/commands/agent.d.ts +30 -0
  889. package/dist/types/cli/commands/agent.d.ts.map +1 -0
  890. package/dist/types/cli/commands/audit-verify.d.ts +19 -0
  891. package/dist/types/cli/commands/audit-verify.d.ts.map +1 -0
  892. package/dist/types/cli/commands/clean.d.ts +23 -0
  893. package/dist/types/cli/commands/clean.d.ts.map +1 -0
  894. package/dist/types/cli/commands/config-show.d.ts +2 -0
  895. package/dist/types/cli/commands/config-show.d.ts.map +1 -0
  896. package/dist/types/cli/commands/config.d.ts +6 -0
  897. package/dist/types/cli/commands/config.d.ts.map +1 -0
  898. package/dist/types/cli/commands/db-add.d.ts +16 -0
  899. package/dist/types/cli/commands/db-add.d.ts.map +1 -0
  900. package/dist/types/cli/commands/db-edit.d.ts +2 -0
  901. package/dist/types/cli/commands/db-edit.d.ts.map +1 -0
  902. package/dist/types/cli/commands/db-logs.d.ts +3 -0
  903. package/dist/types/cli/commands/db-logs.d.ts.map +1 -0
  904. package/dist/types/cli/commands/db-ls.d.ts +2 -0
  905. package/dist/types/cli/commands/db-ls.d.ts.map +1 -0
  906. package/dist/types/cli/commands/db-query.d.ts +121 -0
  907. package/dist/types/cli/commands/db-query.d.ts.map +1 -0
  908. package/dist/types/cli/commands/db-remove.d.ts +2 -0
  909. package/dist/types/cli/commands/db-remove.d.ts.map +1 -0
  910. package/dist/types/cli/commands/db-show.d.ts +2 -0
  911. package/dist/types/cli/commands/db-show.d.ts.map +1 -0
  912. package/dist/types/cli/commands/db-test.d.ts +3 -0
  913. package/dist/types/cli/commands/db-test.d.ts.map +1 -0
  914. package/dist/types/cli/commands/db.d.ts +11 -0
  915. package/dist/types/cli/commands/db.d.ts.map +1 -0
  916. package/dist/types/cli/commands/debug.d.ts +2 -0
  917. package/dist/types/cli/commands/debug.d.ts.map +1 -0
  918. package/dist/types/cli/commands/doctor.d.ts +5 -0
  919. package/dist/types/cli/commands/doctor.d.ts.map +1 -0
  920. package/dist/types/cli/commands/index.d.ts +10 -0
  921. package/dist/types/cli/commands/index.d.ts.map +1 -0
  922. package/dist/types/cli/commands/init.d.ts +2 -0
  923. package/dist/types/cli/commands/init.d.ts.map +1 -0
  924. package/dist/types/cli/commands/link.d.ts +5 -0
  925. package/dist/types/cli/commands/link.d.ts.map +1 -0
  926. package/dist/types/cli/commands/logs.d.ts +17 -0
  927. package/dist/types/cli/commands/logs.d.ts.map +1 -0
  928. package/dist/types/cli/commands/project-show.d.ts +2 -0
  929. package/dist/types/cli/commands/project-show.d.ts.map +1 -0
  930. package/dist/types/cli/commands/project.d.ts +3 -0
  931. package/dist/types/cli/commands/project.d.ts.map +1 -0
  932. package/dist/types/cli/commands/service.d.ts +123 -0
  933. package/dist/types/cli/commands/service.d.ts.map +1 -0
  934. package/dist/types/cli/commands/start.d.ts +6 -0
  935. package/dist/types/cli/commands/start.d.ts.map +1 -0
  936. package/dist/types/cli/commands/status.d.ts +2 -0
  937. package/dist/types/cli/commands/status.d.ts.map +1 -0
  938. package/dist/types/cli/commands/stop.d.ts +6 -0
  939. package/dist/types/cli/commands/stop.d.ts.map +1 -0
  940. package/dist/types/cli/daemon/error-tracker.d.ts +119 -0
  941. package/dist/types/cli/daemon/error-tracker.d.ts.map +1 -0
  942. package/dist/types/cli/daemon/fault-shutdown.d.ts +144 -0
  943. package/dist/types/cli/daemon/fault-shutdown.d.ts.map +1 -0
  944. package/dist/types/cli/daemon/index.d.ts +12 -0
  945. package/dist/types/cli/daemon/index.d.ts.map +1 -0
  946. package/dist/types/cli/daemon/pid-file.d.ts +13 -0
  947. package/dist/types/cli/daemon/pid-file.d.ts.map +1 -0
  948. package/dist/types/cli/daemon/readiness.d.ts +30 -0
  949. package/dist/types/cli/daemon/readiness.d.ts.map +1 -0
  950. package/dist/types/cli/daemon/runtime.d.ts +366 -0
  951. package/dist/types/cli/daemon/runtime.d.ts.map +1 -0
  952. package/dist/types/cli/daemon/shutdown.d.ts +7 -0
  953. package/dist/types/cli/daemon/shutdown.d.ts.map +1 -0
  954. package/dist/types/cli/daemon/signal-handlers.d.ts +3 -0
  955. package/dist/types/cli/daemon/signal-handlers.d.ts.map +1 -0
  956. package/dist/types/cli/daemon/state.d.ts +157 -0
  957. package/dist/types/cli/daemon/state.d.ts.map +1 -0
  958. package/dist/types/cli/daemon/status-file.d.ts +139 -0
  959. package/dist/types/cli/daemon/status-file.d.ts.map +1 -0
  960. package/dist/types/cli/doctor/checks.d.ts +133 -0
  961. package/dist/types/cli/doctor/checks.d.ts.map +1 -0
  962. package/dist/types/cli/doctor/fixes.d.ts +9 -0
  963. package/dist/types/cli/doctor/fixes.d.ts.map +1 -0
  964. package/dist/types/cli/doctor/index.d.ts +7 -0
  965. package/dist/types/cli/doctor/index.d.ts.map +1 -0
  966. package/dist/types/cli/index.d.ts +3 -0
  967. package/dist/types/cli/index.d.ts.map +1 -0
  968. package/dist/types/cli/interactive.d.ts +8 -0
  969. package/dist/types/cli/interactive.d.ts.map +1 -0
  970. package/dist/types/cli/logs/format.d.ts +13 -0
  971. package/dist/types/cli/logs/format.d.ts.map +1 -0
  972. package/dist/types/cli/logs/index.d.ts +3 -0
  973. package/dist/types/cli/logs/index.d.ts.map +1 -0
  974. package/dist/types/cli/logs/viewer.d.ts +41 -0
  975. package/dist/types/cli/logs/viewer.d.ts.map +1 -0
  976. package/dist/types/cli/ops/operation-logger.d.ts +63 -0
  977. package/dist/types/cli/ops/operation-logger.d.ts.map +1 -0
  978. package/dist/types/cli/palette.d.ts +11 -0
  979. package/dist/types/cli/palette.d.ts.map +1 -0
  980. package/dist/types/cli/prompt.d.ts +186 -0
  981. package/dist/types/cli/prompt.d.ts.map +1 -0
  982. package/dist/types/cli/ui/box.d.ts +21 -0
  983. package/dist/types/cli/ui/box.d.ts.map +1 -0
  984. package/dist/types/cli/ui/clipboard.d.ts +6 -0
  985. package/dist/types/cli/ui/clipboard.d.ts.map +1 -0
  986. package/dist/types/cli/ui/colors.d.ts +57 -0
  987. package/dist/types/cli/ui/colors.d.ts.map +1 -0
  988. package/dist/types/cli/ui/index.d.ts +9 -0
  989. package/dist/types/cli/ui/index.d.ts.map +1 -0
  990. package/dist/types/cli/ui/spinner.d.ts +12 -0
  991. package/dist/types/cli/ui/spinner.d.ts.map +1 -0
  992. package/dist/types/cli/ui/symbols.d.ts +47 -0
  993. package/dist/types/cli/ui/symbols.d.ts.map +1 -0
  994. package/dist/types/cli/ui/table.d.ts +23 -0
  995. package/dist/types/cli/ui/table.d.ts.map +1 -0
  996. package/dist/types/cli/ui/terminal.d.ts +7 -0
  997. package/dist/types/cli/ui/terminal.d.ts.map +1 -0
  998. package/dist/types/config/atomic-write.d.ts +69 -0
  999. package/dist/types/config/atomic-write.d.ts.map +1 -0
  1000. package/dist/types/config/db-config.d.ts +134 -0
  1001. package/dist/types/config/db-config.d.ts.map +1 -0
  1002. package/dist/types/config/machine-config.d.ts +85 -0
  1003. package/dist/types/config/machine-config.d.ts.map +1 -0
  1004. package/dist/types/config/paths.d.ts +64 -0
  1005. package/dist/types/config/paths.d.ts.map +1 -0
  1006. package/dist/types/config/schema.d.ts +72 -0
  1007. package/dist/types/config/schema.d.ts.map +1 -0
  1008. package/dist/types/config/token.d.ts +63 -0
  1009. package/dist/types/config/token.d.ts.map +1 -0
  1010. package/dist/types/execution/canceller.d.ts +41 -0
  1011. package/dist/types/execution/canceller.d.ts.map +1 -0
  1012. package/dist/types/execution/database-lookup.d.ts +56 -0
  1013. package/dist/types/execution/database-lookup.d.ts.map +1 -0
  1014. package/dist/types/execution/dispatcher.d.ts +181 -0
  1015. package/dist/types/execution/dispatcher.d.ts.map +1 -0
  1016. package/dist/types/execution/function-effects.d.ts +209 -0
  1017. package/dist/types/execution/function-effects.d.ts.map +1 -0
  1018. package/dist/types/execution/introspection.d.ts +76 -0
  1019. package/dist/types/execution/introspection.d.ts.map +1 -0
  1020. package/dist/types/execution/migration-runner.d.ts +128 -0
  1021. package/dist/types/execution/migration-runner.d.ts.map +1 -0
  1022. package/dist/types/execution/non-tx-detector.d.ts +23 -0
  1023. package/dist/types/execution/non-tx-detector.d.ts.map +1 -0
  1024. package/dist/types/execution/pool.d.ts +229 -0
  1025. package/dist/types/execution/pool.d.ts.map +1 -0
  1026. package/dist/types/execution/query-runner.d.ts +88 -0
  1027. package/dist/types/execution/query-runner.d.ts.map +1 -0
  1028. package/dist/types/execution/rate-limiter.d.ts +120 -0
  1029. package/dist/types/execution/rate-limiter.d.ts.map +1 -0
  1030. package/dist/types/execution/search-path.d.ts +161 -0
  1031. package/dist/types/execution/search-path.d.ts.map +1 -0
  1032. package/dist/types/execution/sql-parser.d.ts +195 -0
  1033. package/dist/types/execution/sql-parser.d.ts.map +1 -0
  1034. package/dist/types/execution/statement-classifier.d.ts +103 -0
  1035. package/dist/types/execution/statement-classifier.d.ts.map +1 -0
  1036. package/dist/types/execution/types.d.ts +189 -0
  1037. package/dist/types/execution/types.d.ts.map +1 -0
  1038. package/dist/types/index.d.ts +34 -0
  1039. package/dist/types/index.d.ts.map +1 -0
  1040. package/dist/types/permissions/auto-upgrade.d.ts +40 -0
  1041. package/dist/types/permissions/auto-upgrade.d.ts.map +1 -0
  1042. package/dist/types/permissions/checker.d.ts +53 -0
  1043. package/dist/types/permissions/checker.d.ts.map +1 -0
  1044. package/dist/types/permissions/manual-approval.d.ts +213 -0
  1045. package/dist/types/permissions/manual-approval.d.ts.map +1 -0
  1046. package/dist/types/permissions/plan-registry.d.ts +274 -0
  1047. package/dist/types/permissions/plan-registry.d.ts.map +1 -0
  1048. package/dist/types/permissions/role-policy.d.ts +217 -0
  1049. package/dist/types/permissions/role-policy.d.ts.map +1 -0
  1050. package/dist/types/permissions/types.d.ts +126 -0
  1051. package/dist/types/permissions/types.d.ts.map +1 -0
  1052. package/dist/types/protocol/constants.d.ts +72 -0
  1053. package/dist/types/protocol/constants.d.ts.map +1 -0
  1054. package/dist/types/protocol/envelope.d.ts +165 -0
  1055. package/dist/types/protocol/envelope.d.ts.map +1 -0
  1056. package/dist/types/protocol/errors.d.ts +33 -0
  1057. package/dist/types/protocol/errors.d.ts.map +1 -0
  1058. package/dist/types/protocol/messages.d.ts +327 -0
  1059. package/dist/types/protocol/messages.d.ts.map +1 -0
  1060. package/dist/types/protocol/serialize.d.ts +26 -0
  1061. package/dist/types/protocol/serialize.d.ts.map +1 -0
  1062. package/dist/types/protocol/validate.d.ts +135 -0
  1063. package/dist/types/protocol/validate.d.ts.map +1 -0
  1064. package/package.json +116 -4
  1065. package/scripts/generate-systemd-service.mjs +117 -0
@@ -0,0 +1,1258 @@
1
+ import * as crypto from 'crypto';
2
+ import { PoolError } from './pool';
3
+ import { makeError, ERROR_CATALOG } from '../protocol/errors';
4
+ import { hasCapability, isStrictlyMorePrivileged } from '../permissions/role-policy';
5
+ import { APPROVAL_STRANDED_SLACK_MS } from '../permissions/manual-approval';
6
+ import { UNRESOLVED_DB_IDENTITY, resolvedIdentityOf, withResolvedDatabase, } from '../audit/context';
7
+ import { fingerprintStatement, previewStatement } from '../audit/redact';
8
+ import { RateLimiter } from './rate-limiter';
9
+ import { normaliseLookupResult, } from './database-lookup';
10
+ import { validateMigrationResultPayload } from '../protocol/validate';
11
+ import { functionEffectResolverForPool } from './function-effects';
12
+ import { POOL_ERROR_MESSAGES, sanitizeErrorText, sanitizePgError, sanitizeReason, } from '../audit/sanitize';
13
+ export class Dispatcher {
14
+ opts;
15
+ rateLimiter;
16
+ constructor(opts) {
17
+ this.opts = opts;
18
+ this.rateLimiter = opts.rateLimiter ?? new RateLimiter();
19
+ }
20
+ async sendResponse(msg, payload, resolvedAlias) {
21
+ await this.opts.send({
22
+ v: 1,
23
+ id: crypto.randomUUID(),
24
+ type: 'response',
25
+ project: msg.project,
26
+ user: msg.user,
27
+ // The RESOLVED alias, so the browser's view of "which database answered"
28
+ // matches the audit trail. Falling back to the asserted alias is only for
29
+ // frames that resolved to no database at all (`ping`), where there is
30
+ // nothing truer to send.
31
+ db_alias: resolvedAlias ?? msg.db_alias,
32
+ ts: Date.now(),
33
+ payload: {
34
+ request_id: msg.id,
35
+ ...payload,
36
+ },
37
+ });
38
+ }
39
+ /**
40
+ * `pg_error` is deliberately limited to the two allow-listed fields. Passing
41
+ * `detail` or `hint` here is a compile error on purpose: both routinely carry
42
+ * row data (`DETAIL: Key (email)=(alice@corp.com) already exists.`) and the
43
+ * risk only ever grows.
44
+ */
45
+ async sendError(msg, code, message, pg_error, resolvedAlias) {
46
+ await this.opts.send({
47
+ v: 1,
48
+ id: crypto.randomUUID(),
49
+ type: 'error',
50
+ project: msg.project,
51
+ user: msg.user,
52
+ db_alias: resolvedAlias ?? msg.db_alias,
53
+ ts: Date.now(),
54
+ payload: makeError(code, msg.id, { message, pg_error }),
55
+ });
56
+ }
57
+ /**
58
+ * Register a migration plan. Callers must have passed `evaluateEventGate`;
59
+ * this method re-checks the shape of the payload and never invents an
60
+ * effective permission level for the audit record.
61
+ */
62
+ async handlePlanRegister(msg, statements, riskLevel, permissionLevel, resolvedAlias) {
63
+ // Re-asserted so the method is safe to call from anywhere, not only from
64
+ // `handleEvent`. Denials are audited by the caller, so nothing is logged
65
+ // twice.
66
+ const gate = this.evaluateGate(msg, permissionLevel);
67
+ if (!gate.allowed) {
68
+ return this.sendError(msg, gate.errorCode, gate.reason, undefined, resolvedAlias);
69
+ }
70
+ if (!Array.isArray(statements) ||
71
+ statements.length === 0 ||
72
+ statements.some((s) => typeof s !== 'string' || s.trim().length === 0)) {
73
+ return this.sendError(msg, 'payload_invalid', 'A migration plan must contain at least one non-empty statement.', undefined, resolvedAlias);
74
+ }
75
+ const planId = `plan_${crypto.randomUUID()}`;
76
+ // the plan is bound to the RESOLVED database, so a statement set
77
+ // reviewed here cannot later be executed against a different entry. The
78
+ // registry refuses a registration that cannot name one.
79
+ const registered = this.opts.planRegistry.register(planId, statements, msg.user.id, riskLevel, {
80
+ user_id: msg.user.id,
81
+ role: msg.user.role,
82
+ permission_level: permissionLevel,
83
+ project: msg.project,
84
+ db_alias: resolvedAlias ?? msg.db_alias,
85
+ });
86
+ // Fail closed. Without the principal the registry refuses to store
87
+ // anything, and issuing a plan_id for a plan that does not exist would be
88
+ // a lie in the audit trail and a dead end for the browser.
89
+ if (!registered.ok) {
90
+ await this.auditDeny(msg, permissionLevel, {
91
+ action: 'plan_register',
92
+ denial_reason: registered.code,
93
+ });
94
+ return this.sendError(msg, 'permission_denied', registered.reason, undefined, resolvedAlias);
95
+ }
96
+ if (this.opts.auditSink) {
97
+ await this.opts.auditSink.logSync({
98
+ ...this.auditBase(msg, permissionLevel),
99
+ action: 'plan_register',
100
+ decision: 'allow',
101
+ outcome: 'n/a',
102
+ // The level the registration was actually authorised at. This used to
103
+ // be the literal 'full', which misrepresented every registration.
104
+ migration_plan_id: planId,
105
+ statement_preview: previewStatement(statements.join('; ')),
106
+ });
107
+ }
108
+ await this.sendResponse(msg, {
109
+ ok: true,
110
+ data: { plan_id: planId, expires_in_ms: 300_000 },
111
+ }, resolvedAlias);
112
+ }
113
+ /**
114
+ * Derive the authorization decision for an inbound `event` frame.
115
+ *
116
+ * `PlanRegistry.canRegister` owns the plan-registration decision, so asking
117
+ * it directly is what keeps the entry gate and the registry from disagreeing.
118
+ */
119
+ evaluateGate(msg, permissionLevel) {
120
+ const kind = msg.payload?.kind;
121
+ return evaluateEventGate(kind, msg.user.role, permissionLevel, (role, level) => this.opts.planRegistry.canRegister(role, level));
122
+ }
123
+ /**
124
+ * Handle an inbound `event` frame.
125
+ *
126
+ * Every kind is authorized before any handler runs. The previous
127
+ * implementation dispatched `approval_response` and `plan_register` from the
128
+ * top of `handle()`, ahead of the query/migration permission pipeline, so a
129
+ * `viewer` could resolve another user's pending manual approval and could
130
+ * register an arbitrary migration plan for later replay at `auto_upgrade`.
131
+ */
132
+ async handleEvent(msg, permissionLevel, resolvedAlias) {
133
+ const payload = msg.payload;
134
+ const kind = payload?.kind;
135
+ const gate = this.evaluateGate(msg, permissionLevel);
136
+ if (!gate.allowed) {
137
+ if (gate.auditAction) {
138
+ await this.auditDeny(msg, permissionLevel, {
139
+ action: gate.auditAction,
140
+ denial_reason: gate.code,
141
+ });
142
+ }
143
+ return this.sendError(msg, gate.errorCode, gate.reason, undefined, resolvedAlias);
144
+ }
145
+ if (kind === 'plan_register') {
146
+ const data = payload.data;
147
+ return this.handlePlanRegister(msg, data.statements, data.risk_level || data.riskLevel, permissionLevel, resolvedAlias);
148
+ }
149
+ const data = payload.data;
150
+ // `approved_by` is deliberately not forwarded. It is free text supplied by
151
+ // the sender; the approver recorded in the audit trail comes from the
152
+ // verified envelope via `actorId`, so a spoofed string cannot fabricate an
153
+ // attestation.
154
+ const outcome = this.opts.permissionChecker.opts.manualApprovalHandler.handleResponse({
155
+ request_id: typeof data?.request_id === 'string' ? data.request_id : '',
156
+ approved: data?.approved === true,
157
+ // Forwarded verbatim: the handler consumes it exactly once.
158
+ approval_nonce: typeof data?.approval_nonce === 'string' ? data.approval_nonce : '',
159
+ }, { actorId: msg.user.id, actorRole: msg.user.role });
160
+ // Every refusal looks identical on the wire. The handler distinguishes
161
+ // "no pending approval", "not the requesting user", "role may not approve"
162
+ // and "nonce mismatch"; returning those reasons would tell an attacker
163
+ // that a request id they chose really does have an approval pending under
164
+ // somebody else's account.
165
+ await this.sendResponse(msg, {
166
+ ok: outcome.handled,
167
+ data: outcome.handled
168
+ ? { resolved: true, request_id: data.request_id }
169
+ : { resolved: false, reason: 'no matching pending approval' },
170
+ }, resolvedAlias);
171
+ return;
172
+ }
173
+ /**
174
+ * Handle one inbound frame.
175
+ *
176
+ * The frame's `(project, db_alias)` is resolved first and everything after —
177
+ * every authorization decision, every database call, every audit record —
178
+ * happens inside the resolved-database context. That ordering is the durable
179
+ * half of the fix: the audit sink takes the resolved identity from the
180
+ * context, so no call site can write the frame's own claim into the record, and
181
+ * a frame that resolves to nothing is recorded as `unresolved` rather than as
182
+ * the database it asked for.
183
+ */
184
+ async handle(msg) {
185
+ const resolution = normaliseLookupResult(this.opts.lookupDb(msg.project, msg.db_alias), msg.project, msg.db_alias);
186
+ const identity = resolution.ok
187
+ ? resolvedIdentityOf(resolution.entry)
188
+ : UNRESOLVED_DB_IDENTITY;
189
+ return withResolvedDatabase(identity, () => this.handleResolved(msg, resolution));
190
+ }
191
+ /**
192
+ * The fields every audit record for one frame carries.
193
+ *
194
+ * Centralised so the asserted identity (`project`, `db_alias_asserted`) is
195
+ * recorded identically on allows and denials: the resolved identity comes from
196
+ * the sink's context, and these two come from the frame. A record that names
197
+ * what the frame claimed and what the agent resolved is the only way a
198
+ * mismatch like is visible to anyone reading the trail afterwards.
199
+ */
200
+ auditBase(msg, permissionLevel) {
201
+ return {
202
+ id: msg.id,
203
+ project: msg.project,
204
+ db_alias_asserted: msg.db_alias,
205
+ user_id: msg.user.id,
206
+ role: msg.user.role,
207
+ permission_level: permissionLevel,
208
+ };
209
+ }
210
+ /** Awaited audit write, or a no-op when no sink is configured. */
211
+ async auditDeny(msg, permissionLevel, fields) {
212
+ if (!this.opts.auditSink)
213
+ return;
214
+ await this.opts.auditSink.logSync({
215
+ ...this.auditBase(msg, permissionLevel),
216
+ decision: 'deny',
217
+ outcome: fields.outcome ?? 'n/a',
218
+ ...fields,
219
+ });
220
+ }
221
+ async handleResolved(msg, resolution) {
222
+ const dbEntry = resolution.ok ? resolution.entry : null;
223
+ /**
224
+ * The alias every outbound frame echoes. The RESOLVED one, never `msg.db_alias`:
225
+ * echoing the asserted alias back is how a frame that named one database and
226
+ * ran against another stayed invisible to the browser.
227
+ */
228
+ const resolvedAlias = dbEntry?.db_alias;
229
+ const abortController = new AbortController();
230
+ const startTime = Date.now();
231
+ const machineConfig = this.opts.getMachineConfig();
232
+ const permissionLevel = dbEntry
233
+ ? (dbEntry.permission_override ?? machineConfig.default_permission)
234
+ : machineConfig.default_permission;
235
+ // Admission control runs before any work, including the database: a single
236
+ // authenticated sender must not be able to saturate the connector or the
237
+ // customer's database. The permit is released in the `finally` below, so a
238
+ // rejected or failed request still gives its concurrency slot back.
239
+ const permit = this.rateLimiter.tryAcquire(mapMessageTypeToRateLimitAction(msg.type), {
240
+ agent_id: machineConfig.agent_id,
241
+ user_id: msg.user.id,
242
+ db_alias: dbEntry?.db_alias ?? msg.db_alias ?? '',
243
+ });
244
+ if (!permit.allowed) {
245
+ // Admission control refusals are refusals, and is the finding that a
246
+ // refusal nothing records is indistinguishable from a request that never
247
+ // arrived. Recorded with the reason code so the trail distinguishes a
248
+ // rate-limit from an authorization decision without leaking which was which
249
+ // to the caller (the wire error stays `rate_limited`).
250
+ await this.auditDeny(msg, permissionLevel, {
251
+ action: mapMessageTypeToAuditAction(msg.type),
252
+ denial_reason: safeAuditReason(permit.reason ?? 'rate_limit_exceeded'),
253
+ });
254
+ return this.sendError(msg, 'rate_limited', rateLimitMessage(permit.reason, permit.scope), undefined, resolvedAlias);
255
+ }
256
+ /**
257
+ * Independent of the approval promise. Released by the watchdog below
258
+ * if the request is still parked on a human when the approval window plus
259
+ * slack has elapsed, so a stranded promise can never hold a concurrency
260
+ * permit forever.
261
+ */
262
+ let watchdog = null;
263
+ /** Whether this frame already passed an authorization decision. */
264
+ let authorized = false;
265
+ try {
266
+ if (!dbEntry && msg.type !== 'ping') {
267
+ // Every way a frame can fail to resolve a database is now audited under
268
+ // its own reason: unknown entry, out of scope, no allow-list configured,
269
+ // or a project/alias collision (, ).
270
+ const refusal = resolution;
271
+ await this.auditDeny(msg, permissionLevel, {
272
+ action: mapMessageTypeToAuditAction(msg.type),
273
+ denial_reason: refusal.code,
274
+ });
275
+ return this.sendError(msg, databaseRefusalErrorCode(refusal.code), databaseRefusalMessage(refusal), undefined, resolvedAlias);
276
+ }
277
+ if (msg.type === 'ping') {
278
+ return this.sendResponse(msg, { ok: true, data: { agent_time: Date.now() } }, resolvedAlias);
279
+ }
280
+ if (msg.type === 'cancel') {
281
+ return this.handleCancel(msg, permissionLevel, resolvedAlias, startTime);
282
+ }
283
+ if (msg.type === 'event') {
284
+ return this.handleEvent(msg, permissionLevel, resolvedAlias);
285
+ }
286
+ let sql = '';
287
+ /** Set from the permission decision so execution cannot disagree with it. */
288
+ let decisionClassification;
289
+ let statements;
290
+ let intent = 'read';
291
+ let planId;
292
+ if (msg.type === 'query' || msg.type === 'stream_query') {
293
+ const payload = msg.payload;
294
+ sql = payload.sql;
295
+ intent = payload.intent;
296
+ planId = payload.plan_id;
297
+ }
298
+ else if (msg.type === 'migration_run') {
299
+ const payload = msg.payload;
300
+ statements = payload.statements;
301
+ sql = statements[0] ?? '';
302
+ intent = 'migration';
303
+ planId = payload.plan_id;
304
+ }
305
+ else if (msg.type === 'introspect') {
306
+ if (!hasCapability(msg.user.role, 'introspect')) {
307
+ await this.auditDeny(msg, permissionLevel, {
308
+ action: 'introspect',
309
+ denial_reason: 'role_denied',
310
+ });
311
+ return this.sendError(msg, 'role_insufficient', `Role '${msg.user.role}' cannot introspect`, undefined, resolvedAlias);
312
+ }
313
+ authorized = true;
314
+ if (this.opts.auditSink) {
315
+ await this.opts.auditSink.logSync({
316
+ ...this.auditBase(msg, permissionLevel),
317
+ action: 'introspect',
318
+ decision: 'allow',
319
+ outcome: 'n/a',
320
+ });
321
+ }
322
+ const result = await this.opts.introspector.introspect(msg.payload, dbEntry);
323
+ const elapsedMs = Date.now() - startTime;
324
+ // Introspection returns the whole schema, so a caller that loops it is
325
+ // exfiltrating. The rate limiter bounds how often it runs; this bounds
326
+ // how much leaves in one response.
327
+ const sizeVerdict = this.rateLimiter.checkIntrospectSize(serializedSizeOf(result));
328
+ if (!sizeVerdict.allowed) {
329
+ if (this.opts.auditSink) {
330
+ this.opts.auditSink.log({
331
+ ...this.auditBase(msg, permissionLevel),
332
+ action: 'introspect',
333
+ decision: 'allow',
334
+ outcome: 'error',
335
+ duration_ms: elapsedMs,
336
+ error_code: 'RATE_LIMITED',
337
+ });
338
+ }
339
+ return this.sendError(msg, 'rate_limited', 'Introspection snapshot exceeds the configured response budget. Request a narrower ' +
340
+ 'snapshot (for example without triggers or partitions).', undefined, resolvedAlias);
341
+ }
342
+ if (this.opts.auditSink) {
343
+ this.opts.auditSink.log({
344
+ ...this.auditBase(msg, permissionLevel),
345
+ action: 'introspect',
346
+ decision: 'allow',
347
+ outcome: 'success',
348
+ duration_ms: elapsedMs,
349
+ });
350
+ }
351
+ await this.sendResponse(msg, {
352
+ request_id: msg.id,
353
+ ok: true,
354
+ data: result,
355
+ }, resolvedAlias);
356
+ return;
357
+ }
358
+ else {
359
+ return this.sendError(msg, 'invalid_message', `Cannot handle message type '${msg.type}' from browser`, undefined, resolvedAlias);
360
+ }
361
+ if (msg.type === 'query' || msg.type === 'stream_query' || msg.type === 'migration_run') {
362
+ // a plan is bound to the database it was registered against. The
363
+ // registry cannot see this frame (the `consume()` call is made deeper in
364
+ // the permission pipeline), so the binding is checked here, before any
365
+ // authority is consulted. An unregistered plan id passes: a `migration_run`
366
+ // at `full` legitimately needs no plan.
367
+ if (planId) {
368
+ const scopeVerdict = this.opts.planRegistry.assertExecutionScope(planId, {
369
+ project: dbEntry?.project_name ?? msg.project,
370
+ db_alias: dbEntry?.db_alias ?? '',
371
+ });
372
+ if (!scopeVerdict.ok) {
373
+ await this.auditDeny(msg, permissionLevel, {
374
+ action: mapMessageTypeToAuditAction(msg.type),
375
+ denial_reason: 'plan_scope_mismatch',
376
+ statement_fingerprint: fingerprintStatement(sql),
377
+ statement_preview: previewStatement(sql),
378
+ migration_plan_id: planId,
379
+ });
380
+ return this.sendError(msg, 'plan_scope_mismatch', 'This migration plan was registered against a different project or database.', undefined, resolvedAlias);
381
+ }
382
+ }
383
+ // arm the independent watchdog BEFORE the check, because the
384
+ // check is what can park the request on a human. It releases the
385
+ // concurrency permit if the approval is still outstanding after the
386
+ // window plus slack, so permit release never depends on the approval
387
+ // promise settling.
388
+ watchdog = this.armApprovalWatchdog(msg, permissionLevel, permit, { planId, sql });
389
+ // The checker parses; we reuse its verdict rather than parsing again.
390
+ //
391
+ // the function-effect resolver answers "what can the functions
392
+ // this statement calls actually do?" from `pg_proc` on the target
393
+ // database. It is supplied here, and only here, because this is the one
394
+ // place that knows which database the frame resolved to: OIDs — and
395
+ // therefore which overloads exist — are per-database, so a resolver
396
+ // built anywhere else would be answering about the wrong cluster. If it
397
+ // cannot be built (no usable credentials, pool exhausted), the check
398
+ // gets `analysed: false` and every statement that calls a function is
399
+ // escalated rather than trusted.
400
+ const decision = await this.opts.permissionChecker.check({
401
+ role: msg.user.role,
402
+ permission_level: permissionLevel,
403
+ sql,
404
+ intent,
405
+ plan_id: planId,
406
+ message_type: msg.type,
407
+ request_id: msg.id,
408
+ db_alias: msg.db_alias,
409
+ project: msg.project,
410
+ // The RESOLVED pair, so a plan bound to production cannot be run by
411
+ // a frame that names dev and the audit trail names the
412
+ // database the statement actually reached.
413
+ resolved_project: dbEntry?.project_name,
414
+ resolved_db_alias: dbEntry?.db_alias,
415
+ user: msg.user,
416
+ }, statements, dbEntry ? functionEffectResolverForPool(this.opts.poolManager, dbEntry) : undefined);
417
+ decisionClassification = decision.classification;
418
+ if (!decision.allowed) {
419
+ let errorCode = mapDecisionCodeToErrorCode(decision.code);
420
+ let isManualApprovalFailure = false;
421
+ if (decision.code === 'permission_denied' && decision.reason === 'timeout') {
422
+ errorCode = 'MANUAL_APPROVAL_TIMEOUT';
423
+ isManualApprovalFailure = true;
424
+ }
425
+ else if (decision.code === 'permission_denied' && decision.reason === 'denied') {
426
+ errorCode = 'MANUAL_APPROVAL_REJECTED';
427
+ isManualApprovalFailure = true;
428
+ }
429
+ if (this.opts.auditSink && !isManualApprovalFailure) {
430
+ await this.opts.auditSink.logSync({
431
+ ...this.auditBase(msg, permissionLevel),
432
+ action: mapMessageTypeToAuditAction(msg.type),
433
+ decision: 'deny',
434
+ outcome: 'n/a',
435
+ denial_reason: safeAuditReason(decision.code),
436
+ statement_fingerprint: fingerprintStatement(sql),
437
+ statement_preview: previewStatement(sql),
438
+ migration_plan_id: planId,
439
+ });
440
+ }
441
+ // `decision.reason` can embed a parser error, and a parser error
442
+ // quotes the SQL that failed — so it is redacted before it goes out.
443
+ return this.sendError(msg, errorCode, sanitizeReason(decision.reason, sanitizeOptions(dbEntry)), undefined, resolvedAlias);
444
+ }
445
+ authorized = true;
446
+ if (this.opts.auditSink) {
447
+ await this.opts.auditSink.logSync({
448
+ ...this.auditBase(msg, permissionLevel),
449
+ action: mapMessageTypeToAuditAction(msg.type),
450
+ decision: 'allow',
451
+ outcome: 'n/a',
452
+ statement_fingerprint: fingerprintStatement(sql),
453
+ statement_preview: previewStatement(sql),
454
+ migration_plan_id: planId,
455
+ });
456
+ }
457
+ }
458
+ const classification = decisionClassification;
459
+ if (msg.type === 'query') {
460
+ try {
461
+ const result = await this.opts.queryRunner.runOneShot(msg.payload, {
462
+ dbEntry: dbEntry,
463
+ request_id: msg.id,
464
+ classification,
465
+ registerInFlight: (req) => {
466
+ req.message = msg;
467
+ // The canceller can only abort `req.abort`, so the controller the
468
+ // runner is already listening on is the one it must be handed.
469
+ // Previously the canceller aborted a controller nobody observed.
470
+ req.abort = abortController;
471
+ this.opts.canceller.register(req);
472
+ },
473
+ unregisterInFlight: (reqId) => {
474
+ this.opts.canceller.unregister(reqId);
475
+ },
476
+ abortSignal: abortController.signal,
477
+ });
478
+ const elapsedMs = Date.now() - startTime;
479
+ if (this.opts.auditSink) {
480
+ this.opts.auditSink.log({
481
+ ...this.auditBase(msg, permissionLevel),
482
+ action: 'query',
483
+ decision: 'allow',
484
+ outcome: 'success',
485
+ statement_fingerprint: fingerprintStatement(sql),
486
+ statement_preview: previewStatement(sql),
487
+ duration_ms: elapsedMs,
488
+ rows_affected: result.rows_affected,
489
+ rows_returned: result.rows?.length ?? 0,
490
+ });
491
+ }
492
+ await this.sendResponse(msg, {
493
+ request_id: msg.id,
494
+ ok: true,
495
+ data: result,
496
+ }, resolvedAlias);
497
+ }
498
+ catch (err) {
499
+ const elapsedMs = Date.now() - startTime;
500
+ const errorObj = err;
501
+ if (this.opts.auditSink) {
502
+ const outcome = errorObj.name === 'QueryCancelledError' || errorObj.code === '57014'
503
+ ? 'cancelled'
504
+ : 'error';
505
+ this.opts.auditSink.log({
506
+ ...this.auditBase(msg, permissionLevel),
507
+ action: 'query',
508
+ decision: 'allow',
509
+ outcome,
510
+ statement_fingerprint: fingerprintStatement(sql),
511
+ statement_preview: previewStatement(sql),
512
+ duration_ms: elapsedMs,
513
+ error_code: safeAuditCode(errorObj.code),
514
+ });
515
+ }
516
+ throw err;
517
+ }
518
+ }
519
+ else if (msg.type === 'stream_query') {
520
+ // Exactly one terminal frame per request. A stream that dies partway
521
+ // ends with an `error`; a stream that finished must not be followed by
522
+ // a second `error` because the `stream_end` send itself failed after
523
+ // the frame was written.
524
+ let streamTerminated = false;
525
+ try {
526
+ await this.opts.queryRunner.runStreaming(msg.payload, {
527
+ dbEntry: dbEntry,
528
+ request_id: msg.id,
529
+ classification,
530
+ registerInFlight: (req) => {
531
+ req.message = msg;
532
+ req.abort = abortController;
533
+ this.opts.canceller.register(req);
534
+ },
535
+ unregisterInFlight: (reqId) => {
536
+ this.opts.canceller.unregister(reqId);
537
+ },
538
+ // Forwarded verbatim so the runner can observe the transport buffer.
539
+ // Undefined stays undefined: the runner then falls back to the
540
+ // awaited send instead of calling a missing hook.
541
+ waitForDrain: this.opts.waitForDrain,
542
+ onChunk: async (chunk) => {
543
+ // Not swallowed: a rejection here propagates out of the producer,
544
+ // which rolls the cursor back and reaches the catch below, where
545
+ // the terminal `error` frame is emitted.
546
+ await this.opts.send({
547
+ v: 1,
548
+ id: crypto.randomUUID(),
549
+ type: 'stream_chunk',
550
+ project: msg.project,
551
+ user: msg.user,
552
+ db_alias: resolvedAlias ?? msg.db_alias,
553
+ ts: Date.now(),
554
+ payload: chunk,
555
+ });
556
+ },
557
+ onEnd: async (end) => {
558
+ if (streamTerminated)
559
+ return;
560
+ await this.opts.send({
561
+ v: 1,
562
+ id: crypto.randomUUID(),
563
+ type: 'stream_end',
564
+ project: msg.project,
565
+ user: msg.user,
566
+ db_alias: resolvedAlias ?? msg.db_alias,
567
+ ts: Date.now(),
568
+ payload: end,
569
+ });
570
+ streamTerminated = true;
571
+ const elapsedMs = Date.now() - startTime;
572
+ if (this.opts.auditSink) {
573
+ this.opts.auditSink.log({
574
+ ...this.auditBase(msg, permissionLevel),
575
+ action: 'stream_query',
576
+ decision: 'allow',
577
+ outcome: 'success',
578
+ statement_fingerprint: fingerprintStatement(sql),
579
+ statement_preview: previewStatement(sql),
580
+ duration_ms: elapsedMs,
581
+ rows_returned: end.total_rows,
582
+ });
583
+ }
584
+ },
585
+ abortSignal: abortController.signal,
586
+ });
587
+ }
588
+ catch (err) {
589
+ const elapsedMs = Date.now() - startTime;
590
+ const errorObj = err;
591
+ if (this.opts.auditSink) {
592
+ const outcome = errorObj.name === 'QueryCancelledError' || errorObj.code === '57014'
593
+ ? 'cancelled'
594
+ : 'error';
595
+ // Map common stream error names to code format for audit logging
596
+ let errorCode = safeAuditCode(errorObj.code);
597
+ if (errorObj.name === 'StreamTooLargeError') {
598
+ errorCode = 'STREAM_ROW_LIMIT';
599
+ }
600
+ else if (errorObj.name === 'CellSizeLimitError') {
601
+ errorCode = 'CELL_SIZE_LIMIT';
602
+ }
603
+ this.opts.auditSink.log({
604
+ ...this.auditBase(msg, permissionLevel),
605
+ action: 'stream_query',
606
+ decision: 'allow',
607
+ outcome,
608
+ statement_fingerprint: fingerprintStatement(sql),
609
+ statement_preview: previewStatement(sql),
610
+ duration_ms: elapsedMs,
611
+ error_code: errorCode,
612
+ });
613
+ }
614
+ // A terminal frame already reached the browser. A second one would
615
+ // leave it with two outcomes for a single request.
616
+ if (streamTerminated)
617
+ return;
618
+ throw err;
619
+ }
620
+ }
621
+ else if (msg.type === 'migration_run') {
622
+ try {
623
+ const result = await this.opts.migrationRunner.run(msg.payload, {
624
+ dbEntry: dbEntry,
625
+ request_id: msg.id,
626
+ project: msg.project,
627
+ user: msg.user,
628
+ db_alias: resolvedAlias ?? msg.db_alias,
629
+ registerInFlight: (req) => {
630
+ req.message = msg;
631
+ req.abort = abortController;
632
+ this.opts.canceller.register(req);
633
+ },
634
+ unregisterInFlight: (reqId) => {
635
+ this.opts.canceller.unregister(reqId);
636
+ },
637
+ onProgress: async (progress) => {
638
+ await this.opts.send(progress);
639
+ },
640
+ abortSignal: abortController.signal,
641
+ });
642
+ const elapsedMs = Date.now() - startTime;
643
+ if (this.opts.auditSink) {
644
+ this.opts.auditSink.log({
645
+ ...this.auditBase(msg, permissionLevel),
646
+ action: 'migration_run',
647
+ decision: 'allow',
648
+ outcome: result.status === 'committed' ? 'success' : 'error',
649
+ statement_fingerprint: fingerprintStatement(sql),
650
+ statement_preview: previewStatement(sql),
651
+ duration_ms: elapsedMs,
652
+ migration_plan_id: planId,
653
+ });
654
+ }
655
+ if (result.status === 'rolled_back') {
656
+ const failedCode = failedStatementCode(result);
657
+ // Curated by SQLSTATE, never the raw node-postgres message: a failed
658
+ // statement's `error` is verbatim `err.message`, which embeds the
659
+ // offending SQL, row values and connection details.
660
+ const pg_error = failedCode ? { code: failedCode, severity: 'ERROR' } : undefined;
661
+ const errorMsg = failedCode
662
+ ? pgMessageForCode(failedCode)
663
+ : 'A migration statement failed.';
664
+ return this.sendError(msg, 'migration_statement_failed', errorMsg, pg_error, resolvedAlias);
665
+ }
666
+ if (result.status === 'partial') {
667
+ // A partial result means statements are already committed on the
668
+ // customer's database and the rest failed. Reporting `ok: true`
669
+ // for that is a data-integrity incident with no rollback path, so
670
+ // it leaves as an error even though the runner considers the run
671
+ // finished. This is deliberately independent of what the runner
672
+ // believes it can achieve.
673
+ const failedCode = failedStatementCode(result);
674
+ const pg_error = failedCode ? { code: failedCode, severity: 'ERROR' } : undefined;
675
+ return this.sendError(msg, 'migration_partial', 'Migration stopped partway: earlier statements are already committed and were not ' +
676
+ 'rolled back. Verify the applied schema before retrying.', pg_error, resolvedAlias);
677
+ }
678
+ if (result.status !== 'committed' &&
679
+ result.status !== 'dry_run_ok' &&
680
+ result.status !== 'dry_run_failed') {
681
+ throw new Error(`migration_result_unexpected:${String(result.status)}`);
682
+ }
683
+ // The inbound migration_run payload is validated; the result leaving
684
+ // the agent was not. A malformed result is a local fault and must not
685
+ // be presented to the browser as a well-formed success.
686
+ validateMigrationResultPayload(result);
687
+ await this.sendResponse(msg, {
688
+ request_id: msg.id,
689
+ ok: true,
690
+ data: sanitizeMigrationResult(result, dbEntry),
691
+ }, resolvedAlias);
692
+ }
693
+ catch (err) {
694
+ const elapsedMs = Date.now() - startTime;
695
+ const errorObj = err;
696
+ if (this.opts.auditSink) {
697
+ this.opts.auditSink.log({
698
+ ...this.auditBase(msg, permissionLevel),
699
+ action: 'migration_run',
700
+ decision: 'allow',
701
+ outcome: 'error',
702
+ statement_fingerprint: fingerprintStatement(sql),
703
+ statement_preview: previewStatement(sql),
704
+ duration_ms: elapsedMs,
705
+ error_code: safeAuditCode(errorObj.code),
706
+ migration_plan_id: planId,
707
+ });
708
+ }
709
+ throw err;
710
+ }
711
+ }
712
+ }
713
+ catch (err) {
714
+ const errorPayload = this.mapErrorToPayload(err, msg.id, dbEntry);
715
+ // an internal failure reached the browser and must reach the trail
716
+ // too. A path that fails before any authorization decision (or after one)
717
+ // still happened, and "the request vanished" is not an acceptable record.
718
+ if (this.opts.auditSink) {
719
+ const errorObj = err;
720
+ this.opts.auditSink.log({
721
+ ...this.auditBase(msg, permissionLevel),
722
+ action: mapMessageTypeToAuditAction(msg.type),
723
+ // Whatever the frame had already been authorised to do. An error
724
+ // before any authorization decision is not a denial of a permitted
725
+ // action, so it is not recorded as one.
726
+ decision: authorized ? 'allow' : 'deny',
727
+ outcome: 'error',
728
+ ...(authorized ? {} : { denial_reason: 'internal_error' }),
729
+ error_code: safeAuditCode(errorObj.code ?? errorObj.name),
730
+ duration_ms: Date.now() - startTime,
731
+ });
732
+ }
733
+ await this.opts.send({
734
+ v: 1,
735
+ id: crypto.randomUUID(),
736
+ type: 'error',
737
+ project: msg.project,
738
+ user: msg.user,
739
+ db_alias: resolvedAlias ?? msg.db_alias,
740
+ ts: Date.now(),
741
+ payload: errorPayload,
742
+ });
743
+ }
744
+ finally {
745
+ if (watchdog)
746
+ clearTimeout(watchdog);
747
+ permit.release();
748
+ }
749
+ }
750
+ /**
751
+ * Arm the independent approval watchdog for one request.
752
+ *
753
+ * Returns the timer so the caller can clear it. The watchdog fires only if an
754
+ * approval for THIS request is still outstanding at the handler's reaper
755
+ * deadline; if the request is merely running a long query, or already finished,
756
+ * it does nothing. It releases the concurrency permit — `RateLimitPermit`
757
+ * releases are idempotent, so the ordinary `finally` remains correct — and
758
+ * records `approval_promise_stranded`, because a stranded promise is exactly
759
+ * the condition that used to leak a permit per attack and disable the database
760
+ * for everyone.
761
+ */
762
+ armApprovalWatchdog(msg, permissionLevel, permit, context = {}) {
763
+ const handler = this.opts.permissionChecker.opts?.manualApprovalHandler;
764
+ // Deliberately LATER than the handler's own reaper. The handler settles the
765
+ // approval promise, which makes `isPending` false and retires this watchdog
766
+ // without a second record; the watchdog is the backstop for a handler that
767
+ // cannot settle at all, so exactly one `approval_promise_stranded` record is
768
+ // ever written for one stranding.
769
+ const deadlineMs = (handler?.getStrandedReaperMs?.() ?? 0) + APPROVAL_STRANDED_SLACK_MS || 250;
770
+ return setTimeout(() => {
771
+ try {
772
+ if (!handler?.isPending?.(msg.id, msg.user.id))
773
+ return;
774
+ permit.release();
775
+ this.opts.auditSink?.log({
776
+ ...this.auditBase(msg, permissionLevel),
777
+ action: mapMessageTypeToAuditAction(msg.type),
778
+ decision: 'deny',
779
+ outcome: 'n/a',
780
+ denial_reason: 'approval_promise_stranded',
781
+ // The same identifying fields every other `migration_run` denial
782
+ // carries. Without them a stranded record says only that *something*
783
+ // was stranded: an investigator cannot tell which plan, or which
784
+ // statement, and a single stray approval in a busy log is
785
+ // indistinguishable from the leak this record exists to catch.
786
+ ...(context.planId ? { migration_plan_id: context.planId } : {}),
787
+ ...(context.sql
788
+ ? {
789
+ statement_fingerprint: fingerprintStatement(context.sql),
790
+ statement_preview: previewStatement(context.sql),
791
+ }
792
+ : {}),
793
+ });
794
+ }
795
+ catch (err) {
796
+ console.error('[dispatcher] approval watchdog failed:', err);
797
+ }
798
+ }, deadlineMs);
799
+ }
800
+ /**
801
+ * `cancel`, bound to the request it names.
802
+ *
803
+ * The only gate used to be `hasCapability(role, 'cancel')`, so any developer
804
+ * could abort any other principal's in-flight query in any project, and the
805
+ * target's database was resolved from the ATTACKER's project when the target
806
+ * had none. Two binding conditions are now required on top of the capability:
807
+ * the caller is the requesting principal, or holds a STRICTLY more privileged
808
+ * role. The target's database comes from the target's own frame and nowhere
809
+ * else.
810
+ */
811
+ async handleCancel(msg, permissionLevel, resolvedAlias, startTime) {
812
+ if (!hasCapability(msg.user.role, 'cancel')) {
813
+ await this.auditDeny(msg, permissionLevel, {
814
+ action: 'cancel',
815
+ denial_reason: 'role_denied',
816
+ });
817
+ return this.sendError(msg, 'role_insufficient', `Role '${msg.user.role}' cannot cancel requests`, undefined, resolvedAlias);
818
+ }
819
+ const targetId = msg.payload.target_id;
820
+ const targetReq = this.opts.canceller.getInFlight().get(targetId);
821
+ if (!targetReq) {
822
+ await this.auditDeny(msg, permissionLevel, {
823
+ action: 'cancel',
824
+ denial_reason: 'cancel_target_not_found',
825
+ });
826
+ return this.sendError(msg, 'cancel_target_not_found', `No in-flight request matches the target_id.`, undefined, resolvedAlias);
827
+ }
828
+ const targetUser = targetReq.message?.user;
829
+ const targetRole = targetUser?.role;
830
+ // Both principals in the record: the refused caller and the owner of the
831
+ // request they tried to touch. Without the second one the trail attributes
832
+ // the attempt only to the attacker and says nothing about whose work it was.
833
+ const targetFields = {
834
+ cancel_target_user_id: targetUser?.id ?? '',
835
+ cancel_target_project: targetReq.message?.project ?? '',
836
+ cancel_target_db_alias: targetReq.message?.db_alias ?? '',
837
+ };
838
+ const ownsTarget = targetUser !== undefined && targetUser.id === msg.user.id;
839
+ const outranksTarget = targetRole !== undefined && isStrictlyMorePrivileged(msg.user.role, targetRole);
840
+ if (targetUser === undefined || (!ownsTarget && !outranksTarget)) {
841
+ await this.auditDeny(msg, permissionLevel, {
842
+ action: 'cancel',
843
+ denial_reason: 'cancel_not_permitted',
844
+ ...targetFields,
845
+ });
846
+ return this.sendError(msg, 'cancel_not_permitted', 'This request is not yours to cancel.', undefined, resolvedAlias);
847
+ }
848
+ // The target's database, from the target's frame ONLY. The previous
849
+ // `targetReq.message?.project || msg.project` meant an attacker whose own
850
+ // project was configured could have a request in a different project
851
+ // cancelled against the attacker's connection.
852
+ const targetDbEntry = this.opts.lookupDb(targetReq.message?.project ?? '', targetReq.message?.db_alias);
853
+ const targetResolution = normaliseLookupResult(targetDbEntry, targetReq.message?.project ?? '', targetReq.message?.db_alias);
854
+ if (!targetResolution.ok) {
855
+ await this.auditDeny(msg, permissionLevel, {
856
+ action: 'cancel',
857
+ denial_reason: 'cancel_target_not_found',
858
+ ...targetFields,
859
+ });
860
+ return this.sendError(msg, 'cancel_target_not_found', `No in-flight request matches the target_id.`, undefined, resolvedAlias);
861
+ }
862
+ // A cancellation acts on the TARGET's database, so the record is attributed
863
+ // to the database the cancellation actually reached.
864
+ return withResolvedDatabase(resolvedIdentityOf(targetResolution.entry), async () => {
865
+ if (this.opts.auditSink) {
866
+ await this.opts.auditSink.logSync({
867
+ ...this.auditBase(msg, permissionLevel),
868
+ action: 'cancel',
869
+ decision: 'allow',
870
+ outcome: 'n/a',
871
+ ...targetFields,
872
+ });
873
+ }
874
+ const cancelResult = await this.opts.canceller.cancel(targetId, targetResolution.entry);
875
+ const elapsedMs = Date.now() - startTime;
876
+ if (this.opts.auditSink) {
877
+ this.opts.auditSink.log({
878
+ ...this.auditBase(msg, permissionLevel),
879
+ action: 'cancel',
880
+ decision: 'allow',
881
+ outcome: 'success',
882
+ duration_ms: elapsedMs,
883
+ ...targetFields,
884
+ });
885
+ }
886
+ return this.sendResponse(msg, {
887
+ request_id: msg.id,
888
+ ok: true,
889
+ data: { target_id: targetId, ...cancelResult },
890
+ }, targetResolution.entry.db_alias);
891
+ });
892
+ }
893
+ /**
894
+ * Map an internal failure to an outbound `error` payload.
895
+ *
896
+ * PostgreSQL errors are reduced to an allow-list of fields plus a curated
897
+ * message per SQLSTATE. `detail` and `hint` are never forwarded: a duplicate
898
+ * key violation ships `Key (email)=(alice@corp.com) already exists.` in
899
+ * `detail`, and messages embed the offending SQL and absolute paths.
900
+ */
901
+ mapErrorToPayload(err, requestId, dbEntry) {
902
+ const opts = sanitizeOptions(dbEntry);
903
+ if (err instanceof PoolError) {
904
+ // PoolError messages carry host, port, database user and file paths.
905
+ return makeError(mapPoolErrorCode(err.code), requestId, {
906
+ message: POOL_ERROR_MESSAGES[err.code] ?? sanitizePgError(err, opts).message,
907
+ });
908
+ }
909
+ const errorObj = err;
910
+ if (errorObj.name === 'QueryTooLargeError') {
911
+ return makeError('query_too_large', requestId, {
912
+ message: sanitizeErrorText(errorObj.message, opts),
913
+ });
914
+ }
915
+ if (errorObj.name === 'StreamTooLargeError') {
916
+ return makeError('STREAM_ROW_LIMIT', requestId, {
917
+ message: sanitizeErrorText(errorObj.message, opts),
918
+ });
919
+ }
920
+ if (errorObj.name === 'CellSizeLimitError') {
921
+ return makeError('CELL_SIZE_LIMIT', requestId, {
922
+ message: sanitizeErrorText(errorObj.message, opts),
923
+ });
924
+ }
925
+ if (errorObj.name === 'MigrationInProgressError') {
926
+ return makeError('migration_in_progress', requestId, {
927
+ message: sanitizeErrorText(errorObj.message, opts),
928
+ });
929
+ }
930
+ if (errorObj.name === 'QueryCancelledError' || errorObj.code === '57014') {
931
+ return makeError('query_cancelled', requestId, {
932
+ message: errorObj.name === 'QueryCancelledError'
933
+ ? 'Query was cancelled'
934
+ : 'The statement exceeded the configured timeout.',
935
+ });
936
+ }
937
+ if (errorObj.message && errorObj.message.startsWith('invalid_message:')) {
938
+ return makeError('invalid_message', requestId, {
939
+ message: 'The agent cannot accept this message.',
940
+ });
941
+ }
942
+ if (errorObj.message && errorObj.message.startsWith('unknown_message_type:')) {
943
+ return makeError('unknown_message_type', requestId, {
944
+ message: 'The agent does not recognise this message type.',
945
+ });
946
+ }
947
+ if (safePgCode(errorObj.code)) {
948
+ const safe = sanitizePgError(err, opts);
949
+ // `detail` is deliberately absent: it is where PostgreSQL puts
950
+ // `Key (email)=(alice@corp.com) already exists.`. `hint` is always one
951
+ // of our own curated strings, never the server's.
952
+ const pg_error = {
953
+ code: String(errorObj.code),
954
+ severity: safeSeverity(safe.severity),
955
+ hint: safe.hint,
956
+ };
957
+ return makeError('execution_failed', requestId, {
958
+ pg_error,
959
+ message: safe.message,
960
+ });
961
+ }
962
+ return makeError('internal_error', requestId, {
963
+ message: sanitizeErrorText(errorObj.message ?? String(err), opts),
964
+ });
965
+ }
966
+ }
967
+ function mapDecisionCodeToErrorCode(code) {
968
+ switch (code) {
969
+ case 'role_insufficient':
970
+ return 'role_insufficient';
971
+ case 'permission_denied':
972
+ return 'permission_denied';
973
+ case 'plan_not_registered':
974
+ return 'migration_plan_not_registered';
975
+ case 'intent_mismatch':
976
+ return 'permission_denied';
977
+ case 'multiple_statements':
978
+ return 'multiple_statements';
979
+ case 'unparseable_statement':
980
+ return 'unparseable_statement';
981
+ case 'parser_unavailable':
982
+ return 'parser_unavailable';
983
+ default:
984
+ return 'permission_denied';
985
+ }
986
+ }
987
+ /**
988
+ * Wire code for a lookup refusal.
989
+ *
990
+ * `database_not_found` and `database_out_of_scope` deliberately share the
991
+ * curated `db_unavailable` answer: telling a caller "that project exists but is
992
+ * out of scope" is a database-existence oracle across tenants, and the
993
+ * distinction is preserved in the audit record instead. The two codes that name
994
+ * the caller's own mistake — a project/alias collision and a missing allow-list —
995
+ * are specific, because both are things only the operator can fix and neither
996
+ * reveals another tenant's configuration.
997
+ */
998
+ function databaseRefusalErrorCode(code) {
999
+ switch (code) {
1000
+ case 'db_alias_project_mismatch':
1001
+ return 'db_alias_project_mismatch';
1002
+ case 'database_scope_not_configured':
1003
+ return 'database_scope_not_configured';
1004
+ default:
1005
+ return 'db_unavailable';
1006
+ }
1007
+ }
1008
+ /**
1009
+ * Curated text for a lookup refusal. The refusal's own `reason` is agent-authored
1010
+ * and data-free by construction (see `DatabaseLookupRefusal.reason`), but it is
1011
+ * not forwarded verbatim here either: every refusal on the wire gets the catalog
1012
+ * text for its code, so nothing derived from configuration reaches the browser.
1013
+ */
1014
+ function databaseRefusalMessage(refusal) {
1015
+ return ERROR_CATALOG[databaseRefusalErrorCode(refusal.code)].default_message;
1016
+ }
1017
+ function mapMessageTypeToAuditAction(msgType) {
1018
+ switch (msgType) {
1019
+ case 'query':
1020
+ return 'query';
1021
+ case 'stream_query':
1022
+ return 'stream_query';
1023
+ case 'migration_run':
1024
+ return 'migration_run';
1025
+ default:
1026
+ return 'query';
1027
+ }
1028
+ }
1029
+ /**
1030
+ * Every inbound type maps onto a budget bucket. `response`, `stream_chunk` and
1031
+ * `stream_end` are agent-originated and fall into `other`, so an unexpected
1032
+ * type is metered rather than waved through.
1033
+ */
1034
+ function mapMessageTypeToRateLimitAction(msgType) {
1035
+ switch (msgType) {
1036
+ case 'ping':
1037
+ return 'ping';
1038
+ case 'introspect':
1039
+ return 'introspect';
1040
+ case 'query':
1041
+ return 'query';
1042
+ case 'stream_query':
1043
+ return 'stream_query';
1044
+ case 'migration_run':
1045
+ return 'migration_run';
1046
+ case 'cancel':
1047
+ return 'cancel';
1048
+ case 'event':
1049
+ return 'event';
1050
+ default:
1051
+ return 'other';
1052
+ }
1053
+ }
1054
+ /** Curated text for a refusal. Never echoes an identifier the caller chose. */
1055
+ function rateLimitMessage(reason, scope) {
1056
+ if (reason === 'too_many_concurrent_requests' ||
1057
+ reason === 'too_many_concurrent_requests_for_database') {
1058
+ return 'Too many requests are already running. Wait for one to finish and retry.';
1059
+ }
1060
+ if (reason === 'introspection_snapshot_exceeds_budget') {
1061
+ return 'Introspection snapshot exceeds the configured response budget.';
1062
+ }
1063
+ if (scope === 'concurrency_global' || scope === 'concurrency_db') {
1064
+ return 'Too many requests are already running. Wait for one to finish and retry.';
1065
+ }
1066
+ return 'Request rate limit exceeded for this sender. Slow down and retry.';
1067
+ }
1068
+ /**
1069
+ * Serialized size of a response body. A value that cannot be measured counts as
1070
+ * infinite, so an unmeasurable payload is refused rather than forwarded.
1071
+ */
1072
+ function serializedSizeOf(value) {
1073
+ try {
1074
+ return Buffer.byteLength(JSON.stringify(value) ?? '', 'utf8');
1075
+ }
1076
+ catch {
1077
+ return Number.POSITIVE_INFINITY;
1078
+ }
1079
+ }
1080
+ /**
1081
+ * Decide whether an inbound `event` frame may be handled at all.
1082
+ *
1083
+ * This runs before any event handler. The `event` branch used to sit ahead of
1084
+ * the query/migration permission pipeline, so a `viewer` could resolve another
1085
+ * user's pending manual approval and could register an arbitrary migration
1086
+ * plan for later replay under `auto_upgrade` — the default level. Both kinds
1087
+ * now derive their required capability from the same `hasCapability` matrix
1088
+ * the query path uses, and any kind the agent does not accept inbound is
1089
+ * refused outright.
1090
+ *
1091
+ * `approval_response` requires both `query_write` and `ddl`: an approval can
1092
+ * authorise a write or a DDL statement, so the responder must be able to do
1093
+ * everything it can authorise.
1094
+ */
1095
+ export function evaluateEventGate(kind, role, permissionLevel, canRegisterPlan) {
1096
+ if (kind === 'plan_register') {
1097
+ if (!hasCapability(role, 'migration_run')) {
1098
+ return {
1099
+ allowed: false,
1100
+ errorCode: 'role_insufficient',
1101
+ reason: `Role '${role}' cannot register migration plans`,
1102
+ auditAction: 'plan_register',
1103
+ code: 'role_denied',
1104
+ };
1105
+ }
1106
+ if (permissionLevel === 'read_only') {
1107
+ return {
1108
+ allowed: false,
1109
+ errorCode: 'permission_denied',
1110
+ reason: 'Migration plans cannot be registered while the database is in read_only mode',
1111
+ auditAction: 'plan_register',
1112
+ code: 'read_only_mode',
1113
+ };
1114
+ }
1115
+ // The registry is the authority; a refusal there overrides anything this
1116
+ // function concluded, because a plan that cannot be stored must not be
1117
+ // reported as registered.
1118
+ const verdict = canRegisterPlan?.(role, permissionLevel);
1119
+ if (verdict && !verdict.allowed) {
1120
+ return {
1121
+ allowed: false,
1122
+ errorCode: 'permission_denied',
1123
+ reason: verdict.reason ?? 'Plan registration refused',
1124
+ auditAction: 'plan_register',
1125
+ code: verdict.code ?? 'plan_registration_refused',
1126
+ };
1127
+ }
1128
+ return {
1129
+ allowed: true,
1130
+ errorCode: 'invalid_message',
1131
+ reason: '',
1132
+ auditAction: null,
1133
+ code: 'allowed',
1134
+ };
1135
+ }
1136
+ if (kind === 'approval_response') {
1137
+ const mayApprove = hasCapability(role, 'query_write') && hasCapability(role, 'ddl');
1138
+ if (!mayApprove) {
1139
+ return {
1140
+ allowed: false,
1141
+ errorCode: 'role_insufficient',
1142
+ reason: `Role '${role}' cannot approve write or DDL statements`,
1143
+ auditAction: 'manual_approval',
1144
+ code: 'role_denied',
1145
+ };
1146
+ }
1147
+ return {
1148
+ allowed: true,
1149
+ errorCode: 'invalid_message',
1150
+ reason: '',
1151
+ auditAction: null,
1152
+ code: 'allowed',
1153
+ };
1154
+ }
1155
+ // Agent-to-browser kinds and anything unrecognised are refused. They are not
1156
+ // audit-worthy: no database action was requested.
1157
+ return {
1158
+ allowed: false,
1159
+ errorCode: 'invalid_message',
1160
+ reason: 'The agent does not accept inbound event kind',
1161
+ auditAction: null,
1162
+ code: 'unsupported_event_kind',
1163
+ };
1164
+ }
1165
+ /* ------------------------------------------------------------------ */
1166
+ /* Error sanitisation (H-05) */
1167
+ /* ------------------------------------------------------------------ */
1168
+ /** Curated `ErrorCode` for each `PoolError` variant. */
1169
+ const POOL_ERROR_CODES = {
1170
+ env_var_missing: 'env_var_missing',
1171
+ connection_failed: 'db_unavailable',
1172
+ auth_failed: 'db_auth_failed',
1173
+ db_not_found: 'db_unavailable',
1174
+ ssl_error: 'db_ssl_error',
1175
+ pool_exhausted: 'db_pool_exhausted',
1176
+ unsafe_session_setting: 'db_unavailable',
1177
+ };
1178
+ /** A SQLSTATE is five upper-case alphanumerics; anything else is not one. */
1179
+ function safePgCode(code) {
1180
+ return typeof code === 'string' && /^[0-9A-Z]{5}$/.test(code);
1181
+ }
1182
+ /** Severities PostgreSQL actually emits, plus a safe default. */
1183
+ const PG_SEVERITIES = new Set([
1184
+ 'ERROR',
1185
+ 'FATAL',
1186
+ 'PANIC',
1187
+ 'WARNING',
1188
+ 'NOTICE',
1189
+ 'DEBUG',
1190
+ 'INFO',
1191
+ ]);
1192
+ function safeSeverity(severity) {
1193
+ if (typeof severity !== 'string')
1194
+ return 'ERROR';
1195
+ const normalized = severity.toUpperCase();
1196
+ return PG_SEVERITIES.has(normalized) ? normalized : 'ERROR';
1197
+ }
1198
+ /** Audit `error_code` must be a code, never free text. */
1199
+ function safeAuditCode(code) {
1200
+ return typeof code === 'string' && /^[A-Za-z0-9_.]{1,32}$/.test(code) ? code : 'INTERNAL';
1201
+ }
1202
+ /** Audit `denial_reason` comes from a closed enum; refuse anything else. */
1203
+ function safeAuditReason(code) {
1204
+ return typeof code === 'string' && /^[a-z0-9_]{1,32}$/.test(code) ? code : 'denied';
1205
+ }
1206
+ function mapPoolErrorCode(code) {
1207
+ return POOL_ERROR_CODES[code] ?? 'db_unavailable';
1208
+ }
1209
+ /**
1210
+ * Curated, data-free text for a SQLSTATE. Delegates to `sanitizePgError` so
1211
+ * there is exactly one place where SQLSTATEs are described, and so the answer
1212
+ * can never be derived from raw PostgreSQL output.
1213
+ */
1214
+ function pgMessageForCode(code) {
1215
+ return sanitizePgError({ code }).message;
1216
+ }
1217
+ /**
1218
+ * Sanitisation options for one request. `topology` lets `scrubTopology` remove
1219
+ * the exact host / database / user this request was made against, in addition
1220
+ * to the generic host/user/path/URL rules.
1221
+ */
1222
+ function sanitizeOptions(dbEntry) {
1223
+ if (!dbEntry)
1224
+ return {};
1225
+ return {
1226
+ topology: {
1227
+ host: dbEntry.host,
1228
+ port: dbEntry.port,
1229
+ user: dbEntry.user,
1230
+ database: dbEntry.database,
1231
+ project: dbEntry.project_name,
1232
+ },
1233
+ };
1234
+ }
1235
+ /** The SQLSTATE of the statement that failed, when it is a real SQLSTATE. */
1236
+ function failedStatementCode(result) {
1237
+ const failed = result.statements.find((s) => s.status === 'failed');
1238
+ return failed?.pg_error_code !== undefined && safePgCode(failed.pg_error_code)
1239
+ ? failed.pg_error_code
1240
+ : undefined;
1241
+ }
1242
+ /**
1243
+ * Per-statement errors are verbatim PostgreSQL messages, and a migration
1244
+ * failure routinely includes row data (`Key (email)=(alice@corp.com) already
1245
+ * exists.`). Reduce every one of them before the result leaves the process.
1246
+ */
1247
+ function sanitizeMigrationResult(result, dbEntry) {
1248
+ const opts = sanitizeOptions(dbEntry);
1249
+ return {
1250
+ ...result,
1251
+ statements: result.statements.map((s) => {
1252
+ if (s.error === undefined)
1253
+ return s;
1254
+ return { ...s, error: sanitizeErrorText(s.error, opts) };
1255
+ }),
1256
+ };
1257
+ }
1258
+ //# sourceMappingURL=dispatcher.js.map