@backendkit-labs/curator-codex-agent 0.2.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/analyzer.d.ts +1 -17
  2. package/dist/analyzer.d.ts.map +1 -1
  3. package/dist/analyzer.js +80 -163
  4. package/dist/analyzer.js.map +1 -1
  5. package/dist/audit.d.ts +27 -0
  6. package/dist/audit.d.ts.map +1 -0
  7. package/dist/audit.js +43 -0
  8. package/dist/audit.js.map +1 -0
  9. package/dist/checksum.d.ts +0 -22
  10. package/dist/checksum.d.ts.map +1 -1
  11. package/dist/checksum.js +14 -103
  12. package/dist/checksum.js.map +1 -1
  13. package/dist/documentation-curator.d.ts +1 -1
  14. package/dist/documentation-curator.d.ts.map +1 -1
  15. package/dist/documentation-curator.js +79 -95
  16. package/dist/documentation-curator.js.map +1 -1
  17. package/dist/index.d.ts +19 -9
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +12 -22
  20. package/dist/index.js.map +1 -1
  21. package/dist/knowledge/embedder-worker.d.ts +2 -0
  22. package/dist/knowledge/embedder-worker.d.ts.map +1 -0
  23. package/dist/knowledge/embedder-worker.js +55 -0
  24. package/dist/knowledge/embedder-worker.js.map +1 -0
  25. package/dist/knowledge/engine.d.ts +10 -56
  26. package/dist/knowledge/engine.d.ts.map +1 -1
  27. package/dist/knowledge/engine.js +42 -153
  28. package/dist/knowledge/engine.js.map +1 -1
  29. package/dist/knowledge/rag-provider.d.ts +14 -56
  30. package/dist/knowledge/rag-provider.d.ts.map +1 -1
  31. package/dist/knowledge/rag-provider.js +63 -154
  32. package/dist/knowledge/rag-provider.js.map +1 -1
  33. package/dist/knowledge/synthesis.d.ts +0 -10
  34. package/dist/knowledge/synthesis.d.ts.map +1 -1
  35. package/dist/knowledge/synthesis.js +32 -77
  36. package/dist/knowledge/synthesis.js.map +1 -1
  37. package/dist/knowledge/transformers-embedder.d.ts +61 -0
  38. package/dist/knowledge/transformers-embedder.d.ts.map +1 -0
  39. package/dist/knowledge/transformers-embedder.js +222 -0
  40. package/dist/knowledge/transformers-embedder.js.map +1 -0
  41. package/dist/pdf-reader.d.ts +11 -0
  42. package/dist/pdf-reader.d.ts.map +1 -0
  43. package/dist/pdf-reader.js +21 -0
  44. package/dist/pdf-reader.js.map +1 -0
  45. package/dist/project.d.ts +28 -0
  46. package/dist/project.d.ts.map +1 -0
  47. package/dist/project.js +88 -0
  48. package/dist/project.js.map +1 -0
  49. package/dist/providers/anthropic-adapter.d.ts +2 -2
  50. package/dist/providers/anthropic-adapter.d.ts.map +1 -1
  51. package/dist/providers/anthropic-adapter.js +7 -13
  52. package/dist/providers/anthropic-adapter.js.map +1 -1
  53. package/dist/providers/index.d.ts +1 -1
  54. package/dist/providers/index.d.ts.map +1 -1
  55. package/dist/providers/index.js +13 -20
  56. package/dist/providers/index.js.map +1 -1
  57. package/dist/providers/openai-adapter.d.ts +2 -2
  58. package/dist/providers/openai-adapter.d.ts.map +1 -1
  59. package/dist/providers/openai-adapter.js +7 -13
  60. package/dist/providers/openai-adapter.js.map +1 -1
  61. package/dist/providers/types.d.ts +8 -1
  62. package/dist/providers/types.d.ts.map +1 -1
  63. package/dist/providers/types.js +1 -2
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/types.js +1 -3
  66. package/dist/types.js.map +1 -1
  67. package/dist/vault-dedup.d.ts +35 -0
  68. package/dist/vault-dedup.d.ts.map +1 -0
  69. package/dist/vault-dedup.js +130 -0
  70. package/dist/vault-dedup.js.map +1 -0
  71. package/package.json +43 -56
  72. package/AGENT.md +0 -187
  73. package/README.md +0 -475
  74. package/dist/api/config.d.ts +0 -57
  75. package/dist/api/config.d.ts.map +0 -1
  76. package/dist/api/config.js +0 -183
  77. package/dist/api/config.js.map +0 -1
  78. package/dist/api/http-server.d.ts +0 -24
  79. package/dist/api/http-server.d.ts.map +0 -1
  80. package/dist/api/http-server.js +0 -108
  81. package/dist/api/http-server.js.map +0 -1
  82. package/dist/api/routes.d.ts +0 -8
  83. package/dist/api/routes.d.ts.map +0 -1
  84. package/dist/api/routes.js +0 -382
  85. package/dist/api/routes.js.map +0 -1
  86. package/dist/api/security.d.ts +0 -107
  87. package/dist/api/security.d.ts.map +0 -1
  88. package/dist/api/security.js +0 -200
  89. package/dist/api/security.js.map +0 -1
  90. package/dist/http-server-main.d.ts +0 -28
  91. package/dist/http-server-main.d.ts.map +0 -1
  92. package/dist/http-server-main.js +0 -69
  93. package/dist/http-server-main.js.map +0 -1
  94. package/dist/server.d.ts +0 -33
  95. package/dist/server.d.ts.map +0 -1
  96. package/dist/server.js +0 -640
  97. package/dist/server.js.map +0 -1
  98. package/dist/watcher.d.ts +0 -26
  99. package/dist/watcher.d.ts.map +0 -1
  100. package/dist/watcher.js +0 -168
  101. package/dist/watcher.js.map +0 -1
