@devflow-tools/knowledge-engine 0.8.10 → 0.9.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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @devflow-tools/knowledge-engine
2
2
 
3
- Knowledge engine for DevFlow — search and sync technical documentation from official sources.
3
+ DevFlow 知识引擎 — 从技术文档站同步内容,BM25 搜索,支持 SPA 页面和静态 HTML。
4
4
 
5
5
  ## Installation
6
6
 
@@ -15,25 +15,57 @@ import { KnowledgeEngine } from '@devflow-tools/knowledge-engine';
15
15
 
16
16
  const engine = new KnowledgeEngine({ projectRoot: '/path/to/project' });
17
17
 
18
- // Search knowledge base
19
- const results = await engine.search('React useEffect cleanup');
18
+ // 注册知识源
19
+ await engine.registerSource({
20
+ name: 'react',
21
+ urls: ['https://react.dev/reference'],
22
+ pluginName: 'react',
23
+ version: '19.0.0',
24
+ renderJs: true, // SPA 页面需要 Playwright 渲染
25
+ });
20
26
 
21
- // Sync docs from sources
22
- await engine.syncDocs('react');
27
+ // 同步文档
28
+ const results = await engine.syncDocs('react');
29
+
30
+ // 搜索知识库
31
+ const entries = await engine.search('useEffect cleanup');
23
32
  ```
24
33
 
25
34
  ## Features
26
35
 
27
- - **Documentation search** — BM25-based keyword search across synced docs
28
- - **Multi-source sync** — pull docs from GitHub, official sites
29
- - **Markdown conversion** — HTML to Markdown with heading-preserving chunking
36
+ - **智能抓取** — 自动检测页面内容量:静态内容充足则用 HTTP fetch,SPA 页面自动升级到 Playwright 浏览器渲染
37
+ - **`renderJs` 标记** — 在 `KnowledgeSource` 中设置 `renderJs: true` 直达 Playwright 模式,跳过自动检测
38
+ - **BM25 搜索** — 基于关键词的文档搜索,支持 scope 过滤(react/vue/nest 等)
39
+ - **HTML → Markdown** — 使用 turndown 转换,标题级 chunk 分块保留文档结构
40
+ - **多源同步** — 从官方文档、GitHub 等 URL 列表批量抓取和更新
41
+
42
+ ## Fetcher API
43
+
44
+ | 函数 | 说明 |
45
+ |------|------|
46
+ | `fetchHtml(url)` | HTTP fetch + 重试(最多 2 次),支持 429 限流处理 |
47
+ | `fetchHtmlBrowser(url)` | Playwright Chromium 浏览器渲染(用于 SPA 页面) |
48
+ | `fetchHtmlSmart(url)` | 智能模式:先 fetch → 内容 < 500 字符 → 自动升级到浏览器 |
49
+ | `closeBrowser()` | 关闭 Playwright 浏览器实例,释放资源 |
50
+
51
+ ## Engine API
52
+
53
+ - `new KnowledgeEngine({ projectRoot })` — 构造函数
54
+ - `.registerSource(source)` — 注册/合并知识源(已存在则合并 URL 列表)
55
+ - `.syncDocs(pluginName?)` — 同步指定(或全部)知识源的文档
56
+ - `.search(query, options?)` — BM25 搜索知识库,支持 `scope` 过滤
57
+ - `.lookup(symbol, scope?)` — 精确匹配知识条目
58
+ - `.getSources()` — 列出所有知识源及其状态(chunk 数、最后同步时间)
30
59
 
31
- ## API
60
+ ## Environment
61
+
62
+ 需要安装 Playwright Chromium:
63
+
64
+ ```bash
65
+ npx playwright install chromium
66
+ ```
32
67
 
33
- - `KnowledgeEngine` — main class
34
- - `.search(query)` — search knowledge base
35
- - `.syncDocs(pluginName?)` — sync documentation for a plugin
36
- - `.getSources()` — list available knowledge sources
68
+ 或是使用 `postinstall` 脚本(已在 package.json 中配置)。
37
69
 
38
70
  ## License
39
71
 
@@ -0,0 +1,25 @@
1
+ import type { KnowledgeVectorStore } from './vector-store.js';
2
+ interface ChunkDoc {
3
+ id: string;
4
+ title: string;
5
+ content: string;
6
+ }
7
+ export interface SearchResult {
8
+ id: string;
9
+ title: string;
10
+ content: string;
11
+ score: number;
12
+ }
13
+ export declare class KnowledgeHybridSearch {
14
+ private vectorStore;
15
+ private embedder;
16
+ private embedderReady;
17
+ constructor(vectorStore: KnowledgeVectorStore);
18
+ initialize(): Promise<void>;
19
+ search(query: string, chunks: ChunkDoc[], bm25Results: Array<{
20
+ id: string;
21
+ score: number;
22
+ }>, limit: number): Promise<SearchResult[]>;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=hybrid-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-search.d.ts","sourceRoot":"","sources":["../src/hybrid-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AA2BD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAmE;IACnF,OAAO,CAAC,aAAa,CAAS;gBAElB,WAAW,EAAE,oBAAoB;IAIvC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,MAAM,CACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,QAAQ,EAAE,EAClB,WAAW,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EACjD,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,EAAE,CAAC;CAgC3B"}
@@ -0,0 +1,78 @@
1
+ const RRF_K = 60;
2
+ function rrfFusion(bm25Scores, vectorScores) {
3
+ const fused = new Map();
4
+ const allIds = new Set([...bm25Scores.keys(), ...vectorScores.keys()]);
5
+ const bm25Weight = bm25Scores.size > 0 ? 0.4 : 0;
6
+ const vectorWeight = vectorScores.size > 0 ? 0.6 : 0;
7
+ const totalWeight = bm25Weight + vectorWeight;
8
+ for (const id of allIds) {
9
+ let score = 0;
10
+ const bm25Score = bm25Scores.get(id);
11
+ const vecScore = vectorScores.get(id);
12
+ if (bm25Score !== undefined)
13
+ score += bm25Weight * (1 / (RRF_K + bm25Score));
14
+ if (vecScore !== undefined)
15
+ score += vectorWeight * (1 / (RRF_K + vecScore));
16
+ if (totalWeight > 0)
17
+ score /= totalWeight;
18
+ fused.set(id, score);
19
+ }
20
+ return fused;
21
+ }
22
+ export class KnowledgeHybridSearch {
23
+ vectorStore;
24
+ embedder = null;
25
+ embedderReady = false;
26
+ constructor(vectorStore) {
27
+ this.vectorStore = vectorStore;
28
+ }
29
+ async initialize() {
30
+ if (this.embedderReady)
31
+ return;
32
+ try {
33
+ const { pipeline } = await import('@xenova/transformers');
34
+ const pipe = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
35
+ this.embedder = {
36
+ embed: async (text) => {
37
+ const result = await pipe(text, { pooling: 'mean', normalize: true });
38
+ return (Array.isArray(result) ? result[0] : result).data;
39
+ },
40
+ };
41
+ this.embedderReady = true;
42
+ }
43
+ catch {
44
+ // Embedding unavailable — hybrid search degrades to BM25-only
45
+ }
46
+ }
47
+ async search(query, chunks, bm25Results, limit) {
48
+ const bm25Scores = new Map(bm25Results.map((r, i) => [r.id, i + 1]));
49
+ // Vector search
50
+ const vectorScores = new Map();
51
+ if (this.embedderReady && this.embedder && this.vectorStore.count() > 0) {
52
+ try {
53
+ const embedding = await this.embedder.embed(query);
54
+ const vecResults = this.vectorStore.search(embedding, limit * 2);
55
+ vecResults.forEach((r, i) => vectorScores.set(r.chunkId, i + 1));
56
+ }
57
+ catch { /* vector search failed — fall back to BM25 only */ }
58
+ }
59
+ // RRF fusion
60
+ const fused = rrfFusion(bm25Scores, vectorScores);
61
+ // Sort by fused score
62
+ const chunkMap = new Map(chunks.map(c => [c.id, c]));
63
+ return [...fused.entries()]
64
+ .map(([id, score]) => {
65
+ const chunk = chunkMap.get(id);
66
+ return {
67
+ id,
68
+ title: chunk?.title ?? '',
69
+ content: chunk?.content.slice(0, 500) ?? '',
70
+ score: Math.round(score * 10000) / 10000,
71
+ };
72
+ })
73
+ .filter(r => r.content.length > 0)
74
+ .sort((a, b) => b.score - a.score)
75
+ .slice(0, limit);
76
+ }
77
+ }
78
+ //# sourceMappingURL=hybrid-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-search.js","sourceRoot":"","sources":["../src/hybrid-search.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,4 +2,6 @@ export { KnowledgeEngine } from "./knowledge-engine.js";
2
2
  export { fetchHtml, fetchHtmlBrowser, fetchHtmlSmart, closeBrowser } from "./fetcher.js";
3
3
  export { htmlToMarkdown, sliceByHeadings } from "./markdown-converter.js";
4
4
  export { bm25Search } from "./bm25.js";
5
+ export { KnowledgeVectorStore } from "./vector-store.js";
6
+ export { KnowledgeHybridSearch } from "./hybrid-search.js";
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -2,4 +2,6 @@ export { KnowledgeEngine } from "./knowledge-engine.js";
2
2
  export { fetchHtml, fetchHtmlBrowser, fetchHtmlSmart, closeBrowser } from "./fetcher.js";
3
3
  export { htmlToMarkdown, sliceByHeadings } from "./markdown-converter.js";
4
4
  export { bm25Search } from "./bm25.js";
5
+ export { KnowledgeVectorStore } from "./vector-store.js";
6
+ export { KnowledgeHybridSearch } from "./hybrid-search.js";
5
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,6 +1,9 @@
1
1
  import type { KnowledgeEntry, KnowledgeSource, SearchOptions, SyncResult, KnowledgeSourceStatus } from "@devflow-tools/sdk";
2
2
  export declare class KnowledgeEngine {
3
3
  private projectRoot;
4
+ private vectorStore;
5
+ private hybridSearch;
6
+ private store;
4
7
  constructor(opts: {
5
8
  projectRoot: string;
6
9
  });
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-engine.d.ts","sourceRoot":"","sources":["../src/knowledge-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AA0B5H,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IAIzC,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,CAAC,SAAS;IAIX,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BtD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA8EpD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAsEzE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAOtE,UAAU,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;CAiCrD"}
1
+ {"version":3,"file":"knowledge-engine.d.ts","sourceRoot":"","sources":["../src/knowledge-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AA8B5H,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,KAAK,CAAiB;gBAElB,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE;IAQzC,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,CAAC,SAAS;IAIX,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BtD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAmGpD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA8FzE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAOtE,UAAU,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;CAiCrD"}
@@ -1,12 +1,23 @@
1
1
  import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "fs";
2
2
  import { join } from "path";
3
+ import { createHash } from "node:crypto";
3
4
  import { fetchHtmlSmart, fetchHtmlBrowser, closeBrowser } from "./fetcher.js";
4
5
  import { htmlToMarkdown, sliceByHeadings } from "./markdown-converter.js";
5
6
  import { bm25Search } from "./bm25.js";
7
+ import { KnowledgeVectorStore } from "./vector-store.js";
8
+ import { KnowledgeHybridSearch } from "./hybrid-search.js";
9
+ import { KnowledgeStore } from "./knowledge-store.js";
6
10
  export class KnowledgeEngine {
7
11
  projectRoot;
12
+ vectorStore;
13
+ hybridSearch;
14
+ store;
8
15
  constructor(opts) {
9
16
  this.projectRoot = opts.projectRoot;
17
+ this.vectorStore = new KnowledgeVectorStore(join(this.knowledgeDir, 'vectors.db'));
18
+ this.hybridSearch = new KnowledgeHybridSearch(this.vectorStore);
19
+ this.hybridSearch.initialize().catch(() => { });
20
+ this.store = new KnowledgeStore(join(this.knowledgeDir, 'knowledge.db'));
10
21
  }
11
22
  get knowledgeDir() {
12
23
  return join(this.projectRoot, ".devflow", "knowledge");
@@ -87,6 +98,26 @@ export class KnowledgeEngine {
87
98
  for (const cf of chunkFiles) {
88
99
  writeFileSync(join(dir, `${cf.id}.json`), JSON.stringify(cf, null, 2), "utf-8");
89
100
  }
101
+ // Also populate SQLite store
102
+ const docId = `${name}:${new URL(url).pathname}`;
103
+ const contentHash = createHash('sha256').update(markdown).digest('hex');
104
+ this.store.upsertDoc({
105
+ id: docId, source: name, url,
106
+ title: chunks[0]?.title ?? name,
107
+ version: manifest.version,
108
+ contentHash,
109
+ });
110
+ this.store.clearChunks(docId);
111
+ for (const [i, c] of chunks.entries()) {
112
+ const chunkId = `${docId}:chunk-${String(i + 1).padStart(3, '0')}`;
113
+ this.store.insertChunk({
114
+ id: chunkId, docId, index: i,
115
+ headingPath: c.headingPath ?? c.title,
116
+ content: c.content,
117
+ codeBlocks: c.codeBlocks,
118
+ tokenCount: Math.ceil(c.content.length * 0.25),
119
+ });
120
+ }
90
121
  added = chunkFiles.length;
91
122
  writeFileSync(manifestPath, JSON.stringify({
92
123
  urls: manifest.urls,
@@ -111,6 +142,29 @@ export class KnowledgeEngine {
111
142
  const sources = options?.sources;
112
143
  if (!existsSync(this.knowledgeDir))
113
144
  return [];
145
+ // Try SQLite store first
146
+ try {
147
+ const bm25Results = this.store.searchBM25(query, limit * 2);
148
+ if (bm25Results.length > 0) {
149
+ const results = bm25Results.slice(0, limit).map(r => {
150
+ const chunk = this.store.getChunk(r.id);
151
+ return {
152
+ id: r.id,
153
+ source: chunk?.doc_id?.split(':')[0] ?? '',
154
+ title: chunk?.heading_path ?? '',
155
+ content: (chunk?.content ?? '').slice(0, 500),
156
+ url: '',
157
+ embedding: [],
158
+ };
159
+ });
160
+ if (results.length > 0)
161
+ return results;
162
+ }
163
+ }
164
+ catch {
165
+ // SQLite search failed, fall through to JSON fallback
166
+ }
167
+ // JSON file fallback
114
168
  const allChunks = [];
115
169
  const pluginDirs = sources ?? readdirSync(this.knowledgeDir, { withFileTypes: true })
116
170
  .filter(d => d.isDirectory())
@@ -119,7 +173,6 @@ export class KnowledgeEngine {
119
173
  const dir = this.pluginDir(pluginName);
120
174
  if (!existsSync(dir))
121
175
  continue;
122
- // Read version from manifest
123
176
  let version;
124
177
  const manifestPath = join(dir, "manifest.json");
125
178
  if (existsSync(manifestPath)) {
@@ -158,7 +211,9 @@ export class KnowledgeEngine {
158
211
  embedding: [],
159
212
  }));
160
213
  }
161
- return bm25Search(query, allChunks, limit).map(r => ({
214
+ const bm25Results = bm25Search(query, allChunks, limit * 3);
215
+ const hybridResults = await this.hybridSearch.search(query, allChunks, bm25Results, limit);
216
+ return hybridResults.map(r => ({
162
217
  id: r.id,
163
218
  source: allChunks.find(c => c.id === r.id)?.pluginName ?? "",
164
219
  title: r.title,
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-engine.js","sourceRoot":"","sources":["../src/knowledge-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knowledge-engine.js","sourceRoot":"","sources":["../src/knowledge-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export declare class KnowledgeStore {
2
+ private db;
3
+ constructor(dbPath: string);
4
+ upsertDoc(doc: {
5
+ id: string;
6
+ source: string;
7
+ url: string;
8
+ title?: string;
9
+ version?: string;
10
+ contentHash?: string;
11
+ }): void;
12
+ clearChunks(docId: string): void;
13
+ insertChunk(chunk: {
14
+ id: string;
15
+ docId: string;
16
+ index: number;
17
+ headingPath: string;
18
+ content: string;
19
+ codeBlocks?: string;
20
+ tokenCount?: number;
21
+ }): void;
22
+ insertEmbedding(id: string, embedding: Float32Array): void;
23
+ searchBM25(query: string, limit?: number): Array<{
24
+ id: string;
25
+ rank: number;
26
+ }>;
27
+ searchVector(embedding: Float32Array, limit?: number): Array<{
28
+ id: string;
29
+ distance: number;
30
+ }>;
31
+ getChunk(id: string): any;
32
+ getDocChunks(source: string, limit?: number): any[];
33
+ close(): void;
34
+ }
35
+ //# sourceMappingURL=knowledge-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-store.d.ts","sourceRoot":"","sources":["../src/knowledge-store.ts"],"names":[],"mappings":"AAsDA,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,EAAE,MAAM;IAS1B,SAAS,CAAC,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAalH,WAAW,CAAC,KAAK,EAAE,MAAM;IAIzB,WAAW,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAM/I,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY;IAKnD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAS1E,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,SAAK,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAS1F,QAAQ,CAAC,EAAE,EAAE,MAAM,GACgE,GAAG;IAGtF,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,GAAG,EAAE;IAQhD,KAAK;CACN"}
@@ -0,0 +1,108 @@
1
+ import Database from 'better-sqlite3';
2
+ import * as sqliteVec from 'sqlite-vec';
3
+ const KNOWLEDGE_SCHEMA = `
4
+ CREATE TABLE IF NOT EXISTS knowledge_docs (
5
+ id TEXT PRIMARY KEY,
6
+ source TEXT NOT NULL,
7
+ url TEXT NOT NULL,
8
+ title TEXT,
9
+ version TEXT,
10
+ fetched_at INTEGER,
11
+ content_hash TEXT,
12
+ status TEXT DEFAULT 'active'
13
+ );
14
+
15
+ CREATE TABLE IF NOT EXISTS knowledge_chunks (
16
+ id TEXT PRIMARY KEY,
17
+ doc_id TEXT REFERENCES knowledge_docs(id) ON DELETE CASCADE,
18
+ chunk_index INTEGER,
19
+ heading_path TEXT,
20
+ content TEXT NOT NULL,
21
+ code_blocks TEXT,
22
+ token_count INTEGER
23
+ );
24
+
25
+ CREATE VIRTUAL TABLE IF NOT EXISTS knowledge_fts USING fts5(
26
+ id UNINDEXED, heading_path, content, code_blocks,
27
+ content=knowledge_chunks
28
+ );
29
+
30
+ CREATE VIRTUAL TABLE IF NOT EXISTS knowledge_vec USING vec0(
31
+ id TEXT PRIMARY KEY,
32
+ embedding FLOAT[384]
33
+ );
34
+ `;
35
+ const FTS_TRIGGERS = `
36
+ CREATE TRIGGER IF NOT EXISTS kchunks_ai AFTER INSERT ON knowledge_chunks BEGIN
37
+ INSERT INTO knowledge_fts(rowid, id, heading_path, content, code_blocks)
38
+ VALUES (new.rowid, new.id, new.heading_path, new.content, new.code_blocks);
39
+ END;
40
+ 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);
43
+ END;
44
+ 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);
47
+ INSERT INTO knowledge_fts(rowid, id, heading_path, content, code_blocks)
48
+ VALUES (new.rowid, new.id, new.heading_path, new.content, new.code_blocks);
49
+ END;
50
+ `;
51
+ export class KnowledgeStore {
52
+ db;
53
+ constructor(dbPath) {
54
+ this.db = new Database(dbPath);
55
+ this.db.pragma('journal_mode = WAL');
56
+ this.db.pragma('foreign_keys = ON');
57
+ sqliteVec.load(this.db);
58
+ this.db.exec(KNOWLEDGE_SCHEMA);
59
+ this.db.exec(FTS_TRIGGERS);
60
+ }
61
+ upsertDoc(doc) {
62
+ const existing = this.db.prepare('SELECT id FROM knowledge_docs WHERE id = ?').get(doc.id);
63
+ if (existing) {
64
+ this.db.prepare('UPDATE knowledge_docs SET title=?, version=?, fetched_at=?, content_hash=? WHERE id=?').run(doc.title ?? null, doc.version ?? null, Date.now(), doc.contentHash ?? null, doc.id);
65
+ }
66
+ else {
67
+ this.db.prepare('INSERT INTO knowledge_docs (id, source, url, title, version, fetched_at, content_hash) VALUES (?,?,?,?,?,?,?)').run(doc.id, doc.source, doc.url, doc.title ?? null, doc.version ?? null, Date.now(), doc.contentHash ?? null);
68
+ }
69
+ }
70
+ clearChunks(docId) {
71
+ this.db.prepare('DELETE FROM knowledge_chunks WHERE doc_id = ?').run(docId);
72
+ }
73
+ insertChunk(chunk) {
74
+ 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
+ }
76
+ insertEmbedding(id, embedding) {
77
+ const buffer = Buffer.from(embedding.buffer);
78
+ this.db.prepare('INSERT OR REPLACE INTO knowledge_vec(id, embedding) VALUES (?, ?)').run(id, buffer);
79
+ }
80
+ searchBM25(query, limit = 20) {
81
+ const rows = this.db.prepare(`
82
+ SELECT k.id, rank FROM knowledge_fts f
83
+ JOIN knowledge_chunks k ON k.rowid = f.rowid
84
+ WHERE knowledge_fts MATCH ? ORDER BY rank LIMIT ?
85
+ `).all(query, limit);
86
+ return rows;
87
+ }
88
+ searchVector(embedding, limit = 20) {
89
+ const buffer = Buffer.from(embedding.buffer);
90
+ const rows = this.db.prepare(`
91
+ SELECT v.id, vec_distance_cosine(v.embedding, ?) as distance
92
+ FROM knowledge_vec v ORDER BY distance LIMIT ?
93
+ `).all(buffer, limit);
94
+ return rows;
95
+ }
96
+ getChunk(id) {
97
+ return this.db.prepare('SELECT * FROM knowledge_chunks WHERE id = ?').get(id);
98
+ }
99
+ getDocChunks(source, limit = 100) {
100
+ return this.db.prepare(`
101
+ SELECT kc.* FROM knowledge_chunks kc
102
+ JOIN knowledge_docs kd ON kd.id = kc.doc_id
103
+ WHERE kd.source = ? ORDER BY kc.chunk_index LIMIT ?
104
+ `).all(source, limit);
105
+ }
106
+ close() { this.db.close(); }
107
+ }
108
+ //# sourceMappingURL=knowledge-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-store.js","sourceRoot":"","sources":["../src/knowledge-store.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ export declare function htmlToMarkdown(html: string): string;
2
2
  export interface Chunk {
3
3
  title: string;
4
4
  content: string;
5
+ headingPath?: string;
6
+ codeBlocks?: string;
5
7
  }
6
8
  export declare function sliceByHeadings(markdown: string): Chunk[];
7
9
  //# 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,CAEnD;AAED,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,CAmDzD"}
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,CAEnD;AAED,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"}
@@ -8,53 +8,50 @@ turndown.remove(["script", "style"]);
8
8
  export function htmlToMarkdown(html) {
9
9
  return turndown.turndown(html);
10
10
  }
11
+ function extractCodeBlocks(text) {
12
+ const codeMatches = text.match(/```[\s\S]*?```/g);
13
+ return codeMatches ? codeMatches.join('\n') : '';
14
+ }
11
15
  export function sliceByHeadings(markdown) {
12
16
  const trimmed = markdown.trim();
13
17
  if (trimmed.length === 0)
14
18
  return [];
15
- const lines = trimmed.split("\n");
19
+ const lines = trimmed.split('\n');
16
20
  const chunks = [];
17
- let currentTitle = "";
21
+ let currentTitle = '';
18
22
  let currentContent = [];
19
- let preambleContent = [];
20
- let foundFirstH2 = false;
23
+ let headingStack = [];
21
24
  for (const line of lines) {
22
- if (line.startsWith("## ")) {
23
- if (foundFirstH2) {
24
- // Push previous H2 section
25
- if (currentContent.length > 0) {
26
- chunks.push({ title: currentTitle, content: currentContent.join("\n").trim() });
27
- }
28
- }
29
- else {
30
- // This is the first H2 encountered
31
- foundFirstH2 = true;
25
+ const hMatch = line.match(/^(#{1,4})\s+(.+)/);
26
+ if (hMatch) {
27
+ if (currentContent.length > 0) {
28
+ const content = currentContent.join('\n').trim();
29
+ chunks.push({
30
+ title: currentTitle || 'Overview',
31
+ content,
32
+ headingPath: headingStack.join(' > '),
33
+ codeBlocks: extractCodeBlocks(content),
34
+ });
32
35
  }
33
- currentTitle = line.slice(3).trim();
34
- // Prepend preamble content to the first H2 section
35
- currentContent = preambleContent.length > 0 ? [...preambleContent] : [];
36
- preambleContent = [];
37
- }
38
- else if (!foundFirstH2) {
39
- preambleContent.push(line);
36
+ const level = hMatch[1].length;
37
+ const title = hMatch[2].replace(/\[.*\]\(.*\)/g, '').trim();
38
+ headingStack = headingStack.slice(0, level - 1);
39
+ headingStack.push(title);
40
+ currentTitle = title;
41
+ currentContent = [line];
40
42
  }
41
43
  else {
42
44
  currentContent.push(line);
43
45
  }
44
46
  }
45
- // Push final H2 section
46
- if (currentContent.some(l => l.trim().length > 0)) {
47
- chunks.push({ title: currentTitle, content: currentContent.join("\n").trim() });
48
- }
49
- // If no H2 headings at all, create one chunk from entire markdown
50
- if (!foundFirstH2) {
51
- const h1Match = trimmed.match(/^# (.+)$/m);
52
- return [{ title: h1Match?.[1] ?? "Untitled", content: trimmed }];
53
- }
54
- // If preamble exists but no H2 sections were created (empty H2 sections)
55
- if (chunks.length === 0 && preambleContent.length > 0) {
56
- const h1Match = trimmed.match(/^# (.+)$/m);
57
- return [{ title: h1Match?.[1] ?? "Untitled", content: trimmed }];
47
+ if (currentContent.length > 0) {
48
+ const content = currentContent.join('\n').trim();
49
+ chunks.push({
50
+ title: currentTitle || 'Overview',
51
+ content,
52
+ headingPath: headingStack.join(' > '),
53
+ codeBlocks: extractCodeBlocks(content),
54
+ });
58
55
  }
59
56
  return chunks;
60
57
  }
@@ -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":"AAAA,OAAO,eAAe,MAAM,UAAU,CAAC;AAEvC,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC;IACnC,YAAY,EAAE,KAAK;IACnB,cAAc,EAAE,QAAQ;CACzB,CAAC,CAAC;AAEH,6CAA6C;AAC7C,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAErC,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AASD,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAClD,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,cAAc,GAAa,EAAE,CAAC;IAClC,IAAI,YAAY,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,YAAY,IAAI,UAAU;oBACjC,OAAO;oBACP,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;oBACrC,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC;iBACvC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5D,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAChD,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,YAAY,GAAG,KAAK,CAAC;YACrB,cAAc,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,YAAY,IAAI,UAAU;YACjC,OAAO;YACP,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare class KnowledgeVectorStore {
2
+ private db;
3
+ constructor(dbPath: string);
4
+ upsert(chunkId: string, embedding: Float32Array): void;
5
+ search(embedding: Float32Array, limit?: number): Array<{
6
+ chunkId: string;
7
+ distance: number;
8
+ }>;
9
+ count(): number;
10
+ close(): void;
11
+ }
12
+ //# sourceMappingURL=vector-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../src/vector-store.ts"],"names":[],"mappings":"AAKA,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,EAAE,MAAM;IAa1B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,IAAI;IAKtD,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,SAAK,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAQzF,KAAK,IAAI,MAAM;IAIf,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,36 @@
1
+ import Database from 'better-sqlite3';
2
+ import * as sqliteVec from 'sqlite-vec';
3
+ import { dirname } from 'node:path';
4
+ import { existsSync, mkdirSync } from 'node:fs';
5
+ export class KnowledgeVectorStore {
6
+ db;
7
+ constructor(dbPath) {
8
+ const dir = dirname(dbPath);
9
+ if (!existsSync(dir))
10
+ mkdirSync(dir, { recursive: true });
11
+ this.db = new Database(dbPath);
12
+ sqliteVec.load(this.db);
13
+ this.db.exec(`
14
+ CREATE VIRTUAL TABLE IF NOT EXISTS knowledge_vec USING vec0(
15
+ chunk_id TEXT PRIMARY KEY,
16
+ embedding FLOAT[384]
17
+ );
18
+ `);
19
+ }
20
+ upsert(chunkId, embedding) {
21
+ const buf = Buffer.from(embedding.buffer);
22
+ this.db.prepare('INSERT OR REPLACE INTO knowledge_vec(chunk_id, embedding) VALUES (?, ?)').run(chunkId, buf);
23
+ }
24
+ search(embedding, limit = 20) {
25
+ const buf = Buffer.from(embedding.buffer);
26
+ return this.db.prepare('SELECT chunk_id, vec_distance_cosine(embedding, ?) as distance FROM knowledge_vec ORDER BY distance LIMIT ?').all(buf, limit)
27
+ .map(r => ({ chunkId: r.chunk_id, distance: r.distance }));
28
+ }
29
+ count() {
30
+ return this.db.prepare('SELECT COUNT(*) as c FROM knowledge_vec').get()?.c ?? 0;
31
+ }
32
+ close() {
33
+ this.db.close();
34
+ }
35
+ }
36
+ //# sourceMappingURL=vector-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../src/vector-store.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,OAAO,oBAAoB;IACvB,EAAE,CAAoB;IAE9B,YAAY,MAAc;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;KAKZ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,OAAe,EAAE,SAAuB;QAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC/G,CAAC;IAED,MAAM,CAAC,SAAuB,EAAE,KAAK,GAAG,EAAE;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAQ,IAAI,CAAC,EAAE,CAAC,OAAO,CACrB,6GAA6G,CAC9G,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAmD;aAChE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK;QACH,OAAQ,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,EAAU,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3F,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/knowledge-engine",
3
- "version": "0.8.10",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -18,7 +18,7 @@
18
18
  "postinstall": "playwright install chromium || true"
19
19
  },
20
20
  "dependencies": {
21
- "@devflow-tools/sdk": "^0.8.10",
21
+ "@devflow-tools/sdk": "^0.9.0",
22
22
  "playwright": "^1.52.0",
23
23
  "turndown": "^7.2.4"
24
24
  },
@@ -30,5 +30,5 @@
30
30
  "files": [
31
31
  "dist"
32
32
  ],
33
- "gitHead": "ac4f93d6a52fa40b4126b514e899eee581f8f46e"
33
+ "gitHead": "7872bccedbacd09cc92b983f30b3702db6878125"
34
34
  }