vectra 0.12.2 → 0.14.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 (392) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +92 -100
  3. package/bin/vectra.js +3 -0
  4. package/lib/BrowserWebFetcher.d.ts +75 -0
  5. package/lib/BrowserWebFetcher.d.ts.map +1 -0
  6. package/lib/BrowserWebFetcher.js +290 -0
  7. package/lib/BrowserWebFetcher.js.map +1 -0
  8. package/lib/FileFetcher.d.ts +5 -0
  9. package/lib/FileFetcher.d.ts.map +1 -0
  10. package/lib/FileFetcher.js +89 -0
  11. package/lib/FileFetcher.js.map +1 -0
  12. package/lib/FileFetcher.spec.d.ts +2 -0
  13. package/lib/FileFetcher.spec.d.ts.map +1 -0
  14. package/lib/FileFetcher.spec.js +244 -0
  15. package/lib/FileFetcher.spec.js.map +1 -0
  16. package/lib/FolderWatcher.d.ts +91 -0
  17. package/lib/FolderWatcher.d.ts.map +1 -0
  18. package/lib/FolderWatcher.js +304 -0
  19. package/lib/FolderWatcher.js.map +1 -0
  20. package/lib/FolderWatcher.spec.d.ts +2 -0
  21. package/lib/FolderWatcher.spec.d.ts.map +1 -0
  22. package/lib/FolderWatcher.spec.js +308 -0
  23. package/lib/FolderWatcher.spec.js.map +1 -0
  24. package/lib/GPT3Tokenizer.d.ts +9 -0
  25. package/lib/GPT3Tokenizer.spec.d.ts +2 -0
  26. package/lib/GPT3Tokenizer.spec.d.ts.map +1 -0
  27. package/lib/GPT3Tokenizer.spec.js +45 -0
  28. package/lib/GPT3Tokenizer.spec.js.map +1 -0
  29. package/lib/ItemSelector.d.ts +41 -0
  30. package/lib/ItemSelector.d.ts.map +1 -0
  31. package/lib/ItemSelector.js +179 -0
  32. package/lib/ItemSelector.js.map +1 -0
  33. package/lib/ItemSelector.spec.d.ts +2 -0
  34. package/lib/ItemSelector.spec.d.ts.map +1 -0
  35. package/lib/ItemSelector.spec.js +204 -0
  36. package/lib/ItemSelector.spec.js.map +1 -0
  37. package/lib/LocalDocument.d.ts +54 -0
  38. package/lib/LocalDocument.d.ts.map +1 -1
  39. package/lib/LocalDocument.js +116 -0
  40. package/lib/LocalDocument.js.map +1 -0
  41. package/lib/LocalDocument.spec.d.ts +2 -0
  42. package/lib/LocalDocument.spec.d.ts.map +1 -0
  43. package/lib/LocalDocument.spec.js +214 -0
  44. package/lib/LocalDocument.spec.js.map +1 -0
  45. package/lib/LocalDocumentIndex.d.ts +152 -0
  46. package/lib/LocalDocumentIndex.d.ts.map +1 -1
  47. package/lib/LocalDocumentIndex.js +420 -0
  48. package/lib/LocalDocumentIndex.js.map +1 -0
  49. package/lib/LocalDocumentIndex.spec.d.ts +2 -0
  50. package/lib/LocalDocumentIndex.spec.d.ts.map +1 -0
  51. package/lib/LocalDocumentIndex.spec.js +494 -0
  52. package/lib/LocalDocumentIndex.spec.js.map +1 -0
  53. package/lib/LocalDocumentResult.d.ts +66 -0
  54. package/lib/LocalDocumentResult.d.ts.map +1 -1
  55. package/lib/LocalDocumentResult.js +376 -0
  56. package/lib/LocalDocumentResult.js.map +1 -0
  57. package/lib/LocalDocumentResult.spec.d.ts +2 -0
  58. package/lib/LocalDocumentResult.spec.d.ts.map +1 -0
  59. package/lib/LocalDocumentResult.spec.js +373 -0
  60. package/lib/LocalDocumentResult.spec.js.map +1 -0
  61. package/lib/LocalEmbeddings.d.ts +59 -0
  62. package/lib/LocalEmbeddings.d.ts.map +1 -0
  63. package/lib/LocalEmbeddings.js +101 -0
  64. package/lib/LocalEmbeddings.js.map +1 -0
  65. package/lib/LocalEmbeddings.spec.d.ts +2 -0
  66. package/lib/LocalEmbeddings.spec.d.ts.map +1 -0
  67. package/lib/LocalEmbeddings.spec.js +155 -0
  68. package/lib/LocalEmbeddings.spec.js.map +1 -0
  69. package/lib/LocalIndex.d.ts +159 -0
  70. package/lib/LocalIndex.d.ts.map +1 -1
  71. package/lib/LocalIndex.js +519 -0
  72. package/lib/LocalIndex.js.map +1 -0
  73. package/lib/LocalIndex.spec.d.ts +2 -0
  74. package/lib/LocalIndex.spec.js +611 -9
  75. package/lib/LocalIndex.spec.js.map +1 -1
  76. package/lib/OpenAIEmbeddings.d.ts +124 -0
  77. package/lib/OpenAIEmbeddings.d.ts.map +1 -0
  78. package/lib/OpenAIEmbeddings.js +166 -0
  79. package/lib/OpenAIEmbeddings.js.map +1 -0
  80. package/lib/OpenAIEmbeddings.spec.d.ts +2 -0
  81. package/lib/OpenAIEmbeddings.spec.d.ts.map +1 -0
  82. package/lib/OpenAIEmbeddings.spec.js +298 -0
  83. package/lib/OpenAIEmbeddings.spec.js.map +1 -0
  84. package/lib/TextSplitter.d.ts +21 -0
  85. package/lib/TextSplitter.d.ts.map +1 -1
  86. package/lib/TextSplitter.js +500 -0
  87. package/lib/TextSplitter.js.map +1 -0
  88. package/lib/TextSplitter.spec.d.ts +2 -0
  89. package/lib/TextSplitter.spec.d.ts.map +1 -0
  90. package/lib/TextSplitter.spec.js +337 -0
  91. package/lib/TextSplitter.spec.js.map +1 -0
  92. package/lib/TransformersEmbeddings.d.ts +121 -0
  93. package/lib/TransformersEmbeddings.d.ts.map +1 -0
  94. package/lib/TransformersEmbeddings.js +176 -0
  95. package/lib/TransformersEmbeddings.js.map +1 -0
  96. package/lib/TransformersEmbeddings.spec.d.ts +2 -0
  97. package/lib/TransformersEmbeddings.spec.d.ts.map +1 -0
  98. package/lib/TransformersEmbeddings.spec.js +198 -0
  99. package/lib/TransformersEmbeddings.spec.js.map +1 -0
  100. package/lib/TransformersTokenizer.d.ts +33 -0
  101. package/lib/TransformersTokenizer.d.ts.map +1 -0
  102. package/lib/TransformersTokenizer.js +44 -0
  103. package/lib/TransformersTokenizer.js.map +1 -0
  104. package/lib/TransformersTokenizer.spec.d.ts +2 -0
  105. package/lib/TransformersTokenizer.spec.d.ts.map +1 -0
  106. package/lib/TransformersTokenizer.spec.js +112 -0
  107. package/lib/TransformersTokenizer.spec.js.map +1 -0
  108. package/lib/WebFetcher.d.ts +14 -0
  109. package/lib/WebFetcher.d.ts.map +1 -0
  110. package/lib/WebFetcher.js +238 -0
  111. package/lib/WebFetcher.js.map +1 -0
  112. package/lib/WebFetcher.spec.d.ts +2 -0
  113. package/lib/WebFetcher.spec.d.ts.map +1 -0
  114. package/lib/WebFetcher.spec.js +263 -0
  115. package/lib/WebFetcher.spec.js.map +1 -0
  116. package/lib/browser.d.ts +30 -0
  117. package/lib/browser.d.ts.map +1 -0
  118. package/lib/browser.js +52 -0
  119. package/lib/browser.js.map +1 -0
  120. package/lib/codecs/IndexCodec.d.ts +37 -0
  121. package/lib/codecs/IndexCodec.d.ts.map +1 -0
  122. package/lib/codecs/IndexCodec.js +3 -0
  123. package/lib/codecs/IndexCodec.js.map +1 -0
  124. package/lib/codecs/JsonCodec.d.ts +19 -0
  125. package/lib/codecs/JsonCodec.d.ts.map +1 -0
  126. package/lib/codecs/JsonCodec.js +35 -0
  127. package/lib/codecs/JsonCodec.js.map +1 -0
  128. package/lib/codecs/JsonCodec.spec.d.ts +2 -0
  129. package/lib/codecs/JsonCodec.spec.d.ts.map +1 -0
  130. package/lib/codecs/JsonCodec.spec.js +66 -0
  131. package/lib/codecs/JsonCodec.spec.js.map +1 -0
  132. package/lib/codecs/LocalIndex.protobuf.spec.d.ts +2 -0
  133. package/lib/codecs/LocalIndex.protobuf.spec.d.ts.map +1 -0
  134. package/lib/codecs/LocalIndex.protobuf.spec.js +108 -0
  135. package/lib/codecs/LocalIndex.protobuf.spec.js.map +1 -0
  136. package/lib/codecs/ProtobufCodec.d.ts +20 -0
  137. package/lib/codecs/ProtobufCodec.d.ts.map +1 -0
  138. package/lib/codecs/ProtobufCodec.js +225 -0
  139. package/lib/codecs/ProtobufCodec.js.map +1 -0
  140. package/lib/codecs/ProtobufCodec.spec.d.ts +2 -0
  141. package/lib/codecs/ProtobufCodec.spec.d.ts.map +1 -0
  142. package/lib/codecs/ProtobufCodec.spec.js +155 -0
  143. package/lib/codecs/ProtobufCodec.spec.js.map +1 -0
  144. package/lib/codecs/index.d.ts +5 -0
  145. package/lib/codecs/index.d.ts.map +1 -0
  146. package/lib/codecs/index.js +21 -0
  147. package/lib/codecs/index.js.map +1 -0
  148. package/lib/codecs/migrateIndex.d.ts +24 -0
  149. package/lib/codecs/migrateIndex.d.ts.map +1 -0
  150. package/lib/codecs/migrateIndex.js +119 -0
  151. package/lib/codecs/migrateIndex.js.map +1 -0
  152. package/lib/codecs/migrateIndex.spec.d.ts +2 -0
  153. package/lib/codecs/migrateIndex.spec.d.ts.map +1 -0
  154. package/lib/codecs/migrateIndex.spec.js +151 -0
  155. package/lib/codecs/migrateIndex.spec.js.map +1 -0
  156. package/lib/codecs/schemas/index.proto +34 -0
  157. package/lib/index.d.ts +20 -0
  158. package/lib/index.d.ts.map +1 -1
  159. package/lib/index.js +36 -0
  160. package/lib/index.js.map +1 -0
  161. package/lib/internals/Colorize.d.ts +14 -0
  162. package/lib/internals/Colorize.d.ts.map +1 -0
  163. package/lib/internals/Colorize.js +69 -0
  164. package/lib/internals/Colorize.js.map +1 -0
  165. package/lib/internals/index.d.ts +3 -0
  166. package/lib/internals/index.d.ts.map +1 -0
  167. package/lib/internals/index.js +19 -0
  168. package/lib/internals/index.js.map +1 -0
  169. package/lib/internals/types.d.ts +43 -0
  170. package/lib/internals/types.d.ts.map +1 -0
  171. package/lib/internals/types.js +3 -0
  172. package/lib/internals/types.js.map +1 -0
  173. package/lib/server/IndexManager.d.ts +78 -0
  174. package/lib/server/IndexManager.d.ts.map +1 -0
  175. package/lib/server/IndexManager.js +259 -0
  176. package/lib/server/IndexManager.js.map +1 -0
  177. package/lib/server/VectraServer.d.ts +40 -0
  178. package/lib/server/VectraServer.d.ts.map +1 -0
  179. package/lib/server/VectraServer.js +151 -0
  180. package/lib/server/VectraServer.js.map +1 -0
  181. package/lib/server/VectraServer.spec.d.ts +2 -0
  182. package/lib/server/VectraServer.spec.d.ts.map +1 -0
  183. package/lib/server/VectraServer.spec.js +322 -0
  184. package/lib/server/VectraServer.spec.js.map +1 -0
  185. package/lib/server/handlers/documentHandlers.d.ts +15 -0
  186. package/lib/server/handlers/documentHandlers.d.ts.map +1 -0
  187. package/lib/server/handlers/documentHandlers.js +95 -0
  188. package/lib/server/handlers/documentHandlers.js.map +1 -0
  189. package/lib/server/handlers/helpers.d.ts +23 -0
  190. package/lib/server/handlers/helpers.d.ts.map +1 -0
  191. package/lib/server/handlers/helpers.js +138 -0
  192. package/lib/server/handlers/helpers.js.map +1 -0
  193. package/lib/server/handlers/index.d.ts +8 -0
  194. package/lib/server/handlers/index.d.ts.map +1 -0
  195. package/lib/server/handlers/index.js +22 -0
  196. package/lib/server/handlers/index.js.map +1 -0
  197. package/lib/server/handlers/indexHandlers.d.ts +14 -0
  198. package/lib/server/handlers/indexHandlers.d.ts.map +1 -0
  199. package/lib/server/handlers/indexHandlers.js +85 -0
  200. package/lib/server/handlers/indexHandlers.js.map +1 -0
  201. package/lib/server/handlers/itemHandlers.d.ts +34 -0
  202. package/lib/server/handlers/itemHandlers.d.ts.map +1 -0
  203. package/lib/server/handlers/itemHandlers.js +166 -0
  204. package/lib/server/handlers/itemHandlers.js.map +1 -0
  205. package/lib/server/handlers/lifecycleHandlers.d.ts +11 -0
  206. package/lib/server/handlers/lifecycleHandlers.d.ts.map +1 -0
  207. package/lib/server/handlers/lifecycleHandlers.js +31 -0
  208. package/lib/server/handlers/lifecycleHandlers.js.map +1 -0
  209. package/lib/server/handlers/queryHandlers.d.ts +27 -0
  210. package/lib/server/handlers/queryHandlers.d.ts.map +1 -0
  211. package/lib/server/handlers/queryHandlers.js +135 -0
  212. package/lib/server/handlers/queryHandlers.js.map +1 -0
  213. package/lib/server/handlers/statsHandlers.d.ts +17 -0
  214. package/lib/server/handlers/statsHandlers.d.ts.map +1 -0
  215. package/lib/server/handlers/statsHandlers.js +81 -0
  216. package/lib/server/handlers/statsHandlers.js.map +1 -0
  217. package/lib/server/index.d.ts +4 -0
  218. package/lib/server/index.d.ts.map +1 -0
  219. package/lib/server/index.js +23 -0
  220. package/lib/server/index.js.map +1 -0
  221. package/lib/storage/FileStorage.d.ts +92 -0
  222. package/lib/storage/FileStorage.d.ts.map +1 -0
  223. package/lib/storage/FileStorage.js +3 -0
  224. package/lib/storage/FileStorage.js.map +1 -0
  225. package/lib/storage/FileStorageUtilities.d.ts +36 -0
  226. package/lib/storage/FileStorageUtilities.d.ts.map +1 -0
  227. package/lib/storage/FileStorageUtilities.js +91 -0
  228. package/lib/storage/FileStorageUtilities.js.map +1 -0
  229. package/lib/storage/FileStorageUtilities.spec.d.ts +2 -0
  230. package/lib/storage/FileStorageUtilities.spec.d.ts.map +1 -0
  231. package/lib/storage/FileStorageUtilities.spec.js +98 -0
  232. package/lib/storage/FileStorageUtilities.spec.js.map +1 -0
  233. package/lib/storage/FileType.d.ts +29 -0
  234. package/lib/storage/FileType.d.ts.map +1 -0
  235. package/lib/storage/FileType.js +38 -0
  236. package/lib/storage/FileType.js.map +1 -0
  237. package/lib/storage/IndexedDBStorage.d.ts +47 -0
  238. package/lib/storage/IndexedDBStorage.d.ts.map +1 -0
  239. package/lib/storage/IndexedDBStorage.js +347 -0
  240. package/lib/storage/IndexedDBStorage.js.map +1 -0
  241. package/lib/storage/LocalFileStorage.browser.d.ts +19 -0
  242. package/lib/storage/LocalFileStorage.browser.d.ts.map +1 -0
  243. package/lib/storage/LocalFileStorage.browser.js +43 -0
  244. package/lib/storage/LocalFileStorage.browser.js.map +1 -0
  245. package/lib/storage/LocalFileStorage.d.ts +23 -0
  246. package/lib/storage/LocalFileStorage.d.ts.map +1 -0
  247. package/lib/storage/LocalFileStorage.js +152 -0
  248. package/lib/storage/LocalFileStorage.js.map +1 -0
  249. package/lib/storage/LocalFileStorage.spec.d.ts +2 -0
  250. package/lib/storage/LocalFileStorage.spec.d.ts.map +1 -0
  251. package/lib/storage/LocalFileStorage.spec.js +249 -0
  252. package/lib/storage/LocalFileStorage.spec.js.map +1 -0
  253. package/lib/storage/VirtualFileStorage.d.ts +18 -0
  254. package/lib/storage/VirtualFileStorage.d.ts.map +1 -0
  255. package/lib/storage/VirtualFileStorage.js +178 -0
  256. package/lib/storage/VirtualFileStorage.js.map +1 -0
  257. package/lib/storage/VirtualFileStorage.spec.d.ts +2 -0
  258. package/lib/storage/VirtualFileStorage.spec.d.ts.map +1 -0
  259. package/lib/storage/VirtualFileStorage.spec.js +302 -0
  260. package/lib/storage/VirtualFileStorage.spec.js.map +1 -0
  261. package/lib/storage/index.d.ts +6 -0
  262. package/lib/storage/index.d.ts.map +1 -0
  263. package/lib/storage/index.js +22 -0
  264. package/lib/storage/index.js.map +1 -0
  265. package/lib/templates/templates/csharp/README.md +48 -0
  266. package/lib/templates/templates/csharp/VectraClient.cs +234 -0
  267. package/lib/templates/templates/go/README.md +71 -0
  268. package/lib/templates/templates/go/vectra_client.go +322 -0
  269. package/lib/templates/templates/java/README.md +81 -0
  270. package/lib/templates/templates/java/VectraClient.java +232 -0
  271. package/lib/templates/templates/python/README.md +37 -0
  272. package/lib/templates/templates/python/vectra_client.py +279 -0
  273. package/lib/templates/templates/rust/Cargo.toml +14 -0
  274. package/lib/templates/templates/rust/README.md +39 -0
  275. package/lib/templates/templates/rust/build.rs +4 -0
  276. package/lib/templates/templates/rust/lib.rs +284 -0
  277. package/lib/templates/templates/typescript/README.md +96 -0
  278. package/lib/templates/templates/typescript/VectraClient.ts +374 -0
  279. package/lib/templates/typescript/VectraClient.d.ts +114 -0
  280. package/lib/templates/typescript/VectraClient.d.ts.map +1 -0
  281. package/lib/templates/typescript/VectraClient.js +328 -0
  282. package/lib/templates/typescript/VectraClient.js.map +1 -0
  283. package/lib/types.d.ts +153 -0
  284. package/lib/types.d.ts.map +1 -0
  285. package/lib/types.js +3 -0
  286. package/lib/types.js.map +1 -0
  287. package/lib/utils/index.d.ts +2 -0
  288. package/lib/utils/index.d.ts.map +1 -0
  289. package/lib/utils/index.js +18 -0
  290. package/lib/utils/index.js.map +1 -0
  291. package/lib/utils/pathUtils.d.ts +40 -0
  292. package/lib/utils/pathUtils.d.ts.map +1 -0
  293. package/lib/utils/pathUtils.js +98 -0
  294. package/lib/utils/pathUtils.js.map +1 -0
  295. package/lib/vectra-cli.d.ts +2 -0
  296. package/lib/vectra-cli.d.ts.map +1 -1
  297. package/lib/vectra-cli.generate.spec.d.ts +2 -0
  298. package/lib/vectra-cli.generate.spec.d.ts.map +1 -0
  299. package/lib/vectra-cli.generate.spec.js +112 -0
  300. package/lib/vectra-cli.generate.spec.js.map +1 -0
  301. package/lib/vectra-cli.js +760 -0
  302. package/lib/vectra-cli.js.map +1 -0
  303. package/lib/vectra-cli.spec.d.ts +1 -0
  304. package/lib/vectra-cli.spec.d.ts.map +1 -0
  305. package/lib/vectra-cli.spec.js +2 -0
  306. package/lib/vectra-cli.spec.js.map +1 -0
  307. package/package.json +91 -16
  308. package/proto/vectra_service.proto +276 -0
  309. package/src/BrowserWebFetcher.ts +345 -0
  310. package/src/FileFetcher.spec.ts +234 -0
  311. package/src/FileFetcher.ts +37 -25
  312. package/src/FolderWatcher.spec.ts +288 -0
  313. package/src/FolderWatcher.ts +304 -0
  314. package/src/GPT3Tokenizer.spec.ts +50 -0
  315. package/src/ItemSelector.spec.ts +252 -0
  316. package/src/ItemSelector.ts +163 -150
  317. package/src/LocalDocument.spec.ts +211 -0
  318. package/src/LocalDocument.ts +88 -94
  319. package/src/LocalDocumentIndex.spec.ts +481 -0
  320. package/src/LocalDocumentIndex.ts +39 -40
  321. package/src/LocalDocumentResult.spec.ts +373 -0
  322. package/src/LocalDocumentResult.ts +489 -319
  323. package/src/LocalEmbeddings.spec.ts +138 -0
  324. package/src/LocalEmbeddings.ts +120 -0
  325. package/src/LocalIndex.spec.ts +808 -66
  326. package/src/LocalIndex.ts +479 -429
  327. package/src/OpenAIEmbeddings.spec.ts +354 -0
  328. package/src/OpenAIEmbeddings.ts +26 -27
  329. package/src/TextSplitter.spec.ts +342 -0
  330. package/src/TextSplitter.ts +517 -532
  331. package/src/TransformersEmbeddings.spec.ts +188 -0
  332. package/src/TransformersEmbeddings.ts +232 -0
  333. package/src/TransformersTokenizer.spec.ts +143 -0
  334. package/src/TransformersTokenizer.ts +45 -0
  335. package/src/WebFetcher.spec.ts +288 -0
  336. package/src/WebFetcher.ts +184 -186
  337. package/src/browser.ts +69 -0
  338. package/src/codecs/IndexCodec.ts +40 -0
  339. package/src/codecs/JsonCodec.spec.ts +70 -0
  340. package/src/codecs/JsonCodec.ts +37 -0
  341. package/src/codecs/LocalIndex.protobuf.spec.ts +115 -0
  342. package/src/codecs/ProtobufCodec.spec.ts +166 -0
  343. package/src/codecs/ProtobufCodec.ts +193 -0
  344. package/src/codecs/index.ts +4 -0
  345. package/src/codecs/migrateIndex.spec.ts +176 -0
  346. package/src/codecs/migrateIndex.ts +125 -0
  347. package/src/codecs/schemas/index.proto +34 -0
  348. package/src/index.ts +9 -1
  349. package/src/internals/Colorize.ts +19 -16
  350. package/src/server/IndexManager.ts +243 -0
  351. package/src/server/VectraServer.spec.ts +303 -0
  352. package/src/server/VectraServer.ts +156 -0
  353. package/src/server/handlers/documentHandlers.ts +59 -0
  354. package/src/server/handlers/helpers.ts +93 -0
  355. package/src/server/handlers/index.ts +7 -0
  356. package/src/server/handlers/indexHandlers.ts +44 -0
  357. package/src/server/handlers/itemHandlers.ts +140 -0
  358. package/src/server/handlers/lifecycleHandlers.ts +26 -0
  359. package/src/server/handlers/queryHandlers.ts +96 -0
  360. package/src/server/handlers/statsHandlers.ts +38 -0
  361. package/src/server/index.ts +3 -0
  362. package/src/storage/FileStorage.ts +105 -0
  363. package/src/storage/FileStorageUtilities.spec.ts +106 -0
  364. package/src/storage/FileStorageUtilities.ts +77 -0
  365. package/src/storage/FileType.ts +61 -0
  366. package/src/storage/IndexedDBStorage.ts +365 -0
  367. package/src/storage/LocalFileStorage.browser.ts +52 -0
  368. package/src/storage/LocalFileStorage.spec.ts +292 -0
  369. package/src/storage/LocalFileStorage.ts +98 -0
  370. package/src/storage/VirtualFileStorage.spec.ts +307 -0
  371. package/src/storage/VirtualFileStorage.ts +169 -0
  372. package/src/storage/index.ts +5 -0
  373. package/src/templates/csharp/README.md +48 -0
  374. package/src/templates/csharp/VectraClient.cs +234 -0
  375. package/src/templates/go/README.md +71 -0
  376. package/src/templates/go/vectra_client.go +322 -0
  377. package/src/templates/java/README.md +81 -0
  378. package/src/templates/java/VectraClient.java +232 -0
  379. package/src/templates/python/README.md +37 -0
  380. package/src/templates/python/vectra_client.py +279 -0
  381. package/src/templates/rust/Cargo.toml +14 -0
  382. package/src/templates/rust/README.md +39 -0
  383. package/src/templates/rust/build.rs +4 -0
  384. package/src/templates/rust/lib.rs +284 -0
  385. package/src/templates/typescript/README.md +96 -0
  386. package/src/templates/typescript/VectraClient.ts +374 -0
  387. package/src/types.ts +131 -123
  388. package/src/utils/index.ts +1 -0
  389. package/src/utils/pathUtils.ts +106 -0
  390. package/src/vectra-cli.generate.spec.ts +72 -0
  391. package/src/vectra-cli.spec.ts +0 -0
  392. package/src/vectra-cli.ts +687 -246
