@neverinfamous/postgres-mcp 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +515 -0
  3. package/dist/__tests__/mocks/adapter.d.ts +80 -0
  4. package/dist/__tests__/mocks/adapter.d.ts.map +1 -0
  5. package/dist/__tests__/mocks/adapter.js +225 -0
  6. package/dist/__tests__/mocks/adapter.js.map +1 -0
  7. package/dist/__tests__/mocks/index.d.ts +11 -0
  8. package/dist/__tests__/mocks/index.d.ts.map +1 -0
  9. package/dist/__tests__/mocks/index.js +11 -0
  10. package/dist/__tests__/mocks/index.js.map +1 -0
  11. package/dist/__tests__/mocks/pool.d.ts +43 -0
  12. package/dist/__tests__/mocks/pool.d.ts.map +1 -0
  13. package/dist/__tests__/mocks/pool.js +71 -0
  14. package/dist/__tests__/mocks/pool.js.map +1 -0
  15. package/dist/adapters/DatabaseAdapter.d.ts +139 -0
  16. package/dist/adapters/DatabaseAdapter.d.ts.map +1 -0
  17. package/dist/adapters/DatabaseAdapter.js +250 -0
  18. package/dist/adapters/DatabaseAdapter.js.map +1 -0
  19. package/dist/adapters/postgresql/PostgresAdapter.d.ts +119 -0
  20. package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -0
  21. package/dist/adapters/postgresql/PostgresAdapter.js +902 -0
  22. package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -0
  23. package/dist/adapters/postgresql/index.d.ts +5 -0
  24. package/dist/adapters/postgresql/index.d.ts.map +1 -0
  25. package/dist/adapters/postgresql/index.js +5 -0
  26. package/dist/adapters/postgresql/index.js.map +1 -0
  27. package/dist/adapters/postgresql/prompts/backup.d.ts +8 -0
  28. package/dist/adapters/postgresql/prompts/backup.d.ts.map +1 -0
  29. package/dist/adapters/postgresql/prompts/backup.js +132 -0
  30. package/dist/adapters/postgresql/prompts/backup.js.map +1 -0
  31. package/dist/adapters/postgresql/prompts/citext.d.ts +8 -0
  32. package/dist/adapters/postgresql/prompts/citext.d.ts.map +1 -0
  33. package/dist/adapters/postgresql/prompts/citext.js +227 -0
  34. package/dist/adapters/postgresql/prompts/citext.js.map +1 -0
  35. package/dist/adapters/postgresql/prompts/extensionSetup.d.ts +8 -0
  36. package/dist/adapters/postgresql/prompts/extensionSetup.d.ts.map +1 -0
  37. package/dist/adapters/postgresql/prompts/extensionSetup.js +282 -0
  38. package/dist/adapters/postgresql/prompts/extensionSetup.js.map +1 -0
  39. package/dist/adapters/postgresql/prompts/health.d.ts +8 -0
  40. package/dist/adapters/postgresql/prompts/health.d.ts.map +1 -0
  41. package/dist/adapters/postgresql/prompts/health.js +118 -0
  42. package/dist/adapters/postgresql/prompts/health.js.map +1 -0
  43. package/dist/adapters/postgresql/prompts/index.d.ts +13 -0
  44. package/dist/adapters/postgresql/prompts/index.d.ts.map +1 -0
  45. package/dist/adapters/postgresql/prompts/index.js +308 -0
  46. package/dist/adapters/postgresql/prompts/index.js.map +1 -0
  47. package/dist/adapters/postgresql/prompts/indexTuning.d.ts +8 -0
  48. package/dist/adapters/postgresql/prompts/indexTuning.d.ts.map +1 -0
  49. package/dist/adapters/postgresql/prompts/indexTuning.js +130 -0
  50. package/dist/adapters/postgresql/prompts/indexTuning.js.map +1 -0
  51. package/dist/adapters/postgresql/prompts/kcache.d.ts +8 -0
  52. package/dist/adapters/postgresql/prompts/kcache.d.ts.map +1 -0
  53. package/dist/adapters/postgresql/prompts/kcache.js +227 -0
  54. package/dist/adapters/postgresql/prompts/kcache.js.map +1 -0
  55. package/dist/adapters/postgresql/prompts/ltree.d.ts +8 -0
  56. package/dist/adapters/postgresql/prompts/ltree.d.ts.map +1 -0
  57. package/dist/adapters/postgresql/prompts/ltree.js +286 -0
  58. package/dist/adapters/postgresql/prompts/ltree.js.map +1 -0
  59. package/dist/adapters/postgresql/prompts/partman.d.ts +8 -0
  60. package/dist/adapters/postgresql/prompts/partman.d.ts.map +1 -0
  61. package/dist/adapters/postgresql/prompts/partman.js +211 -0
  62. package/dist/adapters/postgresql/prompts/partman.js.map +1 -0
  63. package/dist/adapters/postgresql/prompts/pgcron.d.ts +8 -0
  64. package/dist/adapters/postgresql/prompts/pgcron.d.ts.map +1 -0
  65. package/dist/adapters/postgresql/prompts/pgcron.js +233 -0
  66. package/dist/adapters/postgresql/prompts/pgcron.js.map +1 -0
  67. package/dist/adapters/postgresql/prompts/pgcrypto.d.ts +8 -0
  68. package/dist/adapters/postgresql/prompts/pgcrypto.d.ts.map +1 -0
  69. package/dist/adapters/postgresql/prompts/pgcrypto.js +299 -0
  70. package/dist/adapters/postgresql/prompts/pgcrypto.js.map +1 -0
  71. package/dist/adapters/postgresql/prompts/pgvector.d.ts +8 -0
  72. package/dist/adapters/postgresql/prompts/pgvector.d.ts.map +1 -0
  73. package/dist/adapters/postgresql/prompts/pgvector.js +148 -0
  74. package/dist/adapters/postgresql/prompts/pgvector.js.map +1 -0
  75. package/dist/adapters/postgresql/prompts/postgis.d.ts +8 -0
  76. package/dist/adapters/postgresql/prompts/postgis.d.ts.map +1 -0
  77. package/dist/adapters/postgresql/prompts/postgis.js +200 -0
  78. package/dist/adapters/postgresql/prompts/postgis.js.map +1 -0
  79. package/dist/adapters/postgresql/resources/activity.d.ts +9 -0
  80. package/dist/adapters/postgresql/resources/activity.d.ts.map +1 -0
  81. package/dist/adapters/postgresql/resources/activity.js +118 -0
  82. package/dist/adapters/postgresql/resources/activity.js.map +1 -0
  83. package/dist/adapters/postgresql/resources/capabilities.d.ts +9 -0
  84. package/dist/adapters/postgresql/resources/capabilities.d.ts.map +1 -0
  85. package/dist/adapters/postgresql/resources/capabilities.js +182 -0
  86. package/dist/adapters/postgresql/resources/capabilities.js.map +1 -0
  87. package/dist/adapters/postgresql/resources/cron.d.ts +9 -0
  88. package/dist/adapters/postgresql/resources/cron.d.ts.map +1 -0
  89. package/dist/adapters/postgresql/resources/cron.js +156 -0
  90. package/dist/adapters/postgresql/resources/cron.js.map +1 -0
  91. package/dist/adapters/postgresql/resources/crypto.d.ts +9 -0
  92. package/dist/adapters/postgresql/resources/crypto.d.ts.map +1 -0
  93. package/dist/adapters/postgresql/resources/crypto.js +191 -0
  94. package/dist/adapters/postgresql/resources/crypto.js.map +1 -0
  95. package/dist/adapters/postgresql/resources/extensions.d.ts +9 -0
  96. package/dist/adapters/postgresql/resources/extensions.d.ts.map +1 -0
  97. package/dist/adapters/postgresql/resources/extensions.js +85 -0
  98. package/dist/adapters/postgresql/resources/extensions.js.map +1 -0
  99. package/dist/adapters/postgresql/resources/health.d.ts +9 -0
  100. package/dist/adapters/postgresql/resources/health.d.ts.map +1 -0
  101. package/dist/adapters/postgresql/resources/health.js +185 -0
  102. package/dist/adapters/postgresql/resources/health.js.map +1 -0
  103. package/dist/adapters/postgresql/resources/index.d.ts +40 -0
  104. package/dist/adapters/postgresql/resources/index.d.ts.map +1 -0
  105. package/dist/adapters/postgresql/resources/index.js +87 -0
  106. package/dist/adapters/postgresql/resources/index.js.map +1 -0
  107. package/dist/adapters/postgresql/resources/indexes.d.ts +9 -0
  108. package/dist/adapters/postgresql/resources/indexes.d.ts.map +1 -0
  109. package/dist/adapters/postgresql/resources/indexes.js +130 -0
  110. package/dist/adapters/postgresql/resources/indexes.js.map +1 -0
  111. package/dist/adapters/postgresql/resources/kcache.d.ts +9 -0
  112. package/dist/adapters/postgresql/resources/kcache.d.ts.map +1 -0
  113. package/dist/adapters/postgresql/resources/kcache.js +219 -0
  114. package/dist/adapters/postgresql/resources/kcache.js.map +1 -0
  115. package/dist/adapters/postgresql/resources/locks.d.ts +9 -0
  116. package/dist/adapters/postgresql/resources/locks.d.ts.map +1 -0
  117. package/dist/adapters/postgresql/resources/locks.js +89 -0
  118. package/dist/adapters/postgresql/resources/locks.js.map +1 -0
  119. package/dist/adapters/postgresql/resources/partman.d.ts +9 -0
  120. package/dist/adapters/postgresql/resources/partman.d.ts.map +1 -0
  121. package/dist/adapters/postgresql/resources/partman.js +149 -0
  122. package/dist/adapters/postgresql/resources/partman.js.map +1 -0
  123. package/dist/adapters/postgresql/resources/performance.d.ts +9 -0
  124. package/dist/adapters/postgresql/resources/performance.d.ts.map +1 -0
  125. package/dist/adapters/postgresql/resources/performance.js +170 -0
  126. package/dist/adapters/postgresql/resources/performance.js.map +1 -0
  127. package/dist/adapters/postgresql/resources/pool.d.ts +9 -0
  128. package/dist/adapters/postgresql/resources/pool.d.ts.map +1 -0
  129. package/dist/adapters/postgresql/resources/pool.js +93 -0
  130. package/dist/adapters/postgresql/resources/pool.js.map +1 -0
  131. package/dist/adapters/postgresql/resources/postgis.d.ts +9 -0
  132. package/dist/adapters/postgresql/resources/postgis.d.ts.map +1 -0
  133. package/dist/adapters/postgresql/resources/postgis.js +232 -0
  134. package/dist/adapters/postgresql/resources/postgis.js.map +1 -0
  135. package/dist/adapters/postgresql/resources/replication.d.ts +9 -0
  136. package/dist/adapters/postgresql/resources/replication.d.ts.map +1 -0
  137. package/dist/adapters/postgresql/resources/replication.js +126 -0
  138. package/dist/adapters/postgresql/resources/replication.js.map +1 -0
  139. package/dist/adapters/postgresql/resources/schema.d.ts +10 -0
  140. package/dist/adapters/postgresql/resources/schema.d.ts.map +1 -0
  141. package/dist/adapters/postgresql/resources/schema.js +80 -0
  142. package/dist/adapters/postgresql/resources/schema.js.map +1 -0
  143. package/dist/adapters/postgresql/resources/settings.d.ts +9 -0
  144. package/dist/adapters/postgresql/resources/settings.d.ts.map +1 -0
  145. package/dist/adapters/postgresql/resources/settings.js +184 -0
  146. package/dist/adapters/postgresql/resources/settings.js.map +1 -0
  147. package/dist/adapters/postgresql/resources/stats.d.ts +10 -0
  148. package/dist/adapters/postgresql/resources/stats.d.ts.map +1 -0
  149. package/dist/adapters/postgresql/resources/stats.js +124 -0
  150. package/dist/adapters/postgresql/resources/stats.js.map +1 -0
  151. package/dist/adapters/postgresql/resources/tables.d.ts +9 -0
  152. package/dist/adapters/postgresql/resources/tables.d.ts.map +1 -0
  153. package/dist/adapters/postgresql/resources/tables.js +20 -0
  154. package/dist/adapters/postgresql/resources/tables.js.map +1 -0
  155. package/dist/adapters/postgresql/resources/vacuum.d.ts +9 -0
  156. package/dist/adapters/postgresql/resources/vacuum.d.ts.map +1 -0
  157. package/dist/adapters/postgresql/resources/vacuum.js +122 -0
  158. package/dist/adapters/postgresql/resources/vacuum.js.map +1 -0
  159. package/dist/adapters/postgresql/resources/vector.d.ts +9 -0
  160. package/dist/adapters/postgresql/resources/vector.d.ts.map +1 -0
  161. package/dist/adapters/postgresql/resources/vector.js +185 -0
  162. package/dist/adapters/postgresql/resources/vector.js.map +1 -0
  163. package/dist/adapters/postgresql/schemas/admin.d.ts +74 -0
  164. package/dist/adapters/postgresql/schemas/admin.d.ts.map +1 -0
  165. package/dist/adapters/postgresql/schemas/admin.js +180 -0
  166. package/dist/adapters/postgresql/schemas/admin.js.map +1 -0
  167. package/dist/adapters/postgresql/schemas/backup.d.ts +68 -0
  168. package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -0
  169. package/dist/adapters/postgresql/schemas/backup.js +114 -0
  170. package/dist/adapters/postgresql/schemas/backup.js.map +1 -0
  171. package/dist/adapters/postgresql/schemas/core.d.ts +443 -0
  172. package/dist/adapters/postgresql/schemas/core.d.ts.map +1 -0
  173. package/dist/adapters/postgresql/schemas/core.js +628 -0
  174. package/dist/adapters/postgresql/schemas/core.js.map +1 -0
  175. package/dist/adapters/postgresql/schemas/cron.d.ts +131 -0
  176. package/dist/adapters/postgresql/schemas/cron.d.ts.map +1 -0
  177. package/dist/adapters/postgresql/schemas/cron.js +218 -0
  178. package/dist/adapters/postgresql/schemas/cron.js.map +1 -0
  179. package/dist/adapters/postgresql/schemas/extensions.d.ts +403 -0
  180. package/dist/adapters/postgresql/schemas/extensions.d.ts.map +1 -0
  181. package/dist/adapters/postgresql/schemas/extensions.js +600 -0
  182. package/dist/adapters/postgresql/schemas/extensions.js.map +1 -0
  183. package/dist/adapters/postgresql/schemas/index.d.ts +21 -0
  184. package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -0
  185. package/dist/adapters/postgresql/schemas/index.js +72 -0
  186. package/dist/adapters/postgresql/schemas/index.js.map +1 -0
  187. package/dist/adapters/postgresql/schemas/jsonb.d.ts +94 -0
  188. package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +1 -0
  189. package/dist/adapters/postgresql/schemas/jsonb.js +198 -0
  190. package/dist/adapters/postgresql/schemas/jsonb.js.map +1 -0
  191. package/dist/adapters/postgresql/schemas/monitoring.d.ts +28 -0
  192. package/dist/adapters/postgresql/schemas/monitoring.d.ts.map +1 -0
  193. package/dist/adapters/postgresql/schemas/monitoring.js +45 -0
  194. package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -0
  195. package/dist/adapters/postgresql/schemas/partitioning.d.ts +152 -0
  196. package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -0
  197. package/dist/adapters/postgresql/schemas/partitioning.js +399 -0
  198. package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -0
  199. package/dist/adapters/postgresql/schemas/partman.d.ts +94 -0
  200. package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -0
  201. package/dist/adapters/postgresql/schemas/partman.js +264 -0
  202. package/dist/adapters/postgresql/schemas/partman.js.map +1 -0
  203. package/dist/adapters/postgresql/schemas/performance.d.ts +52 -0
  204. package/dist/adapters/postgresql/schemas/performance.d.ts.map +1 -0
  205. package/dist/adapters/postgresql/schemas/performance.js +57 -0
  206. package/dist/adapters/postgresql/schemas/performance.js.map +1 -0
  207. package/dist/adapters/postgresql/schemas/postgis.d.ts +693 -0
  208. package/dist/adapters/postgresql/schemas/postgis.d.ts.map +1 -0
  209. package/dist/adapters/postgresql/schemas/postgis.js +662 -0
  210. package/dist/adapters/postgresql/schemas/postgis.js.map +1 -0
  211. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +171 -0
  212. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -0
  213. package/dist/adapters/postgresql/schemas/schema-mgmt.js +235 -0
  214. package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -0
  215. package/dist/adapters/postgresql/schemas/stats.d.ts +229 -0
  216. package/dist/adapters/postgresql/schemas/stats.d.ts.map +1 -0
  217. package/dist/adapters/postgresql/schemas/stats.js +587 -0
  218. package/dist/adapters/postgresql/schemas/stats.js.map +1 -0
  219. package/dist/adapters/postgresql/schemas/text-search.d.ts +83 -0
  220. package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -0
  221. package/dist/adapters/postgresql/schemas/text-search.js +132 -0
  222. package/dist/adapters/postgresql/schemas/text-search.js.map +1 -0
  223. package/dist/adapters/postgresql/schemas/vector.d.ts +143 -0
  224. package/dist/adapters/postgresql/schemas/vector.d.ts.map +1 -0
  225. package/dist/adapters/postgresql/schemas/vector.js +123 -0
  226. package/dist/adapters/postgresql/schemas/vector.js.map +1 -0
  227. package/dist/adapters/postgresql/tools/admin.d.ts +13 -0
  228. package/dist/adapters/postgresql/tools/admin.d.ts.map +1 -0
  229. package/dist/adapters/postgresql/tools/admin.js +417 -0
  230. package/dist/adapters/postgresql/tools/admin.js.map +1 -0
  231. package/dist/adapters/postgresql/tools/backup/dump.d.ts +12 -0
  232. package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -0
  233. package/dist/adapters/postgresql/tools/backup/dump.js +546 -0
  234. package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -0
  235. package/dist/adapters/postgresql/tools/backup/index.d.ts +16 -0
  236. package/dist/adapters/postgresql/tools/backup/index.d.ts.map +1 -0
  237. package/dist/adapters/postgresql/tools/backup/index.js +29 -0
  238. package/dist/adapters/postgresql/tools/backup/index.js.map +1 -0
  239. package/dist/adapters/postgresql/tools/backup/planning.d.ts +22 -0
  240. package/dist/adapters/postgresql/tools/backup/planning.d.ts.map +1 -0
  241. package/dist/adapters/postgresql/tools/backup/planning.js +411 -0
  242. package/dist/adapters/postgresql/tools/backup/planning.js.map +1 -0
  243. package/dist/adapters/postgresql/tools/citext.d.ts +18 -0
  244. package/dist/adapters/postgresql/tools/citext.d.ts.map +1 -0
  245. package/dist/adapters/postgresql/tools/citext.js +568 -0
  246. package/dist/adapters/postgresql/tools/citext.js.map +1 -0
  247. package/dist/adapters/postgresql/tools/codemode/index.d.ts +27 -0
  248. package/dist/adapters/postgresql/tools/codemode/index.d.ts.map +1 -0
  249. package/dist/adapters/postgresql/tools/codemode/index.js +171 -0
  250. package/dist/adapters/postgresql/tools/codemode/index.js.map +1 -0
  251. package/dist/adapters/postgresql/tools/core/convenience.d.ts +192 -0
  252. package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -0
  253. package/dist/adapters/postgresql/tools/core/convenience.js +617 -0
  254. package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -0
  255. package/dist/adapters/postgresql/tools/core/health.d.ts +20 -0
  256. package/dist/adapters/postgresql/tools/core/health.d.ts.map +1 -0
  257. package/dist/adapters/postgresql/tools/core/health.js +360 -0
  258. package/dist/adapters/postgresql/tools/core/health.js.map +1 -0
  259. package/dist/adapters/postgresql/tools/core/index.d.ts +15 -0
  260. package/dist/adapters/postgresql/tools/core/index.d.ts.map +1 -0
  261. package/dist/adapters/postgresql/tools/core/index.js +40 -0
  262. package/dist/adapters/postgresql/tools/core/index.js.map +1 -0
  263. package/dist/adapters/postgresql/tools/core/indexes.d.ts +30 -0
  264. package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -0
  265. package/dist/adapters/postgresql/tools/core/indexes.js +232 -0
  266. package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -0
  267. package/dist/adapters/postgresql/tools/core/objects.d.ts +20 -0
  268. package/dist/adapters/postgresql/tools/core/objects.d.ts.map +1 -0
  269. package/dist/adapters/postgresql/tools/core/objects.js +361 -0
  270. package/dist/adapters/postgresql/tools/core/objects.js.map +1 -0
  271. package/dist/adapters/postgresql/tools/core/query.d.ts +16 -0
  272. package/dist/adapters/postgresql/tools/core/query.d.ts.map +1 -0
  273. package/dist/adapters/postgresql/tools/core/query.js +87 -0
  274. package/dist/adapters/postgresql/tools/core/query.js.map +1 -0
  275. package/dist/adapters/postgresql/tools/core/schemas.d.ts +135 -0
  276. package/dist/adapters/postgresql/tools/core/schemas.d.ts.map +1 -0
  277. package/dist/adapters/postgresql/tools/core/schemas.js +221 -0
  278. package/dist/adapters/postgresql/tools/core/schemas.js.map +1 -0
  279. package/dist/adapters/postgresql/tools/core/tables.d.ts +24 -0
  280. package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -0
  281. package/dist/adapters/postgresql/tools/core/tables.js +219 -0
  282. package/dist/adapters/postgresql/tools/core/tables.js.map +1 -0
  283. package/dist/adapters/postgresql/tools/cron.d.ts +16 -0
  284. package/dist/adapters/postgresql/tools/cron.d.ts.map +1 -0
  285. package/dist/adapters/postgresql/tools/cron.js +440 -0
  286. package/dist/adapters/postgresql/tools/cron.js.map +1 -0
  287. package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts +33 -0
  288. package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +1 -0
  289. package/dist/adapters/postgresql/tools/jsonb/advanced.js +681 -0
  290. package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +1 -0
  291. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts +20 -0
  292. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +1 -0
  293. package/dist/adapters/postgresql/tools/jsonb/basic.js +654 -0
  294. package/dist/adapters/postgresql/tools/jsonb/basic.js.map +1 -0
  295. package/dist/adapters/postgresql/tools/jsonb/index.d.ts +16 -0
  296. package/dist/adapters/postgresql/tools/jsonb/index.d.ts.map +1 -0
  297. package/dist/adapters/postgresql/tools/jsonb/index.js +39 -0
  298. package/dist/adapters/postgresql/tools/jsonb/index.js.map +1 -0
  299. package/dist/adapters/postgresql/tools/kcache.d.ts +20 -0
  300. package/dist/adapters/postgresql/tools/kcache.d.ts.map +1 -0
  301. package/dist/adapters/postgresql/tools/kcache.js +574 -0
  302. package/dist/adapters/postgresql/tools/kcache.js.map +1 -0
  303. package/dist/adapters/postgresql/tools/ltree.d.ts +8 -0
  304. package/dist/adapters/postgresql/tools/ltree.d.ts.map +1 -0
  305. package/dist/adapters/postgresql/tools/ltree.js +390 -0
  306. package/dist/adapters/postgresql/tools/ltree.js.map +1 -0
  307. package/dist/adapters/postgresql/tools/monitoring.d.ts +13 -0
  308. package/dist/adapters/postgresql/tools/monitoring.d.ts.map +1 -0
  309. package/dist/adapters/postgresql/tools/monitoring.js +753 -0
  310. package/dist/adapters/postgresql/tools/monitoring.js.map +1 -0
  311. package/dist/adapters/postgresql/tools/partitioning.d.ts +13 -0
  312. package/dist/adapters/postgresql/tools/partitioning.d.ts.map +1 -0
  313. package/dist/adapters/postgresql/tools/partitioning.js +500 -0
  314. package/dist/adapters/postgresql/tools/partitioning.js.map +1 -0
  315. package/dist/adapters/postgresql/tools/partman/index.d.ts +19 -0
  316. package/dist/adapters/postgresql/tools/partman/index.d.ts.map +1 -0
  317. package/dist/adapters/postgresql/tools/partman/index.js +33 -0
  318. package/dist/adapters/postgresql/tools/partman/index.js.map +1 -0
  319. package/dist/adapters/postgresql/tools/partman/management.d.ts +28 -0
  320. package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -0
  321. package/dist/adapters/postgresql/tools/partman/management.js +563 -0
  322. package/dist/adapters/postgresql/tools/partman/management.js.map +1 -0
  323. package/dist/adapters/postgresql/tools/partman/operations.d.ts +28 -0
  324. package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -0
  325. package/dist/adapters/postgresql/tools/partman/operations.js +632 -0
  326. package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -0
  327. package/dist/adapters/postgresql/tools/performance/analysis.d.ts +9 -0
  328. package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -0
  329. package/dist/adapters/postgresql/tools/performance/analysis.js +383 -0
  330. package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -0
  331. package/dist/adapters/postgresql/tools/performance/explain.d.ts +13 -0
  332. package/dist/adapters/postgresql/tools/performance/explain.d.ts.map +1 -0
  333. package/dist/adapters/postgresql/tools/performance/explain.js +71 -0
  334. package/dist/adapters/postgresql/tools/performance/explain.js.map +1 -0
  335. package/dist/adapters/postgresql/tools/performance/index.d.ts +13 -0
  336. package/dist/adapters/postgresql/tools/performance/index.d.ts.map +1 -0
  337. package/dist/adapters/postgresql/tools/performance/index.js +40 -0
  338. package/dist/adapters/postgresql/tools/performance/index.js.map +1 -0
  339. package/dist/adapters/postgresql/tools/performance/monitoring.d.ts +9 -0
  340. package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -0
  341. package/dist/adapters/postgresql/tools/performance/monitoring.js +122 -0
  342. package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -0
  343. package/dist/adapters/postgresql/tools/performance/optimization.d.ts +9 -0
  344. package/dist/adapters/postgresql/tools/performance/optimization.d.ts.map +1 -0
  345. package/dist/adapters/postgresql/tools/performance/optimization.js +315 -0
  346. package/dist/adapters/postgresql/tools/performance/optimization.js.map +1 -0
  347. package/dist/adapters/postgresql/tools/performance/stats.d.ts +14 -0
  348. package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -0
  349. package/dist/adapters/postgresql/tools/performance/stats.js +559 -0
  350. package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -0
  351. package/dist/adapters/postgresql/tools/pgcrypto.d.ts +8 -0
  352. package/dist/adapters/postgresql/tools/pgcrypto.d.ts.map +1 -0
  353. package/dist/adapters/postgresql/tools/pgcrypto.js +239 -0
  354. package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -0
  355. package/dist/adapters/postgresql/tools/postgis/advanced.d.ts +21 -0
  356. package/dist/adapters/postgresql/tools/postgis/advanced.d.ts.map +1 -0
  357. package/dist/adapters/postgresql/tools/postgis/advanced.js +383 -0
  358. package/dist/adapters/postgresql/tools/postgis/advanced.js.map +1 -0
  359. package/dist/adapters/postgresql/tools/postgis/basic.d.ts +16 -0
  360. package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -0
  361. package/dist/adapters/postgresql/tools/postgis/basic.js +479 -0
  362. package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -0
  363. package/dist/adapters/postgresql/tools/postgis/index.d.ts +17 -0
  364. package/dist/adapters/postgresql/tools/postgis/index.d.ts.map +1 -0
  365. package/dist/adapters/postgresql/tools/postgis/index.js +46 -0
  366. package/dist/adapters/postgresql/tools/postgis/index.js.map +1 -0
  367. package/dist/adapters/postgresql/tools/postgis/standalone.d.ts +21 -0
  368. package/dist/adapters/postgresql/tools/postgis/standalone.d.ts.map +1 -0
  369. package/dist/adapters/postgresql/tools/postgis/standalone.js +150 -0
  370. package/dist/adapters/postgresql/tools/postgis/standalone.js.map +1 -0
  371. package/dist/adapters/postgresql/tools/schema.d.ts +13 -0
  372. package/dist/adapters/postgresql/tools/schema.d.ts.map +1 -0
  373. package/dist/adapters/postgresql/tools/schema.js +515 -0
  374. package/dist/adapters/postgresql/tools/schema.js.map +1 -0
  375. package/dist/adapters/postgresql/tools/stats/advanced.d.ts +24 -0
  376. package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -0
  377. package/dist/adapters/postgresql/tools/stats/advanced.js +876 -0
  378. package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -0
  379. package/dist/adapters/postgresql/tools/stats/basic.d.ts +24 -0
  380. package/dist/adapters/postgresql/tools/stats/basic.d.ts.map +1 -0
  381. package/dist/adapters/postgresql/tools/stats/basic.js +501 -0
  382. package/dist/adapters/postgresql/tools/stats/basic.js.map +1 -0
  383. package/dist/adapters/postgresql/tools/stats/index.d.ts +17 -0
  384. package/dist/adapters/postgresql/tools/stats/index.d.ts.map +1 -0
  385. package/dist/adapters/postgresql/tools/stats/index.js +30 -0
  386. package/dist/adapters/postgresql/tools/stats/index.js.map +1 -0
  387. package/dist/adapters/postgresql/tools/text.d.ts +13 -0
  388. package/dist/adapters/postgresql/tools/text.d.ts.map +1 -0
  389. package/dist/adapters/postgresql/tools/text.js +708 -0
  390. package/dist/adapters/postgresql/tools/text.js.map +1 -0
  391. package/dist/adapters/postgresql/tools/transactions.d.ts +13 -0
  392. package/dist/adapters/postgresql/tools/transactions.d.ts.map +1 -0
  393. package/dist/adapters/postgresql/tools/transactions.js +201 -0
  394. package/dist/adapters/postgresql/tools/transactions.js.map +1 -0
  395. package/dist/adapters/postgresql/tools/vector/advanced.d.ts +12 -0
  396. package/dist/adapters/postgresql/tools/vector/advanced.d.ts.map +1 -0
  397. package/dist/adapters/postgresql/tools/vector/advanced.js +902 -0
  398. package/dist/adapters/postgresql/tools/vector/advanced.js.map +1 -0
  399. package/dist/adapters/postgresql/tools/vector/basic.d.ts +25 -0
  400. package/dist/adapters/postgresql/tools/vector/basic.d.ts.map +1 -0
  401. package/dist/adapters/postgresql/tools/vector/basic.js +1000 -0
  402. package/dist/adapters/postgresql/tools/vector/basic.js.map +1 -0
  403. package/dist/adapters/postgresql/tools/vector/index.d.ts +13 -0
  404. package/dist/adapters/postgresql/tools/vector/index.d.ts.map +1 -0
  405. package/dist/adapters/postgresql/tools/vector/index.js +33 -0
  406. package/dist/adapters/postgresql/tools/vector/index.js.map +1 -0
  407. package/dist/auth/AuthorizationServerDiscovery.d.ts +44 -0
  408. package/dist/auth/AuthorizationServerDiscovery.d.ts.map +1 -0
  409. package/dist/auth/AuthorizationServerDiscovery.js +117 -0
  410. package/dist/auth/AuthorizationServerDiscovery.js.map +1 -0
  411. package/dist/auth/OAuthResourceServer.d.ts +42 -0
  412. package/dist/auth/OAuthResourceServer.d.ts.map +1 -0
  413. package/dist/auth/OAuthResourceServer.js +80 -0
  414. package/dist/auth/OAuthResourceServer.js.map +1 -0
  415. package/dist/auth/TokenValidator.d.ts +36 -0
  416. package/dist/auth/TokenValidator.d.ts.map +1 -0
  417. package/dist/auth/TokenValidator.js +139 -0
  418. package/dist/auth/TokenValidator.js.map +1 -0
  419. package/dist/auth/errors.d.ts +63 -0
  420. package/dist/auth/errors.d.ts.map +1 -0
  421. package/dist/auth/errors.js +102 -0
  422. package/dist/auth/errors.js.map +1 -0
  423. package/dist/auth/index.d.ts +15 -0
  424. package/dist/auth/index.d.ts.map +1 -0
  425. package/dist/auth/index.js +16 -0
  426. package/dist/auth/index.js.map +1 -0
  427. package/dist/auth/middleware.d.ts +61 -0
  428. package/dist/auth/middleware.d.ts.map +1 -0
  429. package/dist/auth/middleware.js +156 -0
  430. package/dist/auth/middleware.js.map +1 -0
  431. package/dist/auth/scopes.d.ts +65 -0
  432. package/dist/auth/scopes.d.ts.map +1 -0
  433. package/dist/auth/scopes.js +189 -0
  434. package/dist/auth/scopes.js.map +1 -0
  435. package/dist/auth/types.d.ts +208 -0
  436. package/dist/auth/types.d.ts.map +1 -0
  437. package/dist/auth/types.js +8 -0
  438. package/dist/auth/types.js.map +1 -0
  439. package/dist/cli/args.d.ts +34 -0
  440. package/dist/cli/args.d.ts.map +1 -0
  441. package/dist/cli/args.js +308 -0
  442. package/dist/cli/args.js.map +1 -0
  443. package/dist/cli/index.d.ts +8 -0
  444. package/dist/cli/index.d.ts.map +1 -0
  445. package/dist/cli/index.js +7 -0
  446. package/dist/cli/index.js.map +1 -0
  447. package/dist/cli.d.ts +9 -0
  448. package/dist/cli.d.ts.map +1 -0
  449. package/dist/cli.js +341 -0
  450. package/dist/cli.js.map +1 -0
  451. package/dist/codemode/api.d.ts +62 -0
  452. package/dist/codemode/api.d.ts.map +1 -0
  453. package/dist/codemode/api.js +1505 -0
  454. package/dist/codemode/api.js.map +1 -0
  455. package/dist/codemode/index.d.ts +13 -0
  456. package/dist/codemode/index.d.ts.map +1 -0
  457. package/dist/codemode/index.js +17 -0
  458. package/dist/codemode/index.js.map +1 -0
  459. package/dist/codemode/sandbox-factory.d.ts +72 -0
  460. package/dist/codemode/sandbox-factory.d.ts.map +1 -0
  461. package/dist/codemode/sandbox-factory.js +88 -0
  462. package/dist/codemode/sandbox-factory.js.map +1 -0
  463. package/dist/codemode/sandbox.d.ts +96 -0
  464. package/dist/codemode/sandbox.d.ts.map +1 -0
  465. package/dist/codemode/sandbox.js +345 -0
  466. package/dist/codemode/sandbox.js.map +1 -0
  467. package/dist/codemode/security.d.ts +44 -0
  468. package/dist/codemode/security.d.ts.map +1 -0
  469. package/dist/codemode/security.js +149 -0
  470. package/dist/codemode/security.js.map +1 -0
  471. package/dist/codemode/types.d.ts +137 -0
  472. package/dist/codemode/types.d.ts.map +1 -0
  473. package/dist/codemode/types.js +46 -0
  474. package/dist/codemode/types.js.map +1 -0
  475. package/dist/codemode/worker-sandbox.d.ts +82 -0
  476. package/dist/codemode/worker-sandbox.d.ts.map +1 -0
  477. package/dist/codemode/worker-sandbox.js +244 -0
  478. package/dist/codemode/worker-sandbox.js.map +1 -0
  479. package/dist/codemode/worker-script.d.ts +8 -0
  480. package/dist/codemode/worker-script.d.ts.map +1 -0
  481. package/dist/codemode/worker-script.js +113 -0
  482. package/dist/codemode/worker-script.js.map +1 -0
  483. package/dist/constants/ServerInstructions.d.ts +13 -0
  484. package/dist/constants/ServerInstructions.d.ts.map +1 -0
  485. package/dist/constants/ServerInstructions.js +405 -0
  486. package/dist/constants/ServerInstructions.js.map +1 -0
  487. package/dist/filtering/ToolConstants.d.ts +43 -0
  488. package/dist/filtering/ToolConstants.d.ts.map +1 -0
  489. package/dist/filtering/ToolConstants.js +352 -0
  490. package/dist/filtering/ToolConstants.js.map +1 -0
  491. package/dist/filtering/ToolFilter.d.ts +90 -0
  492. package/dist/filtering/ToolFilter.d.ts.map +1 -0
  493. package/dist/filtering/ToolFilter.js +315 -0
  494. package/dist/filtering/ToolFilter.js.map +1 -0
  495. package/dist/index.d.ts +15 -0
  496. package/dist/index.d.ts.map +1 -0
  497. package/dist/index.js +19 -0
  498. package/dist/index.js.map +1 -0
  499. package/dist/pool/ConnectionPool.d.ts +70 -0
  500. package/dist/pool/ConnectionPool.d.ts.map +1 -0
  501. package/dist/pool/ConnectionPool.js +254 -0
  502. package/dist/pool/ConnectionPool.js.map +1 -0
  503. package/dist/server/McpServer.d.ts +50 -0
  504. package/dist/server/McpServer.d.ts.map +1 -0
  505. package/dist/server/McpServer.js +108 -0
  506. package/dist/server/McpServer.js.map +1 -0
  507. package/dist/transports/http.d.ts +126 -0
  508. package/dist/transports/http.d.ts.map +1 -0
  509. package/dist/transports/http.js +303 -0
  510. package/dist/transports/http.js.map +1 -0
  511. package/dist/transports/index.d.ts +8 -0
  512. package/dist/transports/index.d.ts.map +1 -0
  513. package/dist/transports/index.js +7 -0
  514. package/dist/transports/index.js.map +1 -0
  515. package/dist/types/adapters.d.ts +136 -0
  516. package/dist/types/adapters.d.ts.map +1 -0
  517. package/dist/types/adapters.js +7 -0
  518. package/dist/types/adapters.js.map +1 -0
  519. package/dist/types/database.d.ts +204 -0
  520. package/dist/types/database.d.ts.map +1 -0
  521. package/dist/types/database.js +7 -0
  522. package/dist/types/database.js.map +1 -0
  523. package/dist/types/errors.d.ts +62 -0
  524. package/dist/types/errors.d.ts.map +1 -0
  525. package/dist/types/errors.js +91 -0
  526. package/dist/types/errors.js.map +1 -0
  527. package/dist/types/filtering.d.ts +39 -0
  528. package/dist/types/filtering.d.ts.map +1 -0
  529. package/dist/types/filtering.js +7 -0
  530. package/dist/types/filtering.js.map +1 -0
  531. package/dist/types/index.d.ts +16 -0
  532. package/dist/types/index.d.ts.map +1 -0
  533. package/dist/types/index.js +11 -0
  534. package/dist/types/index.js.map +1 -0
  535. package/dist/types/mcp.d.ts +31 -0
  536. package/dist/types/mcp.d.ts.map +1 -0
  537. package/dist/types/mcp.js +7 -0
  538. package/dist/types/mcp.js.map +1 -0
  539. package/dist/types/oauth.d.ts +65 -0
  540. package/dist/types/oauth.d.ts.map +1 -0
  541. package/dist/types/oauth.js +7 -0
  542. package/dist/types/oauth.js.map +1 -0
  543. package/dist/types/schema.d.ts +110 -0
  544. package/dist/types/schema.d.ts.map +1 -0
  545. package/dist/types/schema.js +7 -0
  546. package/dist/types/schema.js.map +1 -0
  547. package/dist/utils/annotations.d.ts +42 -0
  548. package/dist/utils/annotations.d.ts.map +1 -0
  549. package/dist/utils/annotations.js +75 -0
  550. package/dist/utils/annotations.js.map +1 -0
  551. package/dist/utils/icons.d.ts +25 -0
  552. package/dist/utils/icons.d.ts.map +1 -0
  553. package/dist/utils/icons.js +212 -0
  554. package/dist/utils/icons.js.map +1 -0
  555. package/dist/utils/identifiers.d.ts +111 -0
  556. package/dist/utils/identifiers.d.ts.map +1 -0
  557. package/dist/utils/identifiers.js +270 -0
  558. package/dist/utils/identifiers.js.map +1 -0
  559. package/dist/utils/logger.d.ts +141 -0
  560. package/dist/utils/logger.d.ts.map +1 -0
  561. package/dist/utils/logger.js +304 -0
  562. package/dist/utils/logger.js.map +1 -0
  563. package/dist/utils/promptGenerator.d.ts +20 -0
  564. package/dist/utils/promptGenerator.d.ts.map +1 -0
  565. package/dist/utils/promptGenerator.js +81 -0
  566. package/dist/utils/promptGenerator.js.map +1 -0
  567. package/dist/utils/resourceAnnotations.d.ts +36 -0
  568. package/dist/utils/resourceAnnotations.d.ts.map +1 -0
  569. package/dist/utils/resourceAnnotations.js +57 -0
  570. package/dist/utils/resourceAnnotations.js.map +1 -0
  571. package/package.json +64 -0
