@backendkit-labs/curator-codex-agent 0.2.0 → 1.0.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/dist/analyzer.d.ts +1 -17
- package/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +80 -163
- package/dist/analyzer.js.map +1 -1
- package/dist/audit.d.ts +27 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +43 -0
- package/dist/audit.js.map +1 -0
- package/dist/checksum.d.ts +0 -22
- package/dist/checksum.d.ts.map +1 -1
- package/dist/checksum.js +14 -103
- package/dist/checksum.js.map +1 -1
- package/dist/documentation-curator.d.ts +1 -1
- package/dist/documentation-curator.d.ts.map +1 -1
- package/dist/documentation-curator.js +79 -95
- package/dist/documentation-curator.js.map +1 -1
- package/dist/index.d.ts +19 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -22
- package/dist/index.js.map +1 -1
- package/dist/knowledge/embedder-worker.d.ts +2 -0
- package/dist/knowledge/embedder-worker.d.ts.map +1 -0
- package/dist/knowledge/embedder-worker.js +55 -0
- package/dist/knowledge/embedder-worker.js.map +1 -0
- package/dist/knowledge/engine.d.ts +10 -56
- package/dist/knowledge/engine.d.ts.map +1 -1
- package/dist/knowledge/engine.js +42 -153
- package/dist/knowledge/engine.js.map +1 -1
- package/dist/knowledge/rag-provider.d.ts +14 -56
- package/dist/knowledge/rag-provider.d.ts.map +1 -1
- package/dist/knowledge/rag-provider.js +63 -154
- package/dist/knowledge/rag-provider.js.map +1 -1
- package/dist/knowledge/synthesis.d.ts +0 -10
- package/dist/knowledge/synthesis.d.ts.map +1 -1
- package/dist/knowledge/synthesis.js +32 -77
- package/dist/knowledge/synthesis.js.map +1 -1
- package/dist/knowledge/transformers-embedder.d.ts +61 -0
- package/dist/knowledge/transformers-embedder.d.ts.map +1 -0
- package/dist/knowledge/transformers-embedder.js +222 -0
- package/dist/knowledge/transformers-embedder.js.map +1 -0
- package/dist/pdf-reader.d.ts +11 -0
- package/dist/pdf-reader.d.ts.map +1 -0
- package/dist/pdf-reader.js +21 -0
- package/dist/pdf-reader.js.map +1 -0
- package/dist/project.d.ts +28 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +88 -0
- package/dist/project.js.map +1 -0
- package/dist/providers/anthropic-adapter.d.ts +2 -2
- package/dist/providers/anthropic-adapter.d.ts.map +1 -1
- package/dist/providers/anthropic-adapter.js +7 -13
- package/dist/providers/anthropic-adapter.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +13 -20
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai-adapter.d.ts +2 -2
- package/dist/providers/openai-adapter.d.ts.map +1 -1
- package/dist/providers/openai-adapter.js +7 -13
- package/dist/providers/openai-adapter.js.map +1 -1
- package/dist/providers/types.d.ts +8 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +1 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -3
- package/dist/types.js.map +1 -1
- package/dist/vault-dedup.d.ts +35 -0
- package/dist/vault-dedup.d.ts.map +1 -0
- package/dist/vault-dedup.js +130 -0
- package/dist/vault-dedup.js.map +1 -0
- package/package.json +45 -58
- package/AGENT.md +0 -187
- package/README.md +0 -475
- package/dist/api/config.d.ts +0 -57
- package/dist/api/config.d.ts.map +0 -1
- package/dist/api/config.js +0 -183
- package/dist/api/config.js.map +0 -1
- package/dist/api/http-server.d.ts +0 -24
- package/dist/api/http-server.d.ts.map +0 -1
- package/dist/api/http-server.js +0 -108
- package/dist/api/http-server.js.map +0 -1
- package/dist/api/routes.d.ts +0 -8
- package/dist/api/routes.d.ts.map +0 -1
- package/dist/api/routes.js +0 -382
- package/dist/api/routes.js.map +0 -1
- package/dist/api/security.d.ts +0 -107
- package/dist/api/security.d.ts.map +0 -1
- package/dist/api/security.js +0 -200
- package/dist/api/security.js.map +0 -1
- package/dist/http-server-main.d.ts +0 -28
- package/dist/http-server-main.d.ts.map +0 -1
- package/dist/http-server-main.js +0 -69
- package/dist/http-server-main.js.map +0 -1
- package/dist/server.d.ts +0 -33
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -640
- package/dist/server.js.map +0 -1
- package/dist/watcher.d.ts +0 -26
- package/dist/watcher.d.ts.map +0 -1
- package/dist/watcher.js +0 -168
- package/dist/watcher.js.map +0 -1
|
@@ -1,115 +1,92 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
-
if (k2 === undefined) k2 = k;
|
|
8
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
-
}
|
|
12
|
-
Object.defineProperty(o, k2, desc);
|
|
13
|
-
}) : (function(o, m, k, k2) {
|
|
14
|
-
if (k2 === undefined) k2 = k;
|
|
15
|
-
o[k2] = m[k];
|
|
16
|
-
}));
|
|
17
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
-
}) : function(o, v) {
|
|
20
|
-
o["default"] = v;
|
|
21
|
-
});
|
|
22
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
-
var ownKeys = function(o) {
|
|
24
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
-
var ar = [];
|
|
26
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
|
-
return ownKeys(o);
|
|
30
|
-
};
|
|
31
|
-
return function (mod) {
|
|
32
|
-
if (mod && mod.__esModule) return mod;
|
|
33
|
-
var result = {};
|
|
34
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
-
__setModuleDefault(result, mod);
|
|
36
|
-
return result;
|
|
37
|
-
};
|
|
38
|
-
})();
|
|
39
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.CuratorRagProvider = void 0;
|
|
41
|
-
const agent_enterprise_1 = require("@backendkit-labs/agent-enterprise");
|
|
42
|
-
const path = __importStar(require("node:path"));
|
|
43
|
-
class CuratorRagProvider {
|
|
1
|
+
import { ObsidianRAGProvider } from '@backendkit-labs/agent-enterprise';
|
|
2
|
+
import { TransformersEmbedder } from './transformers-embedder.js';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { bkPaths } from '@backendkit-labs/infra';
|
|
5
|
+
export class CuratorRagProvider {
|
|
44
6
|
rag;
|
|
7
|
+
embedder;
|
|
45
8
|
vaultPath;
|
|
46
9
|
isIndexed = false;
|
|
10
|
+
// Dedupe concurrent index passes so a reload and a cold-start search never run
|
|
11
|
+
// two index() calls against the shared store at once.
|
|
12
|
+
indexing = null;
|
|
47
13
|
constructor(vaultPath) {
|
|
48
14
|
this.vaultPath = vaultPath;
|
|
49
|
-
this.
|
|
15
|
+
this.embedder = new TransformersEmbedder(process.env.CODEX_EMBED_MODEL ?? 'Xenova/nomic-embed-text-v1');
|
|
16
|
+
const envPacing = parseInt(process.env.CODEX_INDEX_PACING_MS ?? '', 10);
|
|
17
|
+
const envStageSize = parseInt(process.env.CODEX_INDEX_STAGE_SIZE ?? '', 10);
|
|
18
|
+
const envStagePacing = parseInt(process.env.CODEX_INDEX_STAGE_PACING_MS ?? '', 10);
|
|
19
|
+
this.rag = new ObsidianRAGProvider({
|
|
50
20
|
vaultPath,
|
|
51
21
|
indexPath: this.getIndexPath(),
|
|
52
|
-
embedder:
|
|
22
|
+
embedder: this.embedder,
|
|
53
23
|
topK: 5,
|
|
54
24
|
minScore: 0.1,
|
|
25
|
+
batchPacingMs: Number.isFinite(envPacing) && envPacing >= 0 ? envPacing : undefined,
|
|
26
|
+
stageSize: Number.isFinite(envStageSize) && envStageSize > 0 ? envStageSize : undefined,
|
|
27
|
+
stagePacingMs: Number.isFinite(envStagePacing) && envStagePacing >= 0 ? envStagePacing : undefined,
|
|
55
28
|
});
|
|
56
29
|
}
|
|
30
|
+
async initEmbedder(onProgress) {
|
|
31
|
+
return this.embedder.init(onProgress);
|
|
32
|
+
}
|
|
57
33
|
getIndexPath() {
|
|
58
|
-
|
|
59
|
-
return path.join(homeDir, '.curator-codex', 'rag', `${path.basename(this.vaultPath)}.json`);
|
|
34
|
+
return bkPaths.ragIndex(path.basename(this.vaultPath));
|
|
60
35
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
this.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
36
|
+
async indexVault(onProgress) {
|
|
37
|
+
// ObsidianRAGProvider.index() is incremental (loads the persisted index from
|
|
38
|
+
// disk and re-embeds only changed files). Coalesce concurrent callers onto a
|
|
39
|
+
// single in-flight pass. A caller joining an already-running pass does not get
|
|
40
|
+
// its own onProgress wired in — only the pass that started it does.
|
|
41
|
+
if (this.indexing)
|
|
42
|
+
return this.indexing;
|
|
43
|
+
this.indexing = (async () => {
|
|
44
|
+
try {
|
|
45
|
+
const result = await this.rag.index({ verbose: false, onProgress });
|
|
46
|
+
this.isIndexed = true;
|
|
47
|
+
return { indexed: result.indexed, updated: result.removed };
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
throw new Error(`RAG indexing failed: ${err.message}`);
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
this.indexing = null;
|
|
54
|
+
}
|
|
55
|
+
})();
|
|
56
|
+
return this.indexing;
|
|
74
57
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Search the vault with semantic search
|
|
77
|
-
*/
|
|
78
58
|
async search(query, opts = {}) {
|
|
79
59
|
if (!this.isIndexed) {
|
|
80
60
|
await this.indexVault();
|
|
81
61
|
}
|
|
82
62
|
try {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
return
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
63
|
+
// ObsidianRAGProvider.search() returns a formatted string, not an array.
|
|
64
|
+
// Access the underlying store and embedder directly for structured results.
|
|
65
|
+
const rag = this.rag;
|
|
66
|
+
const queryEmbedding = await rag.embedder.embedOne(query);
|
|
67
|
+
const topK = opts.topK ?? 5;
|
|
68
|
+
const minScore = opts.minScore ?? 0.1;
|
|
69
|
+
const rawResults = rag.store.search(queryEmbedding, topK);
|
|
70
|
+
return rawResults
|
|
71
|
+
.filter(r => r.score >= minScore)
|
|
72
|
+
.map(({ chunk, score }) => ({
|
|
73
|
+
title: chunk.title || 'Untitled',
|
|
74
|
+
content: chunk.text || '',
|
|
75
|
+
relevance: score,
|
|
76
|
+
sourcePath: chunk.filePath || '',
|
|
77
|
+
sourceRef: chunk.metadata?.sourceRef || undefined,
|
|
96
78
|
}));
|
|
97
79
|
}
|
|
98
80
|
catch (err) {
|
|
99
|
-
console.error('Search failed:', err);
|
|
100
81
|
throw new Error(`RAG search failed: ${err.message}`);
|
|
101
82
|
}
|
|
102
83
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
this.
|
|
108
|
-
return await this.indexVault();
|
|
84
|
+
async reload(onProgress) {
|
|
85
|
+
// Do NOT drop isIndexed here: index() is incremental and reloads from disk on
|
|
86
|
+
// its own, so keeping the flag true lets concurrent searches keep serving the
|
|
87
|
+
// current in-memory index instead of blocking on (or spawning) a reindex.
|
|
88
|
+
return await this.indexVault(onProgress);
|
|
109
89
|
}
|
|
110
|
-
/**
|
|
111
|
-
* Get vault statistics
|
|
112
|
-
*/
|
|
113
90
|
async getStats() {
|
|
114
91
|
return {
|
|
115
92
|
indexed: this.isIndexed,
|
|
@@ -117,73 +94,5 @@ class CuratorRagProvider {
|
|
|
117
94
|
indexPath: this.getIndexPath(),
|
|
118
95
|
};
|
|
119
96
|
}
|
|
120
|
-
/**
|
|
121
|
-
* Create MCP tool for search
|
|
122
|
-
*/
|
|
123
|
-
createSearchTool() {
|
|
124
|
-
return {
|
|
125
|
-
name: 'knowledge_search',
|
|
126
|
-
description: 'Search the vault using semantic search (RAG). Returns relevant notes based on your query.',
|
|
127
|
-
inputSchema: {
|
|
128
|
-
type: 'object',
|
|
129
|
-
properties: {
|
|
130
|
-
query: {
|
|
131
|
-
type: 'string',
|
|
132
|
-
description: 'Search query (natural language)',
|
|
133
|
-
},
|
|
134
|
-
topK: {
|
|
135
|
-
type: 'number',
|
|
136
|
-
description: 'Number of results to return (default: 5)',
|
|
137
|
-
},
|
|
138
|
-
},
|
|
139
|
-
required: ['query'],
|
|
140
|
-
},
|
|
141
|
-
handler: async (args) => {
|
|
142
|
-
try {
|
|
143
|
-
const results = await this.search(args.query, { topK: args.topK });
|
|
144
|
-
return JSON.stringify({
|
|
145
|
-
query: args.query,
|
|
146
|
-
results,
|
|
147
|
-
count: results.length,
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
catch (err) {
|
|
151
|
-
return JSON.stringify({
|
|
152
|
-
error: err.message,
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Create MCP tool for reload
|
|
160
|
-
*/
|
|
161
|
-
createReloadTool() {
|
|
162
|
-
return {
|
|
163
|
-
name: 'knowledge_reload',
|
|
164
|
-
description: 'Reload and reindex the vault. Call this after external changes to the vault.',
|
|
165
|
-
inputSchema: {
|
|
166
|
-
type: 'object',
|
|
167
|
-
properties: {},
|
|
168
|
-
required: [],
|
|
169
|
-
},
|
|
170
|
-
handler: async () => {
|
|
171
|
-
try {
|
|
172
|
-
const result = await this.reload();
|
|
173
|
-
return JSON.stringify({
|
|
174
|
-
success: true,
|
|
175
|
-
indexed: result.indexed,
|
|
176
|
-
updated: result.updated,
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
catch (err) {
|
|
180
|
-
return JSON.stringify({
|
|
181
|
-
error: err.message,
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
},
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
97
|
}
|
|
188
|
-
exports.CuratorRagProvider = CuratorRagProvider;
|
|
189
98
|
//# sourceMappingURL=rag-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rag-provider.js","sourceRoot":"","sources":["../../src/knowledge/rag-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rag-provider.js","sourceRoot":"","sources":["../../src/knowledge/rag-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Knowledge Synthesis Engine
|
|
3
|
-
* Generates synthetic notes from search results and base notes
|
|
4
|
-
*/
|
|
5
1
|
import type { CuratorLLMProvider } from '../providers/types.js';
|
|
6
2
|
import type { RagSearchResult } from './rag-provider.js';
|
|
7
3
|
export interface SynthesizedNote {
|
|
@@ -15,13 +11,7 @@ export declare class KnowledgeSynthesizer {
|
|
|
15
11
|
private provider;
|
|
16
12
|
private vaultPath;
|
|
17
13
|
constructor(provider: CuratorLLMProvider, vaultPath: string);
|
|
18
|
-
/**
|
|
19
|
-
* Generate a synthetic note from search results
|
|
20
|
-
*/
|
|
21
14
|
synthesize(query: string, searchResults: RagSearchResult[]): Promise<SynthesizedNote | null>;
|
|
22
|
-
/**
|
|
23
|
-
* Save synthesized note to vault
|
|
24
|
-
*/
|
|
25
15
|
saveNote(note: SynthesizedNote, domainFolder?: string): Promise<string | null>;
|
|
26
16
|
}
|
|
27
17
|
//# sourceMappingURL=synthesis.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synthesis.d.ts","sourceRoot":"","sources":["../../src/knowledge/synthesis.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"synthesis.d.ts","sourceRoot":"","sources":["../../src/knowledge/synthesis.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACvB;AAmBD,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,SAAS,CAAS;gBAEd,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM;IAKrD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAqC5F,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,YAAY,GAAE,MAAoB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA4CpG"}
|
|
@@ -1,82 +1,44 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
-
}) : function(o, v) {
|
|
20
|
-
o["default"] = v;
|
|
21
|
-
});
|
|
22
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
-
var ownKeys = function(o) {
|
|
24
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
-
var ar = [];
|
|
26
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
|
-
return ownKeys(o);
|
|
30
|
-
};
|
|
31
|
-
return function (mod) {
|
|
32
|
-
if (mod && mod.__esModule) return mod;
|
|
33
|
-
var result = {};
|
|
34
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
-
__setModuleDefault(result, mod);
|
|
36
|
-
return result;
|
|
37
|
-
};
|
|
38
|
-
})();
|
|
39
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
-
exports.KnowledgeSynthesizer = void 0;
|
|
41
|
-
const fs = __importStar(require("node:fs/promises"));
|
|
42
|
-
const path = __importStar(require("node:path"));
|
|
43
|
-
const SYNTHESIS_PROMPT = `You are a knowledge synthesis expert.
|
|
44
|
-
|
|
45
|
-
Given a search query and relevant documents from a vault, generate a comprehensive synthetic note that:
|
|
46
|
-
1. Directly answers the query
|
|
47
|
-
2. Integrates insights from multiple documents
|
|
48
|
-
3. Adds clarifying context and practical examples
|
|
49
|
-
4. Is self-contained (reader doesn't need originals)
|
|
50
|
-
5. Uses markdown with ## headings
|
|
51
|
-
|
|
52
|
-
Query: {query}
|
|
53
|
-
|
|
54
|
-
Relevant Documents:
|
|
55
|
-
{documents}
|
|
56
|
-
|
|
57
|
-
Generate a markdown note that synthesizes these documents into a helpful guide.
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
const SYNTHESIS_PROMPT = `You are a knowledge synthesis expert.
|
|
4
|
+
|
|
5
|
+
Given a search query and relevant documents from a vault, generate a comprehensive synthetic note that:
|
|
6
|
+
1. Directly answers the query
|
|
7
|
+
2. Integrates insights from multiple documents
|
|
8
|
+
3. Adds clarifying context and practical examples
|
|
9
|
+
4. Is self-contained (reader doesn't need originals)
|
|
10
|
+
5. Uses markdown with ## headings
|
|
11
|
+
|
|
12
|
+
Query: {query}
|
|
13
|
+
|
|
14
|
+
Relevant Documents:
|
|
15
|
+
{documents}
|
|
16
|
+
|
|
17
|
+
Generate a markdown note that synthesizes these documents into a helpful guide.
|
|
58
18
|
Return ONLY the markdown content, no frontmatter.`;
|
|
59
|
-
class KnowledgeSynthesizer {
|
|
19
|
+
export class KnowledgeSynthesizer {
|
|
60
20
|
provider;
|
|
61
21
|
vaultPath;
|
|
62
22
|
constructor(provider, vaultPath) {
|
|
63
23
|
this.provider = provider;
|
|
64
24
|
this.vaultPath = vaultPath;
|
|
65
25
|
}
|
|
66
|
-
/**
|
|
67
|
-
* Generate a synthetic note from search results
|
|
68
|
-
*/
|
|
69
26
|
async synthesize(query, searchResults) {
|
|
70
|
-
if (searchResults.length === 0)
|
|
27
|
+
if (searchResults.length === 0)
|
|
71
28
|
return null;
|
|
72
|
-
}
|
|
73
|
-
// Build prompt
|
|
74
29
|
const documentsText = searchResults
|
|
75
30
|
.map((r, i) => `## Document ${i + 1}: ${r.title}\n\n${r.content.slice(0, 1000)}`)
|
|
76
31
|
.join('\n\n---\n\n');
|
|
77
|
-
const prompt = SYNTHESIS_PROMPT
|
|
32
|
+
const prompt = SYNTHESIS_PROMPT
|
|
33
|
+
.replace('{query}', query)
|
|
34
|
+
.replace('{documents}', documentsText);
|
|
78
35
|
try {
|
|
79
|
-
const synthesizedContent = await this.provider.complete('You are a knowledge synthesis expert. Generate high-quality markdown notes.', prompt);
|
|
36
|
+
const synthesizedContent = await this.provider.complete('You are a knowledge synthesis expert. Generate high-quality markdown notes.', prompt, { json: false });
|
|
37
|
+
// Guard against empty/whitespace responses — don't save a blank synthesis note.
|
|
38
|
+
if (!synthesizedContent || synthesizedContent.trim().length === 0) {
|
|
39
|
+
console.error('Synthesis returned empty content — skipping note.');
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
80
42
|
return {
|
|
81
43
|
title: `${query} — Synthesis`,
|
|
82
44
|
content: synthesizedContent,
|
|
@@ -90,14 +52,10 @@ class KnowledgeSynthesizer {
|
|
|
90
52
|
return null;
|
|
91
53
|
}
|
|
92
54
|
}
|
|
93
|
-
/**
|
|
94
|
-
* Save synthesized note to vault
|
|
95
|
-
*/
|
|
96
55
|
async saveNote(note, domainFolder = 'synthesis') {
|
|
97
56
|
try {
|
|
98
57
|
const dir = path.join(this.vaultPath, domainFolder);
|
|
99
58
|
await fs.mkdir(dir, { recursive: true });
|
|
100
|
-
// Create filename from title
|
|
101
59
|
const slug = note.title
|
|
102
60
|
.toLowerCase()
|
|
103
61
|
.replace(/[^a-z0-9]+/g, '-')
|
|
@@ -105,26 +63,24 @@ class KnowledgeSynthesizer {
|
|
|
105
63
|
const date = new Date().toISOString().slice(0, 10);
|
|
106
64
|
const filename = `${date}-${slug}-v${note.synthesisVersion}.md`;
|
|
107
65
|
const filePath = path.join(dir, filename);
|
|
108
|
-
// Check if exists
|
|
109
66
|
try {
|
|
110
67
|
await fs.access(filePath);
|
|
111
|
-
return null;
|
|
68
|
+
return null;
|
|
112
69
|
}
|
|
113
70
|
catch {
|
|
114
|
-
//
|
|
71
|
+
// doesn't exist — proceed
|
|
115
72
|
}
|
|
116
|
-
// Build frontmatter
|
|
117
73
|
const frontmatter = [
|
|
118
74
|
'---',
|
|
119
75
|
`title: "${note.title.replace(/"/g, '\\"')}"`,
|
|
120
76
|
'area: synthesis',
|
|
121
77
|
'tipo: synthesis',
|
|
122
|
-
|
|
78
|
+
'generated_by: knowledge-agent',
|
|
123
79
|
`synthesis_version: ${note.synthesisVersion}`,
|
|
124
80
|
`based_on: [${note.basedOn.map(b => `"${b}"`).join(', ')}]`,
|
|
125
81
|
`date: ${new Date().toISOString().slice(0, 10)}`,
|
|
126
82
|
'author: "agent/codex"',
|
|
127
|
-
|
|
83
|
+
'tags: ["synthesis", "generated"]',
|
|
128
84
|
'---',
|
|
129
85
|
'',
|
|
130
86
|
note.content,
|
|
@@ -138,5 +94,4 @@ class KnowledgeSynthesizer {
|
|
|
138
94
|
}
|
|
139
95
|
}
|
|
140
96
|
}
|
|
141
|
-
exports.KnowledgeSynthesizer = KnowledgeSynthesizer;
|
|
142
97
|
//# sourceMappingURL=synthesis.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synthesis.js","sourceRoot":"","sources":["../../src/knowledge/synthesis.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"synthesis.js","sourceRoot":"","sources":["../../src/knowledge/synthesis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAYlC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;kDAeyB,CAAC;AAEnD,MAAM,OAAO,oBAAoB;IACrB,QAAQ,CAAqB;IAC7B,SAAS,CAAS;IAE1B,YAAY,QAA4B,EAAE,SAAiB;QACvD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,aAAgC;QAC5D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5C,MAAM,aAAa,GAAG,aAAa;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;aAChF,IAAI,CAAC,aAAa,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAG,gBAAgB;aAC1B,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC;aACzB,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QAE3C,IAAI,CAAC;YACD,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACnD,6EAA6E,EAC7E,MAAM,EACN,EAAE,IAAI,EAAE,KAAK,EAAE,CAClB,CAAC;YAEF,gFAAgF;YAChF,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChE,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACnE,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,OAAO;gBACH,KAAK,EAAE,GAAG,KAAK,cAAc;gBAC7B,OAAO,EAAE,kBAAkB;gBAC3B,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gBACxC,gBAAgB,EAAE,CAAC;gBACnB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACxC,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAqB,EAAE,eAAuB,WAAW;QACpE,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;iBAClB,WAAW,EAAE;iBACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;iBAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAElB,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,gBAAgB,KAAK,CAAC;YAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAE1C,IAAI,CAAC;gBACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACL,0BAA0B;YAC9B,CAAC;YAED,MAAM,WAAW,GAAG;gBAChB,KAAK;gBACL,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG;gBAC7C,iBAAiB;gBACjB,iBAAiB;gBACjB,+BAA+B;gBAC/B,sBAAsB,IAAI,CAAC,gBAAgB,EAAE;gBAC7C,cAAc,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBAC3D,SAAS,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;gBAChD,uBAAuB;gBACvB,kCAAkC;gBAClC,KAAK;gBACL,EAAE;gBACF,IAAI,CAAC,OAAO;aACf,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,QAAQ,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface EmbedderProgress {
|
|
2
|
+
status: 'initiate' | 'downloading' | 'done' | 'ready' | string;
|
|
3
|
+
file?: string;
|
|
4
|
+
progress?: number;
|
|
5
|
+
loaded?: number;
|
|
6
|
+
total?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Embedder backed by a pool of worker threads (see embedder-worker.ts). The
|
|
10
|
+
* transformers.js model inference is CPU-bound and single-threaded per worker;
|
|
11
|
+
* running it off the main thread keeps the MCP server responsive to search_vault
|
|
12
|
+
* while a reindex embeds in background.
|
|
13
|
+
*
|
|
14
|
+
* Two things that matter under concurrent load from multiple callers:
|
|
15
|
+
* - **Pool, not one worker.** A single worker serializes every embed() behind
|
|
16
|
+
* one CPU-bound thread — concurrent callers just queue. A bounded pool
|
|
17
|
+
* (CODEX_EMBED_WORKERS, default 2, capped at os.cpus().length) lets that many
|
|
18
|
+
* embed batches actually run in parallel instead.
|
|
19
|
+
* - **Micro-batching.** embed() calls made within a short window (CODEX_EMBED_BATCH_MS,
|
|
20
|
+
* default 8ms — not just the same event-loop tick) are merged and split across the
|
|
21
|
+
* pool (see flushBatch()), amortizing the model's fixed per-call overhead across
|
|
22
|
+
* calls that arrive close together but not perfectly simultaneously.
|
|
23
|
+
*/
|
|
24
|
+
export declare class TransformersEmbedder {
|
|
25
|
+
readonly model: string;
|
|
26
|
+
private readonly quantized;
|
|
27
|
+
private readonly poolSize;
|
|
28
|
+
private readonly batchWindowMs;
|
|
29
|
+
private slots;
|
|
30
|
+
private seq;
|
|
31
|
+
private progressCb?;
|
|
32
|
+
private batchQueue;
|
|
33
|
+
private batchScheduled;
|
|
34
|
+
constructor(modelId?: string, poolSize?: number, batchWindowMs?: number);
|
|
35
|
+
private ensurePool;
|
|
36
|
+
private spawnWorker;
|
|
37
|
+
/** Keep the process alive while this worker has requests in flight, release it when idle. */
|
|
38
|
+
private updateRef;
|
|
39
|
+
/** Least-busy routing — picks the slot with the fewest in-flight requests. */
|
|
40
|
+
private pickSlot;
|
|
41
|
+
private request;
|
|
42
|
+
/**
|
|
43
|
+
* Warms up every worker in the pool so the first real embed() isn't the one
|
|
44
|
+
* paying model-load cost. The first worker inits alone (it may need to
|
|
45
|
+
* download the model); once cached to disk, the rest init in parallel since
|
|
46
|
+
* loading a cached model is fast and safe to parallelize.
|
|
47
|
+
*/
|
|
48
|
+
init(onProgress?: (info: EmbedderProgress) => void): Promise<{
|
|
49
|
+
alreadyCached: boolean;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* Embeds a batch of texts. Calls made within batchWindowMs of each other are
|
|
53
|
+
* merged into shared worker requests — see flushBatch().
|
|
54
|
+
*/
|
|
55
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
56
|
+
embedOne(text: string): Promise<number[]>;
|
|
57
|
+
private flushBatch;
|
|
58
|
+
private splitIntoChunks;
|
|
59
|
+
private runChunk;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=transformers-embedder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers-embedder.d.ts","sourceRoot":"","sources":["../../src/knowledge/transformers-embedder.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AA+CD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,oBAAoB;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,UAAU,CAAC,CAAmC;IAEtD,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,cAAc,CAAS;gBAEnB,OAAO,SAA+B,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;IAa7F,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,WAAW;IAoCnB,6FAA6F;IAC7F,OAAO,CAAC,SAAS;IAKjB,8EAA8E;IAC9E,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,OAAO;IAWf;;;;;OAKG;IACG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,CAAC;IAgB9F;;;OAGG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAW3C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAOjC,UAAU;IAmBxB,OAAO,CAAC,eAAe;YAMT,QAAQ;CAqBzB"}
|