@onesclawkolor/onesclaw 0.1.0 → 0.1.1
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 +2 -0
- package/dist/agent/loop.d.ts +14 -20
- package/dist/agent/loop.js +377 -38
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/ones-answer.d.ts +29 -0
- package/dist/agent/ones-answer.js +380 -0
- package/dist/agent/ones-answer.js.map +1 -0
- package/dist/agent/ones-routing.d.ts +10 -0
- package/dist/agent/ones-routing.js +160 -0
- package/dist/agent/ones-routing.js.map +1 -0
- package/dist/cli/logger.js +17 -1
- package/dist/cli/logger.js.map +1 -1
- package/dist/commands/kb.d.ts +4 -0
- package/dist/commands/kb.js +154 -0
- package/dist/commands/kb.js.map +1 -0
- package/dist/config/manager.d.ts +43 -0
- package/dist/config/manager.js +143 -3
- package/dist/config/manager.js.map +1 -1
- package/dist/config/types.d.ts +2 -0
- package/dist/index.js +37 -1
- package/dist/index.js.map +1 -1
- package/dist/knowledge/helper-scripts.d.ts +11 -0
- package/dist/knowledge/helper-scripts.js +325 -0
- package/dist/knowledge/helper-scripts.js.map +1 -0
- package/dist/knowledge/manager.d.ts +28 -0
- package/dist/knowledge/manager.js +377 -0
- package/dist/knowledge/manager.js.map +1 -0
- package/dist/knowledge/preprocess.d.ts +10 -0
- package/dist/knowledge/preprocess.js +93 -0
- package/dist/knowledge/preprocess.js.map +1 -0
- package/dist/knowledge/qmd.d.ts +53 -0
- package/dist/knowledge/qmd.js +236 -0
- package/dist/knowledge/qmd.js.map +1 -0
- package/dist/knowledge/rerank.d.ts +14 -0
- package/dist/knowledge/rerank.js +256 -0
- package/dist/knowledge/rerank.js.map +1 -0
- package/dist/knowledge/tools.d.ts +6 -0
- package/dist/knowledge/tools.js +131 -0
- package/dist/knowledge/tools.js.map +1 -0
- package/dist/knowledge/types.d.ts +96 -0
- package/dist/knowledge/types.js +2 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/prompts/system.js +64 -41
- package/dist/prompts/system.js.map +1 -1
- package/dist/tools/registry.d.ts +2 -2
- package/dist/tools/registry.js +12 -3
- package/dist/tools/registry.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { mkdir, readdir, readFile, rm, stat, unlink, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, relative } from 'node:path';
|
|
4
|
+
import { getKnowledgeBinDir, ensureKnowledgeDir, getKnowledgeManifestPath, getKnowledgeSourcesDir, normalizeKnowledgeConfig, } from '../config/manager.js';
|
|
5
|
+
import { logger } from '../cli/logger.js';
|
|
6
|
+
import { extractCommandBlocks, extractFirstHeading, extractSection, isMarkdownSourceFile, preprocessMarkdown } from './preprocess.js';
|
|
7
|
+
import { ensureKnowledgeHelperScripts, listKnowledgeHelperScripts } from './helper-scripts.js';
|
|
8
|
+
import { QmdClient } from './qmd.js';
|
|
9
|
+
import { rerankKnowledgeResults } from './rerank.js';
|
|
10
|
+
export class KnowledgeManager {
|
|
11
|
+
config;
|
|
12
|
+
qmd;
|
|
13
|
+
commandBlockCache = new Map();
|
|
14
|
+
constructor(config, runner) {
|
|
15
|
+
this.config = normalizeKnowledgeConfig(config ?? undefined);
|
|
16
|
+
this.qmd = new QmdClient(this.config.qmd, runner);
|
|
17
|
+
}
|
|
18
|
+
getPromptContext() {
|
|
19
|
+
return {
|
|
20
|
+
enabled: this.config.enabled,
|
|
21
|
+
sourceNames: this.config.sources.filter((source) => source.enabled).map((source) => source.name),
|
|
22
|
+
priority: [...this.config.priority],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async bootstrap(sourcePath, sourceName = 'ones-docs') {
|
|
26
|
+
const source = this.config.sources.find((item) => item.name === sourceName);
|
|
27
|
+
if (!source) {
|
|
28
|
+
throw new Error(`知识源未配置:${sourceName}`);
|
|
29
|
+
}
|
|
30
|
+
if (source.source_path !== sourcePath) {
|
|
31
|
+
throw new Error(`知识源路径不匹配:${source.source_path}`);
|
|
32
|
+
}
|
|
33
|
+
return this.syncSource(source);
|
|
34
|
+
}
|
|
35
|
+
async syncAll() {
|
|
36
|
+
const manifests = [];
|
|
37
|
+
for (const source of this.config.sources.filter((item) => item.enabled)) {
|
|
38
|
+
manifests.push(await this.syncSource(source));
|
|
39
|
+
}
|
|
40
|
+
return manifests;
|
|
41
|
+
}
|
|
42
|
+
async autoSyncIfNeeded() {
|
|
43
|
+
if (!this.config.enabled || !this.config.auto_sync_on_startup) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
for (const source of this.config.sources.filter((item) => item.enabled)) {
|
|
47
|
+
const files = await collectMarkdownFiles(source.source_path);
|
|
48
|
+
const fingerprint = computeSourceFingerprint(files);
|
|
49
|
+
const manifest = await this.readManifest(source.name);
|
|
50
|
+
if (!manifest || manifest.source_fingerprint !== fingerprint) {
|
|
51
|
+
await this.syncSource(source);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async status() {
|
|
56
|
+
await ensureKnowledgeDir();
|
|
57
|
+
const helperScripts = await this.listHelperScripts();
|
|
58
|
+
const sources = await Promise.all(this.config.sources.map(async (source) => ({
|
|
59
|
+
name: source.name,
|
|
60
|
+
enabled: source.enabled,
|
|
61
|
+
source_path: source.source_path,
|
|
62
|
+
managed_path: source.managed_path,
|
|
63
|
+
pattern: source.pattern,
|
|
64
|
+
manifest: await this.readManifest(source.name),
|
|
65
|
+
})));
|
|
66
|
+
try {
|
|
67
|
+
const version = await this.qmd.ensureAvailable();
|
|
68
|
+
const rawStatus = await this.qmd.status();
|
|
69
|
+
return {
|
|
70
|
+
enabled: this.config.enabled,
|
|
71
|
+
backend: this.config.backend,
|
|
72
|
+
qmd_command: this.config.qmd.command,
|
|
73
|
+
qmd_available: true,
|
|
74
|
+
qmd_version: version,
|
|
75
|
+
priority: [...this.config.priority],
|
|
76
|
+
helper_scripts_dir: getKnowledgeBinDir(),
|
|
77
|
+
helper_scripts: helperScripts,
|
|
78
|
+
sources,
|
|
79
|
+
raw_qmd_status: rawStatus,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return {
|
|
84
|
+
enabled: this.config.enabled,
|
|
85
|
+
backend: this.config.backend,
|
|
86
|
+
qmd_command: this.config.qmd.command,
|
|
87
|
+
qmd_available: false,
|
|
88
|
+
qmd_version: null,
|
|
89
|
+
priority: [...this.config.priority],
|
|
90
|
+
helper_scripts_dir: getKnowledgeBinDir(),
|
|
91
|
+
helper_scripts: helperScripts,
|
|
92
|
+
sources,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async search(query, limit) {
|
|
97
|
+
const enabledSources = this.config.sources.filter((source) => source.enabled);
|
|
98
|
+
if (!this.config.enabled || enabledSources.length === 0) {
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
101
|
+
await ensureKnowledgeDir();
|
|
102
|
+
await this.qmd.ensureAvailable();
|
|
103
|
+
const rerankStart = Date.now();
|
|
104
|
+
const { hits, mode } = await this.qmd.search(query, enabledSources, limit ?? this.config.qmd.max_results, 'search');
|
|
105
|
+
if (hits.length > 0) {
|
|
106
|
+
const results = this.qmd.toSearchResults(hits, mode);
|
|
107
|
+
const reranked = await rerankKnowledgeResults(query, results, (relativePath) => this.readManagedDocument(relativePath));
|
|
108
|
+
logger.debug('knowledge', `knowledge rerank completed in ${Date.now() - rerankStart}ms`, {
|
|
109
|
+
query,
|
|
110
|
+
hit_count: hits.length,
|
|
111
|
+
primary_doc: reranked[0]?.relative_path ?? null,
|
|
112
|
+
mode,
|
|
113
|
+
});
|
|
114
|
+
return reranked;
|
|
115
|
+
}
|
|
116
|
+
const fallbackQuery = buildFallbackKnowledgeQuery(query);
|
|
117
|
+
if (!fallbackQuery || fallbackQuery === query) {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
const fallback = await this.qmd.search(fallbackQuery, enabledSources, limit ?? this.config.qmd.max_results, 'search');
|
|
121
|
+
const fallbackResults = this.qmd.toSearchResults(fallback.hits, fallback.mode);
|
|
122
|
+
const reranked = await rerankKnowledgeResults(query, fallbackResults, (relativePath) => this.readManagedDocument(relativePath));
|
|
123
|
+
logger.debug('knowledge', `knowledge fallback rerank completed in ${Date.now() - rerankStart}ms`, {
|
|
124
|
+
query,
|
|
125
|
+
fallback_query: fallbackQuery,
|
|
126
|
+
hit_count: fallback.hits.length,
|
|
127
|
+
primary_doc: reranked[0]?.relative_path ?? null,
|
|
128
|
+
mode: fallback.mode,
|
|
129
|
+
});
|
|
130
|
+
return reranked;
|
|
131
|
+
}
|
|
132
|
+
async getDocument(pathRef, section) {
|
|
133
|
+
const path = this.normalizeRelativePath(pathRef);
|
|
134
|
+
const source = await this.findSourceForRelativePath(path);
|
|
135
|
+
if (!source) {
|
|
136
|
+
throw new Error(`未找到文档所属知识源: ${path}`);
|
|
137
|
+
}
|
|
138
|
+
await ensureKnowledgeDir();
|
|
139
|
+
await this.qmd.ensureAvailable();
|
|
140
|
+
const raw = await this.qmd.getDocument(source.name, path);
|
|
141
|
+
if (!section) {
|
|
142
|
+
return raw;
|
|
143
|
+
}
|
|
144
|
+
const extracted = extractSection(raw, section);
|
|
145
|
+
if (!extracted) {
|
|
146
|
+
throw new Error(`文档中未找到章节: ${section}`);
|
|
147
|
+
}
|
|
148
|
+
return extracted;
|
|
149
|
+
}
|
|
150
|
+
async extractCommands(pathRef, section) {
|
|
151
|
+
const path = this.normalizeRelativePath(pathRef);
|
|
152
|
+
const source = await this.findSourceForRelativePath(path);
|
|
153
|
+
if (!source) {
|
|
154
|
+
throw new Error(`未找到文档所属知识源: ${path}`);
|
|
155
|
+
}
|
|
156
|
+
const cacheKey = await this.getCommandCacheKey(source, path);
|
|
157
|
+
if (cacheKey && this.commandBlockCache.has(cacheKey)) {
|
|
158
|
+
logger.debug('knowledge', 'kb_extract_commands cache hit', {
|
|
159
|
+
relative_path: path,
|
|
160
|
+
cache_key: cacheKey,
|
|
161
|
+
});
|
|
162
|
+
return this.commandBlockCache.get(cacheKey);
|
|
163
|
+
}
|
|
164
|
+
const content = await this.getDocument(path, section);
|
|
165
|
+
const documentTitle = extractFirstHeading(content) ?? path.split('/').pop()?.replace(/\.md$/i, '') ?? path;
|
|
166
|
+
const commandBlocks = extractCommandBlocks(content);
|
|
167
|
+
const blocks = commandBlocks.map((block) => {
|
|
168
|
+
const anchor = block.section ?? documentTitle;
|
|
169
|
+
return {
|
|
170
|
+
source_name: source.name,
|
|
171
|
+
relative_path: path,
|
|
172
|
+
path,
|
|
173
|
+
document_title: documentTitle,
|
|
174
|
+
section: block.section,
|
|
175
|
+
language: block.language || 'text',
|
|
176
|
+
code: block.code,
|
|
177
|
+
command: block.code,
|
|
178
|
+
summary: `${anchor} 命令块`,
|
|
179
|
+
citation: `[local-docs] ${path}#${anchor}`,
|
|
180
|
+
kind: 'raw_doc_command',
|
|
181
|
+
};
|
|
182
|
+
});
|
|
183
|
+
if (cacheKey) {
|
|
184
|
+
this.commandBlockCache.set(cacheKey, blocks);
|
|
185
|
+
}
|
|
186
|
+
return blocks;
|
|
187
|
+
}
|
|
188
|
+
async listHelperScripts() {
|
|
189
|
+
await ensureKnowledgeDir();
|
|
190
|
+
return listKnowledgeHelperScripts();
|
|
191
|
+
}
|
|
192
|
+
normalizeRelativePath(pathRef) {
|
|
193
|
+
const path = pathRef.trim().replace(/^\/+/, '');
|
|
194
|
+
if (!path) {
|
|
195
|
+
throw new Error('path 不能为空');
|
|
196
|
+
}
|
|
197
|
+
if (path.split('/').includes('..')) {
|
|
198
|
+
throw new Error('path 不允许包含 ..');
|
|
199
|
+
}
|
|
200
|
+
return path;
|
|
201
|
+
}
|
|
202
|
+
async findSourceForRelativePath(relativePath) {
|
|
203
|
+
for (const source of this.config.sources.filter((item) => item.enabled)) {
|
|
204
|
+
const candidate = join(source.managed_path, relativePath);
|
|
205
|
+
try {
|
|
206
|
+
await stat(candidate);
|
|
207
|
+
return source;
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
async readManagedDocument(relativePath) {
|
|
216
|
+
for (const source of this.config.sources.filter((item) => item.enabled)) {
|
|
217
|
+
const candidate = join(source.managed_path, relativePath);
|
|
218
|
+
try {
|
|
219
|
+
return await readFile(candidate, 'utf-8');
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
async syncSource(source) {
|
|
228
|
+
await ensureKnowledgeDir();
|
|
229
|
+
const version = await this.qmd.ensureAvailable();
|
|
230
|
+
const files = await collectMarkdownFiles(source.source_path);
|
|
231
|
+
await mkdir(source.managed_path, { recursive: true });
|
|
232
|
+
await this.cleanManagedDirectory(source.managed_path, files.map((item) => item.relativePath));
|
|
233
|
+
for (const file of files) {
|
|
234
|
+
const raw = await readFile(file.absolutePath, 'utf-8');
|
|
235
|
+
const processed = preprocessMarkdown(raw);
|
|
236
|
+
const targetPath = join(source.managed_path, file.relativePath);
|
|
237
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
238
|
+
await writeFile(targetPath, processed, 'utf-8');
|
|
239
|
+
}
|
|
240
|
+
await this.qmd.ensureCollection(source);
|
|
241
|
+
await this.qmd.update();
|
|
242
|
+
await this.qmd.embed();
|
|
243
|
+
await this.qmd.status();
|
|
244
|
+
const latestSourceMtimeMs = files.reduce((max, item) => Math.max(max, item.mtimeMs), 0);
|
|
245
|
+
const manifest = {
|
|
246
|
+
source_name: source.name,
|
|
247
|
+
source_path: source.source_path,
|
|
248
|
+
managed_path: source.managed_path,
|
|
249
|
+
pattern: source.pattern,
|
|
250
|
+
file_count: files.length,
|
|
251
|
+
last_synced_at: new Date().toISOString(),
|
|
252
|
+
latest_source_mtime_ms: latestSourceMtimeMs,
|
|
253
|
+
source_fingerprint: computeSourceFingerprint(files),
|
|
254
|
+
qmd_version: version,
|
|
255
|
+
search_mode: this.config.qmd.search_mode,
|
|
256
|
+
index_status: 'ready',
|
|
257
|
+
};
|
|
258
|
+
await mkdir(getKnowledgeSourcesDir(), { recursive: true });
|
|
259
|
+
await writeFile(getKnowledgeManifestPath(source.name), JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
|
|
260
|
+
await ensureKnowledgeHelperScripts();
|
|
261
|
+
this.commandBlockCache.clear();
|
|
262
|
+
return manifest;
|
|
263
|
+
}
|
|
264
|
+
async getCommandCacheKey(source, relativePath) {
|
|
265
|
+
try {
|
|
266
|
+
const fileStat = await stat(join(source.managed_path, relativePath));
|
|
267
|
+
return `${relativePath}:${fileStat.mtimeMs}`;
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return null;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
async cleanManagedDirectory(root, expectedRelativePaths) {
|
|
274
|
+
const expected = new Set(expectedRelativePaths.map((item) => item.replace(/\\/g, '/')));
|
|
275
|
+
const current = await collectMarkdownFiles(root, root).catch(() => []);
|
|
276
|
+
for (const file of current) {
|
|
277
|
+
if (expected.has(file.relativePath.replace(/\\/g, '/'))) {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
await unlink(file.absolutePath).catch(() => undefined);
|
|
281
|
+
}
|
|
282
|
+
await removeEmptyDirectories(root);
|
|
283
|
+
}
|
|
284
|
+
async readManifest(sourceName) {
|
|
285
|
+
try {
|
|
286
|
+
const content = await readFile(getKnowledgeManifestPath(sourceName), 'utf-8');
|
|
287
|
+
return JSON.parse(content);
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async function collectMarkdownFiles(root, relativeRoot = root) {
|
|
295
|
+
const entries = await readdir(root, { withFileTypes: true });
|
|
296
|
+
const results = [];
|
|
297
|
+
for (const entry of entries) {
|
|
298
|
+
const absolutePath = join(root, entry.name);
|
|
299
|
+
if (entry.isDirectory()) {
|
|
300
|
+
results.push(...(await collectMarkdownFiles(absolutePath, relativeRoot)));
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
const rel = relative(relativeRoot, absolutePath).replace(/\\/g, '/');
|
|
304
|
+
if (!isMarkdownSourceFile(rel)) {
|
|
305
|
+
continue;
|
|
306
|
+
}
|
|
307
|
+
const fileStat = await stat(absolutePath);
|
|
308
|
+
results.push({
|
|
309
|
+
relativePath: rel,
|
|
310
|
+
absolutePath,
|
|
311
|
+
mtimeMs: fileStat.mtimeMs,
|
|
312
|
+
size: fileStat.size,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
results.sort((left, right) => left.relativePath.localeCompare(right.relativePath));
|
|
316
|
+
return results;
|
|
317
|
+
}
|
|
318
|
+
async function removeEmptyDirectories(root) {
|
|
319
|
+
const entries = await readdir(root, { withFileTypes: true }).catch(() => []);
|
|
320
|
+
for (const entry of entries) {
|
|
321
|
+
if (!entry.isDirectory()) {
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
const child = join(root, entry.name);
|
|
325
|
+
await removeEmptyDirectories(child);
|
|
326
|
+
}
|
|
327
|
+
const remaining = await readdir(root, { withFileTypes: true }).catch(() => []);
|
|
328
|
+
if (remaining.length === 0) {
|
|
329
|
+
await rm(root, { recursive: false, force: true }).catch(() => undefined);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
function computeSourceFingerprint(files) {
|
|
333
|
+
const hash = createHash('sha256');
|
|
334
|
+
for (const file of files) {
|
|
335
|
+
hash.update(file.relativePath);
|
|
336
|
+
hash.update(':');
|
|
337
|
+
hash.update(String(file.mtimeMs));
|
|
338
|
+
hash.update(':');
|
|
339
|
+
hash.update(String(file.size));
|
|
340
|
+
hash.update('\n');
|
|
341
|
+
}
|
|
342
|
+
return hash.digest('hex');
|
|
343
|
+
}
|
|
344
|
+
function buildFallbackKnowledgeQuery(query) {
|
|
345
|
+
const tokens = new Set();
|
|
346
|
+
if (/\bones\b|ones\.pro/i.test(query)) {
|
|
347
|
+
tokens.add('ONES');
|
|
348
|
+
}
|
|
349
|
+
if (/k3s/i.test(query)) {
|
|
350
|
+
tokens.add('K3S');
|
|
351
|
+
}
|
|
352
|
+
const keywordExpansions = [
|
|
353
|
+
[/部署/, ['部署', '安装']],
|
|
354
|
+
[/安装/, ['安装', '部署']],
|
|
355
|
+
[/升级/, ['升级']],
|
|
356
|
+
[/备份/, ['备份']],
|
|
357
|
+
[/恢复/, ['恢复']],
|
|
358
|
+
[/授权/, ['授权', '证书']],
|
|
359
|
+
[/证书/, ['证书', '授权']],
|
|
360
|
+
[/配置/, ['配置']],
|
|
361
|
+
[/排障|故障/, ['排障', '故障']],
|
|
362
|
+
[/环境要求|环境检测|envcheck/i, ['环境要求', '环境检测']],
|
|
363
|
+
];
|
|
364
|
+
for (const [pattern, expansions] of keywordExpansions) {
|
|
365
|
+
if (!pattern.test(query)) {
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
for (const expansion of expansions) {
|
|
369
|
+
tokens.add(expansion);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (tokens.size === 0) {
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
375
|
+
return Array.from(tokens).join(' ');
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/knowledge/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface MarkdownCommandBlock {
|
|
2
|
+
section: string | null;
|
|
3
|
+
language: string;
|
|
4
|
+
code: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function isMarkdownSourceFile(filePath: string): boolean;
|
|
7
|
+
export declare function preprocessMarkdown(raw: string): string;
|
|
8
|
+
export declare function extractFirstHeading(markdown: string): string | null;
|
|
9
|
+
export declare function extractSection(markdown: string, section: string): string | null;
|
|
10
|
+
export declare function extractCommandBlocks(markdown: string): MarkdownCommandBlock[];
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import matter from 'gray-matter';
|
|
2
|
+
const IMAGE_ONLY_LINE_RE = /^\s*!\[[^\]]*\]\([^)]*\)\s*$/;
|
|
3
|
+
const HEADING_RE = /^(#{1,6})\s+(.+?)\s*$/;
|
|
4
|
+
const FENCE_RE = /^```([^`]*)\s*$/;
|
|
5
|
+
export function isMarkdownSourceFile(filePath) {
|
|
6
|
+
const lower = filePath.toLowerCase();
|
|
7
|
+
return lower.endsWith('.md') && !lower.endsWith('.bak');
|
|
8
|
+
}
|
|
9
|
+
export function preprocessMarkdown(raw) {
|
|
10
|
+
const parsed = matter(raw);
|
|
11
|
+
const filteredLines = parsed.content
|
|
12
|
+
.split(/\r?\n/)
|
|
13
|
+
.filter((line) => !IMAGE_ONLY_LINE_RE.test(line));
|
|
14
|
+
return filteredLines.join('\n').trim() + '\n';
|
|
15
|
+
}
|
|
16
|
+
export function extractFirstHeading(markdown) {
|
|
17
|
+
for (const line of markdown.split(/\r?\n/)) {
|
|
18
|
+
const match = line.match(HEADING_RE);
|
|
19
|
+
if (match) {
|
|
20
|
+
return match[2].trim();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
export function extractSection(markdown, section) {
|
|
26
|
+
const lines = markdown.split(/\r?\n/);
|
|
27
|
+
const normalizedNeedle = section.trim().toLowerCase();
|
|
28
|
+
let start = -1;
|
|
29
|
+
let startLevel = 0;
|
|
30
|
+
for (let index = 0; index < lines.length; index++) {
|
|
31
|
+
const match = lines[index].match(HEADING_RE);
|
|
32
|
+
if (!match) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (match[2].trim().toLowerCase() === normalizedNeedle) {
|
|
36
|
+
start = index;
|
|
37
|
+
startLevel = match[1].length;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (start === -1) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
let end = lines.length;
|
|
45
|
+
for (let index = start + 1; index < lines.length; index++) {
|
|
46
|
+
const match = lines[index].match(HEADING_RE);
|
|
47
|
+
if (match && match[1].length <= startLevel) {
|
|
48
|
+
end = index;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return lines.slice(start, end).join('\n').trim() + '\n';
|
|
53
|
+
}
|
|
54
|
+
export function extractCommandBlocks(markdown) {
|
|
55
|
+
const lines = markdown.split(/\r?\n/);
|
|
56
|
+
const headingStack = [];
|
|
57
|
+
const blocks = [];
|
|
58
|
+
let inFence = false;
|
|
59
|
+
let fenceLanguage = '';
|
|
60
|
+
let fenceLines = [];
|
|
61
|
+
for (const line of lines) {
|
|
62
|
+
if (!inFence) {
|
|
63
|
+
const headingMatch = line.match(HEADING_RE);
|
|
64
|
+
if (headingMatch) {
|
|
65
|
+
const level = headingMatch[1].length;
|
|
66
|
+
headingStack.length = level - 1;
|
|
67
|
+
headingStack[level - 1] = headingMatch[2].trim();
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const fenceMatch = line.match(FENCE_RE);
|
|
71
|
+
if (fenceMatch) {
|
|
72
|
+
inFence = true;
|
|
73
|
+
fenceLanguage = fenceMatch[1].trim();
|
|
74
|
+
fenceLines = [];
|
|
75
|
+
}
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (line.match(FENCE_RE)) {
|
|
79
|
+
blocks.push({
|
|
80
|
+
section: headingStack.length > 0 ? headingStack[headingStack.length - 1] : null,
|
|
81
|
+
language: fenceLanguage,
|
|
82
|
+
code: fenceLines.join('\n').trim(),
|
|
83
|
+
});
|
|
84
|
+
inFence = false;
|
|
85
|
+
fenceLanguage = '';
|
|
86
|
+
fenceLines = [];
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
fenceLines.push(line);
|
|
90
|
+
}
|
|
91
|
+
return blocks.filter((block) => block.code.length > 0);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=preprocess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preprocess.js","sourceRoot":"","sources":["../../src/knowledge/preprocess.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { KnowledgeQmdConfig, KnowledgeSearchMode, KnowledgeSourceConfig, QmdSearchHit } from './types.js';
|
|
2
|
+
export interface CommandRunnerResult {
|
|
3
|
+
exitCode: number | null;
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
timedOut: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface CommandRunner {
|
|
9
|
+
run(command: string, args: string[], options?: {
|
|
10
|
+
env?: NodeJS.ProcessEnv;
|
|
11
|
+
cwd?: string;
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
}): Promise<CommandRunnerResult>;
|
|
14
|
+
}
|
|
15
|
+
export declare class DefaultCommandRunner implements CommandRunner {
|
|
16
|
+
run(command: string, args: string[], options?: {
|
|
17
|
+
env?: NodeJS.ProcessEnv;
|
|
18
|
+
cwd?: string;
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
}): Promise<CommandRunnerResult>;
|
|
21
|
+
}
|
|
22
|
+
export declare class QmdError extends Error {
|
|
23
|
+
constructor(message: string);
|
|
24
|
+
}
|
|
25
|
+
export declare class QmdClient {
|
|
26
|
+
private readonly config;
|
|
27
|
+
private readonly runner;
|
|
28
|
+
private availableVersionPromise;
|
|
29
|
+
constructor(config: KnowledgeQmdConfig, runner?: CommandRunner);
|
|
30
|
+
private run;
|
|
31
|
+
ensureAvailable(): Promise<string>;
|
|
32
|
+
ensureCollection(source: KnowledgeSourceConfig): Promise<void>;
|
|
33
|
+
update(): Promise<void>;
|
|
34
|
+
embed(): Promise<void>;
|
|
35
|
+
status(): Promise<string>;
|
|
36
|
+
search(query: string, sources: KnowledgeSourceConfig[], limit: number, preferredMode?: KnowledgeSearchMode): Promise<{
|
|
37
|
+
hits: QmdSearchHit[];
|
|
38
|
+
mode: KnowledgeSearchMode;
|
|
39
|
+
fallbackUsed: boolean;
|
|
40
|
+
}>;
|
|
41
|
+
private searchWithMode;
|
|
42
|
+
getDocument(sourceName: string, relativePath: string): Promise<string>;
|
|
43
|
+
toSearchResults(hits: QmdSearchHit[], retrievalMode: KnowledgeSearchMode): Array<{
|
|
44
|
+
source_name: string;
|
|
45
|
+
file: string;
|
|
46
|
+
relative_path: string;
|
|
47
|
+
title: string;
|
|
48
|
+
snippet: string;
|
|
49
|
+
score: number;
|
|
50
|
+
citation: string;
|
|
51
|
+
retrieval_mode: KnowledgeSearchMode;
|
|
52
|
+
}>;
|
|
53
|
+
}
|