@ssmeo/mcp-local-rag 0.18.6

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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.de.md +441 -0
  3. package/README.es.md +441 -0
  4. package/README.fr.md +441 -0
  5. package/README.md +530 -0
  6. package/README.pt-BR.md +441 -0
  7. package/README.zh-CN.md +441 -0
  8. package/dist/bin/install-skills.d.ts +19 -0
  9. package/dist/bin/install-skills.d.ts.map +1 -0
  10. package/dist/bin/install-skills.js +218 -0
  11. package/dist/bin/install-skills.js.map +1 -0
  12. package/dist/chunker/index.d.ts +24 -0
  13. package/dist/chunker/index.d.ts.map +1 -0
  14. package/dist/chunker/index.js +2 -0
  15. package/dist/chunker/index.js.map +1 -0
  16. package/dist/chunker/semantic-chunker.d.ts +96 -0
  17. package/dist/chunker/semantic-chunker.d.ts.map +1 -0
  18. package/dist/chunker/semantic-chunker.js +362 -0
  19. package/dist/chunker/semantic-chunker.js.map +1 -0
  20. package/dist/chunker/sentence-splitter.d.ts +32 -0
  21. package/dist/chunker/sentence-splitter.d.ts.map +1 -0
  22. package/dist/chunker/sentence-splitter.js +231 -0
  23. package/dist/chunker/sentence-splitter.js.map +1 -0
  24. package/dist/chunker/token-containment.d.ts +39 -0
  25. package/dist/chunker/token-containment.d.ts.map +1 -0
  26. package/dist/chunker/token-containment.js +83 -0
  27. package/dist/chunker/token-containment.js.map +1 -0
  28. package/dist/cli/common.d.ts +34 -0
  29. package/dist/cli/common.d.ts.map +1 -0
  30. package/dist/cli/common.js +121 -0
  31. package/dist/cli/common.js.map +1 -0
  32. package/dist/cli/delete.d.ts +3 -0
  33. package/dist/cli/delete.d.ts.map +1 -0
  34. package/dist/cli/delete.js +169 -0
  35. package/dist/cli/delete.js.map +1 -0
  36. package/dist/cli/file-collection.d.ts +2 -0
  37. package/dist/cli/file-collection.d.ts.map +1 -0
  38. package/dist/cli/file-collection.js +53 -0
  39. package/dist/cli/file-collection.js.map +1 -0
  40. package/dist/cli/ingest.d.ts +69 -0
  41. package/dist/cli/ingest.d.ts.map +1 -0
  42. package/dist/cli/ingest.js +323 -0
  43. package/dist/cli/ingest.js.map +1 -0
  44. package/dist/cli/list.d.ts +27 -0
  45. package/dist/cli/list.d.ts.map +1 -0
  46. package/dist/cli/list.js +207 -0
  47. package/dist/cli/list.js.map +1 -0
  48. package/dist/cli/options.d.ts +89 -0
  49. package/dist/cli/options.d.ts.map +1 -0
  50. package/dist/cli/options.js +244 -0
  51. package/dist/cli/options.js.map +1 -0
  52. package/dist/cli/query.d.ts +17 -0
  53. package/dist/cli/query.d.ts.map +1 -0
  54. package/dist/cli/query.js +194 -0
  55. package/dist/cli/query.js.map +1 -0
  56. package/dist/cli/read-neighbors.d.ts +3 -0
  57. package/dist/cli/read-neighbors.d.ts.map +1 -0
  58. package/dist/cli/read-neighbors.js +192 -0
  59. package/dist/cli/read-neighbors.js.map +1 -0
  60. package/dist/cli/status.d.ts +6 -0
  61. package/dist/cli/status.d.ts.map +1 -0
  62. package/dist/cli/status.js +78 -0
  63. package/dist/cli/status.js.map +1 -0
  64. package/dist/cli/sync.d.ts +6 -0
  65. package/dist/cli/sync.d.ts.map +1 -0
  66. package/dist/cli/sync.js +271 -0
  67. package/dist/cli/sync.js.map +1 -0
  68. package/dist/cli-main.d.ts +9 -0
  69. package/dist/cli-main.d.ts.map +1 -0
  70. package/dist/cli-main.js +60 -0
  71. package/dist/cli-main.js.map +1 -0
  72. package/dist/embedder/index.d.ts +143 -0
  73. package/dist/embedder/index.d.ts.map +1 -0
  74. package/dist/embedder/index.js +429 -0
  75. package/dist/embedder/index.js.map +1 -0
  76. package/dist/embedder/remote.d.ts +51 -0
  77. package/dist/embedder/remote.d.ts.map +1 -0
  78. package/dist/embedder/remote.js +182 -0
  79. package/dist/embedder/remote.js.map +1 -0
  80. package/dist/features/list.d.ts +37 -0
  81. package/dist/features/list.d.ts.map +1 -0
  82. package/dist/features/list.js +41 -0
  83. package/dist/features/list.js.map +1 -0
  84. package/dist/features/sync.d.ts +219 -0
  85. package/dist/features/sync.d.ts.map +1 -0
  86. package/dist/features/sync.js +461 -0
  87. package/dist/features/sync.js.map +1 -0
  88. package/dist/index.d.ts +3 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +56 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/ingest/compute.d.ts +63 -0
  93. package/dist/ingest/compute.d.ts.map +1 -0
  94. package/dist/ingest/compute.js +161 -0
  95. package/dist/ingest/compute.js.map +1 -0
  96. package/dist/ingest/file.d.ts +40 -0
  97. package/dist/ingest/file.d.ts.map +1 -0
  98. package/dist/ingest/file.js +74 -0
  99. package/dist/ingest/file.js.map +1 -0
  100. package/dist/ingest/visual.d.ts +52 -0
  101. package/dist/ingest/visual.d.ts.map +1 -0
  102. package/dist/ingest/visual.js +294 -0
  103. package/dist/ingest/visual.js.map +1 -0
  104. package/dist/parser/docx-parser.d.ts +12 -0
  105. package/dist/parser/docx-parser.d.ts.map +1 -0
  106. package/dist/parser/docx-parser.js +375 -0
  107. package/dist/parser/docx-parser.js.map +1 -0
  108. package/dist/parser/html-parser.d.ts +16 -0
  109. package/dist/parser/html-parser.d.ts.map +1 -0
  110. package/dist/parser/html-parser.js +119 -0
  111. package/dist/parser/html-parser.js.map +1 -0
  112. package/dist/parser/index.d.ts +125 -0
  113. package/dist/parser/index.d.ts.map +1 -0
  114. package/dist/parser/index.js +364 -0
  115. package/dist/parser/index.js.map +1 -0
  116. package/dist/parser/pdf-extract.d.ts +49 -0
  117. package/dist/parser/pdf-extract.d.ts.map +1 -0
  118. package/dist/parser/pdf-extract.js +114 -0
  119. package/dist/parser/pdf-extract.js.map +1 -0
  120. package/dist/parser/pdf-filter.d.ts +91 -0
  121. package/dist/parser/pdf-filter.d.ts.map +1 -0
  122. package/dist/parser/pdf-filter.js +522 -0
  123. package/dist/parser/pdf-filter.js.map +1 -0
  124. package/dist/parser/title-extractor.d.ts +28 -0
  125. package/dist/parser/title-extractor.d.ts.map +1 -0
  126. package/dist/parser/title-extractor.js +105 -0
  127. package/dist/parser/title-extractor.js.map +1 -0
  128. package/dist/pdf-visual/captioner.d.ts +11 -0
  129. package/dist/pdf-visual/captioner.d.ts.map +1 -0
  130. package/dist/pdf-visual/captioner.js +48 -0
  131. package/dist/pdf-visual/captioner.js.map +1 -0
  132. package/dist/pdf-visual/captioners/fast.d.ts +7 -0
  133. package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
  134. package/dist/pdf-visual/captioners/fast.js +108 -0
  135. package/dist/pdf-visual/captioners/fast.js.map +1 -0
  136. package/dist/pdf-visual/captioners/quality.d.ts +7 -0
  137. package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
  138. package/dist/pdf-visual/captioners/quality.js +101 -0
  139. package/dist/pdf-visual/captioners/quality.js.map +1 -0
  140. package/dist/pdf-visual/captioners/shared.d.ts +81 -0
  141. package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
  142. package/dist/pdf-visual/captioners/shared.js +156 -0
  143. package/dist/pdf-visual/captioners/shared.js.map +1 -0
  144. package/dist/pdf-visual/detector.d.ts +9 -0
  145. package/dist/pdf-visual/detector.d.ts.map +1 -0
  146. package/dist/pdf-visual/detector.js +269 -0
  147. package/dist/pdf-visual/detector.js.map +1 -0
  148. package/dist/pdf-visual/index.d.ts +13 -0
  149. package/dist/pdf-visual/index.d.ts.map +1 -0
  150. package/dist/pdf-visual/index.js +53 -0
  151. package/dist/pdf-visual/index.js.map +1 -0
  152. package/dist/pdf-visual/renderer.d.ts +9 -0
  153. package/dist/pdf-visual/renderer.d.ts.map +1 -0
  154. package/dist/pdf-visual/renderer.js +186 -0
  155. package/dist/pdf-visual/renderer.js.map +1 -0
  156. package/dist/pdf-visual/types.d.ts +53 -0
  157. package/dist/pdf-visual/types.d.ts.map +1 -0
  158. package/dist/pdf-visual/types.js +17 -0
  159. package/dist/pdf-visual/types.js.map +1 -0
  160. package/dist/server/error-utils.d.ts +63 -0
  161. package/dist/server/error-utils.d.ts.map +1 -0
  162. package/dist/server/error-utils.js +124 -0
  163. package/dist/server/error-utils.js.map +1 -0
  164. package/dist/server/index.d.ts +216 -0
  165. package/dist/server/index.d.ts.map +1 -0
  166. package/dist/server/index.js +1068 -0
  167. package/dist/server/index.js.map +1 -0
  168. package/dist/server/list-scanner.d.ts +30 -0
  169. package/dist/server/list-scanner.d.ts.map +1 -0
  170. package/dist/server/list-scanner.js +50 -0
  171. package/dist/server/list-scanner.js.map +1 -0
  172. package/dist/server/tool-definitions.d.ts +8 -0
  173. package/dist/server/tool-definitions.d.ts.map +1 -0
  174. package/dist/server/tool-definitions.js +181 -0
  175. package/dist/server/tool-definitions.js.map +1 -0
  176. package/dist/server/tool-input.d.ts +37 -0
  177. package/dist/server/tool-input.d.ts.map +1 -0
  178. package/dist/server/tool-input.js +211 -0
  179. package/dist/server/tool-input.js.map +1 -0
  180. package/dist/server/types.d.ts +307 -0
  181. package/dist/server/types.d.ts.map +1 -0
  182. package/dist/server/types.js +3 -0
  183. package/dist/server/types.js.map +1 -0
  184. package/dist/server-main.d.ts +40 -0
  185. package/dist/server-main.d.ts.map +1 -0
  186. package/dist/server-main.js +254 -0
  187. package/dist/server-main.js.map +1 -0
  188. package/dist/utils/base-dirs.d.ts +145 -0
  189. package/dist/utils/base-dirs.d.ts.map +1 -0
  190. package/dist/utils/base-dirs.js +344 -0
  191. package/dist/utils/base-dirs.js.map +1 -0
  192. package/dist/utils/errors.d.ts +32 -0
  193. package/dist/utils/errors.d.ts.map +1 -0
  194. package/dist/utils/errors.js +61 -0
  195. package/dist/utils/errors.js.map +1 -0
  196. package/dist/utils/limits.d.ts +26 -0
  197. package/dist/utils/limits.d.ts.map +1 -0
  198. package/dist/utils/limits.js +28 -0
  199. package/dist/utils/limits.js.map +1 -0
  200. package/dist/utils/list-sources.d.ts +38 -0
  201. package/dist/utils/list-sources.d.ts.map +1 -0
  202. package/dist/utils/list-sources.js +40 -0
  203. package/dist/utils/list-sources.js.map +1 -0
  204. package/dist/utils/raw-data-utils.d.ts +76 -0
  205. package/dist/utils/raw-data-utils.d.ts.map +1 -0
  206. package/dist/utils/raw-data-utils.js +202 -0
  207. package/dist/utils/raw-data-utils.js.map +1 -0
  208. package/dist/utils/scan.d.ts +114 -0
  209. package/dist/utils/scan.d.ts.map +1 -0
  210. package/dist/utils/scan.js +209 -0
  211. package/dist/utils/scan.js.map +1 -0
  212. package/dist/utils/scope-match.d.ts +38 -0
  213. package/dist/utils/scope-match.d.ts.map +1 -0
  214. package/dist/utils/scope-match.js +86 -0
  215. package/dist/utils/scope-match.js.map +1 -0
  216. package/dist/utils/sensitive-path.d.ts +9 -0
  217. package/dist/utils/sensitive-path.d.ts.map +1 -0
  218. package/dist/utils/sensitive-path.js +78 -0
  219. package/dist/utils/sensitive-path.js.map +1 -0
  220. package/dist/utils/sync-path-key.d.ts +14 -0
  221. package/dist/utils/sync-path-key.d.ts.map +1 -0
  222. package/dist/utils/sync-path-key.js +27 -0
  223. package/dist/utils/sync-path-key.js.map +1 -0
  224. package/dist/utils/type-guards.d.ts +18 -0
  225. package/dist/utils/type-guards.d.ts.map +1 -0
  226. package/dist/utils/type-guards.js +34 -0
  227. package/dist/utils/type-guards.js.map +1 -0
  228. package/dist/utils/visual-profile.d.ts +10 -0
  229. package/dist/utils/visual-profile.d.ts.map +1 -0
  230. package/dist/utils/visual-profile.js +15 -0
  231. package/dist/utils/visual-profile.js.map +1 -0
  232. package/dist/vectordb/index.d.ts +132 -0
  233. package/dist/vectordb/index.d.ts.map +1 -0
  234. package/dist/vectordb/index.js +617 -0
  235. package/dist/vectordb/index.js.map +1 -0
  236. package/dist/vectordb/search-filters.d.ts +15 -0
  237. package/dist/vectordb/search-filters.d.ts.map +1 -0
  238. package/dist/vectordb/search-filters.js +129 -0
  239. package/dist/vectordb/search-filters.js.map +1 -0
  240. package/dist/vectordb/types.d.ts +194 -0
  241. package/dist/vectordb/types.d.ts.map +1 -0
  242. package/dist/vectordb/types.js +237 -0
  243. package/dist/vectordb/types.js.map +1 -0
  244. package/package.json +108 -0
  245. package/skills/mcp-local-rag/SKILL.md +234 -0
  246. package/skills/mcp-local-rag/references/cli-reference.md +190 -0
  247. package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
