@devflow-tools/knowledge-engine 0.14.4 → 0.16.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.
@@ -1,5 +1,7 @@
1
1
  import Database from 'better-sqlite3';
2
2
  import * as sqliteVec from 'sqlite-vec';
3
+ import { dirname } from 'node:path';
4
+ import { existsSync, mkdirSync } from 'node:fs';
3
5
  const KNOWLEDGE_SCHEMA = `
4
6
  CREATE TABLE IF NOT EXISTS knowledge_docs (
5
7
  id TEXT PRIMARY KEY,
@@ -24,7 +26,8 @@ CREATE TABLE IF NOT EXISTS knowledge_chunks (
24
26
 
25
27
  CREATE VIRTUAL TABLE IF NOT EXISTS knowledge_fts USING fts5(
26
28
  id UNINDEXED, heading_path, content, code_blocks,
27
- content=knowledge_chunks
29
+ content=knowledge_chunks,
30
+ tokenize='trigram'
28
31
  );
29
32
 
30
33
  CREATE VIRTUAL TABLE IF NOT EXISTS knowledge_vec USING vec0(
@@ -38,12 +41,12 @@ CREATE TRIGGER IF NOT EXISTS kchunks_ai AFTER INSERT ON knowledge_chunks BEGIN
38
41
  VALUES (new.rowid, new.id, new.heading_path, new.content, new.code_blocks);
39
42
  END;
40
43
  CREATE TRIGGER IF NOT EXISTS kchunks_ad AFTER DELETE ON knowledge_chunks BEGIN
41
- INSERT INTO knowledge_fts(knowledge_fts, id, heading_path, content, code_blocks)
42
- VALUES('delete', old.id, old.heading_path, old.content, old.code_blocks);
44
+ INSERT INTO knowledge_fts(knowledge_fts, rowid, id, heading_path, content, code_blocks)
45
+ VALUES('delete', old.rowid, old.id, old.heading_path, old.content, old.code_blocks);
43
46
  END;
44
47
  CREATE TRIGGER IF NOT EXISTS kchunks_au AFTER UPDATE ON knowledge_chunks BEGIN
45
- INSERT INTO knowledge_fts(knowledge_fts, id, heading_path, content, code_blocks)
46
- VALUES('delete', old.id, old.heading_path, old.content, old.code_blocks);
48
+ INSERT INTO knowledge_fts(knowledge_fts, rowid, id, heading_path, content, code_blocks)
49
+ VALUES('delete', old.rowid, old.id, old.heading_path, old.content, old.code_blocks);
47
50
  INSERT INTO knowledge_fts(rowid, id, heading_path, content, code_blocks)
48
51
  VALUES (new.rowid, new.id, new.heading_path, new.content, new.code_blocks);
49
52
  END;
@@ -51,13 +54,37 @@ END;
51
54
  export class KnowledgeStore {
52
55
  db;
53
56
  constructor(dbPath) {
57
+ const dir = dirname(dbPath);
58
+ if (!existsSync(dir))
59
+ mkdirSync(dir, { recursive: true });
54
60
  this.db = new Database(dbPath);
55
61
  this.db.pragma('journal_mode = WAL');
62
+ this.db.pragma('busy_timeout = 5000');
56
63
  this.db.pragma('foreign_keys = ON');
57
64
  sqliteVec.load(this.db);
58
65
  this.db.exec(KNOWLEDGE_SCHEMA);
66
+ this.ensureTrigramFts();
59
67
  this.db.exec(FTS_TRIGGERS);
60
68
  }
69
+ ensureTrigramFts() {
70
+ const row = this.db.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'knowledge_fts'").get();
71
+ if (/tokenize\s*=\s*['\"]?trigram/i.test(row?.sql ?? ''))
72
+ return;
73
+ this.db.transaction(() => {
74
+ this.db.exec(`
75
+ DROP TRIGGER IF EXISTS kchunks_ai;
76
+ DROP TRIGGER IF EXISTS kchunks_ad;
77
+ DROP TRIGGER IF EXISTS kchunks_au;
78
+ DROP TABLE IF EXISTS knowledge_fts;
79
+ CREATE VIRTUAL TABLE knowledge_fts USING fts5(
80
+ id UNINDEXED, heading_path, content, code_blocks,
81
+ content=knowledge_chunks,
82
+ tokenize='trigram'
83
+ );
84
+ INSERT INTO knowledge_fts(knowledge_fts) VALUES('rebuild');
85
+ `);
86
+ })();
87
+ }
61
88
  upsertDoc(doc) {
62
89
  const existing = this.db.prepare('SELECT id FROM knowledge_docs WHERE id = ?').get(doc.id);
63
90
  if (existing) {
@@ -74,9 +101,54 @@ export class KnowledgeStore {
74
101
  this.db.prepare('INSERT INTO knowledge_chunks (id, doc_id, chunk_index, heading_path, content, code_blocks, token_count) VALUES (?,?,?,?,?,?,?)').run(chunk.id, chunk.docId, chunk.index, chunk.headingPath, chunk.content, chunk.codeBlocks ?? null, chunk.tokenCount ?? null);
75
102
  }
76
103
  insertEmbedding(id, embedding) {
77
- const buffer = Buffer.from(embedding.buffer);
104
+ const buffer = Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength);
78
105
  this.db.prepare('INSERT OR REPLACE INTO knowledge_vec(id, embedding) VALUES (?, ?)').run(id, buffer);
79
106
  }
107
+ insertEmbeddingBatch(entries) {
108
+ if (entries.length === 0)
109
+ return;
110
+ const insert = this.db.prepare('INSERT OR REPLACE INTO knowledge_vec(id, embedding) VALUES (?, ?)');
111
+ this.db.transaction(() => {
112
+ for (const { id, embedding } of entries) {
113
+ insert.run(id, Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength));
114
+ }
115
+ })();
116
+ }
117
+ replaceDocument(input) {
118
+ if (input.chunks.length !== input.embeddings.length) {
119
+ throw new Error(`Knowledge vector count mismatch: ${input.chunks.length} chunks, ${input.embeddings.length} vectors`);
120
+ }
121
+ const oldIds = this.db.prepare('SELECT id FROM knowledge_chunks WHERE doc_id = ?').all(input.doc.id);
122
+ const deleteVector = this.db.prepare('DELETE FROM knowledge_vec WHERE id = ?');
123
+ const insertChunk = this.db.prepare('INSERT INTO knowledge_chunks (id, doc_id, chunk_index, heading_path, content, code_blocks, token_count) VALUES (?,?,?,?,?,?,?)');
124
+ const insertVector = this.db.prepare('INSERT INTO knowledge_vec(id, embedding) VALUES (?, ?)');
125
+ this.db.transaction(() => {
126
+ this.upsertDoc(input.doc);
127
+ for (const { id } of oldIds)
128
+ deleteVector.run(id);
129
+ this.clearChunks(input.doc.id);
130
+ for (let index = 0; index < input.chunks.length; index++) {
131
+ const chunk = input.chunks[index];
132
+ const embedding = input.embeddings[index];
133
+ insertChunk.run(chunk.id, chunk.docId, chunk.index, chunk.headingPath, chunk.content, chunk.codeBlocks ?? null, chunk.tokenCount ?? null);
134
+ insertVector.run(chunk.id, Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength));
135
+ }
136
+ })();
137
+ }
138
+ replaceDocumentChunks(input) {
139
+ const oldIds = this.db.prepare('SELECT id FROM knowledge_chunks WHERE doc_id = ?').all(input.doc.id);
140
+ const deleteVector = this.db.prepare('DELETE FROM knowledge_vec WHERE id = ?');
141
+ const insertChunk = this.db.prepare('INSERT INTO knowledge_chunks (id, doc_id, chunk_index, heading_path, content, code_blocks, token_count) VALUES (?,?,?,?,?,?,?)');
142
+ this.db.transaction(() => {
143
+ this.upsertDoc(input.doc);
144
+ for (const { id } of oldIds)
145
+ deleteVector.run(id);
146
+ this.clearChunks(input.doc.id);
147
+ for (const chunk of input.chunks) {
148
+ insertChunk.run(chunk.id, chunk.docId, chunk.index, chunk.headingPath, chunk.content, chunk.codeBlocks ?? null, chunk.tokenCount ?? null);
149
+ }
150
+ })();
151
+ }
80
152
  searchBM25(query, limit = 20, sources) {
81
153
  if (sources && sources.length > 0) {
82
154
  const placeholders = sources.map(() => '?').join(',');
@@ -96,12 +168,19 @@ export class KnowledgeStore {
96
168
  `).all(query, limit);
