@luckydraw/cumulus 0.10.1 → 0.12.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.
@@ -0,0 +1,10 @@
1
+ /**
2
+ * API key authentication for the gateway server.
3
+ */
4
+ import type { IncomingMessage, ServerResponse } from 'http';
5
+ /**
6
+ * Validate the X-API-Key header against the allowed keys.
7
+ * Returns true if valid, sends error response and returns false otherwise.
8
+ */
9
+ export declare function authenticate(req: IncomingMessage, res: ServerResponse, apiKeys: string[]): boolean;
10
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/gateway/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,EAAE,GAChB,OAAO,CAiBT"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * API key authentication for the gateway server.
3
+ */
4
+ /**
5
+ * Validate the X-API-Key header against the allowed keys.
6
+ * Returns true if valid, sends error response and returns false otherwise.
7
+ */
8
+ export function authenticate(req, res, apiKeys) {
9
+ const key = req.headers['x-api-key'];
10
+ if (!key) {
11
+ res.writeHead(401, { 'Content-Type': 'application/json' });
12
+ res.end(JSON.stringify({ error: 'Missing X-API-Key header' }));
13
+ return false;
14
+ }
15
+ const keyStr = Array.isArray(key) ? key[0] : key;
16
+ if (!apiKeys.includes(keyStr)) {
17
+ res.writeHead(403, { 'Content-Type': 'application/json' });
18
+ res.end(JSON.stringify({ error: 'Invalid API key' }));
19
+ return false;
20
+ }
21
+ return true;
22
+ }
23
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/gateway/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,GAAoB,EACpB,GAAmB,EACnB,OAAiB;IAEjB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAErC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACjD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAO,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * cumulus-gateway CLI — starts the HTTP/SSE gateway server.
4
+ *
5
+ * Usage:
6
+ * cumulus-gateway # start with defaults from gateway.config.json
7
+ * cumulus-gateway --port 9090 # override port
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/gateway/cli.ts"],"names":[],"mappings":";AACA;;;;;;GAMG"}
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * cumulus-gateway CLI — starts the HTTP/SSE gateway server.
4
+ *
5
+ * Usage:
6
+ * cumulus-gateway # start with defaults from gateway.config.json
7
+ * cumulus-gateway --port 9090 # override port
8
+ */
9
+ import { loadGatewayConfig, getConfigPath } from './config.js';
10
+ import { startGatewayServer } from './server.js';
11
+ async function main() {
12
+ // Simple arg parsing (no commander needed for 2 flags)
13
+ const args = process.argv.slice(2);
14
+ let portOverride;
15
+ for (let i = 0; i < args.length; i++) {
16
+ if (args[i] === '--port' && args[i + 1]) {
17
+ portOverride = parseInt(args[i + 1], 10);
18
+ i++;
19
+ }
20
+ if (args[i] === '--help' || args[i] === '-h') {
21
+ console.log(`cumulus-gateway — HTTP/SSE server for the cumulus message pipeline
22
+
23
+ Usage:
24
+ cumulus-gateway [options]
25
+
26
+ Options:
27
+ --port <number> Override port (default: from config or 8080)
28
+ --help, -h Show this help
29
+
30
+ Config: ${getConfigPath()}
31
+ `);
32
+ process.exit(0);
33
+ }
34
+ }
35
+ const config = await loadGatewayConfig();
36
+ const port = portOverride ?? config.port;
37
+ console.log(`[Gateway] Config: ${getConfigPath()}`);
38
+ console.log(`[Gateway] API keys: ${config.apiKeys.length} configured`);
39
+ const handle = await startGatewayServer({
40
+ port,
41
+ apiKeys: config.apiKeys,
42
+ claudePath: config.claudePath,
43
+ sharedMcpPort: config.sharedMcpPort,
44
+ });
45
+ console.log(`[Gateway] Ready at ${handle.url}`);
46
+ // Graceful shutdown
47
+ const shutdown = async (signal) => {
48
+ console.log(`\n[Gateway] ${signal} received, shutting down...`);
49
+ await handle.close();
50
+ process.exit(0);
51
+ };
52
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
53
+ process.on('SIGINT', () => shutdown('SIGINT'));
54
+ }
55
+ main().catch((err) => {
56
+ console.error('[Gateway] Fatal:', err);
57
+ process.exit(1);
58
+ });
59
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/gateway/cli.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,KAAK,UAAU,IAAI;IACjB,uDAAuD;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,YAAgC,CAAC;IAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACxC,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,CAAC,EAAE,CAAC;QACN,CAAC;QACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC;;;;;;;;;UASR,aAAa,EAAE;CACxB,CAAC,CAAC;YACG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC;IAEzC,OAAO,CAAC,GAAG,CAAC,qBAAqB,aAAa,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;IAEvE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;QACtC,IAAI;QACJ,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAEhD,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,6BAA6B,CAAC,CAAC;QAChE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Gateway server configuration — loads and validates gateway.config.json.
3
+ */
4
+ export interface GatewayConfig {
5
+ apiKeys: string[];
6
+ port: number;
7
+ /** Optional: path to claude binary override */
8
+ claudePath?: string;
9
+ /** Optional: shared MCP server port (0 = disabled) */
10
+ sharedMcpPort?: number;
11
+ /** Optional: log file path for daemon mode */
12
+ logFile?: string;
13
+ /** Optional: PID file path */
14
+ pidFile?: string;
15
+ }
16
+ /**
17
+ * Load gateway config from ~/.cumulus/gateway.config.json.
18
+ * Creates a default config with a generated API key if none exists.
19
+ */
20
+ export declare function loadGatewayConfig(configPath?: string): Promise<GatewayConfig>;
21
+ export declare function getConfigPath(): string;
22
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/gateway/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAenF;AA4BD,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Gateway server configuration — loads and validates gateway.config.json.
3
+ */
4
+ import * as fs from 'fs';
5
+ import * as os from 'os';
6
+ import * as path from 'path';
7
+ import { randomBytes } from 'crypto';
8
+ const CUMULUS_DIR = path.join(os.homedir(), '.cumulus');
9
+ const CONFIG_PATH = path.join(CUMULUS_DIR, 'gateway.config.json');
10
+ const DEFAULT_PORT = 8080;
11
+ /**
12
+ * Load gateway config from ~/.cumulus/gateway.config.json.
13
+ * Creates a default config with a generated API key if none exists.
14
+ */
15
+ export async function loadGatewayConfig(configPath) {
16
+ const effectivePath = configPath ?? CONFIG_PATH;
17
+ if (!fs.existsSync(effectivePath)) {
18
+ const defaultConfig = {
19
+ apiKeys: [`sk-cumulus-${randomBytes(16).toString('hex')}`],
20
+ port: DEFAULT_PORT,
21
+ };
22
+ fs.mkdirSync(CUMULUS_DIR, { recursive: true });
23
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(defaultConfig, null, 2));
24
+ return defaultConfig;
25
+ }
26
+ const raw = fs.readFileSync(effectivePath, 'utf-8');
27
+ const parsed = JSON.parse(raw);
28
+ return validateConfig(parsed);
29
+ }
30
+ function validateConfig(raw) {
31
+ const apiKeys = raw.apiKeys;
32
+ if (!Array.isArray(apiKeys) || apiKeys.length === 0) {
33
+ throw new Error('gateway.config.json: apiKeys must be a non-empty array of strings');
34
+ }
35
+ for (const key of apiKeys) {
36
+ if (typeof key !== 'string' || key.length < 8) {
37
+ throw new Error('gateway.config.json: each API key must be a string of at least 8 characters');
38
+ }
39
+ }
40
+ const port = typeof raw.port === 'number' ? raw.port : DEFAULT_PORT;
41
+ if (port < 0 || port > 65535) {
42
+ throw new Error('gateway.config.json: port must be 0-65535');
43
+ }
44
+ return {
45
+ apiKeys: apiKeys,
46
+ port,
47
+ claudePath: typeof raw.claudePath === 'string' ? raw.claudePath : undefined,
48
+ sharedMcpPort: typeof raw.sharedMcpPort === 'number' ? raw.sharedMcpPort : undefined,
49
+ logFile: typeof raw.logFile === 'string' ? raw.logFile : undefined,
50
+ pidFile: typeof raw.pidFile === 'string' ? raw.pidFile : undefined,
51
+ };
52
+ }
53
+ export function getConfigPath() {
54
+ return CONFIG_PATH;
55
+ }
56
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/gateway/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * cumulus-gateway daemon CLI — manages the gateway server lifecycle.
4
+ *
5
+ * Usage:
6
+ * cumulus-gateway start [--foreground] [--config path] [--port N]
7
+ * cumulus-gateway stop
8
+ * cumulus-gateway status
9
+ * cumulus-gateway --version
10
+ * cumulus-gateway --help
11
+ */
12
+ export declare function writePidFile(pid?: number): void;
13
+ export declare function readPidFile(): number | null;
14
+ export declare function removePidFile(): void;
15
+ export declare function isProcessRunning(pid: number): boolean;
16
+ export declare function getPidFilePath(): string;
17
+ interface ParsedArgs {
18
+ command: 'start' | 'stop' | 'status' | 'help' | 'version';
19
+ foreground: boolean;
20
+ configPath?: string;
21
+ portOverride?: number;
22
+ logLevel?: string;
23
+ }
24
+ export declare function parseArgs(argv: string[]): ParsedArgs;
25
+ export {};
26
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/gateway/daemon.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAeH,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAoB,GAAG,IAAI,CAG5D;AAED,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAQ3C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAID,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1D,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAoDpD"}
@@ -0,0 +1,295 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * cumulus-gateway daemon CLI — manages the gateway server lifecycle.
4
+ *
5
+ * Usage:
6
+ * cumulus-gateway start [--foreground] [--config path] [--port N]
7
+ * cumulus-gateway stop
8
+ * cumulus-gateway status
9
+ * cumulus-gateway --version
10
+ * cumulus-gateway --help
11
+ */
12
+ import * as fs from 'fs';
13
+ import * as os from 'os';
14
+ import * as path from 'path';
15
+ import { loadGatewayConfig, getConfigPath } from './config.js';
16
+ import { startGatewayServer } from './server.js';
17
+ import { createLogger, getDefaultLogPath } from './logger.js';
18
+ const CUMULUS_DIR = path.join(os.homedir(), '.cumulus');
19
+ const PID_FILE = path.join(CUMULUS_DIR, 'gateway.pid');
20
+ const VERSION = '0.12.0'; // Matches package.json
21
+ // ─── PID file helpers ────────────────────────────────────────
22
+ export function writePidFile(pid = process.pid) {
23
+ fs.mkdirSync(CUMULUS_DIR, { recursive: true });
24
+ fs.writeFileSync(PID_FILE, String(pid), 'utf-8');
25
+ }
26
+ export function readPidFile() {
27
+ try {
28
+ const content = fs.readFileSync(PID_FILE, 'utf-8').trim();
29
+ const pid = parseInt(content, 10);
30
+ return isNaN(pid) ? null : pid;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ export function removePidFile() {
37
+ try {
38
+ fs.unlinkSync(PID_FILE);
39
+ }
40
+ catch {
41
+ // Ignore if already removed
42
+ }
43
+ }
44
+ export function isProcessRunning(pid) {
45
+ try {
46
+ process.kill(pid, 0); // Signal 0 = check existence
47
+ return true;
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ export function getPidFilePath() {
54
+ return PID_FILE;
55
+ }
56
+ export function parseArgs(argv) {
57
+ const args = argv.slice(2);
58
+ const result = {
59
+ command: 'start',
60
+ foreground: false,
61
+ };
62
+ let i = 0;
63
+ // First positional arg is the command
64
+ if (args[0] && !args[0].startsWith('-')) {
65
+ const cmd = args[0];
66
+ if (cmd === 'start' || cmd === 'stop' || cmd === 'status') {
67
+ result.command = cmd;
68
+ }
69
+ else {
70
+ console.error(`Unknown command: ${cmd}`);
71
+ result.command = 'help';
72
+ }
73
+ i = 1;
74
+ }
75
+ // Parse flags
76
+ for (; i < args.length; i++) {
77
+ const arg = args[i];
78
+ switch (arg) {
79
+ case '--foreground':
80
+ case '-f':
81
+ result.foreground = true;
82
+ break;
83
+ case '--config':
84
+ case '-c':
85
+ result.configPath = args[++i];
86
+ break;
87
+ case '--port':
88
+ case '-p':
89
+ result.portOverride = parseInt(args[++i] ?? '', 10);
90
+ break;
91
+ case '--log-level':
92
+ result.logLevel = args[++i];
93
+ break;
94
+ case '--version':
95
+ case '-v':
96
+ result.command = 'version';
97
+ break;
98
+ case '--help':
99
+ case '-h':
100
+ result.command = 'help';
101
+ break;
102
+ }
103
+ }
104
+ return result;
105
+ }
106
+ // ─── Commands ────────────────────────────────────────────────
107
+ async function cmdStart(args) {
108
+ // Check for existing instance
109
+ const existingPid = readPidFile();
110
+ if (existingPid !== null && isProcessRunning(existingPid)) {
111
+ console.error(`Gateway already running (PID ${existingPid}). Use 'cumulus-gateway stop' first.`);
112
+ process.exit(1);
113
+ }
114
+ // Clean up stale PID file
115
+ if (existingPid !== null) {
116
+ removePidFile();
117
+ }
118
+ // Load config
119
+ let config;
120
+ try {
121
+ config = await loadGatewayConfig(args.configPath);
122
+ }
123
+ catch (err) {
124
+ console.error(`Failed to load config: ${err instanceof Error ? err.message : err}`);
125
+ process.exit(1);
126
+ }
127
+ const port = args.portOverride ?? config.port;
128
+ const foreground = args.foreground;
129
+ // Set up logger
130
+ const logger = createLogger({
131
+ logFile: foreground ? undefined : config.logFile ?? getDefaultLogPath(),
132
+ level: args.logLevel ?? 'info',
133
+ });
134
+ // Write PID file
135
+ writePidFile();
136
+ logger.info('Gateway starting', {
137
+ pid: process.pid,
138
+ port,
139
+ foreground,
140
+ config: args.configPath ?? getConfigPath(),
141
+ apiKeys: config.apiKeys.length,
142
+ });
143
+ // Start server
144
+ let handle;
145
+ try {
146
+ handle = await startGatewayServer({
147
+ port,
148
+ apiKeys: config.apiKeys,
149
+ claudePath: config.claudePath,
150
+ sharedMcpPort: config.sharedMcpPort,
151
+ });
152
+ }
153
+ catch (err) {
154
+ logger.error('Failed to start server', { error: String(err) });
155
+ removePidFile();
156
+ process.exit(1);
157
+ }
158
+ logger.info('Gateway ready', { url: handle.url, port: handle.port });
159
+ if (foreground) {
160
+ console.log(`[Gateway] PID ${process.pid} listening on ${handle.url}`);
161
+ console.log(`[Gateway] Config: ${args.configPath ?? getConfigPath()}`);
162
+ console.log(`[Gateway] API keys: ${config.apiKeys.length} configured`);
163
+ console.log(`[Gateway] Log level: ${args.logLevel ?? 'info'}`);
164
+ console.log(`[Gateway] Press Ctrl+C to stop`);
165
+ }
166
+ // ─── Signal handlers ────────────────────────────────────
167
+ let shuttingDown = false;
168
+ const shutdown = async (signal) => {
169
+ if (shuttingDown)
170
+ return;
171
+ shuttingDown = true;
172
+ logger.info('Shutdown initiated', { signal });
173
+ if (foreground)
174
+ console.log(`\n[Gateway] ${signal} received, shutting down...`);
175
+ try {
176
+ await handle.close();
177
+ logger.info('Server closed');
178
+ }
179
+ catch (err) {
180
+ logger.error('Error during shutdown', { error: String(err) });
181
+ }
182
+ removePidFile();
183
+ logger.info('Gateway stopped');
184
+ logger.close();
185
+ process.exit(0);
186
+ };
187
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
188
+ process.on('SIGINT', () => shutdown('SIGINT'));
189
+ // SIGHUP = reload config (API keys, port stays the same)
190
+ process.on('SIGHUP', async () => {
191
+ logger.info('SIGHUP received, reloading config...');
192
+ if (foreground)
193
+ console.log('[Gateway] Reloading config...');
194
+ try {
195
+ const newConfig = await loadGatewayConfig(args.configPath);
196
+ // Update API keys on the running server
197
+ handle.updateApiKeys?.(newConfig.apiKeys);
198
+ logger.info('Config reloaded', { apiKeys: newConfig.apiKeys.length });
199
+ if (foreground)
200
+ console.log(`[Gateway] Config reloaded: ${newConfig.apiKeys.length} API keys`);
201
+ }
202
+ catch (err) {
203
+ logger.error('Config reload failed', { error: String(err) });
204
+ if (foreground)
205
+ console.error(`[Gateway] Config reload failed: ${err}`);
206
+ }
207
+ });
208
+ }
209
+ function cmdStop() {
210
+ const pid = readPidFile();
211
+ if (pid === null) {
212
+ console.log('No PID file found — gateway is not running.');
213
+ process.exit(0);
214
+ }
215
+ if (!isProcessRunning(pid)) {
216
+ console.log(`Stale PID file (process ${pid} not running). Cleaning up.`);
217
+ removePidFile();
218
+ process.exit(0);
219
+ }
220
+ console.log(`Stopping gateway (PID ${pid})...`);
221
+ try {
222
+ process.kill(pid, 'SIGTERM');
223
+ console.log('SIGTERM sent. Gateway will shut down gracefully.');
224
+ }
225
+ catch (err) {
226
+ console.error(`Failed to stop process ${pid}: ${err}`);
227
+ process.exit(1);
228
+ }
229
+ }
230
+ function cmdStatus() {
231
+ const pid = readPidFile();
232
+ if (pid === null) {
233
+ console.log('Gateway is not running (no PID file).');
234
+ process.exit(1);
235
+ }
236
+ if (!isProcessRunning(pid)) {
237
+ console.log(`Gateway is not running (stale PID file, process ${pid} dead).`);
238
+ removePidFile();
239
+ process.exit(1);
240
+ }
241
+ console.log(`Gateway is running (PID ${pid}).`);
242
+ console.log(`PID file: ${PID_FILE}`);
243
+ console.log(`Config: ${getConfigPath()}`);
244
+ process.exit(0);
245
+ }
246
+ function showHelp() {
247
+ console.log(`cumulus-gateway — HTTP/SSE server for the cumulus message pipeline
248
+
249
+ Usage:
250
+ cumulus-gateway [command] [options]
251
+
252
+ Commands:
253
+ start Start the gateway server (default)
254
+ stop Stop a running gateway instance
255
+ status Show whether the gateway is running
256
+
257
+ Options:
258
+ --foreground, -f Run in foreground (logs to stdout instead of file)
259
+ --config, -c Path to gateway.config.json
260
+ --port, -p Override port number
261
+ --log-level Log level: debug, info, warn, error (default: info)
262
+ --version, -v Show version
263
+ --help, -h Show this help
264
+
265
+ Config: ${getConfigPath()}
266
+ PID file: ${PID_FILE}
267
+ Log file: ${getDefaultLogPath()}
268
+ `);
269
+ }
270
+ // ─── Main ────────────────────────────────────────────────────
271
+ async function main() {
272
+ const args = parseArgs(process.argv);
273
+ switch (args.command) {
274
+ case 'start':
275
+ await cmdStart(args);
276
+ break;
277
+ case 'stop':
278
+ cmdStop();
279
+ break;
280
+ case 'status':
281
+ cmdStatus();
282
+ break;
283
+ case 'version':
284
+ console.log(`cumulus-gateway v${VERSION}`);
285
+ break;
286
+ case 'help':
287
+ showHelp();
288
+ break;
289
+ }
290
+ }
291
+ main().catch((err) => {
292
+ console.error('[Gateway] Fatal:', err);
293
+ process.exit(1);
294
+ });
295
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/gateway/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Structured JSON logger for the gateway daemon.
3
+ * Writes to stdout in foreground mode, or to a log file in daemon mode.
4
+ */
5
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
6
+ export interface Logger {
7
+ debug(message: string, extra?: Record<string, unknown>): void;
8
+ info(message: string, extra?: Record<string, unknown>): void;
9
+ warn(message: string, extra?: Record<string, unknown>): void;
10
+ error(message: string, extra?: Record<string, unknown>): void;
11
+ close(): void;
12
+ }
13
+ export interface LoggerOptions {
14
+ /** Write to file instead of stdout/stderr */
15
+ logFile?: string;
16
+ /** Minimum log level (default: 'info') */
17
+ level?: LogLevel;
18
+ }
19
+ export declare function createLogger(options?: LoggerOptions): Logger;
20
+ export declare function getDefaultLogPath(): string;
21
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/gateway/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAU3D,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC7D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf;AASD,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CA2ChE;AAID,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Structured JSON logger for the gateway daemon.
3
+ * Writes to stdout in foreground mode, or to a log file in daemon mode.
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import * as os from 'os';
8
+ const LEVEL_PRIORITY = {
9
+ debug: 0,
10
+ info: 1,
11
+ warn: 2,
12
+ error: 3,
13
+ };
14
+ export function createLogger(options = {}) {
15
+ const minLevel = options.level ?? 'info';
16
+ let stream = null;
17
+ if (options.logFile) {
18
+ const logDir = path.dirname(options.logFile);
19
+ fs.mkdirSync(logDir, { recursive: true });
20
+ stream = fs.createWriteStream(options.logFile, { flags: 'a' });
21
+ }
22
+ function write(level, message, extra) {
23
+ if (LEVEL_PRIORITY[level] < LEVEL_PRIORITY[minLevel])
24
+ return;
25
+ const entry = {
26
+ timestamp: new Date().toISOString(),
27
+ level,
28
+ message,
29
+ ...extra,
30
+ };
31
+ const line = JSON.stringify(entry) + '\n';
32
+ if (stream) {
33
+ stream.write(line);
34
+ }
35
+ else if (level === 'error' || level === 'warn') {
36
+ process.stderr.write(line);
37
+ }
38
+ else {
39
+ process.stdout.write(line);
40
+ }
41
+ }
42
+ return {
43
+ debug: (msg, extra) => write('debug', msg, extra),
44
+ info: (msg, extra) => write('info', msg, extra),
45
+ warn: (msg, extra) => write('warn', msg, extra),
46
+ error: (msg, extra) => write('error', msg, extra),
47
+ close: () => {
48
+ if (stream) {
49
+ stream.end();
50
+ stream = null;
51
+ }
52
+ },
53
+ };
54
+ }
55
+ const DEFAULT_LOG_DIR = path.join(os.homedir(), '.cumulus');
56
+ export function getDefaultLogPath() {
57
+ return path.join(DEFAULT_LOG_DIR, 'gateway.log');
58
+ }
59
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/gateway/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAoBzB,MAAM,cAAc,GAA6B;IAC/C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AASF,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;IACzC,IAAI,MAAM,GAA0B,IAAI,CAAC;IAEzC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,SAAS,KAAK,CAAC,KAAe,EAAE,OAAe,EAAE,KAA+B;QAC9E,IAAI,cAAc,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC;YAAE,OAAO;QAE7D,MAAM,KAAK,GAAa;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK;YACL,OAAO;YACP,GAAG,KAAK;SACT,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QAE1C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC;QACjD,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC;QAC/C,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC;QAC/C,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC;QACjD,KAAK,EAAE,GAAG,EAAE;YACV,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAE5D,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Gateway HTTP server — exposes the cumulus message pipeline as a REST API
3
+ * with SSE streaming. Channel adapters and remote clients connect here.
4
+ *
5
+ * Endpoints:
6
+ * POST /api/thread/:name/message — submit message, SSE stream response
7
+ * GET /api/thread/:name/history — recent messages
8
+ * GET /api/thread/:name/status — thread info + adaptive state
9
+ * GET /api/threads — list all threads
10
+ * DELETE /api/thread/:name — delete thread (requires X-Confirm: delete)
11
+ * GET /health — health check (no auth)
12
+ */
13
+ export interface GatewayServerOptions {
14
+ basePath?: string;
15
+ port: number;
16
+ apiKeys: string[];
17
+ claudePath?: string;
18
+ sharedMcpPort?: number;
19
+ }
20
+ export interface GatewayServerHandle {
21
+ port: number;
22
+ url: string;
23
+ close: () => Promise<void>;
24
+ /** Hot-reload API keys without restarting the server */
25
+ updateApiKeys?: (newKeys: string[]) => void;
26
+ }
27
+ export declare function startGatewayServer(options: GatewayServerOptions): Promise<GatewayServerHandle>;
28
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/gateway/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,wDAAwD;IACxD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC7C;AAgVD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAmG9B"}
@@ -0,0 +1,371 @@
1
+ /**
2
+ * Gateway HTTP server — exposes the cumulus message pipeline as a REST API
3
+ * with SSE streaming. Channel adapters and remote clients connect here.
4
+ *
5
+ * Endpoints:
6
+ * POST /api/thread/:name/message — submit message, SSE stream response
7
+ * GET /api/thread/:name/history — recent messages
8
+ * GET /api/thread/:name/status — thread info + adaptive state
9
+ * GET /api/threads — list all threads
10
+ * DELETE /api/thread/:name — delete thread (requires X-Confirm: delete)
11
+ * GET /health — health check (no auth)
12
+ */
13
+ import * as http from 'http';
14
+ import * as fs from 'fs';
15
+ import * as os from 'os';
16
+ import * as path from 'path';
17
+ import { authenticate } from './auth.js';
18
+ import { sendMessage, getOrCreateThread, clearThreadCache, } from '../lib/gateway.js';
19
+ const threadQueues = new Map();
20
+ const threadBusy = new Map();
21
+ function enqueue(threadName, item) {
22
+ if (!threadQueues.has(threadName)) {
23
+ threadQueues.set(threadName, []);
24
+ }
25
+ threadQueues.get(threadName).push(item);
26
+ }
27
+ async function drainQueue(threadName, opts) {
28
+ if (threadBusy.get(threadName))
29
+ return;
30
+ const queue = threadQueues.get(threadName);
31
+ if (!queue || queue.length === 0)
32
+ return;
33
+ threadBusy.set(threadName, true);
34
+ const item = queue.shift();
35
+ try {
36
+ await processMessage(threadName, item, opts);
37
+ }
38
+ finally {
39
+ threadBusy.set(threadName, false);
40
+ // Process next in queue
41
+ if (queue.length > 0) {
42
+ drainQueue(threadName, opts).catch((err) => console.error(`[Gateway] queue drain error for ${threadName}:`, err));
43
+ }
44
+ }
45
+ }
46
+ // ─── SSE message processing ──────────────────────────────────────────────────
47
+ async function processMessage(threadName, item, opts) {
48
+ const { res, message, images } = item;
49
+ // Set up SSE headers
50
+ res.writeHead(200, {
51
+ 'Content-Type': 'text/event-stream',
52
+ 'Cache-Control': 'no-cache',
53
+ Connection: 'keep-alive',
54
+ 'X-Accel-Buffering': 'no',
55
+ });
56
+ // Detect client disconnect
57
+ let clientDisconnected = false;
58
+ const ac = new AbortController();
59
+ res.on('close', () => {
60
+ clientDisconnected = true;
61
+ ac.abort();
62
+ });
63
+ const sendSSE = (event, data) => {
64
+ if (clientDisconnected)
65
+ return;
66
+ res.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
67
+ };
68
+ try {
69
+ const result = await sendMessage({
70
+ threadName,
71
+ message,
72
+ images,
73
+ basePath: opts.basePath,
74
+ claudePath: opts.claudePath,
75
+ sharedMcpPort: opts.sharedMcpPort,
76
+ signal: ac.signal,
77
+ onToken: (text) => sendSSE('token', { text }),
78
+ onSegment: (segment) => sendSSE('segment', segment),
79
+ onError: (error) => sendSSE('error', { error, code: 'CLAUDE_ERROR' }),
80
+ });
81
+ sendSSE('done', {
82
+ response: result.response,
83
+ ttft: result.ttft,
84
+ threadName,
85
+ });
86
+ }
87
+ catch (err) {
88
+ if (!clientDisconnected) {
89
+ const errorMsg = err instanceof Error ? err.message : String(err);
90
+ if (errorMsg !== 'Aborted') {
91
+ sendSSE('error', { error: errorMsg, code: 'PIPELINE_ERROR' });
92
+ }
93
+ }
94
+ }
95
+ finally {
96
+ if (!clientDisconnected) {
97
+ res.end();
98
+ }
99
+ }
100
+ }
101
+ // ─── Route helpers ───────────────────────────────────────────────────────────
102
+ function parseRoute(url) {
103
+ const [pathPart, queryPart] = url.split('?');
104
+ const query = {};
105
+ if (queryPart) {
106
+ for (const pair of queryPart.split('&')) {
107
+ const [k, v] = pair.split('=');
108
+ if (k)
109
+ query[decodeURIComponent(k)] = decodeURIComponent(v ?? '');
110
+ }
111
+ }
112
+ // Match /api/thread/:name/...
113
+ const threadMatch = pathPart.match(/^\/api\/thread\/([^/]+)(\/.*)?$/);
114
+ if (threadMatch) {
115
+ return {
116
+ path: `/api/thread/:name${threadMatch[2] || ''}`,
117
+ params: { name: decodeURIComponent(threadMatch[1]) },
118
+ query,
119
+ };
120
+ }
121
+ return { path: pathPart, params: {}, query };
122
+ }
123
+ function readBody(req) {
124
+ return new Promise((resolve, reject) => {
125
+ const chunks = [];
126
+ req.on('data', (chunk) => chunks.push(chunk));
127
+ req.on('end', () => resolve(Buffer.concat(chunks).toString()));
128
+ req.on('error', reject);
129
+ });
130
+ }
131
+ function jsonResponse(res, status, data) {
132
+ res.writeHead(status, { 'Content-Type': 'application/json' });
133
+ res.end(JSON.stringify(data));
134
+ }
135
+ // ─── Route handlers ──────────────────────────────────────────────────────────
136
+ const THREADS_DIR = path.join(os.homedir(), '.cumulus', 'threads');
137
+ async function handlePostMessage(threadName, req, res, opts) {
138
+ let body;
139
+ try {
140
+ const raw = await readBody(req);
141
+ body = JSON.parse(raw);
142
+ }
143
+ catch {
144
+ jsonResponse(res, 400, { error: 'Invalid JSON body' });
145
+ return;
146
+ }
147
+ if (!body.message || typeof body.message !== 'string') {
148
+ jsonResponse(res, 400, { error: 'Missing or invalid "message" field' });
149
+ return;
150
+ }
151
+ // Enqueue and drain
152
+ enqueue(threadName, { message: body.message, images: body.images, res });
153
+ drainQueue(threadName, opts).catch((err) => console.error(`[Gateway] drain error:`, err));
154
+ }
155
+ async function handleGetHistory(threadName, query, res) {
156
+ const limit = Math.min(parseInt(query.limit || '20', 10) || 20, 200);
157
+ const offset = parseInt(query.offset || '0', 10) || 0;
158
+ try {
159
+ const thread = await getOrCreateThread(threadName);
160
+ const all = await thread.history.getAll();
161
+ const total = all.length;
162
+ const slice = all.slice(offset, offset + limit);
163
+ const messages = slice.map((m, i) => ({
164
+ index: offset + i,
165
+ role: m.role,
166
+ content: m.content,
167
+ timestamp: m.timestamp,
168
+ }));
169
+ jsonResponse(res, 200, { messages, total });
170
+ }
171
+ catch (err) {
172
+ jsonResponse(res, 500, { error: String(err) });
173
+ }
174
+ }
175
+ async function handleGetStatus(threadName, res) {
176
+ try {
177
+ const thread = await getOrCreateThread(threadName);
178
+ const stats = await thread.history.getStats();
179
+ const adaptiveState = thread.adaptive.getState();
180
+ jsonResponse(res, 200, {
181
+ threadName,
182
+ messageCount: stats.count,
183
+ totalTokens: stats.totalTokens,
184
+ adaptive: {
185
+ contextLimit: adaptiveState.contextLimit,
186
+ lastTTFT: adaptiveState.lastTTFT,
187
+ turnCount: adaptiveState.turnCount,
188
+ },
189
+ });
190
+ }
191
+ catch (err) {
192
+ jsonResponse(res, 500, { error: String(err) });
193
+ }
194
+ }
195
+ async function handleListThreads(res) {
196
+ try {
197
+ if (!fs.existsSync(THREADS_DIR)) {
198
+ jsonResponse(res, 200, { threads: [] });
199
+ return;
200
+ }
201
+ const files = fs.readdirSync(THREADS_DIR).filter((f) => f.endsWith('.jsonl'));
202
+ const threads = [];
203
+ for (const file of files) {
204
+ const name = file.replace(/\.jsonl$/, '');
205
+ const filePath = path.join(THREADS_DIR, file);
206
+ const stat = fs.statSync(filePath);
207
+ // Quick message count: count lines
208
+ let lineCount = 0;
209
+ try {
210
+ const content = fs.readFileSync(filePath, 'utf-8');
211
+ lineCount = content.split('\n').filter((l) => l.trim()).length;
212
+ }
213
+ catch {
214
+ // skip
215
+ }
216
+ threads.push({
217
+ name,
218
+ messageCount: lineCount,
219
+ lastActivity: stat.mtime.toISOString(),
220
+ });
221
+ }
222
+ // Sort by last activity descending
223
+ threads.sort((a, b) => {
224
+ if (!a.lastActivity)
225
+ return 1;
226
+ if (!b.lastActivity)
227
+ return -1;
228
+ return b.lastActivity.localeCompare(a.lastActivity);
229
+ });
230
+ jsonResponse(res, 200, { threads });
231
+ }
232
+ catch (err) {
233
+ jsonResponse(res, 500, { error: String(err) });
234
+ }
235
+ }
236
+ async function handleDeleteThread(threadName, req, res) {
237
+ const confirm = req.headers['x-confirm'];
238
+ if (confirm !== 'delete') {
239
+ jsonResponse(res, 400, { error: 'Missing X-Confirm: delete header' });
240
+ return;
241
+ }
242
+ // Don't delete if currently processing
243
+ if (threadBusy.get(threadName)) {
244
+ jsonResponse(res, 409, { error: 'Thread is currently processing a message' });
245
+ return;
246
+ }
247
+ try {
248
+ // Clear from cache
249
+ clearThreadCache(threadName);
250
+ threadQueues.delete(threadName);
251
+ threadBusy.delete(threadName);
252
+ // Delete files
253
+ const basePath = path.join(THREADS_DIR, threadName);
254
+ const extensions = [
255
+ '.jsonl',
256
+ '.embeddings.json',
257
+ '.embeddings.bin',
258
+ '.segments.json',
259
+ '.adaptive.json',
260
+ '.sessions',
261
+ '.content',
262
+ ];
263
+ for (const ext of extensions) {
264
+ const filePath = basePath + ext;
265
+ try {
266
+ const stat = fs.statSync(filePath);
267
+ if (stat.isDirectory()) {
268
+ fs.rmSync(filePath, { recursive: true });
269
+ }
270
+ else {
271
+ fs.unlinkSync(filePath);
272
+ }
273
+ }
274
+ catch {
275
+ // File may not exist
276
+ }
277
+ }
278
+ jsonResponse(res, 200, { deleted: threadName });
279
+ }
280
+ catch (err) {
281
+ jsonResponse(res, 500, { error: String(err) });
282
+ }
283
+ }
284
+ // ─── Server ──────────────────────────────────────────────────────────────────
285
+ export async function startGatewayServer(options) {
286
+ const { port, ...pipelineOpts } = options;
287
+ let currentApiKeys = options.apiKeys;
288
+ const server = http.createServer(async (req, res) => {
289
+ // CORS headers for web clients
290
+ res.setHeader('Access-Control-Allow-Origin', '*');
291
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
292
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, X-API-Key, X-Confirm');
293
+ if (req.method === 'OPTIONS') {
294
+ res.writeHead(204);
295
+ res.end();
296
+ return;
297
+ }
298
+ const { path: routePath, params, query } = parseRoute(req.url || '/');
299
+ // Health check — no auth required
300
+ if (routePath === '/health' && req.method === 'GET') {
301
+ jsonResponse(res, 200, { status: 'ok', timestamp: new Date().toISOString() });
302
+ return;
303
+ }
304
+ // All other routes require auth
305
+ if (!authenticate(req, res, currentApiKeys))
306
+ return;
307
+ try {
308
+ // POST /api/thread/:name/message
309
+ if (routePath === '/api/thread/:name/message' && req.method === 'POST') {
310
+ await handlePostMessage(params.name, req, res, pipelineOpts);
311
+ return;
312
+ }
313
+ // GET /api/thread/:name/history
314
+ if (routePath === '/api/thread/:name/history' && req.method === 'GET') {
315
+ await handleGetHistory(params.name, query, res);
316
+ return;
317
+ }
318
+ // GET /api/thread/:name/status
319
+ if (routePath === '/api/thread/:name/status' && req.method === 'GET') {
320
+ await handleGetStatus(params.name, res);
321
+ return;
322
+ }
323
+ // DELETE /api/thread/:name
324
+ if (routePath === '/api/thread/:name' && req.method === 'DELETE') {
325
+ await handleDeleteThread(params.name, req, res);
326
+ return;
327
+ }
328
+ // GET /api/threads
329
+ if (routePath === '/api/threads' && req.method === 'GET') {
330
+ await handleListThreads(res);
331
+ return;
332
+ }
333
+ // 404
334
+ jsonResponse(res, 404, { error: 'Not found' });
335
+ }
336
+ catch (err) {
337
+ console.error('[Gateway] unhandled error:', err);
338
+ if (!res.headersSent) {
339
+ jsonResponse(res, 500, { error: 'Internal server error' });
340
+ }
341
+ }
342
+ });
343
+ return new Promise((resolve, reject) => {
344
+ server.on('error', reject);
345
+ server.listen(port, () => {
346
+ const addr = server.address();
347
+ const actualPort = typeof addr === 'object' && addr ? addr.port : port;
348
+ const url = `http://localhost:${actualPort}`;
349
+ console.log(`[Gateway] Server listening on ${url}`);
350
+ resolve({
351
+ port: actualPort,
352
+ url,
353
+ updateApiKeys: (newKeys) => {
354
+ currentApiKeys = newKeys;
355
+ },
356
+ close: async () => {
357
+ // Abort any in-flight message processing
358
+ threadQueues.clear();
359
+ threadBusy.clear();
360
+ return new Promise((resolveClose) => {
361
+ server.close(() => {
362
+ clearThreadCache();
363
+ resolveClose();
364
+ });
365
+ });
366
+ },
367
+ });
368
+ });
369
+ });
370
+ }
371
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/gateway/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AA4B3B,MAAM,YAAY,GAAG,IAAI,GAAG,EAA2B,CAAC;AACxD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAmB,CAAC;AAE9C,SAAS,OAAO,CAAC,UAAkB,EAAE,IAAmB;IACtD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,YAAY,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,UAAkB,EAClB,IAAoD;IAEpD,IAAI,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO;IAEvC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEzC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;YAAS,CAAC;QACT,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAClC,wBAAwB;QACxB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACzC,OAAO,CAAC,KAAK,CAAC,mCAAmC,UAAU,GAAG,EAAE,GAAG,CAAC,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,KAAK,UAAU,cAAc,CAC3B,UAAkB,EAClB,IAAmB,EACnB,IAAoD;IAEpD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEtC,qBAAqB;IACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,mBAAmB;QACnC,eAAe,EAAE,UAAU;QAC3B,UAAU,EAAE,YAAY;QACxB,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;IAEH,2BAA2B;IAC3B,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAC/B,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACnB,kBAAkB,GAAG,IAAI,CAAC;QAC1B,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,IAAa,EAAQ,EAAE;QACrD,IAAI,kBAAkB;YAAE,OAAO;QAC/B,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;YAC/B,UAAU;YACV,OAAO;YACP,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC;YAC7C,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;YACnD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;SACtE,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,EAAE;YACd,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,SAAS,UAAU,CACjB,GAAW;IAEX,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,IAAI,SAAS,EAAE,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC;gBAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,WAAW,GAAG,QAAS,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACvE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,oBAAoB,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;YAChD,MAAM,EAAE,EAAE,IAAI,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,EAAE;YACrD,KAAK;SACN,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAS,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,QAAQ,CAAC,GAAyB;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC/D,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,GAAwB,EAAE,MAAc,EAAE,IAAa;IAC3E,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,gFAAgF;AAEhF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAEnE,KAAK,UAAU,iBAAiB,CAC9B,UAAkB,EAClB,GAAyB,EACzB,GAAwB,EACxB,IAAoD;IAEpD,IAAI,IAAgF,CAAC;IACrF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACtD,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACzE,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACzC,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAC7C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,UAAkB,EAClB,KAA6B,EAC7B,GAAwB;IAExB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;QAEhD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,KAAK,EAAE,MAAM,GAAG,CAAC;YACjB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS;SACvB,CAAC,CAAC,CAAC;QAEJ,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,UAAkB,EAClB,GAAwB;IAExB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC9C,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAEjD,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE;YACrB,UAAU;YACV,YAAY,EAAE,KAAK,CAAC,KAAK;YACzB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE;gBACR,YAAY,EAAE,aAAa,CAAC,YAAY;gBACxC,QAAQ,EAAE,aAAa,CAAC,QAAQ;gBAChC,SAAS,EAAE,aAAa,CAAC,SAAS;aACnC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAwB;IACvD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9E,MAAM,OAAO,GAIR,EAAE,CAAC;QAER,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEnC,mCAAmC;YACnC,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACnD,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;YAED,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI;gBACJ,YAAY,EAAE,SAAS;gBACvB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;aACvC,CAAC,CAAC;QACL,CAAC;QAED,mCAAmC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpB,IAAI,CAAC,CAAC,CAAC,YAAY;gBAAE,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,CAAC,CAAC,YAAY;gBAAE,OAAO,CAAC,CAAC,CAAC;YAC/B,OAAO,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,UAAkB,EAClB,GAAyB,EACzB,GAAwB;IAExB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,uCAAuC;IACvC,IAAI,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,mBAAmB;QACnB,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7B,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE9B,eAAe;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG;YACjB,QAAQ;YACR,kBAAkB;YAClB,iBAAiB;YACjB,gBAAgB;YAChB,gBAAgB;YAChB,WAAW;YACX,UAAU;SACX,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,QAAQ,GAAG,GAAG,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;oBACvB,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;QAED,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA6B;IAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAC1C,IAAI,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAErC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAClD,+BAA+B;QAC/B,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,4BAA4B,CAAC,CAAC;QAC5E,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,oCAAoC,CAAC,CAAC;QAEpF,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;QAEtE,kCAAkC;QAClC,IAAI,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACpD,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,cAAc,CAAC;YAAE,OAAO;QAEpD,IAAI,CAAC;YACH,iCAAiC;YACjC,IAAI,SAAS,KAAK,2BAA2B,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACvE,MAAM,iBAAiB,CAAC,MAAM,CAAC,IAAK,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;YAED,gCAAgC;YAChC,IAAI,SAAS,KAAK,2BAA2B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACtE,MAAM,gBAAgB,CAAC,MAAM,CAAC,IAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,+BAA+B;YAC/B,IAAI,SAAS,KAAK,0BAA0B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrE,MAAM,eAAe,CAAC,MAAM,CAAC,IAAK,EAAE,GAAG,CAAC,CAAC;gBACzC,OAAO;YACT,CAAC;YAED,2BAA2B;YAC3B,IAAI,SAAS,KAAK,mBAAmB,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACjE,MAAM,kBAAkB,CAAC,MAAM,CAAC,IAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YAED,mBAAmB;YACnB,IAAI,SAAS,KAAK,cAAc,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACzD,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YAED,MAAM;YACN,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;YACjD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACvE,MAAM,GAAG,GAAG,oBAAoB,UAAU,EAAE,CAAC;YAE7C,OAAO,CAAC,GAAG,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;YAEpD,OAAO,CAAC;gBACN,IAAI,EAAE,UAAU;gBAChB,GAAG;gBACH,aAAa,EAAE,CAAC,OAAiB,EAAE,EAAE;oBACnC,cAAc,GAAG,OAAO,CAAC;gBAC3B,CAAC;gBACD,KAAK,EAAE,KAAK,IAAI,EAAE;oBAChB,yCAAyC;oBACzC,YAAY,CAAC,KAAK,EAAE,CAAC;oBACrB,UAAU,CAAC,KAAK,EAAE,CAAC;oBAEnB,OAAO,IAAI,OAAO,CAAO,CAAC,YAAY,EAAE,EAAE;wBACxC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;4BAChB,gBAAgB,EAAE,CAAC;4BACnB,YAAY,EAAE,CAAC;wBACjB,CAAC,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;gBACL,CAAC;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/index.d.ts CHANGED
@@ -33,6 +33,14 @@ export { executeRevert } from './lib/revert.js';
33
33
  export type { RevertResult, RevertOptions } from './lib/revert.js';
34
34
  export { sendMessage, getOrCreateThread, clearThreadCache, resolveClaudeCli, resolveNode, truncateToTokens, formatRecentContext, generateSystemPrompt, generateMcpConfig, cleanupMcpConfig, parseStreamSegments, extractTextFromStreamLine, computeAvgRelevance, SYSTEM_PROMPT_TEMPLATE, FILE_READ_REMINDER, RECENT_CONTEXT_COUNT, RECENT_MSG_MAX_TOKENS, RECENT_CONTEXT_BUDGET, } from './lib/gateway.js';
35
35
  export type { StreamSegment, DebugSnapshot, McpServerEntry, MessagePipelineOptions, MessagePipelineResult, ThreadState, } from './lib/gateway.js';
36
+ export { startGatewayServer } from './gateway/server.js';
37
+ export type { GatewayServerOptions, GatewayServerHandle } from './gateway/server.js';
38
+ export { loadGatewayConfig, getConfigPath as getGatewayConfigPath } from './gateway/config.js';
39
+ export type { GatewayConfig } from './gateway/config.js';
40
+ export { authenticate as authenticateRequest } from './gateway/auth.js';
41
+ export { createLogger, getDefaultLogPath } from './gateway/logger.js';
42
+ export type { Logger, LogLevel, LoggerOptions } from './gateway/logger.js';
43
+ export { writePidFile, readPidFile, removePidFile, isProcessRunning, getPidFilePath, parseArgs, } from './gateway/daemon.js';
36
44
  export { startSharedMcpServer } from './mcp/shared-server.js';
37
45
  export type { SharedMcpServerOptions, SharedMcpServerHandle } from './mcp/shared-server.js';
38
46
  /** Absolute path to the lightweight stdio→HTTP proxy script for shared MCP server */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -34,6 +34,12 @@ export { getSummary, getSummaryPath, loadSummaries, runSummarization, saveSummar
34
34
  export { executeRevert } from './lib/revert.js';
35
35
  // Gateway — message pipeline for Janus and gateway server
36
36
  export { sendMessage, getOrCreateThread, clearThreadCache, resolveClaudeCli, resolveNode, truncateToTokens, formatRecentContext, generateSystemPrompt, generateMcpConfig, cleanupMcpConfig, parseStreamSegments, extractTextFromStreamLine, computeAvgRelevance, SYSTEM_PROMPT_TEMPLATE, FILE_READ_REMINDER, RECENT_CONTEXT_COUNT, RECENT_MSG_MAX_TOKENS, RECENT_CONTEXT_BUDGET, } from './lib/gateway.js';
37
+ // Gateway Server — HTTP/SSE API for remote access
38
+ export { startGatewayServer } from './gateway/server.js';
39
+ export { loadGatewayConfig, getConfigPath as getGatewayConfigPath } from './gateway/config.js';
40
+ export { authenticate as authenticateRequest } from './gateway/auth.js';
41
+ export { createLogger, getDefaultLogPath } from './gateway/logger.js';
42
+ export { writePidFile, readPidFile, removePidFile, isProcessRunning, getPidFilePath, parseArgs, } from './gateway/daemon.js';
37
43
  // MCP - Shared server for multi-agent setups
38
44
  export { startSharedMcpServer } from './mcp/shared-server.js';
39
45
  // MCP paths - for spawning subprocesses via --mcp-config
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luckydraw/cumulus",
3
- "version": "0.10.1",
3
+ "version": "0.12.0",
4
4
  "description": "RLM-based CLI chat wrapper for Claude with external history context management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -16,6 +16,10 @@
16
16
  },
17
17
  "./mcp/proxy": {
18
18
  "import": "./dist/mcp/proxy.js"
19
+ },
20
+ "./gateway": {
21
+ "types": "./dist/gateway/server.d.ts",
22
+ "import": "./dist/gateway/server.js"
19
23
  }
20
24
  },
21
25
  "files": [
@@ -24,7 +28,8 @@
24
28
  ],
25
29
  "bin": {
26
30
  "cumulus": "./dist/cli/cumulus.js",
27
- "cumulus-mcp": "./dist/mcp/index.js"
31
+ "cumulus-mcp": "./dist/mcp/index.js",
32
+ "cumulus-gateway": "./dist/gateway/daemon.js"
28
33
  },
29
34
  "scripts": {
30
35
  "build": "tsc",