vectra 0.12.3 → 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 (375) hide show
  1. package/README.md +92 -100
  2. package/lib/BrowserWebFetcher.d.ts +75 -0
  3. package/lib/BrowserWebFetcher.d.ts.map +1 -0
  4. package/lib/BrowserWebFetcher.js +290 -0
  5. package/lib/BrowserWebFetcher.js.map +1 -0
  6. package/lib/FileFetcher.d.ts.map +1 -1
  7. package/lib/FileFetcher.js +25 -15
  8. package/lib/FileFetcher.js.map +1 -1
  9. package/lib/FileFetcher.spec.d.ts +2 -0
  10. package/lib/FileFetcher.spec.d.ts.map +1 -0
  11. package/lib/FileFetcher.spec.js +244 -0
  12. package/lib/FileFetcher.spec.js.map +1 -0
  13. package/lib/FolderWatcher.d.ts +91 -0
  14. package/lib/FolderWatcher.d.ts.map +1 -0
  15. package/lib/FolderWatcher.js +304 -0
  16. package/lib/FolderWatcher.js.map +1 -0
  17. package/lib/FolderWatcher.spec.d.ts +2 -0
  18. package/lib/FolderWatcher.spec.d.ts.map +1 -0
  19. package/lib/FolderWatcher.spec.js +308 -0
  20. package/lib/FolderWatcher.spec.js.map +1 -0
  21. package/lib/GPT3Tokenizer.spec.d.ts +2 -0
  22. package/lib/GPT3Tokenizer.spec.d.ts.map +1 -0
  23. package/lib/GPT3Tokenizer.spec.js +45 -0
  24. package/lib/GPT3Tokenizer.spec.js.map +1 -0
  25. package/lib/ItemSelector.d.ts.map +1 -1
  26. package/lib/ItemSelector.js +19 -8
  27. package/lib/ItemSelector.js.map +1 -1
  28. package/lib/ItemSelector.spec.d.ts +2 -0
  29. package/lib/ItemSelector.spec.d.ts.map +1 -0
  30. package/lib/ItemSelector.spec.js +204 -0
  31. package/lib/ItemSelector.spec.js.map +1 -0
  32. package/lib/LocalDocument.d.ts +1 -1
  33. package/lib/LocalDocument.d.ts.map +1 -1
  34. package/lib/LocalDocument.js +5 -45
  35. package/lib/LocalDocument.js.map +1 -1
  36. package/lib/LocalDocument.spec.d.ts +2 -0
  37. package/lib/LocalDocument.spec.d.ts.map +1 -0
  38. package/lib/LocalDocument.spec.js +214 -0
  39. package/lib/LocalDocument.spec.js.map +1 -0
  40. package/lib/LocalDocumentIndex.d.ts +20 -0
  41. package/lib/LocalDocumentIndex.d.ts.map +1 -1
  42. package/lib/LocalDocumentIndex.js +16 -52
  43. package/lib/LocalDocumentIndex.js.map +1 -1
  44. package/lib/LocalDocumentIndex.spec.d.ts +2 -0
  45. package/lib/LocalDocumentIndex.spec.d.ts.map +1 -0
  46. package/lib/LocalDocumentIndex.spec.js +494 -0
  47. package/lib/LocalDocumentIndex.spec.js.map +1 -0
  48. package/lib/LocalDocumentResult.d.ts +32 -11
  49. package/lib/LocalDocumentResult.d.ts.map +1 -1
  50. package/lib/LocalDocumentResult.js +305 -257
  51. package/lib/LocalDocumentResult.js.map +1 -1
  52. package/lib/LocalDocumentResult.spec.d.ts +2 -0
  53. package/lib/LocalDocumentResult.spec.d.ts.map +1 -0
  54. package/lib/LocalDocumentResult.spec.js +373 -0
  55. package/lib/LocalDocumentResult.spec.js.map +1 -0
  56. package/lib/LocalEmbeddings.d.ts +59 -0
  57. package/lib/LocalEmbeddings.d.ts.map +1 -0
  58. package/lib/LocalEmbeddings.js +101 -0
  59. package/lib/LocalEmbeddings.js.map +1 -0
  60. package/lib/LocalEmbeddings.spec.d.ts +2 -0
  61. package/lib/LocalEmbeddings.spec.d.ts.map +1 -0
  62. package/lib/LocalEmbeddings.spec.js +155 -0
  63. package/lib/LocalEmbeddings.spec.js.map +1 -0
  64. package/lib/LocalIndex.d.ts +27 -18
  65. package/lib/LocalIndex.d.ts.map +1 -1
  66. package/lib/LocalIndex.js +109 -105
  67. package/lib/LocalIndex.js.map +1 -1
  68. package/lib/LocalIndex.spec.js +434 -43
  69. package/lib/LocalIndex.spec.js.map +1 -1
  70. package/lib/OpenAIEmbeddings.d.ts +4 -6
  71. package/lib/OpenAIEmbeddings.d.ts.map +1 -1
  72. package/lib/OpenAIEmbeddings.js +16 -24
  73. package/lib/OpenAIEmbeddings.js.map +1 -1
  74. package/lib/OpenAIEmbeddings.spec.d.ts +2 -0
  75. package/lib/OpenAIEmbeddings.spec.d.ts.map +1 -0
  76. package/lib/OpenAIEmbeddings.spec.js +298 -0
  77. package/lib/OpenAIEmbeddings.spec.js.map +1 -0
  78. package/lib/TextSplitter.d.ts +2 -0
  79. package/lib/TextSplitter.d.ts.map +1 -1
  80. package/lib/TextSplitter.js +154 -111
  81. package/lib/TextSplitter.js.map +1 -1
  82. package/lib/TextSplitter.spec.js +289 -61
  83. package/lib/TextSplitter.spec.js.map +1 -1
  84. package/lib/TransformersEmbeddings.d.ts +121 -0
  85. package/lib/TransformersEmbeddings.d.ts.map +1 -0
  86. package/lib/TransformersEmbeddings.js +176 -0
  87. package/lib/TransformersEmbeddings.js.map +1 -0
  88. package/lib/TransformersEmbeddings.spec.d.ts +2 -0
  89. package/lib/TransformersEmbeddings.spec.d.ts.map +1 -0
  90. package/lib/TransformersEmbeddings.spec.js +198 -0
  91. package/lib/TransformersEmbeddings.spec.js.map +1 -0
  92. package/lib/TransformersTokenizer.d.ts +33 -0
  93. package/lib/TransformersTokenizer.d.ts.map +1 -0
  94. package/lib/TransformersTokenizer.js +44 -0
  95. package/lib/TransformersTokenizer.js.map +1 -0
  96. package/lib/TransformersTokenizer.spec.d.ts +2 -0
  97. package/lib/TransformersTokenizer.spec.d.ts.map +1 -0
  98. package/lib/TransformersTokenizer.spec.js +112 -0
  99. package/lib/TransformersTokenizer.spec.js.map +1 -0
  100. package/lib/WebFetcher.d.ts +1 -2
  101. package/lib/WebFetcher.d.ts.map +1 -1
  102. package/lib/WebFetcher.js +58 -54
  103. package/lib/WebFetcher.js.map +1 -1
  104. package/lib/WebFetcher.spec.d.ts +2 -0
  105. package/lib/WebFetcher.spec.d.ts.map +1 -0
  106. package/lib/WebFetcher.spec.js +263 -0
  107. package/lib/WebFetcher.spec.js.map +1 -0
  108. package/lib/browser.d.ts +30 -0
  109. package/lib/browser.d.ts.map +1 -0
  110. package/lib/browser.js +52 -0
  111. package/lib/browser.js.map +1 -0
  112. package/lib/codecs/IndexCodec.d.ts +37 -0
  113. package/lib/codecs/IndexCodec.d.ts.map +1 -0
  114. package/lib/codecs/IndexCodec.js +3 -0
  115. package/lib/codecs/IndexCodec.js.map +1 -0
  116. package/lib/codecs/JsonCodec.d.ts +19 -0
  117. package/lib/codecs/JsonCodec.d.ts.map +1 -0
  118. package/lib/codecs/JsonCodec.js +35 -0
  119. package/lib/codecs/JsonCodec.js.map +1 -0
  120. package/lib/codecs/JsonCodec.spec.d.ts +2 -0
  121. package/lib/codecs/JsonCodec.spec.d.ts.map +1 -0
  122. package/lib/codecs/JsonCodec.spec.js +66 -0
  123. package/lib/codecs/JsonCodec.spec.js.map +1 -0
  124. package/lib/codecs/LocalIndex.protobuf.spec.d.ts +2 -0
  125. package/lib/codecs/LocalIndex.protobuf.spec.d.ts.map +1 -0
  126. package/lib/codecs/LocalIndex.protobuf.spec.js +108 -0
  127. package/lib/codecs/LocalIndex.protobuf.spec.js.map +1 -0
  128. package/lib/codecs/ProtobufCodec.d.ts +20 -0
  129. package/lib/codecs/ProtobufCodec.d.ts.map +1 -0
  130. package/lib/codecs/ProtobufCodec.js +225 -0
  131. package/lib/codecs/ProtobufCodec.js.map +1 -0
  132. package/lib/codecs/ProtobufCodec.spec.d.ts +2 -0
  133. package/lib/codecs/ProtobufCodec.spec.d.ts.map +1 -0
  134. package/lib/codecs/ProtobufCodec.spec.js +155 -0
  135. package/lib/codecs/ProtobufCodec.spec.js.map +1 -0
  136. package/lib/codecs/index.d.ts +5 -0
  137. package/lib/codecs/index.d.ts.map +1 -0
  138. package/lib/codecs/index.js +21 -0
  139. package/lib/codecs/index.js.map +1 -0
  140. package/lib/codecs/migrateIndex.d.ts +24 -0
  141. package/lib/codecs/migrateIndex.d.ts.map +1 -0
  142. package/lib/codecs/migrateIndex.js +119 -0
  143. package/lib/codecs/migrateIndex.js.map +1 -0
  144. package/lib/codecs/migrateIndex.spec.d.ts +2 -0
  145. package/lib/codecs/migrateIndex.spec.d.ts.map +1 -0
  146. package/lib/codecs/migrateIndex.spec.js +151 -0
  147. package/lib/codecs/migrateIndex.spec.js.map +1 -0
  148. package/lib/codecs/schemas/index.proto +34 -0
  149. package/lib/index.d.ts +9 -1
  150. package/lib/index.d.ts.map +1 -1
  151. package/lib/index.js +9 -1
  152. package/lib/index.js.map +1 -1
  153. package/lib/internals/Colorize.d.ts.map +1 -1
  154. package/lib/internals/Colorize.js +20 -15
  155. package/lib/internals/Colorize.js.map +1 -1
  156. package/lib/server/IndexManager.d.ts +78 -0
  157. package/lib/server/IndexManager.d.ts.map +1 -0
  158. package/lib/server/IndexManager.js +259 -0
  159. package/lib/server/IndexManager.js.map +1 -0
  160. package/lib/server/VectraServer.d.ts +40 -0
  161. package/lib/server/VectraServer.d.ts.map +1 -0
  162. package/lib/server/VectraServer.js +151 -0
  163. package/lib/server/VectraServer.js.map +1 -0
  164. package/lib/server/VectraServer.spec.d.ts +2 -0
  165. package/lib/server/VectraServer.spec.d.ts.map +1 -0
  166. package/lib/server/VectraServer.spec.js +322 -0
  167. package/lib/server/VectraServer.spec.js.map +1 -0
  168. package/lib/server/handlers/documentHandlers.d.ts +15 -0
  169. package/lib/server/handlers/documentHandlers.d.ts.map +1 -0
  170. package/lib/server/handlers/documentHandlers.js +95 -0
  171. package/lib/server/handlers/documentHandlers.js.map +1 -0
  172. package/lib/server/handlers/helpers.d.ts +23 -0
  173. package/lib/server/handlers/helpers.d.ts.map +1 -0
  174. package/lib/server/handlers/helpers.js +138 -0
  175. package/lib/server/handlers/helpers.js.map +1 -0
  176. package/lib/server/handlers/index.d.ts +8 -0
  177. package/lib/server/handlers/index.d.ts.map +1 -0
  178. package/lib/server/handlers/index.js +22 -0
  179. package/lib/server/handlers/index.js.map +1 -0
  180. package/lib/server/handlers/indexHandlers.d.ts +14 -0
  181. package/lib/server/handlers/indexHandlers.d.ts.map +1 -0
  182. package/lib/server/handlers/indexHandlers.js +85 -0
  183. package/lib/server/handlers/indexHandlers.js.map +1 -0
  184. package/lib/server/handlers/itemHandlers.d.ts +34 -0
  185. package/lib/server/handlers/itemHandlers.d.ts.map +1 -0
  186. package/lib/server/handlers/itemHandlers.js +166 -0
  187. package/lib/server/handlers/itemHandlers.js.map +1 -0
  188. package/lib/server/handlers/lifecycleHandlers.d.ts +11 -0
  189. package/lib/server/handlers/lifecycleHandlers.d.ts.map +1 -0
  190. package/lib/server/handlers/lifecycleHandlers.js +31 -0
  191. package/lib/server/handlers/lifecycleHandlers.js.map +1 -0
  192. package/lib/server/handlers/queryHandlers.d.ts +27 -0
  193. package/lib/server/handlers/queryHandlers.d.ts.map +1 -0
  194. package/lib/server/handlers/queryHandlers.js +135 -0
  195. package/lib/server/handlers/queryHandlers.js.map +1 -0
  196. package/lib/server/handlers/statsHandlers.d.ts +17 -0
  197. package/lib/server/handlers/statsHandlers.d.ts.map +1 -0
  198. package/lib/server/handlers/statsHandlers.js +81 -0
  199. package/lib/server/handlers/statsHandlers.js.map +1 -0
  200. package/lib/server/index.d.ts +4 -0
  201. package/lib/server/index.d.ts.map +1 -0
  202. package/lib/server/index.js +23 -0
  203. package/lib/server/index.js.map +1 -0
  204. package/lib/storage/FileStorage.d.ts +92 -0
  205. package/lib/storage/FileStorage.d.ts.map +1 -0
  206. package/lib/storage/FileStorage.js +3 -0
  207. package/lib/storage/FileStorage.js.map +1 -0
  208. package/lib/storage/FileStorageUtilities.d.ts +36 -0
  209. package/lib/storage/FileStorageUtilities.d.ts.map +1 -0
  210. package/lib/storage/FileStorageUtilities.js +91 -0
  211. package/lib/storage/FileStorageUtilities.js.map +1 -0
  212. package/lib/storage/FileStorageUtilities.spec.d.ts +2 -0
  213. package/lib/storage/FileStorageUtilities.spec.d.ts.map +1 -0
  214. package/lib/storage/FileStorageUtilities.spec.js +98 -0
  215. package/lib/storage/FileStorageUtilities.spec.js.map +1 -0
  216. package/lib/storage/FileType.d.ts +29 -0
  217. package/lib/storage/FileType.d.ts.map +1 -0
  218. package/lib/storage/FileType.js +38 -0
  219. package/lib/storage/FileType.js.map +1 -0
  220. package/lib/storage/IndexedDBStorage.d.ts +47 -0
  221. package/lib/storage/IndexedDBStorage.d.ts.map +1 -0
  222. package/lib/storage/IndexedDBStorage.js +347 -0
  223. package/lib/storage/IndexedDBStorage.js.map +1 -0
  224. package/lib/storage/LocalFileStorage.browser.d.ts +19 -0
  225. package/lib/storage/LocalFileStorage.browser.d.ts.map +1 -0
  226. package/lib/storage/LocalFileStorage.browser.js +43 -0
  227. package/lib/storage/LocalFileStorage.browser.js.map +1 -0
  228. package/lib/storage/LocalFileStorage.d.ts +23 -0
  229. package/lib/storage/LocalFileStorage.d.ts.map +1 -0
  230. package/lib/storage/LocalFileStorage.js +152 -0
  231. package/lib/storage/LocalFileStorage.js.map +1 -0
  232. package/lib/storage/LocalFileStorage.spec.d.ts +2 -0
  233. package/lib/storage/LocalFileStorage.spec.d.ts.map +1 -0
  234. package/lib/storage/LocalFileStorage.spec.js +249 -0
  235. package/lib/storage/LocalFileStorage.spec.js.map +1 -0
  236. package/lib/storage/VirtualFileStorage.d.ts +18 -0
  237. package/lib/storage/VirtualFileStorage.d.ts.map +1 -0
  238. package/lib/storage/VirtualFileStorage.js +178 -0
  239. package/lib/storage/VirtualFileStorage.js.map +1 -0
  240. package/lib/storage/VirtualFileStorage.spec.d.ts +2 -0
  241. package/lib/storage/VirtualFileStorage.spec.d.ts.map +1 -0
  242. package/lib/storage/VirtualFileStorage.spec.js +302 -0
  243. package/lib/storage/VirtualFileStorage.spec.js.map +1 -0
  244. package/lib/storage/index.d.ts +6 -0
  245. package/lib/storage/index.d.ts.map +1 -0
  246. package/lib/storage/index.js +22 -0
  247. package/lib/storage/index.js.map +1 -0
  248. package/lib/templates/templates/csharp/README.md +48 -0
  249. package/lib/templates/templates/csharp/VectraClient.cs +234 -0
  250. package/lib/templates/templates/go/README.md +71 -0
  251. package/lib/templates/templates/go/vectra_client.go +322 -0
  252. package/lib/templates/templates/java/README.md +81 -0
  253. package/lib/templates/templates/java/VectraClient.java +232 -0
  254. package/lib/templates/templates/python/README.md +37 -0
  255. package/lib/templates/templates/python/vectra_client.py +279 -0
  256. package/lib/templates/templates/rust/Cargo.toml +14 -0
  257. package/lib/templates/templates/rust/README.md +39 -0
  258. package/lib/templates/templates/rust/build.rs +4 -0
  259. package/lib/templates/templates/rust/lib.rs +284 -0
  260. package/lib/templates/templates/typescript/README.md +96 -0
  261. package/lib/templates/templates/typescript/VectraClient.ts +374 -0
  262. package/lib/templates/typescript/VectraClient.d.ts +114 -0
  263. package/lib/templates/typescript/VectraClient.d.ts.map +1 -0
  264. package/lib/templates/typescript/VectraClient.js +328 -0
  265. package/lib/templates/typescript/VectraClient.js.map +1 -0
  266. package/lib/types.d.ts +7 -0
  267. package/lib/types.d.ts.map +1 -1
  268. package/lib/utils/index.d.ts +2 -0
  269. package/lib/utils/index.d.ts.map +1 -0
  270. package/lib/utils/index.js +18 -0
  271. package/lib/utils/index.js.map +1 -0
  272. package/lib/utils/pathUtils.d.ts +40 -0
  273. package/lib/utils/pathUtils.d.ts.map +1 -0
  274. package/lib/utils/pathUtils.js +98 -0
  275. package/lib/utils/pathUtils.js.map +1 -0
  276. package/lib/vectra-cli.d.ts.map +1 -1
  277. package/lib/vectra-cli.generate.spec.d.ts +2 -0
  278. package/lib/vectra-cli.generate.spec.d.ts.map +1 -0
  279. package/lib/vectra-cli.generate.spec.js +112 -0
  280. package/lib/vectra-cli.generate.spec.js.map +1 -0
  281. package/lib/vectra-cli.js +446 -9
  282. package/lib/vectra-cli.js.map +1 -1
  283. package/lib/vectra-cli.spec.d.ts +1 -0
  284. package/lib/vectra-cli.spec.d.ts.map +1 -0
  285. package/lib/vectra-cli.spec.js +2 -0
  286. package/lib/vectra-cli.spec.js.map +1 -0
  287. package/package.json +89 -16
  288. package/proto/vectra_service.proto +276 -0
  289. package/src/BrowserWebFetcher.ts +345 -0
  290. package/src/FileFetcher.spec.ts +234 -0
  291. package/src/FileFetcher.ts +37 -25
  292. package/src/FolderWatcher.spec.ts +288 -0
  293. package/src/FolderWatcher.ts +304 -0
  294. package/src/GPT3Tokenizer.spec.ts +50 -0
  295. package/src/ItemSelector.spec.ts +252 -0
  296. package/src/ItemSelector.ts +163 -150
  297. package/src/LocalDocument.spec.ts +211 -0
  298. package/src/LocalDocument.ts +88 -94
  299. package/src/LocalDocumentIndex.spec.ts +481 -0
  300. package/src/LocalDocumentIndex.ts +39 -40
  301. package/src/LocalDocumentResult.spec.ts +373 -0
  302. package/src/LocalDocumentResult.ts +489 -319
  303. package/src/LocalEmbeddings.spec.ts +138 -0
  304. package/src/LocalEmbeddings.ts +120 -0
  305. package/src/LocalIndex.spec.ts +808 -323
  306. package/src/LocalIndex.ts +479 -430
  307. package/src/OpenAIEmbeddings.spec.ts +354 -0
  308. package/src/OpenAIEmbeddings.ts +26 -27
  309. package/src/TextSplitter.spec.ts +320 -65
  310. package/src/TextSplitter.ts +172 -115
  311. package/src/TransformersEmbeddings.spec.ts +188 -0
  312. package/src/TransformersEmbeddings.ts +232 -0
  313. package/src/TransformersTokenizer.spec.ts +143 -0
  314. package/src/TransformersTokenizer.ts +45 -0
  315. package/src/WebFetcher.spec.ts +288 -0
  316. package/src/WebFetcher.ts +184 -186
  317. package/src/browser.ts +69 -0
  318. package/src/codecs/IndexCodec.ts +40 -0
  319. package/src/codecs/JsonCodec.spec.ts +70 -0
  320. package/src/codecs/JsonCodec.ts +37 -0
  321. package/src/codecs/LocalIndex.protobuf.spec.ts +115 -0
  322. package/src/codecs/ProtobufCodec.spec.ts +166 -0
  323. package/src/codecs/ProtobufCodec.ts +193 -0
  324. package/src/codecs/index.ts +4 -0
  325. package/src/codecs/migrateIndex.spec.ts +176 -0
  326. package/src/codecs/migrateIndex.ts +125 -0
  327. package/src/codecs/schemas/index.proto +34 -0
  328. package/src/index.ts +9 -1
  329. package/src/internals/Colorize.ts +19 -16
  330. package/src/server/IndexManager.ts +243 -0
  331. package/src/server/VectraServer.spec.ts +303 -0
  332. package/src/server/VectraServer.ts +156 -0
  333. package/src/server/handlers/documentHandlers.ts +59 -0
  334. package/src/server/handlers/helpers.ts +93 -0
  335. package/src/server/handlers/index.ts +7 -0
  336. package/src/server/handlers/indexHandlers.ts +44 -0
  337. package/src/server/handlers/itemHandlers.ts +140 -0
  338. package/src/server/handlers/lifecycleHandlers.ts +26 -0
  339. package/src/server/handlers/queryHandlers.ts +96 -0
  340. package/src/server/handlers/statsHandlers.ts +38 -0
  341. package/src/server/index.ts +3 -0
  342. package/src/storage/FileStorage.ts +105 -0
  343. package/src/storage/FileStorageUtilities.spec.ts +106 -0
  344. package/src/storage/FileStorageUtilities.ts +77 -0
  345. package/src/storage/FileType.ts +61 -0
  346. package/src/storage/IndexedDBStorage.ts +365 -0
  347. package/src/storage/LocalFileStorage.browser.ts +52 -0
  348. package/src/storage/LocalFileStorage.spec.ts +292 -0
  349. package/src/storage/LocalFileStorage.ts +98 -0
  350. package/src/storage/VirtualFileStorage.spec.ts +307 -0
  351. package/src/storage/VirtualFileStorage.ts +169 -0
  352. package/src/storage/index.ts +5 -0
  353. package/src/templates/csharp/README.md +48 -0
  354. package/src/templates/csharp/VectraClient.cs +234 -0
  355. package/src/templates/go/README.md +71 -0
  356. package/src/templates/go/vectra_client.go +322 -0
  357. package/src/templates/java/README.md +81 -0
  358. package/src/templates/java/VectraClient.java +232 -0
  359. package/src/templates/python/README.md +37 -0
  360. package/src/templates/python/vectra_client.py +279 -0
  361. package/src/templates/rust/Cargo.toml +14 -0
  362. package/src/templates/rust/README.md +39 -0
  363. package/src/templates/rust/build.rs +4 -0
  364. package/src/templates/rust/lib.rs +284 -0
  365. package/src/templates/typescript/README.md +96 -0
  366. package/src/templates/typescript/VectraClient.ts +374 -0
  367. package/src/types.ts +131 -123
  368. package/src/utils/index.ts +1 -0
  369. package/src/utils/pathUtils.ts +106 -0
  370. package/src/vectra-cli.generate.spec.ts +72 -0
  371. package/src/vectra-cli.spec.ts +0 -0
  372. package/src/vectra-cli.ts +687 -246
  373. package/README.draft.md +0 -499
  374. package/README.draft.outline.md +0 -160
  375. package/README.research.md +0 -2159
