@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,24 @@
1
+ /**
2
+ * Curator-Codex HTTP Server
3
+ * Unified API for curation and knowledge management
4
+ */
5
+ import { Express } from 'express';
6
+ import { ConfigManager, type ApiConfig } from './config.js';
7
+ export interface HttpServerOptions {
8
+ port?: number;
9
+ apiConfig?: Partial<ApiConfig>;
10
+ }
11
+ export declare class CuratorHttpServer {
12
+ private app;
13
+ private configManager;
14
+ private port;
15
+ private server;
16
+ constructor(opts?: HttpServerOptions);
17
+ private setupMiddleware;
18
+ private setupRoutes;
19
+ start(): Promise<void>;
20
+ stop(): Promise<void>;
21
+ getConfigManager(): ConfigManager;
22
+ getApp(): Express;
23
+ }
24
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/api/http-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAgB,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAS5D,MAAM,WAAW,iBAAiB;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;CAClC;AAED,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,MAAM,CAAa;gBAEf,IAAI,GAAE,iBAAsB;IASxC,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,WAAW;IAwBb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAetB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,gBAAgB,IAAI,aAAa;IAIjC,MAAM,IAAI,OAAO;CAGpB"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ /**
3
+ * Curator-Codex HTTP Server
4
+ * Unified API for curation and knowledge management
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.CuratorHttpServer = void 0;
11
+ const express_1 = __importDefault(require("express"));
12
+ const routes_js_1 = require("./routes.js");
13
+ const config_js_1 = require("./config.js");
14
+ const security_js_1 = require("./security.js");
15
+ class CuratorHttpServer {
16
+ app;
17
+ configManager;
18
+ port;
19
+ server = null;
20
+ constructor(opts = {}) {
21
+ this.app = (0, express_1.default)();
22
+ this.configManager = new config_js_1.ConfigManager(opts.apiConfig);
23
+ this.port = opts.port || this.configManager.getConfig().port;
24
+ this.setupMiddleware();
25
+ this.setupRoutes();
26
+ }
27
+ setupMiddleware() {
28
+ // Parse JSON (limit to 10MB)
29
+ this.app.use(express_1.default.json({ limit: '10mb' }));
30
+ // Request logging
31
+ this.app.use((0, security_js_1.createRequestLogger)());
32
+ // CORS
33
+ this.app.use((req, res, next) => {
34
+ res.header('Access-Control-Allow-Origin', '*');
35
+ res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
36
+ res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
37
+ if (req.method === 'OPTIONS') {
38
+ res.sendStatus(200);
39
+ }
40
+ else {
41
+ next();
42
+ }
43
+ });
44
+ // Authentication middleware
45
+ this.app.use((0, security_js_1.createAuthMiddleware)());
46
+ // Rate limiting (100 requests per 15 minutes)
47
+ this.app.use((0, security_js_1.createRateLimiter)(15 * 60 * 1000, 100));
48
+ // Request ID tracking
49
+ this.app.use((req, res, next) => {
50
+ req.id = require('crypto').randomUUID();
51
+ res.setHeader('X-Request-ID', req.id);
52
+ next();
53
+ });
54
+ }
55
+ setupRoutes() {
56
+ // Root
57
+ this.app.get('/', (req, res) => {
58
+ res.json({
59
+ name: 'curator-codex-agent',
60
+ version: '0.1.0',
61
+ description: 'Unified code + documentation curation with knowledge extraction',
62
+ endpoints: {
63
+ health: 'GET /health',
64
+ status: 'GET /status',
65
+ config: ['GET /curator/config', 'POST /curator/config'],
66
+ curation: ['POST /curator/process'],
67
+ docs: 'https://github.com/BackendKit-labs/backendkit-agents#curator-codex',
68
+ },
69
+ });
70
+ });
71
+ // Mount all routes
72
+ this.app.use('/', (0, routes_js_1.createRoutes)(this.configManager));
73
+ // Error handler (must be last)
74
+ this.app.use(security_js_1.errorHandler);
75
+ }
76
+ async start() {
77
+ return new Promise((resolve) => {
78
+ this.server = this.app.listen(this.port, () => {
79
+ console.log(`\n╔════════════════════════════════════════╗`);
80
+ console.log(`║ Curator-Codex HTTP Server ║`);
81
+ console.log(`╠════════════════════════════════════════╣`);
82
+ console.log(`║ 🚀 Server running ║`);
83
+ console.log(`║ 📍 http://localhost:${this.port} ║`);
84
+ console.log(`║ 📚 GET /status for config ║`);
85
+ console.log(`╚════════════════════════════════════════╝\n`);
86
+ resolve();
87
+ });
88
+ });
89
+ }
90
+ async stop() {
91
+ if (this.server) {
92
+ return new Promise((resolve) => {
93
+ this.server.close(() => {
94
+ console.log('Server stopped');
95
+ resolve();
96
+ });
97
+ });
98
+ }
99
+ }
100
+ getConfigManager() {
101
+ return this.configManager;
102
+ }
103
+ getApp() {
104
+ return this.app;
105
+ }
106
+ }
107
+ exports.CuratorHttpServer = CuratorHttpServer;
108
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/api/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * HTTP API Routes for Curator-Codex
3
+ * Handles curation and knowledge management endpoints
4
+ */
5
+ import { Router } from 'express';
6
+ import type { ConfigManager } from './config.js';
7
+ export declare function createRoutes(configManager: ConfigManager): Router;
8
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAQpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAwBjD,wBAAgB,YAAY,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CA2VjE"}
@@ -0,0 +1,382 @@
1
+ "use strict";
2
+ /**
3
+ * HTTP API Routes for Curator-Codex
4
+ * Handles curation and knowledge management endpoints
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.createRoutes = createRoutes;
41
+ const express_1 = require("express");
42
+ const fsp = __importStar(require("node:fs/promises"));
43
+ const os = __importStar(require("node:os"));
44
+ const path = __importStar(require("node:path"));
45
+ const analyzer_js_1 = require("../analyzer.js");
46
+ const engine_js_1 = require("../knowledge/engine.js");
47
+ const index_js_1 = require("../providers/index.js");
48
+ const checksum_js_1 = require("../checksum.js");
49
+ const security_js_1 = require("./security.js");
50
+ // Module-level cache: one KnowledgeEngine per vault path, persists for process lifetime
51
+ const engineCache = new Map();
52
+ async function getEngine(vaultPath) {
53
+ if (!engineCache.has(vaultPath)) {
54
+ const engine = new engine_js_1.KnowledgeEngine((0, index_js_1.createProvider)(), vaultPath);
55
+ await engine.initialize();
56
+ engineCache.set(vaultPath, engine);
57
+ }
58
+ return engineCache.get(vaultPath);
59
+ }
60
+ function createRoutes(configManager) {
61
+ const router = (0, express_1.Router)();
62
+ // ── Curator Endpoints ────────────────────────────────────────────────────
63
+ /**
64
+ * POST /curator/config
65
+ * Set curator input and output paths
66
+ */
67
+ router.post('/curator/config', (0, security_js_1.validateBody)(security_js_1.CuratorConfigSchema), (req, res) => {
68
+ try {
69
+ const { inputPath, outputPath } = req.validatedBody;
70
+ configManager.setInputPath(inputPath);
71
+ configManager.setOutputPath(outputPath);
72
+ const config = configManager.getConfig();
73
+ res.status(200).json({
74
+ success: true,
75
+ config: {
76
+ inputPath: config.inputPath,
77
+ outputPath: config.outputPath,
78
+ provider: config.provider,
79
+ model: config.model,
80
+ },
81
+ meta: {
82
+ userId: req.user?.id,
83
+ timestamp: new Date().toISOString(),
84
+ },
85
+ });
86
+ }
87
+ catch (err) {
88
+ res.status(500).json({
89
+ error: 'Failed to set config',
90
+ message: err.message,
91
+ });
92
+ }
93
+ });
94
+ /**
95
+ * GET /curator/config
96
+ * Get current configuration and workspace info
97
+ */
98
+ router.get('/curator/config', (req, res) => {
99
+ try {
100
+ const config = configManager.getConfig();
101
+ const wsInfo = configManager.getWorkspaceInfo();
102
+ res.json({
103
+ inputPath: config.inputPath,
104
+ outputPath: config.outputPath,
105
+ provider: config.provider,
106
+ model: config.model,
107
+ port: config.port,
108
+ workspace: {
109
+ current: wsInfo.current,
110
+ available: wsInfo.available.map(w => ({
111
+ name: w.name,
112
+ description: w.description,
113
+ })),
114
+ },
115
+ });
116
+ }
117
+ catch (err) {
118
+ res.status(500).json({ error: err.message });
119
+ }
120
+ });
121
+ /**
122
+ * POST /curator/workspace/:name
123
+ * Switch to a specific workspace
124
+ */
125
+ router.post('/curator/workspace/:name', (req, res) => {
126
+ try {
127
+ const workspaceName = req.params.name;
128
+ const result = configManager.switchWorkspace(workspaceName);
129
+ if (!result.success) {
130
+ res.status(400).json({
131
+ error: 'Workspace switch failed',
132
+ message: result.error,
133
+ });
134
+ return;
135
+ }
136
+ const config = configManager.getConfig();
137
+ res.json({
138
+ success: true,
139
+ workspace: workspaceName,
140
+ config: {
141
+ inputPath: config.inputPath,
142
+ outputPath: config.outputPath,
143
+ provider: config.provider,
144
+ model: config.model,
145
+ },
146
+ });
147
+ }
148
+ catch (err) {
149
+ res.status(500).json({
150
+ error: 'Failed to switch workspace',
151
+ message: err.message,
152
+ });
153
+ }
154
+ });
155
+ /**
156
+ * GET /curator/workspaces
157
+ * List all available workspaces
158
+ */
159
+ router.get('/curator/workspaces', (req, res) => {
160
+ try {
161
+ const workspaces = configManager.listWorkspaces();
162
+ const current = configManager.getCurrentWorkspace();
163
+ res.json({
164
+ current,
165
+ workspaces: workspaces.map(w => ({
166
+ name: w.name,
167
+ inputPath: w.inputPath,
168
+ outputPath: w.outputPath,
169
+ description: w.description,
170
+ })),
171
+ });
172
+ }
173
+ catch (err) {
174
+ res.status(500).json({ error: err.message });
175
+ }
176
+ });
177
+ /**
178
+ * POST /curator/process
179
+ * Curate files from input path into vault
180
+ */
181
+ router.post('/curator/process', async (req, res) => {
182
+ try {
183
+ const inputPath = req.body.inputPath || configManager.getInputPath();
184
+ const outputPath = req.body.outputPath || configManager.getOutputPath();
185
+ if (!inputPath || !outputPath) {
186
+ res.status(400).json({
187
+ error: 'inputPath and outputPath must be set (via POST body or config)',
188
+ });
189
+ return;
190
+ }
191
+ // Find all files
192
+ let files;
193
+ try {
194
+ files = await (0, checksum_js_1.findAllFiles)(inputPath);
195
+ files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
196
+ }
197
+ catch (err) {
198
+ res.status(400).json({
199
+ error: `Failed to scan input path: ${err.message}`,
200
+ });
201
+ return;
202
+ }
203
+ if (files.length === 0) {
204
+ res.json({
205
+ notesWritten: [],
206
+ notesSkipped: [],
207
+ errors: ['No files found in input path'],
208
+ filesAnalyzed: [],
209
+ totalFiles: 0,
210
+ });
211
+ return;
212
+ }
213
+ // Create analyzer
214
+ const analyzer = new analyzer_js_1.CodeAnalyzer({
215
+ provider: (0, index_js_1.createProvider)(),
216
+ vaultPath: outputPath,
217
+ });
218
+ // Process files
219
+ const results = {
220
+ notesWritten: [],
221
+ notesSkipped: [],
222
+ errors: [],
223
+ filesAnalyzed: [],
224
+ totalFiles: files.length,
225
+ codeFiles: files.filter(f => (0, checksum_js_1.isCodeFile)(f.fullPath)).length,
226
+ docFiles: files.filter(f => (0, checksum_js_1.isDocFile)(f.fullPath)).length,
227
+ durationMs: 0,
228
+ };
229
+ const start = Date.now();
230
+ for (let i = 0; i < files.length; i++) {
231
+ const { fullPath, relativePath } = files[i];
232
+ try {
233
+ const analyzed = await analyzer.analyzeFile(fullPath, relativePath, files);
234
+ results.notesWritten.push(...analyzed.notesWritten);
235
+ results.notesSkipped.push(...analyzed.notesSkipped);
236
+ results.errors.push(...analyzed.errors);
237
+ results.filesAnalyzed.push(...(analyzed.filesAnalyzed || []));
238
+ }
239
+ catch (err) {
240
+ results.errors.push(`${relativePath}: ${err.message}`);
241
+ }
242
+ }
243
+ results.durationMs = Date.now() - start;
244
+ res.json(results);
245
+ }
246
+ catch (err) {
247
+ res.status(500).json({
248
+ error: err.message,
249
+ });
250
+ }
251
+ });
252
+ // ── Status Endpoints ─────────────────────────────────────────────────────
253
+ /**
254
+ * GET /status
255
+ * Get overall system status
256
+ */
257
+ router.get('/status', (req, res) => {
258
+ try {
259
+ const config = configManager.getConfig();
260
+ res.json({
261
+ status: 'ready',
262
+ curator: {
263
+ inputPath: config.inputPath || 'not set',
264
+ outputPath: config.outputPath,
265
+ provider: config.provider,
266
+ model: config.model,
267
+ },
268
+ server: {
269
+ port: config.port,
270
+ timestamp: new Date().toISOString(),
271
+ },
272
+ });
273
+ }
274
+ catch (err) {
275
+ res.status(500).json({
276
+ error: err.message,
277
+ });
278
+ }
279
+ });
280
+ /**
281
+ * GET /health
282
+ * Health check (for load balancers, monitoring)
283
+ */
284
+ router.get('/health', (req, res) => {
285
+ res.json({ status: 'ok', timestamp: new Date().toISOString() });
286
+ });
287
+ // ── Knowledge / RAG Endpoints ────────────────────────────────────────────
288
+ /**
289
+ * POST /knowledge/search
290
+ * Semantic search across a vault
291
+ * Body: { vaultPath, query, topK? }
292
+ */
293
+ router.post('/knowledge/search', (0, security_js_1.validateBody)(security_js_1.KnowledgeSearchWithVaultSchema), async (req, res) => {
294
+ try {
295
+ const { vaultPath, query, topK } = req.validatedBody;
296
+ const engine = await getEngine(vaultPath);
297
+ const result = await engine.search(query, { topK, autoSynthesize: false });
298
+ res.json(result);
299
+ }
300
+ catch (err) {
301
+ res.status(500).json({ error: 'Search failed', message: err.message });
302
+ }
303
+ });
304
+ /**
305
+ * POST /knowledge/reindex
306
+ * Rebuild the RAG index for a vault
307
+ * Body: { vaultPath }
308
+ */
309
+ router.post('/knowledge/reindex', (0, security_js_1.validateBody)(security_js_1.KnowledgeReindexSchema), async (req, res) => {
310
+ try {
311
+ const { vaultPath } = req.validatedBody;
312
+ const engine = engineCache.get(vaultPath) ?? new engine_js_1.KnowledgeEngine((0, index_js_1.createProvider)(), vaultPath);
313
+ const result = await engine.reload();
314
+ engineCache.set(vaultPath, engine);
315
+ res.json(result);
316
+ }
317
+ catch (err) {
318
+ res.status(500).json({ error: 'Reindex failed', message: err.message });
319
+ }
320
+ });
321
+ /**
322
+ * POST /curator/file
323
+ * Curate a single file and write the result to a vault
324
+ * Body: { vaultPath, fileName, content }
325
+ */
326
+ router.post('/curator/file', (0, security_js_1.validateBody)(security_js_1.CuratorFileSchema), async (req, res) => {
327
+ const { vaultPath, fileName, content } = req.validatedBody;
328
+ const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), 'curator-file-'));
329
+ try {
330
+ const tmpFile = path.join(tmpDir, fileName);
331
+ await fsp.writeFile(tmpFile, content, 'utf-8');
332
+ const analyzer = new analyzer_js_1.CodeAnalyzer({ provider: (0, index_js_1.createProvider)(), vaultPath });
333
+ const result = await analyzer.analyzeFile(tmpFile, fileName);
334
+ let generatedContent = null;
335
+ let generatedTitle = null;
336
+ let tags = [];
337
+ let area = 'general';
338
+ if (result.notesWritten.length > 0) {
339
+ const notePath = result.notesWritten[0];
340
+ generatedContent = await fsp.readFile(notePath, 'utf-8').catch(() => null);
341
+ generatedTitle = path.basename(notePath, '.md')
342
+ .replace(/^\d{4}-\d{2}-\d{2}-/, '')
343
+ .replace(/-/g, ' ');
344
+ const rel = path.relative(vaultPath, notePath);
345
+ const parts = rel.split(path.sep);
346
+ area = parts.length > 1 ? parts[0] : 'general';
347
+ if (generatedContent) {
348
+ const fmMatch = generatedContent.match(/^---\n([\s\S]*?)\n---/);
349
+ const tagsLine = fmMatch?.[1].match(/^tags:\s*\[([^\]]*)\]/m);
350
+ if (tagsLine) {
351
+ tags = tagsLine[1].split(',').map(t => t.trim().replace(/^['"]|['"]$/g, '')).filter(Boolean);
352
+ }
353
+ }
354
+ }
355
+ res.json({ ...result, generatedContent, generatedTitle, tags, area });
356
+ }
357
+ catch (err) {
358
+ res.status(500).json({ error: 'Curation failed', message: err.message });
359
+ }
360
+ finally {
361
+ await fsp.rm(tmpDir, { recursive: true }).catch(() => { });
362
+ }
363
+ });
364
+ // ── Error Handler ────────────────────────────────────────────────────────
365
+ router.use((req, res) => {
366
+ res.status(404).json({
367
+ error: `Route not found: ${req.method} ${req.path}`,
368
+ availableRoutes: [
369
+ 'GET /health',
370
+ 'GET /status',
371
+ 'GET /curator/config',
372
+ 'POST /curator/config',
373
+ 'POST /curator/process',
374
+ 'POST /curator/file',
375
+ 'POST /knowledge/search',
376
+ 'POST /knowledge/reindex',
377
+ ],
378
+ });
379
+ });
380
+ return router;
381
+ }
382
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Security middleware for Curator-Codex HTTP API
3
+ * Handles authentication, rate limiting, and input validation
4
+ */
5
+ import { Request, Response, NextFunction } from 'express';
6
+ import { z } from 'zod';
7
+ export interface AuthenticatedRequest extends Request {
8
+ user?: {
9
+ id: string;
10
+ key: string;
11
+ rateLimit: number;
12
+ };
13
+ }
14
+ /**
15
+ * Bearer token authentication middleware
16
+ * Validates API key from Authorization header
17
+ */
18
+ export declare function createAuthMiddleware(apiKeys?: Map<string, {
19
+ rateLimit: number;
20
+ }>): (req: AuthenticatedRequest, res: Response, next: NextFunction) => any;
21
+ export declare function createRateLimiter(windowMs?: number, max?: number): any;
22
+ export declare const CuratorConfigSchema: z.ZodObject<{
23
+ inputPath: z.ZodString;
24
+ outputPath: z.ZodString;
25
+ }, "strip", z.ZodTypeAny, {
26
+ inputPath: string;
27
+ outputPath: string;
28
+ }, {
29
+ inputPath: string;
30
+ outputPath: string;
31
+ }>;
32
+ export declare const CuratorProcessSchema: z.ZodObject<{
33
+ inputPath: z.ZodOptional<z.ZodString>;
34
+ outputPath: z.ZodOptional<z.ZodString>;
35
+ }, "strip", z.ZodTypeAny, {
36
+ inputPath?: string | undefined;
37
+ outputPath?: string | undefined;
38
+ }, {
39
+ inputPath?: string | undefined;
40
+ outputPath?: string | undefined;
41
+ }>;
42
+ export declare const KnowledgeSearchSchema: z.ZodObject<{
43
+ query: z.ZodString;
44
+ topK: z.ZodOptional<z.ZodNumber>;
45
+ autoSynthesize: z.ZodOptional<z.ZodBoolean>;
46
+ }, "strip", z.ZodTypeAny, {
47
+ query: string;
48
+ topK?: number | undefined;
49
+ autoSynthesize?: boolean | undefined;
50
+ }, {
51
+ query: string;
52
+ topK?: number | undefined;
53
+ autoSynthesize?: boolean | undefined;
54
+ }>;
55
+ export declare const KnowledgeSearchWithVaultSchema: z.ZodObject<{
56
+ vaultPath: z.ZodString;
57
+ query: z.ZodString;
58
+ topK: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
59
+ }, "strip", z.ZodTypeAny, {
60
+ query: string;
61
+ topK: number;
62
+ vaultPath: string;
63
+ }, {
64
+ query: string;
65
+ vaultPath: string;
66
+ topK?: number | undefined;
67
+ }>;
68
+ export declare const KnowledgeReindexSchema: z.ZodObject<{
69
+ vaultPath: z.ZodString;
70
+ }, "strip", z.ZodTypeAny, {
71
+ vaultPath: string;
72
+ }, {
73
+ vaultPath: string;
74
+ }>;
75
+ export declare const CuratorFileSchema: z.ZodObject<{
76
+ vaultPath: z.ZodString;
77
+ fileName: z.ZodString;
78
+ content: z.ZodString;
79
+ }, "strip", z.ZodTypeAny, {
80
+ content: string;
81
+ vaultPath: string;
82
+ fileName: string;
83
+ }, {
84
+ content: string;
85
+ vaultPath: string;
86
+ fileName: string;
87
+ }>;
88
+ export type CuratorConfig = z.infer<typeof CuratorConfigSchema>;
89
+ export type CuratorProcess = z.infer<typeof CuratorProcessSchema>;
90
+ export type KnowledgeSearch = z.infer<typeof KnowledgeSearchSchema>;
91
+ export type KnowledgeSearchWithVault = z.infer<typeof KnowledgeSearchWithVaultSchema>;
92
+ export type KnowledgeReindex = z.infer<typeof KnowledgeReindexSchema>;
93
+ export type CuratorFile = z.infer<typeof CuratorFileSchema>;
94
+ /**
95
+ * Validate request body against schema
96
+ */
97
+ export declare function validateBody<T>(schema: z.ZodSchema): (req: Request, res: Response, next: NextFunction) => any;
98
+ export declare function createRequestLogger(): (req: AuthenticatedRequest, res: Response, next: NextFunction) => void;
99
+ export declare function errorHandler(err: Error | any, req: Request, res: Response, next: NextFunction): void;
100
+ export interface RequestContext {
101
+ userId: string;
102
+ requestId: string;
103
+ startTime: number;
104
+ ip: string;
105
+ }
106
+ export declare function createRequestContext(req: AuthenticatedRequest): RequestContext;
107
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/api/security.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,WAAW,oBAAqB,SAAQ,OAAO;IACjD,IAAI,CAAC,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;KACrB,CAAC;CACL;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,GAAG,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAa,IAChF,KAAK,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,SAoCvE;AAQD,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAuB,EAAE,GAAG,GAAE,MAAY,OAerF;AAID,eAAO,MAAM,mBAAmB;;;;;;;;;EAG9B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;EAG/B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;EAIhC,CAAC;AAEH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;EAIzC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;EAEjC,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAI5B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAU,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACvE,MAAM,MAAM,cAAc,GAAS,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACxE,MAAM,MAAM,eAAe,GAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACzE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AACtF,MAAM,MAAM,gBAAgB,GAAO,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC1E,MAAM,MAAM,WAAW,GAAY,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAErE;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,IACvC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,SAsB1D;AAID,wBAAgB,mBAAmB,KACvB,KAAK,oBAAoB,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,UAmBvE;AAID,wBAAgB,YAAY,CACxB,GAAG,EAAE,KAAK,GAAG,GAAG,EAChB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,QAerB;AAID,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,oBAAoB,GAAG,cAAc,CAO9E"}