@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.
Files changed (130) hide show
  1. package/.cortex/agents/AGENT_PROFILE_GUIDE.md +307 -0
  2. package/.cortex/agents/README.md +268 -0
  3. package/.cortex/agents/a-frontend-landing-page-designer.md +41 -0
  4. package/.cortex/agents/autoresearch-agent.md +49 -0
  5. package/.cortex/agents/code-reviewer.md +63 -0
  6. package/.cortex/agents/context-research.md +26 -0
  7. package/.cortex/agents/doc-writer.md +92 -0
  8. package/.cortex/agents/explore.md +63 -0
  9. package/.cortex/agents/new-model-api-integrator-analyst.md +41 -0
  10. package/.cortex/agents/plan.md +109 -0
  11. package/.cortex/agents/pr-architecture-reviewer.md +77 -0
  12. package/.cortex/agents/pr-code-quality.md +78 -0
  13. package/.cortex/agents/pr-implementer.md +50 -0
  14. package/.cortex/agents/pr-security-auditor.md +62 -0
  15. package/.cortex/agents/pr-test-writer.md +67 -0
  16. package/.cortex/agents/refactor.md +118 -0
  17. package/.cortex/agents/test-writer.md +72 -0
  18. package/.cortex/agents/web-researcher.md +72 -0
  19. package/.cortex/bench/tasks/sample-tasks.json +20 -0
  20. package/.cortex/commands/compare.md +14 -0
  21. package/.cortex/commands/deps.md +16 -0
  22. package/.cortex/commands/diff.md +14 -0
  23. package/.cortex/commands/explain.md +16 -0
  24. package/.cortex/commands/find-bug.md +13 -0
  25. package/.cortex/commands/profile.md +15 -0
  26. package/.cortex/commands/review.md +18 -0
  27. package/.cortex/commands/search.md +16 -0
  28. package/.cortex/commands/test.md +15 -0
  29. package/.cortex/permissions.dev.json +20 -0
  30. package/.cortex/permissions.example.json +71 -0
  31. package/.cortex/permissions.prod.json +63 -0
  32. package/.cortex/permissions.test.json +19 -0
  33. package/.cortex/skills/autoresearch/SKILL.md +77 -0
  34. package/.cortex/skills/autoresearch/personas/README.md +45 -0
  35. package/.cortex/skills/autoresearch/personas/aggressive-refactor.md +25 -0
  36. package/.cortex/skills/autoresearch/personas/creative.md +29 -0
  37. package/.cortex/skills/autoresearch/personas/perf-hunter.md +27 -0
  38. package/.cortex/skills/autoresearch/personas/precise.md +23 -0
  39. package/.cortex/skills/autoresearch/personas/root-cause.md +26 -0
  40. package/.cortex/skills/autoresearch/personas/security-auditor.md +29 -0
  41. package/.cortex/skills/autoresearch/personas/skeptic-reviewer.md +31 -0
  42. package/.cortex/skills/autoresearch/personas/test-first.md +25 -0
  43. package/.cortex/skills/best-of-n/SKILL.md +76 -0
  44. package/.cortex/skills/cortex/SKILL.md +834 -0
  45. package/.cortex/skills/cortex-bench/SKILL.md +354 -0
  46. package/.cortex/skills/docx/SKILL.md +83 -0
  47. package/.cortex/skills/pdf-documents/SKILL.md +297 -0
  48. package/.cortex/skills/pdf-documents/sections/01-image-acquisition.md +132 -0
  49. package/.cortex/skills/pdf-documents/sections/02-ai-image-generation.md +274 -0
  50. package/.cortex/skills/pdf-documents/sections/03-paper-sizes.md +89 -0
  51. package/.cortex/skills/pdf-documents/sections/04-design-system.md +549 -0
  52. package/.cortex/skills/pdf-documents/sections/05-css-print-rules.md +135 -0
  53. package/.cortex/skills/pdf-documents/sections/06-svg-charts.md +100 -0
  54. package/.cortex/skills/pdf-documents/sections/07-templates.md +224 -0
  55. package/.cortex/skills/pdf-documents/sections/08-scaled-output.md +164 -0
  56. package/.cortex/skills/pdf-documents/sections/09-preview-qa.md +66 -0
  57. package/.cortex/skills/pdf-documents/sections/10-reading-pdfs.md +499 -0
  58. package/.cortex/skills/pdf-documents/sections/11-form-filling.md +241 -0
  59. package/.cortex/skills/pptx/SKILL.md +90 -0
  60. package/.cortex/skills/resume-analyst/SKILL.md +373 -0
  61. package/.cortex/skills/verify-work/SKILL.md +74 -0
  62. package/.cortex/skills/xlsx/SKILL.md +101 -0
  63. package/.cortex/system-messages/messages/WORK_QUALITY.md +159 -0
  64. package/.cortex/system-messages/registry.json +18 -0
  65. package/LICENSE +202 -0
  66. package/NOTICE +2 -0
  67. package/README.md +13 -0
  68. package/bin/cortex-daemon.js +47 -0
  69. package/bin/cortex-server.js +15 -0
  70. package/dist/index.d.ts +30 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +513 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/middleware/cors.d.ts +10 -0
  75. package/dist/middleware/cors.d.ts.map +1 -0
  76. package/dist/middleware/cors.js +11 -0
  77. package/dist/middleware/cors.js.map +1 -0
  78. package/dist/middleware/errorHandler.d.ts +10 -0
  79. package/dist/middleware/errorHandler.d.ts.map +1 -0
  80. package/dist/middleware/errorHandler.js +15 -0
  81. package/dist/middleware/errorHandler.js.map +1 -0
  82. package/dist/routes/approval.d.ts +2 -0
  83. package/dist/routes/approval.d.ts.map +1 -0
  84. package/dist/routes/approval.js +96 -0
  85. package/dist/routes/approval.js.map +1 -0
  86. package/dist/routes/config.d.ts +2 -0
  87. package/dist/routes/config.d.ts.map +1 -0
  88. package/dist/routes/config.js +70 -0
  89. package/dist/routes/config.js.map +1 -0
  90. package/dist/routes/health.d.ts +2 -0
  91. package/dist/routes/health.d.ts.map +1 -0
  92. package/dist/routes/health.js +1031 -0
  93. package/dist/routes/health.js.map +1 -0
  94. package/dist/routes/mcp.d.ts +2 -0
  95. package/dist/routes/mcp.d.ts.map +1 -0
  96. package/dist/routes/mcp.js +251 -0
  97. package/dist/routes/mcp.js.map +1 -0
  98. package/dist/routes/messages.d.ts +5 -0
  99. package/dist/routes/messages.d.ts.map +1 -0
  100. package/dist/routes/messages.js +136 -0
  101. package/dist/routes/messages.js.map +1 -0
  102. package/dist/routes/middleware.d.ts +2 -0
  103. package/dist/routes/middleware.d.ts.map +1 -0
  104. package/dist/routes/middleware.js +146 -0
  105. package/dist/routes/middleware.js.map +1 -0
  106. package/dist/routes/models.d.ts +2 -0
  107. package/dist/routes/models.d.ts.map +1 -0
  108. package/dist/routes/models.js +29 -0
  109. package/dist/routes/models.js.map +1 -0
  110. package/dist/routes/permissions.d.ts +2 -0
  111. package/dist/routes/permissions.d.ts.map +1 -0
  112. package/dist/routes/permissions.js +253 -0
  113. package/dist/routes/permissions.js.map +1 -0
  114. package/dist/routes/pr.d.ts +2 -0
  115. package/dist/routes/pr.d.ts.map +1 -0
  116. package/dist/routes/pr.js +222 -0
  117. package/dist/routes/pr.js.map +1 -0
  118. package/dist/routes/sessions.d.ts +2 -0
  119. package/dist/routes/sessions.d.ts.map +1 -0
  120. package/dist/routes/sessions.js +628 -0
  121. package/dist/routes/sessions.js.map +1 -0
  122. package/dist/routes/system-messages.d.ts +2 -0
  123. package/dist/routes/system-messages.d.ts.map +1 -0
  124. package/dist/routes/system-messages.js +146 -0
  125. package/dist/routes/system-messages.js.map +1 -0
  126. package/dist/routes/tools.d.ts +2 -0
  127. package/dist/routes/tools.d.ts.map +1 -0
  128. package/dist/routes/tools.js +79 -0
  129. package/dist/routes/tools.js.map +1 -0
  130. package/package.json +63 -0
@@ -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"}
@@ -0,0 +1,2 @@
1
+ export declare const approvalRouter: import("express-serve-static-core").Router;
2
+ //# sourceMappingURL=approval.d.ts.map