@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.
- package/dist/gateway/auth.d.ts +10 -0
- package/dist/gateway/auth.d.ts.map +1 -0
- package/dist/gateway/auth.js +23 -0
- package/dist/gateway/auth.js.map +1 -0
- package/dist/gateway/cli.d.ts +10 -0
- package/dist/gateway/cli.d.ts.map +1 -0
- package/dist/gateway/cli.js +59 -0
- package/dist/gateway/cli.js.map +1 -0
- package/dist/gateway/config.d.ts +22 -0
- package/dist/gateway/config.d.ts.map +1 -0
- package/dist/gateway/config.js +56 -0
- package/dist/gateway/config.js.map +1 -0
- package/dist/gateway/daemon.d.ts +26 -0
- package/dist/gateway/daemon.d.ts.map +1 -0
- package/dist/gateway/daemon.js +295 -0
- package/dist/gateway/daemon.js.map +1 -0
- package/dist/gateway/logger.d.ts +21 -0
- package/dist/gateway/logger.d.ts.map +1 -0
- package/dist/gateway/logger.js +59 -0
- package/dist/gateway/logger.js.map +1 -0
- package/dist/gateway/server.d.ts +28 -0
- package/dist/gateway/server.d.ts.map +1 -0
- package/dist/gateway/server.js +371 -0
- package/dist/gateway/server.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/package.json +7 -2
|
@@ -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":"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"}
|
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 */
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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.
|
|
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",
|