ollama-intern-mcp 1.0.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 (256) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +252 -0
  3. package/SECURITY.md +22 -0
  4. package/dist/corpus/chunker.d.ts +63 -0
  5. package/dist/corpus/chunker.d.ts.map +1 -0
  6. package/dist/corpus/chunker.js +230 -0
  7. package/dist/corpus/chunker.js.map +1 -0
  8. package/dist/corpus/fusion.d.ts +67 -0
  9. package/dist/corpus/fusion.d.ts.map +1 -0
  10. package/dist/corpus/fusion.js +76 -0
  11. package/dist/corpus/fusion.js.map +1 -0
  12. package/dist/corpus/indexer.d.ts +33 -0
  13. package/dist/corpus/indexer.d.ts.map +1 -0
  14. package/dist/corpus/indexer.js +201 -0
  15. package/dist/corpus/indexer.js.map +1 -0
  16. package/dist/corpus/lexical.d.ts +95 -0
  17. package/dist/corpus/lexical.d.ts.map +1 -0
  18. package/dist/corpus/lexical.js +227 -0
  19. package/dist/corpus/lexical.js.map +1 -0
  20. package/dist/corpus/manifest.d.ts +29 -0
  21. package/dist/corpus/manifest.d.ts.map +1 -0
  22. package/dist/corpus/manifest.js +45 -0
  23. package/dist/corpus/manifest.js.map +1 -0
  24. package/dist/corpus/refresh.d.ts +54 -0
  25. package/dist/corpus/refresh.d.ts.map +1 -0
  26. package/dist/corpus/refresh.js +155 -0
  27. package/dist/corpus/refresh.js.map +1 -0
  28. package/dist/corpus/searcher.d.ts +48 -0
  29. package/dist/corpus/searcher.d.ts.map +1 -0
  30. package/dist/corpus/searcher.js +131 -0
  31. package/dist/corpus/searcher.js.map +1 -0
  32. package/dist/corpus/storage.d.ts +56 -0
  33. package/dist/corpus/storage.d.ts.map +1 -0
  34. package/dist/corpus/storage.js +81 -0
  35. package/dist/corpus/storage.js.map +1 -0
  36. package/dist/coverage.d.ts +38 -0
  37. package/dist/coverage.d.ts.map +1 -0
  38. package/dist/coverage.js +117 -0
  39. package/dist/coverage.js.map +1 -0
  40. package/dist/embedMath.d.ts +22 -0
  41. package/dist/embedMath.d.ts.map +1 -0
  42. package/dist/embedMath.js +34 -0
  43. package/dist/embedMath.js.map +1 -0
  44. package/dist/envelope.d.ts +53 -0
  45. package/dist/envelope.d.ts.map +1 -0
  46. package/dist/envelope.js +32 -0
  47. package/dist/envelope.js.map +1 -0
  48. package/dist/errors.d.ts +20 -0
  49. package/dist/errors.d.ts.map +1 -0
  50. package/dist/errors.js +30 -0
  51. package/dist/errors.js.map +1 -0
  52. package/dist/evals/retrieval.d.ts +68 -0
  53. package/dist/evals/retrieval.d.ts.map +1 -0
  54. package/dist/evals/retrieval.js +173 -0
  55. package/dist/evals/retrieval.js.map +1 -0
  56. package/dist/guardrails/citations.d.ts +28 -0
  57. package/dist/guardrails/citations.d.ts.map +1 -0
  58. package/dist/guardrails/citations.js +45 -0
  59. package/dist/guardrails/citations.js.map +1 -0
  60. package/dist/guardrails/compileCheck.d.ts +20 -0
  61. package/dist/guardrails/compileCheck.d.ts.map +1 -0
  62. package/dist/guardrails/compileCheck.js +96 -0
  63. package/dist/guardrails/compileCheck.js.map +1 -0
  64. package/dist/guardrails/confidence.d.ts +21 -0
  65. package/dist/guardrails/confidence.d.ts.map +1 -0
  66. package/dist/guardrails/confidence.js +18 -0
  67. package/dist/guardrails/confidence.js.map +1 -0
  68. package/dist/guardrails/timeouts.d.ts +35 -0
  69. package/dist/guardrails/timeouts.d.ts.map +1 -0
  70. package/dist/guardrails/timeouts.js +58 -0
  71. package/dist/guardrails/timeouts.js.map +1 -0
  72. package/dist/guardrails/writeConfirm.d.ts +25 -0
  73. package/dist/guardrails/writeConfirm.d.ts.map +1 -0
  74. package/dist/guardrails/writeConfirm.js +35 -0
  75. package/dist/guardrails/writeConfirm.js.map +1 -0
  76. package/dist/index.d.ts +12 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +153 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/observability.d.ts +66 -0
  81. package/dist/observability.d.ts.map +1 -0
  82. package/dist/observability.js +51 -0
  83. package/dist/observability.js.map +1 -0
  84. package/dist/ollama.d.ts +105 -0
  85. package/dist/ollama.d.ts.map +1 -0
  86. package/dist/ollama.js +109 -0
  87. package/dist/ollama.js.map +1 -0
  88. package/dist/prewarm.d.ts +28 -0
  89. package/dist/prewarm.d.ts.map +1 -0
  90. package/dist/prewarm.js +69 -0
  91. package/dist/prewarm.js.map +1 -0
  92. package/dist/profiles.d.ts +54 -0
  93. package/dist/profiles.d.ts.map +1 -0
  94. package/dist/profiles.js +95 -0
  95. package/dist/profiles.js.map +1 -0
  96. package/dist/protectedPaths.d.ts +33 -0
  97. package/dist/protectedPaths.d.ts.map +1 -0
  98. package/dist/protectedPaths.js +54 -0
  99. package/dist/protectedPaths.js.map +1 -0
  100. package/dist/runContext.d.ts +21 -0
  101. package/dist/runContext.d.ts.map +1 -0
  102. package/dist/runContext.js +9 -0
  103. package/dist/runContext.js.map +1 -0
  104. package/dist/semaphore.d.ts +16 -0
  105. package/dist/semaphore.d.ts.map +1 -0
  106. package/dist/semaphore.js +37 -0
  107. package/dist/semaphore.js.map +1 -0
  108. package/dist/sources.d.ts +19 -0
  109. package/dist/sources.d.ts.map +1 -0
  110. package/dist/sources.js +41 -0
  111. package/dist/sources.js.map +1 -0
  112. package/dist/tiers.d.ts +39 -0
  113. package/dist/tiers.d.ts.map +1 -0
  114. package/dist/tiers.js +44 -0
  115. package/dist/tiers.js.map +1 -0
  116. package/dist/tools/artifactDiff.d.ts +66 -0
  117. package/dist/tools/artifactDiff.d.ts.map +1 -0
  118. package/dist/tools/artifactDiff.js +66 -0
  119. package/dist/tools/artifactDiff.js.map +1 -0
  120. package/dist/tools/artifactExportToPath.d.ts +38 -0
  121. package/dist/tools/artifactExportToPath.d.ts.map +1 -0
  122. package/dist/tools/artifactExportToPath.js +51 -0
  123. package/dist/tools/artifactExportToPath.js.map +1 -0
  124. package/dist/tools/artifactList.d.ts +60 -0
  125. package/dist/tools/artifactList.d.ts.map +1 -0
  126. package/dist/tools/artifactList.js +107 -0
  127. package/dist/tools/artifactList.js.map +1 -0
  128. package/dist/tools/artifactRead.d.ts +43 -0
  129. package/dist/tools/artifactRead.d.ts.map +1 -0
  130. package/dist/tools/artifactRead.js +83 -0
  131. package/dist/tools/artifactRead.js.map +1 -0
  132. package/dist/tools/artifactSnippets.d.ts +56 -0
  133. package/dist/tools/artifactSnippets.d.ts.map +1 -0
  134. package/dist/tools/artifactSnippets.js +97 -0
  135. package/dist/tools/artifactSnippets.js.map +1 -0
  136. package/dist/tools/artifacts/diff.d.ts +161 -0
  137. package/dist/tools/artifacts/diff.d.ts.map +1 -0
  138. package/dist/tools/artifacts/diff.js +267 -0
  139. package/dist/tools/artifacts/diff.js.map +1 -0
  140. package/dist/tools/artifacts/export.d.ts +43 -0
  141. package/dist/tools/artifacts/export.d.ts.map +1 -0
  142. package/dist/tools/artifacts/export.js +113 -0
  143. package/dist/tools/artifacts/export.js.map +1 -0
  144. package/dist/tools/artifacts/scan.d.ts +86 -0
  145. package/dist/tools/artifacts/scan.d.ts.map +1 -0
  146. package/dist/tools/artifacts/scan.js +251 -0
  147. package/dist/tools/artifacts/scan.js.map +1 -0
  148. package/dist/tools/artifacts/snippets.d.ts +42 -0
  149. package/dist/tools/artifacts/snippets.d.ts.map +1 -0
  150. package/dist/tools/artifacts/snippets.js +165 -0
  151. package/dist/tools/artifacts/snippets.js.map +1 -0
  152. package/dist/tools/batch.d.ts +65 -0
  153. package/dist/tools/batch.d.ts.map +1 -0
  154. package/dist/tools/batch.js +117 -0
  155. package/dist/tools/batch.js.map +1 -0
  156. package/dist/tools/briefs/common.d.ts +65 -0
  157. package/dist/tools/briefs/common.d.ts.map +1 -0
  158. package/dist/tools/briefs/common.js +128 -0
  159. package/dist/tools/briefs/common.js.map +1 -0
  160. package/dist/tools/briefs/evidence.d.ts +40 -0
  161. package/dist/tools/briefs/evidence.d.ts.map +1 -0
  162. package/dist/tools/briefs/evidence.js +103 -0
  163. package/dist/tools/briefs/evidence.js.map +1 -0
  164. package/dist/tools/changeBrief.d.ts +85 -0
  165. package/dist/tools/changeBrief.d.ts.map +1 -0
  166. package/dist/tools/changeBrief.js +228 -0
  167. package/dist/tools/changeBrief.js.map +1 -0
  168. package/dist/tools/chat.d.ts +42 -0
  169. package/dist/tools/chat.d.ts.map +1 -0
  170. package/dist/tools/chat.js +49 -0
  171. package/dist/tools/chat.js.map +1 -0
  172. package/dist/tools/classify.d.ts +56 -0
  173. package/dist/tools/classify.d.ts.map +1 -0
  174. package/dist/tools/classify.js +103 -0
  175. package/dist/tools/classify.js.map +1 -0
  176. package/dist/tools/corpusAnswer.d.ts +79 -0
  177. package/dist/tools/corpusAnswer.d.ts.map +1 -0
  178. package/dist/tools/corpusAnswer.js +259 -0
  179. package/dist/tools/corpusAnswer.js.map +1 -0
  180. package/dist/tools/corpusIndex.d.ts +30 -0
  181. package/dist/tools/corpusIndex.d.ts.map +1 -0
  182. package/dist/tools/corpusIndex.js +67 -0
  183. package/dist/tools/corpusIndex.js.map +1 -0
  184. package/dist/tools/corpusList.d.ts +19 -0
  185. package/dist/tools/corpusList.d.ts.map +1 -0
  186. package/dist/tools/corpusList.js +34 -0
  187. package/dist/tools/corpusList.js.map +1 -0
  188. package/dist/tools/corpusRefresh.d.ts +29 -0
  189. package/dist/tools/corpusRefresh.d.ts.map +1 -0
  190. package/dist/tools/corpusRefresh.js +58 -0
  191. package/dist/tools/corpusRefresh.js.map +1 -0
  192. package/dist/tools/corpusSearch.d.ts +44 -0
  193. package/dist/tools/corpusSearch.d.ts.map +1 -0
  194. package/dist/tools/corpusSearch.js +80 -0
  195. package/dist/tools/corpusSearch.js.map +1 -0
  196. package/dist/tools/draft.d.ts +38 -0
  197. package/dist/tools/draft.d.ts.map +1 -0
  198. package/dist/tools/draft.js +72 -0
  199. package/dist/tools/draft.js.map +1 -0
  200. package/dist/tools/embed.d.ts +27 -0
  201. package/dist/tools/embed.d.ts.map +1 -0
  202. package/dist/tools/embed.js +41 -0
  203. package/dist/tools/embed.js.map +1 -0
  204. package/dist/tools/embedSearch.d.ts +58 -0
  205. package/dist/tools/embedSearch.d.ts.map +1 -0
  206. package/dist/tools/embedSearch.js +76 -0
  207. package/dist/tools/embedSearch.js.map +1 -0
  208. package/dist/tools/extract.d.ts +58 -0
  209. package/dist/tools/extract.d.ts.map +1 -0
  210. package/dist/tools/extract.js +93 -0
  211. package/dist/tools/extract.js.map +1 -0
  212. package/dist/tools/incidentBrief.d.ts +81 -0
  213. package/dist/tools/incidentBrief.d.ts.map +1 -0
  214. package/dist/tools/incidentBrief.js +252 -0
  215. package/dist/tools/incidentBrief.js.map +1 -0
  216. package/dist/tools/packs/changePack.d.ts +166 -0
  217. package/dist/tools/packs/changePack.d.ts.map +1 -0
  218. package/dist/tools/packs/changePack.js +470 -0
  219. package/dist/tools/packs/changePack.js.map +1 -0
  220. package/dist/tools/packs/incidentPack.d.ts +125 -0
  221. package/dist/tools/packs/incidentPack.d.ts.map +1 -0
  222. package/dist/tools/packs/incidentPack.js +354 -0
  223. package/dist/tools/packs/incidentPack.js.map +1 -0
  224. package/dist/tools/packs/repoPack.d.ts +207 -0
  225. package/dist/tools/packs/repoPack.d.ts.map +1 -0
  226. package/dist/tools/packs/repoPack.js +456 -0
  227. package/dist/tools/packs/repoPack.js.map +1 -0
  228. package/dist/tools/repoBrief.d.ts +81 -0
  229. package/dist/tools/repoBrief.d.ts.map +1 -0
  230. package/dist/tools/repoBrief.js +213 -0
  231. package/dist/tools/repoBrief.js.map +1 -0
  232. package/dist/tools/research.d.ts +45 -0
  233. package/dist/tools/research.d.ts.map +1 -0
  234. package/dist/tools/research.js +100 -0
  235. package/dist/tools/research.js.map +1 -0
  236. package/dist/tools/runner.d.ts +24 -0
  237. package/dist/tools/runner.d.ts.map +1 -0
  238. package/dist/tools/runner.js +47 -0
  239. package/dist/tools/runner.js.map +1 -0
  240. package/dist/tools/summarizeDeep.d.ts +49 -0
  241. package/dist/tools/summarizeDeep.d.ts.map +1 -0
  242. package/dist/tools/summarizeDeep.js +109 -0
  243. package/dist/tools/summarizeDeep.js.map +1 -0
  244. package/dist/tools/summarizeFast.d.ts +28 -0
  245. package/dist/tools/summarizeFast.d.ts.map +1 -0
  246. package/dist/tools/summarizeFast.js +43 -0
  247. package/dist/tools/summarizeFast.js.map +1 -0
  248. package/dist/tools/triageLogs.d.ts +51 -0
  249. package/dist/tools/triageLogs.d.ts.map +1 -0
  250. package/dist/tools/triageLogs.js +96 -0
  251. package/dist/tools/triageLogs.js.map +1 -0
  252. package/dist/version.d.ts +2 -0
  253. package/dist/version.d.ts.map +1 -0
  254. package/dist/version.js +2 -0
  255. package/dist/version.js.map +1 -0
  256. package/package.json +60 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexical.js","sourceRoot":"","sources":["../../src/corpus/lexical.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Corpus manifest — the source of truth for what a corpus SHOULD contain.