@@ -0,0 +1,902 @@
1
+ /**
2
+ * postgres-mcp - PostgreSQL Adapter
3
+ *
4
+ * Main PostgreSQL database adapter with connection pooling,
5
+ * query execution, and tool registration.
6
+ */
7
+ import { DatabaseAdapter } from "../DatabaseAdapter.js";
8
+ import { ConnectionPool } from "../../pool/ConnectionPool.js";
9
+ import { ConnectionError, QueryError, TransactionError, } from "../../types/index.js";
10
+ import { logger } from "../../utils/logger.js";
11
+ // Import tool modules (will be created next)
12
+ import { getCoreTools } from "./tools/core/index.js";
13
+ import { getTransactionTools } from "./tools/transactions.js";
14
+ import { getJsonbTools } from "./tools/jsonb/index.js";
15
+ import { getTextTools } from "./tools/text.js";
16
+ import { getPerformanceTools } from "./tools/performance/index.js";
17
+ import { getAdminTools } from "./tools/admin.js";
18
+ import { getMonitoringTools } from "./tools/monitoring.js";
19
+ import { getBackupTools } from "./tools/backup/index.js";
20
+ import { getSchemaTools } from "./tools/schema.js";
21
+ import { getVectorTools } from "./tools/vector/index.js";
22
+ import { getPostgisTools } from "./tools/postgis/index.js";
23
+ import { getPartitioningTools } from "./tools/partitioning.js";
24
+ import { getStatsTools } from "./tools/stats/index.js";
25
+ import { getCronTools } from "./tools/cron.js";
26
+ import { getPartmanTools } from "./tools/partman/index.js";
27
+ import { getKcacheTools } from "./tools/kcache.js";
28
+ import { getCitextTools } from "./tools/citext.js";
29
+ import { getLtreeTools } from "./tools/ltree.js";
30
+ import { getPgcryptoTools } from "./tools/pgcrypto.js";
31
+ import { getCodeModeTools } from "./tools/codemode/index.js";
32
+ import { getPostgresResources } from "./resources/index.js";
33
+ import { getPostgresPrompts } from "./prompts/index.js";
34
+ /**
35
+ * Default cache TTL in milliseconds (configurable via CACHE_TTL_MS env var)
36
+ */
37
+ const DEFAULT_CACHE_TTL_MS = parseInt(process.env["METADATA_CACHE_TTL_MS"] ?? "30000", 10);
38
+ export class PostgresAdapter extends DatabaseAdapter {
39
+ type = "postgresql";
40
+ name = "PostgreSQL Adapter";
41
+ version = "0.1.0";
42
+ pool = null;
43
+ activeTransactions = new Map();
44
+ // Performance optimization: cache tool definitions (immutable after creation)
45
+ cachedToolDefinitions = null;
46
+ // Performance optimization: cache metadata with TTL
47
+ metadataCache = new Map();
48
+ cacheTtlMs = DEFAULT_CACHE_TTL_MS;
49
+ /**
50
+ * Get cached value if not expired
51
+ */
52
+ getCached(key) {
53
+ const entry = this.metadataCache.get(key);
54
+ if (!entry)
55
+ return undefined;
56
+ if (Date.now() - entry.timestamp > this.cacheTtlMs) {
57
+ this.metadataCache.delete(key);
58
+ return undefined;
59
+ }
60
+ return entry.data;
61
+ }
62
+ /**
63
+ * Set cache value
64
+ */
65
+ setCache(key, data) {
66
+ this.metadataCache.set(key, { data, timestamp: Date.now() });
67
+ }
68
+ /**
69
+ * Clear all cached metadata (useful after schema changes)
70
+ */
71
+ clearMetadataCache() {
72
+ this.metadataCache.clear();
73
+ }
74
+ // =========================================================================
75
+ // Connection Lifecycle
76
+ // =========================================================================
77
+ async connect(config) {
78
+ if (this.connected) {
79
+ logger.warn("Already connected");
80
+ return;
81
+ }
82
+ // Build pool configuration
83
+ const poolConfig = {
84
+ host: config.host ?? "localhost",
85
+ port: config.port ?? 5432,
86
+ user: config.username ?? "postgres",
87
+ password: config.password ?? "",
88
+ database: config.database ?? "postgres",
89
+ pool: config.pool,
90
+ ssl: config.options?.ssl,
91
+ statementTimeout: config.options?.statementTimeout,
92
+ applicationName: config.options?.applicationName ?? "postgres-mcp",
93
+ };
94
+ this.pool = new ConnectionPool(poolConfig);
95
+ try {
96
+ await this.pool.initialize();
97
+ this.connected = true;
98
+ logger.info("PostgreSQL adapter connected", {
99
+ host: poolConfig.host,
100
+ port: poolConfig.port,
101
+ database: poolConfig.database,
102
+ });
103
+ }
104
+ catch (error) {
105
+ this.pool = null;
106
+ throw new ConnectionError(`Failed to connect: ${String(error)}`);
107
+ }
108
+ }
109
+ async disconnect() {
110
+ if (!this.connected || !this.pool) {
111
+ return;
112
+ }
113
+ // Close any active transactions
114
+ for (const [id, client] of this.activeTransactions) {
115
+ try {
116
+ await client.query("ROLLBACK");
117
+ client.release();
118
+ logger.warn(`Rolled back orphaned transaction: ${id}`);
119
+ }
120
+ catch {
121
+ // Ignore errors during cleanup
122
+ }
123
+ }
124
+ this.activeTransactions.clear();
125
+ await this.pool.shutdown();
126
+ this.pool = null;
127
+ this.connected = false;
128
+ logger.info("PostgreSQL adapter disconnected");
129
+ }
130
+ async getHealth() {
131
+ if (!this.pool) {
132
+ return {
133
+ connected: false,
134
+ error: "Not connected",
135
+ };
136
+ }
137
+ return this.pool.checkHealth();
138
+ }
139
+ // =========================================================================
140
+ // Query Execution
141
+ // =========================================================================
142
+ async executeReadQuery(sql, params) {
143
+ this.validateQuery(sql, true);
144
+ return this.executeQuery(sql, params);
145
+ }
146
+ async executeWriteQuery(sql, params) {
147
+ this.validateQuery(sql, false);
148
+ return this.executeQuery(sql, params);
149
+ }
150
+ async executeQuery(sql, params) {
151
+ if (!this.pool) {
152
+ throw new ConnectionError("Not connected to database");
153
+ }
154
+ const startTime = Date.now();
155
+ try {
156
+ const result = await this.pool.query(sql, params);
157
+ const executionTimeMs = Date.now() - startTime;
158
+ return {
159
+ rows: result.rows,
160
+ rowsAffected: result.rowCount ?? undefined,
161
+ command: result.command,
162
+ executionTimeMs,
163
+ fields: result.fields?.map((f) => ({
164
+ name: f.name,
165
+ tableID: f.tableID,
166
+ columnID: f.columnID,
167
+ dataTypeID: f.dataTypeID,
168
+ dataTypeSize: f.dataTypeSize,
169
+ dataTypeModifier: f.dataTypeModifier,
170
+ format: f.format,
171
+ })),
172
+ };
173
+ }
174
+ catch (error) {
175
+ const err = error;
176
+ throw new QueryError(`Query failed: ${err.message}`, { sql });
177
+ }
178
+ }
179
+ /**
180
+ * Execute a query on a specific connection (for transactions)
181
+ */
182
+ async executeOnConnection(client, sql, params) {
183
+ const startTime = Date.now();
184
+ try {
185
+ const result = await client.query(sql, params);
186
+ const executionTimeMs = Date.now() - startTime;
187
+ return {
188
+ rows: result.rows,
189
+ rowsAffected: result.rowCount ?? undefined,
190
+ command: result.command,
191
+ executionTimeMs,
192
+ };
193
+ }
194
+ catch (error) {
195
+ const err = error;
196
+ throw new QueryError(`Query failed: ${err.message}`, { sql });
197
+ }
198
+ }
199
+ // =========================================================================
200
+ // Transaction Support
201
+ // =========================================================================
202
+ /**
203
+ * Begin a transaction
204
+ */
205
+ async beginTransaction(isolationLevel) {
206
+ if (!this.pool) {
207
+ throw new ConnectionError("Not connected");
208
+ }
209
+ const client = await this.pool.getConnection();
210
+ const transactionId = crypto.randomUUID();
211
+ try {
212
+ let beginCmd = "BEGIN";
213
+ if (isolationLevel) {
214
+ beginCmd = `BEGIN ISOLATION LEVEL ${isolationLevel}`;
215
+ }
216
+ await client.query(beginCmd);
217
+ this.activeTransactions.set(transactionId, client);
218
+ return transactionId;
219
+ }
220
+ catch (error) {
221
+ client.release();
222
+ throw new TransactionError(`Failed to begin transaction: ${String(error)}`);
223
+ }
224
+ }
225
+ /**
226
+ * Commit a transaction
227
+ */
228
+ async commitTransaction(transactionId) {
229
+ const client = this.activeTransactions.get(transactionId);
230
+ if (!client) {
231
+ throw new TransactionError(`Transaction not found: ${transactionId}`);
232
+ }
233
+ try {
234
+ await client.query("COMMIT");
235
+ }
236
+ finally {
237
+ client.release();
238
+ this.activeTransactions.delete(transactionId);
239
+ }
240
+ }
241
+ /**
242
+ * Rollback a transaction
243
+ */
244
+ async rollbackTransaction(transactionId) {
245
+ const client = this.activeTransactions.get(transactionId);
246
+ if (!client) {
247
+ throw new TransactionError(`Transaction not found: ${transactionId}`);
248
+ }
249
+ try {
250
+ await client.query("ROLLBACK");
251
+ }
252
+ finally {
253
+ client.release();
254
+ this.activeTransactions.delete(transactionId);
255
+ }
256
+ }
257
+ /**
258
+ * Create a savepoint
259
+ */
260
+ async createSavepoint(transactionId, savepointName) {
261
+ const client = this.activeTransactions.get(transactionId);
262
+ if (!client) {
263
+ throw new TransactionError(`Transaction not found: ${transactionId}`);
264
+ }
265
+ await client.query(`SAVEPOINT ${savepointName}`);
266
+ }
267
+ /**
268
+ * Release a savepoint
269
+ */
270
+ async releaseSavepoint(transactionId, savepointName) {
271
+ const client = this.activeTransactions.get(transactionId);
272
+ if (!client) {
273
+ throw new TransactionError(`Transaction not found: ${transactionId}`);
274
+ }
275
+ await client.query(`RELEASE SAVEPOINT ${savepointName}`);
276
+ }
277
+ /**
278
+ * Rollback to a savepoint
279
+ */
280
+ async rollbackToSavepoint(transactionId, savepointName) {
281
+ const client = this.activeTransactions.get(transactionId);
282
+ if (!client) {
283
+ throw new TransactionError(`Transaction not found: ${transactionId}`);
284
+ }
285
+ await client.query(`ROLLBACK TO SAVEPOINT ${savepointName}`);
286
+ }
287
+ /**
288
+ * Get connection for a transaction
289
+ */
290
+ getTransactionConnection(transactionId) {
291
+ return this.activeTransactions.get(transactionId);
292
+ }
293
+ // =========================================================================
294
+ // Schema Operations
295
+ // =========================================================================
296
+ async getSchema() {
297
+ const tables = await this.listTables();
298
+ const views = tables.filter((t) => t.type === "view");
299
+ const materializedViews = tables.filter((t) => t.type === "materialized_view");
300
+ const realTables = tables.filter((t) => t.type === "table" || t.type === "partitioned_table");
301
+ // Performance optimization: fetch all indexes in a single query instead of N+1
302
+ const indexes = await this.getAllIndexes();
303
+ return {
304
+ tables: realTables,
305
+ views,
306
+ materializedViews,
307
+ indexes,
308
+ };
309
+ }
310
+ /**
311
+ * Get all indexes across all user tables in a single query
312
+ * Performance optimization: eliminates N+1 query pattern
313
+ * Public so it can be used by pg_get_indexes when no table is specified
314
+ */
315
+ async getAllIndexes() {
316
+ // Check cache first
317
+ const cached = this.getCached("all_indexes");
318
+ if (cached)
319
+ return cached;
320
+ const result = await this.executeQuery(`
321
+ SELECT
322
+ i.relname as name,
323
+ t.relname as table_name,
324
+ n.nspname as schema_name,
325
+ am.amname as type,
326
+ ix.indisunique as is_unique,
327
+ pg_get_indexdef(ix.indexrelid) as definition,
328
+ array_agg(a.attname ORDER BY x.ordinality) as columns,
329
+ pg_relation_size(i.oid) as size_bytes,
330
+ COALESCE(pg_stat_get_numscans(i.oid), 0) as num_scans,
331
+ COALESCE(pg_stat_get_tuples_returned(i.oid), 0) as tuples_read,
332
+ COALESCE(pg_stat_get_tuples_fetched(i.oid), 0) as tuples_fetched
333
+ FROM pg_index ix
334
+ JOIN pg_class t ON t.oid = ix.indrelid
335
+ JOIN pg_class i ON i.oid = ix.indexrelid
336
+ JOIN pg_namespace n ON n.oid = t.relnamespace
337
+ JOIN pg_am am ON am.oid = i.relam
338
+ CROSS JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS x(attnum, ordinality)
339
+ LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = x.attnum
340
+ WHERE n.nspname NOT IN ('pg_catalog', 'information_schema')
341
+ AND n.nspname !~ '^pg_toast'
342
+ GROUP BY i.relname, t.relname, n.nspname, am.amname, ix.indisunique, ix.indexrelid, i.oid
343
+ ORDER BY n.nspname, t.relname, i.relname
344
+ `);
345
+ const indexes = (result.rows ?? []).map((row) => {
346
+ const rawColumns = this.parseColumnsArray(row["columns"]);
347
+ const definition = row["definition"];
348
+ const indexType = row["type"];
349
+ return {
350
+ name: row["name"],
351
+ tableName: row["table_name"],
352
+ schemaName: row["schema_name"],
353
+ columns: this.extractIndexColumns(rawColumns, definition),
354
+ unique: row["is_unique"],
355
+ type: indexType,
356
+ sizeBytes: Number(row["size_bytes"]) || undefined,
357
+ numberOfScans: Number(row["num_scans"]) || undefined,
358
+ tuplesRead: Number(row["tuples_read"]) || undefined,
359
+ tuplesFetched: Number(row["tuples_fetched"]) || undefined,
360
+ };
361
+ });
362
+ this.setCache("all_indexes", indexes);
363
+ return indexes;
364
+ }
365
+ /**
366
+ * Parse columns from PostgreSQL array format
367
+ * Handles both native arrays and string representations like "{col1,col2}"
368
+ */
369
+ parseColumnsArray(columns) {
370
+ if (Array.isArray(columns)) {
371
+ return columns;
372
+ }
373
+ if (typeof columns === "string") {
374
+ // Handle PostgreSQL array string format: "{col1,col2}"
375
+ const trimmed = columns.replace(/^{|}$/g, "");
376
+ if (trimmed === "")
377
+ return [];
378
+ return trimmed.split(",").map((c) => c.trim().replace(/^"|"$/g, ""));
379
+ }
380
+ return [];
381
+ }
382
+ /**
383
+ * Extract expression columns from index definition when column names are NULL.
384
+ * Expression indexes (like LOWER(name)) have attnum=0 which returns NULL from pg_attribute.
385
+ * This method parses the index definition to extract the actual expressions.
386
+ */
387
+ extractIndexColumns(columns, definition) {
388
+ // If no NULL columns, return as-is
389
+ if (!columns.some((c) => c === null || c === "NULL" || c === "")) {
390
+ return columns;
391
+ }
392
+ // Find the expression portion with balanced parentheses
393
+ // Format: CREATE [UNIQUE] INDEX name ON table USING method (col1, expr1, ...) [WHERE ...]
394
+ const exprPart = this.extractIndexExpressionPart(definition);
395
+ if (!exprPart) {
396
+ return columns;
397
+ }
398
+ // Parse the column expressions, handling nested parentheses
399
+ const exprs = this.parseIndexExpressions(exprPart);
400
+ // If counts don't match, something is off - return original
401
+ if (exprs.length !== columns.length) {
402
+ return columns;
403
+ }
404
+ // Replace NULL columns with the parsed expressions
405
+ return columns.map((col, i) => {
406
+ if (col === null || col === "NULL" || col === "") {
407
+ return exprs[i]?.trim() ?? col;
408
+ }
409
+ return col;
410
+ });
411
+ }
412
+ /**
413
+ * Extract the column expression part from an index definition, handling nested parentheses.
414
+ * E.g., "CREATE INDEX idx ON tbl USING btree (lower(name))" → "lower(name)"
415
+ */
416
+ extractIndexExpressionPart(definition) {
417
+ // Find "USING method (" or just the first "(" after ON
418
+ const usingMatch = /USING\s+\w+\s*\(/i.exec(definition);
419
+ if (!usingMatch) {
420
+ return null;
421
+ }
422
+ const startIdx = usingMatch.index + usingMatch[0].length - 1; // Position of opening paren
423
+ let depth = 0;
424
+ let endIdx = -1;
425
+ for (let i = startIdx; i < definition.length; i++) {
426
+ if (definition[i] === "(") {
427
+ depth++;
428
+ }
429
+ else if (definition[i] === ")") {
430
+ depth--;
431
+ if (depth === 0) {
432
+ endIdx = i;
433
+ break;
434
+ }
435
+ }
436
+ }
437
+ if (endIdx === -1) {
438
+ return null;
439
+ }
440
+ return definition.substring(startIdx + 1, endIdx);
441
+ }
442
+ /**
443
+ * Parse index expressions from the column list, handling nested parentheses.
444
+ * E.g., "LOWER(name), id, UPPER(TRIM(email))" → ["LOWER(name)", "id", "UPPER(TRIM(email))"]
445
+ */
446
+ parseIndexExpressions(columnList) {
447
+ const result = [];
448
+ let current = "";
449
+ let depth = 0;
450
+ for (const char of columnList) {
451
+ if (char === "(") {
452
+ depth++;
453
+ current += char;
454
+ }
455
+ else if (char === ")") {
456
+ depth--;
457
+ current += char;
458
+ }
459
+ else if (char === "," && depth === 0) {
460
+ result.push(current.trim());
461
+ current = "";
462
+ }
463
+ else {
464
+ current += char;
465
+ }
466
+ }
467
+ if (current.trim()) {
468
+ result.push(current.trim());
469
+ }
470
+ return result;
471
+ }
472
+ async listTables() {
473
+ const result = await this.executeQuery(`
474
+ SELECT
475
+ c.relname as name,
476
+ n.nspname as schema,
477
+ CASE c.relkind
478
+ WHEN 'r' THEN 'table'
479
+ WHEN 'v' THEN 'view'
480
+ WHEN 'm' THEN 'materialized_view'
481
+ WHEN 'f' THEN 'foreign_table'
482
+ WHEN 'p' THEN 'partitioned_table'
483
+ END as type,
484
+ pg_catalog.pg_get_userbyid(c.relowner) as owner,
485
+ CASE WHEN c.reltuples = -1 THEN NULL ELSE c.reltuples END::bigint as row_count,
486
+ COALESCE(s.n_live_tup, 0)::bigint as live_row_estimate,
487
+ (c.reltuples = -1) as stats_stale,
488
+ pg_catalog.pg_table_size(c.oid) as size_bytes,
489
+ pg_catalog.pg_total_relation_size(c.oid) as total_size_bytes,
490
+ obj_description(c.oid, 'pg_class') as comment
491
+ FROM pg_catalog.pg_class c
492
+ LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
493
+ LEFT JOIN pg_stat_user_tables s ON s.relid = c.oid
494
+ WHERE c.relkind IN ('r', 'v', 'm', 'f', 'p')
495
+ AND n.nspname NOT IN ('pg_catalog', 'information_schema')
496
+ AND n.nspname !~ '^pg_toast'
497
+ ORDER BY n.nspname, c.relname
498
+ `);
499
+ return (result.rows ?? []).map((row) => {
500
+ const rowCount = row["row_count"];
501
+ const liveRowEstimate = Number(row["live_row_estimate"]) || 0;
502
+ const statsStale = row["stats_stale"] === true;
503
+ // Use live_row_estimate as fallback when stats are stale
504
+ const effectiveRowCount = rowCount !== null ? Number(rowCount) : liveRowEstimate;
505
+ return {
506
+ name: row["name"],
507
+ schema: row["schema"],
508
+ type: row["type"],
509
+ owner: row["owner"],
510
+ rowCount: effectiveRowCount > 0 ? effectiveRowCount : undefined,
511
+ sizeBytes: Number(row["size_bytes"]) || undefined,
512
+ totalSizeBytes: Number(row["total_size_bytes"]) || undefined,
513
+ comment: row["comment"],
514
+ statsStale,
515
+ };
516
+ });
517
+ }
518
+ async describeTable(tableName, schemaName = "public") {
519
+ // Get column information including foreign key references
520
+ const columnsResult = await this.executeQuery(`
521
+ SELECT
522
+ a.attname as name,
523
+ pg_catalog.format_type(a.atttypid, a.atttypmod) as type,
524
+ NOT a.attnotnull as nullable,
525
+ COALESCE(
526
+ (SELECT true FROM pg_constraint c
527
+ WHERE c.conrelid = a.attrelid
528
+ AND a.attnum = ANY(c.conkey)
529
+ AND c.contype = 'p'),
530
+ false
531
+ ) as primary_key,
532
+ pg_get_expr(d.adbin, d.adrelid) as default_value,
533
+ a.attgenerated != '' as is_generated,
534
+ pg_get_expr(d.adbin, d.adrelid) as generated_expression,
535
+ col_description(a.attrelid, a.attnum) as comment,
536
+ -- Foreign key reference for this column
537
+ (SELECT json_build_object(
538
+ 'table', ref_t.relname,
539
+ 'schema', ref_n.nspname,
540
+ 'column', ref_a.attname
541
+ )
542
+ FROM pg_constraint c
543
+ JOIN pg_class ref_t ON ref_t.oid = c.confrelid
544
+ JOIN pg_namespace ref_n ON ref_n.oid = ref_t.relnamespace
545
+ JOIN pg_attribute ref_a ON ref_a.attrelid = ref_t.oid
546
+ AND ref_a.attnum = c.confkey[array_position(c.conkey, a.attnum)]
547
+ WHERE c.conrelid = a.attrelid
548
+ AND a.attnum = ANY(c.conkey)
549
+ AND c.contype = 'f'
550
+ LIMIT 1
551
+ ) as foreign_key
552
+ FROM pg_catalog.pg_attribute a
553
+ LEFT JOIN pg_catalog.pg_attrdef d ON (a.attrelid, a.attnum) = (d.adrelid, d.adnum)
554
+ WHERE a.attrelid = ($1 || '.' || $2)::regclass
555
+ AND a.attnum > 0
556
+ AND NOT a.attisdropped
557
+ ORDER BY a.attnum
558
+ `, [schemaName, tableName]);
559
+ const columns = (columnsResult.rows ?? []).map((row) => {
560
+ const isGenerated = row["is_generated"];
561
+ const fkRef = row["foreign_key"];
562
+ const nullable = row["nullable"];
563
+ return {
564
+ name: row["name"],
565
+ type: row["type"],
566
+ nullable,
567
+ notNull: !nullable, // Alias for consistency with createTable API
568
+ primaryKey: row["primary_key"],
569
+ defaultValue: row["default_value"],
570
+ isGenerated,
571
+ // Only set generatedExpression for actual generated columns
572
+ generatedExpression: isGenerated
573
+ ? row["generated_expression"]
574
+ : undefined,
575
+ comment: row["comment"],
576
+ // Include foreign key reference if present
577
+ foreignKey: fkRef
578
+ ? {
579
+ table: fkRef.table,
580
+ schema: fkRef.schema,
581
+ column: fkRef.column,
582
+ }
583
+ : undefined,
584
+ };
585
+ });
586
+ // Get table info
587
+ const tableResult = await this.executeQuery(`
588
+ SELECT
589
+ CASE c.relkind
590
+ WHEN 'r' THEN 'table'
591
+ WHEN 'v' THEN 'view'
592
+ WHEN 'm' THEN 'materialized_view'
593
+ WHEN 'f' THEN 'foreign_table'
594
+ WHEN 'p' THEN 'partitioned_table'
595
+ END as type,
596
+ pg_catalog.pg_get_userbyid(c.relowner) as owner,
597
+ c.reltuples::bigint as row_count,
598
+ obj_description(c.oid, 'pg_class') as comment,
599
+ c.relkind = 'p' as is_partitioned,
600
+ pg_get_partkeydef(c.oid) as partition_key
601
+ FROM pg_catalog.pg_class c
602
+ LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
603
+ WHERE c.relname = $1
604
+ AND n.nspname = $2
605
+ `, [tableName, schemaName]);
606
+ const tableRow = tableResult.rows?.[0];
607
+ // Get indexes for this table
608
+ const indexesResult = await this.executeQuery(`
609
+ SELECT
610
+ i.relname as name,
611
+ am.amname as type,
612
+ ix.indisunique as is_unique,
613
+ ix.indisprimary as is_primary,
614
+ pg_get_indexdef(ix.indexrelid) as definition,
615
+ array_agg(a.attname ORDER BY x.ordinality) as columns
616
+ FROM pg_index ix
617
+ JOIN pg_class t ON t.oid = ix.indrelid
618
+ JOIN pg_class i ON i.oid = ix.indexrelid
619
+ JOIN pg_namespace n ON n.oid = t.relnamespace
620
+ JOIN pg_am am ON am.oid = i.relam
621
+ CROSS JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS x(attnum, ordinality)
622
+ LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = x.attnum
623
+ WHERE t.relname = $1 AND n.nspname = $2
624
+ GROUP BY i.relname, am.amname, ix.indisunique, ix.indisprimary, ix.indexrelid
625
+ ORDER BY i.relname
626
+ `, [tableName, schemaName]);
627
+ const indexes = (indexesResult.rows ?? []).map((row) => {
628
+ const rawColumns = this.parseColumnsArray(row["columns"]);
629
+ const definition = row["definition"];
630
+ return {
631
+ name: row["name"],
632
+ type: row["type"],
633
+ isUnique: row["is_unique"],
634
+ isPrimary: row["is_primary"],
635
+ columns: this.extractIndexColumns(rawColumns, definition),
636
+ definition,
637
+ };
638
+ });
639
+ // Get constraints (CHECK, UNIQUE, PRIMARY KEY, EXCLUSION - FK handled separately)
640
+ const constraintsResult = await this.executeQuery(`
641
+ SELECT
642
+ c.conname as name,
643
+ CASE c.contype
644
+ WHEN 'p' THEN 'primary_key'
645
+ WHEN 'c' THEN 'check'
646
+ WHEN 'u' THEN 'unique'
647
+ WHEN 'x' THEN 'exclusion'
648
+ END as type,
649
+ pg_get_constraintdef(c.oid) as definition,
650
+ array_agg(a.attname ORDER BY x.ordinality) FILTER (WHERE a.attname IS NOT NULL) as columns
651
+ FROM pg_constraint c
652
+ JOIN pg_class t ON t.oid = c.conrelid
653
+ JOIN pg_namespace n ON n.oid = t.relnamespace
654
+ LEFT JOIN LATERAL unnest(c.conkey) WITH ORDINALITY AS x(attnum, ordinality) ON true
655
+ LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = x.attnum
656
+ WHERE t.relname = $1
657
+ AND n.nspname = $2
658
+ AND c.contype IN ('p', 'c', 'u', 'x')
659
+ GROUP BY c.conname, c.contype, c.oid
660
+ ORDER BY
661
+ CASE c.contype WHEN 'p' THEN 0 WHEN 'u' THEN 1 WHEN 'c' THEN 2 ELSE 3 END,
662
+ c.conname
663
+ `, [tableName, schemaName]);
664
+ const constraints = (constraintsResult.rows ?? []).map((row) => ({
665
+ name: row["name"],
666
+ type: row["type"],
667
+ definition: row["definition"],
668
+ columns: this.parseColumnsArray(row["columns"]),
669
+ }));
670
+ // Add NOT NULL "constraints" from column info (synthetic constraint entries)
671
+ const notNullConstraints = [];
672
+ for (const col of columns) {
673
+ if (!col.nullable && !col.primaryKey) {
674
+ // Skip primary key columns as they have inherent NOT NULL
675
+ notNullConstraints.push({
676
+ name: `${col.name}_not_null`,
677
+ type: "not_null",
678
+ definition: `NOT NULL`,
679
+ columns: [col.name],
680
+ });
681
+ }
682
+ }
683
+ // Get foreign keys
684
+ const foreignKeysResult = await this.executeQuery(`
685
+ SELECT
686
+ c.conname as name,
687
+ a.attname as column,
688
+ ref_t.relname as referenced_table,
689
+ ref_n.nspname as referenced_schema,
690
+ ref_a.attname as referenced_column,
691
+ CASE c.confupdtype
692
+ WHEN 'a' THEN 'NO ACTION'
693
+ WHEN 'r' THEN 'RESTRICT'
694
+ WHEN 'c' THEN 'CASCADE'
695
+ WHEN 'n' THEN 'SET NULL'
696
+ WHEN 'd' THEN 'SET DEFAULT'
697
+ END as on_update,
698
+ CASE c.confdeltype
699
+ WHEN 'a' THEN 'NO ACTION'
700
+ WHEN 'r' THEN 'RESTRICT'
701
+ WHEN 'c' THEN 'CASCADE'
702
+ WHEN 'n' THEN 'SET NULL'
703
+ WHEN 'd' THEN 'SET DEFAULT'
704
+ END as on_delete
705
+ FROM pg_constraint c
706
+ JOIN pg_class t ON t.oid = c.conrelid
707
+ JOIN pg_namespace n ON n.oid = t.relnamespace
708
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(c.conkey)
709
+ JOIN pg_class ref_t ON ref_t.oid = c.confrelid
710
+ JOIN pg_namespace ref_n ON ref_n.oid = ref_t.relnamespace
711
+ JOIN pg_attribute ref_a ON ref_a.attrelid = ref_t.oid AND ref_a.attnum = ANY(c.confkey)
712
+ WHERE t.relname = $1
713
+ AND n.nspname = $2
714
+ AND c.contype = 'f'
715
+ ORDER BY c.conname
716
+ `, [tableName, schemaName]);
717
+ const foreignKeys = (foreignKeysResult.rows ?? []).map((row) => ({
718
+ name: row["name"],
719
+ column: row["column"],
720
+ referencedTable: row["referenced_table"],
721
+ referencedSchema: row["referenced_schema"],
722
+ referencedColumn: row["referenced_column"],
723
+ onUpdate: row["on_update"],
724
+ onDelete: row["on_delete"],
725
+ }));
726
+ // Extract primary key columns from constraints for convenience
727
+ const pkConstraint = constraints.find((c) => c.type === "primary_key");
728
+ const primaryKey = pkConstraint?.columns ?? null;
729
+ return {
730
+ name: tableName,
731
+ schema: schemaName,
732
+ type: tableRow?.["type"] ?? "table",
733
+ owner: tableRow?.["owner"],
734
+ rowCount: Number(tableRow?.["row_count"]) || undefined,
735
+ comment: tableRow?.["comment"],
736
+ isPartitioned: tableRow?.["is_partitioned"],
737
+ partitionKey: tableRow?.["partition_key"],
738
+ columns,
739
+ primaryKey,
740
+ indexes,
741
+ constraints: [...constraints, ...notNullConstraints],
742
+ foreignKeys,
743
+ };
744
+ }
745
+ async listSchemas() {
746
+ const result = await this.executeQuery(`
747
+ SELECT nspname
748
+ FROM pg_catalog.pg_namespace
749
+ WHERE nspname NOT IN ('pg_catalog', 'information_schema')
750
+ AND nspname !~ '^pg_toast'
751
+ AND nspname !~ '^pg_temp'
752
+ ORDER BY nspname
753
+ `);
754
+ return (result.rows ?? []).map((row) => row["nspname"]);
755
+ }
756
+ /**
757
+ * Get indexes for a table
758
+ */
759
+ async getTableIndexes(tableName, schemaName = "public") {
760
+ const result = await this.executeQuery(`
761
+ SELECT
762
+ i.relname as name,
763
+ am.amname as type,
764
+ ix.indisunique as is_unique,
765
+ pg_get_indexdef(ix.indexrelid) as definition,
766
+ array_agg(a.attname ORDER BY x.ordinality) as columns,
767
+ pg_relation_size(i.oid) as size_bytes,
768
+ COALESCE(pg_stat_get_numscans(i.oid), 0) as num_scans,
769
+ COALESCE(pg_stat_get_tuples_returned(i.oid), 0) as tuples_read,
770
+ COALESCE(pg_stat_get_tuples_fetched(i.oid), 0) as tuples_fetched
771
+ FROM pg_index ix
772
+ JOIN pg_class t ON t.oid = ix.indrelid
773
+ JOIN pg_class i ON i.oid = ix.indexrelid
774
+ JOIN pg_namespace n ON n.oid = t.relnamespace
775
+ JOIN pg_am am ON am.oid = i.relam
776
+ CROSS JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS x(attnum, ordinality)
777
+ LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = x.attnum
778
+ WHERE t.relname = $1
779
+ AND n.nspname = $2
780
+ GROUP BY i.relname, am.amname, ix.indisunique, ix.indexrelid, i.oid
781
+ ORDER BY i.relname
782
+ `, [tableName, schemaName]);
783
+ return (result.rows ?? []).map((row) => {
784
+ const rawColumns = this.parseColumnsArray(row["columns"]);
785
+ const definition = row["definition"];
786
+ const indexType = row["type"];
787
+ return {
788
+ name: row["name"],
789
+ tableName,
790
+ schemaName,
791
+ columns: this.extractIndexColumns(rawColumns, definition),
792
+ unique: row["is_unique"],
793
+ type: indexType,
794
+ sizeBytes: Number(row["size_bytes"]) || undefined,
795
+ numberOfScans: Number(row["num_scans"]) || undefined,
796
+ tuplesRead: Number(row["tuples_read"]) || undefined,
797
+ tuplesFetched: Number(row["tuples_fetched"]) || undefined,
798
+ };
799
+ });
800
+ }
801
+ /**
802
+ * Check if an extension is available
803
+ */
804
+ async isExtensionAvailable(extensionName) {
805
+ const result = await this.executeQuery(`
806
+ SELECT EXISTS(
807
+ SELECT 1 FROM pg_extension WHERE extname = $1
808
+ ) as available
809
+ `, [extensionName]);
810
+ return result.rows?.[0]?.["available"] ?? false;
811
+ }
812
+ // =========================================================================
813
+ // Capabilities
814
+ // =========================================================================
815
+ getCapabilities() {
816
+ return {
817
+ json: true,
818
+ fullTextSearch: true,
819
+ vector: true, // With pgvector extension
820
+ geospatial: true, // With PostGIS extension
821
+ transactions: true,
822
+ preparedStatements: true,
823
+ connectionPooling: true,
824
+ partitioning: true,
825
+ replication: true,
826
+ cte: true,
827
+ windowFunctions: true,
828
+ };
829
+ }
830
+ getSupportedToolGroups() {
831
+ return [
832
+ "core",
833
+ "transactions",
834
+ "jsonb",
835
+ "text",
836
+ "performance",
837
+ "admin",
838
+ "monitoring",
839
+ "backup",
840
+ "schema",
841
+ "vector",
842
+ "postgis",
843
+ "partitioning",
844
+ "stats",
845
+ "cron",
846
+ "partman",
847
+ "kcache",
848
+ "citext",
849
+ "ltree",
850
+ "pgcrypto",
851
+ "codemode",
852
+ ];
853
+ }
854
+ // =========================================================================
855
+ // Tool/Resource/Prompt Registration
856
+ // =========================================================================
857
+ getToolDefinitions() {
858
+ // Performance optimization: cache tool definitions (immutable after creation)
859
+ if (this.cachedToolDefinitions) {
860
+ return this.cachedToolDefinitions;
861
+ }
862
+ this.cachedToolDefinitions = [
863
+ ...getCoreTools(this),
864
+ ...getTransactionTools(this),
865
+ ...getJsonbTools(this),
866
+ ...getTextTools(this),
867
+ ...getPerformanceTools(this),
868
+ ...getAdminTools(this),
869
+ ...getMonitoringTools(this),
870
+ ...getBackupTools(this),
871
+ ...getSchemaTools(this),
872
+ ...getVectorTools(this),
873
+ ...getPostgisTools(this),
874
+ ...getPartitioningTools(this),
875
+ ...getStatsTools(this),
876
+ ...getCronTools(this),
877
+ ...getPartmanTools(this),
878
+ ...getKcacheTools(this),
879
+ ...getCitextTools(this),
880
+ ...getLtreeTools(this),
881
+ ...getPgcryptoTools(this),
882
+ ...getCodeModeTools(this),
883
+ ];
884
+ return this.cachedToolDefinitions;
885
+ }
886
+ getResourceDefinitions() {
887
+ return getPostgresResources(this);
888
+ }
889
+ getPromptDefinitions() {
890
+ return getPostgresPrompts(this);
891
+ }
892
+ // =========================================================================
893
+ // Helpers
894
+ // =========================================================================
895
+ /**
896
+ * Get the connection pool (for monitoring tools)
897
+ */
898
+ getPool() {
899
+ return this.pool;
900
+ }
901
+ }
902
+ //# sourceMappingURL=PostgresAdapter.js.map