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