agent-knowledge 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 (130) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/LICENSE +21 -0
  3. package/README.md +191 -0
  4. package/dist/dashboard.d.ts +4 -0
  5. package/dist/dashboard.d.ts.map +1 -0
  6. package/dist/dashboard.js +434 -0
  7. package/dist/dashboard.js.map +1 -0
  8. package/dist/embeddings/claude.d.ts +21 -0
  9. package/dist/embeddings/claude.d.ts.map +1 -0
  10. package/dist/embeddings/claude.js +84 -0
  11. package/dist/embeddings/claude.js.map +1 -0
  12. package/dist/embeddings/factory.d.ts +9 -0
  13. package/dist/embeddings/factory.d.ts.map +1 -0
  14. package/dist/embeddings/factory.js +60 -0
  15. package/dist/embeddings/factory.js.map +1 -0
  16. package/dist/embeddings/gemini.d.ts +21 -0
  17. package/dist/embeddings/gemini.d.ts.map +1 -0
  18. package/dist/embeddings/gemini.js +86 -0
  19. package/dist/embeddings/gemini.js.map +1 -0
  20. package/dist/embeddings/index.d.ts +4 -0
  21. package/dist/embeddings/index.d.ts.map +1 -0
  22. package/dist/embeddings/index.js +3 -0
  23. package/dist/embeddings/index.js.map +1 -0
  24. package/dist/embeddings/local.d.ts +20 -0
  25. package/dist/embeddings/local.d.ts.map +1 -0
  26. package/dist/embeddings/local.js +73 -0
  27. package/dist/embeddings/local.js.map +1 -0
  28. package/dist/embeddings/openai.d.ts +20 -0
  29. package/dist/embeddings/openai.d.ts.map +1 -0
  30. package/dist/embeddings/openai.js +84 -0
  31. package/dist/embeddings/openai.js.map +1 -0
  32. package/dist/embeddings/types.d.ts +39 -0
  33. package/dist/embeddings/types.d.ts.map +1 -0
  34. package/dist/embeddings/types.js +12 -0
  35. package/dist/embeddings/types.js.map +1 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +18 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/knowledge/distill.d.ts +27 -0
  41. package/dist/knowledge/distill.d.ts.map +1 -0
  42. package/dist/knowledge/distill.js +407 -0
  43. package/dist/knowledge/distill.js.map +1 -0
  44. package/dist/knowledge/git.d.ts +30 -0
  45. package/dist/knowledge/git.d.ts.map +1 -0
  46. package/dist/knowledge/git.js +228 -0
  47. package/dist/knowledge/git.js.map +1 -0
  48. package/dist/knowledge/search.d.ts +20 -0
  49. package/dist/knowledge/search.d.ts.map +1 -0
  50. package/dist/knowledge/search.js +72 -0
  51. package/dist/knowledge/search.js.map +1 -0
  52. package/dist/knowledge/store.d.ts +47 -0
  53. package/dist/knowledge/store.d.ts.map +1 -0
  54. package/dist/knowledge/store.js +173 -0
  55. package/dist/knowledge/store.js.map +1 -0
  56. package/dist/search/excerpt.d.ts +12 -0
  57. package/dist/search/excerpt.d.ts.map +1 -0
  58. package/dist/search/excerpt.js +28 -0
  59. package/dist/search/excerpt.js.map +1 -0
  60. package/dist/search/fuzzy.d.ts +15 -0
  61. package/dist/search/fuzzy.d.ts.map +1 -0
  62. package/dist/search/fuzzy.js +81 -0
  63. package/dist/search/fuzzy.js.map +1 -0
  64. package/dist/search/tfidf.d.ts +19 -0
  65. package/dist/search/tfidf.d.ts.map +1 -0
  66. package/dist/search/tfidf.js +200 -0
  67. package/dist/search/tfidf.js.map +1 -0
  68. package/dist/search/types.d.ts +19 -0
  69. package/dist/search/types.d.ts.map +1 -0
  70. package/dist/search/types.js +2 -0
  71. package/dist/search/types.js.map +1 -0
  72. package/dist/server.d.ts +3 -0
  73. package/dist/server.d.ts.map +1 -0
  74. package/dist/server.js +518 -0
  75. package/dist/server.js.map +1 -0
  76. package/dist/sessions/indexer.d.ts +15 -0
  77. package/dist/sessions/indexer.d.ts.map +1 -0
  78. package/dist/sessions/indexer.js +182 -0
  79. package/dist/sessions/indexer.js.map +1 -0
  80. package/dist/sessions/parser.d.ts +58 -0
  81. package/dist/sessions/parser.d.ts.map +1 -0
  82. package/dist/sessions/parser.js +142 -0
  83. package/dist/sessions/parser.js.map +1 -0
  84. package/dist/sessions/scopes.d.ts +16 -0
  85. package/dist/sessions/scopes.d.ts.map +1 -0
  86. package/dist/sessions/scopes.js +153 -0
  87. package/dist/sessions/scopes.js.map +1 -0
  88. package/dist/sessions/search.d.ts +26 -0
  89. package/dist/sessions/search.d.ts.map +1 -0
  90. package/dist/sessions/search.js +256 -0
  91. package/dist/sessions/search.js.map +1 -0
  92. package/dist/sessions/summary.d.ts +28 -0
  93. package/dist/sessions/summary.d.ts.map +1 -0
  94. package/dist/sessions/summary.js +135 -0
  95. package/dist/sessions/summary.js.map +1 -0
  96. package/dist/types.d.ts +26 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +109 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/ui/app.js +1029 -0
  101. package/dist/ui/index.html +373 -0
  102. package/dist/ui/styles.css +1508 -0
  103. package/dist/ui/ui/app.js +811 -0
  104. package/dist/ui/ui/index.html +300 -0
  105. package/dist/ui/ui/styles.css +1154 -0
  106. package/dist/validate.d.ts +21 -0
  107. package/dist/validate.d.ts.map +1 -0
  108. package/dist/validate.js +86 -0
  109. package/dist/validate.js.map +1 -0
  110. package/dist/vectorstore/chunker.d.ts +48 -0
  111. package/dist/vectorstore/chunker.d.ts.map +1 -0
  112. package/dist/vectorstore/chunker.js +165 -0
  113. package/dist/vectorstore/chunker.js.map +1 -0
  114. package/dist/vectorstore/index.d.ts +5 -0
  115. package/dist/vectorstore/index.d.ts.map +1 -0
  116. package/dist/vectorstore/index.js +3 -0
  117. package/dist/vectorstore/index.js.map +1 -0
  118. package/dist/vectorstore/store.d.ts +139 -0
  119. package/dist/vectorstore/store.d.ts.map +1 -0
  120. package/dist/vectorstore/store.js +500 -0
  121. package/dist/vectorstore/store.js.map +1 -0
  122. package/dist/version.d.ts +2 -0
  123. package/dist/version.d.ts.map +1 -0
  124. package/dist/version.js +2 -0
  125. package/dist/version.js.map +1 -0
  126. package/docs/ARCHITECTURE.md +244 -0
  127. package/docs/DASHBOARD.md +133 -0
  128. package/docs/SETUP.md +178 -0
  129. package/package.json +92 -0
  130. package/scripts/copy-ui.js +6 -0
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Input validation helpers for MCP tool arguments.
3
+ */
4
+ export declare class ValidationError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ export declare function requireString(args: Record<string, unknown>, key: string): string;
8
+ export declare function optionalString(args: Record<string, unknown>, key: string): string | undefined;
9
+ export declare function optionalNumber(args: Record<string, unknown>, key: string, opts?: {
10
+ min?: number;
11
+ max?: number;
12
+ defaultValue?: number;
13
+ }): number | undefined;
14
+ export declare function optionalBoolean(args: Record<string, unknown>, key: string, defaultValue?: boolean): boolean;
15
+ export declare function requireEnum<T extends string>(args: Record<string, unknown>, key: string, allowed: readonly T[]): T;
16
+ export declare function optionalEnum<T extends string>(args: Record<string, unknown>, key: string, allowed: readonly T[], defaultValue?: T): T | undefined;
17
+ /**
18
+ * Validate a filename: no path separators, no special traversal chars.
19
+ */
20
+ export declare function validateFilename(name: string): string;
21
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMhF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ7F;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/D,MAAM,GAAG,SAAS,CAcpB;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,OAAO,GACrB,OAAO,CAOT;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,SAAS,CAAC,EAAE,GACpB,CAAC,CAMH;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,YAAY,CAAC,EAAE,CAAC,GACf,CAAC,GAAG,SAAS,CAOf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWrD"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Input validation helpers for MCP tool arguments.
3
+ */
4
+ export class ValidationError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = 'ValidationError';
8
+ }
9
+ }
10
+ export function requireString(args, key) {
11
+ const val = args[key];
12
+ if (typeof val !== 'string' || val.trim().length === 0) {
13
+ throw new ValidationError(`"${key}" is required and must be a non-empty string`);
14
+ }
15
+ return val.trim();
16
+ }
17
+ export function optionalString(args, key) {
18
+ const val = args[key];
19
+ if (val === undefined || val === null)
20
+ return undefined;
21
+ if (typeof val !== 'string') {
22
+ throw new ValidationError(`"${key}" must be a string`);
23
+ }
24
+ const trimmed = val.trim();
25
+ return trimmed.length > 0 ? trimmed : undefined;
26
+ }
27
+ export function optionalNumber(args, key, opts = {}) {
28
+ const val = args[key];
29
+ if (val === undefined || val === null)
30
+ return opts.defaultValue;
31
+ const num = typeof val === 'number' ? val : Number(val);
32
+ if (isNaN(num)) {
33
+ throw new ValidationError(`"${key}" must be a number`);
34
+ }
35
+ if (opts.min !== undefined && num < opts.min) {
36
+ throw new ValidationError(`"${key}" must be >= ${opts.min}`);
37
+ }
38
+ if (opts.max !== undefined && num > opts.max) {
39
+ throw new ValidationError(`"${key}" must be <= ${opts.max}`);
40
+ }
41
+ return num;
42
+ }
43
+ export function optionalBoolean(args, key, defaultValue) {
44
+ const val = args[key];
45
+ if (val === undefined || val === null)
46
+ return defaultValue ?? false;
47
+ if (typeof val === 'boolean')
48
+ return val;
49
+ if (val === 'true')
50
+ return true;
51
+ if (val === 'false')
52
+ return false;
53
+ throw new ValidationError(`"${key}" must be a boolean`);
54
+ }
55
+ export function requireEnum(args, key, allowed) {
56
+ const val = requireString(args, key);
57
+ if (!allowed.includes(val)) {
58
+ throw new ValidationError(`"${key}" must be one of: ${allowed.join(', ')}. Got: "${val}"`);
59
+ }
60
+ return val;
61
+ }
62
+ export function optionalEnum(args, key, allowed, defaultValue) {
63
+ const val = optionalString(args, key);
64
+ if (val === undefined)
65
+ return defaultValue;
66
+ if (!allowed.includes(val)) {
67
+ throw new ValidationError(`"${key}" must be one of: ${allowed.join(', ')}. Got: "${val}"`);
68
+ }
69
+ return val;
70
+ }
71
+ /**
72
+ * Validate a filename: no path separators, no special traversal chars.
73
+ */
74
+ export function validateFilename(name) {
75
+ if (/[/\\:]/.test(name)) {
76
+ throw new ValidationError('Filename must not contain path separators');
77
+ }
78
+ if (name === '.' || name === '..' || name.startsWith('..')) {
79
+ throw new ValidationError('Invalid filename');
80
+ }
81
+ if (name.length > 255) {
82
+ throw new ValidationError('Filename too long (max 255 chars)');
83
+ }
84
+ return name;
85
+ }
86
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Text chunking utilities for preparing content for embedding models.
3
+ *
4
+ * Two strategies:
5
+ * - Knowledge chunking: splits on markdown headers and paragraph breaks
6
+ * - Session chunking: treats each message as a natural chunk boundary
7
+ */
8
+ /** A single chunk of text ready for embedding. */
9
+ export interface Chunk {
10
+ index: number;
11
+ text: string;
12
+ metadata?: Record<string, unknown>;
13
+ }
14
+ /** A session message to be chunked. */
15
+ export interface SessionMessage {
16
+ role: string;
17
+ text: string;
18
+ timestamp?: string;
19
+ sessionId?: string;
20
+ }
21
+ /**
22
+ * Chunk a knowledge-base document (typically markdown).
23
+ *
24
+ * Strategy:
25
+ * 1. Split on markdown headers (## and above)
26
+ * 2. Within each section, split on paragraph breaks if still too long
27
+ * 3. Apply character overlap between chunks for context continuity
28
+ * 4. Short texts (< maxChars/2) are returned as a single chunk
29
+ *
30
+ * @param text - The full document text
31
+ * @param maxChars - Maximum characters per chunk (default 2000, ~500 tokens)
32
+ * @returns Array of chunks with index and text
33
+ */
34
+ export declare function chunkKnowledge(text: string, maxChars?: number): Chunk[];
35
+ /**
36
+ * Chunk session messages for embedding.
37
+ *
38
+ * Strategy:
39
+ * - Each message is a natural chunk (role + text)
40
+ * - Messages exceeding maxChars are split at sentence/word boundaries
41
+ * - Timestamp and role are included as metadata
42
+ *
43
+ * @param messages - Array of session messages
44
+ * @param maxChars - Maximum characters per chunk (default 2000)
45
+ * @returns Array of chunks with index, text, and metadata
46
+ */
47
+ export declare function chunkSession(messages: SessionMessage[], maxChars?: number): Chunk[];
48
+ //# sourceMappingURL=chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/vectorstore/chunker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,kDAAkD;AAClD,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,uCAAuC;AACvC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsFD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA0B,GAAG,KAAK,EAAE,CAgC1F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,cAAc,EAAE,EAC1B,QAAQ,GAAE,MAA0B,GACnC,KAAK,EAAE,CAiCT"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Text chunking utilities for preparing content for embedding models.
3
+ *
4
+ * Two strategies:
5
+ * - Knowledge chunking: splits on markdown headers and paragraph breaks
6
+ * - Session chunking: treats each message as a natural chunk boundary
7
+ */
8
+ const DEFAULT_MAX_CHARS = 2000;
9
+ const DEFAULT_OVERLAP = 200;
10
+ /**
11
+ * Strip YAML frontmatter delimited by `---\n...\n---` from the start of text.
12
+ */
13
+ function stripFrontmatter(text) {
14
+ const match = text.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);
15
+ return match ? text.slice(match[0].length) : text;
16
+ }
17
+ /**
18
+ * Normalize whitespace: collapse runs of 3+ newlines to 2, trim each line,
19
+ * but preserve single blank lines (paragraph structure).
20
+ */
21
+ function normalizeWhitespace(text) {
22
+ return text
23
+ .replace(/[ \t]+$/gm, '')
24
+ .replace(/^[ \t]+/gm, (m) => m)
25
+ .replace(/\n{3,}/g, '\n\n')
26
+ .trim();
27
+ }
28
+ /**
29
+ * Split text at a clean boundary (paragraph, sentence, or word) near maxChars.
30
+ * Returns [before, after].
31
+ */
32
+ function splitAtBoundary(text, maxChars) {
33
+ if (text.length <= maxChars)
34
+ return [text, ''];
35
+ const doubleNewline = text.lastIndexOf('\n\n', maxChars);
36
+ if (doubleNewline > maxChars * 0.3) {
37
+ return [text.slice(0, doubleNewline).trimEnd(), text.slice(doubleNewline).trimStart()];
38
+ }
39
+ const sentenceEnd = text.slice(0, maxChars).search(/[.!?]\s+(?=[A-Z])[^]*$/);
40
+ if (sentenceEnd > maxChars * 0.3) {
41
+ const splitPos = sentenceEnd + 1;
42
+ return [text.slice(0, splitPos).trimEnd(), text.slice(splitPos).trimStart()];
43
+ }
44
+ const lastSpace = text.lastIndexOf(' ', maxChars);
45
+ if (lastSpace > maxChars * 0.3) {
46
+ return [text.slice(0, lastSpace).trimEnd(), text.slice(lastSpace).trimStart()];
47
+ }
48
+ return [text.slice(0, maxChars), text.slice(maxChars)];
49
+ }
50
+ /**
51
+ * Split a long text into chunks of approximately maxChars with overlap.
52
+ * Used internally when a single section exceeds the limit.
53
+ */
54
+ function splitWithOverlap(text, maxChars, overlap) {
55
+ // Clamp overlap to at most half of maxChars to prevent infinite loops
56
+ const safeOverlap = Math.min(overlap, Math.floor(maxChars / 2));
57
+ const chunks = [];
58
+ let remaining = text;
59
+ while (remaining.length > 0) {
60
+ if (remaining.length <= maxChars) {
61
+ chunks.push(remaining);
62
+ break;
63
+ }
64
+ const [chunk, rest] = splitAtBoundary(remaining, maxChars);
65
+ chunks.push(chunk);
66
+ if (rest.length === 0)
67
+ break;
68
+ const overlapStart = Math.max(0, chunk.length - safeOverlap);
69
+ const overlapText = text.slice(text.length - remaining.length + overlapStart, text.length - remaining.length + chunk.length);
70
+ remaining = overlapText.length > 0 && safeOverlap > 0 ? overlapText + ' ' + rest : rest;
71
+ if (remaining.length >= text.length) {
72
+ remaining = rest;
73
+ }
74
+ }
75
+ return chunks;
76
+ }
77
+ /**
78
+ * Chunk a knowledge-base document (typically markdown).
79
+ *
80
+ * Strategy:
81
+ * 1. Split on markdown headers (## and above)
82
+ * 2. Within each section, split on paragraph breaks if still too long
83
+ * 3. Apply character overlap between chunks for context continuity
84
+ * 4. Short texts (< maxChars/2) are returned as a single chunk
85
+ *
86
+ * @param text - The full document text
87
+ * @param maxChars - Maximum characters per chunk (default 2000, ~500 tokens)
88
+ * @returns Array of chunks with index and text
89
+ */
90
+ export function chunkKnowledge(text, maxChars = DEFAULT_MAX_CHARS) {
91
+ const stripped = stripFrontmatter(text);
92
+ const normalized = normalizeWhitespace(stripped);
93
+ if (normalized.length === 0)
94
+ return [];
95
+ if (normalized.length < maxChars / 2) {
96
+ return [{ index: 0, text: normalized }];
97
+ }
98
+ const headerPattern = /^(?=#{1,4}\s)/m;
99
+ const sections = normalized.split(headerPattern).filter((s) => s.trim().length > 0);
100
+ const chunks = [];
101
+ let chunkIndex = 0;
102
+ for (const section of sections) {
103
+ const trimmed = section.trim();
104
+ if (trimmed.length === 0)
105
+ continue;
106
+ if (trimmed.length <= maxChars) {
107
+ chunks.push({ index: chunkIndex++, text: trimmed });
108
+ }
109
+ else {
110
+ const subChunks = splitWithOverlap(trimmed, maxChars, DEFAULT_OVERLAP);
111
+ for (const sub of subChunks) {
112
+ if (sub.trim().length > 0) {
113
+ chunks.push({ index: chunkIndex++, text: sub.trim() });
114
+ }
115
+ }
116
+ }
117
+ }
118
+ return chunks;
119
+ }
120
+ /**
121
+ * Chunk session messages for embedding.
122
+ *
123
+ * Strategy:
124
+ * - Each message is a natural chunk (role + text)
125
+ * - Messages exceeding maxChars are split at sentence/word boundaries
126
+ * - Timestamp and role are included as metadata
127
+ *
128
+ * @param messages - Array of session messages
129
+ * @param maxChars - Maximum characters per chunk (default 2000)
130
+ * @returns Array of chunks with index, text, and metadata
131
+ */
132
+ export function chunkSession(messages, maxChars = DEFAULT_MAX_CHARS) {
133
+ const chunks = [];
134
+ let chunkIndex = 0;
135
+ for (const msg of messages) {
136
+ const text = normalizeWhitespace(msg.text);
137
+ if (text.length === 0)
138
+ continue;
139
+ const prefix = `[${msg.role}]: `;
140
+ const metadata = { role: msg.role };
141
+ if (msg.timestamp)
142
+ metadata.timestamp = msg.timestamp;
143
+ if (msg.sessionId)
144
+ metadata.sessionId = msg.sessionId;
145
+ const fullText = prefix + text;
146
+ if (fullText.length <= maxChars) {
147
+ chunks.push({ index: chunkIndex++, text: fullText, metadata });
148
+ }
149
+ else {
150
+ const subChunks = splitWithOverlap(fullText, maxChars, 0);
151
+ for (let i = 0; i < subChunks.length; i++) {
152
+ const sub = subChunks[i].trim();
153
+ if (sub.length > 0) {
154
+ chunks.push({
155
+ index: chunkIndex++,
156
+ text: sub,
157
+ metadata: { ...metadata, part: i },
158
+ });
159
+ }
160
+ }
161
+ }
162
+ }
163
+ return chunks;
164
+ }
165
+ //# sourceMappingURL=chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/vectorstore/chunker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { VectorStore } from './store.js';
2
+ export type { VectorEntry, VectorSearchResult, VectorStoreStats } from './store.js';
3
+ export { chunkKnowledge, chunkSession } from './chunker.js';
4
+ export type { Chunk, SessionMessage } from './chunker.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vectorstore/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpF,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { VectorStore } from './store.js';
2
+ export { chunkKnowledge, chunkSession } from './chunker.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vectorstore/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * SQLite-backed vector store using better-sqlite3 and sqlite-vec
3
+ * for semantic similarity search over knowledge and session embeddings.
4
+ */
5
+ /** A single embedding entry to store. */
6
+ export interface VectorEntry {
7
+ id: string;
8
+ source: 'knowledge' | 'session';
9
+ sourceId: string;
10
+ chunkIndex: number;
11
+ chunkText: string;
12
+ provider: string;
13
+ dimensions: number;
14
+ embedding: number[];
15
+ metadata?: Record<string, unknown>;
16
+ }
17
+ /** A search result with similarity score. */
18
+ export interface VectorSearchResult {
19
+ id: string;
20
+ sourceId: string;
21
+ source: 'knowledge' | 'session';
22
+ chunkText: string;
23
+ score: number;
24
+ metadata?: Record<string, unknown>;
25
+ }
26
+ /** Aggregate statistics about the vector store. */
27
+ export interface VectorStoreStats {
28
+ totalEntries: number;
29
+ knowledgeEntries: number;
30
+ sessionEntries: number;
31
+ dbSizeMB: number;
32
+ provider: string | null;
33
+ dimensions: number | null;
34
+ }
35
+ /**
36
+ * SQLite + sqlite-vec vector store for semantic search.
37
+ *
38
+ * Lazily initializes the database on first access. Stores embeddings as
39
+ * Float32 BLOBs and uses sqlite-vec's vec0 virtual table for cosine
40
+ * similarity search.
41
+ */
42
+ export declare class VectorStore {
43
+ private db;
44
+ private dbPath;
45
+ private initialized;
46
+ private vecAvailable;
47
+ private currentDimensions;
48
+ /**
49
+ * Create a VectorStore instance.
50
+ * @param dbPath - Path to the SQLite database file. Defaults to `{claudeDir}/knowledge-vectors.db`.
51
+ */
52
+ constructor(dbPath?: string);
53
+ /**
54
+ * Initialize the database: create tables, load sqlite-vec extension.
55
+ * Called lazily on first operation that needs the DB.
56
+ */
57
+ private init;
58
+ /** Attempt to load the sqlite-vec extension. */
59
+ private loadVecExtension;
60
+ /** Create or verify the vec0 virtual table matches the expected dimensions. */
61
+ private ensureVecTable;
62
+ /** Get a value from the meta table. */
63
+ private getMetaValue;
64
+ /** Set a value in the meta table. */
65
+ private setMetaValue;
66
+ /** Ensure DB is initialized, using dimensions from the first entry or the stored value. */
67
+ private ensureInit;
68
+ /** Read stored dimensions from meta (requires db to exist). */
69
+ private getStoredDimensions;
70
+ /**
71
+ * Store embeddings for a source. Replaces existing chunks for the same source_id.
72
+ * Uses a transaction for atomicity.
73
+ *
74
+ * @param entries - The embedding entries to store
75
+ */
76
+ upsert(entries: VectorEntry[]): void;
77
+ /**
78
+ * Search by vector similarity. Returns top-k nearest neighbors.
79
+ *
80
+ * @param queryVector - The query embedding vector
81
+ * @param maxResults - Maximum number of results (default 10)
82
+ * @returns Sorted results with cosine similarity scores
83
+ */
84
+ search(queryVector: number[], maxResults?: number): VectorSearchResult[];
85
+ /**
86
+ * Search filtered by source type (knowledge or session).
87
+ *
88
+ * @param queryVector - The query embedding vector
89
+ * @param source - Filter to 'knowledge' or 'session' entries only
90
+ * @param maxResults - Maximum number of results (default 10)
91
+ * @returns Sorted results with cosine similarity scores
92
+ */
93
+ searchBySource(queryVector: number[], source: 'knowledge' | 'session', maxResults?: number): VectorSearchResult[];
94
+ /** Internal search implementation with optional source filter. */
95
+ private searchInternal;
96
+ /**
97
+ * Delete all embeddings for a given source_id.
98
+ *
99
+ * @param sourceId - The source identifier to remove
100
+ */
101
+ deleteBySource(sourceId: string): void;
102
+ /**
103
+ * Check whether a source_id has any stored embeddings.
104
+ *
105
+ * @param sourceId - The source identifier to check
106
+ * @returns True if at least one embedding exists for this source
107
+ */
108
+ hasEmbeddings(sourceId: string): boolean;
109
+ /**
110
+ * Get the name of the currently active embedding provider.
111
+ *
112
+ * @returns The provider name, or null if none is set
113
+ */
114
+ getCurrentProvider(): string | null;
115
+ /**
116
+ * Set the active embedding provider. If the provider has changed since
117
+ * the last call, all existing embeddings are wiped to avoid mixing
118
+ * incompatible vector spaces.
119
+ *
120
+ * @param providerName - The provider name (e.g. "openai", "ollama")
121
+ * @param dimensions - The embedding dimensions for this provider
122
+ * @returns True if a wipe was performed (provider changed)
123
+ */
124
+ setProvider(providerName: string, dimensions: number): boolean;
125
+ /**
126
+ * Wipe all embeddings and the vec0 index.
127
+ * Used when switching embedding providers to avoid mixing vector spaces.
128
+ */
129
+ wipe(): void;
130
+ /**
131
+ * Get statistics about the vector store.
132
+ *
133
+ * @returns Counts by source type, DB file size, provider, and dimensions
134
+ */
135
+ stats(): VectorStoreStats;
136
+ /** Close the database connection and release resources. */
137
+ close(): void;
138
+ }
139
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/vectorstore/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,6CAA6C;AAC7C,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAQD;;;;;;GAMG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,iBAAiB,CAAuB;IAEhD;;;OAGG;gBACS,MAAM,CAAC,EAAE,MAAM;IAI3B;;;OAGG;IACH,OAAO,CAAC,IAAI;IAiDZ,gDAAgD;IAChD,OAAO,CAAC,gBAAgB;IAcxB,+EAA+E;IAC/E,OAAO,CAAC,cAAc;IA0BtB,uCAAuC;IACvC,OAAO,CAAC,YAAY;IAYpB,qCAAqC;IACrC,OAAO,CAAC,YAAY;IASpB,2FAA2F;IAC3F,OAAO,CAAC,UAAU;IAQlB,+DAA+D;IAC/D,OAAO,CAAC,mBAAmB;IAsB3B;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI;IA+DpC;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,UAAU,GAAE,MAAW,GAAG,kBAAkB,EAAE;IAI5E;;;;;;;OAOG;IACH,cAAc,CACZ,WAAW,EAAE,MAAM,EAAE,EACrB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,UAAU,GAAE,MAAW,GACtB,kBAAkB,EAAE;IAIvB,kEAAkE;IAClE,OAAO,CAAC,cAAc;IA6EtB;;;;OAIG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IA+BtC;;;;;OAKG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAmBxC;;;;OAIG;IACH,kBAAkB,IAAI,MAAM,GAAG,IAAI;IASnC;;;;;;;;OAQG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAoB9D;;;OAGG;IACH,IAAI,IAAI,IAAI;IAoBZ;;;;OAIG;IACH,KAAK,IAAI,gBAAgB;IAuDzB,2DAA2D;IAC3D,KAAK,IAAI,IAAI;CAWd"}