@nexus-cortex/server 4.26.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/.cortex/agents/AGENT_PROFILE_GUIDE.md +307 -0
- package/.cortex/agents/README.md +268 -0
- package/.cortex/agents/a-frontend-landing-page-designer.md +41 -0
- package/.cortex/agents/autoresearch-agent.md +49 -0
- package/.cortex/agents/code-reviewer.md +63 -0
- package/.cortex/agents/context-research.md +26 -0
- package/.cortex/agents/doc-writer.md +92 -0
- package/.cortex/agents/explore.md +63 -0
- package/.cortex/agents/new-model-api-integrator-analyst.md +41 -0
- package/.cortex/agents/plan.md +109 -0
- package/.cortex/agents/pr-architecture-reviewer.md +77 -0
- package/.cortex/agents/pr-code-quality.md +78 -0
- package/.cortex/agents/pr-implementer.md +50 -0
- package/.cortex/agents/pr-security-auditor.md +62 -0
- package/.cortex/agents/pr-test-writer.md +67 -0
- package/.cortex/agents/refactor.md +118 -0
- package/.cortex/agents/test-writer.md +72 -0
- package/.cortex/agents/web-researcher.md +72 -0
- package/.cortex/bench/tasks/sample-tasks.json +20 -0
- package/.cortex/commands/compare.md +14 -0
- package/.cortex/commands/deps.md +16 -0
- package/.cortex/commands/diff.md +14 -0
- package/.cortex/commands/explain.md +16 -0
- package/.cortex/commands/find-bug.md +13 -0
- package/.cortex/commands/profile.md +15 -0
- package/.cortex/commands/review.md +18 -0
- package/.cortex/commands/search.md +16 -0
- package/.cortex/commands/test.md +15 -0
- package/.cortex/permissions.dev.json +20 -0
- package/.cortex/permissions.example.json +71 -0
- package/.cortex/permissions.prod.json +63 -0
- package/.cortex/permissions.test.json +19 -0
- package/.cortex/skills/autoresearch/SKILL.md +77 -0
- package/.cortex/skills/autoresearch/personas/README.md +45 -0
- package/.cortex/skills/autoresearch/personas/aggressive-refactor.md +25 -0
- package/.cortex/skills/autoresearch/personas/creative.md +29 -0
- package/.cortex/skills/autoresearch/personas/perf-hunter.md +27 -0
- package/.cortex/skills/autoresearch/personas/precise.md +23 -0
- package/.cortex/skills/autoresearch/personas/root-cause.md +26 -0
- package/.cortex/skills/autoresearch/personas/security-auditor.md +29 -0
- package/.cortex/skills/autoresearch/personas/skeptic-reviewer.md +31 -0
- package/.cortex/skills/autoresearch/personas/test-first.md +25 -0
- package/.cortex/skills/best-of-n/SKILL.md +76 -0
- package/.cortex/skills/cortex/SKILL.md +834 -0
- package/.cortex/skills/cortex-bench/SKILL.md +354 -0
- package/.cortex/skills/docx/SKILL.md +83 -0
- package/.cortex/skills/pdf-documents/SKILL.md +297 -0
- package/.cortex/skills/pdf-documents/sections/01-image-acquisition.md +132 -0
- package/.cortex/skills/pdf-documents/sections/02-ai-image-generation.md +274 -0
- package/.cortex/skills/pdf-documents/sections/03-paper-sizes.md +89 -0
- package/.cortex/skills/pdf-documents/sections/04-design-system.md +549 -0
- package/.cortex/skills/pdf-documents/sections/05-css-print-rules.md +135 -0
- package/.cortex/skills/pdf-documents/sections/06-svg-charts.md +100 -0
- package/.cortex/skills/pdf-documents/sections/07-templates.md +224 -0
- package/.cortex/skills/pdf-documents/sections/08-scaled-output.md +164 -0
- package/.cortex/skills/pdf-documents/sections/09-preview-qa.md +66 -0
- package/.cortex/skills/pdf-documents/sections/10-reading-pdfs.md +499 -0
- package/.cortex/skills/pdf-documents/sections/11-form-filling.md +241 -0
- package/.cortex/skills/pptx/SKILL.md +90 -0
- package/.cortex/skills/resume-analyst/SKILL.md +373 -0
- package/.cortex/skills/verify-work/SKILL.md +74 -0
- package/.cortex/skills/xlsx/SKILL.md +101 -0
- package/.cortex/system-messages/messages/WORK_QUALITY.md +159 -0
- package/.cortex/system-messages/registry.json +18 -0
- package/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +13 -0
- package/bin/cortex-daemon.js +47 -0
- package/bin/cortex-server.js +15 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +513 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/cors.d.ts +10 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +11 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/errorHandler.d.ts +10 -0
- package/dist/middleware/errorHandler.d.ts.map +1 -0
- package/dist/middleware/errorHandler.js +15 -0
- package/dist/middleware/errorHandler.js.map +1 -0
- package/dist/routes/approval.d.ts +2 -0
- package/dist/routes/approval.d.ts.map +1 -0
- package/dist/routes/approval.js +96 -0
- package/dist/routes/approval.js.map +1 -0
- package/dist/routes/config.d.ts +2 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +70 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/health.d.ts +2 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +1031 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/mcp.d.ts +2 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +251 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/messages.d.ts +5 -0
- package/dist/routes/messages.d.ts.map +1 -0
- package/dist/routes/messages.js +136 -0
- package/dist/routes/messages.js.map +1 -0
- package/dist/routes/middleware.d.ts +2 -0
- package/dist/routes/middleware.d.ts.map +1 -0
- package/dist/routes/middleware.js +146 -0
- package/dist/routes/middleware.js.map +1 -0
- package/dist/routes/models.d.ts +2 -0
- package/dist/routes/models.d.ts.map +1 -0
- package/dist/routes/models.js +29 -0
- package/dist/routes/models.js.map +1 -0
- package/dist/routes/permissions.d.ts +2 -0
- package/dist/routes/permissions.d.ts.map +1 -0
- package/dist/routes/permissions.js +253 -0
- package/dist/routes/permissions.js.map +1 -0
- package/dist/routes/pr.d.ts +2 -0
- package/dist/routes/pr.d.ts.map +1 -0
- package/dist/routes/pr.js +222 -0
- package/dist/routes/pr.js.map +1 -0
- package/dist/routes/sessions.d.ts +2 -0
- package/dist/routes/sessions.d.ts.map +1 -0
- package/dist/routes/sessions.js +628 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/system-messages.d.ts +2 -0
- package/dist/routes/system-messages.d.ts.map +1 -0
- package/dist/routes/system-messages.js +146 -0
- package/dist/routes/system-messages.js.map +1 -0
- package/dist/routes/tools.d.ts +2 -0
- package/dist/routes/tools.d.ts.map +1 -0
- package/dist/routes/tools.js +79 -0
- package/dist/routes/tools.js.map +1 -0
- package/package.json +63 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface ServerConfig {
|
|
2
|
+
port?: number;
|
|
3
|
+
debug?: boolean;
|
|
4
|
+
stateless?: boolean;
|
|
5
|
+
yolo?: boolean;
|
|
6
|
+
idleTimeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class CortexV4Server {
|
|
9
|
+
private app;
|
|
10
|
+
private port;
|
|
11
|
+
private debug;
|
|
12
|
+
private stateless;
|
|
13
|
+
private yolo;
|
|
14
|
+
private server;
|
|
15
|
+
private orchestrator;
|
|
16
|
+
private viewServer;
|
|
17
|
+
private idleTimeoutMs;
|
|
18
|
+
private idleTimer;
|
|
19
|
+
private cleanupInterval;
|
|
20
|
+
constructor(config?: ServerConfig);
|
|
21
|
+
private setupMiddleware;
|
|
22
|
+
private resetIdleTimer;
|
|
23
|
+
private setupRoutes;
|
|
24
|
+
private setupErrorHandling;
|
|
25
|
+
start(): Promise<void>;
|
|
26
|
+
stop(): Promise<void>;
|
|
27
|
+
getPort(): number;
|
|
28
|
+
}
|
|
29
|
+
export declare function main(): void;
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmEA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,eAAe,CAA+C;gBAE1D,MAAM,GAAE,YAAiB;IAarC,OAAO,CAAC,eAAe;IAwCvB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,WAAW;IAuCnB,OAAO,CAAC,kBAAkB;IAIpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6KtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4D3B,OAAO,IAAI,MAAM;CAGlB;AAMD,wBAAgB,IAAI,IAAI,IAAI,CA6G3B"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nexus Cortex HTTP Server
|
|
3
|
+
* Thin Express wrapper around @nexus-cortex/core library
|
|
4
|
+
*
|
|
5
|
+
* This server is an intentionally thin HTTP wrapper over the core orchestrator.
|
|
6
|
+
* All orchestration logic lives in @nexus-cortex/core.
|
|
7
|
+
*/
|
|
8
|
+
import express from 'express';
|
|
9
|
+
import { config } from 'dotenv';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import fs from 'fs';
|
|
14
|
+
// Resolve paths for .env loading
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
+
const __dirname = path.dirname(__filename);
|
|
17
|
+
const packageRoot = path.join(__dirname, '..', '..', '..');
|
|
18
|
+
// PROJECT_ROOT = where the user launched from (the launch-cwd model)
|
|
19
|
+
if (!process.env.PROJECT_ROOT) {
|
|
20
|
+
process.env.PROJECT_ROOT = process.cwd();
|
|
21
|
+
}
|
|
22
|
+
// CORTEX_ROOT = the install root holding the shipped .cortex scaffold (builtin
|
|
23
|
+
// agents/skills). Git clone → the monorepo root (3 levels up from dist); npm
|
|
24
|
+
// install → this package's root, where prepack vendored the scaffold. Only set
|
|
25
|
+
// when unset so an explicit CORTEX_ROOT (or the cortex bin's resolution,
|
|
26
|
+
// inherited through spawn) always wins.
|
|
27
|
+
const serverPkgRoot = path.join(__dirname, '..');
|
|
28
|
+
if (!process.env.CORTEX_ROOT) {
|
|
29
|
+
if (fs.existsSync(path.join(packageRoot, '.cortex')))
|
|
30
|
+
process.env.CORTEX_ROOT = packageRoot;
|
|
31
|
+
else if (fs.existsSync(path.join(serverPkgRoot, '.cortex')))
|
|
32
|
+
process.env.CORTEX_ROOT = serverPkgRoot;
|
|
33
|
+
}
|
|
34
|
+
// Load .env from cwd first (user's project), then package root (dev/monorepo).
|
|
35
|
+
// dotenv's default is "first wins" — cwd values take priority.
|
|
36
|
+
const cwdEnv = path.join(process.cwd(), '.env');
|
|
37
|
+
const cwdEnvLocal = path.join(process.cwd(), '.env.local');
|
|
38
|
+
const pkgEnv = path.join(packageRoot, '.env');
|
|
39
|
+
const pkgEnvLocal = path.join(packageRoot, '.env.local');
|
|
40
|
+
config({ path: cwdEnv, quiet: true });
|
|
41
|
+
config({ path: pkgEnv, quiet: true });
|
|
42
|
+
config({ path: cwdEnvLocal, override: true, quiet: true });
|
|
43
|
+
config({ path: pkgEnvLocal, override: true, quiet: true });
|
|
44
|
+
// Import middleware and routes
|
|
45
|
+
import { corsMiddleware } from './middleware/cors.js';
|
|
46
|
+
import { errorHandler } from './middleware/errorHandler.js';
|
|
47
|
+
import { messagesRouter, setServerOrchestrator } from './routes/messages.js';
|
|
48
|
+
import { modelsRouter } from './routes/models.js';
|
|
49
|
+
import { healthRouter } from './routes/health.js';
|
|
50
|
+
import { approvalRouter } from './routes/approval.js';
|
|
51
|
+
import { sessionsRouter } from './routes/sessions.js';
|
|
52
|
+
import { mcpRouter } from './routes/mcp.js';
|
|
53
|
+
import { toolsRouter } from './routes/tools.js';
|
|
54
|
+
import { permissionsRouter } from './routes/permissions.js';
|
|
55
|
+
import { middlewareRouter } from './routes/middleware.js';
|
|
56
|
+
import { systemMessagesRouter } from './routes/system-messages.js';
|
|
57
|
+
import { prRouter } from './routes/pr.js';
|
|
58
|
+
import { configRouter } from './routes/config.js';
|
|
59
|
+
// Import core library components
|
|
60
|
+
import { createOrchestrator } from '@nexus-cortex/core';
|
|
61
|
+
import { SandboxViewServer, TmuxViewServer, SessionPersistence, TmuxManager } from '@nexus-cortex/executors';
|
|
62
|
+
export class CortexV4Server {
|
|
63
|
+
app;
|
|
64
|
+
port;
|
|
65
|
+
debug;
|
|
66
|
+
stateless;
|
|
67
|
+
yolo;
|
|
68
|
+
server = null;
|
|
69
|
+
orchestrator = null;
|
|
70
|
+
viewServer = null;
|
|
71
|
+
idleTimeoutMs;
|
|
72
|
+
idleTimer = null;
|
|
73
|
+
cleanupInterval = null;
|
|
74
|
+
constructor(config = {}) {
|
|
75
|
+
this.port = config.port || parseInt(process.env.PORT || '4000', 10);
|
|
76
|
+
this.debug = config.debug || process.env.DEBUG === 'true';
|
|
77
|
+
this.stateless = config.stateless || (process.env.CORTEX_MODE) === 'stateless';
|
|
78
|
+
this.yolo = config.yolo || false;
|
|
79
|
+
this.idleTimeoutMs = config.idleTimeoutMs || parseInt(process.env.SERVER_IDLE_TIMEOUT || '0', 10);
|
|
80
|
+
this.app = express();
|
|
81
|
+
this.setupMiddleware();
|
|
82
|
+
this.setupRoutes();
|
|
83
|
+
this.setupErrorHandling();
|
|
84
|
+
}
|
|
85
|
+
setupMiddleware() {
|
|
86
|
+
// Body parsing. Capture the raw bytes so the PR webhook can verify its HMAC
|
|
87
|
+
// signature against the exact payload GitHub signed — re-serialized JSON would
|
|
88
|
+
// change the bytes and break the MAC.
|
|
89
|
+
this.app.use(express.json({
|
|
90
|
+
limit: '50mb',
|
|
91
|
+
verify: (req, _res, buf) => {
|
|
92
|
+
req.rawBody = buf;
|
|
93
|
+
},
|
|
94
|
+
}));
|
|
95
|
+
this.app.use(express.urlencoded({ extended: true, limit: '50mb' }));
|
|
96
|
+
// CORS
|
|
97
|
+
this.app.use(corsMiddleware);
|
|
98
|
+
// Request logging
|
|
99
|
+
if (this.debug) {
|
|
100
|
+
this.app.use((req, res, next) => {
|
|
101
|
+
console.log(chalk.cyan(`[${new Date().toISOString()}] ${req.method} ${req.path}`));
|
|
102
|
+
if (req.body?.model) {
|
|
103
|
+
console.log(chalk.gray(` Model: ${req.body.model}`));
|
|
104
|
+
}
|
|
105
|
+
if (req.body?.stream !== undefined) {
|
|
106
|
+
console.log(chalk.gray(` Stream: ${req.body.stream}`));
|
|
107
|
+
}
|
|
108
|
+
next();
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Idle timeout: reset timer on every request
|
|
112
|
+
if (this.idleTimeoutMs > 0) {
|
|
113
|
+
this.app.use((_req, _res, next) => {
|
|
114
|
+
this.resetIdleTimer();
|
|
115
|
+
next();
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
resetIdleTimer() {
|
|
120
|
+
if (this.idleTimer)
|
|
121
|
+
clearTimeout(this.idleTimer);
|
|
122
|
+
this.idleTimer = setTimeout(async () => {
|
|
123
|
+
console.log(chalk.yellow(`[IDLE] No requests for ${Math.round(this.idleTimeoutMs / 1000)}s -- shutting down`));
|
|
124
|
+
await this.stop();
|
|
125
|
+
process.exit(0);
|
|
126
|
+
}, this.idleTimeoutMs);
|
|
127
|
+
this.idleTimer.unref();
|
|
128
|
+
}
|
|
129
|
+
setupRoutes() {
|
|
130
|
+
// Main endpoints
|
|
131
|
+
this.app.use(messagesRouter);
|
|
132
|
+
this.app.use(modelsRouter);
|
|
133
|
+
this.app.use(healthRouter);
|
|
134
|
+
this.app.use(approvalRouter);
|
|
135
|
+
this.app.use(sessionsRouter);
|
|
136
|
+
this.app.use(mcpRouter);
|
|
137
|
+
this.app.use(toolsRouter);
|
|
138
|
+
this.app.use(permissionsRouter);
|
|
139
|
+
this.app.use(middlewareRouter);
|
|
140
|
+
this.app.use(systemMessagesRouter);
|
|
141
|
+
this.app.use(prRouter);
|
|
142
|
+
this.app.use(configRouter);
|
|
143
|
+
// Shutdown endpoint
|
|
144
|
+
this.app.post('/shutdown', async (_req, res) => {
|
|
145
|
+
res.json({ status: 'shutting_down' });
|
|
146
|
+
console.log(chalk.yellow('\n[SHUTDOWN] Shutdown requested via /shutdown'));
|
|
147
|
+
await this.stop();
|
|
148
|
+
process.exit(0);
|
|
149
|
+
});
|
|
150
|
+
// Root endpoint
|
|
151
|
+
this.app.get('/', (req, res) => {
|
|
152
|
+
res.redirect('/health');
|
|
153
|
+
});
|
|
154
|
+
// 404 handler
|
|
155
|
+
this.app.use((req, res) => {
|
|
156
|
+
res.status(404).json({
|
|
157
|
+
error: {
|
|
158
|
+
message: `Endpoint not found: ${req.method} ${req.path}`,
|
|
159
|
+
type: 'not_found'
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
setupErrorHandling() {
|
|
165
|
+
this.app.use(errorHandler);
|
|
166
|
+
}
|
|
167
|
+
async start() {
|
|
168
|
+
// Step 1: Initialize persistent orchestrator (if not stateless)
|
|
169
|
+
if (!this.stateless) {
|
|
170
|
+
console.log(chalk.cyan('[INIT] Initializing persistent orchestrator...'));
|
|
171
|
+
const defaultModel = process.env.DEFAULT_MODEL_ID || 'gemini-2.5-flash';
|
|
172
|
+
// PROJECT_PATH controls the file access boundary for tool execution.
|
|
173
|
+
// Defaults to monorepo root; set to a parent directory (e.g., /path/to/projects)
|
|
174
|
+
// to allow tools to access files outside the monorepo in headless mode.
|
|
175
|
+
const projectPath = process.env.PROJECT_PATH || process.cwd();
|
|
176
|
+
this.orchestrator = await createOrchestrator({
|
|
177
|
+
defaultModelId: defaultModel,
|
|
178
|
+
projectPath,
|
|
179
|
+
workingDirectory: projectPath,
|
|
180
|
+
enableTimeline: true,
|
|
181
|
+
debug: this.debug
|
|
182
|
+
}, {
|
|
183
|
+
// Use auto-approve if --yolo or YOLO=true, otherwise use interactive mode
|
|
184
|
+
permissionMode: this.yolo ? 'auto' : 'interactive'
|
|
185
|
+
});
|
|
186
|
+
// Auto-resume: check for most recent session on disk
|
|
187
|
+
const resumeSessionId = process.env.RESUME_SESSION_ID;
|
|
188
|
+
const autoResume = process.env.AUTO_RESUME === 'true'; // off by default — use --resume or /continue to load sessions
|
|
189
|
+
let resumed = false;
|
|
190
|
+
if (resumeSessionId) {
|
|
191
|
+
// Explicit session ID provided
|
|
192
|
+
try {
|
|
193
|
+
const session = await this.orchestrator.resumeSession(resumeSessionId, projectPath);
|
|
194
|
+
console.log(chalk.green(`[OK] Resumed session ${resumeSessionId} (${session.messageCount} messages, turn ${Math.floor(session.messageCount / 2)})`));
|
|
195
|
+
resumed = true;
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
console.log(chalk.yellow(`[WARN] Could not resume session ${resumeSessionId}: ${err.message}`));
|
|
199
|
+
console.log(chalk.yellow(' Starting fresh session instead'));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else if (autoResume) {
|
|
203
|
+
// Auto-detect most recent session
|
|
204
|
+
try {
|
|
205
|
+
const historyStore = this.orchestrator.historyStore;
|
|
206
|
+
if (historyStore) {
|
|
207
|
+
const sessions = await historyStore.listSessions();
|
|
208
|
+
if (sessions.length > 0) {
|
|
209
|
+
// sessions are sorted newest-first by listSessions()
|
|
210
|
+
const latest = sessions[0];
|
|
211
|
+
const session = await this.orchestrator.resumeSession(latest.sessionId, projectPath);
|
|
212
|
+
console.log(chalk.green(`[OK] Auto-resumed latest session ${latest.sessionId.substring(0, 8)}... (${session.messageCount} messages)`));
|
|
213
|
+
resumed = true;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
if (this.debug) {
|
|
219
|
+
console.log(chalk.gray(`[auto-resume] No session to resume: ${err.message}`));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (!resumed) {
|
|
224
|
+
await this.orchestrator.createSession(projectPath, defaultModel);
|
|
225
|
+
console.log(chalk.green('[OK] New session created'));
|
|
226
|
+
}
|
|
227
|
+
// Make orchestrator available to routes
|
|
228
|
+
setServerOrchestrator(this.orchestrator);
|
|
229
|
+
console.log(chalk.green('[OK] Persistent orchestrator ready'));
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
console.log(chalk.yellow('[STATELESS] Stateless mode - orchestrator created per request'));
|
|
233
|
+
}
|
|
234
|
+
// Step 2: Initialize SandboxViewServer (unified dashboard) — opt-in, default off.
|
|
235
|
+
// MASTER SWITCH: ENABLE_DASHBOARD gates the dashboard everywhere (boot here AND the
|
|
236
|
+
// tools' demand-start paths). Binds an extra port (DASHBOARD_PORT, default 4001).
|
|
237
|
+
if (process.env.ENABLE_DASHBOARD === 'true') {
|
|
238
|
+
console.log(chalk.cyan('[INIT] Starting unified dashboard (sandbox + tmux viewer)...'));
|
|
239
|
+
this.viewServer = SandboxViewServer.getInstance();
|
|
240
|
+
await this.viewServer.start(); // port: DASHBOARD_PORT > 4001, walks up to 10 on conflict
|
|
241
|
+
// Initialize TmuxViewServer routes (piggybacks on SandboxViewServer)
|
|
242
|
+
const tmuxViewer = TmuxViewServer.getInstance();
|
|
243
|
+
await tmuxViewer.initialize();
|
|
244
|
+
// Recover persisted tmux sessions
|
|
245
|
+
try {
|
|
246
|
+
const projectRoot = process.env.PROJECT_ROOT || process.cwd();
|
|
247
|
+
const tmuxPersistence = new SessionPersistence(projectRoot);
|
|
248
|
+
const tmuxManager = TmuxManager.getInstance();
|
|
249
|
+
if (await tmuxManager.isAvailable()) {
|
|
250
|
+
const activeSessions = await tmuxManager.listSessions();
|
|
251
|
+
const recovery = await tmuxPersistence.recoverSessions(activeSessions);
|
|
252
|
+
if (recovery.recovered > 0) {
|
|
253
|
+
console.log(chalk.green(`[OK] Tmux: ${recovery.recovered} session(s) recovered, ${recovery.cleaned} cleaned`));
|
|
254
|
+
const recoveredMeta = await tmuxPersistence.listSessions();
|
|
255
|
+
tmuxViewer.markRecovered(recoveredMeta.map(m => m.sessionId));
|
|
256
|
+
}
|
|
257
|
+
else if (recovery.total > 0) {
|
|
258
|
+
console.log(chalk.gray(`[OK] Tmux: ${recovery.cleaned} stale session(s) cleaned`));
|
|
259
|
+
}
|
|
260
|
+
const cleanup = await tmuxPersistence.autoCleanup(activeSessions, 24);
|
|
261
|
+
if (cleanup.total > 0) {
|
|
262
|
+
console.log(chalk.yellow(`[WARN] Tmux cleanup: ${cleanup.orphaned} orphaned, ${cleanup.stale} stale`));
|
|
263
|
+
}
|
|
264
|
+
// Periodic cleanup every hour
|
|
265
|
+
this.cleanupInterval = setInterval(async () => {
|
|
266
|
+
try {
|
|
267
|
+
const currentSessions = await tmuxManager.listSessions();
|
|
268
|
+
await tmuxPersistence.autoCleanup(currentSessions, 24);
|
|
269
|
+
}
|
|
270
|
+
catch { }
|
|
271
|
+
}, 60 * 60 * 1000);
|
|
272
|
+
this.cleanupInterval.unref();
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
console.log(chalk.yellow(`[WARN] Tmux recovery failed: ${err.message}`));
|
|
277
|
+
}
|
|
278
|
+
const viewPort = this.viewServer.getPort();
|
|
279
|
+
console.log(chalk.green(`[OK] Dashboard running on http://localhost:${viewPort}`));
|
|
280
|
+
}
|
|
281
|
+
// Step 3: Start HTTP server
|
|
282
|
+
return new Promise((resolve, reject) => {
|
|
283
|
+
const attemptPort = (port, maxAttempts = 10) => {
|
|
284
|
+
if (maxAttempts <= 0) {
|
|
285
|
+
reject(new Error('Could not find an available port after 10 attempts'));
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const server = this.app.listen(port, '0.0.0.0', () => {
|
|
289
|
+
this.server = server;
|
|
290
|
+
this.port = port;
|
|
291
|
+
console.log(chalk.green(`\n[OK] Nexus Cortex server running on port ${port}`));
|
|
292
|
+
console.log(chalk.blue(`[ARCH] Core Library Architecture`));
|
|
293
|
+
console.log(chalk.yellow(`[API] API Server: http://localhost:${port}/health`));
|
|
294
|
+
if (this.viewServer)
|
|
295
|
+
console.log(chalk.yellow(`[VIEW] Dashboard: http://localhost:${this.viewServer.getPort()}`));
|
|
296
|
+
console.log(chalk.gray(`\nAPI Endpoints:`));
|
|
297
|
+
console.log(chalk.gray(` POST /v1/messages - Main LLM endpoint`));
|
|
298
|
+
console.log(chalk.gray(` GET /models - List available models`));
|
|
299
|
+
console.log(chalk.gray(` GET /health - Server status`));
|
|
300
|
+
if (this.viewServer) {
|
|
301
|
+
const vp = this.viewServer.getPort();
|
|
302
|
+
console.log(chalk.gray(`\nDashboard:`));
|
|
303
|
+
console.log(chalk.gray(` http://localhost:${vp}/ - Sandbox list`));
|
|
304
|
+
console.log(chalk.gray(` http://localhost:${vp}/tmux - Tmux sessions`));
|
|
305
|
+
console.log(chalk.gray(` http://localhost:${vp}/sandbox/ID - View sandbox`));
|
|
306
|
+
console.log(chalk.gray(` http://localhost:${vp}/tmux/ID - View tmux\n`));
|
|
307
|
+
}
|
|
308
|
+
if (this.idleTimeoutMs > 0) {
|
|
309
|
+
console.log(chalk.gray(` Idle timeout: ${Math.round(this.idleTimeoutMs / 1000)}s`));
|
|
310
|
+
this.resetIdleTimer();
|
|
311
|
+
}
|
|
312
|
+
resolve();
|
|
313
|
+
});
|
|
314
|
+
server.on('error', (err) => {
|
|
315
|
+
if (err.code === 'EADDRINUSE') {
|
|
316
|
+
console.log(chalk.yellow(`Port ${port} in use, trying ${port + 1}...`));
|
|
317
|
+
attemptPort(port + 1, maxAttempts - 1);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
reject(err);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
};
|
|
324
|
+
attemptPort(this.port);
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
async stop() {
|
|
328
|
+
if (this.idleTimer) {
|
|
329
|
+
clearTimeout(this.idleTimer);
|
|
330
|
+
this.idleTimer = null;
|
|
331
|
+
}
|
|
332
|
+
if (this.cleanupInterval) {
|
|
333
|
+
clearInterval(this.cleanupInterval);
|
|
334
|
+
this.cleanupInterval = null;
|
|
335
|
+
}
|
|
336
|
+
// Gracefully close the dashboard view server if it was started (eager or lazy).
|
|
337
|
+
if (this.viewServer) {
|
|
338
|
+
try {
|
|
339
|
+
await this.viewServer.stop();
|
|
340
|
+
}
|
|
341
|
+
catch { /* viewer is optional */ }
|
|
342
|
+
this.viewServer = null;
|
|
343
|
+
}
|
|
344
|
+
// Print session summary on shutdown
|
|
345
|
+
if (this.orchestrator) {
|
|
346
|
+
try {
|
|
347
|
+
const historyStore = this.orchestrator.historyStore;
|
|
348
|
+
if (historyStore) {
|
|
349
|
+
const sessions = await historyStore.listSessions();
|
|
350
|
+
const recent = sessions.slice(0, 10);
|
|
351
|
+
if (recent.length > 0) {
|
|
352
|
+
console.log(chalk.cyan('\nRecent sessions:'));
|
|
353
|
+
for (const s of recent) {
|
|
354
|
+
const age = Math.floor((Date.now() - s.lastModified.getTime()) / 60000);
|
|
355
|
+
const ageStr = age < 60 ? `${age}m ago` : `${Math.floor(age / 60)}h ago`;
|
|
356
|
+
console.log(chalk.gray(` ${s.sessionId} ${s.messageCount} msgs ${ageStr}`));
|
|
357
|
+
}
|
|
358
|
+
console.log(chalk.gray(`\nResume with: cortex --resume <session-id>`));
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
catch { }
|
|
363
|
+
}
|
|
364
|
+
// Close the HTTP server, but cap the wait with a grace period so a hung
|
|
365
|
+
// keep-alive connection can't block shutdown forever (default 10s; 0 = wait forever).
|
|
366
|
+
const graceMs = parseInt(process.env.SHUTDOWN_GRACE_MS || '10000', 10);
|
|
367
|
+
return new Promise((resolve) => {
|
|
368
|
+
if (this.server) {
|
|
369
|
+
let graceTimer = null;
|
|
370
|
+
if (graceMs > 0) {
|
|
371
|
+
graceTimer = setTimeout(() => {
|
|
372
|
+
console.log(chalk.yellow(`Server stopped (forced after ${Math.round(graceMs / 1000)}s grace)`));
|
|
373
|
+
resolve();
|
|
374
|
+
}, graceMs);
|
|
375
|
+
if (typeof graceTimer.unref === 'function')
|
|
376
|
+
graceTimer.unref();
|
|
377
|
+
}
|
|
378
|
+
this.server.close(() => {
|
|
379
|
+
if (graceTimer)
|
|
380
|
+
clearTimeout(graceTimer);
|
|
381
|
+
console.log(chalk.yellow('Server stopped'));
|
|
382
|
+
resolve();
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
resolve();
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
getPort() {
|
|
391
|
+
return this.port;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
// Start the server. Exported so the npm bin wrappers (bin/cortex-server.js) can
|
|
395
|
+
// invoke it explicitly — when the module is loaded via the bin's dynamic import,
|
|
396
|
+
// import.meta.url no longer matches argv[1], so the direct-run guard below won't
|
|
397
|
+
// fire (that silent no-op shipped once; caught by the local-registry dry-run).
|
|
398
|
+
export function main() {
|
|
399
|
+
// --help flag
|
|
400
|
+
if (process.argv.includes('--help') || process.argv.includes('-h')) {
|
|
401
|
+
console.log(`
|
|
402
|
+
${chalk.bold('Nexus Cortex Server')} — Multi-provider AI orchestration library
|
|
403
|
+
|
|
404
|
+
${chalk.bold.underline('Usage:')}
|
|
405
|
+
node dist/index.js [options]
|
|
406
|
+
npm run dev ${chalk.gray('# tsx watch with auto-restart')}
|
|
407
|
+
|
|
408
|
+
${chalk.bold.underline('Options:')}
|
|
409
|
+
--help, -h Show this help
|
|
410
|
+
--debug Enable debug logging (system messages, routes, injection)
|
|
411
|
+
--yolo Auto-approve all tool executions (headless mode)
|
|
412
|
+
--port <number> Override port (default: 4000)
|
|
413
|
+
--idle-timeout <secs> Auto-shutdown after N seconds of inactivity (0 = disabled)
|
|
414
|
+
|
|
415
|
+
${chalk.bold.underline('Environment Variables:')}
|
|
416
|
+
DEFAULT_MODEL_ID Model to use (must be a registry ID, e.g. grok-4-1-fast-reasoning)
|
|
417
|
+
PORT Server port (default: 4000)
|
|
418
|
+
DEBUG Enable debug logging (true/false)
|
|
419
|
+
YOLO Auto-approve all permissions (true/false)
|
|
420
|
+
AUTO_RESUME Auto-resume last session on startup (default: false)
|
|
421
|
+
RESUME_SESSION_ID Resume a specific session by UUID
|
|
422
|
+
CORTEX_MODE "stateless" for per-request sessions (default: persistent)
|
|
423
|
+
SERVER_IDLE_TIMEOUT Auto-shutdown after N seconds of inactivity (default: 0 = off)
|
|
424
|
+
|
|
425
|
+
${chalk.bold.underline('Headless Mode (curl):')}
|
|
426
|
+
The server is a stateful agent. Sequential requests share the same session
|
|
427
|
+
with full conversation history, context management, and tool execution.
|
|
428
|
+
|
|
429
|
+
${chalk.cyan('# Start server')}
|
|
430
|
+
DEFAULT_MODEL_ID=grok-4-1-fast-reasoning node dist/index.js &
|
|
431
|
+
|
|
432
|
+
${chalk.cyan('# Send a message (adds to conversation)')}
|
|
433
|
+
curl -s 'http://localhost:4000/v1/messages' \\
|
|
434
|
+
-H 'Content-Type: application/json' \\
|
|
435
|
+
-d '{"model":"grok-4-1-fast-reasoning","messages":[{"role":"user","content":"Read package.json"}]}'
|
|
436
|
+
|
|
437
|
+
${chalk.cyan('# Multi-turn: next request continues the conversation')}
|
|
438
|
+
curl -s 'http://localhost:4000/v1/messages' \\
|
|
439
|
+
-H 'Content-Type: application/json' \\
|
|
440
|
+
-d '{"model":"grok-4-1-fast-reasoning","messages":[{"role":"user","content":"What was the version?"}]}'
|
|
441
|
+
|
|
442
|
+
${chalk.bold.underline('Session Management:')}
|
|
443
|
+
GET /sessions List all sessions
|
|
444
|
+
POST /sessions/new Start fresh session (old one saved)
|
|
445
|
+
GET /sessions/:id/stats Token usage, turns, tool calls
|
|
446
|
+
GET /sessions/:id/messages Full message history
|
|
447
|
+
POST /sessions/:id/model Switch model mid-session
|
|
448
|
+
POST /sessions/:id/compaction Trigger context compaction
|
|
449
|
+
GET /sessions/:id/cache/metrics Cache hit rate and savings
|
|
450
|
+
|
|
451
|
+
${chalk.bold.underline('Dev Workflow:')}
|
|
452
|
+
System message edits (CLAUDE.md, MEMORY.md, SYSTEM_PROMPT.md) take effect on
|
|
453
|
+
the next request — no restart needed. Code changes with tsx watch auto-restart
|
|
454
|
+
the server and resume the last session from JSONL.
|
|
455
|
+
|
|
456
|
+
${chalk.cyan('# Dev mode with HMR-like iteration')}
|
|
457
|
+
cd packages/server && npm run dev
|
|
458
|
+
|
|
459
|
+
${chalk.cyan('# Fresh start (no session resume)')}
|
|
460
|
+
AUTO_RESUME=false npm run dev
|
|
461
|
+
|
|
462
|
+
${chalk.bold.underline('Response Fields:')}
|
|
463
|
+
content[] Model text response
|
|
464
|
+
toolUses[] Tools called (name, input)
|
|
465
|
+
usage.inputTokens Total input tokens (reveals system message overhead)
|
|
466
|
+
usage.outputTokens Response size
|
|
467
|
+
metadata.toolCallIterations Tool round-trips
|
|
468
|
+
`);
|
|
469
|
+
process.exit(0);
|
|
470
|
+
}
|
|
471
|
+
// Parse flags
|
|
472
|
+
const portFlagIndex = process.argv.indexOf('--port');
|
|
473
|
+
const portFromFlag = portFlagIndex !== -1 ? parseInt(process.argv[portFlagIndex + 1], 10) : undefined;
|
|
474
|
+
const idleFlagIndex = process.argv.indexOf('--idle-timeout');
|
|
475
|
+
const idleFromFlag = idleFlagIndex !== -1 ? parseInt(process.argv[idleFlagIndex + 1], 10) : undefined;
|
|
476
|
+
const port = portFromFlag || parseInt(process.env.PORT || '4000', 10);
|
|
477
|
+
const debug = process.env.DEBUG === 'true' || process.argv.includes('--debug');
|
|
478
|
+
const yolo = process.env.YOLO === 'true' || process.argv.includes('--yolo');
|
|
479
|
+
const idleTimeoutMs = (idleFromFlag || parseInt(process.env.SERVER_IDLE_TIMEOUT || '0', 10)) * 1000;
|
|
480
|
+
if (yolo) {
|
|
481
|
+
console.log(chalk.yellow('[WARN] YOLO mode enabled - auto-approving all permissions'));
|
|
482
|
+
}
|
|
483
|
+
const server = new CortexV4Server({ port, debug, yolo, idleTimeoutMs });
|
|
484
|
+
server.start().catch((error) => {
|
|
485
|
+
console.error(chalk.red('Failed to start server:'), error);
|
|
486
|
+
process.exit(1);
|
|
487
|
+
});
|
|
488
|
+
// Graceful shutdown
|
|
489
|
+
process.on('SIGINT', async () => {
|
|
490
|
+
console.log('\nShutting down...');
|
|
491
|
+
await server.stop();
|
|
492
|
+
process.exit(0);
|
|
493
|
+
});
|
|
494
|
+
process.on('SIGTERM', async () => {
|
|
495
|
+
console.log('\nShutting down...');
|
|
496
|
+
await server.stop();
|
|
497
|
+
process.exit(0);
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
// Run directly (node dist/index.js)? Compare realpaths so the check also holds
|
|
501
|
+
// when the entry is reached through a symlink (npm global bins, npm link).
|
|
502
|
+
const __entryArg = process.argv[1];
|
|
503
|
+
if (__entryArg) {
|
|
504
|
+
try {
|
|
505
|
+
const entryReal = fs.realpathSync(__entryArg);
|
|
506
|
+
if (path.resolve(__filename) === entryReal)
|
|
507
|
+
main();
|
|
508
|
+
}
|
|
509
|
+
catch {
|
|
510
|
+
/* argv[1] not a resolvable file — a wrapper will call main() explicitly */
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORS middleware configuration
|
|
3
|
+
*/
|
|
4
|
+
import cors from 'cors';
|
|
5
|
+
export declare const corsMiddleware: (req: cors.CorsRequest, res: {
|
|
6
|
+
statusCode?: number | undefined;
|
|
7
|
+
setHeader(key: string, value: string): any;
|
|
8
|
+
end(): any;
|
|
9
|
+
}, next: (err?: any) => any) => void;
|
|
10
|
+
//# sourceMappingURL=cors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,eAAO,MAAM,cAAc;cAMokC,CAAC;;;aAAmH,CAAC,sBADltC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORS middleware configuration
|
|
3
|
+
*/
|
|
4
|
+
import cors from 'cors';
|
|
5
|
+
export const corsMiddleware = cors({
|
|
6
|
+
origin: '*',
|
|
7
|
+
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
|
|
8
|
+
allowedHeaders: ['Content-Type', 'Authorization', 'x-api-key', 'anthropic-version', 'anthropic-beta'],
|
|
9
|
+
credentials: true
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC;IACpD,cAAc,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;IACrG,WAAW,EAAE,IAAI;CAClB,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express error handling middleware
|
|
3
|
+
*/
|
|
4
|
+
import { Request, Response, NextFunction } from 'express';
|
|
5
|
+
export interface ApiError extends Error {
|
|
6
|
+
statusCode?: number;
|
|
7
|
+
type?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function errorHandler(err: ApiError, req: Request, res: Response, next: NextFunction): void;
|
|
10
|
+
//# sourceMappingURL=errorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/middleware/errorHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,GACjB,IAAI,CAeN"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function errorHandler(err, req, res, next) {
|
|
2
|
+
const statusCode = err.statusCode || 500;
|
|
3
|
+
const errorType = err.type || 'server_error';
|
|
4
|
+
console.error(`[Server Error] ${err.message}`);
|
|
5
|
+
if (process.env.DEBUG === 'true') {
|
|
6
|
+
console.error(err.stack);
|
|
7
|
+
}
|
|
8
|
+
res.status(statusCode).json({
|
|
9
|
+
error: {
|
|
10
|
+
message: err.message,
|
|
11
|
+
type: errorType
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=errorHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/middleware/errorHandler.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,YAAY,CAC1B,GAAa,EACb,GAAY,EACZ,GAAa,EACb,IAAkB;IAElB,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC;IACzC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,IAAI,cAAc,CAAC;IAE7C,OAAO,CAAC,KAAK,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QAC1B,KAAK,EAAE;YACL,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,SAAS;SAChB;KACF,CAAC,CAAC;AACL,CAAC"}
|