@@ -1,115 +1,92 @@
1
- "use strict";
2
- /**
3
- * RAG Provider for Curator-Codex
4
- * Wraps ObsidianRAGProvider with semantic search capabilities
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.rag = new agent_enterprise_1.ObsidianRAGProvider({
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: new agent_enterprise_1.SimpleEmbedder(),
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
- const homeDir = process.env.HOME || process.env.USERPROFILE || '/tmp';
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
- * Index the vault (loads all notes and creates embeddings)
63
- */
64
- async indexVault() {
65
- try {
66
- const result = await this.rag.index({ verbose: false });
67
- this.isIndexed = true;
68
- return result;
69
- }
70
- catch (err) {
71
- console.error('Failed to index vault:', err);
72
- throw new Error(`RAG indexing failed: ${err.message}`);
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
- const results = await this.rag.search(query, {
84
- topK: opts.topK || 5,
85
- minScore: opts.minScore || 0.1,
86
- });
87
- if (!Array.isArray(results)) {
88
- return [];
89
- }
90
- return results.map((r) => ({
91
- title: r.title || 'Untitled',
92
- content: r.content || r.text || '',
93
- relevance: r.score || r.relevance || 0,
94
- sourcePath: r.path || r.source || '',
95
- sourceRef: r.sourceRef || undefined,
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
- * Reload/reindex the vault
105
- */
106
- async reload() {
107
- this.isIndexed = false;
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":"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"}
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":"AAAA;;;GAGG;AAIH,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;IAK3D;;OAEG;IACG,UAAU,CACZ,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,eAAe,EAAE,GACjC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAqClC;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,YAAY,GAAE,MAAoB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA+CpG"}
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
- "use strict";
2
- /**
3
- * Knowledge Synthesis Engine
4
- * Generates synthetic notes from search results and base notes
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.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.replace('{query}', query).replace('{documents}', documentsText);
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; // Already exists
68
+ return null;
112
69
  }
113
70
  catch {
114
- // Doesn't exist, proceed
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
- `generated_by: knowledge-agent`,
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
- `tags: ["synthesis", "generated"]`,
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":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,qDAAuC;AACvC,gDAAkC;AAYlC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;kDAeyB,CAAC;AAEnD,MAAa,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;;OAEG;IACH,KAAK,CAAC,UAAU,CACZ,KAAa,EACb,aAAgC;QAEhC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,eAAe;QACf,MAAM,aAAa,GAAG,aAAa;aAC9B,GAAG,CACA,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACL,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CACxE;aACA,IAAI,CAAC,aAAa,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,OAAO,CAC7D,aAAa,EACb,aAAa,CAChB,CAAC;QAEF,IAAI,CAAC;YACD,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACnD,6EAA6E,EAC7E,MAAM,CACT,CAAC;YAEF,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;;OAEG;IACH,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,6BAA6B;YAC7B,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,kBAAkB;YAClB,IAAI,CAAC;gBACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1B,OAAO,IAAI,CAAC,CAAC,iBAAiB;YAClC,CAAC;YAAC,MAAM,CAAC;gBACL,yBAAyB;YAC7B,CAAC;YAED,oBAAoB;YACpB,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;AAtGD,oDAsGC"}
1
+ {"version":3,"file":"synthesis.js","sourceRoot":"","sources":["../../src/knowledge/synthesis.ts"],"names":[],"mappings":"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"}
@@ -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"}