97
169
  return rows;
98
170
  }
99
- searchVector(embedding, limit = 20) {
100
- const buffer = Buffer.from(embedding.buffer);
171
+ searchVector(embedding, limit = 20, sources) {
172
+ const buffer = Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength);
173
+ const sourceFilter = sources?.length
174
+ ? `WHERE d.source IN (${sources.map(() => '?').join(',')})`
175
+ : '';
101
176
  const rows = this.db.prepare(`
102
177
  SELECT v.id, vec_distance_cosine(v.embedding, ?) as distance
103
- FROM knowledge_vec v ORDER BY distance LIMIT ?
104
- `).all(buffer, limit);
178
+ FROM knowledge_vec v
179
+ JOIN knowledge_chunks c ON c.id = v.id
180
+ JOIN knowledge_docs d ON d.id = c.doc_id
181
+ ${sourceFilter}
182
+ ORDER BY distance LIMIT ?
183
+ `).all(buffer, ...(sources ?? []), limit);
105
184
  return rows;
106
185
  }
107
186
  getChunk(id) {
@@ -114,6 +193,86 @@ export class KnowledgeStore {
114
193
  WHERE kd.source = ? ORDER BY kc.chunk_index LIMIT ?
115
194
  `).all(source, limit);
116
195
  }
196
+ listChunks(options = {}) {
197
+ const conditions = [];
198
+ const params = [];
199
+ if (options.sources?.length) {
200
+ conditions.push(`d.source IN (${options.sources.map(() => '?').join(',')})`);
201
+ params.push(...options.sources);
202
+ }
203
+ if (options.afterId) {
204
+ conditions.push('c.id > ?');
205
+ params.push(options.afterId);
206
+ }
207
+ const where = conditions.length ? `WHERE ${conditions.join(' AND ')}` : '';
208
+ const limit = options.limit ?? 100_000;
209
+ return this.db.prepare(`
210
+ SELECT c.*, d.source, d.url, d.version
211
+ FROM knowledge_chunks c
212
+ JOIN knowledge_docs d ON d.id = c.doc_id
213
+ ${where}
214
+ ORDER BY c.id
215
+ LIMIT ?
216
+ `).all(...params, limit);
217
+ }
218
+ listMissingEmbeddingChunks(options = {}) {
219
+ const conditions = ['v.id IS NULL'];
220
+ const params = [];
221
+ if (options.source) {
222
+ conditions.push('d.source = ?');
223
+ params.push(options.source);
224
+ }
225
+ if (options.afterId) {
226
+ conditions.push('c.id > ?');
227
+ params.push(options.afterId);
228
+ }
229
+ return this.db.prepare(`
230
+ SELECT c.*, d.source, d.url, d.version
231
+ FROM knowledge_chunks c
232
+ JOIN knowledge_docs d ON d.id = c.doc_id
233
+ LEFT JOIN knowledge_vec v ON v.id = c.id
234
+ WHERE ${conditions.join(' AND ')}
235
+ ORDER BY c.id
236
+ LIMIT ?
237
+ `).all(...params, options.limit ?? 32);
238
+ }
239
+ countChunks(source) {
240
+ const row = source
241
+ ? this.db.prepare(`
242
+ SELECT COUNT(*) AS c FROM knowledge_chunks c
243
+ JOIN knowledge_docs d ON d.id = c.doc_id WHERE d.source = ?
244
+ `).get(source)
245
+ : this.db.prepare('SELECT COUNT(*) AS c FROM knowledge_chunks').get();
246
+ return row.c;
247
+ }
248
+ countEmbeddings(source) {
249
+ const row = source
250
+ ? this.db.prepare(`
251
+ SELECT COUNT(*) AS c FROM knowledge_vec v
252
+ JOIN knowledge_chunks c ON c.id = v.id
253
+ JOIN knowledge_docs d ON d.id = c.doc_id WHERE d.source = ?
254
+ `).get(source)
255
+ : this.db.prepare('SELECT COUNT(*) AS c FROM knowledge_vec').get();
256
+ return row.c;
257
+ }
258
+ getCoverageBySource() {
259
+ const rows = this.db.prepare(`
260
+ SELECT d.source, COUNT(c.id) AS chunks, COUNT(v.id) AS vectors
261
+ FROM knowledge_docs d
262
+ LEFT JOIN knowledge_chunks c ON c.doc_id = d.id
263
+ LEFT JOIN knowledge_vec v ON v.id = c.id
264
+ GROUP BY d.source ORDER BY d.source
265
+ `).all();
266
+ return rows;
267
+ }
268
+ getDistinctSources() {
269
+ const rows = this.db.prepare(`
270
+ SELECT DISTINCT source FROM knowledge_docs
271
+ WHERE status = 'active'
272
+ ORDER BY source
273
+ `).all();
274
+ return rows.map(row => row.source);
275
+ }
117
276
  close() { this.db.close(); }
