@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
@@ -0,0 +1,767 @@
1
+ /**
2
+ * PostgreSQL pgvector - Query & Analysis Operations
3
+ *
4
+ * Read/analysis tools: search, createIndex, distance, normalize, aggregate, validate.
5
+ */
6
+ import { z } from "zod";
7
+ import { readOnly, write } from "../../../../utils/annotations.js";
8
+ import { getToolIcons } from "../../../../utils/icons.js";
9
+ import { formatPostgresError } from "../core/error-helpers.js";
10
+ import { sanitizeIdentifier, sanitizeTableName, } from "../../../../utils/identifiers.js";
11
+ import { sanitizeWhereClause } from "../../../../utils/where-clause.js";
12
+ import { parseVector, truncateVector, checkTableAndColumn } from "./data.js";
13
+ import {
14
+ // Base schemas for MCP visibility (Split Schema pattern)
15
+ VectorSearchSchemaBase, VectorCreateIndexSchemaBase,
16
+ // Transformed schemas for handler validation
17
+ VectorSearchSchema, VectorCreateIndexSchema,
18
+ // Output schemas
19
+ VectorSearchOutputSchema, VectorCreateIndexOutputSchema, VectorDistanceOutputSchema, VectorNormalizeOutputSchema, VectorAggregateOutputSchema, VectorValidateOutputSchema, } from "../../schemas/index.js";
20
+ export function createVectorSearchTool(adapter) {
21
+ return {
22
+ name: "pg_vector_search",
23
+ description: 'Search for similar vectors. Requires: table, column, vector. Use select param to include identifying columns (e.g., select: ["id", "name"]).',
24
+ group: "vector",
25
+ // Use base schema for MCP visibility (Split Schema pattern)
26
+ inputSchema: VectorSearchSchemaBase,
27
+ outputSchema: VectorSearchOutputSchema,
28
+ annotations: readOnly("Vector Search"),
29
+ icons: getToolIcons("vector", readOnly("Vector Search")),
30
+ handler: async (params, _context) => {
31
+ try {
32
+ // Use transformed schema for alias resolution
33
+ const { table, column, vector, metric, limit, select, where, schema } = VectorSearchSchema.parse(params);
34
+ // Validate required params with clear errors
35
+ if (table === "") {
36
+ return {
37
+ success: false,
38
+ error: "table (or tableName) parameter is required",
39
+ requiredParams: ["table", "column", "vector"],
40
+ };
41
+ }
42
+ if (column === "") {
43
+ return {
44
+ success: false,
45
+ error: "column (or col) parameter is required for the vector column name",
46
+ requiredParams: ["table", "column", "vector"],
47
+ };
48
+ }
49
+ const tableName = sanitizeTableName(table, schema);
50
+ const columnName = sanitizeIdentifier(column);
51
+ const schemaName = schema ?? "public";
52
+ // Two-step existence check: table first, then column
53
+ const existenceCheck = await checkTableAndColumn(adapter, table, column, schemaName);
54
+ if (existenceCheck) {
55
+ return { success: false, ...existenceCheck };
56
+ }
57
+ // Validate column is actually a vector type
58
+ const typeCheckSql = `
59
+ SELECT udt_name FROM information_schema.columns
60
+ WHERE table_schema = $1 AND table_name = $2 AND column_name = $3
61
+ `;
62
+ const typeResult = await adapter.executeQuery(typeCheckSql, [
63
+ schemaName,
64
+ table,
65
+ column,
66
+ ]);
67
+ const udtName = typeResult.rows?.[0]?.["udt_name"];
68
+ if (udtName !== "vector") {
69
+ return {
70
+ success: false,
71
+ error: `Column '${column}' is not a vector column (type: ${udtName ?? "unknown"})`,
72
+ suggestion: "Use a column with vector type, or use pg_vector_add_column to create one",
73
+ };
74
+ }
75
+ const vectorStr = `[${vector.join(",")}]`;
76
+ const limitVal = limit ?? 10;
77
+ const selectCols = select !== undefined && select.length > 0
78
+ ? select.map((c) => sanitizeIdentifier(c)).join(", ") + ", "
79
+ : "";
80
+ const whereClause = where ? ` AND ${sanitizeWhereClause(where)}` : "";
81
+ const { excludeNull } = VectorSearchSchema.parse(params);
82
+ const nullFilter = excludeNull === true ? ` AND ${columnName} IS NOT NULL` : "";
83
+ let distanceExpr;
84
+ switch (metric) {
85
+ case "cosine":
86
+ distanceExpr = `${columnName} <=> '${vectorStr}'`;
87
+ break;
88
+ case "inner_product":
89
+ distanceExpr = `${columnName} <#>'${vectorStr}'`;
90
+ break;
91
+ default: // l2
92
+ distanceExpr = `${columnName} <-> '${vectorStr}'`;
93
+ }
94
+ const sql = `SELECT ${selectCols}${distanceExpr} as distance
95
+ FROM ${tableName}
96
+ WHERE TRUE${nullFilter}${whereClause}
97
+ ORDER BY ${distanceExpr}
98
+ LIMIT ${String(limitVal)} `;
99
+ try {
100
+ const result = await adapter.executeQuery(sql);
101
+ // Check for NULL distance values (from NULL vectors)
102
+ const nullCount = (result.rows ?? []).filter((r) => r["distance"] === null).length;
103
+ const response = {
104
+ results: result.rows,
105
+ count: result.rows?.length ?? 0,
106
+ metric: metric ?? "l2",
107
+ };
108
+ // Add hint when no select columns specified
109
+ if (select === undefined || select.length === 0) {
110
+ response["hint"] =
111
+ 'Results only contain distance. Use select param (e.g., select: ["id", "name"]) to include identifying columns.';
112
+ }
113
+ // Note about NULL vectors
114
+ if (nullCount > 0) {
115
+ response["note"] =
116
+ `${String(nullCount)} result(s) have NULL distance (rows with NULL vectors). Filter with WHERE ${column} IS NOT NULL.`;
117
+ }
118
+ return response;
119
+ }
120
+ catch (error) {
121
+ // Parse dimension mismatch errors for user-friendly message
122
+ if (error instanceof Error) {
123
+ const dimMatch = /different vector dimensions (\d+) and (\d+)/.exec(error.message);
124
+ if (dimMatch) {
125
+ const expectedDim = dimMatch[1] ?? "0";
126
+ const providedDim = dimMatch[2] ?? "0";
127
+ return {
128
+ success: false,
129
+ error: `Vector dimension mismatch: column '${column}' expects ${expectedDim} dimensions, but you provided ${providedDim} dimensions.`,
130
+ expectedDimensions: parseInt(expectedDim, 10),
131
+ providedDimensions: parseInt(providedDim, 10),
132
+ suggestion: "Ensure your query vector has the same dimensions as the column.",
133
+ };
134
+ }
135
+ }
136
+ throw error;
137
+ }
138
+ }
139
+ catch (error) {
140
+ return {
141
+ success: false,
142
+ error: formatPostgresError(error, { tool: "pg_vector_search" }),
143
+ };
144
+ }
145
+ },
146
+ };
147
+ }
148
+ export function createVectorCreateIndexTool(adapter) {
149
+ return {
150
+ name: "pg_vector_create_index",
151
+ description: "Create vector index. Requires: table, column, type (ivfflat or hnsw).",
152
+ group: "vector",
153
+ // Use base schema for MCP visibility (Split Schema pattern)
154
+ inputSchema: VectorCreateIndexSchemaBase,
155
+ outputSchema: VectorCreateIndexOutputSchema,
156
+ annotations: write("Create Vector Index"),
157
+ icons: getToolIcons("vector", write("Create Vector Index")),
158
+ handler: async (params, _context) => {
159
+ try {
160
+ // Use transformed schema for alias resolution
161
+ const { table, column, type, metric, ifNotExists, lists, m, efConstruction, schema, } = VectorCreateIndexSchema.parse(params);
162
+ // Validate required params with clear errors
163
+ if (table === "") {
164
+ return {
165
+ success: false,
166
+ error: "table (or tableName) parameter is required",
167
+ requiredParams: ["table", "column", "type"],
168
+ };
169
+ }
170
+ if (column === "") {
171
+ return {
172
+ success: false,
173
+ error: "column (or col) parameter is required for the vector column name",
174
+ requiredParams: ["table", "column", "type"],
175
+ };
176
+ }
177
+ // Refine guarantees type is defined, but TypeScript can't narrow through .refine()
178
+ if (type === undefined) {
179
+ return {
180
+ success: false,
181
+ error: "type (or method alias) is required",
182
+ requiredParams: ["table", "column", "type"],
183
+ };
184
+ }
185
+ // P154: Verify table and column exist before attempting index creation
186
+ const existenceError = await checkTableAndColumn(adapter, table, column, schema ?? "public");
187
+ if (existenceError !== null) {
188
+ return { success: false, ...existenceError };
189
+ }
190
+ const tableName = sanitizeTableName(table, schema);
191
+ const columnName = sanitizeIdentifier(column);
192
+ // Include metric in index name to allow multiple indexes with different metrics
193
+ const metricSuffix = metric !== "l2" ? `_${metric}` : "";
194
+ const indexNameRaw = `idx_${table}_${column}_${type}${metricSuffix}`;
195
+ const indexName = sanitizeIdentifier(indexNameRaw);
196
+ // Map metric to PostgreSQL operator class
197
+ const opsMap = {
198
+ l2: "vector_l2_ops",
199
+ cosine: "vector_cosine_ops",
200
+ inner_product: "vector_ip_ops",
201
+ };
202
+ const opsClass = opsMap[metric] ?? "vector_l2_ops";
203
+ // If ifNotExists is true, check if index already exists BEFORE creating
204
+ if (ifNotExists === true) {
205
+ const checkSql = `
206
+ SELECT 1 FROM pg_indexes
207
+ WHERE indexname = $1
208
+ `;
209
+ const checkResult = await adapter.executeQuery(checkSql, [
210
+ indexNameRaw,
211
+ ]);
212
+ if (checkResult.rows && checkResult.rows.length > 0) {
213
+ return {
214
+ success: true,
215
+ index: indexNameRaw,
216
+ type,
217
+ metric,
218
+ table,
219
+ column,
220
+ ifNotExists: true,
221
+ alreadyExists: true,
222
+ message: `Index ${indexNameRaw} already exists`,
223
+ };
224
+ }
225
+ }
226
+ let withClause;
227
+ let appliedParams;
228
+ if (type === "ivfflat") {
229
+ const numLists = lists ?? 100;
230
+ withClause = `WITH(lists = ${String(numLists)})`;
231
+ appliedParams = { lists: numLists };
232
+ }
233
+ else {
234
+ // hnsw
235
+ const mVal = m ?? 16;
236
+ const efVal = efConstruction ?? 64;
237
+ withClause = `WITH(m = ${String(mVal)}, ef_construction = ${String(efVal)})`;
238
+ appliedParams = { m: mVal, efConstruction: efVal };
239
+ }
240
+ const sql = `CREATE INDEX ${indexName} ON ${tableName} USING ${type} (${columnName} ${opsClass}) ${withClause} `;
241
+ try {
242
+ await adapter.executeQuery(sql);
243
+ return {
244
+ success: true,
245
+ index: indexNameRaw,
246
+ type,
247
+ metric,
248
+ table,
249
+ column,
250
+ appliedParams,
251
+ ifNotExists: ifNotExists ?? false,
252
+ };
253
+ }
254
+ catch (error) {
255
+ if (error instanceof Error) {
256
+ // If ifNotExists is true and the error is "already exists", return success with alreadyExists flag
257
+ // (This handles race conditions where index is created between check and create)
258
+ if (ifNotExists === true) {
259
+ const msg = error.message.toLowerCase();
260
+ if (msg.includes("already exists") || msg.includes("duplicate")) {
261
+ return {
262
+ success: true,
263
+ index: indexNameRaw,
264
+ type,
265
+ table,
266
+ column,
267
+ ifNotExists: true,
268
+ alreadyExists: true,
269
+ message: `Index ${indexNameRaw} already exists`,
270
+ };
271
+ }
272
+ }
273
+ // Handle non-vector column errors (operator class does not accept data type)
274
+ const opClassMatch = /does not accept data type (\w+)/.exec(error.message);
275
+ if (opClassMatch) {
276
+ return {
277
+ success: false,
278
+ error: `Column '${column}' is not a vector column (type: ${opClassMatch[1] ?? "unknown"}). Vector indexes can only be created on vector columns.`,
279
+ suggestion: "Use a column with vector type, or use pg_vector_add_column to create one",
280
+ };
281
+ }
282
+ }
283
+ // Re-throw other errors
284
+ throw error;
285
+ }
286
+ }
287
+ catch (error) {
288
+ return {
289
+ success: false,
290
+ error: formatPostgresError(error, { tool: "pg_vector_create_index" }),
291
+ };
292
+ }
293
+ },
294
+ };
295
+ }
296
+ export function createVectorDistanceTool(adapter) {
297
+ // Base schema for MCP visibility — arrays optional to prevent MCP -32602 rejection
298
+ const DistanceSchemaBase = z.object({
299
+ vector1: z.array(z.number()).optional(),
300
+ vector2: z.array(z.number()).optional(),
301
+ metric: z.enum(["l2", "cosine", "inner_product"]).optional(),
302
+ });
303
+ return {
304
+ name: "pg_vector_distance",
305
+ description: "Calculate distance between two vectors. Valid metrics: l2 (default), cosine, inner_product.",
306
+ group: "vector",
307
+ inputSchema: DistanceSchemaBase,
308
+ outputSchema: VectorDistanceOutputSchema,
309
+ annotations: readOnly("Vector Distance"),
310
+ icons: getToolIcons("vector", readOnly("Vector Distance")),
311
+ handler: async (params, _context) => {
312
+ try {
313
+ const parsed = DistanceSchemaBase.parse(params ?? {});
314
+ // Validate required params
315
+ if (!parsed.vector1 || !parsed.vector2) {
316
+ return {
317
+ success: false,
318
+ error: "Validation error: vector1 and vector2 are required",
319
+ suggestion: "Provide two vectors to calculate distance between them",
320
+ };
321
+ }
322
+ // Validate dimension match before query
323
+ if (parsed.vector1.length !== parsed.vector2.length) {
324
+ return {
325
+ success: false,
326
+ error: `Vector dimensions must match: vector1 has ${String(parsed.vector1.length)} dimensions, vector2 has ${String(parsed.vector2.length)} dimensions`,
327
+ suggestion: "Ensure both vectors have the same number of dimensions",
328
+ };
329
+ }
330
+ const v1 = `[${parsed.vector1.join(",")}]`;
331
+ const v2 = `[${parsed.vector2.join(",")}]`;
332
+ const metric = parsed.metric ?? "l2";
333
+ let op;
334
+ switch (metric) {
335
+ case "cosine":
336
+ op = "<=>";
337
+ break;
338
+ case "inner_product":
339
+ op = "<#>";
340
+ break;
341
+ default:
342
+ op = "<->"; // l2
343
+ }
344
+ const sql = `SELECT '${v1}'::vector ${op} '${v2}':: vector as distance`;
345
+ const result = await adapter.executeQuery(sql);
346
+ return { distance: result.rows?.[0]?.["distance"], metric };
347
+ }
348
+ catch (error) {
349
+ return {
350
+ success: false,
351
+ error: formatPostgresError(error, { tool: "pg_vector_distance" }),
352
+ };
353
+ }
354
+ },
355
+ };
356
+ }
357
+ export function createVectorNormalizeTool() {
358
+ // Base schema for MCP visibility — array optional to prevent MCP -32602 rejection
359
+ const NormalizeSchemaBase = z.object({
360
+ vector: z
361
+ .array(z.number())
362
+ .optional()
363
+ .describe("Vector to normalize to unit length"),
364
+ });
365
+ return {
366
+ name: "pg_vector_normalize",
367
+ description: "Normalize a vector to unit length.",
368
+ group: "vector",
369
+ inputSchema: NormalizeSchemaBase,
370
+ outputSchema: VectorNormalizeOutputSchema,
371
+ annotations: readOnly("Normalize Vector"),
372
+ icons: getToolIcons("vector", readOnly("Normalize Vector")),
373
+ handler: (params, _context) => {
374
+ try {
375
+ const parsed = NormalizeSchemaBase.parse(params ?? {});
376
+ // Validate required param
377
+ if (!parsed.vector) {
378
+ return Promise.resolve({
379
+ success: false,
380
+ error: "Validation error: vector is required",
381
+ suggestion: "Provide a vector array to normalize, e.g., [3, 4]",
382
+ });
383
+ }
384
+ const magnitude = Math.sqrt(parsed.vector.reduce((sum, x) => sum + x * x, 0));
385
+ // Check for zero vector
386
+ if (magnitude === 0) {
387
+ return Promise.resolve({
388
+ success: false,
389
+ error: "Cannot normalize a zero vector (all values are 0)",
390
+ suggestion: "Provide a vector with at least one non-zero value",
391
+ magnitude: 0,
392
+ });
393
+ }
394
+ const normalized = parsed.vector.map((x) => x / magnitude);
395
+ return Promise.resolve({ normalized, magnitude });
396
+ }
397
+ catch (error) {
398
+ return Promise.resolve({
399
+ success: false,
400
+ error: formatPostgresError(error, { tool: "pg_vector_normalize" }),
401
+ });
402
+ }
403
+ },
404
+ };
405
+ }
406
+ export function createVectorAggregateTool(adapter) {
407
+ // Base schema exposes all properties to MCP without transform
408
+ const AggregateSchemaBase = z.object({
409
+ table: z.string().optional().describe("Table name"),
410
+ tableName: z.string().optional().describe("Alias for table"),
411
+ column: z.string().optional().describe("Vector column"),
412
+ col: z.string().optional().describe("Alias for column"),
413
+ where: z.string().optional(),
414
+ groupBy: z.string().optional().describe("Column to group results by"),
415
+ schema: z.string().optional().describe("Database schema (default: public)"),
416
+ excludeNullGroups: z
417
+ .boolean()
418
+ .optional()
419
+ .describe("Filter out groups with NULL average vectors"),
420
+ summarizeVector: z
421
+ .boolean()
422
+ .optional()
423
+ .describe("Truncate large vectors to preview (default: true)"),
424
+ });
425
+ // Transformed schema applies alias resolution
426
+ const AggregateSchema = AggregateSchemaBase.transform((data) => ({
427
+ table: data.table ?? data.tableName ?? "",
428
+ column: data.column ?? data.col ?? "",
429
+ where: data.where,
430
+ groupBy: data.groupBy,
431
+ schema: data.schema,
432
+ excludeNullGroups: data.excludeNullGroups,
433
+ summarizeVector: data.summarizeVector ?? true,
434
+ }));
435
+ return {
436
+ name: "pg_vector_aggregate",
437
+ description: "Calculate average vector. Requires: table, column. Optional: groupBy, where.",
438
+ group: "vector",
439
+ inputSchema: AggregateSchemaBase,
440
+ outputSchema: VectorAggregateOutputSchema,
441
+ annotations: readOnly("Vector Aggregate"),
442
+ icons: getToolIcons("vector", readOnly("Vector Aggregate")),
443
+ handler: async (params, _context) => {
444
+ try {
445
+ const parsed = AggregateSchema.parse(params);
446
+ // Validate required params with clear errors
447
+ if (parsed.table === "") {
448
+ return {
449
+ success: false,
450
+ error: "table (or tableName) parameter is required",
451
+ requiredParams: ["table", "column"],
452
+ };
453
+ }
454
+ if (parsed.column === "") {
455
+ return {
456
+ success: false,
457
+ error: "column (or col) parameter is required for the vector column name",
458
+ requiredParams: ["table", "column"],
459
+ };
460
+ }
461
+ // Parse schema.table format (embedded schema takes priority over explicit schema param)
462
+ let resolvedTable = parsed.table;
463
+ let resolvedSchema = parsed.schema;
464
+ if (parsed.table.includes(".")) {
465
+ const parts = parsed.table.split(".");
466
+ resolvedSchema = parts[0] ?? parsed.schema ?? "public";
467
+ resolvedTable = parts[1] ?? parsed.table;
468
+ }
469
+ const schemaName = resolvedSchema ?? "public";
470
+ // Two-step existence check: table first, then column
471
+ const existenceCheck = await checkTableAndColumn(adapter, resolvedTable, parsed.column, schemaName);
472
+ if (existenceCheck) {
473
+ return { success: false, ...existenceCheck };
474
+ }
475
+ // Validate column is actually a vector type
476
+ const typeCheckSql = `
477
+ SELECT udt_name FROM information_schema.columns
478
+ WHERE table_schema = $1 AND table_name = $2 AND column_name = $3
479
+ `;
480
+ const typeResult = await adapter.executeQuery(typeCheckSql, [
481
+ schemaName,
482
+ resolvedTable,
483
+ parsed.column,
484
+ ]);
485
+ const udtName = typeResult.rows?.[0]?.["udt_name"];
486
+ if (udtName !== "vector") {
487
+ return {
488
+ success: false,
489
+ error: `Column '${parsed.column}' is not a vector column (type: ${udtName ?? "unknown"})`,
490
+ suggestion: "Use a column with vector type, or use pg_vector_add_column to create one",
491
+ };
492
+ }
493
+ const whereClause = parsed.where !== undefined
494
+ ? ` WHERE ${sanitizeWhereClause(parsed.where)} `
495
+ : "";
496
+ const tableName = sanitizeTableName(resolvedTable, resolvedSchema);
497
+ const columnName = sanitizeIdentifier(parsed.column);
498
+ // Handle groupBy mode
499
+ if (parsed.groupBy !== undefined) {
500
+ // Validate groupBy is a simple column name, not an expression
501
+ let groupByCol;
502
+ try {
503
+ groupByCol = sanitizeIdentifier(parsed.groupBy);
504
+ }
505
+ catch {
506
+ return {
507
+ success: false,
508
+ error: `Invalid groupBy value: '${parsed.groupBy}' is not a valid column name`,
509
+ suggestion: "groupBy only supports simple column names (not expressions like LOWER(column)). Use a direct column reference.",
510
+ };
511
+ }
512
+ const sql = `SELECT ${groupByCol} as group_key, avg(${columnName})::text as average_vector, count(*):: integer as count
513
+ FROM ${tableName}${whereClause}
514
+ GROUP BY ${groupByCol}
515
+ ORDER BY ${groupByCol} `;
516
+ const result = await adapter.executeQuery(sql);
517
+ let groups = result.rows?.map((row) => {
518
+ const vec = parseVector(row["average_vector"]);
519
+ return {
520
+ group_key: row["group_key"],
521
+ average_vector: parsed.summarizeVector && vec !== null
522
+ ? truncateVector(vec)
523
+ : (vec ?? row["average_vector"]),
524
+ count: typeof row["count"] === "string"
525
+ ? parseInt(row["count"], 10)
526
+ : (row["count"] ?? 0),
527
+ };
528
+ }) ?? [];
529
+ // Check for groups with NULL average vector
530
+ const nullGroups = groups.filter((g) => g.average_vector === null ||
531
+ (typeof g.average_vector === "object" &&
532
+ g.average_vector !== null &&
533
+ "preview" in g.average_vector &&
534
+ g.average_vector.preview === null));
535
+ // Filter out null groups if requested
536
+ if (parsed.excludeNullGroups === true) {
537
+ groups = groups.filter((g) => !(g.average_vector === null ||
538
+ (typeof g.average_vector === "object" &&
539
+ g.average_vector !== null &&
540
+ "preview" in g.average_vector &&
541
+ g.average_vector.preview === null)));
542
+ }
543
+ const response = {
544
+ groups,
545
+ count: groups.length,
546
+ };
547
+ if (nullGroups.length > 0 && parsed.excludeNullGroups !== true) {
548
+ response["note"] =
549
+ `${String(nullGroups.length)} group(s) have NULL average_vector. Use excludeNullGroups: true to filter them.`;
550
+ }
551
+ return response;
552
+ }
553
+ // Non-grouped overall average
554
+ const sql = `SELECT avg(${columnName})::text as average_vector, count(*):: integer as count
555
+ FROM ${tableName}${whereClause} `;
556
+ const result = await adapter.executeQuery(sql);
557
+ const row = result.rows?.[0] ?? {};
558
+ // Ensure count is a number (PostgreSQL returns bigint as string)
559
+ const countVal = row["count"];
560
+ const count = typeof countVal === "string"
561
+ ? parseInt(countVal, 10)
562
+ : typeof countVal === "number"
563
+ ? countVal
564
+ : 0;
565
+ const vec = parseVector(row["average_vector"]);
566
+ const response = {
567
+ average_vector: parsed.summarizeVector && vec !== null
568
+ ? truncateVector(vec)
569
+ : (vec ?? row["average_vector"]),
570
+ count,
571
+ };
572
+ // Add message for empty/null result
573
+ if (vec === null && count === 0) {
574
+ response["note"] =
575
+ "No vectors found to aggregate (table empty or all vectors are NULL)";
576
+ }
577
+ else if (vec === null) {
578
+ response["note"] = `All ${String(count)} rows have NULL vectors`;
579
+ }
580
+ return response;
581
+ }
582
+ catch (error) {
583
+ return {
584
+ success: false,
585
+ error: formatPostgresError(error, { tool: "pg_vector_aggregate" }),
586
+ };
587
+ }
588
+ },
589
+ };
590
+ }
591
+ export function createVectorValidateTool(adapter) {
592
+ // Base schema exposes all properties to MCP without transform
593
+ const ValidateSchemaBase = z.object({
594
+ table: z.string().optional().describe("Table name"),
595
+ tableName: z.string().optional().describe("Alias for table"),
596
+ column: z.string().optional().describe("Vector column"),
597
+ col: z.string().optional().describe("Alias for column"),
598
+ vector: z
599
+ .array(z.number())
600
+ .optional()
601
+ .describe("Vector to validate dimensions"),
602
+ dimensions: z.coerce
603
+ .number()
604
+ .optional()
605
+ .describe("Expected dimensions to check"),
606
+ schema: z.string().optional().describe("Database schema (default: public)"),
607
+ });
608
+ // Transformed schema applies alias resolution
609
+ const ValidateSchema = ValidateSchemaBase.transform((data) => ({
610
+ table: data.table ?? data.tableName ?? "",
611
+ column: data.column ?? data.col ?? "",
612
+ vector: data.vector,
613
+ dimensions: data.dimensions,
614
+ schema: data.schema,
615
+ }));
616
+ return {
617
+ name: "pg_vector_validate",
618
+ description: "Returns `{valid: bool, vectorDimensions}`. Validate vector dimensions against a column or check a vector before operations. Empty vector `[]` returns `{valid: true, vectorDimensions: 0}`.",
619
+ group: "vector",
620
+ inputSchema: ValidateSchemaBase,
621
+ outputSchema: VectorValidateOutputSchema,
622
+ annotations: readOnly("Validate Vector"),
623
+ icons: getToolIcons("vector", readOnly("Validate Vector")),
624
+ handler: async (params, _context) => {
625
+ try {
626
+ // Wrap validation in try-catch for user-friendly errors
627
+ let parsed;
628
+ try {
629
+ parsed = ValidateSchema.parse(params);
630
+ }
631
+ catch (error) {
632
+ // Return user-friendly error for invalid input types
633
+ if (error instanceof z.ZodError) {
634
+ const firstIssue = error.issues[0];
635
+ if (firstIssue) {
636
+ const path = firstIssue.path.join(".");
637
+ const message = firstIssue.message;
638
+ return {
639
+ valid: false,
640
+ error: `Invalid ${path || "input"}: ${message}`,
641
+ suggestion: path === "vector"
642
+ ? "Ensure vector is an array of numbers, e.g., [0.1, 0.2, 0.3]"
643
+ : "Check the parameter types and try again",
644
+ };
645
+ }
646
+ }
647
+ throw error;
648
+ }
649
+ // Validate that at least one meaningful input is provided
650
+ const hasVector = parsed.vector !== undefined;
651
+ const hasTableColumn = parsed.table !== "" && parsed.column !== "";
652
+ const hasDimensions = parsed.dimensions !== undefined;
653
+ if (!hasVector && !hasTableColumn && !hasDimensions) {
654
+ return {
655
+ valid: false,
656
+ error: "Validation error: at least one of vector, table+column, or dimensions is required",
657
+ suggestion: "Provide a vector to validate, or table+column to check column dimensions, or dimensions to compare against",
658
+ };
659
+ }
660
+ // Get column dimensions if table/column specified
661
+ let columnDimensions;
662
+ if (parsed.table !== "" && parsed.column !== "") {
663
+ const schemaName = parsed.schema ?? "public";
664
+ // First check if table and column exist
665
+ const existsSql = `
666
+ SELECT 1 FROM information_schema.columns
667
+ WHERE table_schema = $1 AND table_name = $2 AND column_name = $3
668
+ `;
669
+ const existsResult = await adapter.executeQuery(existsSql, [
670
+ schemaName,
671
+ parsed.table,
672
+ parsed.column,
673
+ ]);
674
+ if ((existsResult.rows?.length ?? 0) === 0) {
675
+ // Check if table exists at all
676
+ const tableCheckSql = `
677
+ SELECT 1 FROM information_schema.tables
678
+ WHERE table_schema = $1 AND table_name = $2
679
+ `;
680
+ const tableCheckResult = await adapter.executeQuery(tableCheckSql, [
681
+ schemaName,
682
+ parsed.table,
683
+ ]);
684
+ if ((tableCheckResult.rows?.length ?? 0) === 0) {
685
+ return {
686
+ valid: false,
687
+ error: `Table '${parsed.table}' does not exist in schema '${schemaName}'`,
688
+ suggestion: "Use pg_list_tables to find available tables",
689
+ };
690
+ }
691
+ return {
692
+ valid: false,
693
+ error: `Column '${parsed.column}' does not exist in table '${parsed.table}'`,
694
+ suggestion: "Use pg_describe_table to find available columns",
695
+ };
696
+ }
697
+ // Check column type before calling vector_dims() to avoid raw PG errors
698
+ const typeCheckSql = `
699
+ SELECT udt_name FROM information_schema.columns
700
+ WHERE table_schema = $1 AND table_name = $2 AND column_name = $3
701
+ `;
702
+ const typeResult = await adapter.executeQuery(typeCheckSql, [
703
+ schemaName,
704
+ parsed.table,
705
+ parsed.column,
706
+ ]);
707
+ const udtName = typeResult.rows?.[0]?.["udt_name"];
708
+ if (udtName !== "vector") {
709
+ return {
710
+ valid: false,
711
+ error: `Column '${parsed.column}' is not a vector column (type: ${udtName ?? "unknown"})`,
712
+ suggestion: "Use a column with vector type, or use pg_vector_add_column to create one",
713
+ };
714
+ }
715
+ // Try to get actual dimensions from a sample row
716
+ const sampleSql = `
717
+ SELECT vector_dims("${parsed.column}") as dimensions
718
+ FROM "${schemaName}"."${parsed.table}"
719
+ WHERE "${parsed.column}" IS NOT NULL
720
+ LIMIT 1
721
+ `;
722
+ try {
723
+ const sampleResult = await adapter.executeQuery(sampleSql);
724
+ const dims = sampleResult.rows?.[0]?.["dimensions"];
725
+ if (dims !== undefined && dims !== null) {
726
+ columnDimensions =
727
+ typeof dims === "string" ? parseInt(dims, 10) : Number(dims);
728
+ }
729
+ }
730
+ catch {
731
+ // Table might be empty — columnDimensions remains undefined
732
+ }
733
+ }
734
+ const expectedDimensions = parsed.dimensions ?? columnDimensions;
735
+ const vectorDimensions = parsed.vector?.length;
736
+ // Validation results
737
+ const valid = vectorDimensions !== undefined && expectedDimensions !== undefined
738
+ ? vectorDimensions === expectedDimensions
739
+ : true;
740
+ return {
741
+ valid,
742
+ vectorDimensions,
743
+ columnDimensions,
744
+ expectedDimensions,
745
+ ...(parsed.vector !== undefined &&
746
+ expectedDimensions !== undefined &&
747
+ vectorDimensions !== undefined &&
748
+ vectorDimensions !== expectedDimensions
749
+ ? {
750
+ error: `Vector has ${String(vectorDimensions)} dimensions but column expects ${String(expectedDimensions)} `,
751
+ suggestion: vectorDimensions > expectedDimensions
752
+ ? "Use pg_vector_dimension_reduce to reduce dimensions"
753
+ : "Ensure your embedding model outputs the correct dimensions",
754
+ }
755
+ : {}),
756
+ };
757
+ }
758
+ catch (error) {
759
+ return {
760
+ success: false,
761
+ error: formatPostgresError(error, { tool: "pg_vector_validate" }),
762
+ };
763
+ }
764
+ },
765
+ };
766
+ }
767
+ //# sourceMappingURL=query.js.map