3
+ *
4
+ * The corpus JSON (<name>.json) represents reality: the chunks actually
5
+ * indexed right now. The manifest (<name>.manifest.json) represents
6
+ * intent: the paths + chunk parameters + embed model the caller declared.
7
+ * Refresh reconciles intent vs reality and reports the drift.
8
+ *
9
+ * Kept as a separate file so intent can be inspected and edited without
10
+ * touching the corpus payload. ollama_corpus_index always writes a
11
+ * manifest as a side effect; ollama_corpus_refresh reads it.
12
+ */
13
+ export declare const MANIFEST_SCHEMA_VERSION = 1;
14
+ export interface CorpusManifest {
15
+ schema_version: number;
16
+ name: string;
17
+ /** Absolute paths the corpus is declared to contain. */
18
+ paths: string[];
19
+ /** Embed model this manifest was built against — refresh refuses on mismatch. */
20
+ embed_model: string;
21
+ chunk_chars: number;
22
+ chunk_overlap: number;
23
+ created_at: string;
24
+ updated_at: string;
25
+ }
26
+ export declare function manifestPath(name: string): string;
27
+ export declare function loadManifest(name: string): Promise<CorpusManifest | null>;
28
+ export declare function saveManifest(manifest: CorpusManifest): Promise<void>;
29
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/corpus/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,iFAAiF;IACjF,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAgB/E;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1E"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Corpus manifest — the source of truth for what a corpus SHOULD contain.
3
+ *
4
+ * The corpus JSON (<name>.json) represents reality: the chunks actually
5
+ * indexed right now. The manifest (<name>.manifest.json) represents
6
+ * intent: the paths + chunk parameters + embed model the caller declared.
7
+ * Refresh reconciles intent vs reality and reports the drift.
8
+ *
9
+ * Kept as a separate file so intent can be inspected and edited without
10
+ * touching the corpus payload. ollama_corpus_index always writes a
11
+ * manifest as a side effect; ollama_corpus_refresh reads it.
12
+ */
13
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
14
+ import { existsSync } from "node:fs";
15
+ import { homedir } from "node:os";
16
+ import { join, dirname } from "node:path";
17
+ import { InternError } from "../errors.js";
18
+ import { assertValidCorpusName } from "./storage.js";
19
+ export const MANIFEST_SCHEMA_VERSION = 1;
20
+ function manifestDir() {
21
+ return process.env.INTERN_CORPUS_DIR ?? join(homedir(), ".ollama-intern", "corpora");
22
+ }
23
+ export function manifestPath(name) {
24
+ return join(manifestDir(), `${name}.manifest.json`);
25
+ }
26
+ export async function loadManifest(name) {
27
+ assertValidCorpusName(name);
28
+ const path = manifestPath(name);
29
+ if (!existsSync(path))
30
+ return null;
31
+ const raw = await readFile(path, "utf8");
32
+ const parsed = JSON.parse(raw);
33
+ const found = parsed.schema_version;
34
+ if (found !== MANIFEST_SCHEMA_VERSION) {
35
+ throw new InternError("SCHEMA_INVALID", `Manifest for corpus "${name}" is at schema v${found ?? "unknown"}; this build expects v${MANIFEST_SCHEMA_VERSION}. File: ${path}`, `Re-run ollama_corpus_index({ name: "${name}", paths: [...] }) to rewrite the manifest under the current schema.`, false);
36
+ }
37
+ return parsed;
38
+ }
39
+ export async function saveManifest(manifest) {
40
+ assertValidCorpusName(manifest.name);
41
+ const path = manifestPath(manifest.name);
42
+ await mkdir(dirname(path), { recursive: true });
43
+ await writeFile(path, JSON.stringify(manifest, null, 2), "utf8");
44
+ }
45
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/corpus/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAezC,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,IAAI,gBAAgB,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0D,CAAC;IACxF,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;IACpC,IAAI,KAAK,KAAK,uBAAuB,EAAE,CAAC;QACtC,MAAM,IAAI,WAAW,CACnB,gBAAgB,EAChB,wBAAwB,IAAI,mBAAmB,KAAK,IAAI,SAAS,yBAAyB,uBAAuB,WAAW,IAAI,EAAE,EAClI,uCAAuC,IAAI,sEAAsE,EACjH,KAAK,CACN,CAAC;IACJ,CAAC;IACD,OAAO,MAAwB,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAwB;IACzD,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Corpus refresh — reconcile the corpus (reality) against its manifest
3
+ * (intent) and report the drift in operational terms.
4
+ *
5
+ * Laws:
6
+ *
7
+ * Manifest is the source of truth. `paths`, `embed_model`, `chunk_*`
8
+ * come from the manifest; refresh doesn't accept them as input. The
9
+ * only argument is the corpus name.
10
+ *
11
+ * Deletes are real. Any path present in the corpus but absent from
12
+ * the manifest has its chunks removed. Any path present in the
13
+ * manifest but missing from disk also has its chunks removed — and
14
+ * the caller gets a separate `missing` list so they can tell whether
15
+ * the delete was intentional (manifest edit) or a disk gap.
16
+ *
17
+ * Drift is legible. Every category of change surfaces by name:
18
+ * added / changed / unchanged / deleted / missing, plus chunk-level
19
+ * counts (reused / reembedded / dropped). No generic "out of date".
20
+ *
21
+ * Idempotence is sacred. A no-change refresh is a no-op: no embed
22
+ * calls, no disk writes, no manifest bump. `no_op: true` in the
23
+ * report.
24
+ */
25
+ import type { OllamaClient } from "../ollama.js";
26
+ export interface RefreshReport {
27
+ name: string;
28
+ embed_model: string;
29
+ /** Paths indexed for the first time this refresh. */
30
+ added: string[];
31
+ /** Paths whose sha256 changed since the last index and were re-embedded. */
32
+ changed: string[];
33
+ /** Paths present in manifest and on disk with matching sha256 — reused. */
34
+ unchanged: string[];
35
+ /** Paths whose chunks left the corpus (union of manifest-removed and disk-missing). */
36
+ deleted: string[];
37
+ /** Subset of `deleted`: paths the manifest still declares but disk does not have. */
38
+ missing: string[];
39
+ /** Chunk-level counts. */
40
+ reused_chunks: number;
41
+ reembedded_chunks: number;
42
+ dropped_chunks: number;
43
+ elapsed_ms: number;
44
+ /** True iff the refresh made no changes at all. */
45
+ no_op: boolean;
46
+ }
47
+ export interface RefreshParams {
48
+ name: string;
49
+ /** Active embed model. Must match the manifest or refresh refuses. */
50
+ model: string;
51
+ client: OllamaClient;
52
+ }
53
+ export declare function refreshCorpus(params: RefreshParams): Promise<RefreshReport>;
54
+ //# sourceMappingURL=refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../src/corpus/refresh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAMjD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2EAA2E;IAC3E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,uFAAuF;IACvF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qFAAqF;IACrF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;CACtB;AAcD,wBAAsB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAqIjF"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Corpus refresh — reconcile the corpus (reality) against its manifest
3
+ * (intent) and report the drift in operational terms.
4
+ *
5
+ * Laws:
6
+ *
7
+ * Manifest is the source of truth. `paths`, `embed_model`, `chunk_*`
8
+ * come from the manifest; refresh doesn't accept them as input. The
9
+ * only argument is the corpus name.
10
+ *
11
+ * Deletes are real. Any path present in the corpus but absent from
12
+ * the manifest has its chunks removed. Any path present in the
13
+ * manifest but missing from disk also has its chunks removed — and
14
+ * the caller gets a separate `missing` list so they can tell whether
15
+ * the delete was intentional (manifest edit) or a disk gap.
16
+ *
17
+ * Drift is legible. Every category of change surfaces by name:
18
+ * added / changed / unchanged / deleted / missing, plus chunk-level
19
+ * counts (reused / reembedded / dropped). No generic "out of date".
20
+ *
21
+ * Idempotence is sacred. A no-change refresh is a no-op: no embed
22
+ * calls, no disk writes, no manifest bump. `no_op: true` in the
23
+ * report.
24
+ */
25
+ import { readFile, stat } from "node:fs/promises";
26
+ import { resolve } from "node:path";
27
+ import { createHash } from "node:crypto";
28
+ import { InternError } from "../errors.js";
29
+ import { loadCorpus } from "./storage.js";
30
+ import { loadManifest, saveManifest } from "./manifest.js";
31
+ import { indexCorpus } from "./indexer.js";
32
+ async function sha256Of(absPath) {
33
+ const content = await readFile(absPath, "utf8");
34
+ await stat(absPath); // fail if not a regular file / missing
35
+ return "sha256:" + createHash("sha256").update(content).digest("hex");
36
+ }
37
+ export async function refreshCorpus(params) {
38
+ const t0 = Date.now();
39
+ const manifest = await loadManifest(params.name);
40
+ if (!manifest) {
41
+ throw new InternError("SCHEMA_INVALID", `No manifest found for corpus "${params.name}".`, `Run ollama_corpus_index({ name: "${params.name}", paths: [...] }) first — that writes the manifest as a side effect. Once a manifest exists, refresh can reconcile intent vs reality.`, false);
42
+ }
43
+ if (manifest.embed_model !== params.model) {
44
+ throw new InternError("SCHEMA_INVALID", `Manifest for corpus "${params.name}" declares embed model "${manifest.embed_model}", but the active embed tier is "${params.model}".`, `Either switch the active embed tier to match the manifest, or re-run ollama_corpus_index with the new model to rebuild the manifest.`, false);
45
+ }
46
+ // Load existing corpus — out-of-date schema is treated as "no corpus";
47
+ // the re-index step below will rewrite it cleanly under the current schema.
48
+ let existing = null;
49
+ try {
50
+ existing = await loadCorpus(params.name);
51
+ }
52
+ catch (err) {
53
+ if (err instanceof InternError && err.code === "SCHEMA_INVALID")
54
+ existing = null;
55
+ else
56
+ throw err;
57
+ }
58
+ // Build a hash→paths lookup from the existing corpus so we can detect
59
+ // which manifest paths are unchanged / changed / added without re-reading
60
+ // any file more than once.
61
+ const priorHashByPath = new Map();
62
+ if (existing) {
63
+ for (const c of existing.chunks)
64
+ priorHashByPath.set(c.path, c.file_hash);
65
+ }
66
+ const priorPaths = new Set(priorHashByPath.keys());
67
+ // Classify every manifest path.
68
+ const manifestAbs = manifest.paths.map((p) => resolve(p));
69
+ const classifications = [];
70
+ for (const absPath of manifestAbs) {
71
+ let hash;
72
+ try {
73
+ hash = await sha256Of(absPath);
74
+ }
75
+ catch {
76
+ classifications.push({ path: absPath, klass: "missing", file_hash: null });
77
+ continue;
78
+ }
79
+ const prior = priorHashByPath.get(absPath);
80
+ if (prior === undefined) {
81
+ classifications.push({ path: absPath, klass: "added", file_hash: hash });
82
+ }
83
+ else if (prior === hash) {
84
+ classifications.push({ path: absPath, klass: "unchanged", file_hash: hash });
85
+ }
86
+ else {
87
+ classifications.push({ path: absPath, klass: "changed", file_hash: hash });
88
+ }
89
+ }
90
+ // Paths that were in the corpus but not in the manifest → explicit delete.
91
+ const manifestSet = new Set(manifestAbs);
92
+ const explicitlyRemoved = [...priorPaths].filter((p) => !manifestSet.has(p));
93
+ const added = classifications.filter((c) => c.klass === "added").map((c) => c.path);
94
+ const changed = classifications.filter((c) => c.klass === "changed").map((c) => c.path);
95
+ const unchanged = classifications.filter((c) => c.klass === "unchanged").map((c) => c.path);
96
+ const missing = classifications.filter((c) => c.klass === "missing").map((c) => c.path);
97
+ // Union of deletes: manifest-removed plus disk-missing. Both mean
98
+ // "chunks for this path are no longer in the corpus after refresh".
99
+ const deleted = [...explicitlyRemoved, ...missing].sort();
100
+ // No-op detection. Nothing to do → don't touch anything, don't bump
101
+ // manifest.updated_at, don't call the indexer at all.
102
+ const noOp = added.length === 0 && changed.length === 0 && deleted.length === 0;
103
+ if (noOp) {
104
+ return {
105
+ name: params.name,
106
+ embed_model: manifest.embed_model,
107
+ added,
108
+ changed,
109
+ unchanged: unchanged.sort(),
110
+ deleted,
111
+ missing: missing.sort(),
112
+ reused_chunks: existing?.chunks.length ?? 0,
113
+ reembedded_chunks: 0,
114
+ dropped_chunks: 0,
115
+ elapsed_ms: Date.now() - t0,
116
+ no_op: true,
117
+ };
118
+ }
119
+ // Live paths = manifest paths that actually exist on disk.
120
+ const livePaths = classifications
121
+ .filter((c) => c.klass !== "missing")
122
+ .map((c) => c.path);
123
+ const indexReport = await indexCorpus({
124
+ name: params.name,
125
+ paths: livePaths,
126
+ model: params.model,
127
+ chunk_chars: manifest.chunk_chars,
128
+ chunk_overlap: manifest.chunk_overlap,
129
+ client: params.client,
130
+ });
131
+ // Dropped chunks = prior chunks that didn't survive. Since reused chunks
132
+ // are preserved verbatim, dropped = prev - reused.
133
+ const prevChunkCount = existing?.chunks.length ?? 0;
134
+ const droppedChunks = Math.max(0, prevChunkCount - indexReport.reused_chunks);
135
+ // Re-save manifest to bump updated_at, but only on actual change.
136
+ await saveManifest({
137
+ ...manifest,
138
+ updated_at: new Date().toISOString(),
139
+ });
140
+ return {
141
+ name: params.name,
142
+ embed_model: manifest.embed_model,
143
+ added: added.sort(),
144
+ changed: changed.sort(),
145
+ unchanged: unchanged.sort(),
146
+ deleted,
147
+ missing: missing.sort(),
148
+ reused_chunks: indexReport.reused_chunks,
149
+ reembedded_chunks: indexReport.newly_embedded_chunks,
150
+ dropped_chunks: droppedChunks,
151
+ elapsed_ms: Date.now() - t0,
152
+ no_op: false,
153
+ };
154
+ }
155
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../src/corpus/refresh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Corpus search dispatcher — picks the retrieval strategy and returns
3
+ * ranked hits with a stable tie-break. No synthesis here: the answer
4
+ * flagship builds on top of this.
5
+ *
6
+ * Modes:
7
+ * - semantic : dense cosine only (pre-slice-3 behavior)
8
+ * - lexical : BM25 only, never calls embed
9
+ * - hybrid : RRF-fused semantic + lexical, default mode
10
+ * - fact : hybrid + exact-substring boost + short-chunk preference
11
+ * - title_path : pure metadata (lexical with body weight = 0), no embed
12
+ *
13
+ * Mode choice controls whether the query is embedded at all; `lexical`
14
+ * and `title_path` skip the embed round-trip entirely, so the model
15
+ * mismatch check only fires on modes that actually touch the embed rail.
16
+ *
17
+ * Tie-break: score desc, then (path asc, chunk_index asc). Zero-score
18
+ * chunks are dropped before top_k slicing.
19
+ */
20
+ import type { OllamaClient } from "../ollama.js";
21
+ import type { ChunkType } from "./chunker.js";
22
+ import type { CorpusFile } from "./storage.js";
23
+ export type SearchMode = "semantic" | "lexical" | "hybrid" | "fact" | "title_path";
24
+ export declare const DEFAULT_SEARCH_MODE: SearchMode;
25
+ export declare const SEARCH_MODES: readonly SearchMode[];
26
+ export interface CorpusHit {
27
+ id: string;
28
+ path: string;
29
+ score: number;
30
+ chunk_index: number;
31
+ char_start: number;
32
+ char_end: number;
33
+ heading_path: string[];
34
+ chunk_type: ChunkType;
35
+ title: string | null;
36
+ preview?: string;
37
+ }
38
+ export interface SearchParams {
39
+ corpus: CorpusFile;
40
+ query: string;
41
+ model: string;
42
+ mode?: SearchMode;
43
+ top_k?: number;
44
+ preview_chars?: number;
45
+ client: OllamaClient;
46
+ }
47
+ export declare function searchCorpus(params: SearchParams): Promise<CorpusHit[]>;
48
+ //# sourceMappingURL=searcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searcher.d.ts","sourceRoot":"","sources":["../../src/corpus/searcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAC;AAEnF,eAAO,MAAM,mBAAmB,EAAE,UAAqB,CAAC;AAExD,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAMpC,CAAC;AAEX,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;CACtB;AAgED,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA6D7E"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Corpus search dispatcher — picks the retrieval strategy and returns
3
+ * ranked hits with a stable tie-break. No synthesis here: the answer
4
+ * flagship builds on top of this.
5
+ *
6
+ * Modes:
7
+ * - semantic : dense cosine only (pre-slice-3 behavior)
8
+ * - lexical : BM25 only, never calls embed
9
+ * - hybrid : RRF-fused semantic + lexical, default mode
10
+ * - fact : hybrid + exact-substring boost + short-chunk preference
11
+ * - title_path : pure metadata (lexical with body weight = 0), no embed
12
+ *
13
+ * Mode choice controls whether the query is embedded at all; `lexical`
14
+ * and `title_path` skip the embed round-trip entirely, so the model
15
+ * mismatch check only fires on modes that actually touch the embed rail.
16
+ *
17
+ * Tie-break: score desc, then (path asc, chunk_index asc). Zero-score
18
+ * chunks are dropped before top_k slicing.
19
+ */
20
+ import { rankByCosine } from "../embedMath.js";
21
+ import { InternError } from "../errors.js";
22
+ import { buildLexicalIndex, scoreLexical } from "./lexical.js";
23
+ import { applyFactBoost, rrfFuse, toRanked } from "./fusion.js";
24
+ export const DEFAULT_SEARCH_MODE = "hybrid";
25
+ export const SEARCH_MODES = [
26
+ "semantic",
27
+ "lexical",
28
+ "hybrid",
29
+ "fact",
30
+ "title_path",
31
+ ];
32
+ function modeRequiresEmbedding(mode) {
33
+ return mode === "semantic" || mode === "hybrid" || mode === "fact";
34
+ }
35
+ function stableSort(hits) {
36
+ return hits.slice().sort((a, b) => {
37
+ if (b.score !== a.score)
38
+ return b.score - a.score;
39
+ if (a.path !== b.path)
40
+ return a.path < b.path ? -1 : 1;
41
+ return a.chunk_index - b.chunk_index;
42
+ });
43
+ }
44
+ function toHit(c, score, corpus, previewChars) {
45
+ return {
46
+ id: c.id,
47
+ path: c.path,
48
+ score,
49
+ chunk_index: c.chunk_index,
50
+ char_start: c.char_start,
51
+ char_end: c.char_end,
52
+ heading_path: c.heading_path,
53
+ chunk_type: c.chunk_type,
54
+ title: corpus.titles?.[c.path] ?? null,
55
+ ...(previewChars > 0 ? { preview: c.text.slice(0, previewChars) } : {}),
56
+ };
57
+ }
58
+ async function scoreDense(params) {
59
+ const resp = await params.client.embed({ model: params.model, input: params.query });
60
+ if (resp.embeddings.length === 0) {
61
+ throw new Error("Embed returned no vectors for query");
62
+ }
63
+ const queryVec = resp.embeddings[0];
64
+ const ranked = rankByCosine(queryVec, params.corpus.chunks.map((c) => ({ item: c, vec: c.vector })));
65
+ // Drop non-positive cosines — they carry no useful similarity signal
66
+ // and would otherwise seed spurious ranks into RRF fusion.
67
+ return ranked.filter((r) => r.score > 0).map((r) => ({ chunkId: r.item.id, score: r.score }));
68
+ }
69
+ function scoreLex(query, index, mode) {
70
+ // title_path suppresses the body field; other modes use default weights.
71
+ const opts = mode === "title_path" ? { weights: { body: 0 } } : {};
72
+ return scoreLexical(query, index, opts).map((r) => ({
73
+ chunkId: r.chunkId,
74
+ score: r.score,
75
+ }));
76
+ }
77
+ export async function searchCorpus(params) {
78
+ const mode = params.mode ?? DEFAULT_SEARCH_MODE;
79
+ if (params.corpus.chunks.length === 0)
80
+ return [];
81
+ if (modeRequiresEmbedding(mode) && params.corpus.model_version !== params.model) {
82
+ throw new InternError("SCHEMA_INVALID", `Corpus "${params.corpus.name}" was indexed with model "${params.corpus.model_version}", but active embed tier is "${params.model}". Mode "${mode}" requires embedding the query.`, `Re-index with the current embed model, or call with mode: "lexical" or "title_path" — those don't embed.`, false);
83
+ }
84
+ const topK = params.top_k ?? params.corpus.chunks.length;
85
+ const previewChars = params.preview_chars ?? 0;
86
+ const chunkById = new Map(params.corpus.chunks.map((c) => [c.id, c]));
87
+ let lexicalIndex = null;
88
+ if (mode !== "semantic") {
89
+ lexicalIndex = buildLexicalIndex(params.corpus.chunks, params.corpus.titles ?? {});
90
+ }
91
+ let denseScored = null;
92
+ if (modeRequiresEmbedding(mode)) {
93
+ denseScored = await scoreDense(params);
94
+ }
95
+ let lexicalScored = null;
96
+ if (mode !== "semantic") {
97
+ lexicalScored = scoreLex(params.query, lexicalIndex, mode);
98
+ }
99
+ let finalScores;
100
+ if (mode === "semantic") {
101
+ finalScores = denseScored;
102
+ }
103
+ else if (mode === "lexical" || mode === "title_path") {
104
+ finalScores = lexicalScored;
105
+ }
106
+ else {
107
+ // hybrid and fact: RRF-fuse dense + lexical.
108
+ const fused = rrfFuse([
109
+ { ranked: toRanked(denseScored), weight: 1.0 },
110
+ { ranked: toRanked(lexicalScored), weight: 1.0 },
111
+ ]);
112
+ finalScores = [...fused.entries()].map(([chunkId, score]) => ({ chunkId, score }));
113
+ if (mode === "fact") {
114
+ const chunkText = new Map();
115
+ for (const c of params.corpus.chunks)
116
+ chunkText.set(c.id, c.text);
117
+ finalScores = applyFactBoost(finalScores, { query: params.query, chunkText });
118
+ }
119
+ }
120
+ const hits = [];
121
+ for (const { chunkId, score } of finalScores) {
122
+ if (score <= 0)
123
+ continue;
124
+ const c = chunkById.get(chunkId);
125
+ if (!c)
126
+ continue;
127
+ hits.push(toHit(c, score, params.corpus, previewChars));
128
+ }
129
+ return stableSort(hits).slice(0, topK);
130
+ }
131
+ //# sourceMappingURL=searcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searcher.js","sourceRoot":"","sources":["../../src/corpus/searcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Corpus persistence — one JSON file per named corpus.
3
+ *
4
+ * Location: ~/.ollama-intern/corpora/<name>.json (override via INTERN_CORPUS_DIR)
5
+ *
6
+ * Schema is explicitly versioned so we can evolve without silent breakage.
7
+ * Raw vectors are stored (this file is the database), but they never reach
8
+ * Claude — search handlers strip them before returning.
9
+ */
10
+ export declare const CORPUS_SCHEMA_VERSION = 2;
11
+ export type ChunkType = "heading" | "paragraph" | "code" | "list" | "frontmatter";
12
+ export interface CorpusChunk {
13
+ id: string;
14
+ path: string;
15
+ file_hash: string;
16
+ file_mtime: string;
17
+ chunk_index: number;
18
+ char_start: number;
19
+ char_end: number;
20
+ text: string;
21
+ vector: number[];
22
+ heading_path: string[];
23
+ chunk_type: ChunkType;
24
+ }
25
+ export interface CorpusFile {
26
+ schema_version: number;
27
+ name: string;
28
+ model_version: string;
29
+ model_digest: string | null;
30
+ indexed_at: string;
31
+ chunk_chars: number;
32
+ chunk_overlap: number;
33
+ stats: {
34
+ documents: number;
35
+ chunks: number;
36
+ total_chars: number;
37
+ };
38
+ titles: Record<string, string | null>;
39
+ chunks: CorpusChunk[];
40
+ }
41
+ export declare function corpusDir(): string;
42
+ export declare function corpusPath(name: string): string;
43
+ export declare function assertValidCorpusName(name: string): void;
44
+ export declare function loadCorpus(name: string): Promise<CorpusFile | null>;
45
+ export declare function saveCorpus(corpus: CorpusFile): Promise<void>;
46
+ export interface CorpusSummary {
47
+ name: string;
48
+ model_version: string;
49
+ indexed_at: string;
50
+ documents: number;
51
+ chunks: number;
52
+ total_chars: number;
53
+ bytes_on_disk: number;
54
+ }
55
+ export declare function listCorpora(): Promise<CorpusSummary[]>;
56
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/corpus/storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;AAElF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CASxD;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAgBzE;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlE;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CA4B5D"}