@neverinfamous/postgres-mcp 1.3.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (548) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +244 -129
  3. package/dist/__tests__/benchmarks/codemode.bench.d.ts +10 -0
  4. package/dist/__tests__/benchmarks/codemode.bench.d.ts.map +1 -0
  5. package/dist/__tests__/benchmarks/codemode.bench.js +159 -0
  6. package/dist/__tests__/benchmarks/codemode.bench.js.map +1 -0
  7. package/dist/__tests__/benchmarks/connection-pool.bench.d.ts +10 -0
  8. package/dist/__tests__/benchmarks/connection-pool.bench.d.ts.map +1 -0
  9. package/dist/__tests__/benchmarks/connection-pool.bench.js +123 -0
  10. package/dist/__tests__/benchmarks/connection-pool.bench.js.map +1 -0
  11. package/dist/__tests__/benchmarks/handler-dispatch.bench.d.ts +11 -0
  12. package/dist/__tests__/benchmarks/handler-dispatch.bench.d.ts.map +1 -0
  13. package/dist/__tests__/benchmarks/handler-dispatch.bench.js +199 -0
  14. package/dist/__tests__/benchmarks/handler-dispatch.bench.js.map +1 -0
  15. package/dist/__tests__/benchmarks/logger-sanitization.bench.d.ts +15 -0
  16. package/dist/__tests__/benchmarks/logger-sanitization.bench.d.ts.map +1 -0
  17. package/dist/__tests__/benchmarks/logger-sanitization.bench.js +155 -0
  18. package/dist/__tests__/benchmarks/logger-sanitization.bench.js.map +1 -0
  19. package/dist/__tests__/benchmarks/resource-prompts.bench.d.ts +10 -0
  20. package/dist/__tests__/benchmarks/resource-prompts.bench.d.ts.map +1 -0
  21. package/dist/__tests__/benchmarks/resource-prompts.bench.js +181 -0
  22. package/dist/__tests__/benchmarks/resource-prompts.bench.js.map +1 -0
  23. package/dist/__tests__/benchmarks/schema-parsing.bench.d.ts +11 -0
  24. package/dist/__tests__/benchmarks/schema-parsing.bench.d.ts.map +1 -0
  25. package/dist/__tests__/benchmarks/schema-parsing.bench.js +209 -0
  26. package/dist/__tests__/benchmarks/schema-parsing.bench.js.map +1 -0
  27. package/dist/__tests__/benchmarks/tool-filtering.bench.d.ts +9 -0
  28. package/dist/__tests__/benchmarks/tool-filtering.bench.d.ts.map +1 -0
  29. package/dist/__tests__/benchmarks/tool-filtering.bench.js +83 -0
  30. package/dist/__tests__/benchmarks/tool-filtering.bench.js.map +1 -0
  31. package/dist/__tests__/benchmarks/transport-auth.bench.d.ts +10 -0
  32. package/dist/__tests__/benchmarks/transport-auth.bench.d.ts.map +1 -0
  33. package/dist/__tests__/benchmarks/transport-auth.bench.js +128 -0
  34. package/dist/__tests__/benchmarks/transport-auth.bench.js.map +1 -0
  35. package/dist/__tests__/benchmarks/utilities.bench.d.ts +10 -0
  36. package/dist/__tests__/benchmarks/utilities.bench.d.ts.map +1 -0
  37. package/dist/__tests__/benchmarks/utilities.bench.js +164 -0
  38. package/dist/__tests__/benchmarks/utilities.bench.js.map +1 -0
  39. package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
  40. package/dist/__tests__/mocks/adapter.js +2 -1
  41. package/dist/__tests__/mocks/adapter.js.map +1 -1
  42. package/dist/adapters/DatabaseAdapter.d.ts +6 -1
  43. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
  44. package/dist/adapters/DatabaseAdapter.js +23 -7
  45. package/dist/adapters/DatabaseAdapter.js.map +1 -1
  46. package/dist/adapters/postgresql/PostgresAdapter.d.ts +5 -22
  47. package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -1
  48. package/dist/adapters/postgresql/PostgresAdapter.js +30 -519
  49. package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -1
  50. package/dist/adapters/postgresql/prompts/index.js +1 -1
  51. package/dist/adapters/postgresql/prompts/index.js.map +1 -1
  52. package/dist/adapters/postgresql/resources/index.d.ts +1 -1
  53. package/dist/adapters/postgresql/resources/index.js +3 -3
  54. package/dist/adapters/postgresql/resources/index.js.map +1 -1
  55. package/dist/adapters/postgresql/schema-operations.d.ts +71 -0
  56. package/dist/adapters/postgresql/schema-operations.d.ts.map +1 -0
  57. package/dist/adapters/postgresql/schema-operations.js +561 -0
  58. package/dist/adapters/postgresql/schema-operations.js.map +1 -0
  59. package/dist/adapters/postgresql/schemas/admin.d.ts +4 -4
  60. package/dist/adapters/postgresql/schemas/admin.js +4 -4
  61. package/dist/adapters/postgresql/schemas/admin.js.map +1 -1
  62. package/dist/adapters/postgresql/schemas/backup.d.ts +39 -25
  63. package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -1
  64. package/dist/adapters/postgresql/schemas/backup.js +54 -25
  65. package/dist/adapters/postgresql/schemas/backup.js.map +1 -1
  66. package/dist/adapters/postgresql/schemas/core/index.d.ts +6 -0
  67. package/dist/adapters/postgresql/schemas/core/index.d.ts.map +1 -0
  68. package/dist/adapters/postgresql/schemas/core/index.js +6 -0
  69. package/dist/adapters/postgresql/schemas/core/index.js.map +1 -0
  70. package/dist/adapters/postgresql/schemas/{core.d.ts → core/queries.d.ts} +12 -167
  71. package/dist/adapters/postgresql/schemas/core/queries.d.ts.map +1 -0
  72. package/dist/adapters/postgresql/schemas/{core.js → core/queries.js} +5 -213
  73. package/dist/adapters/postgresql/schemas/core/queries.js.map +1 -0
  74. package/dist/adapters/postgresql/schemas/core/transactions.d.ts +149 -0
  75. package/dist/adapters/postgresql/schemas/core/transactions.d.ts.map +1 -0
  76. package/dist/adapters/postgresql/schemas/core/transactions.js +239 -0
  77. package/dist/adapters/postgresql/schemas/core/transactions.js.map +1 -0
  78. package/dist/adapters/postgresql/schemas/cron.d.ts +12 -12
  79. package/dist/adapters/postgresql/schemas/cron.d.ts.map +1 -1
  80. package/dist/adapters/postgresql/schemas/cron.js +38 -10
  81. package/dist/adapters/postgresql/schemas/cron.js.map +1 -1
  82. package/dist/adapters/postgresql/schemas/extensions/citext.d.ts +222 -0
  83. package/dist/adapters/postgresql/schemas/extensions/citext.d.ts.map +1 -0
  84. package/dist/adapters/postgresql/schemas/extensions/citext.js +306 -0
  85. package/dist/adapters/postgresql/schemas/extensions/citext.js.map +1 -0
  86. package/dist/adapters/postgresql/schemas/extensions/index.d.ts +15 -0
  87. package/dist/adapters/postgresql/schemas/extensions/index.d.ts.map +1 -0
  88. package/dist/adapters/postgresql/schemas/extensions/index.js +20 -0
  89. package/dist/adapters/postgresql/schemas/extensions/index.js.map +1 -0
  90. package/dist/adapters/postgresql/schemas/extensions/kcache.d.ts +164 -0
  91. package/dist/adapters/postgresql/schemas/extensions/kcache.d.ts.map +1 -0
  92. package/dist/adapters/postgresql/schemas/extensions/kcache.js +225 -0
  93. package/dist/adapters/postgresql/schemas/extensions/kcache.js.map +1 -0
  94. package/dist/adapters/postgresql/schemas/extensions/ltree.d.ts +253 -0
  95. package/dist/adapters/postgresql/schemas/extensions/ltree.d.ts.map +1 -0
  96. package/dist/adapters/postgresql/schemas/extensions/ltree.js +430 -0
  97. package/dist/adapters/postgresql/schemas/extensions/ltree.js.map +1 -0
  98. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.d.ts +251 -0
  99. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.d.ts.map +1 -0
  100. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.js +294 -0
  101. package/dist/adapters/postgresql/schemas/extensions/pgcrypto.js.map +1 -0
  102. package/dist/adapters/postgresql/schemas/extensions/shared.d.ts +10 -0
  103. package/dist/adapters/postgresql/schemas/extensions/shared.d.ts.map +1 -0
  104. package/dist/adapters/postgresql/schemas/extensions/shared.js +15 -0
  105. package/dist/adapters/postgresql/schemas/extensions/shared.js.map +1 -0
  106. package/dist/adapters/postgresql/schemas/index.d.ts +8 -7
  107. package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -1
  108. package/dist/adapters/postgresql/schemas/index.js +16 -10
  109. package/dist/adapters/postgresql/schemas/index.js.map +1 -1
  110. package/dist/adapters/postgresql/schemas/introspection.d.ts +445 -0
  111. package/dist/adapters/postgresql/schemas/introspection.d.ts.map +1 -0
  112. package/dist/adapters/postgresql/schemas/introspection.js +481 -0
  113. package/dist/adapters/postgresql/schemas/introspection.js.map +1 -0
  114. package/dist/adapters/postgresql/schemas/jsonb/advanced.d.ts +270 -0
  115. package/dist/adapters/postgresql/schemas/jsonb/advanced.d.ts.map +1 -0
  116. package/dist/adapters/postgresql/schemas/jsonb/advanced.js +371 -0
  117. package/dist/adapters/postgresql/schemas/jsonb/advanced.js.map +1 -0
  118. package/dist/adapters/postgresql/schemas/jsonb/basic.d.ts +283 -0
  119. package/dist/adapters/postgresql/schemas/jsonb/basic.d.ts.map +1 -0
  120. package/dist/adapters/postgresql/schemas/jsonb/basic.js +456 -0
  121. package/dist/adapters/postgresql/schemas/jsonb/basic.js.map +1 -0
  122. package/dist/adapters/postgresql/schemas/jsonb/index.d.ts +6 -0
  123. package/dist/adapters/postgresql/schemas/jsonb/index.d.ts.map +1 -0
  124. package/dist/adapters/postgresql/schemas/jsonb/index.js +6 -0
  125. package/dist/adapters/postgresql/schemas/jsonb/index.js.map +1 -0
  126. package/dist/adapters/postgresql/schemas/monitoring.d.ts +45 -29
  127. package/dist/adapters/postgresql/schemas/monitoring.d.ts.map +1 -1
  128. package/dist/adapters/postgresql/schemas/monitoring.js +51 -18
  129. package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -1
  130. package/dist/adapters/postgresql/schemas/partitioning.d.ts +28 -32
  131. package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -1
  132. package/dist/adapters/postgresql/schemas/partitioning.js +82 -53
  133. package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -1
  134. package/dist/adapters/postgresql/schemas/partman.d.ts +78 -7
  135. package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -1
  136. package/dist/adapters/postgresql/schemas/partman.js +54 -41
  137. package/dist/adapters/postgresql/schemas/partman.js.map +1 -1
  138. package/dist/adapters/postgresql/schemas/performance.d.ts +37 -19
  139. package/dist/adapters/postgresql/schemas/performance.d.ts.map +1 -1
  140. package/dist/adapters/postgresql/schemas/performance.js +54 -12
  141. package/dist/adapters/postgresql/schemas/performance.js.map +1 -1
  142. package/dist/adapters/postgresql/schemas/postgis/advanced.d.ts +429 -0
  143. package/dist/adapters/postgresql/schemas/postgis/advanced.d.ts.map +1 -0
  144. package/dist/adapters/postgresql/schemas/{postgis.js → postgis/advanced.js} +4 -467
  145. package/dist/adapters/postgresql/schemas/postgis/advanced.js.map +1 -0
  146. package/dist/adapters/postgresql/schemas/{postgis.d.ts → postgis/basic.d.ts} +1 -423
  147. package/dist/adapters/postgresql/schemas/postgis/basic.d.ts.map +1 -0
  148. package/dist/adapters/postgresql/schemas/postgis/basic.js +493 -0
  149. package/dist/adapters/postgresql/schemas/postgis/basic.js.map +1 -0
  150. package/dist/adapters/postgresql/schemas/postgis/index.d.ts +6 -0
  151. package/dist/adapters/postgresql/schemas/postgis/index.d.ts.map +1 -0
  152. package/dist/adapters/postgresql/schemas/postgis/index.js +6 -0
  153. package/dist/adapters/postgresql/schemas/postgis/index.js.map +1 -0
  154. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +50 -32
  155. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -1
  156. package/dist/adapters/postgresql/schemas/schema-mgmt.js +93 -26
  157. package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -1
  158. package/dist/adapters/postgresql/schemas/stats/index.d.ts +6 -0
  159. package/dist/adapters/postgresql/schemas/stats/index.d.ts.map +1 -0
  160. package/dist/adapters/postgresql/schemas/stats/index.js +6 -0
  161. package/dist/adapters/postgresql/schemas/stats/index.js.map +1 -0
  162. package/dist/adapters/postgresql/schemas/stats/input.d.ts +260 -0
  163. package/dist/adapters/postgresql/schemas/stats/input.d.ts.map +1 -0
  164. package/dist/adapters/postgresql/schemas/{stats.js → stats/input.js} +2 -331
  165. package/dist/adapters/postgresql/schemas/stats/input.js.map +1 -0
  166. package/dist/adapters/postgresql/schemas/{stats.d.ts → stats/output.d.ts} +3 -246
  167. package/dist/adapters/postgresql/schemas/stats/output.d.ts.map +1 -0
  168. package/dist/adapters/postgresql/schemas/stats/output.js +334 -0
  169. package/dist/adapters/postgresql/schemas/stats/output.js.map +1 -0
  170. package/dist/adapters/postgresql/schemas/text-search.d.ts +44 -32
  171. package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -1
  172. package/dist/adapters/postgresql/schemas/text-search.js +53 -36
  173. package/dist/adapters/postgresql/schemas/text-search.js.map +1 -1
  174. package/dist/adapters/postgresql/schemas/vector.d.ts +10 -10
  175. package/dist/adapters/postgresql/schemas/vector.d.ts.map +1 -1
  176. package/dist/adapters/postgresql/schemas/vector.js +12 -16
  177. package/dist/adapters/postgresql/schemas/vector.js.map +1 -1
  178. package/dist/adapters/postgresql/tools/admin.d.ts.map +1 -1
  179. package/dist/adapters/postgresql/tools/admin.js +82 -67
  180. package/dist/adapters/postgresql/tools/admin.js.map +1 -1
  181. package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -1
  182. package/dist/adapters/postgresql/tools/backup/dump.js +119 -97
  183. package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -1
  184. package/dist/adapters/postgresql/tools/backup/planning.d.ts.map +1 -1
  185. package/dist/adapters/postgresql/tools/backup/planning.js +345 -287
  186. package/dist/adapters/postgresql/tools/backup/planning.js.map +1 -1
  187. package/dist/adapters/postgresql/tools/citext/analysis.d.ts +24 -0
  188. package/dist/adapters/postgresql/tools/citext/analysis.d.ts.map +1 -0
  189. package/dist/adapters/postgresql/tools/{citext.js → citext/analysis.js} +131 -281
  190. package/dist/adapters/postgresql/tools/citext/analysis.js.map +1 -0
  191. package/dist/adapters/postgresql/tools/citext/index.d.ts +15 -0
  192. package/dist/adapters/postgresql/tools/citext/index.d.ts.map +1 -0
  193. package/dist/adapters/postgresql/tools/citext/index.js +23 -0
  194. package/dist/adapters/postgresql/tools/citext/index.js.map +1 -0
  195. package/dist/adapters/postgresql/tools/citext/setup.d.ts +16 -0
  196. package/dist/adapters/postgresql/tools/citext/setup.d.ts.map +1 -0
  197. package/dist/adapters/postgresql/tools/citext/setup.js +193 -0
  198. package/dist/adapters/postgresql/tools/citext/setup.js.map +1 -0
  199. package/dist/adapters/postgresql/tools/codemode/index.d.ts.map +1 -1
  200. package/dist/adapters/postgresql/tools/codemode/index.js +3 -12
  201. package/dist/adapters/postgresql/tools/codemode/index.js.map +1 -1
  202. package/dist/adapters/postgresql/tools/core/convenience.d.ts +12 -22
  203. package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -1
  204. package/dist/adapters/postgresql/tools/core/convenience.js +116 -211
  205. package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -1
  206. package/dist/adapters/postgresql/tools/core/error-helpers.d.ts +1 -0
  207. package/dist/adapters/postgresql/tools/core/error-helpers.d.ts.map +1 -1
  208. package/dist/adapters/postgresql/tools/core/error-helpers.js +8 -1
  209. package/dist/adapters/postgresql/tools/core/error-helpers.js.map +1 -1
  210. package/dist/adapters/postgresql/tools/core/health.d.ts.map +1 -1
  211. package/dist/adapters/postgresql/tools/core/health.js +124 -114
  212. package/dist/adapters/postgresql/tools/core/health.js.map +1 -1
  213. package/dist/adapters/postgresql/tools/core/index.d.ts +2 -1
  214. package/dist/adapters/postgresql/tools/core/index.d.ts.map +1 -1
  215. package/dist/adapters/postgresql/tools/core/index.js +3 -2
  216. package/dist/adapters/postgresql/tools/core/index.js.map +1 -1
  217. package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -1
  218. package/dist/adapters/postgresql/tools/core/indexes.js +153 -128
  219. package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -1
  220. package/dist/adapters/postgresql/tools/core/objects.d.ts.map +1 -1
  221. package/dist/adapters/postgresql/tools/core/objects.js +186 -161
  222. package/dist/adapters/postgresql/tools/core/objects.js.map +1 -1
  223. package/dist/adapters/postgresql/tools/core/query.d.ts.map +1 -1
  224. package/dist/adapters/postgresql/tools/core/query.js +37 -25
  225. package/dist/adapters/postgresql/tools/core/query.js.map +1 -1
  226. package/dist/adapters/postgresql/tools/core/schemas.d.ts +6 -3
  227. package/dist/adapters/postgresql/tools/core/schemas.d.ts.map +1 -1
  228. package/dist/adapters/postgresql/tools/core/schemas.js +11 -2
  229. package/dist/adapters/postgresql/tools/core/schemas.js.map +1 -1
  230. package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -1
  231. package/dist/adapters/postgresql/tools/core/tables.js +156 -129
  232. package/dist/adapters/postgresql/tools/core/tables.js.map +1 -1
  233. package/dist/adapters/postgresql/tools/core/utility.d.ts +26 -0
  234. package/dist/adapters/postgresql/tools/core/utility.d.ts.map +1 -0
  235. package/dist/adapters/postgresql/tools/core/utility.js +174 -0
  236. package/dist/adapters/postgresql/tools/core/utility.js.map +1 -0
  237. package/dist/adapters/postgresql/tools/cron.js +149 -70
  238. package/dist/adapters/postgresql/tools/cron.js.map +1 -1
  239. package/dist/adapters/postgresql/tools/introspection/analysis.d.ts +12 -0
  240. package/dist/adapters/postgresql/tools/introspection/analysis.d.ts.map +1 -0
  241. package/dist/adapters/postgresql/tools/introspection/analysis.js +574 -0
  242. package/dist/adapters/postgresql/tools/introspection/analysis.js.map +1 -0
  243. package/dist/adapters/postgresql/tools/introspection/graph.d.ts +55 -0
  244. package/dist/adapters/postgresql/tools/introspection/graph.d.ts.map +1 -0
  245. package/dist/adapters/postgresql/tools/introspection/graph.js +638 -0
  246. package/dist/adapters/postgresql/tools/introspection/graph.js.map +1 -0
  247. package/dist/adapters/postgresql/tools/introspection/index.d.ts +19 -0
  248. package/dist/adapters/postgresql/tools/introspection/index.d.ts.map +1 -0
  249. package/dist/adapters/postgresql/tools/introspection/index.js +36 -0
  250. package/dist/adapters/postgresql/tools/introspection/index.js.map +1 -0
  251. package/dist/adapters/postgresql/tools/introspection/migration.d.ts +15 -0
  252. package/dist/adapters/postgresql/tools/introspection/migration.d.ts.map +1 -0
  253. package/dist/adapters/postgresql/tools/introspection/migration.js +599 -0
  254. package/dist/adapters/postgresql/tools/introspection/migration.js.map +1 -0
  255. package/dist/adapters/postgresql/tools/jsonb/analytics.d.ts +20 -0
  256. package/dist/adapters/postgresql/tools/jsonb/analytics.d.ts.map +1 -0
  257. package/dist/adapters/postgresql/tools/jsonb/analytics.js +367 -0
  258. package/dist/adapters/postgresql/tools/jsonb/analytics.js.map +1 -0
  259. package/dist/adapters/postgresql/tools/jsonb/index.d.ts +4 -2
  260. package/dist/adapters/postgresql/tools/jsonb/index.d.ts.map +1 -1
  261. package/dist/adapters/postgresql/tools/jsonb/index.js +8 -4
  262. package/dist/adapters/postgresql/tools/jsonb/index.js.map +1 -1
  263. package/dist/adapters/postgresql/tools/jsonb/read.d.ts +38 -0
  264. package/dist/adapters/postgresql/tools/jsonb/read.d.ts.map +1 -0
  265. package/dist/adapters/postgresql/tools/jsonb/read.js +543 -0
  266. package/dist/adapters/postgresql/tools/jsonb/read.js.map +1 -0
  267. package/dist/adapters/postgresql/tools/jsonb/{advanced.d.ts → transform.d.ts} +1 -13
  268. package/dist/adapters/postgresql/tools/jsonb/transform.d.ts.map +1 -0
  269. package/dist/adapters/postgresql/tools/jsonb/{advanced.js → transform.js} +39 -361
  270. package/dist/adapters/postgresql/tools/jsonb/transform.js.map +1 -0
  271. package/dist/adapters/postgresql/tools/jsonb/write.d.ts +14 -0
  272. package/dist/adapters/postgresql/tools/jsonb/write.d.ts.map +1 -0
  273. package/dist/adapters/postgresql/tools/jsonb/write.js +468 -0
  274. package/dist/adapters/postgresql/tools/jsonb/write.js.map +1 -0
  275. package/dist/adapters/postgresql/tools/kcache.d.ts.map +1 -1
  276. package/dist/adapters/postgresql/tools/kcache.js +116 -51
  277. package/dist/adapters/postgresql/tools/kcache.js.map +1 -1
  278. package/dist/adapters/postgresql/tools/ltree.d.ts.map +1 -1
  279. package/dist/adapters/postgresql/tools/ltree.js +358 -259
  280. package/dist/adapters/postgresql/tools/ltree.js.map +1 -1
  281. package/dist/adapters/postgresql/tools/monitoring/analysis.d.ts +15 -0
  282. package/dist/adapters/postgresql/tools/monitoring/analysis.d.ts.map +1 -0
  283. package/dist/adapters/postgresql/tools/{monitoring.js → monitoring/analysis.js} +37 -361
  284. package/dist/adapters/postgresql/tools/monitoring/analysis.js.map +1 -0
  285. package/dist/adapters/postgresql/tools/monitoring/basic.d.ts +17 -0
  286. package/dist/adapters/postgresql/tools/monitoring/basic.d.ts.map +1 -0
  287. package/dist/adapters/postgresql/tools/monitoring/basic.js +432 -0
  288. package/dist/adapters/postgresql/tools/monitoring/basic.js.map +1 -0
  289. package/dist/adapters/postgresql/tools/monitoring/index.d.ts +16 -0
  290. package/dist/adapters/postgresql/tools/monitoring/index.d.ts.map +1 -0
  291. package/dist/adapters/postgresql/tools/monitoring/index.js +31 -0
  292. package/dist/adapters/postgresql/tools/monitoring/index.js.map +1 -0
  293. package/dist/adapters/postgresql/tools/partitioning/index.d.ts +15 -0
  294. package/dist/adapters/postgresql/tools/partitioning/index.d.ts.map +1 -0
  295. package/dist/adapters/postgresql/tools/partitioning/index.js +23 -0
  296. package/dist/adapters/postgresql/tools/partitioning/index.js.map +1 -0
  297. package/dist/adapters/postgresql/tools/partitioning/info.d.ts +11 -0
  298. package/dist/adapters/postgresql/tools/partitioning/info.d.ts.map +1 -0
  299. package/dist/adapters/postgresql/tools/partitioning/info.js +302 -0
  300. package/dist/adapters/postgresql/tools/partitioning/info.js.map +1 -0
  301. package/dist/adapters/postgresql/tools/partitioning/management.d.ts +28 -0
  302. package/dist/adapters/postgresql/tools/partitioning/management.d.ts.map +1 -0
  303. package/dist/adapters/postgresql/tools/{partitioning.js → partitioning/management.js} +48 -307
  304. package/dist/adapters/postgresql/tools/partitioning/management.js.map +1 -0
  305. package/dist/adapters/postgresql/tools/partman/helpers.d.ts +29 -0
  306. package/dist/adapters/postgresql/tools/partman/helpers.d.ts.map +1 -0
  307. package/dist/adapters/postgresql/tools/partman/helpers.js +59 -0
  308. package/dist/adapters/postgresql/tools/partman/helpers.js.map +1 -0
  309. package/dist/adapters/postgresql/tools/partman/index.d.ts +2 -1
  310. package/dist/adapters/postgresql/tools/partman/index.d.ts.map +1 -1
  311. package/dist/adapters/postgresql/tools/partman/index.js +4 -2
  312. package/dist/adapters/postgresql/tools/partman/index.js.map +1 -1
  313. package/dist/adapters/postgresql/tools/partman/maintenance.d.ts +20 -0
  314. package/dist/adapters/postgresql/tools/partman/maintenance.d.ts.map +1 -0
  315. package/dist/adapters/postgresql/tools/partman/maintenance.js +496 -0
  316. package/dist/adapters/postgresql/tools/partman/maintenance.js.map +1 -0
  317. package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -1
  318. package/dist/adapters/postgresql/tools/partman/management.js +452 -417
  319. package/dist/adapters/postgresql/tools/partman/management.js.map +1 -1
  320. package/dist/adapters/postgresql/tools/partman/operations.d.ts +1 -13
  321. package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -1
  322. package/dist/adapters/postgresql/tools/partman/operations.js +173 -654
  323. package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -1
  324. package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -1
  325. package/dist/adapters/postgresql/tools/performance/analysis.js +79 -45
  326. package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -1
  327. package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -1
  328. package/dist/adapters/postgresql/tools/performance/monitoring.js +83 -55
  329. package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -1
  330. package/dist/adapters/postgresql/tools/performance/optimization.d.ts.map +1 -1
  331. package/dist/adapters/postgresql/tools/performance/optimization.js +18 -11
  332. package/dist/adapters/postgresql/tools/performance/optimization.js.map +1 -1
  333. package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -1
  334. package/dist/adapters/postgresql/tools/performance/stats.js +441 -286
  335. package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -1
  336. package/dist/adapters/postgresql/tools/pgcrypto.d.ts.map +1 -1
  337. package/dist/adapters/postgresql/tools/pgcrypto.js +67 -79
  338. package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -1
  339. package/dist/adapters/postgresql/tools/postgis/advanced.d.ts.map +1 -1
  340. package/dist/adapters/postgresql/tools/postgis/advanced.js +30 -25
  341. package/dist/adapters/postgresql/tools/postgis/advanced.js.map +1 -1
  342. package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -1
  343. package/dist/adapters/postgresql/tools/postgis/basic.js +137 -100
  344. package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -1
  345. package/dist/adapters/postgresql/tools/schema/index.d.ts +16 -0
  346. package/dist/adapters/postgresql/tools/schema/index.d.ts.map +1 -0
  347. package/dist/adapters/postgresql/tools/schema/index.js +32 -0
  348. package/dist/adapters/postgresql/tools/schema/index.js.map +1 -0
  349. package/dist/adapters/postgresql/tools/schema/objects.d.ts +15 -0
  350. package/dist/adapters/postgresql/tools/schema/objects.d.ts.map +1 -0
  351. package/dist/adapters/postgresql/tools/schema/objects.js +378 -0
  352. package/dist/adapters/postgresql/tools/schema/objects.js.map +1 -0
  353. package/dist/adapters/postgresql/tools/schema/views.d.ts +15 -0
  354. package/dist/adapters/postgresql/tools/schema/views.d.ts.map +1 -0
  355. package/dist/adapters/postgresql/tools/{schema.js → schema/views.js} +91 -339
  356. package/dist/adapters/postgresql/tools/schema/views.js.map +1 -0
  357. package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -1
  358. package/dist/adapters/postgresql/tools/stats/advanced.js +40 -235
  359. package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -1
  360. package/dist/adapters/postgresql/tools/stats/basic.d.ts.map +1 -1
  361. package/dist/adapters/postgresql/tools/stats/basic.js +45 -30
  362. package/dist/adapters/postgresql/tools/stats/basic.js.map +1 -1
  363. package/dist/adapters/postgresql/tools/stats/math-utils.d.ts +33 -0
  364. package/dist/adapters/postgresql/tools/stats/math-utils.d.ts.map +1 -0
  365. package/dist/adapters/postgresql/tools/stats/math-utils.js +225 -0
  366. package/dist/adapters/postgresql/tools/stats/math-utils.js.map +1 -0
  367. package/dist/adapters/postgresql/tools/text/index.d.ts +16 -0
  368. package/dist/adapters/postgresql/tools/text/index.d.ts.map +1 -0
  369. package/dist/adapters/postgresql/tools/text/index.js +33 -0
  370. package/dist/adapters/postgresql/tools/text/index.js.map +1 -0
  371. package/dist/adapters/postgresql/tools/text/matching.d.ts +17 -0
  372. package/dist/adapters/postgresql/tools/text/matching.d.ts.map +1 -0
  373. package/dist/adapters/postgresql/tools/text/matching.js +565 -0
  374. package/dist/adapters/postgresql/tools/text/matching.js.map +1 -0
  375. package/dist/adapters/postgresql/tools/text/search.d.ts +17 -0
  376. package/dist/adapters/postgresql/tools/text/search.d.ts.map +1 -0
  377. package/dist/adapters/postgresql/tools/text/search.js +653 -0
  378. package/dist/adapters/postgresql/tools/text/search.js.map +1 -0
  379. package/dist/adapters/postgresql/tools/transactions.d.ts.map +1 -1
  380. package/dist/adapters/postgresql/tools/transactions.js +11 -27
  381. package/dist/adapters/postgresql/tools/transactions.js.map +1 -1
  382. package/dist/adapters/postgresql/tools/vector/{basic.d.ts → data.d.ts} +10 -8
  383. package/dist/adapters/postgresql/tools/vector/data.d.ts.map +1 -0
  384. package/dist/adapters/postgresql/tools/vector/data.js +540 -0
  385. package/dist/adapters/postgresql/tools/vector/data.js.map +1 -0
  386. package/dist/adapters/postgresql/tools/vector/index.d.ts.map +1 -1
  387. package/dist/adapters/postgresql/tools/vector/index.js +6 -2
  388. package/dist/adapters/postgresql/tools/vector/index.js.map +1 -1
  389. package/dist/adapters/postgresql/tools/vector/management.d.ts +11 -0
  390. package/dist/adapters/postgresql/tools/vector/management.d.ts.map +1 -0
  391. package/dist/adapters/postgresql/tools/vector/management.js +425 -0
  392. package/dist/adapters/postgresql/tools/vector/management.js.map +1 -0
  393. package/dist/adapters/postgresql/tools/vector/query.d.ts +14 -0
  394. package/dist/adapters/postgresql/tools/vector/query.d.ts.map +1 -0
  395. package/dist/adapters/postgresql/tools/vector/query.js +767 -0
  396. package/dist/adapters/postgresql/tools/vector/query.js.map +1 -0
  397. package/dist/adapters/postgresql/tools/vector/{advanced.d.ts → search-advanced.d.ts} +4 -5
  398. package/dist/adapters/postgresql/tools/vector/search-advanced.d.ts.map +1 -0
  399. package/dist/adapters/postgresql/tools/vector/search-advanced.js +626 -0
  400. package/dist/adapters/postgresql/tools/vector/search-advanced.js.map +1 -0
  401. package/dist/auth/auth-context.d.ts +28 -0
  402. package/dist/auth/auth-context.d.ts.map +1 -0
  403. package/dist/auth/auth-context.js +37 -0
  404. package/dist/auth/auth-context.js.map +1 -0
  405. package/dist/auth/scope-map.d.ts +20 -0
  406. package/dist/auth/scope-map.d.ts.map +1 -0
  407. package/dist/auth/scope-map.js +40 -0
  408. package/dist/auth/scope-map.js.map +1 -0
  409. package/dist/auth/scopes.d.ts.map +1 -1
  410. package/dist/auth/scopes.js +2 -0
  411. package/dist/auth/scopes.js.map +1 -1
  412. package/dist/cli/args.d.ts +3 -2
  413. package/dist/cli/args.d.ts.map +1 -1
  414. package/dist/cli/args.js +4 -3
  415. package/dist/cli/args.js.map +1 -1
  416. package/dist/cli.js +11 -5
  417. package/dist/cli.js.map +1 -1
  418. package/dist/codemode/api/aliases.d.ts +14 -0
  419. package/dist/codemode/api/aliases.d.ts.map +1 -0
  420. package/dist/codemode/api/aliases.js +503 -0
  421. package/dist/codemode/api/aliases.js.map +1 -0
  422. package/dist/codemode/api/group-api.d.ts +23 -0
  423. package/dist/codemode/api/group-api.d.ts.map +1 -0
  424. package/dist/codemode/api/group-api.js +179 -0
  425. package/dist/codemode/api/group-api.js.map +1 -0
  426. package/dist/codemode/{api.d.ts → api/index.d.ts} +5 -4
  427. package/dist/codemode/api/index.d.ts.map +1 -0
  428. package/dist/codemode/api/index.js +192 -0
  429. package/dist/codemode/api/index.js.map +1 -0
  430. package/dist/codemode/api/maps.d.ts +47 -0
  431. package/dist/codemode/api/maps.d.ts.map +1 -0
  432. package/dist/codemode/api/maps.js +523 -0
  433. package/dist/codemode/api/maps.js.map +1 -0
  434. package/dist/codemode/api/normalize.d.ts +13 -0
  435. package/dist/codemode/api/normalize.d.ts.map +1 -0
  436. package/dist/codemode/api/normalize.js +120 -0
  437. package/dist/codemode/api/normalize.js.map +1 -0
  438. package/dist/codemode/index.d.ts +1 -3
  439. package/dist/codemode/index.d.ts.map +1 -1
  440. package/dist/codemode/index.js +1 -5
  441. package/dist/codemode/index.js.map +1 -1
  442. package/dist/codemode/sandbox.d.ts +14 -1
  443. package/dist/codemode/sandbox.d.ts.map +1 -1
  444. package/dist/codemode/sandbox.js +66 -44
  445. package/dist/codemode/sandbox.js.map +1 -1
  446. package/dist/codemode/types.d.ts.map +1 -1
  447. package/dist/codemode/types.js +3 -0
  448. package/dist/codemode/types.js.map +1 -1
  449. package/dist/constants/ServerInstructions.d.ts +5 -1
  450. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  451. package/dist/constants/ServerInstructions.js +91 -43
  452. package/dist/constants/ServerInstructions.js.map +1 -1
  453. package/dist/filtering/ToolConstants.d.ts +22 -19
  454. package/dist/filtering/ToolConstants.d.ts.map +1 -1
  455. package/dist/filtering/ToolConstants.js +48 -37
  456. package/dist/filtering/ToolConstants.js.map +1 -1
  457. package/dist/filtering/ToolFilter.d.ts.map +1 -1
  458. package/dist/filtering/ToolFilter.js +10 -13
  459. package/dist/filtering/ToolFilter.js.map +1 -1
  460. package/dist/pool/ConnectionPool.js +1 -1
  461. package/dist/pool/ConnectionPool.js.map +1 -1
  462. package/dist/server/McpServer.d.ts +1 -1
  463. package/dist/server/McpServer.d.ts.map +1 -1
  464. package/dist/server/McpServer.js +1 -2
  465. package/dist/server/McpServer.js.map +1 -1
  466. package/dist/transports/http.d.ts +44 -10
  467. package/dist/transports/http.d.ts.map +1 -1
  468. package/dist/transports/http.js +327 -40
  469. package/dist/transports/http.js.map +1 -1
  470. package/dist/types/filtering.d.ts +2 -2
  471. package/dist/types/filtering.d.ts.map +1 -1
  472. package/dist/utils/icons.d.ts.map +1 -1
  473. package/dist/utils/icons.js +5 -0
  474. package/dist/utils/icons.js.map +1 -1
  475. package/dist/utils/logger.d.ts +6 -6
  476. package/dist/utils/logger.d.ts.map +1 -1
  477. package/dist/utils/logger.js +18 -15
  478. package/dist/utils/logger.js.map +1 -1
  479. package/dist/utils/progress-utils.d.ts +2 -2
  480. package/dist/utils/progress-utils.d.ts.map +1 -1
  481. package/dist/utils/progress-utils.js +2 -3
  482. package/dist/utils/progress-utils.js.map +1 -1
  483. package/dist/utils/version.d.ts +9 -0
  484. package/dist/utils/version.d.ts.map +1 -0
  485. package/dist/utils/version.js +12 -0
  486. package/dist/utils/version.js.map +1 -0
  487. package/dist/utils/where-clause.d.ts +4 -0
  488. package/dist/utils/where-clause.d.ts.map +1 -1
  489. package/dist/utils/where-clause.js +40 -0
  490. package/dist/utils/where-clause.js.map +1 -1
  491. package/package.json +19 -14
  492. package/dist/adapters/postgresql/schemas/core.d.ts.map +0 -1
  493. package/dist/adapters/postgresql/schemas/core.js.map +0 -1
  494. package/dist/adapters/postgresql/schemas/extensions.d.ts +0 -833
  495. package/dist/adapters/postgresql/schemas/extensions.d.ts.map +0 -1
  496. package/dist/adapters/postgresql/schemas/extensions.js +0 -1170
  497. package/dist/adapters/postgresql/schemas/extensions.js.map +0 -1
  498. package/dist/adapters/postgresql/schemas/jsonb.d.ts +0 -533
  499. package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +0 -1
  500. package/dist/adapters/postgresql/schemas/jsonb.js +0 -790
  501. package/dist/adapters/postgresql/schemas/jsonb.js.map +0 -1
  502. package/dist/adapters/postgresql/schemas/postgis.d.ts.map +0 -1
  503. package/dist/adapters/postgresql/schemas/postgis.js.map +0 -1
  504. package/dist/adapters/postgresql/schemas/stats.d.ts.map +0 -1
  505. package/dist/adapters/postgresql/schemas/stats.js.map +0 -1
  506. package/dist/adapters/postgresql/tools/citext.d.ts +0 -18
  507. package/dist/adapters/postgresql/tools/citext.d.ts.map +0 -1
  508. package/dist/adapters/postgresql/tools/citext.js.map +0 -1
  509. package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +0 -1
  510. package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +0 -1
  511. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts +0 -20
  512. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +0 -1
  513. package/dist/adapters/postgresql/tools/jsonb/basic.js +0 -915
  514. package/dist/adapters/postgresql/tools/jsonb/basic.js.map +0 -1
  515. package/dist/adapters/postgresql/tools/monitoring.d.ts +0 -13
  516. package/dist/adapters/postgresql/tools/monitoring.d.ts.map +0 -1
  517. package/dist/adapters/postgresql/tools/monitoring.js.map +0 -1
  518. package/dist/adapters/postgresql/tools/partitioning.d.ts +0 -13
  519. package/dist/adapters/postgresql/tools/partitioning.d.ts.map +0 -1
  520. package/dist/adapters/postgresql/tools/partitioning.js.map +0 -1
  521. package/dist/adapters/postgresql/tools/schema.d.ts +0 -13
  522. package/dist/adapters/postgresql/tools/schema.d.ts.map +0 -1
  523. package/dist/adapters/postgresql/tools/schema.js.map +0 -1
  524. package/dist/adapters/postgresql/tools/text.d.ts +0 -13
  525. package/dist/adapters/postgresql/tools/text.d.ts.map +0 -1
  526. package/dist/adapters/postgresql/tools/text.js +0 -903
  527. package/dist/adapters/postgresql/tools/text.js.map +0 -1
  528. package/dist/adapters/postgresql/tools/vector/advanced.d.ts.map +0 -1
  529. package/dist/adapters/postgresql/tools/vector/advanced.js +0 -958
  530. package/dist/adapters/postgresql/tools/vector/advanced.js.map +0 -1
  531. package/dist/adapters/postgresql/tools/vector/basic.d.ts.map +0 -1
  532. package/dist/adapters/postgresql/tools/vector/basic.js +0 -1165
  533. package/dist/adapters/postgresql/tools/vector/basic.js.map +0 -1
  534. package/dist/codemode/api.d.ts.map +0 -1
  535. package/dist/codemode/api.js +0 -1510
  536. package/dist/codemode/api.js.map +0 -1
  537. package/dist/codemode/sandbox-factory.d.ts +0 -72
  538. package/dist/codemode/sandbox-factory.d.ts.map +0 -1
  539. package/dist/codemode/sandbox-factory.js +0 -88
  540. package/dist/codemode/sandbox-factory.js.map +0 -1
  541. package/dist/codemode/worker-sandbox.d.ts +0 -82
  542. package/dist/codemode/worker-sandbox.d.ts.map +0 -1
  543. package/dist/codemode/worker-sandbox.js +0 -244
  544. package/dist/codemode/worker-sandbox.js.map +0 -1
  545. package/dist/codemode/worker-script.d.ts +0 -8
  546. package/dist/codemode/worker-script.d.ts.map +0 -1
  547. package/dist/codemode/worker-script.js +0 -113
  548. package/dist/codemode/worker-script.js.map +0 -1