@@ -0,0 +1,182 @@
1
+ // Remote embedding server (TEI-compatible) backend.
2
+ //
3
+ // Activated by RAG_EMBEDDING_SERVER_URL: when set, the factory returns this
4
+ // class instead of the local Transformers.js pipeline, so embedding compute
5
+ // runs on a self-hosted server (e.g. HuggingFace TEI) while document content
6
+ // never leaves the deployment network.
7
+ //
8
+ // Wire protocol: POST {serverUrl}/embed {"inputs": string[]} → number[][]
9
+ // (TEI-native shape; the server owns model choice, dtype, and truncation).
10
+ import { AppError } from '../utils/errors.js';
11
+ /** Remote embedding generation error. */
12
+ export class RemoteEmbeddingError extends AppError {
13
+ constructor(message, options) {
14
+ super(message, 'embedder', 'internal', options);
15
+ this.name = 'RemoteEmbeddingError';
16
+ }
17
+ }
18
+ /** Server responded with a retryable failure (429 / 5xx). */
19
+ export class RemoteEmbeddingRetryableError extends RemoteEmbeddingError {
20
+ status;
21
+ constructor(status, body, serverUrl) {
22
+ super(`HTTP ${status} from embedding server ${serverUrl}${body ? `: ${body.slice(0, 200)}` : ''}`);
23
+ this.name = 'RemoteEmbeddingRetryableError';
24
+ this.status = status;
25
+ }
26
+ }
27
+ // ============================================
28
+ // Retry (exponential backoff + full jitter)
29
+ // ============================================
30
+ const MAX_RETRIES = 3;
31
+ const INITIAL_BACKOFF_MS = 500;
32
+ const MAX_BACKOFF_MS = 8000;
33
+ function isRetryableError(e) {
34
+ // Client errors (401/403/404/422) never succeed on retry; network-level
35
+ // failures and 429/5xx do.
36
+ if (e instanceof RemoteEmbeddingRetryableError) {
37
+ return true;
38
+ }
39
+ return !(e instanceof RemoteEmbeddingError);
40
+ }
41
+ function isRetryableStatus(status) {
42
+ return status === 429 || status >= 500;
43
+ }
44
+ function sleep(ms) {
45
+ const { promise, resolve } = Promise.withResolvers();
46
+ setTimeout(resolve, ms);
47
+ return promise;
48
+ }
49
+ /** Exponential backoff with full jitter: 500ms ×2^attempt, capped at 8s. */
50
+ function backoffMs(attempt) {
51
+ const cap = Math.min(MAX_BACKOFF_MS, INITIAL_BACKOFF_MS * 2 ** attempt);
52
+ return Math.floor(Math.random() * cap);
53
+ }
54
+ async function withRetry(fn, context) {
55
+ let lastError;
56
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
57
+ try {
58
+ return await fn();
59
+ }
60
+ catch (e) {
61
+ lastError = e;
62
+ if (attempt === MAX_RETRIES || !isRetryableError(e)) {
63
+ throw e;
64
+ }
65
+ const wait = backoffMs(attempt);
66
+ console.error(`RemoteEmbedder: ${context} failed (attempt ${attempt + 1}/${MAX_RETRIES + 1}), retrying in ${wait}ms`);
67
+ await sleep(wait);
68
+ }
69
+ }
70
+ throw lastError;
71
+ }
72
+ async function withTimeout(run, timeoutMs) {
73
+ const controller = new AbortController();
74
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
75
+ try {
76
+ return await run(controller.signal);
77
+ }
78
+ finally {
79
+ clearTimeout(timer);
80
+ }
81
+ }
82
+ // ============================================
83
+ // RemoteEmbedder
84
+ // ============================================
85
+ /**
86
+ * Structural counterpart of the local `Embedder`: same public surface
87
+ * (`initialize / embed / embedBatch / dispose / tokenLimit`), with embedding
88
+ * compute delegated to a self-hosted server.
89
+ *
90
+ * Semantics intentionally aligned with the local class:
91
+ * - `tokenLimit` is always `null` — the remote server owns truncation, which
92
+ * maps to the local class's "degraded mode" (no cap, no clamp).
93
+ * - `dispose()` is a no-op — no in-process model resources.
94
+ * - `device` / `dtype` / `cacheDir` / `modelPath` are server-side concerns.
95
+ */
96
+ export class RemoteEmbedder {
97
+ config;
98
+ dims = null;
99
+ initialized = false;
100
+ constructor(config) {
101
+ this.config = config;
102
+ }
103
+ /**
104
+ * Probe the server and record the embedding dimension so later responses
105
+ * can be validated (a dimension change means the server swapped models —
106
+ * fail fast instead of writing mixed-dimension vectors).
107
+ */
108
+ async initialize() {
109
+ if (this.initialized) {
110
+ return;
111
+ }
112
+ const [vector] = await this.postEmbed(['dimension probe']);
113
+ if (!Array.isArray(vector) || vector.length === 0) {
114
+ throw new RemoteEmbeddingError(`Remote embedding server returned an empty vector: ${this.config.serverUrl}`);
115
+ }
116
+ this.dims = vector.length;
117
+ this.initialized = true;
118
+ console.error(`RemoteEmbedder: connected to "${this.config.serverUrl}" (dimension ${this.dims})`);
119
+ }
120
+ async dispose() {
121
+ this.initialized = false;
122
+ this.dims = null;
123
+ }
124
+ /** Remote servers decide their own truncation: no local cap, no clamp. */
125
+ get tokenLimit() {
126
+ return null;
127
+ }
128
+ async embed(text) {
129
+ const vectors = await this.embedBatch([text]);
130
+ const vector = vectors[0];
131
+ if (vector === undefined) {
132
+ throw new RemoteEmbeddingError(`Remote embedding server returned no vector for a single input: ${this.config.serverUrl}`);
133
+ }
134
+ return vector;
135
+ }
136
+ async embedBatch(texts) {
137
+ await this.initialize();
138
+ const vectors = [];
139
+ for (let i = 0; i < texts.length; i += this.config.batchSize) {
140
+ const batch = texts.slice(i, i + this.config.batchSize);
141
+ const out = await withRetry(() => this.postEmbed(batch), `embedBatch(${batch.length} texts)`);
142
+ this.validate(out, batch.length);
143
+ vectors.push(...out);
144
+ }
145
+ return vectors;
146
+ }
147
+ validate(vectors, expectedCount) {
148
+ if (!Array.isArray(vectors) || vectors.length !== expectedCount) {
149
+ throw new RemoteEmbeddingError(`Remote embedding server returned ${Array.isArray(vectors) ? vectors.length : 'non-array'} ` +
150
+ `vectors for ${expectedCount} inputs: ${this.config.serverUrl}`);
151
+ }
152
+ if (this.dims !== null) {
153
+ for (const v of vectors) {
154
+ if (!Array.isArray(v) || v.length !== this.dims) {
155
+ throw new RemoteEmbeddingError(`Remote embedding dimension drifted: expected ${this.dims}, got ` +
156
+ `${Array.isArray(v) ? v.length : 'non-array'} (did the server switch models?): ` +
157
+ this.config.serverUrl);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ async postEmbed(inputs) {
163
+ return withTimeout(async (signal) => {
164
+ const res = await fetch(`${this.config.serverUrl}/embed`, {
165
+ method: 'POST',
166
+ headers: { 'Content-Type': 'application/json' },
167
+ body: JSON.stringify({ inputs }),
168
+ signal,
169
+ });
170
+ if (!res.ok) {
171
+ const body = await res.text().catch(() => '');
172
+ if (isRetryableStatus(res.status)) {
173
+ throw new RemoteEmbeddingRetryableError(res.status, body, this.config.serverUrl);
174
+ }
175
+ throw new RemoteEmbeddingError(`HTTP ${res.status} from embedding server ${this.config.serverUrl}${body ? `: ${body.slice(0, 200)}` : ''}`);
176
+ }
177
+ const vectors = await res.json();
178
+ return vectors;
179
+ }, this.config.timeoutMs ?? 30_000);
180
+ }
181
+ }
182
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/embedder/remote.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,uCAAuC;AACvC,EAAE;AACF,2EAA2E;AAC3E,2EAA2E;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,yCAAyC;AACzC,MAAM,OAAO,oBAAqB,SAAQ,QAAQ;IAChD,YAAY,OAAe,EAAE,OAA2B;QACtD,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;QAC/C,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;IACpC,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,OAAO,6BAA8B,SAAQ,oBAAoB;IAC5D,MAAM,CAAQ;IAEvB,YAAY,MAAc,EAAE,IAAY,EAAE,SAAiB;QACzD,KAAK,CACH,QAAQ,MAAM,0BAA0B,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5F,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAWD,+CAA+C;AAC/C,4CAA4C;AAC5C,+CAA+C;AAE/C,MAAM,WAAW,GAAG,CAAC,CAAA;AACrB,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAC9B,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B,SAAS,gBAAgB,CAAC,CAAU;IAClC,wEAAwE;IACxE,2BAA2B;IAC3B,IAAI,CAAC,YAAY,6BAA6B,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,CAAC,CAAC,CAAC,YAAY,oBAAoB,CAAC,CAAA;AAC7C,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAA;AACxC,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAA;IAC1D,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACvB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,4EAA4E;AAC5E,SAAS,SAAS,CAAC,OAAe;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,GAAG,CAAC,IAAI,OAAO,CAAC,CAAA;IACvE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;AACxC,CAAC;AAED,KAAK,UAAU,SAAS,CAAI,EAAoB,EAAE,OAAe;IAC/D,IAAI,SAAkB,CAAA;IACtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAA;QACnB,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,SAAS,GAAG,CAAC,CAAA;YACb,IAAI,OAAO,KAAK,WAAW,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,MAAM,CAAC,CAAA;YACT,CAAC;YACD,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;YAC/B,OAAO,CAAC,KAAK,CACX,mBAAmB,OAAO,oBAAoB,OAAO,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,kBAAkB,IAAI,IAAI,CACvG,CAAA;YACD,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAA;AACjB,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,GAAwC,EACxC,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IAC7D,IAAI,CAAC;QACH,OAAO,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;AACH,CAAC;AAED,+CAA+C;AAC/C,iBAAiB;AACjB,+CAA+C;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAc;IACR,MAAM,CAAsB;IACrC,IAAI,GAAkB,IAAI,CAAA;IAC1B,WAAW,GAAY,KAAK,CAAA;IAEpC,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,oBAAoB,CAC5B,qDAAqD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAC7E,CAAA;QACH,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,OAAO,CAAC,KAAK,CACX,iCAAiC,IAAI,CAAC,MAAM,CAAC,SAAS,gBAAgB,IAAI,CAAC,IAAI,GAAG,CACnF,CAAA;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAED,0EAA0E;IAC1E,IAAI,UAAU;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QACzB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,oBAAoB,CAC5B,kEAAkE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAC1F,CAAA;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACvB,MAAM,OAAO,GAAe,EAAE,CAAA;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YACvD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,cAAc,KAAK,CAAC,MAAM,SAAS,CAAC,CAAA;YAC7F,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;YAChC,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAA;QACtB,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,QAAQ,CAAC,OAAmB,EAAE,aAAqB;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YAChE,MAAM,IAAI,oBAAoB,CAC5B,oCAAoC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,GAAG;gBAC1F,eAAe,aAAa,YAAY,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAClE,CAAA;QACH,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;oBAChD,MAAM,IAAI,oBAAoB,CAC5B,gDAAgD,IAAI,CAAC,IAAI,QAAQ;wBAC/D,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,oCAAoC;wBAChF,IAAI,CAAC,MAAM,CAAC,SAAS,CACxB,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,MAAgB;QACtC,OAAO,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,QAAQ,EAAE;gBACxD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;gBAChC,MAAM;aACP,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;gBAC7C,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAClC,MAAM,IAAI,6BAA6B,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;gBAClF,CAAC;gBACD,MAAM,IAAI,oBAAoB,CAC5B,QAAQ,GAAG,CAAC,MAAM,0BAA0B,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5G,CAAA;YACH,CAAC;YACD,MAAM,OAAO,GAAe,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC5C,OAAO,OAAO,CAAA;QAChB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,CAAA;IACrC,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ import { type ClassifiedSource } from '../utils/list-sources.js';
2
+ export interface IngestedFileSummary {
3
+ filePath: string;
4
+ chunkCount: number;
5
+ timestamp: string;
6
+ }
7
+ export type ListedFile = {
8
+ filePath: string;
9
+ baseDir: string;
10
+ ingested: true;
11
+ chunkCount: number;
12
+ timestamp: string;
13
+ } | {
14
+ filePath: string;
15
+ baseDir: string;
16
+ ingested: false;
17
+ };
18
+ export interface RootScanResult {
19
+ files: string[];
20
+ warnings: string[];
21
+ }
22
+ export interface ListDocumentsResult {
23
+ files: ListedFile[];
24
+ sources: ClassifiedSource[];
25
+ warnings: Array<{
26
+ baseDir: string;
27
+ message: string;
28
+ }>;
29
+ }
30
+ export declare function listDocuments(input: {
31
+ roots: readonly string[];
32
+ dbPath: string;
33
+ ingested: IngestedFileSummary[];
34
+ scope?: string[] | undefined;
35
+ scan: (root: string, scope?: string[] | undefined) => Promise<RootScanResult>;
36
+ }): Promise<ListDocumentsResult>;
37
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/features/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAA2B,MAAM,0BAA0B,CAAA;AAGzF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,UAAU,GAClB;IACE,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,IAAI,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB,GACD;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAA;CAAE,CAAA;AAE1D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACtD;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE;IACzC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,mBAAmB,EAAE,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;CAC9E,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA0C/B"}
@@ -0,0 +1,41 @@
1
+ import { classifyIngestedSources } from '../utils/list-sources.js';
2
+ import { realpathForMatch } from '../utils/scan.js';
3
+ export async function listDocuments(input) {
4
+ const ingestedKeyed = await Promise.all(input.ingested.map(async (entry) => ({ entry, key: await realpathForMatch(entry.filePath) })));
5
+ const ingestedByKey = new Map(ingestedKeyed.map(({ entry, key }) => [key, entry]));
6
+ const seenKeys = new Set();
7
+ const matchedKeys = new Set();
8
+ const files = [];
9
+ const warnings = [];
10
+ for (const baseDir of input.roots) {
11
+ const scanned = await input.scan(baseDir, input.scope);
12
+ warnings.push(...scanned.warnings.map((message) => ({ baseDir, message })));
13
+ for (const scannedPath of scanned.files) {
14
+ const key = await realpathForMatch(scannedPath);
15
+ if (seenKeys.has(key)) {
16
+ continue;
17
+ }
18
+ seenKeys.add(key);
19
+ const entry = ingestedByKey.get(key);
20
+ if (entry) {
21
+ matchedKeys.add(key);
22
+ files.push({
23
+ filePath: entry.filePath,
24
+ baseDir,
25
+ ingested: true,
26
+ chunkCount: entry.chunkCount,
27
+ timestamp: entry.timestamp,
28
+ });
29
+ }
30
+ else {
31
+ files.push({ filePath: scannedPath, baseDir, ingested: false });
32
+ }
33
+ }
34
+ }
35
+ return {
36
+ files,
37
+ sources: classifyIngestedSources(ingestedKeyed, matchedKeys, input.dbPath, input.scope),
38
+ warnings,
39
+ };
40
+ }
41
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/features/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AA6BnD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAMnC;IACC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAC9F,CAAA;IACD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;IAClF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;IACrC,MAAM,KAAK,GAAiB,EAAE,CAAA;IAC9B,MAAM,QAAQ,GAAgD,EAAE,CAAA;IAEhE,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QACtD,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QAE3E,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC,CAAA;YAC/C,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,SAAQ;YACV,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAEjB,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACpB,KAAK,CAAC,IAAI,CAAC;oBACT,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,OAAO;oBACP,QAAQ,EAAE,IAAI;oBACd,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK;QACL,OAAO,EAAE,uBAAuB,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC;QACvF,QAAQ;KACT,CAAA;AACH,CAAC"}
@@ -0,0 +1,219 @@
1
+ import type { ScanEntryKind } from '../utils/scan.js';
2
+ import { type QualityProfile } from '../utils/visual-profile.js';
3
+ /** Path-granular facts about the regions a directory scan could not observe. */
4
+ export interface SyncScanCoverage {
5
+ unreadableDirs: {
6
+ dirPath: string;
7
+ code: string;
8
+ }[];
9
+ depthLimitedDirs: string[];
10
+ skippedSymlinks: string[];
11
+ }
12
+ /**
13
+ * Everything one run could not observe: the scan facts plus the files whose
14
+ * bytes were never read because they exceed the configured size limit. Every
15
+ * path here is an unobserved prefix, so the rows under it are protected from
16
+ * prune.
17
+ */
18
+ export interface SyncCoverage extends SyncScanCoverage {
19
+ /** Files skipped by `hashFile` for exceeding the configured size limit. */
20
+ oversizedFiles: string[];
21
+ }
22
+ /** One bounded directory scan: the supported files found plus its coverage facts. */
23
+ export interface SyncScanResult extends SyncScanCoverage {
24
+ files: string[];
25
+ }
26
+ /**
27
+ * One stored chunk row (or row group) of the database manifest. `filePath` is
28
+ * the verbatim stored spelling — the only value valid for deletion. A `null` or
29
+ * absent `contentHash` marks the row hashless, which makes its file dirty.
30
+ * `visualProfile` is the raw stored value, unvalidated: the vocabulary check
31
+ * belongs to the planner, not to the storage projection.
32
+ */
33
+ export interface SyncManifestRow {
34
+ filePath: string;
35
+ contentHash?: string | null;
36
+ visualProfile?: string | null;
37
+ }
38
+ /** One supported file found on disk, with the hash of its current bytes. */
39
+ export interface SyncDiskFile {
40
+ filePath: string;
41
+ contentHash: string;
42
+ }
43
+ /** How a sync invocation was addressed, after validation and classification. */
44
+ export type SyncRequest = {
45
+ kind: 'roots';
46
+ } | {
47
+ kind: 'directory';
48
+ path: string;
49
+ } | {
50
+ kind: 'file';
51
+ path: string;
52
+ };
53
+ /**
54
+ * Result of classifying a requested path on disk. Anything other than
55
+ * `directory` or `file` is refused before the path is read: the union is the
56
+ * walker's own {@link ScanEntryKind} plus `missing`, so a path a caller names and
57
+ * a path the walk discovers pass the identical predicates.
58
+ */
59
+ export type SyncPathKind = ScanEntryKind | 'missing';
60
+ /** Re-ingest one disk file, then drop the other stored spellings of its key. */
61
+ export interface SyncUpsertAction {
62
+ /** Verbatim disk path handed to `ingestFile`. */
63
+ filePath: string;
64
+ /** Verbatim stored spellings of the same comparison key, excluding `filePath`. */
65
+ staleStoredPaths: string[];
66
+ /**
67
+ * The profile this file must be re-ingested with, resolved once here so the
68
+ * CLI and MCP adapters cannot reach different conclusions. `null` means
69
+ * normal text ingestion, and is the only value a non-PDF ever carries.
70
+ */
71
+ visualProfile: QualityProfile | null;
72
+ }
73
+ /** Remove every stored spelling of one comparison key that left the disk. */
74
+ export interface SyncPruneAction {
75
+ storedPaths: string[];
76
+ }
77
+ export interface SyncPlan {
78
+ upserts: SyncUpsertAction[];
79
+ /** Files whose stored content identity already matches the disk bytes. */
80
+ skipped: number;
81
+ prunes: SyncPruneAction[];
82
+ }
83
+ export interface SyncPlanInput {
84
+ roots: readonly string[];
85
+ dbPath: string;
86
+ /** Configured database/cache prefixes that must never be pruned. */
87
+ excludePaths: readonly string[];
88
+ platform: NodeJS.Platform;
89
+ request: SyncRequest;
90
+ diskFiles: readonly SyncDiskFile[];
91
+ dbRows: readonly SyncManifestRow[];
92
+ coverage: SyncCoverage;
93
+ /**
94
+ * Explicit per-invocation visual request. Present means every eligible PDF in
95
+ * scope is desired at this profile regardless of what is stored, which is also
96
+ * what repairs conflicting or unreadable stored state. Absent means each PDF
97
+ * inherits its own recorded profile.
98
+ */
99
+ visualProfile?: QualityProfile | undefined;
100
+ }
101
+ /** The one controlled error a failed run exposes. */
102
+ export interface SyncError {
103
+ message: string;
104
+ /** The file, root, or requested path a failure is attributable to. */
105
+ filePath: string | null;
106
+ }
107
+ /** Append an attributable path only when the underlying message does not already contain it. */
108
+ export declare function formatSyncError({ message, filePath }: SyncError): string;
109
+ export interface SyncCounters {
110
+ upserted: number;
111
+ skipped: number;
112
+ empty: number;
113
+ /** Comparison keys removed from the index. Counts files, not rows, and is not part of `completed`. */
114
+ pruned: number;
115
+ }
116
+ /** One stored spelling per pruned comparison key, so a count of N reports N paths. */
117
+ interface PrunedPaths {
118
+ prunedPaths: string[];
119
+ }
120
+ export interface SyncExecutionResult extends SyncCounters, PrunedPaths {
121
+ error: SyncError | null;
122
+ }
123
+ export interface SyncResult extends SyncCounters, PrunedPaths {
124
+ /** Scanner facts as data. Formatting and reporting belong to the adapters. */
125
+ coverage: SyncCoverage;
126
+ error: SyncError | null;
127
+ }
128
+ /** How one planned file must be ingested: run-level images, per-file profile. */
129
+ export interface SyncIngestOptions {
130
+ /** `true` stores images for this file, from the current invocation alone. */
131
+ images: boolean;
132
+ /** The planner's resolved profile; `null` means normal text ingestion. */
133
+ visualProfile: QualityProfile | null;
134
+ }
135
+ /** Mutating collaborators, injected by the CLI and MCP adapters. */
136
+ export interface SyncExecutor {
137
+ /**
138
+ * Parse, chunk, embed, build vectors, then delete-and-insert for this one
139
+ * file, returning the inserted chunk count. Returning `0` must leave the
140
+ * store untouched: the executor relies on that to keep a zero-chunk file's
141
+ * prior rows and hash intact.
142
+ */
143
+ ingestFile(filePath: string, options: SyncIngestOptions): Promise<number>;
144
+ /** Delete the rows of exactly one stored path spelling. */
145
+ deleteExactPath(filePath: string): Promise<number>;
146
+ optimize(): Promise<void>;
147
+ }
148
+ /** Everything {@link runSync} needs from the outside world. */
149
+ export interface SyncCollaborators extends SyncExecutor {
150
+ /**
151
+ * Canonical form of the requested path — its parent chain resolved through
152
+ * symbolic links, the final component verbatim — or `null` when that chain
153
+ * cannot be resolved. Injected because this module performs no filesystem
154
+ * access; both adapters supply `canonicalizeRequestedPath` from `utils/scan.ts`.
155
+ */
156
+ canonicalizeRequestedPath(path: string): Promise<string | null>;
157
+ /**
158
+ * Classify the requested path WITHOUT reading it, applying the walker's collect
159
+ * predicates (`classifyRequestedPath` in `utils/scan.ts`) so both surfaces
160
+ * refuse the same paths.
161
+ */
162
+ classifyPath(path: string): Promise<SyncPathKind>;
163
+ /**
164
+ * Bounded scan of one root. Deliberately takes no scope predicate: a
165
+ * scope-pruned directory is reported in none of the coverage arrays, so a
166
+ * scope filter here would make unobserved regions invisible and prune unsafe.
167
+ */
168
+ scanDir(rootPath: string): Promise<SyncScanResult>;
169
+ /**
170
+ * Hash the file's current bytes, or return `null` to decline reading it because
171
+ * it exceeds the configured size limit. A declined file is left out of the disk
172
+ * manifest and recorded in `coverage.oversizedFiles`, which protects its stored
173
+ * rows from prune — omitting it without that record would make it look deleted.
174
+ */
175
+ hashFile(filePath: string): Promise<string | null>;
176
+ /** Every stored chunk row's verbatim path and hash, for the whole table. */
177
+ loadDbManifest(): Promise<SyncManifestRow[]>;
178
+ }
179
+ export interface RunSyncInput {
180
+ /** Configured roots in the `resolve()`-only spelling the DB keys live in. */
181
+ roots: readonly string[];
182
+ /**
183
+ * The same configured roots, canonicalized (realpath'd) — the security domain
184
+ * the requested path's canonical form is checked against. Both adapters already
185
+ * hold this list: the MCP server as `baseDirs`, the CLI as
186
+ * `config.baseDirs.baseDirs`, each the counterpart of its `roots` entry.
187
+ */
188
+ canonicalRoots: readonly string[];
189
+ dbPath: string;
190
+ excludePaths: readonly string[];
191
+ platform: NodeJS.Platform;
192
+ /** Omitted means "every configured root". */
193
+ requestedPath?: string | undefined;
194
+ /** `true` stores images for files already selected as new or changed. */
195
+ images?: boolean | undefined;
196
+ /** Explicit visual request, as on {@link SyncPlanInput}. Only the CLI supplies one. */
197
+ visualProfile?: QualityProfile | undefined;
198
+ collaborators: SyncCollaborators;
199
+ }
200
+ /**
201
+ * Decide the skip, upsert, and prune actions for one sync run.
202
+ *
203
+ * A key is pruned only when every one of four conditions holds: inside the
204
+ * requested scope, absent from disk, outside the excluded and managed paths,
205
+ * and outside every unobserved prefix. Dropping any one protects the rows.
206
+ *
207
+ * Throws when an eligible PDF's stored profiles admit no single answer; the
208
+ * caller must surface that before any mutation runs.
209
+ */
210
+ export declare function planSync(input: SyncPlanInput): SyncPlan;
211
+ export declare function executeSyncPlan(plan: SyncPlan, executor: SyncExecutor, images?: boolean): Promise<SyncExecutionResult>;
212
+ /**
213
+ * Run one full sync. Counters and coverage facts are plain data — the caller
214
+ * owns printing and exit status. A run with nothing to do calls neither
215
+ * `ingestFile` nor `optimize`, so a true no-op never loads the model.
216
+ */
217
+ export declare function runSync(input: RunSyncInput): Promise<SyncResult>;
218
+ export {};
219
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/features/sync.ts"],"names":[],"mappings":"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"}