118
277
  }
119
278
  //# sourceMappingURL=knowledge-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-store.js","sourceRoot":"","sources":["../src/knowledge-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knowledge-store.js","sourceRoot":"","sources":["../src/knowledge-store.ts"],"names":[],"mappings":"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"}
@@ -5,5 +5,11 @@ export interface Chunk {
5
5
  headingPath?: string;
6
6
  codeBlocks?: string;
7
7
  }
8
- export declare function sliceByHeadings(markdown: string): Chunk[];
8
+ export declare const MIN_CHUNK_CHARS = 500;
9
+ export declare const MAX_CHUNK_CHARS = 3000;
10
+ export declare function extractCodeBlocks(text: string): string;
11
+ export declare function sliceByHeadings(markdown: string, options?: {
12
+ minChars?: number;
13
+ maxChars?: number;
14
+ }): Chunk[];
9
15
  //# sourceMappingURL=markdown-converter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-converter.d.ts","sourceRoot":"","sources":["../src/markdown-converter.ts"],"names":[],"mappings":"AAUA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAiCD,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,CA4CzD"}
1
+ {"version":3,"file":"markdown-converter.d.ts","sourceRoot":"","sources":["../src/markdown-converter.ts"],"names":[],"mappings":"AAUA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAmDD,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,eAAe,MAAM,CAAC;AACnC,eAAO,MAAM,eAAe,OAAO,CAAC;AAUpC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBtD;AA0LD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,KAAK,EAAE,CAkBT"}
@@ -26,65 +26,282 @@ function filterNoise(md) {
26
26
  /^made with/i,
27
27
  /^built with/i,
28
28
  /^powered by/i,
29
+ /^menu\s*$/i,
30
+ /^roadmap$/i,
31
+ /^sidebar$/i,
32
+ /^(api|guides?|reference|tutorial|examples?|blog|docs?|community|changelog)\s*$/i,
29
33
  ];
