@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.
- package/AGENT.md +187 -0
- package/README.md +475 -0
- package/dist/analyzer.d.ts +44 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +381 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/api/config.d.ts +57 -0
- package/dist/api/config.d.ts.map +1 -0
- package/dist/api/config.js +183 -0
- package/dist/api/config.js.map +1 -0
- package/dist/api/http-server.d.ts +24 -0
- package/dist/api/http-server.d.ts.map +1 -0
- package/dist/api/http-server.js +108 -0
- package/dist/api/http-server.js.map +1 -0
- package/dist/api/routes.d.ts +8 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +382 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/api/security.d.ts +107 -0
- package/dist/api/security.d.ts.map +1 -0
- package/dist/api/security.js +200 -0
- package/dist/api/security.js.map +1 -0
- package/dist/checksum.d.ts +56 -0
- package/dist/checksum.d.ts.map +1 -0
- package/dist/checksum.js +186 -0
- package/dist/checksum.js.map +1 -0
- package/dist/documentation-curator.d.ts +18 -0
- package/dist/documentation-curator.d.ts.map +1 -0
- package/dist/documentation-curator.js +231 -0
- package/dist/documentation-curator.js.map +1 -0
- package/dist/http-server-main.d.ts +28 -0
- package/dist/http-server-main.d.ts.map +1 -0
- package/dist/http-server-main.js +69 -0
- package/dist/http-server-main.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/engine.d.ts +90 -0
- package/dist/knowledge/engine.d.ts.map +1 -0
- package/dist/knowledge/engine.js +181 -0
- package/dist/knowledge/engine.js.map +1 -0
- package/dist/knowledge/rag-provider.d.ts +87 -0
- package/dist/knowledge/rag-provider.d.ts.map +1 -0
- package/dist/knowledge/rag-provider.js +189 -0
- package/dist/knowledge/rag-provider.js.map +1 -0
- package/dist/knowledge/synthesis.d.ts +27 -0
- package/dist/knowledge/synthesis.d.ts.map +1 -0
- package/dist/knowledge/synthesis.js +142 -0
- package/dist/knowledge/synthesis.js.map +1 -0
- package/dist/providers/anthropic-adapter.d.ts +14 -0
- package/dist/providers/anthropic-adapter.d.ts.map +1 -0
- package/dist/providers/anthropic-adapter.js +29 -0
- package/dist/providers/anthropic-adapter.js.map +1 -0
- package/dist/providers/index.d.ts +14 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +29 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-adapter.d.ts +16 -0
- package/dist/providers/openai-adapter.d.ts.map +1 -0
- package/dist/providers/openai-adapter.js +37 -0
- package/dist/providers/openai-adapter.js.map +1 -0
- package/dist/providers/types.d.ts +4 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +3 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/server.d.ts +33 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +640 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/watcher.d.ts +26 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +168 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +58 -0
package/dist/analyzer.js
ADDED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAuC;AACvC,gDAAkC;AAClC,6BAAwB;AAGxB,yEAAkE;AAElE,wCAAwC;AACxC,MAAM,sBAAsB,GAAG,OAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IACxF,IAAI,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC7E,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;IAC1B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;IAC5B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1C,OAAO,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC;CACzC,CAAC,CAAC;AAIH,kCAAkC;AAClC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sDAmCgC,CAAC;AAEvD,4BAA4B;AAC5B,MAAM,eAAe,GAAG;IACpB,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ;CAC5F,CAAC;AAEF,SAAS,WAAW,CAAC,QAAgB;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,OAAO,GAA2B;QACpC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY;QACzC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY;QACzC,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,QAAQ;QACf,QAAQ,EAAE,OAAO;KACpB,CAAC;IACF,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC1B,OAAO,KAAK;SACP,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,IAAI,EAAE;SACN,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAsB,EAAE,MAAc,EAAE,IAAY,EAAE,eAA0B;IACtG,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAChE,MAAM,KAAK,GAAG;QACV,KAAK;QACL,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG;QAC7C,SAAS,IAAI,CAAC,IAAI,EAAE;QACpB,SAAS,IAAI,CAAC,IAAI,EAAE;QACpB,aAAa,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE;QACzC,aAAa,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG;QACjD,uBAAuB;QACvB,SAAS,IAAI,EAAE;QACf,gBAAgB,MAAM,GAAG;QACzB,SAAS,QAAQ,EAAE;KACtB,CAAC;IAEF,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,sBAAsB,OAAO,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,IAAI,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAUD,MAAa,YAAY;IACJ,QAAQ,CAAqB;IAC7B,SAAS,CAAS;IAClB,aAAa,CAAS;IACtB,UAAU,CAAuB;IAElD,YAAY,IAAyB;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC;QAClD,IAAI,CAAC,UAAU,GAAG,IAAI,+CAAoB,CAAC;YACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC5B,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACpB,QAAgB,EAChB,QAA2D;QAE3D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAmB,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAEtD,mCAAmC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC7B,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,KAAK,CAAC,CACtD,CAAC;QACF,IAAI,MAAM;YAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;QAE7C,4CAA4C;QAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACjC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CACjD,CAAC;QACF,IAAI,UAAU;YAAE,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC;QAExD,8CAA8C;QAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC/B,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC1G,CAAC;YACF,IAAI,QAAQ;gBAAE,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACrD,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACnC,CAAC,CAAC,YAAY,KAAK,WAAW,CACjC,CAAC;YACF,IAAI,YAAY;gBAAE,MAAM,CAAC,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC;QACjE,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACb,QAAgB,EAChB,YAAoB,EACpB,QAA4D;QAE5D,yCAAyC;QACzC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,OAAO,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACJ,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;QACpE,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CACrB,QAAgB,EAChB,YAAoB,EACpB,QAA4D;QAE5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAuB;YAC/B,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,CAAC,YAAY,CAAC;SAChC,CAAC;QAEF,iBAAiB;QACjB,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACD,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAsB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACvC,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,gCAAgC;QAChC,IAAI,OAAO,GAAwB;YAC/B,QAAQ,EAAE,QAAQ;YAClB,YAAY;YACZ,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC;YAC/B,WAAW,EAAE,IAAI;SACpB,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACX,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACrE,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACD,OAAO,CAAC,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACxE,CAAC;gBAAC,MAAM,CAAC;oBACL,gCAAgC;gBACpC,CAAC;YACL,CAAC;YACD,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACD,OAAO,CAAC,cAAc,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBAChF,CAAC;gBAAC,MAAM,CAAC;oBACL,oCAAoC;gBACxC,CAAC;YACL,CAAC;YACD,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;gBACxB,IAAI,CAAC;oBACD,OAAO,CAAC,aAAa,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAC9E,CAAC;gBAAC,MAAM,CAAC;oBACL,8BAA8B;gBAClC,CAAC;YACL,CAAC;QACL,CAAC;QAED,mBAAmB;QACnB,IAAI,MAA4B,CAAC;QACjC,IAAI,CAAC;YACD,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAqB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACjE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACvC,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;YACtF,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACvC,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,uBAAuB;QACvB,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAEhG,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;gBAC3F,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACnB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,KAAK,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,CAAC;QACL,CAAC;QAED,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACvC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB,CAAC,QAAgB,EAAE,YAAoB;QACrE,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,QAAgB;QAC9B,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,8EAA8E;IAEtE,kBAAkB,CACtB,QAAgB,EAChB,QAA2D;QAE3D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,oBAAoB;QACpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QAC7D,IAAI,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAElD,qBAAqB;QACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAC9B,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,KAAK,CAAC,CACtD,CAAC;QACF,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAEhD,4BAA4B;QAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACjC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CACjD,CAAC;QACF,IAAI,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAEtD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,OAA4B;QAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACnE,IAAI,OAAO,GAAG,SAAS,OAAO,CAAC,YAAY,eAAe,OAAO,CAAC,QAAQ,sBAAsB,SAAS,UAAU,CAAC;QAEpH,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,IAAI,kCAAkC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QACrF,CAAC;QAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,IAAI,kCAAkC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QACxF,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtF,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAErC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBAChE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;gBACpD,CAAC;gBACD,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC1E,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI;wBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7C,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,SAAS,CACnB,IAAsB,EACtB,MAAc,EACd,IAAY,EACZ,eAA0B;QAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,IAAI,KAAK,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAE1C,IAAI,CAAC;YACD,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC,CAAC,yBAAyB;QAC1C,CAAC;QAAC,MAAM,CAAC;YACL,0BAA0B;QAC9B,CAAC;QAED,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QACtE,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AA9QD,oCA8QC"}
|
|
@@ -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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"}
|