localrag 0.1.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 (86) hide show
  1. package/README.md +178 -0
  2. package/dist/chunking/chunking-service.d.ts +18 -0
  3. package/dist/chunking/chunking-service.d.ts.map +1 -0
  4. package/dist/chunking/chunking-service.js +71 -0
  5. package/dist/chunking/chunking-service.js.map +1 -0
  6. package/dist/cli/commands/init.d.ts +8 -0
  7. package/dist/cli/commands/init.d.ts.map +1 -0
  8. package/dist/cli/commands/init.js +107 -0
  9. package/dist/cli/commands/init.js.map +1 -0
  10. package/dist/cli/commands/open.d.ts +8 -0
  11. package/dist/cli/commands/open.d.ts.map +1 -0
  12. package/dist/cli/commands/open.js +105 -0
  13. package/dist/cli/commands/open.js.map +1 -0
  14. package/dist/cli/commands/search.d.ts +10 -0
  15. package/dist/cli/commands/search.d.ts.map +1 -0
  16. package/dist/cli/commands/search.js +73 -0
  17. package/dist/cli/commands/search.js.map +1 -0
  18. package/dist/cli/commands/start.d.ts +8 -0
  19. package/dist/cli/commands/start.d.ts.map +1 -0
  20. package/dist/cli/commands/start.js +122 -0
  21. package/dist/cli/commands/start.js.map +1 -0
  22. package/dist/cli/commands/status.d.ts +12 -0
  23. package/dist/cli/commands/status.d.ts.map +1 -0
  24. package/dist/cli/commands/status.js +89 -0
  25. package/dist/cli/commands/status.js.map +1 -0
  26. package/dist/cli/index.d.ts +3 -0
  27. package/dist/cli/index.d.ts.map +1 -0
  28. package/dist/cli/index.js +62 -0
  29. package/dist/cli/index.js.map +1 -0
  30. package/dist/config/config-service.d.ts +22 -0
  31. package/dist/config/config-service.d.ts.map +1 -0
  32. package/dist/config/config-service.js +108 -0
  33. package/dist/config/config-service.js.map +1 -0
  34. package/dist/db/lancedb-repository.d.ts +28 -0
  35. package/dist/db/lancedb-repository.d.ts.map +1 -0
  36. package/dist/db/lancedb-repository.js +132 -0
  37. package/dist/db/lancedb-repository.js.map +1 -0
  38. package/dist/embedding/embedding-service.d.ts +22 -0
  39. package/dist/embedding/embedding-service.d.ts.map +1 -0
  40. package/dist/embedding/embedding-service.js +99 -0
  41. package/dist/embedding/embedding-service.js.map +1 -0
  42. package/dist/extractors/docx-extractor.d.ts +12 -0
  43. package/dist/extractors/docx-extractor.d.ts.map +1 -0
  44. package/dist/extractors/docx-extractor.js +29 -0
  45. package/dist/extractors/docx-extractor.js.map +1 -0
  46. package/dist/extractors/extractor.interface.d.ts +14 -0
  47. package/dist/extractors/extractor.interface.d.ts.map +1 -0
  48. package/dist/extractors/extractor.interface.js +63 -0
  49. package/dist/extractors/extractor.interface.js.map +1 -0
  50. package/dist/extractors/pdf-extractor.d.ts +11 -0
  51. package/dist/extractors/pdf-extractor.d.ts.map +1 -0
  52. package/dist/extractors/pdf-extractor.js +89 -0
  53. package/dist/extractors/pdf-extractor.js.map +1 -0
  54. package/dist/extractors/pptx-extractor.d.ts +12 -0
  55. package/dist/extractors/pptx-extractor.d.ts.map +1 -0
  56. package/dist/extractors/pptx-extractor.js +98 -0
  57. package/dist/extractors/pptx-extractor.js.map +1 -0
  58. package/dist/extractors/text-extractor.d.ts +10 -0
  59. package/dist/extractors/text-extractor.d.ts.map +1 -0
  60. package/dist/extractors/text-extractor.js +52 -0
  61. package/dist/extractors/text-extractor.js.map +1 -0
  62. package/dist/extractors/xlsx-extractor.d.ts +11 -0
  63. package/dist/extractors/xlsx-extractor.d.ts.map +1 -0
  64. package/dist/extractors/xlsx-extractor.js +28 -0
  65. package/dist/extractors/xlsx-extractor.js.map +1 -0
  66. package/dist/indexer/indexer.d.ts +34 -0
  67. package/dist/indexer/indexer.d.ts.map +1 -0
  68. package/dist/indexer/indexer.js +100 -0
  69. package/dist/indexer/indexer.js.map +1 -0
  70. package/dist/metadata/metadata-service.d.ts +34 -0
  71. package/dist/metadata/metadata-service.d.ts.map +1 -0
  72. package/dist/metadata/metadata-service.js +147 -0
  73. package/dist/metadata/metadata-service.js.map +1 -0
  74. package/dist/scanner/file-scanner.d.ts +20 -0
  75. package/dist/scanner/file-scanner.d.ts.map +1 -0
  76. package/dist/scanner/file-scanner.js +110 -0
  77. package/dist/scanner/file-scanner.js.map +1 -0
  78. package/dist/search/search-service.d.ts +18 -0
  79. package/dist/search/search-service.d.ts.map +1 -0
  80. package/dist/search/search-service.js +98 -0
  81. package/dist/search/search-service.js.map +1 -0
  82. package/dist/watcher/file-watcher.d.ts +27 -0
  83. package/dist/watcher/file-watcher.d.ts.map +1 -0
  84. package/dist/watcher/file-watcher.js +110 -0
  85. package/dist/watcher/file-watcher.js.map +1 -0
  86. package/package.json +53 -0