@@ -0,0 +1,112 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ const assert = __importStar(require("assert"));
46
+ const fs = __importStar(require("fs/promises"));
47
+ const path = __importStar(require("path"));
48
+ const os = __importStar(require("os"));
49
+ const child_process_1 = require("child_process");
50
+ describe('vectra generate', () => {
51
+ let tmpDir;
52
+ const projectRoot = process.cwd();
53
+ beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
54
+ tmpDir = yield fs.mkdtemp(path.join(os.tmpdir(), 'vectra-gen-'));
55
+ }));
56
+ afterEach(() => __awaiter(void 0, void 0, void 0, function* () {
57
+ yield fs.rm(tmpDir, { recursive: true, force: true });
58
+ }));
59
+ const languages = ['python', 'csharp', 'rust', 'go', 'java', 'typescript'];
60
+ for (const lang of languages) {
61
+ it(`should generate ${lang} bindings`, () => __awaiter(void 0, void 0, void 0, function* () {
62
+ const outputDir = path.join(tmpDir, lang);
63
+ const binPath = path.join(projectRoot, 'bin', 'vectra.js');
64
+ (0, child_process_1.execSync)(`node "${binPath}" generate --language ${lang} --output "${outputDir}"`, {
65
+ cwd: projectRoot,
66
+ timeout: 15000,
67
+ });
68
+ // Verify proto file was copied
69
+ const protoPath = path.join(outputDir, 'vectra_service.proto');
70
+ const protoStat = yield fs.stat(protoPath);
71
+ assert.ok(protoStat.isFile(), 'vectra_service.proto should exist');
72
+ // Verify README was copied
73
+ const readmePath = path.join(outputDir, 'README.md');
74
+ const readmeStat = yield fs.stat(readmePath);
75
+ assert.ok(readmeStat.isFile(), 'README.md should exist');
76
+ // Language-specific checks
77
+ const files = yield fs.readdir(outputDir);
78
+ if (lang === 'python') {
79
+ assert.ok(files.includes('vectra_client.py'), 'should have vectra_client.py');
80
+ }
81
+ else if (lang === 'csharp') {
82
+ assert.ok(files.includes('VectraClient.cs'), 'should have VectraClient.cs');
83
+ }
84
+ else if (lang === 'rust') {
85
+ assert.ok(files.includes('lib.rs'), 'should have lib.rs');
86
+ assert.ok(files.includes('Cargo.toml'), 'should have Cargo.toml');
87
+ assert.ok(files.includes('build.rs'), 'should have build.rs');
88
+ }
89
+ else if (lang === 'go') {
90
+ assert.ok(files.includes('vectra_client.go'), 'should have vectra_client.go');
91
+ }
92
+ else if (lang === 'java') {
93
+ assert.ok(files.includes('VectraClient.java'), 'should have VectraClient.java');
94
+ }
95
+ else if (lang === 'typescript') {
96
+ assert.ok(files.includes('VectraClient.ts'), 'should have VectraClient.ts');
97
+ }
98
+ }));
99
+ }
100
+ it('should create output directory if it does not exist', () => __awaiter(void 0, void 0, void 0, function* () {
101
+ const outputDir = path.join(tmpDir, 'nested', 'deep', 'dir');
102
+ const binPath = path.join(projectRoot, 'bin', 'vectra.js');
103
+ (0, child_process_1.execSync)(`node "${binPath}" generate --language python --output "${outputDir}"`, {
104
+ cwd: projectRoot,
105
+ timeout: 15000,
106
+ });
107
+ const files = yield fs.readdir(outputDir);
108
+ assert.ok(files.includes('vectra_service.proto'));
109
+ assert.ok(files.includes('vectra_client.py'));
110
+ }));
111
+ });
112
+ //# sourceMappingURL=vectra-cli.generate.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vectra-cli.generate.spec.js","sourceRoot":"","sources":["../src/vectra-cli.generate.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,gDAAkC;AAClC,2CAA6B;AAC7B,uCAAyB;AACzB,iDAAyC;AAEzC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,IAAI,MAAc,CAAC;IACnB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,UAAU,CAAC,GAAS,EAAE;QAClB,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACrE,CAAC,CAAA,CAAC,CAAC;IAEH,SAAS,CAAC,GAAS,EAAE;QACjB,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAA,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAU,CAAC;IAEpF,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC3B,EAAE,CAAC,mBAAmB,IAAI,WAAW,EAAE,GAAS,EAAE;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YAC3D,IAAA,wBAAQ,EAAC,SAAS,OAAO,yBAAyB,IAAI,cAAc,SAAS,GAAG,EAAE;gBAC9E,GAAG,EAAE,WAAW;gBAChB,OAAO,EAAE,KAAK;aACjB,CAAC,CAAC;YAEH,+BAA+B;YAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;YAC/D,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,mCAAmC,CAAC,CAAC;YAEnE,2BAA2B;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7C,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC;YAEzD,2BAA2B;YAC3B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpB,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,8BAA8B,CAAC,CAAC;YAClF,CAAC;iBAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,6BAA6B,CAAC,CAAC;YAChF,CAAC;iBAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC,CAAC;gBAC1D,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,wBAAwB,CAAC,CAAC;gBAClE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,sBAAsB,CAAC,CAAC;YAClE,CAAC;iBAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACvB,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,8BAA8B,CAAC,CAAC;YAClF,CAAC;iBAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,+BAA+B,CAAC,CAAC;YACpF,CAAC;iBAAM,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC/B,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,6BAA6B,CAAC,CAAC;YAChF,CAAC;QACL,CAAC,CAAA,CAAC,CAAC;IACP,CAAC;IAED,EAAE,CAAC,qDAAqD,EAAE,GAAS,EAAE;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC3D,IAAA,wBAAQ,EAAC,SAAS,OAAO,0CAA0C,SAAS,GAAG,EAAE;YAC7E,GAAG,EAAE,WAAW;YAChB,OAAO,EAAE,KAAK;SACjB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAClD,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
package/lib/vectra-cli.js CHANGED
@@ -47,6 +47,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
47
47
  Object.defineProperty(exports, "__esModule", { value: true });