@@ -0,0 +1,303 @@
1
+ import * as assert from 'assert';
2
+ import * as path from 'path';
3
+ import * as fs from 'fs';
4
+ import * as grpc from '@grpc/grpc-js';
5
+ import * as protoLoader from '@grpc/proto-loader';
6
+ import { VectraServer } from './VectraServer';
7
+
8
+ const TEST_ROOT = path.join(__dirname, '..', '..', '.test-server-root');
9
+ const PROTO_PATH = path.join(__dirname, '..', '..', 'proto', 'vectra_service.proto');
10
+
11
+ function loadClient(port: number): any {
12
+ const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
13
+ keepCase: true,
14
+ longs: Number,
15
+ enums: String,
16
+ defaults: true,
17
+ oneofs: true,
18
+ });
19
+ const proto = grpc.loadPackageDefinition(packageDefinition) as any;
20
+ return new proto.vectra.VectraService(
21
+ `127.0.0.1:${port}`,
22
+ grpc.credentials.createInsecure()
23
+ );
24
+ }
25
+
26
+ function rpc(client: any, method: string, request: any): Promise<any> {
27
+ return new Promise((resolve, reject) => {
28
+ client[method](request, (err: any, response: any) => {
29
+ if (err) reject(err);
30
+ else resolve(response);
31
+ });
32
+ });
33
+ }
34
+
35
+ function cleanTestDir() {
36
+ if (fs.existsSync(TEST_ROOT)) {
37
+ fs.rmSync(TEST_ROOT, { recursive: true });
38
+ }
39
+ fs.mkdirSync(TEST_ROOT, { recursive: true });
40
+ }
41
+
42
+ describe('VectraServer', function () {
43
+ this.timeout(30000);
44
+
45
+ let server: VectraServer;
46
+ let client: any;
47
+ let port: number;
48
+
49
+ before(async () => {
50
+ cleanTestDir();
51
+ server = new VectraServer({
52
+ port: 0, // random available port
53
+ rootDir: TEST_ROOT,
54
+ scanInterval: 500,
55
+ });
56
+ port = await server.start();
57
+ client = loadClient(port);
58
+ });
59
+
60
+ after(async () => {
61
+ if (client) {
62
+ client.close();
63
+ }
64
+ if (server) {
65
+ await server.shutdown();
66
+ }
67
+ if (fs.existsSync(TEST_ROOT)) {
68
+ fs.rmSync(TEST_ROOT, { recursive: true });
69
+ }
70
+ });
71
+
72
+ describe('Lifecycle RPCs', () => {
73
+ it('should respond to Healthcheck', async () => {
74
+ const res = await rpc(client, 'Healthcheck', {});
75
+ assert.strictEqual(res.status, 'ok');
76
+ assert.strictEqual(typeof res.uptime_seconds, 'number');
77
+ assert.strictEqual(typeof res.loaded_indexes, 'number');
78
+ });
79
+ });
80
+
81
+ describe('Index Management RPCs', () => {
82
+ it('should create an index', async () => {
83
+ await rpc(client, 'CreateIndex', {
84
+ index_name: 'test-index',
85
+ format: 'json',
86
+ is_document_index: false,
87
+ });
88
+
89
+ const list = await rpc(client, 'ListIndexes', {});
90
+ const names = list.indexes.map((i: any) => i.name);
91
+ assert.ok(names.includes('test-index'), `Expected test-index in ${JSON.stringify(names)}`);
92
+ });
93
+
94
+ it('should fail to create a duplicate index', async () => {
95
+ try {
96
+ await rpc(client, 'CreateIndex', {
97
+ index_name: 'test-index',
98
+ format: 'json',
99
+ is_document_index: false,
100
+ });
101
+ assert.fail('Expected ALREADY_EXISTS error');
102
+ } catch (err: any) {
103
+ assert.strictEqual(err.code, grpc.status.ALREADY_EXISTS);
104
+ }
105
+ });
106
+
107
+ it('should list indexes', async () => {
108
+ const res = await rpc(client, 'ListIndexes', {});
109
+ assert.ok(Array.isArray(res.indexes));
110
+ assert.ok(res.indexes.length >= 1);
111
+ });
112
+ });
113
+
114
+ describe('Item Operations RPCs', () => {
115
+ const testVector = new Array(3).fill(0).map((_, i) => (i + 1) * 0.1);
116
+
117
+ it('should insert an item', async () => {
118
+ const res = await rpc(client, 'InsertItem', {
119
+ index_name: 'test-index',
120
+ vector: testVector,
121
+ metadata: {
122
+ category: { string_value: 'test' },
123
+ score: { number_value: 0.95 },
124
+ },
125
+ id: 'item-1',
126
+ });
127
+ assert.strictEqual(res.id, 'item-1');
128
+ });
129
+
130
+ it('should get an item by id', async () => {
131
+ const res = await rpc(client, 'GetItem', {
132
+ index_name: 'test-index',
133
+ id: 'item-1',
134
+ });
135
+ assert.ok(res.item);
136
+ assert.strictEqual(res.item.id, 'item-1');
137
+ assert.ok(res.item.vector.length > 0);
138
+ });
139
+
140
+ it('should return NOT_FOUND for missing item', async () => {
141
+ try {
142
+ await rpc(client, 'GetItem', {
143
+ index_name: 'test-index',
144
+ id: 'nonexistent',
145
+ });
146
+ assert.fail('Expected NOT_FOUND error');
147
+ } catch (err: any) {
148
+ assert.strictEqual(err.code, grpc.status.NOT_FOUND);
149
+ }
150
+ });
151
+
152
+ it('should upsert an item', async () => {
153
+ const newVector = new Array(3).fill(0).map((_, i) => (i + 1) * 0.2);
154
+ const res = await rpc(client, 'UpsertItem', {
155
+ index_name: 'test-index',
156
+ id: 'item-1',
157
+ vector: newVector,
158
+ metadata: {
159
+ category: { string_value: 'updated' },
160
+ },
161
+ });
162
+ assert.strictEqual(res.id, 'item-1');
163
+
164
+ // Verify update
165
+ const getRes = await rpc(client, 'GetItem', {
166
+ index_name: 'test-index',
167
+ id: 'item-1',
168
+ });
169
+ assert.strictEqual(getRes.item.metadata.category.string_value, 'updated');
170
+ });
171
+
172
+ it('should batch insert items', async () => {
173
+ const res = await rpc(client, 'BatchInsertItems', {
174
+ index_name: 'test-index',
175
+ items: [
176
+ { vector: [0.1, 0.2, 0.3], metadata: { tag: { string_value: 'a' } }, id: 'batch-1' },
177
+ { vector: [0.4, 0.5, 0.6], metadata: { tag: { string_value: 'b' } }, id: 'batch-2' },
178
+ ],
179
+ });
180
+ assert.strictEqual(res.ids.length, 2);
181
+ assert.ok(res.ids.includes('batch-1'));
182
+ assert.ok(res.ids.includes('batch-2'));
183
+ });
184
+
185
+ it('should list items', async () => {
186
+ const res = await rpc(client, 'ListItems', {
187
+ index_name: 'test-index',
188
+ });
189
+ assert.ok(res.items.length >= 3); // item-1, batch-1, batch-2
190
+ });
191
+
192
+ it('should delete an item', async () => {
193
+ await rpc(client, 'DeleteItem', {
194
+ index_name: 'test-index',
195
+ id: 'batch-2',
196
+ });
197
+
198
+ // Verify it's gone
199
+ try {
200
+ await rpc(client, 'GetItem', {
201
+ index_name: 'test-index',
202
+ id: 'batch-2',
203
+ });
204
+ assert.fail('Expected NOT_FOUND');
205
+ } catch (err: any) {
206
+ assert.strictEqual(err.code, grpc.status.NOT_FOUND);
207
+ }
208
+ });
209
+ });
210
+
211
+ describe('Query RPCs', () => {
212
+ it('should query items by vector', async () => {
213
+ const res = await rpc(client, 'QueryItems', {
214
+ index_name: 'test-index',
215
+ vector: [0.1, 0.2, 0.3],
216
+ top_k: 5,
217
+ });
218
+ assert.ok(Array.isArray(res.results));
219
+ assert.ok(res.results.length > 0);
220
+ // Results should have scores
221
+ assert.ok(typeof res.results[0].score === 'number');
222
+ });
223
+ });
224
+
225
+ describe('Stats RPCs', () => {
226
+ it('should get index stats', async () => {
227
+ const res = await rpc(client, 'GetIndexStats', {
228
+ index_name: 'test-index',
229
+ });
230
+ assert.strictEqual(res.version, 1);
231
+ assert.strictEqual(res.format, 'json');
232
+ assert.ok(typeof res.item_count === 'number');
233
+ });
234
+ });
235
+
236
+ describe('Error handling', () => {
237
+ it('should return NOT_FOUND for unknown index', async () => {
238
+ try {
239
+ await rpc(client, 'GetIndexStats', {
240
+ index_name: 'no-such-index',
241
+ });
242
+ assert.fail('Expected NOT_FOUND');
243
+ } catch (err: any) {
244
+ assert.strictEqual(err.code, grpc.status.NOT_FOUND);
245
+ }
246
+ });
247
+
248
+ it('should return INVALID_ARGUMENT for missing required fields', async () => {
249
+ try {
250
+ await rpc(client, 'InsertItem', {
251
+ index_name: 'test-index',
252
+ // no text or vector
253
+ });
254
+ assert.fail('Expected INVALID_ARGUMENT');
255
+ } catch (err: any) {
256
+ assert.strictEqual(err.code, grpc.status.INVALID_ARGUMENT);
257
+ }
258
+ });
259
+
260
+ it('should return FAILED_PRECONDITION for non-document index on document ops', async () => {
261
+ try {
262
+ await rpc(client, 'ListDocuments', {
263
+ index_name: 'test-index',
264
+ });
265
+ assert.fail('Expected FAILED_PRECONDITION');
266
+ } catch (err: any) {
267
+ assert.strictEqual(err.code, grpc.status.FAILED_PRECONDITION);
268
+ }
269
+ });
270
+ });
271
+
272
+ describe('Index deletion', () => {
273
+ it('should delete an index', async () => {
274
+ await rpc(client, 'DeleteIndex', {
275
+ index_name: 'test-index',
276
+ });
277
+
278
+ const list = await rpc(client, 'ListIndexes', {});
279
+ const names = list.indexes.map((i: any) => i.name);
280
+ assert.ok(!names.includes('test-index'));
281
+ });
282
+ });
283
+
284
+ describe('Auto-detect new indexes', () => {
285
+ it('should detect indexes created on disk', async function () {
286
+ // Create an index directly on disk (outside the gRPC API)
287
+ const indexDir = path.join(TEST_ROOT, 'auto-detected');
288
+ fs.mkdirSync(indexDir, { recursive: true });
289
+ fs.writeFileSync(path.join(indexDir, 'index.json'), JSON.stringify({
290
+ version: 1,
291
+ metadata_config: {},
292
+ items: [],
293
+ }));
294
+
295
+ // Wait for the scanner to pick it up
296
+ await new Promise(r => setTimeout(r, 1500));
297
+
298
+ const list = await rpc(client, 'ListIndexes', {});
299
+ const names = list.indexes.map((i: any) => i.name);
300
+ assert.ok(names.includes('auto-detected'), `Expected auto-detected in ${JSON.stringify(names)}`);
301
+ });
302
+ });
303
+ });
@@ -0,0 +1,156 @@
1
+ import * as path from 'path';
2
+ import * as grpc from '@grpc/grpc-js';
3
+ import * as protoLoader from '@grpc/proto-loader';
4
+ import { IndexManager, IndexManagerConfig } from './IndexManager';
5
+ import { EmbeddingsModel } from '../types';
6
+ import {
7
+ createIndexHandlers,
8
+ createItemHandlers,
9
+ createQueryHandlers,
10
+ createDocumentHandlers,
11
+ createStatsHandlers,
12
+ createLifecycleHandlers,
13
+ } from './handlers';
14
+
15
+ export interface VectraServerConfig {
16
+ /** Port to bind the gRPC server on (default: 50051). */
17
+ port?: number;
18
+ /** Single index path (mutually exclusive with rootDir). */
19
+ indexPath?: string;
20
+ /** Root directory containing multiple index subdirectories. */
21
+ rootDir?: string;
22
+ /** Embeddings model for server-side embedding computation. */
23
+ embeddings?: EmbeddingsModel;
24
+ /** Polling interval in ms for auto-detecting new indexes (default: 3000). */
25
+ scanInterval?: number;
26
+ }
27
+
28
+ const DRAIN_TIMEOUT_MS = 5000;
29
+
30
+ /**
31
+ * gRPC server that exposes Vectra indexes over the VectraService proto.
32
+ */
33
+ export class VectraServer {
34
+ private readonly _config: VectraServerConfig;
35
+ private readonly _indexManager: IndexManager;
36
+ private _server?: grpc.Server;
37
+ private _startTime: number = 0;
38
+ private _shutdownPromise?: Promise<void>;
39
+
40
+ constructor(config: VectraServerConfig) {
41
+ this._config = config;
42
+ const managerConfig: IndexManagerConfig = {
43
+ indexPath: config.indexPath,
44
+ rootDir: config.rootDir,
45
+ embeddings: config.embeddings,
46
+ scanInterval: config.scanInterval,
47
+ };
48
+ this._indexManager = new IndexManager(managerConfig);
49
+ }
50
+
51
+ /** The underlying IndexManager. */
52
+ public get indexManager(): IndexManager {
53
+ return this._indexManager;
54
+ }
55
+
56
+ /** The underlying gRPC server instance. */
57
+ public get server(): grpc.Server | undefined {
58
+ return this._server;
59
+ }
60
+
61
+ /**
62
+ * Starts the gRPC server and loads indexes.
63
+ * @returns The port the server is listening on.
64
+ */
65
+ public async start(): Promise<number> {
66
+ this._startTime = Date.now();
67
+
68
+ // Load proto definition
69
+ const protoPath = path.resolve(__dirname, '..', '..', 'proto', 'vectra_service.proto');
70
+ const packageDefinition = protoLoader.loadSync(protoPath, {
71
+ keepCase: true,
72
+ longs: Number,
73
+ enums: String,
74
+ defaults: true,
75
+ oneofs: true,
76
+ });
77
+ const protoDescriptor = grpc.loadPackageDefinition(packageDefinition) as any;
78
+ const vectraService = protoDescriptor.vectra.VectraService;
79
+
80
+ // Initialize index manager
81
+ await this._indexManager.initialize();
82
+
83
+ // Create gRPC server
84
+ this._server = new grpc.Server();
85
+
86
+ // Register all handler groups
87
+ const indexHandlers = createIndexHandlers(this._indexManager);
88
+ const itemHandlers = createItemHandlers(this._indexManager, this._config.embeddings);
89
+ const queryHandlers = createQueryHandlers(this._indexManager, this._config.embeddings);
90
+ const documentHandlers = createDocumentHandlers(this._indexManager);
91
+ const statsHandlers = createStatsHandlers(this._indexManager);
92
+ const lifecycleHandlers = createLifecycleHandlers(
93
+ this._indexManager,
94
+ this._startTime,
95
+ () => this.shutdown()
96
+ );
97
+
98
+ this._server.addService(vectraService.service, {
99
+ ...indexHandlers,
100
+ ...itemHandlers,
101
+ ...queryHandlers,
102
+ ...documentHandlers,
103
+ ...statsHandlers,
104
+ ...lifecycleHandlers,
105
+ });
106
+
107
+ // Bind to localhost only
108
+ const port = this._config.port ?? 50051;
109
+ const boundPort = await new Promise<number>((resolve, reject) => {
110
+ this._server!.bindAsync(
111
+ `127.0.0.1:${port}`,
112
+ grpc.ServerCredentials.createInsecure(),
113
+ (err, actualPort) => {
114
+ if (err) {
115
+ reject(err);
116
+ } else {
117
+ resolve(actualPort);
118
+ }
119
+ }
120
+ );
121
+ });
122
+
123
+ return boundPort;
124
+ }
125
+
126
+ /**
127
+ * Gracefully shuts down the server with a 5s draining timeout.
128
+ */
129
+ public async shutdown(): Promise<void> {
130
+ if (this._shutdownPromise) return this._shutdownPromise;
131
+
132
+ this._shutdownPromise = (async () => {
133
+ // Stop index manager scanning
134
+ await this._indexManager.shutdown();
135
+
136
+ if (!this._server) return;
137
+
138
+ // Try graceful shutdown with timeout
139
+ await new Promise<void>((resolve) => {
140
+ const timer = setTimeout(() => {
141
+ this._server!.forceShutdown();
142
+ resolve();
143
+ }, DRAIN_TIMEOUT_MS);
144
+
145
+ this._server!.tryShutdown((err) => {
146
+ clearTimeout(timer);
147
+ resolve();
148
+ });
149
+ });
150
+
151
+ this._server = undefined;
152
+ })();
153
+
154
+ return this._shutdownPromise;
155
+ }
156
+ }
@@ -0,0 +1,59 @@
1
+ import * as grpc from '@grpc/grpc-js';
2
+ import { IndexManager } from '../IndexManager';
3
+ import { wrapHandler, grpcError, fromProtoMetadata } from './helpers';
4
+
5
+ export function createDocumentHandlers(manager: IndexManager) {
6
+ return {
7
+ UpsertDocument: wrapHandler(async (call: grpc.ServerUnaryCall<any, any>) => {
8
+ const req = call.request;
9
+ if (!req.index_name) {
10
+ throw grpcError(grpc.status.INVALID_ARGUMENT, 'index_name is required');
11
+ }
12
+ if (!req.uri) {
13
+ throw grpcError(grpc.status.INVALID_ARGUMENT, 'uri is required');
14
+ }
15
+ if (!req.text) {
16
+ throw grpcError(grpc.status.INVALID_ARGUMENT, 'text is required');
17
+ }
18
+ const { docIndex } = manager.requireDocumentIndex(req.index_name);
19
+ const metadata = fromProtoMetadata(req.metadata);
20
+ const metadataArg = Object.keys(metadata).length > 0 ? metadata : undefined;
21
+
22
+ const doc = await docIndex.upsertDocument(
23
+ req.uri,
24
+ req.text,
25
+ req.doc_type || undefined,
26
+ metadataArg
27
+ );
28
+ return { document_id: doc.id };
29
+ }),
30
+
31
+ DeleteDocument: wrapHandler(async (call: grpc.ServerUnaryCall<any, any>) => {
32
+ const req = call.request;
33
+ if (!req.index_name) {
34
+ throw grpcError(grpc.status.INVALID_ARGUMENT, 'index_name is required');
35
+ }
36
+ if (!req.uri) {
37
+ throw grpcError(grpc.status.INVALID_ARGUMENT, 'uri is required');
38
+ }
39
+ const { docIndex } = manager.requireDocumentIndex(req.index_name);
40
+ await docIndex.deleteDocument(req.uri);
41
+ return {};
42
+ }),
43
+
44
+ ListDocuments: wrapHandler(async (call: grpc.ServerUnaryCall<any, any>) => {
45
+ const req = call.request;
46
+ if (!req.index_name) {
47
+ throw grpcError(grpc.status.INVALID_ARGUMENT, 'index_name is required');
48
+ }
49
+ const { docIndex } = manager.requireDocumentIndex(req.index_name);
50
+ const docs = await docIndex.listDocuments();
51
+ return {
52
+ documents: docs.map(doc => ({
53
+ uri: doc.uri,
54
+ document_id: doc.id,
55
+ })),
56
+ };
57
+ }),
58
+ };
59
+ }
@@ -0,0 +1,93 @@
1
+ import * as grpc from '@grpc/grpc-js';
2
+ import { MetadataTypes } from '../../types';
3
+
4
+ /**
5
+ * Converts proto MetadataValue map to a plain JS record.
6
+ */
7
+ export function fromProtoMetadata(protoMeta: Record<string, any> | undefined): Record<string, MetadataTypes> {
8
+ const result: Record<string, MetadataTypes> = {};
9
+ if (!protoMeta) return result;
10
+ for (const [key, val] of Object.entries(protoMeta)) {
11
+ if (val && typeof val === 'object') {
12
+ if ('string_value' in val || 'stringValue' in val) {
13
+ result[key] = val.string_value ?? val.stringValue;
14
+ } else if ('number_value' in val || 'numberValue' in val) {
15
+ result[key] = val.number_value ?? val.numberValue;
16
+ } else if ('bool_value' in val || 'boolValue' in val) {
17
+ result[key] = val.bool_value ?? val.boolValue;
18
+ }
19
+ }
20
+ }
21
+ return result;
22
+ }
23
+
24
+ /**
25
+ * Converts a plain JS metadata record to proto MetadataValue map.
26
+ */
27
+ export function toProtoMetadata(meta: Record<string, MetadataTypes> | undefined): Record<string, any> {
28
+ const result: Record<string, any> = {};
29
+ if (!meta) return result;
30
+ for (const [key, val] of Object.entries(meta)) {
31
+ if (typeof val === 'string') {
32
+ result[key] = { string_value: val };
33
+ } else if (typeof val === 'number') {
34
+ result[key] = { number_value: val };
35
+ } else if (typeof val === 'boolean') {
36
+ result[key] = { bool_value: val };
37
+ }
38
+ }
39
+ return result;
40
+ }
41
+
42
+ /**
43
+ * Parses the filter_json field from a MetadataFilter proto message.
44
+ */
45
+ export function parseFilterJson(filter: any): Record<string, any> | undefined {
46
+ if (!filter || !filter.filter_json || filter.filter_json === '') {
47
+ return undefined;
48
+ }
49
+ try {
50
+ return JSON.parse(filter.filter_json);
51
+ } catch {
52
+ throw grpcError(grpc.status.INVALID_ARGUMENT, 'Invalid filter_json: must be valid JSON');
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Creates a gRPC ServiceError with the given status code and message.
58
+ */
59
+ export function grpcError(code: grpc.status, message: string): grpc.ServiceError {
60
+ const err = new Error(message) as grpc.ServiceError;
61
+ err.code = code;
62
+ err.details = message;
63
+ err.metadata = new grpc.Metadata();
64
+ return err;
65
+ }
66
+
67
+ /**
68
+ * Wraps an async handler function with standard error mapping.
69
+ */
70
+ export function wrapHandler<TReq, TRes>(
71
+ handler: (call: grpc.ServerUnaryCall<TReq, TRes>) => Promise<TRes>
72
+ ): grpc.handleUnaryCall<TReq, TRes> {
73
+ return (call, callback) => {
74
+ handler(call)
75
+ .then(result => callback(null, result))
76
+ .catch(err => {
77
+ if (err && typeof err.code === 'number') {
78
+ callback(err);
79
+ } else {
80
+ const message = err?.message || 'Internal server error';
81
+ if (message.includes('not found') || message.includes('does not exist')) {
82
+ callback(grpcError(grpc.status.NOT_FOUND, message));
83
+ } else if (message.includes('already exists')) {
84
+ callback(grpcError(grpc.status.ALREADY_EXISTS, message));
85
+ } else if (message.includes('not a document index')) {
86
+ callback(grpcError(grpc.status.FAILED_PRECONDITION, message));
87
+ } else {
88
+ callback(grpcError(grpc.status.INTERNAL, message));
89
+ }
90
+ }
91
+ });
92
+ };
93
+ }
@@ -0,0 +1,7 @@
1
+ export { createIndexHandlers } from './indexHandlers';
2
+ export { createItemHandlers } from './itemHandlers';
3
+ export { createQueryHandlers } from './queryHandlers';
4
+ export { createDocumentHandlers } from './documentHandlers';
5
+ export { createStatsHandlers } from './statsHandlers';
6
+ export { createLifecycleHandlers } from './lifecycleHandlers';
7
+ export { grpcError, wrapHandler, fromProtoMetadata, toProtoMetadata, parseFilterJson } from './helpers';
@@ -0,0 +1,44 @@
1
+ import * as grpc from '@grpc/grpc-js';
2
+ import { IndexManager } from '../IndexManager';
3
+ import { wrapHandler, grpcError } from './helpers';
4
+
5
+ export function createIndexHandlers(manager: IndexManager) {
6
+ return {
7
+ CreateIndex: wrapHandler(async (call: grpc.ServerUnaryCall<any, any>) => {
8
+ const req = call.request;
9
+ if (!req.index_name) {
10
+ throw grpcError(grpc.status.INVALID_ARGUMENT, 'index_name is required');
11
+ }
12
+ const format = req.format || 'json';
13
+ const isDoc = req.is_document_index || false;
14
+ const docConfig = req.document_config ? {
15
+ version: req.document_config.version || 1,
16
+ chunkSize: req.document_config.chunk_size || 512,
17
+ chunkOverlap: req.document_config.chunk_overlap || 0,
18
+ } : undefined;
19
+
20
+ await manager.createIndex(req.index_name, format, isDoc, docConfig);
21
+ return {};
22
+ }),
23
+
24
+ DeleteIndex: wrapHandler(async (call: grpc.ServerUnaryCall<any, any>) => {
25
+ const req = call.request;
26
+ if (!req.index_name) {
27
+ throw grpcError(grpc.status.INVALID_ARGUMENT, 'index_name is required');
28
+ }
29
+ await manager.deleteIndex(req.index_name);
30
+ return {};
31
+ }),
32
+
33
+ ListIndexes: wrapHandler(async (_call: grpc.ServerUnaryCall<any, any>) => {
34
+ const indexes = manager.listIndexes();
35
+ return {
36
+ indexes: indexes.map(idx => ({
37
+ name: idx.name,
38
+ format: idx.format,
39
+ is_document_index: idx.isDocumentIndex,
40
+ })),
41
+ };
42
+ }),
43
+ };
44
+ }