@@ -6,7 +6,8 @@
6
6
  import { z } from "zod";
7
7
  import { readOnly, write } from "../../../../utils/annotations.js";
8
8
  import { getToolIcons } from "../../../../utils/icons.js";
9
- import { PartmanCreateParentSchema, PartmanRunMaintenanceSchema, PartmanShowPartitionsSchema,
9
+ import { formatPostgresError } from "../core/error-helpers.js";
10
+ import { PartmanCreateParentSchema, PartmanCreateParentSchemaBase, PartmanRunMaintenanceSchema, PartmanRunMaintenanceSchemaBase, PartmanShowPartitionsSchema, PartmanShowPartitionsSchemaBase, PartmanShowConfigSchema, PartmanShowConfigSchemaBase, DEPRECATED_INTERVALS,
10
11
  // Output schemas
11
12
  PartmanCreateExtensionOutputSchema, PartmanCreateParentOutputSchema, PartmanRunMaintenanceOutputSchema, PartmanShowPartitionsOutputSchema, PartmanShowConfigOutputSchema, } from "../../schemas/index.js";
12
13
  /**
@@ -15,8 +16,8 @@ PartmanCreateExtensionOutputSchema, PartmanCreateParentOutputSchema, PartmanRunM
15
16
  */
16
17
  async function getPartmanSchema(adapter) {
17
18
  const result = await adapter.executeQuery(`
18
- SELECT table_schema FROM information_schema.tables
19
- WHERE table_name = 'part_config'
19
+ SELECT table_schema FROM information_schema.tables
20
+ WHERE table_name = 'part_config'
20
21
  AND table_schema IN ('partman', 'public')
21
22
  LIMIT 1
22
23
  `);
@@ -35,8 +36,18 @@ export function createPartmanExtensionTool(adapter) {
35
36
  annotations: write("Create Partman Extension"),
36
37
  icons: getToolIcons("partman", write("Create Partman Extension")),
37
38
  handler: async (_params, _context) => {
38
- await adapter.executeQuery("CREATE EXTENSION IF NOT EXISTS pg_partman");
39
- return { success: true, message: "pg_partman extension enabled" };
39
+ try {
40
+ await adapter.executeQuery("CREATE EXTENSION IF NOT EXISTS pg_partman");
41
+ return { success: true, message: "pg_partman extension enabled" };
42
+ }
43
+ catch (error) {
44
+ return {
45
+ success: false,
46
+ error: formatPostgresError(error, {
47
+ tool: "pg_partman_create_extension",
48
+ }),
49
+ };
50
+ }
40
51
  },
41
52
  };
42
53
  }
@@ -46,175 +57,204 @@ export function createPartmanExtensionTool(adapter) {
46
57
  export function createPartmanCreateParentTool(adapter) {
47
58
  return {
48
59
  name: "pg_partman_create_parent",
49
- description: `Create a new partition set using pg_partman's create_parent() function.
60
+ description: `Create a new partition set using pg_partman's create_parent() function.
50
61
  Supports time-based and integer-based partitioning with automatic child partition creation.
51
62
  The parent table must already exist before calling this function.
52
63
 
53
64
  Partition type (time vs integer) is automatically detected from the control column's data type.
54
65
  For non-timestamp/integer columns (text, uuid), use raw pg_partman SQL with timeEncoder/timeDecoder parameters.
55
66
 
56
- IMPORTANT: For empty tables with no data, you MUST provide startPartition (e.g., 'now' for current date, or a specific date like '2024-01-01').
67
+ IMPORTANT: For empty tables with no data, you MUST provide startPartition (e.g., 'now' for current date, or a specific date like '2024-01-01').
57
68
  Without startPartition and data, pg_partman cannot determine where to start creating partitions.
58
69
 
59
70
  TIP: startPartition accepts 'now' as a shorthand for the current date/time.
60
71
 
61
- WARNING: startPartition creates ALL partitions from that date to current date + premake.
72
+ WARNING: startPartition creates ALL partitions from that date to current date + premake.
62
73
  A startPartition far in the past (e.g., '2024-01-01' with daily intervals) creates many partitions.`,
63
74
  group: "partman",
64
- inputSchema: PartmanCreateParentSchema,
75
+ inputSchema: PartmanCreateParentSchemaBase,
65
76
  outputSchema: PartmanCreateParentOutputSchema,
66
77
  annotations: write("Create Partition Parent"),
67
78
  icons: getToolIcons("partman", write("Create Partition Parent")),
68
79
  handler: async (params, _context) => {
69
- const { parentTable, controlColumn, interval, premake, startPartition, templateTable, epochType, defaultPartition, } = PartmanCreateParentSchema.parse(params);
70
- // Validate required parameters with clear error messages
71
- if (!parentTable || !controlColumn || !interval) {
72
- const missing = [];
73
- if (!parentTable)
74
- missing.push("parentTable");
75
- if (!controlColumn)
76
- missing.push("controlColumn (or control)");
77
- if (!interval)
78
- missing.push("interval");
79
- return {
80
- success: false,
81
- error: `Missing required parameters: ${missing.join(", ")}.`,
82
- hint: 'Example: pg_partman_create_parent({ parentTable: "public.events", controlColumn: "created_at", interval: "1 month" })',
83
- aliases: { control: "controlColumn" },
84
- };
85
- }
86
- // At this point, all required params are guaranteed to be defined
87
- const validatedParentTable = parentTable;
88
- const validatedControlColumn = controlColumn;
89
- const validatedInterval = interval;
90
- // Note: pg_partman defaults to 'range' type, which is correct for most uses
91
- const args = [
92
- `p_parent_table := '${validatedParentTable}'`,
93
- `p_control := '${validatedControlColumn}'`,
94
- `p_interval := '${validatedInterval}'`,
95
- ];
96
- if (premake !== undefined) {
97
- args.push(`p_premake := ${String(premake)}`);
98
- }
99
- if (startPartition !== undefined) {
100
- args.push(`p_start_partition := '${startPartition}'`);
101
- }
102
- if (templateTable !== undefined) {
103
- args.push(`p_template_table := '${templateTable}'`);
104
- }
105
- if (epochType !== undefined) {
106
- args.push(`p_epoch := '${epochType}'`);
107
- }
108
- if (defaultPartition !== undefined) {
109
- args.push(`p_default_table := ${String(defaultPartition)}`);
110
- }
111
- const partmanSchema = await getPartmanSchema(adapter);
112
- const sql = `SELECT ${partmanSchema}.create_parent(${args.join(", ")})`;
113
80
  try {
114
- await adapter.executeQuery(sql);
115
- }
116
- catch (e) {
117
- const errorMsg = e instanceof Error ? e.message : String(e);
118
- // Wrap common PostgreSQL/pg_partman errors with clearer messages
119
- if (errorMsg.includes("duplicate key") ||
120
- errorMsg.includes("already exists in part_config")) {
81
+ const { parentTable, controlColumn, interval, premake, startPartition, templateTable, epochType, defaultPartition, } = PartmanCreateParentSchema.parse(params);
82
+ // Validate required parameters with clear error messages
83
+ if (!parentTable || !controlColumn || !interval) {
84
+ const missing = [];
85
+ if (!parentTable)
86
+ missing.push("parentTable");
87
+ if (!controlColumn)
88
+ missing.push("controlColumn (or control)");
89
+ if (!interval)
90
+ missing.push("interval");
121
91
  return {
122
92
  success: false,
123
- error: `Table '${validatedParentTable}' is already managed by pg_partman.`,
124
- hint: "Use pg_partman_show_config to view existing configuration. " +
125
- "To recreate: use pg_partman_undo_partition first, or if the table was dropped, clean up with: " +
126
- `DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '${validatedParentTable}';`,
93
+ error: `Missing required parameters: ${missing.join(", ")}.`,
94
+ hint: 'Example: pg_partman_create_parent({ parentTable: "public.events", controlColumn: "created_at", interval: "1 month" })',
95
+ aliases: { control: "controlColumn" },
127
96
  };
128
97
  }
129
- if (errorMsg.includes("does not exist") &&
130
- errorMsg.includes("relation")) {
98
+ // Check for deprecated interval keywords and return structured error
99
+ const deprecatedReplacement = DEPRECATED_INTERVALS[interval.toLowerCase()];
100
+ if (deprecatedReplacement) {
131
101
  return {
132
102
  success: false,
133
- error: `Table '${validatedParentTable}' does not exist.`,
134
- hint: "Create the parent table first with appropriate columns, then call pg_partman_create_parent.",
103
+ error: `Deprecated interval '${interval}'. Use PostgreSQL interval syntax instead: '${deprecatedReplacement}'.`,
104
+ hint: "Valid examples: '1 day', '1 week', '1 month', '3 months', '1 year'. Do NOT use keywords like 'daily' or 'monthly'.",
135
105
  };
136
106
  }
137
- if (errorMsg.includes("Unable to find given parent table")) {
138
- return {
139
- success: false,
140
- error: `Table '${validatedParentTable}' does not exist.`,
141
- hint: "Create the parent table first with PARTITION BY clause, then call pg_partman_create_parent.",
142
- };
107
+ // At this point, all required params are guaranteed to be defined
108
+ const validatedParentTable = parentTable;
109
+ const validatedControlColumn = controlColumn;
110
+ const validatedInterval = interval;
111
+ // Note: pg_partman defaults to 'range' type, which is correct for most uses
112
+ const args = [
113
+ `p_parent_table := '${validatedParentTable}'`,
114
+ `p_control := '${validatedControlColumn}'`,
115
+ `p_interval := '${validatedInterval}'`,
116
+ ];
117
+ // premake is passed directly to pg_partman create_parent
118
+ // Guard against NaN from z.coerce.number("abc")
119
+ if (premake !== undefined && !isNaN(premake)) {
120
+ args.push(`p_premake := ${String(premake)}`);
143
121
  }
144
- // Check 'is not partitioned' BEFORE 'NOT NULL' - if table isn't partitioned, that's the primary issue
145
- if (errorMsg.includes("is not partitioned")) {
146
- return {
147
- success: false,
148
- error: `Table '${validatedParentTable}' is not a partitioned table.`,
149
- hint: "Create the table with PARTITION BY clause. Example: CREATE TABLE events (ts TIMESTAMPTZ NOT NULL, ...) PARTITION BY RANGE (ts);",
150
- };
122
+ if (startPartition !== undefined) {
123
+ // pg_partman 5.x doesn't interpret 'now' as a timestamp literal.
124
+ // Resolve 'now' to NOW()::text so pg_partman receives an actual timestamp string.
125
+ if (startPartition.toLowerCase() === "now") {
126
+ args.push(`p_start_partition := NOW()::text`);
127
+ }
128
+ else {
129
+ args.push(`p_start_partition := '${startPartition}'`);
130
+ }
151
131
  }
152
- if (errorMsg.includes("cannot be null") ||
153
- errorMsg.includes("NOT NULL")) {
154
- return {
155
- success: false,
156
- error: `Control column '${validatedControlColumn}' must have a NOT NULL constraint.`,
157
- hint: "Add NOT NULL constraint to the control column. Example: ALTER TABLE events ALTER COLUMN ts SET NOT NULL;",
158
- };
132
+ if (templateTable !== undefined) {
133
+ args.push(`p_template_table := '${templateTable}'`);
159
134
  }
160
- // Catch pg_partman's partition type requirement error
161
- if (errorMsg.includes("ranged or list partitioned") ||
162
- errorMsg.includes("must have created the given parent table")) {
163
- return {
164
- success: false,
165
- error: `Table '${validatedParentTable}' must be created as RANGE or LIST partitioned before calling createParent.`,
166
- hint: "Create the table with PARTITION BY RANGE or PARTITION BY LIST clause first. " +
167
- "Example: CREATE TABLE events (ts TIMESTAMPTZ NOT NULL, ...) PARTITION BY RANGE (ts);",
168
- };
135
+ if (epochType !== undefined) {
136
+ args.push(`p_epoch := '${epochType}'`);
169
137
  }
170
- // Catch invalid interval format error with user-friendly message
171
- if (errorMsg.includes("invalid input syntax for type interval")) {
172
- return {
173
- success: false,
174
- error: `Invalid interval format: '${validatedInterval}'.`,
175
- hint: "Use PostgreSQL interval syntax. Valid examples: '1 day', '1 week', '1 month', '3 months', '1 year'. " +
176
- "Do NOT use keywords like 'daily' or 'monthly'.",
177
- examples: [
178
- "1 day",
179
- "1 week",
180
- "2 weeks",
181
- "1 month",
182
- "3 months",
183
- "1 year",
184
- ],
185
- };
138
+ if (defaultPartition !== undefined) {
139
+ args.push(`p_default_table := ${String(defaultPartition)}`);
186
140
  }
187
- throw e; // Re-throw other errors
188
- }
189
- // pg_partman's create_parent only registers the partition set - it doesn't always create child partitions
190
- // We call run_maintenance to attempt to create initial partitions, but this may fail in some cases
191
- // (e.g., when no startPartition is specified and the control column has no existing data to determine ranges)
192
- let maintenanceRan = false;
193
- try {
194
- const maintenanceSql = `SELECT ${partmanSchema}.run_maintenance(p_parent_table := '${validatedParentTable}')`;
195
- await adapter.executeQuery(maintenanceSql);
196
- maintenanceRan = true;
141
+ const partmanSchema = await getPartmanSchema(adapter);
142
+ const sql = `SELECT ${partmanSchema}.create_parent(${args.join(", ")})`;
143
+ try {
144
+ await adapter.executeQuery(sql);
145
+ }
146
+ catch (e) {
147
+ const errorMsg = e instanceof Error ? e.message : String(e);
148
+ // Wrap common PostgreSQL/pg_partman errors with clearer messages
149
+ if (errorMsg.includes("duplicate key") ||
150
+ errorMsg.includes("already exists in part_config")) {
151
+ return {
152
+ success: false,
153
+ error: `Table '${validatedParentTable}' is already managed by pg_partman.`,
154
+ hint: "Use pg_partman_show_config to view existing configuration. " +
155
+ "To recreate: use pg_partman_undo_partition first, or if the table was dropped, clean up with: " +
156
+ `DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '${validatedParentTable}';`,
157
+ };
158
+ }
159
+ if (errorMsg.includes("does not exist") &&
160
+ errorMsg.includes("relation")) {
161
+ return {
162
+ success: false,
163
+ error: `Table '${validatedParentTable}' does not exist.`,
164
+ hint: "Create the parent table first with appropriate columns, then call pg_partman_create_parent.",
165
+ };
166
+ }
167
+ if (errorMsg.includes("Unable to find given parent table")) {
168
+ return {
169
+ success: false,
170
+ error: `Table '${validatedParentTable}' does not exist.`,
171
+ hint: "Create the parent table first with PARTITION BY clause, then call pg_partman_create_parent.",
172
+ };
173
+ }
174
+ // Check 'is not partitioned' BEFORE 'NOT NULL' - if table isn't partitioned, that's the primary issue
175
+ if (errorMsg.includes("is not partitioned")) {
176
+ return {
177
+ success: false,
178
+ error: `Table '${validatedParentTable}' is not a partitioned table.`,
179
+ hint: "Create the table with PARTITION BY clause. Example: CREATE TABLE events (ts TIMESTAMPTZ NOT NULL, ...) PARTITION BY RANGE (ts);",
180
+ };
181
+ }
182
+ if (errorMsg.includes("cannot be null") ||
183
+ errorMsg.includes("NOT NULL")) {
184
+ return {
185
+ success: false,
186
+ error: `Control column '${validatedControlColumn}' must have a NOT NULL constraint.`,
187
+ hint: "Add NOT NULL constraint to the control column. Example: ALTER TABLE events ALTER COLUMN ts SET NOT NULL;",
188
+ };
189
+ }
190
+ // Catch pg_partman's partition type requirement error
191
+ if (errorMsg.includes("ranged or list partitioned") ||
192
+ errorMsg.includes("must have created the given parent table")) {
193
+ return {
194
+ success: false,
195
+ error: `Table '${validatedParentTable}' must be created as RANGE or LIST partitioned before calling createParent.`,
196
+ hint: "Create the table with PARTITION BY RANGE or PARTITION BY LIST clause first. " +
197
+ "Example: CREATE TABLE events (ts TIMESTAMPTZ NOT NULL, ...) PARTITION BY RANGE (ts);",
198
+ };
199
+ }
200
+ // Catch invalid interval format error with user-friendly message
201
+ if (errorMsg.includes("invalid input syntax for type interval")) {
202
+ return {
203
+ success: false,
204
+ error: `Invalid interval format: '${validatedInterval}'.`,
205
+ hint: "Use PostgreSQL interval syntax. Valid examples: '1 day', '1 week', '1 month', '3 months', '1 year'. " +
206
+ "Do NOT use keywords like 'daily' or 'monthly'.",
207
+ examples: [
208
+ "1 day",
209
+ "1 week",
210
+ "2 weeks",
211
+ "1 month",
212
+ "3 months",
213
+ "1 year",
214
+ ],
215
+ };
216
+ }
217
+ // Re-throw other errors — outer catch will format them
218
+ throw e;
219
+ }
220
+ // pg_partman's create_parent only registers the partition set - it doesn't always create child partitions
221
+ // We call run_maintenance to attempt to create initial partitions, but this may fail in some cases
222
+ // (e.g., when no startPartition is specified and the control column has no existing data to determine ranges)
223
+ let maintenanceRan = false;
224
+ try {
225
+ const maintenanceSql = `SELECT ${partmanSchema}.run_maintenance(p_parent_table := '${validatedParentTable}')`;
226
+ await adapter.executeQuery(maintenanceSql);
227
+ maintenanceRan = true;
228
+ }
229
+ catch {
230
+ // Maintenance may fail for new partition sets without data - this is expected
231
+ }
232
+ return {
233
+ success: true,
234
+ parentTable: validatedParentTable,
235
+ controlColumn: validatedControlColumn,
236
+ interval: validatedInterval,
237
+ premake: premake !== undefined && !isNaN(premake) ? premake : 4,
238
+ maintenanceRan,
239
+ // Suppress raw maintenanceError - the message/hint explains the situation clearly
240
+ message: maintenanceRan
241
+ ? `Partition set created for ${validatedParentTable} on column ${validatedControlColumn}. Initial partitions created.`
242
+ : `Partition set registered for ${validatedParentTable} on column ${validatedControlColumn}. ` +
243
+ `No child partitions created yet - pg_partman needs data or a startPartition that matches the control column type.`,
244
+ hint: !maintenanceRan
245
+ ? 'For DATE columns, use a date like "2024-01-01". For TIMESTAMP columns, "now" works. ' +
246
+ "Otherwise, insert data first and run pg_partman_run_maintenance."
247
+ : undefined,
248
+ };
197
249
  }
198
- catch {
199
- // Maintenance may fail for new partition sets without data - this is expected
250
+ catch (error) {
251
+ return {
252
+ success: false,
253
+ error: formatPostgresError(error, {
254
+ tool: "pg_partman_create_parent",
255
+ }),
256
+ };
200
257
  }
201
- return {
202
- success: true,
203
- parentTable: validatedParentTable,
204
- controlColumn: validatedControlColumn,
205
- interval: validatedInterval,
206
- premake: premake ?? 4,
207
- maintenanceRan,
208
- // Suppress raw maintenanceError - the message/hint explains the situation clearly
209
- message: maintenanceRan
210
- ? `Partition set created for ${validatedParentTable} on column ${validatedControlColumn}. Initial partitions created.`
211
- : `Partition set registered for ${validatedParentTable} on column ${validatedControlColumn}. ` +
212
- `No child partitions created yet - pg_partman needs data or a startPartition that matches the control column type.`,
213
- hint: !maintenanceRan
214
- ? 'For DATE columns, use a date like "2024-01-01". For TIMESTAMP columns, "now" works. ' +
215
- "Otherwise, insert data first and run pg_partman_run_maintenance."
216
- : undefined,
217
- };
218
258
  },
219
259
  };
220
260
  }
@@ -228,139 +268,149 @@ export function createPartmanRunMaintenanceTool(adapter) {
228
268
  Should be executed regularly (e.g., via pg_cron) to keep partitions current.
229
269
  Maintains all partition sets if no specific parent table is specified.`,
230
270
  group: "partman",
231
- inputSchema: PartmanRunMaintenanceSchema,
271
+ inputSchema: PartmanRunMaintenanceSchemaBase,
232
272
  outputSchema: PartmanRunMaintenanceOutputSchema,
233
273
  annotations: write("Run Partition Maintenance"),
234
274
  icons: getToolIcons("partman", write("Run Partition Maintenance")),
235
275
  handler: async (params, _context) => {
236
- const { parentTable, analyze } = PartmanRunMaintenanceSchema.parse(params);
237
- const partmanSchema = await getPartmanSchema(adapter);
238
- // If specific table provided, validate and run maintenance directly
239
- if (parentTable !== undefined) {
240
- // Check if table has a pg_partman configuration
241
- const configCheck = await adapter.executeQuery(`SELECT 1 FROM ${partmanSchema}.part_config WHERE parent_table = $1`, [parentTable]);
242
- if ((configCheck.rows?.length ?? 0) === 0) {
243
- return {
244
- success: false,
245
- parentTable,
246
- error: `Table '${parentTable}' is not managed by pg_partman.`,
247
- hint: "Use pg_partman_create_parent to set up partitioning, or pg_partman_show_config to list managed tables.",
248
- };
249
- }
250
- const args = [`p_parent_table := '${parentTable}'`];
251
- if (analyze !== undefined) {
252
- args.push(`p_analyze := ${String(analyze)}`);
253
- }
254
- try {
255
- const sql = `SELECT ${partmanSchema}.run_maintenance(${args.join(", ")})`;
256
- await adapter.executeQuery(sql);
257
- return {
258
- success: true,
259
- parentTable,
260
- analyze: analyze ?? true,
261
- message: `Maintenance completed for ${parentTable}`,
262
- };
263
- }
264
- catch (e) {
265
- // Extract clean error message (first line only, remove PL/pgSQL context)
266
- let errorMsg = e instanceof Error ? e.message : String(e);
267
- const fullError = errorMsg;
268
- errorMsg = errorMsg.split("\n")[0] ?? errorMsg;
269
- errorMsg = errorMsg.replace(/\s+CONTEXT:.*$/i, "").trim();
270
- // Catch pg_partman internal errors about NULL child tables
271
- if (fullError.includes("Child table given does not exist") ||
272
- fullError.includes("<NULL>")) {
276
+ try {
277
+ const { parentTable, analyze } = PartmanRunMaintenanceSchema.parse(params);
278
+ const partmanSchema = await getPartmanSchema(adapter);
279
+ // If specific table provided, validate and run maintenance directly
280
+ if (parentTable !== undefined) {
281
+ // Check if table has a pg_partman configuration
282
+ const configCheck = await adapter.executeQuery(`SELECT 1 FROM ${partmanSchema}.part_config WHERE parent_table = $1`, [parentTable]);
283
+ if ((configCheck.rows?.length ?? 0) === 0) {
273
284
  return {
274
285
  success: false,
275
286
  parentTable,
276
- error: "Partition set has no child partitions yet.",
277
- hint: "For new partition sets, ensure startPartition is valid for your data. " +
278
- "Insert data first, then run maintenance, or specify a valid startPartition when creating the parent.",
287
+ error: `Table '${parentTable}' is not managed by pg_partman.`,
288
+ hint: "Use pg_partman_create_parent to set up partitioning, or pg_partman_show_config to list managed tables.",
289
+ };
290
+ }
291
+ const args = [`p_parent_table := '${parentTable}'`];
292
+ if (analyze !== undefined) {
293
+ args.push(`p_analyze := ${String(analyze)}`);
294
+ }
295
+ try {
296
+ const sql = `SELECT ${partmanSchema}.run_maintenance(${args.join(", ")})`;
297
+ await adapter.executeQuery(sql);
298
+ return {
299
+ success: true,
300
+ parentTable,
301
+ analyze: analyze ?? true,
302
+ message: `Maintenance completed for ${parentTable}`,
303
+ };
304
+ }
305
+ catch (e) {
306
+ // Extract clean error message (first line only, remove PL/pgSQL context)
307
+ let errorMsg = e instanceof Error ? e.message : String(e);
308
+ const fullError = errorMsg;
309
+ errorMsg = errorMsg.split("\n")[0] ?? errorMsg;
310
+ errorMsg = errorMsg.replace(/\s+CONTEXT:.*$/i, "").trim();
311
+ // Catch pg_partman internal errors about NULL child tables
312
+ if (fullError.includes("Child table given does not exist") ||
313
+ fullError.includes("<NULL>")) {
314
+ return {
315
+ success: false,
316
+ parentTable,
317
+ error: "Partition set has no child partitions yet.",
318
+ hint: "For new partition sets, ensure startPartition is valid for your data. " +
319
+ "Insert data first, then run maintenance, or specify a valid startPartition when creating the parent.",
320
+ };
321
+ }
322
+ // Return clean error response instead of throwing with stack trace
323
+ return {
324
+ success: false,
325
+ parentTable,
326
+ error: errorMsg,
327
+ hint: "Check that the parent table exists, is properly partitioned, and has valid pg_partman configuration. " +
328
+ "Use pg_partman_show_config to verify configuration.",
279
329
  };
280
330
  }
281
- // Return clean error response instead of throwing with stack trace
282
- return {
283
- success: false,
284
- parentTable,
285
- error: errorMsg,
286
- hint: "Check that the parent table exists, is properly partitioned, and has valid pg_partman configuration. " +
287
- "Use pg_partman_show_config to verify configuration.",
288
- };
289
331
  }
290
- }
291
- // For all partition sets, iterate ourselves to handle orphaned configs gracefully
292
- const configsResult = await adapter.executeQuery(`
332
+ // For all partition sets, iterate ourselves to handle orphaned configs gracefully
333
+ const configsResult = await adapter.executeQuery(`
293
334
  SELECT parent_table FROM ${partmanSchema}.part_config
294
335
  `);
295
- const configs = configsResult.rows ?? [];
296
- const maintained = [];
297
- const orphanedTables = [];
298
- const errors = [];
299
- for (const config of configs) {
300
- const table = config["parent_table"];
301
- // Check if table still exists
302
- const [schema, tableName] = table.includes(".")
303
- ? [table.split(".")[0], table.split(".")[1]]
304
- : ["public", table];
305
- const tableExistsResult = await adapter.executeQuery(`
306
- SELECT 1 FROM information_schema.tables
336
+ const configs = configsResult.rows ?? [];
337
+ const maintained = [];
338
+ const orphanedTables = [];
339
+ const errors = [];
340
+ for (const config of configs) {
341
+ const table = config["parent_table"];
342
+ // Check if table still exists
343
+ const [schema, tableName] = table.includes(".")
344
+ ? [table.split(".")[0], table.split(".")[1]]
345
+ : ["public", table];
346
+ const tableExistsResult = await adapter.executeQuery(`
347
+ SELECT 1 FROM information_schema.tables
307
348
  WHERE table_schema = $1 AND table_name = $2
308
349
  `, [schema, tableName]);
309
- if ((tableExistsResult.rows?.length ?? 0) === 0) {
310
- orphanedTables.push(table);
311
- continue;
312
- }
313
- // Run maintenance for this table
314
- try {
315
- const args = [`p_parent_table := '${table}'`];
316
- if (analyze !== undefined) {
317
- args.push(`p_analyze := ${String(analyze)}`);
350
+ if ((tableExistsResult.rows?.length ?? 0) === 0) {
351
+ orphanedTables.push(table);
352
+ continue;
318
353
  }
319
- const sql = `SELECT ${partmanSchema}.run_maintenance(${args.join(", ")})`;
320
- await adapter.executeQuery(sql);
321
- maintained.push(table);
322
- }
323
- catch (error) {
324
- // Extract clean error message (first line only, remove PL/pgSQL context)
325
- let reason = error instanceof Error ? error.message : "Unknown error";
326
- reason = reason.split("\n")[0] ?? reason;
327
- reason = reason.replace(/\s+CONTEXT:.*$/i, "").trim();
328
- // Improve NULL child error with actionable guidance
329
- if (reason.includes("Child table") && reason.includes("NULL")) {
330
- reason =
331
- "No child partitions exist yet. For empty tables, ensure startPartition was set when creating the partition set. " +
332
- 'TIP: Use pg_partman_create_parent with startPartition (e.g., "now" or a specific date) to bootstrap partitions.';
354
+ // Run maintenance for this table
355
+ try {
356
+ const args = [`p_parent_table := '${table}'`];
357
+ if (analyze !== undefined) {
358
+ args.push(`p_analyze := ${String(analyze)}`);
359
+ }
360
+ const sql = `SELECT ${partmanSchema}.run_maintenance(${args.join(", ")})`;
361
+ await adapter.executeQuery(sql);
362
+ maintained.push(table);
363
+ }
364
+ catch (error) {
365
+ // Extract clean error message (first line only, remove PL/pgSQL context)
366
+ let reason = error instanceof Error ? error.message : "Unknown error";
367
+ reason = reason.split("\n")[0] ?? reason;
368
+ reason = reason.replace(/\s+CONTEXT:.*$/i, "").trim();
369
+ // Improve NULL child error with actionable guidance
370
+ if (reason.includes("Child table") && reason.includes("NULL")) {
371
+ reason =
372
+ "No child partitions exist yet. For empty tables, ensure startPartition was set when creating the partition set. " +
373
+ 'TIP: Use pg_partman_create_parent with startPartition (e.g., "now" or a specific date) to bootstrap partitions.';
374
+ }
375
+ errors.push({
376
+ table,
377
+ reason,
378
+ });
333
379
  }
334
- errors.push({
335
- table,
336
- reason,
337
- });
338
380
  }
381
+ // Determine success status
382
+ const skippedCount = orphanedTables.length + errors.length;
383
+ const allFailed = maintained.length === 0 && skippedCount > 0;
384
+ const partial = maintained.length > 0 && skippedCount > 0;
385
+ return {
386
+ success: !allFailed,
387
+ partial: partial ? true : undefined,
388
+ parentTable: "all",
389
+ analyze: analyze ?? true,
390
+ maintained,
391
+ orphaned: orphanedTables.length > 0
392
+ ? {
393
+ count: orphanedTables.length,
394
+ tables: orphanedTables,
395
+ hint: `Remove orphaned configs: DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '<table_name>';`,
396
+ }
397
+ : undefined,
398
+ errors: errors.length > 0 ? errors : undefined,
399
+ message: allFailed
400
+ ? `Maintenance failed for all ${String(skippedCount)} partition sets due to errors.`
401
+ : skippedCount > 0
402
+ ? `Maintenance completed for ${String(maintained.length)} partition sets. ${String(skippedCount)} skipped (${String(orphanedTables.length)} orphaned, ${String(errors.length)} errors).`
403
+ : `Maintenance completed for all ${String(maintained.length)} partition sets`,
404
+ };
405
+ }
406
+ catch (error) {
407
+ return {
408
+ success: false,
409
+ error: formatPostgresError(error, {
410
+ tool: "pg_partman_run_maintenance",
411
+ }),
412
+ };
339
413
  }
340
- // Determine success status
341
- const skippedCount = orphanedTables.length + errors.length;
342
- const allFailed = maintained.length === 0 && skippedCount > 0;
343
- const partial = maintained.length > 0 && skippedCount > 0;
344
- return {
345
- success: !allFailed,
346
- partial: partial ? true : undefined,
347
- parentTable: "all",
348
- analyze: analyze ?? true,
349
- maintained,
350
- orphaned: orphanedTables.length > 0
351
- ? {
352
- count: orphanedTables.length,
353
- tables: orphanedTables,
354
- hint: `Remove orphaned configs: DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '<table_name>';`,
355
- }
356
- : undefined,
357
- errors: errors.length > 0 ? errors : undefined,
358
- message: allFailed
359
- ? `Maintenance failed for all ${String(skippedCount)} partition sets due to errors.`
360
- : skippedCount > 0
361
- ? `Maintenance completed for ${String(maintained.length)} partition sets. ${String(skippedCount)} skipped (${String(orphanedTables.length)} orphaned, ${String(errors.length)} errors).`
362
- : `Maintenance completed for all ${String(maintained.length)} partition sets`,
363
- };
364
414
  },
365
415
  };
366
416
  }
@@ -374,67 +424,78 @@ export function createPartmanShowPartitionsTool(adapter) {
374
424
  name: "pg_partman_show_partitions",
375
425
  description: "List all child partitions for a partition set managed by pg_partman.",
376
426
  group: "partman",
377
- inputSchema: PartmanShowPartitionsSchema,
427
+ inputSchema: PartmanShowPartitionsSchemaBase,
378
428
  outputSchema: PartmanShowPartitionsOutputSchema,
379
429
  annotations: readOnly("Show Partman Partitions"),
380
430
  icons: getToolIcons("partman", readOnly("Show Partman Partitions")),
381
431
  handler: async (params, _context) => {
382
- const parsed = PartmanShowPartitionsSchema.parse(params);
383
- const { parentTable, includeDefault, order } = parsed;
384
- const limit = parsed.limit ?? DEFAULT_PARTITION_LIMIT;
385
- // parentTable is required - provide clear error if missing
386
- if (!parentTable) {
387
- return {
388
- success: false,
389
- error: 'parentTable parameter is required. Specify the parent table (e.g., "public.events") to list its partitions.',
390
- hint: "Use pg_partman_show_config to list all partition sets first.",
391
- };
392
- }
393
- const orderDir = order === "desc" ? "DESC" : "ASC";
394
- const includeDefaultVal = includeDefault ?? false;
395
- const partmanSchema = await getPartmanSchema(adapter);
396
- // First check if table is managed by pg_partman
397
- const configCheck = await adapter.executeQuery(`SELECT 1 FROM ${partmanSchema}.part_config WHERE parent_table = $1`, [parentTable]);
398
- if ((configCheck.rows?.length ?? 0) === 0) {
399
- return {
400
- success: false,
401
- error: `Table '${parentTable}' is not managed by pg_partman.`,
402
- hint: "Use pg_partman_create_parent to set up partitioning, or pg_partman_show_config to list managed tables.",
403
- };
404
- }
405
- // First get total count for pagination
406
- const countSql = `
432
+ try {
433
+ const parsed = PartmanShowPartitionsSchema.parse(params);
434
+ const { parentTable, includeDefault, order } = parsed;
435
+ const rawLimit = parsed.limit ?? DEFAULT_PARTITION_LIMIT;
436
+ const limit = isNaN(rawLimit) ? DEFAULT_PARTITION_LIMIT : rawLimit;
437
+ // parentTable is required - provide clear error if missing
438
+ if (!parentTable) {
439
+ return {
440
+ success: false,
441
+ error: 'parentTable parameter is required. Specify the parent table (e.g., "public.events") to list its partitions.',
442
+ hint: "Use pg_partman_show_config to list all partition sets first.",
443
+ };
444
+ }
445
+ const orderDir = order === "desc" ? "DESC" : "ASC";
446
+ const includeDefaultVal = includeDefault ?? false;
447
+ const partmanSchema = await getPartmanSchema(adapter);
448
+ // First check if table is managed by pg_partman
449
+ const configCheck = await adapter.executeQuery(`SELECT 1 FROM ${partmanSchema}.part_config WHERE parent_table = $1`, [parentTable]);
450
+ if ((configCheck.rows?.length ?? 0) === 0) {
451
+ return {
452
+ success: false,
453
+ error: `Table '${parentTable}' is not managed by pg_partman.`,
454
+ hint: "Use pg_partman_create_parent to set up partitioning, or pg_partman_show_config to list managed tables.",
455
+ };
456
+ }
457
+ // First get total count for pagination
458
+ const countSql = `
407
459
  SELECT COUNT(*) as total FROM ${partmanSchema}.show_partitions(
408
460
  p_parent_table := '${parentTable}',
409
461
  p_include_default := ${String(includeDefaultVal)},
410
462
  p_order := '${orderDir}'
411
463
  )
412
464
  `;
413
- const countResult = await adapter.executeQuery(countSql);
414
- const totalCount = Number(countResult.rows?.[0]?.["total"] ?? 0);
415
- // Apply limit (0 means no limit)
416
- const applyLimit = limit > 0;
417
- let sql = `
465
+ const countResult = await adapter.executeQuery(countSql);
466
+ const totalCount = Number(countResult.rows?.[0]?.["total"] ?? 0);
467
+ // Apply limit (0 means no limit)
468
+ const applyLimit = limit > 0;
469
+ let sql = `
418
470
  SELECT * FROM ${partmanSchema}.show_partitions(
419
471
  p_parent_table := '${parentTable}',
420
472
  p_include_default := ${String(includeDefaultVal)},
421
473
  p_order := '${orderDir}'
422
474
  )
423
475
  `;
424
- if (applyLimit) {
425
- sql += ` LIMIT ${String(limit)}`;
476
+ if (applyLimit) {
477
+ sql += ` LIMIT ${String(limit)}`;
478
+ }
479
+ const result = await adapter.executeQuery(sql);
480
+ const partitions = result.rows ?? [];
481
+ const truncated = applyLimit && totalCount > limit;
482
+ return {
483
+ success: true,
484
+ parentTable,
485
+ partitions,
486
+ count: partitions.length,
487
+ truncated,
488
+ totalCount,
489
+ };
490
+ }
491
+ catch (error) {
492
+ return {
493
+ success: false,
494
+ error: formatPostgresError(error, {
495
+ tool: "pg_partman_show_partitions",
496
+ }),
497
+ };
426
498
  }
427
- const result = await adapter.executeQuery(sql);
428
- const partitions = result.rows ?? [];
429
- const truncated = applyLimit && totalCount > limit;
430
- return {
431
- success: true,
432
- parentTable,
433
- partitions,
434
- count: partitions.length,
435
- truncated,
436
- totalCount,
437
- };
438
499
  },
439
500
  };
440
501
  }
@@ -442,135 +503,109 @@ export function createPartmanShowPartitionsTool(adapter) {
442
503
  * Show partition configuration
443
504
  */
444
505
  export function createPartmanShowConfigTool(adapter) {
445
- // Preprocess to support table/parent/name aliases and auto-prefix public schema
446
- const inputSchema = z
447
- .preprocess((input) => {
448
- if (typeof input !== "object" || input === null)
449
- return input;
450
- const raw = input;
451
- const result = { ...raw };
452
- // Alias: table → parentTable
453
- if (result.table && !result.parentTable) {
454
- result.parentTable = result.table;
455
- }
456
- // Alias: parent → parentTable (documented in ServerInstructions)
457
- if (result.parent && !result.parentTable) {
458
- result.parentTable = result.parent;
459
- }
460
- // Alias: name → parentTable (documented in ServerInstructions)
461
- if (result.name && !result.parentTable) {
462
- result.parentTable = result.name;
463
- }
464
- // Auto-prefix public. for parentTable when no schema specified
465
- // (Consistent with other partman tools)
466
- if (result.parentTable && !result.parentTable.includes(".")) {
467
- result.parentTable = `public.${result.parentTable}`;
468
- }
469
- return result;
470
- }, z.object({
471
- parentTable: z
472
- .string()
473
- .optional()
474
- .describe("Parent table name (all configs if omitted)"),
475
- limit: z
476
- .number()
477
- .optional()
478
- .describe("Maximum number of configs to return (default: 50, use 0 for all)"),
479
- }))
480
- .default({});
481
506
  return {
482
507
  name: "pg_partman_show_config",
483
508
  description: "View the configuration for a partition set from part_config table.",
484
509
  group: "partman",
485
- inputSchema,
510
+ inputSchema: PartmanShowConfigSchemaBase,
486
511
  outputSchema: PartmanShowConfigOutputSchema,
487
512
  annotations: readOnly("Show Partman Config"),
488
513
  icons: getToolIcons("partman", readOnly("Show Partman Config")),
489
514
  handler: async (params, _context) => {
490
- const parsed = inputSchema.parse(params);
491
- const partmanSchema = await getPartmanSchema(adapter);
492
- // Dynamically detect available columns to handle different pg_partman versions
493
- const columnsResult = await adapter.executeQuery(`
494
- SELECT column_name
495
- FROM information_schema.columns
515
+ try {
516
+ const parsed = PartmanShowConfigSchema.parse(params);
517
+ const partmanSchema = await getPartmanSchema(adapter);
518
+ // Dynamically detect available columns to handle different pg_partman versions
519
+ const columnsResult = await adapter.executeQuery(`
520
+ SELECT column_name
521
+ FROM information_schema.columns
496
522
  WHERE table_schema = $1 AND table_name = 'part_config'
497
523
  `, [partmanSchema]);
498
- const availableColumns = new Set((columnsResult.rows ?? []).map((r) => r["column_name"]));
499
- // Build column list based on what's available
500
- const baseColumns = [
501
- "parent_table",
502
- "control",
503
- "partition_interval",
504
- "partition_type",
505
- "premake",
506
- "automatic_maintenance",
507
- "template_table",
508
- "retention",
509
- "retention_keep_table",
510
- "epoch",
511
- "default_table",
512
- ];
513
- // Add inherit_fk only if it exists (not in all pg_partman versions)
514
- const columns = baseColumns.filter((c) => availableColumns.has(c));
515
- if (availableColumns.has("inherit_fk")) {
516
- columns.push("inherit_fk");
517
- }
518
- // Get total count first for pagination
519
- let countSql = `SELECT COUNT(*) as total FROM ${partmanSchema}.part_config`;
520
- const countParams = [];
521
- if (parsed.parentTable !== undefined) {
522
- countSql += " WHERE parent_table = $1";
523
- countParams.push(parsed.parentTable);
524
- }
525
- const countResult = await adapter.executeQuery(countSql, countParams);
526
- const totalCount = Number(countResult.rows?.[0]?.["total"] ?? 0);
527
- // Apply limit (default 50, 0 means no limit)
528
- const limit = parsed.limit ?? 50;
529
- const applyLimit = limit > 0;
530
- let sql = `SELECT ${columns.join(", ")} FROM ${partmanSchema}.part_config`;
531
- const queryParams = [];
532
- if (parsed.parentTable !== undefined) {
533
- sql += " WHERE parent_table = $1";
534
- queryParams.push(parsed.parentTable);
535
- }
536
- sql += " ORDER BY parent_table";
537
- if (applyLimit) {
538
- sql += ` LIMIT ${String(limit)}`;
539
- }
540
- const result = await adapter.executeQuery(sql, queryParams);
541
- const configs = result.rows ?? [];
542
- // Check each config to see if parent table still exists (orphaned detection)
543
- const configsWithStatus = await Promise.all(configs.map(async (config) => {
544
- const parentTable = config["parent_table"];
545
- const [schema, tableName] = parentTable.includes(".")
546
- ? [parentTable.split(".")[0], parentTable.split(".")[1]]
547
- : ["public", parentTable];
548
- const tableExistsResult = await adapter.executeQuery(`
549
- SELECT 1 FROM information_schema.tables
524
+ const availableColumns = new Set((columnsResult.rows ?? []).map((r) => r["column_name"]));
525
+ // Build column list based on what's available
526
+ const baseColumns = [
527
+ "parent_table",
528
+ "control",
529
+ "partition_interval",
530
+ "partition_type",
531
+ "premake",
532
+ "automatic_maintenance",
533
+ "template_table",
534
+ "retention",
535
+ "retention_keep_table",
536
+ "epoch",
537
+ "default_table",
538
+ ];
539
+ // Add inherit_fk only if it exists (not in all pg_partman versions)
540
+ const columns = baseColumns.filter((c) => availableColumns.has(c));
541
+ if (availableColumns.has("inherit_fk")) {
542
+ columns.push("inherit_fk");
543
+ }
544
+ // Get total count first for pagination
545
+ let countSql = `SELECT COUNT(*) as total FROM ${partmanSchema}.part_config`;
546
+ const countParams = [];
547
+ if (parsed.parentTable !== undefined) {
548
+ countSql += " WHERE parent_table = $1";
549
+ countParams.push(parsed.parentTable);
550
+ }
551
+ const countResult = await adapter.executeQuery(countSql, countParams);
552
+ const totalCount = Number(countResult.rows?.[0]?.["total"] ?? 0);
553
+ // Apply limit (default 50, 0 means no limit)
554
+ const rawLimit = parsed.limit ?? 50;
555
+ const limit = isNaN(rawLimit) ? 50 : rawLimit;
556
+ const applyLimit = limit > 0;
557
+ let sql = `SELECT ${columns.join(", ")} FROM ${partmanSchema}.part_config`;
558
+ const queryParams = [];
559
+ if (parsed.parentTable !== undefined) {
560
+ sql += " WHERE parent_table = $1";
561
+ queryParams.push(parsed.parentTable);
562
+ }
563
+ sql += " ORDER BY parent_table";
564
+ if (applyLimit) {
565
+ sql += ` LIMIT ${String(limit)}`;
566
+ }
567
+ const result = await adapter.executeQuery(sql, queryParams);
568
+ const configs = result.rows ?? [];
569
+ // Check each config to see if parent table still exists (orphaned detection)
570
+ const configsWithStatus = await Promise.all(configs.map(async (config) => {
571
+ const parentTable = config["parent_table"];
572
+ const [schema, tableName] = parentTable.includes(".")
573
+ ? [parentTable.split(".")[0], parentTable.split(".")[1]]
574
+ : ["public", parentTable];
575
+ const tableExistsResult = await adapter.executeQuery(`
576
+ SELECT 1 FROM information_schema.tables
550
577
  WHERE table_schema = $1 AND table_name = $2
551
578
  `, [schema, tableName]);
552
- const orphaned = (tableExistsResult.rows?.length ?? 0) === 0;
553
- return { ...config, orphaned };
554
- }));
555
- const orphanedCount = configsWithStatus.filter((c) => c.orphaned).length;
556
- const truncated = applyLimit && totalCount > limit;
557
- // Provide hint if a specific table was requested but not found
558
- let notFoundHint;
559
- if (parsed.parentTable !== undefined && configsWithStatus.length === 0) {
560
- notFoundHint = `Table '${parsed.parentTable}' is not managed by pg_partman. Use pg_partman_create_parent to set up partitioning.`;
579
+ const orphaned = (tableExistsResult.rows?.length ?? 0) === 0;
580
+ return { ...config, orphaned };
581
+ }));
582
+ const orphanedCount = configsWithStatus.filter((c) => c.orphaned).length;
583
+ const truncated = applyLimit && totalCount > limit;
584
+ // Provide hint if a specific table was requested but not found
585
+ let notFoundHint;
586
+ if (parsed.parentTable !== undefined &&
587
+ configsWithStatus.length === 0) {
588
+ notFoundHint = `Table '${parsed.parentTable}' is not managed by pg_partman. Use pg_partman_create_parent to set up partitioning.`;
589
+ }
590
+ return {
591
+ configs: configsWithStatus,
592
+ count: configsWithStatus.length,
593
+ truncated,
594
+ totalCount,
595
+ orphanedCount: orphanedCount > 0 ? orphanedCount : undefined,
596
+ hint: notFoundHint ??
597
+ (orphanedCount > 0
598
+ ? `${String(orphanedCount)} orphaned config(s) found - parent table no longer exists. ` +
599
+ `To clean up, use raw SQL: DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '<table_name>';`
600
+ : undefined),
601
+ };
602
+ }
603
+ catch (error) {
604
+ return {
605
+ success: false,
606
+ error: formatPostgresError(error, { tool: "pg_partman_show_config" }),
607
+ };
561
608
  }
562
- return {
563
- configs: configsWithStatus,
564
- count: configsWithStatus.length,
565
- truncated,
566
- totalCount,
567
- orphanedCount: orphanedCount > 0 ? orphanedCount : undefined,
568
- hint: notFoundHint ??
569
- (orphanedCount > 0
570
- ? `${String(orphanedCount)} orphaned config(s) found - parent table no longer exists. ` +
571
- `To clean up, use raw SQL: DELETE FROM ${partmanSchema}.part_config WHERE parent_table = '<table_name>';`
572
- : undefined),
573
- };
574
609
  },
575
610
  };
576
611
  }