48
48
  exports.run = run;
49
49
  const fs = __importStar(require("fs/promises"));
50
+ const fsSync = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
50
52
  const yargs_1 = __importDefault(require("yargs/yargs"));
51
53
  const helpers_1 = require("yargs/helpers");
52
54
  const LocalDocumentIndex_1 = require("./LocalDocumentIndex");
@@ -54,21 +56,61 @@ const WebFetcher_1 = require("./WebFetcher");
54
56
  const OpenAIEmbeddings_1 = require("./OpenAIEmbeddings");
55
57
  const internals_1 = require("./internals");
56
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
+ }
57
79
  function run() {
58
80
  return __awaiter(this, void 0, void 0, function* () {
59
81
  // prettier-ignore
60
82
  const args = yield (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
61
83
  .scriptName('vectra')
62
- .command('create <index>', `create a new local index`, {}, (args) => __awaiter(this, void 0, void 0, function* () {
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* () {
63
100
  const folderPath = args.index;
64
- const index = new LocalDocumentIndex_1.LocalDocumentIndex({ folderPath });
65
- console.log(internals_1.Colorize.output(`creating index at ${folderPath}`));
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}`));
66
106
  yield index.createIndex({ version: 1, deleteIfExists: true });
67
107
  }))
68
108
  .command('delete <index>', `delete an existing local index`, {}, (args) => __awaiter(this, void 0, void 0, function* () {
69
109
  const folderPath = args.index;
70
110
  console.log(internals_1.Colorize.output(`deleting index at ${folderPath}`));
71
- const index = new LocalDocumentIndex_1.LocalDocumentIndex({ 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 });
72
114
  yield index.deleteIndex();
73
115
  }))
74
116
  .command('add <index>', `adds one or more web pages to an index`, (yargs) => {
@@ -124,12 +166,16 @@ function run() {
124
166
  const embeddings = new OpenAIEmbeddings_1.OpenAIEmbeddings(options);
125
167
  // Initialize index
126
168
  const folderPath = args.index;
169
+ const storage = getStorage(args);
170
+ const codec = yield (0, codecs_1.detectCodec)(folderPath, storage).catch(() => undefined);
127
171
  const index = new LocalDocumentIndex_1.LocalDocumentIndex({
128
172
  folderPath,
129
173
  embeddings,
130
174
  chunkingConfig: {
131
175
  chunkSize: args.chunkSize
132
- }
176
+ },
177
+ storage,
178
+ codec
133
179
  });
134
180
  // Get list of url's
135
181
  const uris = yield getItemList(args.uri, args.list, 'web page');
@@ -179,7 +225,9 @@ function run() {
179
225
  }, (args) => __awaiter(this, void 0, void 0, function* () {
180
226
  // Initialize index
181
227
  const folderPath = args.index;
182
- const index = new LocalDocumentIndex_1.LocalDocumentIndex({ folderPath });
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 });
183
231
  // Get list of uri's
184
232
  const uris = yield getItemList(args.uri, args.list, 'document');
185
233
  // Remove documents
@@ -188,12 +236,31 @@ function run() {
188
236
  yield index.deleteDocument(uri);
189
237
  }
190
238
  }))
191
- .command('stats <index>', `prints the stats for a local index`, {}, (args) => __awaiter(this, void 0, void 0, function* () {
239
+ .command('stats <index>', `prints the stats for a local index`, (yargs) => {
240
+ return yargs;
241
+ }, (args) => __awaiter(this, void 0, void 0, function* () {
192
242
  const folderPath = args.index;
193
- const index = new LocalDocumentIndex_1.LocalDocumentIndex({ folderPath });
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 });
194
247
  const stats = yield index.getCatalogStats();
195
248
  console.log(internals_1.Colorize.title('Index Stats'));
196
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`));
197
264
  }))
198
265
  .command('query <index> <query>', `queries a local index`, (yargs) => {
199
266
  return yargs
@@ -256,9 +323,13 @@ function run() {
256
323
  const embeddings = new OpenAIEmbeddings_1.OpenAIEmbeddings(options);
257
324
  // Initialize index
258
325
  const folderPath = args.index;
326
+ const storage = getStorage(args);
327
+ const codec = yield (0, codecs_1.detectCodec)(folderPath, storage).catch(() => undefined);
259
328
  const index = new LocalDocumentIndex_1.LocalDocumentIndex({
260
329
  folderPath,
261
- embeddings
330
+ embeddings,
331
+ storage,
332
+ codec
262
333
  });
263
334
  // Query index
264
335
  const query = args.query;
@@ -300,6 +371,372 @@ function run() {
300
371
  }
301
372
  }
302
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
+ }
303
740
  }))
304
741
  .help()
305
742
  .demandCommand()