30
34
  return lines
31
35
  .filter(line => {
32
36
  const trimmed = line.trim();
33
37
  if (!trimmed)
34
- return true; // keep blank lines
38
+ return true;
35
39
  for (const p of noisePatterns) {
36
40
  if (p.test(trimmed))
37
41
  return false;
38
42
  }
43
+ // Drop lines where >60% of non-space chars are inside markdown links
44
+ if (isLinkDense(trimmed))
45
+ return false;
39
46
  return true;
40
47
  })
41
48
  .join('\n');
42
49
  }
43
- function extractCodeBlocks(text) {
44
- const codeMatches = text.match(/```[\s\S]*?```/g);
45
- return codeMatches ? codeMatches.join('\n') : '';
50
+ function isLinkDense(line) {
51
+ const stripped = line.replace(/!\[.*\]\(.*\)/g, '');
52
+ const linkMatches = stripped.match(/\[([^\]]*)\]\([^)]*\)/g);
53
+ if (!linkMatches || linkMatches.length < 3)
54
+ return false;
55
+ const linkTextLen = linkMatches.reduce((sum, m) => {
56
+ const inner = m.match(/\[([^\]]*)\]/);
57
+ return sum + (inner ? inner[1].length : 0);
58
+ }, 0);
59
+ const totalChars = stripped.replace(/\s/g, '').length;
60
+ return totalChars > 0 && linkTextLen / totalChars > 0.6;
46
61
  }
