@backendkit-labs/curator-codex-agent 0.2.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 (79) hide show
  1. package/AGENT.md +187 -0
  2. package/README.md +475 -0
  3. package/dist/analyzer.d.ts +44 -0
  4. package/dist/analyzer.d.ts.map +1 -0
  5. package/dist/analyzer.js +381 -0
  6. package/dist/analyzer.js.map +1 -0
  7. package/dist/api/config.d.ts +57 -0
  8. package/dist/api/config.d.ts.map +1 -0
  9. package/dist/api/config.js +183 -0
  10. package/dist/api/config.js.map +1 -0
  11. package/dist/api/http-server.d.ts +24 -0
  12. package/dist/api/http-server.d.ts.map +1 -0
  13. package/dist/api/http-server.js +108 -0
  14. package/dist/api/http-server.js.map +1 -0
  15. package/dist/api/routes.d.ts +8 -0
  16. package/dist/api/routes.d.ts.map +1 -0
  17. package/dist/api/routes.js +382 -0
  18. package/dist/api/routes.js.map +1 -0
  19. package/dist/api/security.d.ts +107 -0
  20. package/dist/api/security.d.ts.map +1 -0
  21. package/dist/api/security.js +200 -0
  22. package/dist/api/security.js.map +1 -0
  23. package/dist/checksum.d.ts +56 -0
  24. package/dist/checksum.d.ts.map +1 -0
  25. package/dist/checksum.js +186 -0
  26. package/dist/checksum.js.map +1 -0
  27. package/dist/documentation-curator.d.ts +18 -0
  28. package/dist/documentation-curator.d.ts.map +1 -0
  29. package/dist/documentation-curator.js +231 -0
  30. package/dist/documentation-curator.js.map +1 -0
  31. package/dist/http-server-main.d.ts +28 -0
  32. package/dist/http-server-main.d.ts.map +1 -0
  33. package/dist/http-server-main.js +69 -0
  34. package/dist/http-server-main.js.map +1 -0
  35. package/dist/index.d.ts +16 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +23 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/knowledge/engine.d.ts +90 -0
  40. package/dist/knowledge/engine.d.ts.map +1 -0
  41. package/dist/knowledge/engine.js +181 -0
  42. package/dist/knowledge/engine.js.map +1 -0
  43. package/dist/knowledge/rag-provider.d.ts +87 -0
  44. package/dist/knowledge/rag-provider.d.ts.map +1 -0
  45. package/dist/knowledge/rag-provider.js +189 -0
  46. package/dist/knowledge/rag-provider.js.map +1 -0
  47. package/dist/knowledge/synthesis.d.ts +27 -0
  48. package/dist/knowledge/synthesis.d.ts.map +1 -0
  49. package/dist/knowledge/synthesis.js +142 -0
  50. package/dist/knowledge/synthesis.js.map +1 -0
  51. package/dist/providers/anthropic-adapter.d.ts +14 -0
  52. package/dist/providers/anthropic-adapter.d.ts.map +1 -0
  53. package/dist/providers/anthropic-adapter.js +29 -0
  54. package/dist/providers/anthropic-adapter.js.map +1 -0
  55. package/dist/providers/index.d.ts +14 -0
  56. package/dist/providers/index.d.ts.map +1 -0
  57. package/dist/providers/index.js +29 -0
  58. package/dist/providers/index.js.map +1 -0
  59. package/dist/providers/openai-adapter.d.ts +16 -0
  60. package/dist/providers/openai-adapter.d.ts.map +1 -0
  61. package/dist/providers/openai-adapter.js +37 -0
  62. package/dist/providers/openai-adapter.js.map +1 -0
  63. package/dist/providers/types.d.ts +4 -0
  64. package/dist/providers/types.d.ts.map +1 -0
  65. package/dist/providers/types.js +3 -0
  66. package/dist/providers/types.js.map +1 -0
  67. package/dist/server.d.ts +33 -0
  68. package/dist/server.d.ts.map +1 -0
  69. package/dist/server.js +640 -0
  70. package/dist/server.js.map +1 -0
  71. package/dist/types.d.ts +41 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +4 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/watcher.d.ts +26 -0
  76. package/dist/watcher.d.ts.map +1 -0
  77. package/dist/watcher.js +168 -0
  78. package/dist/watcher.js.map +1 -0
  79. package/package.json +58 -0
