@luckydraw/cumulus 0.10.1 → 0.11.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,18 @@
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
+ }
12
+ /**
13
+ * Load gateway config from ~/.cumulus/gateway.config.json.
14
+ * Creates a default config with a generated API key if none exists.
15
+ */
16
+ export declare function loadGatewayConfig(): Promise<GatewayConfig>;
17
+ export declare function getConfigPath(): string;
18
+ //# 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;CACxB;AAID;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,CAAC,CAchE;AA0BD,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,53 @@
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() {
16
+ if (!fs.existsSync(CONFIG_PATH)) {
17
+ const defaultConfig = {
18
+ apiKeys: [`sk-cumulus-${randomBytes(16).toString('hex')}`],
19
+ port: DEFAULT_PORT,
20
+ };
21
+ fs.mkdirSync(CUMULUS_DIR, { recursive: true });
22
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(defaultConfig, null, 2));
23
+ return defaultConfig;
24
+ }
25
+ const raw = fs.readFileSync(CONFIG_PATH, 'utf-8');
26
+ const parsed = JSON.parse(raw);
27
+ return validateConfig(parsed);
28
+ }
29
+ function validateConfig(raw) {
30
+ const apiKeys = raw.apiKeys;
31
+ if (!Array.isArray(apiKeys) || apiKeys.length === 0) {
32
+ throw new Error('gateway.config.json: apiKeys must be a non-empty array of strings');
33
+ }
34
+ for (const key of apiKeys) {
35
+ if (typeof key !== 'string' || key.length < 8) {
36
+ throw new Error('gateway.config.json: each API key must be a string of at least 8 characters');
37
+ }
38
+ }
39
+ const port = typeof raw.port === 'number' ? raw.port : DEFAULT_PORT;
40
+ if (port < 0 || port > 65535) {
41
+ throw new Error('gateway.config.json: port must be 0-65535');
42
+ }
43
+ return {
44
+ apiKeys: apiKeys,
45
+ port,
46
+ claudePath: typeof raw.claudePath === 'string' ? raw.claudePath : undefined,
47
+ sharedMcpPort: typeof raw.sharedMcpPort === 'number' ? raw.sharedMcpPort : undefined,
48
+ };
49
+ }
50
+ export function getConfigPath() {
51
+ return CONFIG_PATH;
52
+ }
53
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/gateway/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACxD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;AAWlE,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,aAAa,GAAkB;YACnC,OAAO,EAAE,CAAC,cAAc,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1D,IAAI,EAAE,YAAY;SACnB,CAAC;QACF,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACtE,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,GAA4B;IAClD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;IACpE,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAmB;QAC5B,IAAI;QACJ,UAAU,EAAE,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAC3E,aAAa,EAAE,OAAO,GAAG,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;KACrF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,26 @@
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
+ }
25
+ export declare function startGatewayServer(options: GatewayServerOptions): Promise<GatewayServerHandle>;
26
+ //# 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;CAC5B;AAgVD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA+F9B"}
@@ -0,0 +1,367 @@
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, apiKeys, ...pipelineOpts } = options;
287
+ const server = http.createServer(async (req, res) => {
288
+ // CORS headers for web clients
289
+ res.setHeader('Access-Control-Allow-Origin', '*');
290
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
291
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, X-API-Key, X-Confirm');
292
+ if (req.method === 'OPTIONS') {
293
+ res.writeHead(204);
294
+ res.end();
295
+ return;
296
+ }
297
+ const { path: routePath, params, query } = parseRoute(req.url || '/');
298
+ // Health check — no auth required
299
+ if (routePath === '/health' && req.method === 'GET') {
300
+ jsonResponse(res, 200, { status: 'ok', timestamp: new Date().toISOString() });
301
+ return;
302
+ }
303
+ // All other routes require auth
304
+ if (!authenticate(req, res, apiKeys))
305
+ return;
306
+ try {
307
+ // POST /api/thread/:name/message
308
+ if (routePath === '/api/thread/:name/message' && req.method === 'POST') {
309
+ await handlePostMessage(params.name, req, res, pipelineOpts);
310
+ return;
311
+ }
312
+ // GET /api/thread/:name/history
313
+ if (routePath === '/api/thread/:name/history' && req.method === 'GET') {
314
+ await handleGetHistory(params.name, query, res);
315
+ return;
316
+ }
317
+ // GET /api/thread/:name/status
318
+ if (routePath === '/api/thread/:name/status' && req.method === 'GET') {
319
+ await handleGetStatus(params.name, res);
320
+ return;
321
+ }
322
+ // DELETE /api/thread/:name
323
+ if (routePath === '/api/thread/:name' && req.method === 'DELETE') {
324
+ await handleDeleteThread(params.name, req, res);
325
+ return;
326
+ }
327
+ // GET /api/threads
328
+ if (routePath === '/api/threads' && req.method === 'GET') {
329
+ await handleListThreads(res);
330
+ return;
331
+ }
332
+ // 404
333
+ jsonResponse(res, 404, { error: 'Not found' });
334
+ }
335
+ catch (err) {
336
+ console.error('[Gateway] unhandled error:', err);
337
+ if (!res.headersSent) {
338
+ jsonResponse(res, 500, { error: 'Internal server error' });
339
+ }
340
+ }
341
+ });
342
+ return new Promise((resolve, reject) => {
343
+ server.on('error', reject);
344
+ server.listen(port, () => {
345
+ const addr = server.address();
346
+ const actualPort = typeof addr === 'object' && addr ? addr.port : port;
347
+ const url = `http://localhost:${actualPort}`;
348
+ console.log(`[Gateway] Server listening on ${url}`);
349
+ resolve({
350
+ port: actualPort,
351
+ url,
352
+ close: async () => {
353
+ // Abort any in-flight message processing
354
+ threadQueues.clear();
355
+ threadBusy.clear();
356
+ return new Promise((resolveClose) => {
357
+ server.close(() => {
358
+ clearThreadCache();
359
+ resolveClose();
360
+ });
361
+ });
362
+ },
363
+ });
364
+ });
365
+ });
366
+ }
367
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/gateway/server.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -33,6 +33,11 @@ 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';
36
41
  export { startSharedMcpServer } from './mcp/shared-server.js';
37
42
  export type { SharedMcpServerOptions, SharedMcpServerHandle } from './mcp/shared-server.js';
38
43
  /** 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,10 @@ 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';
37
41
  // MCP - Shared server for multi-agent setups
38
42
  export { startSharedMcpServer } from './mcp/shared-server.js';
39
43
  // 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.11.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",
@@ -24,7 +24,8 @@
24
24
  ],
25
25
  "bin": {
26
26
  "cumulus": "./dist/cli/cumulus.js",
27
- "cumulus-mcp": "./dist/mcp/index.js"
27
+ "cumulus-mcp": "./dist/mcp/index.js",
28
+ "cumulus-gateway": "./dist/gateway/cli.js"
28
29
  },
29
30
  "scripts": {
30
31
  "build": "tsc",