47
- export function sliceByHeadings(markdown) {
48
- const trimmed = markdown.trim();
49
- if (trimmed.length === 0)
50
- return [];
51
- const lines = trimmed.split('\n');
52
- const chunks = [];
53
- let currentTitle = '';
54
- let currentContent = [];
62
+ export const MIN_CHUNK_CHARS = 500;
63
+ export const MAX_CHUNK_CHARS = 3000;
64
+ function fenceDelimiter(line) {
65
+ return line.match(/^\s{0,3}(`{3,}|~{3,})/)?.[1];
66
+ }
67
+ function closesFence(delimiter, opening) {
68
+ return delimiter[0] === opening[0] && delimiter.length >= opening.length;
69
+ }
70
+ export function extractCodeBlocks(text) {
71
+ const blocks = [];
72
+ let opening;
73
+ let current = [];
74
+ for (const line of text.split('\n')) {
75
+ const delimiter = fenceDelimiter(line);
76
+ if (!opening && delimiter) {
77
+ opening = delimiter;
78
+ current = [line];
79
+ continue;
80
+ }
81
+ if (!opening)
82
+ continue;
83
+ current.push(line);
84
+ if (delimiter && closesFence(delimiter, opening)) {
85
+ blocks.push(current.join('\n'));
86
+ opening = undefined;
87
+ current = [];
88
+ }
89
+ }
90
+ return blocks.join('\n');
91
+ }
92
+ function splitSections(markdown) {
93
+ const sections = [];
94
+ const lines = markdown.split('\n');
95
+ let title = 'Overview';
55
96
  let headingStack = [];
97
+ let content = [];
98
+ let openingFence;
99
+ const finalize = () => {
100
+ const value = content.join('\n').trim();
101
+ if (value) {
102
+ sections.push({ title, headingPath: headingStack.join(' > '), content: value });
103
+ }
104
+ };
56
105
  for (const line of lines) {
57
- const hMatch = line.match(/^(#{1,4})\s+(.+)/);
58
- if (hMatch) {
59
- if (currentContent.length > 0) {
60
- const content = currentContent.join('\n').trim();
61
- chunks.push({
62
- title: currentTitle || 'Overview',
63
- content,
64
- headingPath: headingStack.join(' > '),
65
- codeBlocks: extractCodeBlocks(content),
66
- });
67
- }
68
- const level = hMatch[1].length;
69
- const title = hMatch[2].replace(/\[.*\]\(.*\)/g, '').trim();
70
- headingStack = headingStack.slice(0, level - 1);
71
- headingStack.push(title);
72
- currentTitle = title;
73
- currentContent = [line];
106
+ const delimiter = fenceDelimiter(line);
107
+ if (delimiter) {
108
+ if (!openingFence)
109
+ openingFence = delimiter;
110
+ else if (closesFence(delimiter, openingFence))
111
+ openingFence = undefined;
112
+ content.push(line);
113
+ continue;
74
114
  }
75
- else {
76
- currentContent.push(line);
115
+ const heading = !openingFence ? line.match(/^(#{1,6})\s+(.+)/) : null;
116
+ if (!heading) {
117
+ content.push(line);
118
+ continue;
119
+ }
120
+ finalize();
121
+ const level = heading[1].length;
122
+ title = heading[2].replace(/\[([^\]]+)\]\([^)]*\)/g, '$1').trim();
123
+ headingStack = headingStack.slice(0, level - 1);
124
+ headingStack.push(title);
125
+ content = [line];
126
+ }
127
+ finalize();
128
+ return sections;
129
+ }
130
+ function splitText(text, maxChars) {
131
+ const parts = [];
132
+ let remaining = text.trim();
133
+ while (remaining.length > maxChars) {
134
+ const window = remaining.slice(0, maxChars + 1);
135
+ const candidates = [
136
+ window.lastIndexOf('\n\n') + 2,
137
+ window.lastIndexOf('\n') + 1,
138
+ window.lastIndexOf('. ') + 1,
139
+ window.lastIndexOf(' '),
140
+ ];
141
+ const splitAt = candidates.find(index => index >= Math.floor(maxChars * 0.6)) ?? maxChars;
142
+ parts.push(remaining.slice(0, splitAt).trim());
143
+ remaining = remaining.slice(splitAt).trim();
144
+ }
145
+ if (remaining)
146
+ parts.push(remaining);
147
+ return parts;
148
+ }
149
+ function markdownBlocks(content, maxChars) {
150
+ const blocks = [];
151
+ const lines = content.split('\n');
152
+ let current = [];
153
+ let openingFence;
154
+ const flushText = () => {
155
+ const text = current.join('\n').trim();
156
+ current = [];
157
+ if (!text)
158
+ return;
159
+ for (const part of splitText(text, maxChars))
160
+ blocks.push({ content: part, atomic: false });
161
+ };
162
+ for (const line of lines) {
163
+ const delimiter = fenceDelimiter(line);
164
+ if (delimiter && !openingFence) {
165
+ flushText();
166
+ openingFence = delimiter;
167
+ current = [line];
168
+ continue;
77
169
  }
170
+ if (openingFence) {
171
+ current.push(line);
172
+ if (delimiter && closesFence(delimiter, openingFence)) {
173
+ const code = current.join('\n').trim();
174
+ blocks.push({ content: code, atomic: true });
175
+ current = [];
176
+ openingFence = undefined;
177
+ }
178
+ continue;
179
+ }
180
+ if (line.trim().length === 0)
181
+ flushText();
182
+ else
183
+ current.push(line);
78
184
  }
79
- if (currentContent.length > 0) {
80
- const content = currentContent.join('\n').trim();
81
- chunks.push({
82
- title: currentTitle || 'Overview',
185
+ flushText();
186
+ return blocks;
187
+ }
188
+ function splitSection(section, minChars, maxChars) {
189
+ const fragments = [];
190
+ let blocks = [];
191
+ let length = 0;
192
+ const flush = () => {
193
+ const content = blocks.join('\n\n').trim();
194
+ blocks = [];
195
+ length = 0;
196
+ if (!content)
197
+ return;
198
+ fragments.push({
199
+ title: section.title,
200
+ headingPath: section.headingPath,
83
201
  content,
84
- headingPath: headingStack.join(' > '),
85
202
  codeBlocks: extractCodeBlocks(content),
86
203
  });
204
+ };
205
+ for (const block of markdownBlocks(section.content, maxChars)) {
206
+ const separator = blocks.length > 0 ? 2 : 0;
207
+ if (blocks.length > 0 && length + separator + block.content.length > maxChars) {
208
+ if (block.atomic && length < minChars) {
209
+ blocks.push(block.content);
210
+ length += separator + block.content.length;
211
+ flush();
212
+ continue;
213
+ }
214
+ flush();
215
+ }
216
+ blocks.push(block.content);
217
+ length += (blocks.length > 1 ? 2 : 0) + block.content.length;
218
+ if (block.atomic && block.content.length > maxChars)
219
+ flush();
220
+ }
221
+ flush();
222
+ return fragments;
223
+ }
224
+ function mergeFragments(left, right) {
225
+ const leftPath = left.headingPath.split(' > ').filter(Boolean);
226
+ const rightPath = right.headingPath.split(' > ').filter(Boolean);
227
+ const commonPath = [];
228
+ for (let index = 0; index < Math.min(leftPath.length, rightPath.length); index++) {
229
+ if (leftPath[index] !== rightPath[index])
230
+ break;
231
+ commonPath.push(leftPath[index]);
232
+ }
233
+ const content = `${left.content}\n\n${right.content}`;
234
+ return {
235
+ title: left.title === right.title ? left.title : `${left.title} / ${right.title}`.slice(0, 120),
236
+ headingPath: commonPath.join(' > '),
237
+ content,
238
+ codeBlocks: extractCodeBlocks(content),
239
+ };
240
+ }
241
+ function coalesceShortFragments(fragments, minChars, maxChars) {
242
+ const chunks = [];
243
+ for (const fragment of fragments) {
244
+ const previous = chunks.at(-1);
245
+ if (previous
246
+ && (previous.content.length < minChars || fragment.content.length < minChars)
247
+ && previous.content.length + 2 + fragment.content.length <= maxChars) {
248
+ chunks[chunks.length - 1] = mergeFragments(previous, fragment);
249
+ }
250
+ else {
251
+ chunks.push(fragment);
252
+ }
87
253
  }
88
254
  return chunks;
89
255
  }
256
+ export function sliceByHeadings(markdown, options = {}) {
257
+ const trimmed = markdown.trim();
258
+ if (trimmed.length === 0)
259
+ return [];
260
+ const minChars = Math.max(1, options.minChars ?? MIN_CHUNK_CHARS);
261
+ const maxChars = Math.max(minChars, options.maxChars ?? MAX_CHUNK_CHARS);
262
+ const sections = splitSections(trimmed);
263
+ const hasNestedHeading = sections.some(section => section.headingPath.includes(' > '));
264
+ const fragments = sections
265
+ .filter((section, index) => {
266
+ if (!hasNestedHeading || index !== 0 || section.headingPath.includes(' > '))
267
+ return true;
268
+ const cleaned = section.content.replace(/^#{1,6}\s+.*$/gm, '').replace(/\s+/g, ' ').trim();
269
+ return cleaned.length >= 30;
270
+ })
271
+ .flatMap(section => splitSection(section, minChars, maxChars));
272
+ const chunks = trimmed.length >= minChars
273
+ ? coalesceShortFragments(fragments, minChars, maxChars)
274
+ : fragments;
275
+ return chunks.filter(chunk => isQualityChunk(chunk));
276
+ }
277
+ const NAV_TITLES = new Set([
278
+ 'overview', 'introduction', 'getting started', 'quick start',
279
+ 'api reference', 'api', 'reference', 'guides', 'tutorial',
280
+ 'examples', 'blog', 'docs', 'community', 'changelog',
281
+ 'roadmap', 'sidebar', 'menu', 'navigation',
282
+ ]);
283
+ function isQualityChunk(chunk) {
284
+ // Discard chunks with trivial navigation titles that have very little content
285
+ const cleanedContent = chunk.content
286
+ .replace(/^#{1,4}\s+.*$/gm, '')
287
+ .replace(/\[([^\]]*)\]\([^)]*\)/g, '$1')
288
+ .replace(/[`*_~#>|\[\]!-]/g, '')
289
+ .replace(/\s+/g, ' ')
290
+ .trim();
291
+ if (cleanedContent.length < 10)
292
+ return false;
293
+ const lowerTitle = chunk.title.toLowerCase().trim();
294
+ if (NAV_TITLES.has(lowerTitle) && cleanedContent.length < 120)
295
+ return false;
296
+ // Discard chunks that are mostly links after stripping headings
297
+ const linkChars = (chunk.content.match(/\[([^\]]*)\]\([^)]*\)/g) || [])
298
+ .reduce((sum, m) => {
299
+ const inner = m.match(/\[([^\]]*)\]/);
300
+ return sum + (inner ? inner[1].length : 0);
301
+ }, 0);
302
+ const totalChars = chunk.content.replace(/\s/g, '').length;
303
+ if (totalChars > 0 && linkChars / totalChars > 0.5)
304
+ return false;
305
+ return true;
306
+ }
90
307
  //# sourceMappingURL=markdown-converter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-converter.js","sourceRoot":"","sources":["../src/markdown-converter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown-converter.js","sourceRoot":"","sources":["../src/markdown-converter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/knowledge-engine",
3
- "version": "0.14.4",
3
+ "version": "0.16.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -18,9 +18,9 @@
18
18
  "postinstall": "playwright install chromium || true"
19
19
  },
20
20
  "dependencies": {
21
- "@devflow-tools/context-engine": "^0.14.4",
22
- "@devflow-tools/memory-engine": "^0.14.4",
23
- "@devflow-tools/sdk": "^0.14.4",
21
+ "@devflow-tools/context-engine": "0.16.0",
22
+ "@devflow-tools/memory-engine": "0.16.0",
23
+ "@devflow-tools/sdk": "0.16.0",
24
24
  "playwright": "^1.52.0",
25
25
  "turndown": "^7.2.4"
26
26
  },
@@ -32,5 +32,5 @@
32
32
  "files": [
33
33
  "dist"
34
34
  ],
35
- "gitHead": "54c8815398c8f60461caee19802afa3827ea3100"
35
+ "gitHead": "2f52776bda72517354d44453756cccb9e8de9afa"
36
36
  }