@@ -0,0 +1,110 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.FileWatcher = void 0;
37
+ const path = __importStar(require("path"));
38
+ const chokidar = __importStar(require("chokidar"));
39
+ const extractor_interface_1 = require("../extractors/extractor.interface");
40
+ /**
41
+ * FileWatcher wraps chokidar and routes file-system events to the Indexer.
42
+ *
43
+ * - add / change → indexFile()
44
+ * - unlink → removeFile()
45
+ *
46
+ * Events are serialised through a simple sequential queue to prevent
47
+ * concurrent writes to LanceDB from the same watcher process.
48
+ */
49
+ class FileWatcher {
50
+ watcher;
51
+ indexer;
52
+ // Simple sequential queue: each pending promise is awaited before the next
53
+ queue = Promise.resolve();
54
+ constructor(indexer) {
55
+ this.indexer = indexer;
56
+ }
57
+ watch(folders, callbacks = {}) {
58
+ const { onAdd, onChange, onUnlink, onReady, onProgress, onError } = callbacks;
59
+ const opts = { onProgress, onError };
60
+ this.watcher = chokidar.watch(folders, {
61
+ persistent: true,
62
+ ignoreInitial: false, // emit 'add' for existing files on startup
63
+ followSymlinks: true,
64
+ awaitWriteFinish: { stabilityThreshold: 500, pollInterval: 100 },
65
+ ignored: [
66
+ /(^|[/\\])\../, // dotfiles / hidden
67
+ '**/node_modules/**',
68
+ '**/.git/**',
69
+ ],
70
+ });
71
+ this.watcher
72
+ .on('add', (filePath) => {
73
+ if (!(0, extractor_interface_1.isSupportedFile)(filePath))
74
+ return;
75
+ onAdd?.(filePath);
76
+ this.enqueue(() => this.indexer.indexFile(filePath, opts));
77
+ })
78
+ .on('change', (filePath) => {
79
+ if (!(0, extractor_interface_1.isSupportedFile)(filePath))
80
+ return;
81
+ onChange?.(filePath);
82
+ this.enqueue(async () => {
83
+ await this.indexer.removeFile(filePath, opts);
84
+ await this.indexer.indexFile(filePath, opts);
85
+ });
86
+ })
87
+ .on('unlink', (filePath) => {
88
+ if (!(0, extractor_interface_1.isSupportedFile)(filePath))
89
+ return;
90
+ onUnlink?.(filePath);
91
+ this.enqueue(() => this.indexer.removeFile(filePath, opts));
92
+ })
93
+ .on('ready', () => onReady?.())
94
+ .on('error', (err) => {
95
+ onError?.(path.join(...folders), err);
96
+ });
97
+ }
98
+ async close() {
99
+ if (this.watcher)
100
+ await this.watcher.close();
101
+ }
102
+ // ── Queue ────────────────────────────────────────────────────────────────
103
+ enqueue(task) {
104
+ // Chain the task onto the queue; errors are swallowed at queue level
105
+ // (individual tasks already call onError internally)
106
+ this.queue = this.queue.then(task).catch(() => { });
107
+ }
108
+ }
109
+ exports.FileWatcher = FileWatcher;
110
+ //# sourceMappingURL=file-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../src/watcher/file-watcher.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "localrag",
3
+ "version": "0.1.0",
4
+ "description": "Local-first semantic document search CLI — indexes your documents and finds them by meaning, not keywords. No cloud. No API keys.",
5
+ "main": "dist/cli/index.js",
6
+ "bin": {
7
+ "localrag": "./dist/cli/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsc --watch",
12
+ "prepublishOnly": "npm run build"
13
+ },
14
+ "keywords": [
15
+ "rag",
16
+ "semantic-search",
17
+ "local-first",
18
+ "vector-search",
19
+ "documents",
20
+ "cli",
21
+ "lancedb",
22
+ "embeddings"
23
+ ],
24
+ "author": "ujjwal.shrivas",
25
+ "license": "MIT",
26
+ "files": [
27
+ "dist/",
28
+ "README.md"
29
+ ],
30
+ "dependencies": {
31
+ "@xenova/transformers": "^2.17.2",
32
+ "adm-zip": "^0.5.16",
33
+ "chalk": "^4.1.2",
34
+ "chokidar": "^3.6.0",
35
+ "cli-table3": "^0.6.5",
36
+ "commander": "^12.1.0",
37
+ "fast-xml-parser": "^4.5.0",
38
+ "mammoth": "^1.8.0",
39
+ "ora": "^5.4.1",
40
+ "pdf-parse": "^1.1.1",
41
+ "vectordb": "^0.4.20",
42
+ "xlsx": "^0.18.5"
43
+ },
44
+ "devDependencies": {
45
+ "@types/adm-zip": "^0.5.7",
46
+ "@types/node": "^22.0.0",
47
+ "@types/pdf-parse": "^1.1.4",
48
+ "typescript": "^5.5.0"
49
+ },
50
+ "engines": {
51
+ "node": ">=18.0.0"
52
+ }
53
+ }