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,760 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.run = run;
49
+ const fs = __importStar(require("fs/promises"));
50
+ const fsSync = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ const yargs_1 = __importDefault(require("yargs/yargs"));
53
+ const helpers_1 = require("yargs/helpers");
54
+ const LocalDocumentIndex_1 = require("./LocalDocumentIndex");
55
+ const WebFetcher_1 = require("./WebFetcher");
56
+ const OpenAIEmbeddings_1 = require("./OpenAIEmbeddings");
57
+ const internals_1 = require("./internals");
58
+ const FileFetcher_1 = require("./FileFetcher");
59
+ const LocalFileStorage_1 = require("./storage/LocalFileStorage");
60
+ const VirtualFileStorage_1 = require("./storage/VirtualFileStorage");
61
+ const codecs_1 = require("./codecs");
62
+ const VectraServer_1 = require("./server/VectraServer");
63
+ const FolderWatcher_1 = require("./FolderWatcher");
64
+ function getStorage(args) {
65
+ if (args.storage === 'virtual') {
66
+ return new VirtualFileStorage_1.VirtualFileStorage();
67
+ }
68
+ else {
69
+ return new LocalFileStorage_1.LocalFileStorage(args.storageRoot);
70
+ }
71
+ }
72
+ function getCodecFromFormat(format) {
73
+ if (format === 'protobuf')
74
+ return new codecs_1.ProtobufCodec();
75
+ if (format === 'json')
76
+ return new codecs_1.JsonCodec();
77
+ return undefined; // default
78
+ }
79
+ function run() {
80
+ return __awaiter(this, void 0, void 0, function* () {
81
+ // prettier-ignore
82
+ const args = yield (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
83
+ .scriptName('vectra')
84
+ .option('storage', {
85
+ describe: 'storage backend to use',
86
+ choices: ['local', 'virtual'],
87
+ default: 'local'
88
+ })
89
+ .option('storage-root', {
90
+ describe: 'root folder for local storage (only applies if storage=local)',
91
+ type: 'string'
92
+ })
93
+ .command('create <index>', `create a new local index`, (yargs) => {
94
+ return yargs.option('format', {
95
+ describe: 'serialization format for the index',
96
+ choices: ['json', 'protobuf'],
97
+ default: 'json'
98
+ });
99
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
100
+ const folderPath = args.index;
101
+ const storage = getStorage(args);
102
+ const codec = getCodecFromFormat(args.format);
103
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({ folderPath, storage, codec });
104
+ const formatLabel = args.format === 'protobuf' ? 'protobuf' : 'json';
105
+ console.log(internals_1.Colorize.output(`creating ${formatLabel} index at ${folderPath}`));
106
+ yield index.createIndex({ version: 1, deleteIfExists: true });
107
+ }))
108
+ .command('delete <index>', `delete an existing local index`, {}, (args) => __awaiter(this, void 0, void 0, function* () {
109
+ const folderPath = args.index;
110
+ console.log(internals_1.Colorize.output(`deleting index at ${folderPath}`));
111
+ const storage = getStorage(args);
112
+ const codec = yield (0, codecs_1.detectCodec)(folderPath, storage).catch(() => undefined);
113
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({ folderPath, storage, codec });
114
+ yield index.deleteIndex();
115
+ }))
116
+ .command('add <index>', `adds one or more web pages to an index`, (yargs) => {
117
+ return yargs
118
+ .option('keys', {
119
+ alias: 'k',
120
+ describe: 'path of a JSON file containing the model keys to use for generating embeddings',
121
+ type: 'string'
122
+ })
123
+ .option('uri', {
124
+ alias: 'u',
125
+ array: true,
126
+ describe: 'http/https link to a web page to add',
127
+ type: 'string'
128
+ })
129
+ .option('list', {
130
+ alias: 'l',
131
+ describe: 'path to a file containing a list of web pages to add',
132
+ type: 'string'
133
+ })
134
+ .option('cookie', {
135
+ alias: 'c',
136
+ describe: 'optional cookies to add to web fetch requests',
137
+ type: 'string'
138
+ })
139
+ .option('chunk-size', {
140
+ alias: 'cs',
141
+ describe: 'size of the generated chunks in tokens (defaults to 512)',
142
+ type: 'number',
143
+ default: 512
144
+ })
145
+ .check((argv) => {
146
+ if (Array.isArray(argv.uri) && argv.uri.length > 0) {
147
+ return true;
148
+ }
149
+ else if (typeof argv.list == 'string' && argv.list.trim().length > 0) {
150
+ return true;
151
+ }
152
+ else {
153
+ throw new Error(`you must specify either one or more "--uri <link>" for the pages to add or a "--list <file path>" for a file containing the list of pages to add.`);
154
+ }
155
+ })
156
+ .demandOption(['keys']);
157
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
158
+ console.log(internals_1.Colorize.title('Adding Web Pages to Index'));
159
+ // Get embedding options
160
+ const options = JSON.parse(yield fs.readFile(args.keys, 'utf-8'));
161
+ if (options.apiKey && !options.model) {
162
+ options.model = 'text-embedding-ada-002';
163
+ options.maxTokens = 8000;
164
+ }
165
+ // Create embeddings
166
+ const embeddings = new OpenAIEmbeddings_1.OpenAIEmbeddings(options);
167
+ // Initialize index
168
+ const folderPath = args.index;
169
+ const storage = getStorage(args);
170
+ const codec = yield (0, codecs_1.detectCodec)(folderPath, storage).catch(() => undefined);
171
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({
172
+ folderPath,
173
+ embeddings,
174
+ chunkingConfig: {
175
+ chunkSize: args.chunkSize
176
+ },
177
+ storage,
178
+ codec
179
+ });
180
+ // Get list of url's
181
+ const uris = yield getItemList(args.uri, args.list, 'web page');
182
+ // Fetch documents
183
+ const fileFetcher = new FileFetcher_1.FileFetcher();
184
+ const webFetcher = args.cookie ? new WebFetcher_1.WebFetcher({ headers: { "cookie": args.cookie } }) : new WebFetcher_1.WebFetcher();
185
+ for (const path of uris) {
186
+ try {
187
+ console.log(internals_1.Colorize.progress(`fetching ${path}`));
188
+ const fetcher = path.startsWith('http') ? webFetcher : fileFetcher;
189
+ yield fetcher.fetch(path, (uri, text, docType) => __awaiter(this, void 0, void 0, function* () {
190
+ console.log(internals_1.Colorize.replaceLine(internals_1.Colorize.progress(`indexing ${uri}`)));
191
+ yield index.upsertDocument(uri, text, docType);
192
+ console.log(internals_1.Colorize.replaceLine(internals_1.Colorize.success(`added ${uri}`)));
193
+ return true;
194
+ }));
195
+ }
196
+ catch (err) {
197
+ console.log(internals_1.Colorize.replaceLine(internals_1.Colorize.error(`Error adding: ${path}\n${err.message}`)));
198
+ }
199
+ }
200
+ }))
201
+ .command('remove <index>', `removes one or more documents from an index`, (yargs) => {
202
+ return yargs
203
+ .option('uri', {
204
+ alias: 'u',
205
+ array: true,
206
+ describe: 'uri of a document to remove',
207
+ type: 'string'
208
+ })
209
+ .option('list', {
210
+ alias: 'l',
211
+ describe: 'path to a file containing a list of documents to remove',
212
+ type: 'string'
213
+ })
214
+ .check((argv) => {
215
+ if (Array.isArray(argv.uri) && argv.uri.length > 0) {
216
+ return true;
217
+ }
218
+ else if (typeof argv.list == 'string' && argv.list.trim().length > 0) {
219
+ return true;
220
+ }
221
+ else {
222
+ throw new Error(`you must specify either one or more "--uri <link>" for the pages to add or a "--list <file path>" for a file containing the list of pages to add.`);
223
+ }
224
+ });
225
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
226
+ // Initialize index
227
+ const folderPath = args.index;
228
+ const storage = getStorage(args);
229
+ const codec = yield (0, codecs_1.detectCodec)(folderPath, storage).catch(() => undefined);
230
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({ folderPath, storage, codec });
231
+ // Get list of uri's
232
+ const uris = yield getItemList(args.uri, args.list, 'document');
233
+ // Remove documents
234
+ for (const uri of uris) {
235
+ console.log(`removing ${uri}`);
236
+ yield index.deleteDocument(uri);
237
+ }
238
+ }))
239
+ .command('stats <index>', `prints the stats for a local index`, (yargs) => {
240
+ return yargs;
241
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
242
+ const folderPath = args.index;
243
+ const storage = getStorage(args);
244
+ // Auto-detect format from files on disk
245
+ const codec = yield (0, codecs_1.detectCodec)(folderPath, storage);
246
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({ folderPath, storage, codec });
247
+ const stats = yield index.getCatalogStats();
248
+ console.log(internals_1.Colorize.title('Index Stats'));
249
+ console.log(internals_1.Colorize.output(stats));
250
+ }))
251
+ .command('migrate <index>', `migrate an index between serialization formats`, (yargs) => {
252
+ return yargs.option('to', {
253
+ describe: 'target format',
254
+ choices: ['json', 'protobuf'],
255
+ demandOption: true
256
+ });
257
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
258
+ const folderPath = args.index;
259
+ const storage = getStorage(args);
260
+ const to = args.to;
261
+ console.log(internals_1.Colorize.output(`migrating index at ${folderPath} to ${to} format`));
262
+ yield (0, codecs_1.migrateIndex)(folderPath, { to, storage });
263
+ console.log(internals_1.Colorize.output(`migration complete`));
264
+ }))
265
+ .command('query <index> <query>', `queries a local index`, (yargs) => {
266
+ return yargs
267
+ .option('keys', {
268
+ alias: 'k',
269
+ describe: 'path of a JSON file containing the model keys to use for generating embeddings'
270
+ })
271
+ .option('document-count', {
272
+ alias: 'dc',
273
+ describe: 'max number of documents to return (defaults to 10)',
274
+ type: 'number',
275
+ default: 10
276
+ })
277
+ .option('chunk-count', {
278
+ alias: 'cc',
279
+ describe: 'max number of chunks to return (defaults to 50)',
280
+ type: 'number',
281
+ default: 50
282
+ })
283
+ .option('section-count', {
284
+ alias: 'sc',
285
+ describe: 'max number of document sections to render (defaults to 1)',
286
+ type: 'number',
287
+ default: 1
288
+ })
289
+ .option('tokens', {
290
+ alias: 't',
291
+ describe: 'max number of tokens to render for each document section (defaults to 2000)',
292
+ type: 'number',
293
+ default: 2000
294
+ })
295
+ .option('format', {
296
+ alias: 'f',
297
+ describe: `format of the rendered results. Defaults to 'sections'`,
298
+ choices: ['sections', 'stats', 'chunks'],
299
+ default: 'sections'
300
+ })
301
+ .option('overlap', {
302
+ alias: 'o',
303
+ describe: `whether to add overlapping chunks to sections.`,
304
+ type: 'boolean',
305
+ default: true
306
+ })
307
+ .option('bm25', {
308
+ alias: 'b',
309
+ describe: 'Use Okapi-bm25 keyword search alogrithm to perform hybrid search - semantic + keyword. Displayed in blue during search.',
310
+ type: 'boolean',
311
+ default: false
312
+ })
313
+ .demandOption(['keys']);
314
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
315
+ console.log(internals_1.Colorize.title('Querying Index'));
316
+ // Get embedding options
317
+ const options = JSON.parse(yield fs.readFile(args.keys, 'utf-8'));
318
+ if (options.apiKey && !options.model) {
319
+ options.model = 'text-embedding-ada-002';
320
+ options.maxTokens = 8000;
321
+ }
322
+ // Create embeddings
323
+ const embeddings = new OpenAIEmbeddings_1.OpenAIEmbeddings(options);
324
+ // Initialize index
325
+ const folderPath = args.index;
326
+ const storage = getStorage(args);
327
+ const codec = yield (0, codecs_1.detectCodec)(folderPath, storage).catch(() => undefined);
328
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({
329
+ folderPath,
330
+ embeddings,
331
+ storage,
332
+ codec
333
+ });
334
+ // Query index
335
+ const query = args.query;
336
+ const results = yield index.queryDocuments(query, {
337
+ maxDocuments: args.documentCount,
338
+ maxChunks: args.chunkCount,
339
+ isBm25: args.bm25,
340
+ });
341
+ // Render results
342
+ for (const result of results) {
343
+ console.log(internals_1.Colorize.output(result.uri));
344
+ console.log(internals_1.Colorize.value('score', result.score));
345
+ console.log(internals_1.Colorize.value('chunks', result.chunks.length));
346
+ if (args.format == 'sections') {
347
+ const sections = yield result.renderSections(args.tokens, args.sectionCount, args.overlap);
348
+ console.log(sections.length);
349
+ for (let i = 0; i < sections.length; i++) {
350
+ const section = sections[i];
351
+ const isBm25 = sections[i].isBm25;
352
+ console.log(isBm25);
353
+ console.log(internals_1.Colorize.title(args.sectionCount == 1 ? 'Section' : `Section ${i + 1}`));
354
+ console.log(internals_1.Colorize.value('score', section.score));
355
+ console.log(internals_1.Colorize.value('tokens', section.tokenCount));
356
+ console.log(internals_1.Colorize.output(section.text, isBm25));
357
+ }
358
+ }
359
+ else if (args.format == 'chunks') {
360
+ const text = yield result.loadText();
361
+ for (let i = 0; i < result.chunks.length; i++) {
362
+ const chunk = result.chunks[i];
363
+ const startPos = chunk.item.metadata.startPos;
364
+ const endPos = chunk.item.metadata.endPos;
365
+ const isBm25 = Boolean(chunk.item.metadata.isBm25);
366
+ console.log(internals_1.Colorize.title(`Chunk ${i + 1}`));
367
+ console.log(internals_1.Colorize.value('score', chunk.score));
368
+ console.log(internals_1.Colorize.value('startPos', startPos));
369
+ console.log(internals_1.Colorize.value('endPos', endPos));
370
+ console.log(internals_1.Colorize.output(text.substring(startPos, endPos + 1), isBm25));
371
+ }
372
+ }
373
+ }
374
+ }))
375
+ .command('watch <index>', 'watch folders and automatically sync file changes into the index', (yargs) => {
376
+ return yargs
377
+ .option('keys', {
378
+ alias: 'k',
379
+ describe: 'path of a JSON file containing the model keys to use for generating embeddings',
380
+ type: 'string'
381
+ })
382
+ .option('uri', {
383
+ alias: 'u',
384
+ array: true,
385
+ describe: 'folder or file path to watch',
386
+ type: 'string'
387
+ })
388
+ .option('list', {
389
+ alias: 'l',
390
+ describe: 'path to a file containing a list of folders/files to watch',
391
+ type: 'string'
392
+ })
393
+ .option('extensions', {
394
+ alias: 'e',
395
+ array: true,
396
+ describe: 'file extensions to include (e.g., .txt .md .html)',
397
+ type: 'string'
398
+ })
399
+ .option('chunk-size', {
400
+ alias: 'cs',
401
+ describe: 'size of the generated chunks in tokens (defaults to 512)',
402
+ type: 'number',
403
+ default: 512
404
+ })
405
+ .option('debounce', {
406
+ describe: 'debounce interval in milliseconds (defaults to 500)',
407
+ type: 'number',
408
+ default: 500
409
+ })
410
+ .check((argv) => {
411
+ if (Array.isArray(argv.uri) && argv.uri.length > 0) {
412
+ return true;
413
+ }
414
+ else if (typeof argv.list == 'string' && argv.list.trim().length > 0) {
415
+ return true;
416
+ }
417
+ else {
418
+ throw new Error(`you must specify either one or more "--uri <path>" for the folders/files to watch or a "--list <file path>" for a file containing the paths.`);
419
+ }
420
+ })
421
+ .demandOption(['keys']);
422
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
423
+ console.log(internals_1.Colorize.title('Vectra Watch Mode'));
424
+ // Get embedding options
425
+ const options = JSON.parse(yield fs.readFile(args.keys, 'utf-8'));
426
+ if (options.apiKey && !options.model) {
427
+ options.model = 'text-embedding-ada-002';
428
+ options.maxTokens = 8000;
429
+ }
430
+ // Create embeddings
431
+ const embeddings = new OpenAIEmbeddings_1.OpenAIEmbeddings(options);
432
+ // Initialize index
433
+ const folderPath = args.index;
434
+ const storage = getStorage(args);
435
+ const codec = yield (0, codecs_1.detectCodec)(folderPath, storage).catch(() => undefined);
436
+ const index = new LocalDocumentIndex_1.LocalDocumentIndex({
437
+ folderPath,
438
+ embeddings,
439
+ chunkingConfig: {
440
+ chunkSize: args.chunkSize
441
+ },
442
+ storage,
443
+ codec
444
+ });
445
+ // Get list of paths to watch
446
+ const watchPaths = yield getItemList(args.uri, args.list, 'path');
447
+ // Create watcher
448
+ const watcher = new FolderWatcher_1.FolderWatcher({
449
+ index,
450
+ paths: watchPaths,
451
+ extensions: args.extensions,
452
+ debounceMs: args.debounce
453
+ });
454
+ // Wire up events
455
+ watcher.on('sync', (uri, action) => {
456
+ if (action === 'deleted') {
457
+ console.log(internals_1.Colorize.warning(`removed ${uri}`));
458
+ }
459
+ else {
460
+ console.log(internals_1.Colorize.success(`${action} ${uri}`));
461
+ }
462
+ });
463
+ watcher.on('error', (err, uri) => {
464
+ console.log(internals_1.Colorize.error(`Error syncing ${uri}: ${err.message}`));
465
+ });
466
+ // Start watching
467
+ console.log(internals_1.Colorize.progress(`performing initial sync...`));
468
+ yield watcher.start();
469
+ console.log(internals_1.Colorize.success(`initial sync complete (${watcher.trackedFileCount} files tracked)`));
470
+ console.log(internals_1.Colorize.output(`watching for changes... (press Ctrl+C to stop)`));
471
+ // Handle graceful shutdown
472
+ const handleSignal = () => __awaiter(this, void 0, void 0, function* () {
473
+ console.log(internals_1.Colorize.output('\nStopping watcher...'));
474
+ yield watcher.stop();
475
+ process.exit(0);
476
+ });
477
+ process.on('SIGINT', handleSignal);
478
+ process.on('SIGTERM', handleSignal);
479
+ }))
480
+ .command('generate', 'generate language bindings for the gRPC service', (yargs) => {
481
+ return yargs
482
+ .option('language', {
483
+ alias: 'l',
484
+ describe: 'target language for the generated bindings',
485
+ choices: ['python', 'csharp', 'rust', 'go', 'java', 'typescript'],
486
+ demandOption: true
487
+ })
488
+ .option('output', {
489
+ alias: 'o',
490
+ describe: 'output directory for the generated files',
491
+ type: 'string',
492
+ demandOption: true
493
+ });
494
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
495
+ const language = args.language;
496
+ const outputDir = path.resolve(args.output);
497
+ // Locate the proto file — check lib/ first (installed package), then project root
498
+ const protoSearchPaths = [
499
+ path.join(__dirname, '..', 'proto', 'vectra_service.proto'),
500
+ path.join(__dirname, '..', '..', 'proto', 'vectra_service.proto'),
501
+ ];
502
+ let protoSource;
503
+ for (const p of protoSearchPaths) {
504
+ if (fsSync.existsSync(p)) {
505
+ protoSource = p;
506
+ break;
507
+ }
508
+ }
509
+ if (!protoSource) {
510
+ console.error(internals_1.Colorize.error('Could not locate vectra_service.proto'));
511
+ process.exit(1);
512
+ }
513
+ // Locate the template directory
514
+ const templateSearchPaths = [
515
+ path.join(__dirname, '..', 'src', 'templates', language),
516
+ path.join(__dirname, 'templates', language),
517
+ ];
518
+ let templateDir;
519
+ for (const p of templateSearchPaths) {
520
+ if (fsSync.existsSync(p)) {
521
+ templateDir = p;
522
+ break;
523
+ }
524
+ }
525
+ if (!templateDir) {
526
+ console.error(internals_1.Colorize.error(`Could not locate template for language: ${language}`));
527
+ process.exit(1);
528
+ }
529
+ // Create output directory
530
+ yield fs.mkdir(outputDir, { recursive: true });
531
+ // Copy proto file
532
+ const protoDest = path.join(outputDir, 'vectra_service.proto');
533
+ yield fs.copyFile(protoSource, protoDest);
534
+ console.log(internals_1.Colorize.success(`copied vectra_service.proto`));
535
+ // Copy all template files
536
+ const templateFiles = yield fs.readdir(templateDir);
537
+ for (const file of templateFiles) {
538
+ const src = path.join(templateDir, file);
539
+ const stat = yield fs.stat(src);
540
+ if (stat.isFile()) {
541
+ const dest = path.join(outputDir, file);
542
+ yield fs.copyFile(src, dest);
543
+ console.log(internals_1.Colorize.success(`copied ${file}`));
544
+ }
545
+ }
546
+ console.log(internals_1.Colorize.output(`\nGenerated ${language} bindings in ${outputDir}`));
547
+ // Print next steps
548
+ const nextSteps = {
549
+ python: [
550
+ 'Next steps:',
551
+ ' pip install grpcio grpcio-tools',
552
+ ' python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. vectra_service.proto',
553
+ ].join('\n'),
554
+ csharp: [
555
+ 'Next steps:',
556
+ ' dotnet add package Grpc.Net.Client',
557
+ ' dotnet add package Google.Protobuf',
558
+ ' dotnet add package Grpc.Tools',
559
+ ' Add <Protobuf Include="vectra_service.proto" GrpcServices="Client" /> to your .csproj',
560
+ ].join('\n'),
561
+ rust: [
562
+ 'Next steps:',
563
+ ' Ensure protoc is installed (apt install protobuf-compiler / brew install protobuf)',
564
+ ' cargo build (tonic-build generates stubs automatically)',
565
+ ].join('\n'),
566
+ go: [
567
+ 'Next steps:',
568
+ ' go install google.golang.org/protobuf/cmd/protoc-gen-go@latest',
569
+ ' go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest',
570
+ ' protoc --go_out=. --go-grpc_out=. vectra_service.proto',
571
+ ' Update the import path in vectra_client.go to match your module',
572
+ ].join('\n'),
573
+ java: [
574
+ 'Next steps:',
575
+ ' Place vectra_service.proto in src/main/proto/',
576
+ ' Add gRPC dependencies to your build tool (see README.md for Gradle/Maven)',
577
+ ' Build to generate stubs automatically',
578
+ ].join('\n'),
579
+ typescript: [
580
+ 'Next steps:',
581
+ ' npm install @grpc/grpc-js @grpc/proto-loader',
582
+ ' No codegen needed — proto is loaded dynamically at runtime',
583
+ ' import { VectraClient } from \'./VectraClient\';',
584
+ ].join('\n'),
585
+ };
586
+ console.log(internals_1.Colorize.output(nextSteps[language]));
587
+ }))
588
+ .command('serve [index]', 'start the gRPC server to serve indexes', (yargs) => {
589
+ return yargs
590
+ .positional('index', {
591
+ describe: 'path to a single index directory (mutually exclusive with --root)',
592
+ type: 'string'
593
+ })
594
+ .option('root', {
595
+ describe: 'directory containing multiple index subdirectories',
596
+ type: 'string'
597
+ })
598
+ .option('port', {
599
+ alias: 'p',
600
+ describe: 'port to bind the gRPC server on',
601
+ type: 'number',
602
+ default: 50051
603
+ })
604
+ .option('daemon', {
605
+ describe: 'fork to background as a daemon process',
606
+ type: 'boolean',
607
+ default: false
608
+ })
609
+ .option('pid-file', {
610
+ describe: 'path to PID file (daemon mode only)',
611
+ type: 'string'
612
+ })
613
+ .option('keys', {
614
+ alias: 'k',
615
+ describe: 'path to a JSON file containing the model keys for embeddings',
616
+ type: 'string'
617
+ })
618
+ .check((argv) => {
619
+ if (!argv.index && !argv.root) {
620
+ throw new Error('You must provide either an <index> path or --root <dir>');
621
+ }
622
+ if (argv.index && argv.root) {
623
+ throw new Error('<index> and --root are mutually exclusive');
624
+ }
625
+ return true;
626
+ });
627
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
628
+ // Load embeddings if keys provided
629
+ let embeddings;
630
+ if (args.keys) {
631
+ const options = JSON.parse(yield fs.readFile(args.keys, 'utf-8'));
632
+ if (options.apiKey && !options.model) {
633
+ options.model = 'text-embedding-ada-002';
634
+ options.maxTokens = 8000;
635
+ }
636
+ embeddings = new OpenAIEmbeddings_1.OpenAIEmbeddings(options);
637
+ }
638
+ const server = new VectraServer_1.VectraServer({
639
+ port: args.port,
640
+ indexPath: args.index,
641
+ rootDir: args.root,
642
+ embeddings,
643
+ });
644
+ if (args.daemon) {
645
+ // Daemon mode: fork a child process
646
+ const { spawn } = require('child_process');
647
+ const cliArgs = process.argv.slice(2).filter(a => a !== '--daemon');
648
+ const child = spawn(process.execPath, [process.argv[1], ...cliArgs], {
649
+ detached: true,
650
+ stdio: 'ignore',
651
+ });
652
+ child.unref();
653
+ // Write PID file
654
+ const pidFile = args.pidFile || path.join(args.root || path.dirname(args.index), '.vectra.pid');
655
+ yield fs.writeFile(pidFile, String(child.pid));
656
+ console.log(internals_1.Colorize.output(`Vectra server started as daemon (PID: ${child.pid})`));
657
+ console.log(internals_1.Colorize.output(`PID file: ${pidFile}`));
658
+ process.exit(0);
659
+ }
660
+ else {
661
+ // Foreground mode
662
+ const port = yield server.start();
663
+ console.log(internals_1.Colorize.output(`Vectra gRPC server listening on 127.0.0.1:${port}`));
664
+ const loaded = server.indexManager.listIndexes();
665
+ if (loaded.length > 0) {
666
+ console.log(internals_1.Colorize.output(`Loaded indexes:`));
667
+ for (const idx of loaded) {
668
+ console.log(internals_1.Colorize.output(` - ${idx.name} (${idx.format}, ${idx.isDocumentIndex ? 'document' : 'item'})`));
669
+ }
670
+ }
671
+ else {
672
+ console.log(internals_1.Colorize.output(`No indexes loaded yet. Use CreateIndex RPC or add index directories.`));
673
+ }
674
+ // Handle graceful shutdown
675
+ const handleSignal = () => __awaiter(this, void 0, void 0, function* () {
676
+ console.log(internals_1.Colorize.output('\nShutting down...'));
677
+ yield server.shutdown();
678
+ process.exit(0);
679
+ });
680
+ process.on('SIGINT', handleSignal);
681
+ process.on('SIGTERM', handleSignal);
682
+ }
683
+ }))
684
+ .command('stop', 'stop a running Vectra daemon', (yargs) => {
685
+ return yargs.option('pid-file', {
686
+ describe: 'path to PID file',
687
+ type: 'string',
688
+ demandOption: true
689
+ });
690
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
691
+ const pidFile = args.pidFile;
692
+ if (!fsSync.existsSync(pidFile)) {
693
+ console.log(internals_1.Colorize.error(`PID file not found: ${pidFile}`));
694
+ process.exit(1);
695
+ }
696
+ const pid = parseInt(yield fs.readFile(pidFile, 'utf-8'), 10);
697
+ if (isNaN(pid)) {
698
+ console.log(internals_1.Colorize.error(`Invalid PID in file: ${pidFile}`));
699
+ process.exit(1);
700
+ }
701
+ try {
702
+ // Send SIGTERM for graceful shutdown
703
+ process.kill(pid, 'SIGTERM');
704
+ console.log(internals_1.Colorize.output(`Sent SIGTERM to PID ${pid}`));
705
+ // Wait up to 10s for process to exit
706
+ const deadline = Date.now() + 10000;
707
+ while (Date.now() < deadline) {
708
+ try {
709
+ process.kill(pid, 0); // check if process exists
710
+ yield new Promise(r => setTimeout(r, 500));
711
+ }
712
+ catch (_a) {
713
+ // Process no longer exists
714
+ break;
715
+ }
716
+ }
717
+ // Check if still alive and force kill
718
+ try {
719
+ process.kill(pid, 0);
720
+ process.kill(pid, 'SIGKILL');
721
+ console.log(internals_1.Colorize.output(`Force-killed PID ${pid}`));
722
+ }
723
+ catch (_b) {
724
+ // Already dead
725
+ }
726
+ // Remove PID file
727
+ yield fs.unlink(pidFile).catch(() => { });
728
+ console.log(internals_1.Colorize.output('Vectra server stopped'));
729
+ }
730
+ catch (err) {
731
+ if (err.code === 'ESRCH') {
732
+ console.log(internals_1.Colorize.output(`Process ${pid} not running. Cleaning up PID file.`));
733
+ yield fs.unlink(pidFile).catch(() => { });
734
+ }
735
+ else {
736
+ console.log(internals_1.Colorize.error(`Failed to stop server: ${err.message}`));
737
+ process.exit(1);
738
+ }
739
+ }
740
+ }))
741
+ .help()
742
+ .demandCommand()
743
+ .parseAsync();
744
+ });
745
+ }
746
+ function getItemList(items, listFile, uriType) {
747
+ return __awaiter(this, void 0, void 0, function* () {
748
+ if (Array.isArray(items) && items.length > 0) {
749
+ return items;
750
+ }
751
+ else if (typeof listFile == 'string' && listFile.trim().length > 0) {
752
+ const list = yield fs.readFile(listFile, 'utf-8');
753
+ return list.split('\n').map((item) => item.trim()).filter((item) => item.length > 0);
754
+ }
755
+ else {
756
+ throw new Error(`you must specify either one or more "--uri <${uriType}>" for the items or a "--list <file path>" for a file containing the items.`);
757
+ }
758
+ });
759
+ }
760
+ //# sourceMappingURL=vectra-cli.js.map