@@ -0,0 +1,381 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CodeAnalyzer = void 0;
37
+ const fs = __importStar(require("node:fs/promises"));
38
+ const path = __importStar(require("node:path"));
39
+ const zod_1 = require("zod");
40
+ const documentation_curator_js_1 = require("./documentation-curator.js");
41
+ // Zod schema for code analysis response
42
+ const CodeAnalysisNoteSchema = zod_1.z.object({
43
+ type: zod_1.z.enum(['componente', 'api', 'patron', 'utilidad', 'arquitectura', 'integracion']),
44
+ area: zod_1.z.enum(['general', 'backend', 'frontend', 'devops', 'infraestructura']),
45
+ title: zod_1.z.string().max(120),
46
+ resumen: zod_1.z.string().max(500),
47
+ content: zod_1.z.string(),
48
+ tags: zod_1.z.array(zod_1.z.string()),
49
+ vigente_desde: zod_1.z.string().optional(),
50
+ version: zod_1.z.number().optional(),
51
+ expires_at: zod_1.z.string().optional(),
52
+ depends_on: zod_1.z.array(zod_1.z.string()).optional(),
53
+ exports: zod_1.z.array(zod_1.z.string()).optional(),
54
+ language: zod_1.z.string().optional(),
55
+ files: zod_1.z.array(zod_1.z.string()).optional(),
56
+ });
57
+ const CodeAnalysisResponseSchema = zod_1.z.object({
58
+ notes: zod_1.z.array(CodeAnalysisNoteSchema),
59
+ });
60
+ // System prompt for code analysis
61
+ const SYSTEM_PROMPT = `\
62
+ You are a Code Knowledge Extractor for enterprise vaults.
63
+ Your task: analyze source code files WITH associated documentation and extract structured knowledge.
64
+
65
+ IMPORTANT: Return ONLY a valid JSON object — no markdown, no prose, no code fences.
66
+
67
+ Schema (return exactly this shape):
68
+ {
69
+ "notes": [
70
+ {
71
+ "type": "componente" | "api" | "patron" | "utilidad" | "arquitectura" | "integracion",
72
+ "area": "general" | "backend" | "frontend" | "devops" | "infraestructura",
73
+ "title": string, // Specific and searchable. Max 120 chars.
74
+ "resumen": string, // 1-2 sentences DENSE with key terms, types, functions.
75
+ "content": string, // Markdown with ## sections. Extract APIs, types, examples.
76
+ "tags": string[], // e.g. ["code/typescript", "modulo/auth", "patron/jwt"]
77
+ "language": string, // typescript, javascript, python, go, rust, etc
78
+ "files": string[], // Relative paths of analyzed files
79
+ "depends_on": string[], // External dependencies or modules
80
+ "exports": string[], // Public APIs, functions, classes
81
+ "version": number // optional, if versioned
82
+ }
83
+ ]
84
+ }
85
+
86
+ Rules:
87
+ - Extract PUBLIC APIs only (not private/internal implementation).
88
+ - Include TypeScript interfaces, type definitions, main classes.
89
+ - Focus on WHAT the code does, HOW to use it, what it exports.
90
+ - Each note must be self-contained — a reader should not need the original code.
91
+ - "resumen" must contain searchable terms: function names, types, patterns.
92
+ - "content" must use ## headings. Include usage examples from comments or docs.
93
+ - "exports" lists public functions, classes, interfaces.
94
+ - "depends_on" lists external libraries or internal modules this depends on.
95
+ - If code has associated documentation (.md file), integrate it into the analysis.
96
+ - If no enterprise relevance, return { "notes": [] }.`;
97
+ // Supported code extensions
98
+ const CODE_EXTENSIONS = [
99
+ '.ts', '.tsx', '.js', '.jsx', '.py', '.go', '.rs', '.java', '.c', '.cpp', '.kt', '.swift',
100
+ ];
101
+ function getLanguage(filePath) {
102
+ const ext = path.extname(filePath).toLowerCase();
103
+ const langMap = {
104
+ '.ts': 'typescript', '.tsx': 'typescript',
105
+ '.js': 'javascript', '.jsx': 'javascript',
106
+ '.py': 'python',
107
+ '.go': 'go',
108
+ '.rs': 'rust',
109
+ '.java': 'java',
110
+ '.c': 'c',
111
+ '.cpp': 'cpp',
112
+ '.kt': 'kotlin',
113
+ '.swift': 'swift',
114
+ };
115
+ return langMap[ext] || ext.slice(1);
116
+ }
117
+ function slugify(title) {
118
+ return title
119
+ .toLowerCase()
120
+ .normalize('NFD')
121
+ .replace(/[̀-ͯ]/g, '')
122
+ .replace(/[^a-z0-9\s-]/g, '')
123
+ .trim()
124
+ .replace(/\s+/g, '-')
125
+ .slice(0, 60);
126
+ }
127
+ function buildFrontmatter(note, source, date, sourcesCombined) {
128
+ const tagsLine = `[${note.tags.map(t => `"${t}"`).join(', ')}]`;
129
+ const lines = [
130
+ '---',
131
+ `title: "${note.title.replace(/"/g, '\\"')}"`,
132
+ `area: ${note.area}`,
133
+ `tipo: ${note.type}`,
134
+ `language: ${note.language || 'unknown'}`,
135
+ `resumen: "${note.resumen.replace(/"/g, '\\"')}"`,
136
+ `author: "agent/codex"`,
137
+ `date: ${date}`,
138
+ `source_ref: "${source}"`,
139
+ `tags: ${tagsLine}`,
140
+ ];
141
+ if (sourcesCombined && sourcesCombined.length > 0) {
142
+ const sources = sourcesCombined.map(s => `"${s}"`).join(', ');
143
+ lines.push(`sources_combined: [${sources}]`);
144
+ }
145
+ if (note.version)
146
+ lines.push(`version: ${note.version}`);
147
+ if (note.depends_on?.length) {
148
+ lines.push(`depends_on: [${note.depends_on.map(d => `"${d}"`).join(', ')}]`);
149
+ }
150
+ if (note.exports?.length) {
151
+ lines.push(`exports: [${note.exports.map(e => `"${e}"`).join(', ')}]`);
152
+ }
153
+ if (note.files?.length) {
154
+ lines.push(`files: [${note.files.map(f => `"${f}"`).join(', ')}]`);
155
+ }
156
+ lines.push('---', '', note.content);
157
+ return lines.join('\n');
158
+ }
159
+ class CodeAnalyzer {
160
+ provider;
161
+ vaultPath;
162
+ maxInputChars;
163
+ docCurator;
164
+ constructor(opts) {
165
+ this.provider = opts.provider;
166
+ this.vaultPath = opts.vaultPath;
167
+ this.maxInputChars = opts.maxInputChars ?? 20_000;
168
+ this.docCurator = new documentation_curator_js_1.DocumentationCurator({
169
+ provider: opts.provider,
170
+ vaultPath: opts.vaultPath,
171
+ });
172
+ }
173
+ /**
174
+ * Find documentation files associated with a code file
175
+ */
176
+ async findAssociatedDocs(filePath, allFiles) {
177
+ const basename = path.basename(filePath, path.extname(filePath));
178
+ const dirname = path.dirname(filePath);
179
+ const result = { codeFile: filePath };
180
+ // 1. Search for .md with same name
181
+ const mdFile = allFiles.find(f => f.fullPath === path.join(dirname, `${basename}.md`));
182
+ if (mdFile)
183
+ result.docFile = mdFile.fullPath;
184
+ // 2. Search for README.md in same directory
185
+ const readmeFile = allFiles.find(f => f.fullPath === path.join(dirname, 'README.md'));
186
+ if (readmeFile)
187
+ result.readmeFile = readmeFile.fullPath;
188
+ // 3. Search in docs/ folder with similar name
189
+ if (!result.docFile) {
190
+ const docsFile = allFiles.find(f => f.relativePath.includes('docs/') && f.relativePath.includes(basename) && f.relativePath.endsWith('.md'));
191
+ if (docsFile)
192
+ result.docFile = docsFile.fullPath;
193
+ }
194
+ // 4. Search for root README.md
195
+ if (!result.contextFile) {
196
+ const globalReadme = allFiles.find(f => f.relativePath === 'README.md');
197
+ if (globalReadme)
198
+ result.contextFile = globalReadme.fullPath;
199
+ }
200
+ return result;
201
+ }
202
+ /**
203
+ * Analyze a file (code or documentation) with unified dispatcher
204
+ */
205
+ async analyzeFile(filePath, relativePath, allFiles) {
206
+ // Detect file type and route accordingly
207
+ if (this.isDocFile(filePath)) {
208
+ return await this.analyzeDocumentation(filePath, relativePath);
209
+ }
210
+ else {
211
+ return await this.analyzeCode(filePath, relativePath, allFiles);
212
+ }
213
+ }
214
+ /**
215
+ * Analyze a code file with optional associated documentation
216
+ */
217
+ async analyzeCode(filePath, relativePath, allFiles) {
218
+ const start = Date.now();
219
+ const result = {
220
+ notesWritten: [],
221
+ notesSkipped: [],
222
+ errors: [],
223
+ durationMs: 0,
224
+ filesAnalyzed: [relativePath],
225
+ };
226
+ // Read code file
227
+ let code;
228
+ try {
229
+ code = await fs.readFile(filePath, 'utf-8');
230
+ }
231
+ catch (err) {
232
+ result.errors.push(`Cannot read file: ${err.message}`);
233
+ result.durationMs = Date.now() - start;
234
+ return result;
235
+ }
236
+ // Find associated documentation
237
+ let context = {
238
+ fullPath: filePath,
239
+ relativePath,
240
+ language: getLanguage(filePath),
241
+ codeContent: code,
242
+ };
243
+ if (allFiles) {
244
+ const associated = await this.findAssociatedDocs(filePath, allFiles);
245
+ if (associated.docFile) {
246
+ try {
247
+ context.docContent = await fs.readFile(associated.docFile, 'utf-8');
248
+ }
249
+ catch {
250
+ // ignore if can't read doc file
251
+ }
252
+ }
253
+ if (associated.contextFile) {
254
+ try {
255
+ context.contextContent = await fs.readFile(associated.contextFile, 'utf-8');
256
+ }
257
+ catch {
258
+ // ignore if can't read context file
259
+ }
260
+ }
261
+ if (associated.readmeFile) {
262
+ try {
263
+ context.readmeContent = await fs.readFile(associated.readmeFile, 'utf-8');
264
+ }
265
+ catch {
266
+ // ignore if can't read readme
267
+ }
268
+ }
269
+ }
270
+ // Analyze with LLM
271
+ let parsed;
272
+ try {
273
+ parsed = await this.callLLM(context);
274
+ }
275
+ catch (err) {
276
+ result.errors.push(`LLM call failed: ${err.message}`);
277
+ result.durationMs = Date.now() - start;
278
+ return result;
279
+ }
280
+ if (!parsed.notes.length) {
281
+ result.errors.push('LLM returned no notes — file may not have enterprise relevance.');
282
+ result.durationMs = Date.now() - start;
283
+ return result;
284
+ }
285
+ // Write notes to vault
286
+ const date = new Date().toISOString().slice(0, 10);
287
+ const sourcesCombined = allFiles ? this.getSourcesCombined(filePath, allFiles) : [relativePath];
288
+ for (const note of parsed.notes) {
289
+ try {
290
+ const written = await this.writeNote(note, path.basename(filePath), date, sourcesCombined);
291
+ if (written === null) {
292
+ result.notesSkipped.push(note.title);
293
+ }
294
+ else {
295
+ result.notesWritten.push(written);
296
+ }
297
+ }
298
+ catch (err) {
299
+ result.errors.push(`Failed to write "${note.title}": ${err.message}`);
300
+ }
301
+ }
302
+ result.durationMs = Date.now() - start;
303
+ return result;
304
+ }
305
+ /**
306
+ * Analyze a documentation file (.md, .txt)
307
+ */
308
+ async analyzeDocumentation(filePath, relativePath) {
309
+ return await this.docCurator.curateFile(filePath);
310
+ }
311
+ /**
312
+ * Check if file is a documentation file
313
+ */
314
+ isDocFile(filePath) {
315
+ return ['.md', '.txt'].some(ext => filePath.toLowerCase().endsWith(ext));
316
+ }
317
+ // ── Private ────────────────────────────────────────────────────────────────
318
+ getSourcesCombined(filePath, allFiles) {
319
+ const basename = path.basename(filePath, path.extname(filePath));
320
+ const dirname = path.dirname(filePath);
321
+ const sources = [];
322
+ // Add the main file
323
+ const mainFile = allFiles.find(f => f.fullPath === filePath);
324
+ if (mainFile)
325
+ sources.push(mainFile.relativePath);
326
+ // Add associated doc
327
+ const docFile = allFiles.find(f => f.fullPath === path.join(dirname, `${basename}.md`));
328
+ if (docFile)
329
+ sources.push(docFile.relativePath);
330
+ // Add README if in same dir
331
+ const readmeFile = allFiles.find(f => f.fullPath === path.join(dirname, 'README.md'));
332
+ if (readmeFile)
333
+ sources.push(readmeFile.relativePath);
334
+ return sources.length > 0 ? sources : [path.basename(filePath)];
335
+ }
336
+ async callLLM(context) {
337
+ const truncated = context.codeContent.slice(0, this.maxInputChars);
338
+ let userMsg = `File: ${context.relativePath}\nLanguage: ${context.language}\n\nCODE:\n\`\`\`\n${truncated}\n\`\`\``;
339
+ if (context.docContent) {
340
+ userMsg += `\n\nASSociated Documentation:\n${context.docContent.slice(0, 5000)}`;
341
+ }
342
+ if (context.readmeContent) {
343
+ userMsg += `\n\nProject Context (README):\n${context.readmeContent.slice(0, 3000)}`;
344
+ }
345
+ const raw = await this.provider.complete(SYSTEM_PROMPT, userMsg);
346
+ const jsonStr = raw.replace(/^```(?:json)?\s*/i, '').replace(/\s*```\s*$/, '').trim();
347
+ const sanitized = jsonStr.replace(/:\s*undefined/g, ': null');
348
+ const parsed = JSON.parse(sanitized);
349
+ if (Array.isArray(parsed?.notes)) {
350
+ for (const note of parsed.notes) {
351
+ if (typeof note.resumen === 'string' && note.resumen.length > 500) {
352
+ note.resumen = note.resumen.slice(0, 497) + '…';
353
+ }
354
+ for (const key of ['version', 'depends_on', 'exports', 'language', 'files']) {
355
+ if (note[key] === null)
356
+ delete note[key];
357
+ }
358
+ }
359
+ }
360
+ return CodeAnalysisResponseSchema.parse(parsed);
361
+ }
362
+ async writeNote(note, source, date, sourcesCombined) {
363
+ const dir = path.join(this.vaultPath, note.area);
364
+ const slug = slugify(note.title);
365
+ const filename = `${date}-${slug}.md`;
366
+ const filePath = path.join(dir, filename);
367
+ try {
368
+ await fs.access(filePath);
369
+ return null; // already exists — dedup
370
+ }
371
+ catch {
372
+ // doesn't exist — proceed
373
+ }
374
+ await fs.mkdir(dir, { recursive: true });
375
+ const content = buildFrontmatter(note, source, date, sourcesCombined);
376
+ await fs.writeFile(filePath, content, 'utf-8');
377
+ return filePath;
378
+ }
379
+ }
380
+ exports.CodeAnalyzer = CodeAnalyzer;
381
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Curator-Codex API Configuration
3
+ * Manages input/output paths and runtime configuration with workspace support
4
+ */
5
+ export interface ApiConfig {
6
+ inputPath?: string;
7
+ outputPath: string;
8
+ provider: string;
9
+ model: string;
10
+ baseUrl?: string;
11
+ port: number;
12
+ }
13
+ export interface Workspace {
14
+ name: string;
15
+ inputPath: string;
16
+ outputPath: string;
17
+ description?: string;
18
+ }
19
+ export interface WorkspaceConfig {
20
+ workspaces: Workspace[];
21
+ lastUsed: string;
22
+ version: string;
23
+ }
24
+ export declare class ConfigManager {
25
+ private config;
26
+ private workspaces;
27
+ private workspaceConfigPath;
28
+ private currentWorkspaceName;
29
+ constructor(initialConfig?: Partial<ApiConfig>);
30
+ private loadWorkspaces;
31
+ private saveWorkspaces;
32
+ private validate;
33
+ getConfig(): ApiConfig;
34
+ updateConfig(partial: Partial<ApiConfig>): void;
35
+ setInputPath(path: string): void;
36
+ setOutputPath(path: string): void;
37
+ getInputPath(): string | undefined;
38
+ getOutputPath(): string;
39
+ switchWorkspace(workspaceName: string): {
40
+ success: boolean;
41
+ workspace?: Workspace;
42
+ error?: string;
43
+ };
44
+ addWorkspace(workspace: Workspace): void;
45
+ removeWorkspace(name: string): {
46
+ success: boolean;
47
+ error?: string;
48
+ };
49
+ listWorkspaces(): Workspace[];
50
+ getCurrentWorkspace(): string;
51
+ getWorkspaceInfo(): {
52
+ current: string;
53
+ available: Workspace[];
54
+ config: ApiConfig;
55
+ };
56
+ }
57
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/api/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,SAAS;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,oBAAoB,CAAqB;gBAErC,aAAa,GAAE,OAAO,CAAC,SAAS,CAAM;IAqBlD,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,QAAQ;IAMhB,SAAS,IAAI,SAAS;IAItB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IAK/C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKjC,YAAY,IAAI,MAAM,GAAG,SAAS;IAgBlC,aAAa,IAAI,MAAM;IAkBvB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAiBnG,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAKxC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IASnE,cAAc,IAAI,SAAS,EAAE;IAI7B,mBAAmB,IAAI,MAAM;IAI7B,gBAAgB,IAAI;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,SAAS,EAAE,CAAC;QACvB,MAAM,EAAE,SAAS,CAAC;KACrB;CAOJ"}
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ /**
3
+ * Curator-Codex API Configuration
4
+ * Manages input/output paths and runtime configuration with workspace support
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.ConfigManager = void 0;
41
+ const fs = __importStar(require("node:fs"));
42
+ const path = __importStar(require("node:path"));
43
+ class ConfigManager {
44
+ config;
45
+ workspaces = new Map();
46
+ workspaceConfigPath;
47
+ currentWorkspaceName = 'default';
48
+ constructor(initialConfig = {}) {
49
+ // Initialize base config from env vars
50
+ this.config = {
51
+ inputPath: initialConfig.inputPath || process.env.CURATOR_INPUT_PATH,
52
+ outputPath: initialConfig.outputPath || process.env.CURATOR_OUTPUT_PATH || '',
53
+ provider: initialConfig.provider || process.env.CURATOR_PROVIDER || 'deepseek',
54
+ model: initialConfig.model || process.env.CURATOR_MODEL || 'deepseek-reasoner',
55
+ baseUrl: initialConfig.baseUrl || process.env.CURATOR_BASE_URL,
56
+ port: initialConfig.port || parseInt(process.env.CURATOR_HTTP_PORT || '3100'),
57
+ };
58
+ // Setup workspace config path
59
+ const bkAgentDir = process.env.BK_AGENT_DIR ||
60
+ path.join(process.env.HOME || process.env.USERPROFILE || '', '.bk-agent');
61
+ this.workspaceConfigPath = path.join(bkAgentDir, 'curator-workspace.json');
62
+ // Load workspaces if file exists
63
+ this.loadWorkspaces();
64
+ this.validate();
65
+ }
66
+ loadWorkspaces() {
67
+ try {
68
+ if (fs.existsSync(this.workspaceConfigPath)) {
69
+ const content = fs.readFileSync(this.workspaceConfigPath, 'utf-8');
70
+ const wsConfig = JSON.parse(content);
71
+ wsConfig.workspaces.forEach(ws => {
72
+ this.workspaces.set(ws.name, ws);
73
+ });
74
+ this.currentWorkspaceName = wsConfig.lastUsed || 'default';
75
+ }
76
+ }
77
+ catch (err) {
78
+ console.warn(`[ConfigManager] Could not load workspaces: ${err.message}`);
79
+ }
80
+ }
81
+ saveWorkspaces() {
82
+ try {
83
+ const wsConfig = {
84
+ workspaces: Array.from(this.workspaces.values()),
85
+ lastUsed: this.currentWorkspaceName,
86
+ version: '1.0.0',
87
+ };
88
+ fs.writeFileSync(this.workspaceConfigPath, JSON.stringify(wsConfig, null, 2), 'utf-8');
89
+ }
90
+ catch (err) {
91
+ console.warn(`[ConfigManager] Could not save workspaces: ${err.message}`);
92
+ }
93
+ }
94
+ validate() {
95
+ if (!this.config.outputPath) {
96
+ throw new Error('CURATOR_OUTPUT_PATH is required');
97
+ }
98
+ }
99
+ getConfig() {
100
+ return { ...this.config };
101
+ }
102
+ updateConfig(partial) {
103
+ this.config = { ...this.config, ...partial };
104
+ this.validate();
105
+ }
106
+ setInputPath(path) {
107
+ this.config.inputPath = path;
108
+ }
109
+ setOutputPath(path) {
110
+ this.config.outputPath = path;
111
+ this.validate();
112
+ }
113
+ getInputPath() {
114
+ // First try to get from active workspace
115
+ try {
116
+ const wsConfig = JSON.parse(fs.readFileSync(this.workspaceConfigPath, 'utf-8'));
117
+ const activeWorkspace = wsConfig.workspaces.find((w) => w.name === wsConfig.lastUsed);
118
+ if (activeWorkspace && activeWorkspace.inputPath) {
119
+ return activeWorkspace.inputPath;
120
+ }
121
+ }
122
+ catch {
123
+ // Fall back to config
124
+ }
125
+ return this.config.inputPath;
126
+ }
127
+ getOutputPath() {
128
+ // First try to get from active workspace
129
+ try {
130
+ const wsConfig = JSON.parse(fs.readFileSync(this.workspaceConfigPath, 'utf-8'));
131
+ const activeWorkspace = wsConfig.workspaces.find((w) => w.name === wsConfig.lastUsed);
132
+ if (activeWorkspace && activeWorkspace.outputPath) {
133
+ return activeWorkspace.outputPath;
134
+ }
135
+ }
136
+ catch {
137
+ // Fall back to config
138
+ }
139
+ return this.config.outputPath;
140
+ }
141
+ // ── Workspace Methods ────────────────────────────────────────────────────
142
+ switchWorkspace(workspaceName) {
143
+ const workspace = this.workspaces.get(workspaceName);
144
+ if (!workspace) {
145
+ return {
146
+ success: false,
147
+ error: `Workspace "${workspaceName}" not found. Available: ${Array.from(this.workspaces.keys()).join(', ')}`,
148
+ };
149
+ }
150
+ this.currentWorkspaceName = workspaceName;
151
+ this.config.inputPath = workspace.inputPath;
152
+ this.config.outputPath = workspace.outputPath;
153
+ this.saveWorkspaces();
154
+ return { success: true, workspace };
155
+ }
156
+ addWorkspace(workspace) {
157
+ this.workspaces.set(workspace.name, workspace);
158
+ this.saveWorkspaces();
159
+ }
160
+ removeWorkspace(name) {
161
+ if (!this.workspaces.has(name)) {
162
+ return { success: false, error: `Workspace "${name}" not found` };
163
+ }
164
+ this.workspaces.delete(name);
165
+ this.saveWorkspaces();
166
+ return { success: true };
167
+ }
168
+ listWorkspaces() {
169
+ return Array.from(this.workspaces.values());
170
+ }
171
+ getCurrentWorkspace() {
172
+ return this.currentWorkspaceName;
173
+ }
174
+ getWorkspaceInfo() {
175
+ return {
176
+ current: this.currentWorkspaceName,
177
+ available: this.listWorkspaces(),
178
+ config: this.getConfig(),
179
+ };
180
+ }
181
+ }
182
+ exports.ConfigManager = ConfigManager;
183
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/api/config.ts"],"names":[],"mappings":"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"}