@codemieai/code 0.0.10 → 0.0.12
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/README.md +23 -98
- package/dist/agents/codemie-code/agent.d.ts.map +1 -1
- package/dist/agents/codemie-code/agent.js +35 -4
- package/dist/agents/codemie-code/agent.js.map +1 -1
- package/dist/agents/codemie-code/tools/index.d.ts.map +1 -1
- package/dist/agents/codemie-code/tools/index.js +5 -3
- package/dist/agents/codemie-code/tools/index.js.map +1 -1
- package/dist/agents/core/AgentCLI.d.ts.map +1 -1
- package/dist/agents/core/AgentCLI.js +57 -11
- package/dist/agents/core/AgentCLI.js.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.d.ts +4 -4
- package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
- package/dist/agents/core/BaseAgentAdapter.js +31 -23
- package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
- package/dist/agents/plugins/codemie-code.plugin.js +1 -1
- package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
- package/dist/agents/plugins/gemini.plugin.js +1 -1
- package/dist/agents/plugins/gemini.plugin.js.map +1 -1
- package/dist/analytics/collector.d.ts +46 -0
- package/dist/analytics/collector.d.ts.map +1 -0
- package/dist/analytics/collector.js +83 -0
- package/dist/analytics/collector.js.map +1 -0
- package/dist/analytics/config.d.ts +14 -0
- package/dist/analytics/config.d.ts.map +1 -0
- package/dist/analytics/config.js +46 -0
- package/dist/analytics/config.js.map +1 -0
- package/dist/analytics/index.d.ts +108 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +322 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/plugins/api-metrics.plugin.d.ts +23 -0
- package/dist/analytics/plugins/api-metrics.plugin.d.ts.map +1 -0
- package/dist/analytics/plugins/api-metrics.plugin.js +113 -0
- package/dist/analytics/plugins/api-metrics.plugin.js.map +1 -0
- package/dist/analytics/plugins/index.d.ts +15 -0
- package/dist/analytics/plugins/index.d.ts.map +1 -0
- package/dist/analytics/plugins/index.js +15 -0
- package/dist/analytics/plugins/index.js.map +1 -0
- package/dist/analytics/plugins/model-metrics.plugin.d.ts +36 -0
- package/dist/analytics/plugins/model-metrics.plugin.d.ts.map +1 -0
- package/dist/analytics/plugins/model-metrics.plugin.js +115 -0
- package/dist/analytics/plugins/model-metrics.plugin.js.map +1 -0
- package/dist/analytics/plugins/provider-metrics.plugin.d.ts +38 -0
- package/dist/analytics/plugins/provider-metrics.plugin.d.ts.map +1 -0
- package/dist/analytics/plugins/provider-metrics.plugin.js +138 -0
- package/dist/analytics/plugins/provider-metrics.plugin.js.map +1 -0
- package/dist/analytics/plugins/types.d.ts +63 -0
- package/dist/analytics/plugins/types.d.ts.map +1 -0
- package/dist/analytics/plugins/types.js +54 -0
- package/dist/analytics/plugins/types.js.map +1 -0
- package/dist/analytics/privacy.d.ts +10 -0
- package/dist/analytics/privacy.d.ts.map +1 -0
- package/dist/analytics/privacy.js +20 -0
- package/dist/analytics/privacy.js.map +1 -0
- package/dist/analytics/session.d.ts +56 -0
- package/dist/analytics/session.d.ts.map +1 -0
- package/dist/analytics/session.js +95 -0
- package/dist/analytics/session.js.map +1 -0
- package/dist/analytics/types.d.ts +104 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +15 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/analytics/writer.d.ts +18 -0
- package/dist/analytics/writer.d.ts.map +1 -0
- package/dist/analytics/writer.js +44 -0
- package/dist/analytics/writer.js.map +1 -0
- package/dist/cli/commands/analytics.d.ts +3 -0
- package/dist/cli/commands/analytics.d.ts.map +1 -0
- package/dist/cli/commands/analytics.js +319 -0
- package/dist/cli/commands/analytics.js.map +1 -0
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +14 -0
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/profile.d.ts.map +1 -1
- package/dist/cli/commands/profile.js +41 -0
- package/dist/cli/commands/profile.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/env/types.d.ts +2 -0
- package/dist/env/types.d.ts.map +1 -1
- package/dist/env/types.js.map +1 -1
- package/dist/utils/analytics-reader.d.ts +117 -0
- package/dist/utils/analytics-reader.d.ts.map +1 -0
- package/dist/utils/analytics-reader.js +421 -0
- package/dist/utils/analytics-reader.js.map +1 -0
- package/dist/utils/codemie-integration-validator.d.ts.map +1 -1
- package/dist/utils/codemie-integration-validator.js +3 -16
- package/dist/utils/codemie-integration-validator.js.map +1 -1
- package/dist/utils/codemie-proxy.d.ts +80 -0
- package/dist/utils/codemie-proxy.d.ts.map +1 -0
- package/dist/utils/codemie-proxy.js +335 -0
- package/dist/utils/codemie-proxy.js.map +1 -0
- package/dist/utils/config-loader.d.ts +7 -0
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +18 -0
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/date-formatter.d.ts +88 -0
- package/dist/utils/date-formatter.d.ts.map +1 -0
- package/dist/utils/date-formatter.js +133 -0
- package/dist/utils/date-formatter.js.map +1 -0
- package/dist/utils/installation-id.d.ts +10 -0
- package/dist/utils/installation-id.d.ts.map +1 -0
- package/dist/utils/installation-id.js +30 -0
- package/dist/utils/installation-id.js.map +1 -0
- package/dist/utils/logger.d.ts +1 -15
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +5 -86
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/proxy/errors.d.ts +45 -0
- package/dist/utils/proxy/errors.d.ts.map +1 -0
- package/dist/utils/proxy/errors.js +103 -0
- package/dist/utils/proxy/errors.js.map +1 -0
- package/dist/utils/proxy/http-client.d.ts +46 -0
- package/dist/utils/proxy/http-client.d.ts.map +1 -0
- package/dist/utils/proxy/http-client.js +133 -0
- package/dist/utils/proxy/http-client.js.map +1 -0
- package/dist/utils/proxy/interceptors.d.ts +69 -0
- package/dist/utils/proxy/interceptors.d.ts.map +1 -0
- package/dist/utils/proxy/interceptors.js +319 -0
- package/dist/utils/proxy/interceptors.js.map +1 -0
- package/dist/utils/proxy/types.d.ts +45 -0
- package/dist/utils/proxy/types.d.ts.map +1 -0
- package/dist/utils/proxy/types.js +7 -0
- package/dist/utils/proxy/types.js.map +1 -0
- package/package.json +46 -5
- package/dist/utils/sso-gateway.d.ts +0 -75
- package/dist/utils/sso-gateway.d.ts.map +0 -1
- package/dist/utils/sso-gateway.js +0 -453
- package/dist/utils/sso-gateway.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codemieai/code",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "AI
|
|
3
|
+
"version": "0.0.12",
|
|
4
|
+
"description": "Unified AI coding assistant CLI - Manage Claude Code, Codex, Gemini & custom agents. Multi-provider support (OpenAI, Azure, LiteLLM, SSO). Built-in LangGraph agent with file operations & git integration.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -39,16 +39,53 @@
|
|
|
39
39
|
},
|
|
40
40
|
"keywords": [
|
|
41
41
|
"ai",
|
|
42
|
-
"
|
|
42
|
+
"artificial-intelligence",
|
|
43
|
+
"coding-assistant",
|
|
44
|
+
"code-generation",
|
|
43
45
|
"cli",
|
|
46
|
+
"command-line",
|
|
44
47
|
"claude",
|
|
48
|
+
"claude-code",
|
|
49
|
+
"openai",
|
|
45
50
|
"codex",
|
|
46
51
|
"gemini",
|
|
47
|
-
"
|
|
48
|
-
"
|
|
52
|
+
"anthropic",
|
|
53
|
+
"gpt",
|
|
54
|
+
"chatgpt",
|
|
55
|
+
"ai-agents",
|
|
56
|
+
"coding-agents",
|
|
57
|
+
"langgraph",
|
|
58
|
+
"langchain",
|
|
59
|
+
"code-review",
|
|
60
|
+
"refactoring",
|
|
61
|
+
"test-generation",
|
|
62
|
+
"documentation",
|
|
63
|
+
"bug-fixing",
|
|
64
|
+
"litellm",
|
|
65
|
+
"azure-openai",
|
|
66
|
+
"aws-bedrock",
|
|
67
|
+
"sso",
|
|
68
|
+
"enterprise",
|
|
69
|
+
"multi-provider",
|
|
70
|
+
"developer-tools",
|
|
71
|
+
"productivity",
|
|
72
|
+
"automation",
|
|
73
|
+
"pair-programming",
|
|
74
|
+
"code-assistant",
|
|
75
|
+
"ai-code",
|
|
76
|
+
"copilot-alternative",
|
|
77
|
+
"cursor-alternative"
|
|
49
78
|
],
|
|
50
79
|
"author": "AI/Run Team",
|
|
51
80
|
"license": "Apache-2.0",
|
|
81
|
+
"repository": {
|
|
82
|
+
"type": "git",
|
|
83
|
+
"url": "git+https://github.com/codemie-ai/codemie-code.git"
|
|
84
|
+
},
|
|
85
|
+
"homepage": "https://github.com/codemie-ai/codemie-code#readme",
|
|
86
|
+
"bugs": {
|
|
87
|
+
"url": "https://github.com/codemie-ai/codemie-code/issues"
|
|
88
|
+
},
|
|
52
89
|
"dependencies": {
|
|
53
90
|
"@clack/core": "^0.5.0",
|
|
54
91
|
"@clack/prompts": "^0.11.0",
|
|
@@ -57,7 +94,9 @@
|
|
|
57
94
|
"@langchain/openai": "^1.1.0",
|
|
58
95
|
"chalk": "^5.3.0",
|
|
59
96
|
"commander": "^11.1.0",
|
|
97
|
+
"cors": "^2.8.5",
|
|
60
98
|
"dotenv": "^16.3.1",
|
|
99
|
+
"express": "^5.1.0",
|
|
61
100
|
"inquirer": "^9.2.12",
|
|
62
101
|
"keytar": "^7.9.0",
|
|
63
102
|
"open": "^8.4.2",
|
|
@@ -66,6 +105,8 @@
|
|
|
66
105
|
},
|
|
67
106
|
"devDependencies": {
|
|
68
107
|
"@eslint/js": "^9.38.0",
|
|
108
|
+
"@types/cors": "^2.8.19",
|
|
109
|
+
"@types/express": "^5.0.5",
|
|
69
110
|
"@types/inquirer": "^9.0.7",
|
|
70
111
|
"@types/node": "^20.10.5",
|
|
71
112
|
"@typescript-eslint/eslint-plugin": "^8.46.2",
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local Authentication Gateway for SSO-enabled Claude binary
|
|
3
|
-
*
|
|
4
|
-
* This creates a local HTTP server that proxies requests from the claude binary
|
|
5
|
-
* to the codemie API, adding SSO authentication cookies in the process.
|
|
6
|
-
*
|
|
7
|
-
* Debug Logging:
|
|
8
|
-
* When debug mode is enabled, all requests and responses are logged to the
|
|
9
|
-
* unified debug session directory in JSONL (JSON Lines) format at:
|
|
10
|
-
* ~/.codemie/debug/session-<timestamp>/requests.jsonl
|
|
11
|
-
*
|
|
12
|
-
* Each line in the file is a JSON object with a 'type' field:
|
|
13
|
-
* - session_start: Gateway initialization
|
|
14
|
-
* - request: HTTP request details (headers, body, URL)
|
|
15
|
-
* - response: HTTP response details (status, headers, body preview)
|
|
16
|
-
* - session_end: Gateway shutdown with session statistics
|
|
17
|
-
*
|
|
18
|
-
* Sensitive data (Cookie, Authorization headers) is automatically redacted.
|
|
19
|
-
*/
|
|
20
|
-
export interface GatewayConfig {
|
|
21
|
-
targetApiUrl: string;
|
|
22
|
-
port?: number;
|
|
23
|
-
debug?: boolean;
|
|
24
|
-
clientType?: string;
|
|
25
|
-
}
|
|
26
|
-
export declare class SSOGateway {
|
|
27
|
-
private server;
|
|
28
|
-
private credentials;
|
|
29
|
-
private config;
|
|
30
|
-
private actualPort;
|
|
31
|
-
private debugLogFile;
|
|
32
|
-
private requestCounter;
|
|
33
|
-
private sessionStartTime;
|
|
34
|
-
constructor(config: GatewayConfig);
|
|
35
|
-
/**
|
|
36
|
-
* Start the gateway server on a random available port
|
|
37
|
-
*/
|
|
38
|
-
start(): Promise<{
|
|
39
|
-
port: number;
|
|
40
|
-
url: string;
|
|
41
|
-
}>;
|
|
42
|
-
/**
|
|
43
|
-
* Stop the gateway server
|
|
44
|
-
*/
|
|
45
|
-
stop(): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Handle incoming requests from claude binary
|
|
48
|
-
*/
|
|
49
|
-
private handleRequest;
|
|
50
|
-
/**
|
|
51
|
-
* Read request body from incoming request
|
|
52
|
-
*/
|
|
53
|
-
private readRequestBody;
|
|
54
|
-
/**
|
|
55
|
-
* Make HTTP request without async promise executor
|
|
56
|
-
*/
|
|
57
|
-
private makeHttpRequest;
|
|
58
|
-
/**
|
|
59
|
-
* Find an available port for the gateway server
|
|
60
|
-
*/
|
|
61
|
-
private findAvailablePort;
|
|
62
|
-
/**
|
|
63
|
-
* Initialize debug logging - uses session directory from main logger
|
|
64
|
-
*/
|
|
65
|
-
private initializeDebugLogging;
|
|
66
|
-
/**
|
|
67
|
-
* Append request details to session debug file
|
|
68
|
-
*/
|
|
69
|
-
private logRequestToFile;
|
|
70
|
-
/**
|
|
71
|
-
* Append response details to session debug file
|
|
72
|
-
*/
|
|
73
|
-
private logResponseToFile;
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=sso-gateway.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sso-gateway.d.ts","sourceRoot":"","sources":["../../src/utils/sso-gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAUH,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,gBAAgB,CAAc;gBAE1B,MAAM,EAAE,aAAa;IAIjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IA+DrD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;OAEG;YACW,aAAa;IA6M3B;;OAEG;YACW,eAAe;IAa7B;;OAEG;YACW,eAAe;IA4C7B;;OAEG;YACW,iBAAiB;IAuB/B;;OAEG;YACW,sBAAsB;IAiCpC;;OAEG;YACW,gBAAgB;IAyC9B;;OAEG;YACW,iBAAiB;CA6BhC"}
|
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local Authentication Gateway for SSO-enabled Claude binary
|
|
3
|
-
*
|
|
4
|
-
* This creates a local HTTP server that proxies requests from the claude binary
|
|
5
|
-
* to the codemie API, adding SSO authentication cookies in the process.
|
|
6
|
-
*
|
|
7
|
-
* Debug Logging:
|
|
8
|
-
* When debug mode is enabled, all requests and responses are logged to the
|
|
9
|
-
* unified debug session directory in JSONL (JSON Lines) format at:
|
|
10
|
-
* ~/.codemie/debug/session-<timestamp>/requests.jsonl
|
|
11
|
-
*
|
|
12
|
-
* Each line in the file is a JSON object with a 'type' field:
|
|
13
|
-
* - session_start: Gateway initialization
|
|
14
|
-
* - request: HTTP request details (headers, body, URL)
|
|
15
|
-
* - response: HTTP response details (status, headers, body preview)
|
|
16
|
-
* - session_end: Gateway shutdown with session statistics
|
|
17
|
-
*
|
|
18
|
-
* Sensitive data (Cookie, Authorization headers) is automatically redacted.
|
|
19
|
-
*/
|
|
20
|
-
import { createServer } from 'http';
|
|
21
|
-
import { randomUUID } from 'crypto';
|
|
22
|
-
import { CredentialStore } from './credential-store.js';
|
|
23
|
-
import { logger } from './logger.js';
|
|
24
|
-
import { promises as fs } from 'fs';
|
|
25
|
-
import { join } from 'path';
|
|
26
|
-
export class SSOGateway {
|
|
27
|
-
server = null;
|
|
28
|
-
credentials = null;
|
|
29
|
-
config;
|
|
30
|
-
actualPort = 0;
|
|
31
|
-
debugLogFile = null;
|
|
32
|
-
requestCounter = 0; // For statistics only
|
|
33
|
-
sessionStartTime = '';
|
|
34
|
-
constructor(config) {
|
|
35
|
-
this.config = config;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Start the gateway server on a random available port
|
|
39
|
-
*/
|
|
40
|
-
async start() {
|
|
41
|
-
// Load SSO credentials
|
|
42
|
-
const store = CredentialStore.getInstance();
|
|
43
|
-
this.credentials = await store.retrieveSSOCredentials();
|
|
44
|
-
if (!this.credentials) {
|
|
45
|
-
throw new Error('SSO credentials not found. Please run: codemie auth login');
|
|
46
|
-
}
|
|
47
|
-
if (this.config.debug) {
|
|
48
|
-
await this.initializeDebugLogging();
|
|
49
|
-
}
|
|
50
|
-
// Find available port
|
|
51
|
-
this.actualPort = this.config.port || await this.findAvailablePort();
|
|
52
|
-
return new Promise((resolve, reject) => {
|
|
53
|
-
this.server = createServer((req, res) => {
|
|
54
|
-
this.handleRequest(req, res).catch(error => {
|
|
55
|
-
logger.error('Gateway request error:', error);
|
|
56
|
-
if (!res.headersSent) {
|
|
57
|
-
res.statusCode = 500;
|
|
58
|
-
res.setHeader('Content-Type', 'application/json');
|
|
59
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
60
|
-
const errorResponse = {
|
|
61
|
-
error: 'Internal Server Error',
|
|
62
|
-
message: errorMessage,
|
|
63
|
-
timestamp: new Date().toISOString()
|
|
64
|
-
};
|
|
65
|
-
if (this.config.debug && error instanceof Error && error.stack) {
|
|
66
|
-
errorResponse.stack = error.stack;
|
|
67
|
-
}
|
|
68
|
-
res.end(JSON.stringify(errorResponse, null, 2));
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
this.server.on('error', (error) => {
|
|
73
|
-
if (error.code === 'EADDRINUSE') {
|
|
74
|
-
// Try a different random port
|
|
75
|
-
this.actualPort = 0; // Let system assign
|
|
76
|
-
this.server?.listen(this.actualPort, 'localhost');
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
reject(error);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
this.server.listen(this.actualPort, 'localhost', () => {
|
|
83
|
-
const address = this.server?.address();
|
|
84
|
-
if (typeof address === 'object' && address) {
|
|
85
|
-
this.actualPort = address.port;
|
|
86
|
-
}
|
|
87
|
-
const gatewayUrl = `http://localhost:${this.actualPort}`;
|
|
88
|
-
resolve({ port: this.actualPort, url: gatewayUrl });
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Stop the gateway server
|
|
94
|
-
*/
|
|
95
|
-
async stop() {
|
|
96
|
-
if (this.server) {
|
|
97
|
-
if (this.config.debug && this.debugLogFile) {
|
|
98
|
-
try {
|
|
99
|
-
const sessionEnd = {
|
|
100
|
-
type: 'session_end',
|
|
101
|
-
timestamp: new Date().toISOString(),
|
|
102
|
-
totalRequests: this.requestCounter,
|
|
103
|
-
duration: Date.now() - new Date(this.sessionStartTime).getTime()
|
|
104
|
-
};
|
|
105
|
-
await fs.appendFile(this.debugLogFile, JSON.stringify(sessionEnd) + '\n', 'utf-8');
|
|
106
|
-
}
|
|
107
|
-
catch (error) {
|
|
108
|
-
logger.error('Failed to write session end log:', error);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return new Promise((resolve) => {
|
|
112
|
-
this.server.close(() => {
|
|
113
|
-
resolve();
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Handle incoming requests from claude binary
|
|
120
|
-
*/
|
|
121
|
-
async handleRequest(req, res) {
|
|
122
|
-
if (!this.credentials) {
|
|
123
|
-
res.statusCode = 401;
|
|
124
|
-
res.setHeader('Content-Type', 'application/json');
|
|
125
|
-
res.end(JSON.stringify({
|
|
126
|
-
error: 'Unauthorized',
|
|
127
|
-
message: 'SSO credentials not available. Please run: codemie auth login',
|
|
128
|
-
timestamp: new Date().toISOString()
|
|
129
|
-
}, null, 2));
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
// Generate unique request ID for tracking and add to statistics
|
|
133
|
-
const requestId = randomUUID();
|
|
134
|
-
this.requestCounter++;
|
|
135
|
-
const requestTimestamp = new Date().toISOString();
|
|
136
|
-
try {
|
|
137
|
-
// Construct target URL by properly joining base URL with request path
|
|
138
|
-
// This ensures we preserve both the API path and query parameters
|
|
139
|
-
const requestUrl = req.url || '/';
|
|
140
|
-
let targetUrl;
|
|
141
|
-
// If targetApiUrl already includes path components (like /code-assistant-api),
|
|
142
|
-
// we need to append the request path correctly
|
|
143
|
-
if (this.config.targetApiUrl.endsWith('/')) {
|
|
144
|
-
// Remove leading slash from request URL to avoid double slashes
|
|
145
|
-
targetUrl = `${this.config.targetApiUrl}${requestUrl.startsWith('/') ? requestUrl.slice(1) : requestUrl}`;
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
// Ensure proper slash separation
|
|
149
|
-
targetUrl = `${this.config.targetApiUrl}${requestUrl.startsWith('/') ? requestUrl : '/' + requestUrl}`;
|
|
150
|
-
}
|
|
151
|
-
// Prepare headers for forwarding
|
|
152
|
-
const forwardHeaders = {};
|
|
153
|
-
// Copy relevant headers from claude
|
|
154
|
-
if (req.headers) {
|
|
155
|
-
Object.entries(req.headers).forEach(([key, value]) => {
|
|
156
|
-
if (key.toLowerCase() !== 'host' && key.toLowerCase() !== 'connection') {
|
|
157
|
-
forwardHeaders[key] = Array.isArray(value) ? value[0] : value || '';
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
// Add SSO authentication cookies
|
|
162
|
-
const cookieHeader = Object.entries(this.credentials.cookies)
|
|
163
|
-
.map(([key, value]) => `${key}=${value}`)
|
|
164
|
-
.join('; ');
|
|
165
|
-
forwardHeaders['Cookie'] = cookieHeader;
|
|
166
|
-
// Add request ID header for tracking
|
|
167
|
-
forwardHeaders['X-CodeMie-Request-ID'] = requestId;
|
|
168
|
-
// Add session ID header (always available)
|
|
169
|
-
forwardHeaders['X-CodeMie-Session-ID'] = logger.getSessionId();
|
|
170
|
-
// Add CodeMie headers from config
|
|
171
|
-
try {
|
|
172
|
-
const { ConfigLoader } = await import('./config-loader.js');
|
|
173
|
-
const config = await ConfigLoader.load();
|
|
174
|
-
// Add integration header only for ai-run-sso provider
|
|
175
|
-
if (config.provider === 'ai-run-sso' && config.codeMieIntegration?.id) {
|
|
176
|
-
forwardHeaders['X-CodeMie-Integration'] = config.codeMieIntegration.id;
|
|
177
|
-
}
|
|
178
|
-
// Add model header if configured (for all providers)
|
|
179
|
-
if (config.model) {
|
|
180
|
-
forwardHeaders['X-CodeMie-CLI-Model'] = config.model;
|
|
181
|
-
}
|
|
182
|
-
// Add timeout header if configured (for all providers)
|
|
183
|
-
if (config.timeout) {
|
|
184
|
-
forwardHeaders['X-CodeMie-CLI-Timeout'] = String(config.timeout);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
catch {
|
|
188
|
-
// Non-fatal error - continue without config headers
|
|
189
|
-
}
|
|
190
|
-
if (this.config.clientType) {
|
|
191
|
-
forwardHeaders['X-CodeMie-Client'] = this.config.clientType;
|
|
192
|
-
}
|
|
193
|
-
// Handle request body for POST/PUT requests
|
|
194
|
-
let body = '';
|
|
195
|
-
if (req.method === 'POST' || req.method === 'PUT' || req.method === 'PATCH') {
|
|
196
|
-
body = await this.readRequestBody(req);
|
|
197
|
-
}
|
|
198
|
-
if (this.config.debug) {
|
|
199
|
-
await this.logRequestToFile(requestId, {
|
|
200
|
-
method: req.method || 'GET',
|
|
201
|
-
url: requestUrl,
|
|
202
|
-
targetUrl,
|
|
203
|
-
headers: forwardHeaders,
|
|
204
|
-
body: body || undefined,
|
|
205
|
-
timestamp: requestTimestamp
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
// Use native Node.js https module for better SSL control (following codemie-model-fetcher pattern)
|
|
209
|
-
// Always disable SSL verification to handle enterprise certificates like codemie-model-fetcher does
|
|
210
|
-
const https = await import('https');
|
|
211
|
-
const { URL } = await import('url');
|
|
212
|
-
const parsedUrl = new URL(targetUrl);
|
|
213
|
-
const requestOptions = {
|
|
214
|
-
hostname: parsedUrl.hostname,
|
|
215
|
-
port: parsedUrl.port || (parsedUrl.protocol === 'https:' ? 443 : 80),
|
|
216
|
-
path: parsedUrl.pathname + parsedUrl.search,
|
|
217
|
-
method: req.method || 'GET',
|
|
218
|
-
headers: forwardHeaders,
|
|
219
|
-
rejectUnauthorized: false, // Always allow self-signed certificates like codemie-model-fetcher
|
|
220
|
-
timeout: 30000
|
|
221
|
-
};
|
|
222
|
-
const responseData = await this.makeHttpRequest(https, parsedUrl, requestOptions, body);
|
|
223
|
-
// Create a Response-like object
|
|
224
|
-
const response = new Response(responseData.data, {
|
|
225
|
-
status: responseData.statusCode || 200,
|
|
226
|
-
statusText: responseData.statusMessage || 'OK',
|
|
227
|
-
headers: responseData.headers
|
|
228
|
-
});
|
|
229
|
-
// Forward response status and headers
|
|
230
|
-
res.statusCode = response.status;
|
|
231
|
-
// Copy response headers
|
|
232
|
-
response.headers.forEach((value, key) => {
|
|
233
|
-
// Skip headers that might cause issues
|
|
234
|
-
if (!['transfer-encoding', 'connection'].includes(key.toLowerCase())) {
|
|
235
|
-
res.setHeader(key, value);
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
// Stream response body
|
|
239
|
-
if (response.body) {
|
|
240
|
-
const reader = response.body.getReader();
|
|
241
|
-
const pump = async () => {
|
|
242
|
-
const { done, value } = await reader.read();
|
|
243
|
-
if (done) {
|
|
244
|
-
res.end();
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
res.write(Buffer.from(value));
|
|
248
|
-
return pump();
|
|
249
|
-
};
|
|
250
|
-
await pump();
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
res.end();
|
|
254
|
-
}
|
|
255
|
-
if (this.config.debug) {
|
|
256
|
-
const responseHeaders = {};
|
|
257
|
-
response.headers.forEach((value, key) => {
|
|
258
|
-
responseHeaders[key] = value;
|
|
259
|
-
});
|
|
260
|
-
// Extract response body preview (first 1000 chars)
|
|
261
|
-
let bodyPreview;
|
|
262
|
-
if (responseData.data) {
|
|
263
|
-
const bodyText = responseData.data.toString('utf-8');
|
|
264
|
-
bodyPreview = bodyText.length > 1000
|
|
265
|
-
? bodyText.substring(0, 1000) + '...[truncated]'
|
|
266
|
-
: bodyText;
|
|
267
|
-
}
|
|
268
|
-
await this.logResponseToFile(requestId, {
|
|
269
|
-
statusCode: response.status,
|
|
270
|
-
statusMessage: response.statusText,
|
|
271
|
-
headers: responseHeaders,
|
|
272
|
-
bodyPreview,
|
|
273
|
-
timestamp: new Date().toISOString()
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
catch (error) {
|
|
278
|
-
logger.error('Gateway proxy error:', error);
|
|
279
|
-
res.statusCode = 502;
|
|
280
|
-
res.setHeader('Content-Type', 'application/json');
|
|
281
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
282
|
-
const errorResponse = {
|
|
283
|
-
error: 'Bad Gateway',
|
|
284
|
-
message: errorMessage,
|
|
285
|
-
timestamp: new Date().toISOString()
|
|
286
|
-
};
|
|
287
|
-
if (this.config.debug && error instanceof Error && error.stack) {
|
|
288
|
-
errorResponse.stack = error.stack;
|
|
289
|
-
}
|
|
290
|
-
res.end(JSON.stringify(errorResponse, null, 2));
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Read request body from incoming request
|
|
295
|
-
*/
|
|
296
|
-
async readRequestBody(req) {
|
|
297
|
-
return new Promise((resolve, reject) => {
|
|
298
|
-
let body = '';
|
|
299
|
-
req.on('data', chunk => {
|
|
300
|
-
body += chunk.toString();
|
|
301
|
-
});
|
|
302
|
-
req.on('end', () => {
|
|
303
|
-
resolve(body);
|
|
304
|
-
});
|
|
305
|
-
req.on('error', reject);
|
|
306
|
-
});
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* Make HTTP request without async promise executor
|
|
310
|
-
*/
|
|
311
|
-
async makeHttpRequest(https, parsedUrl, requestOptions, body) {
|
|
312
|
-
const protocol = parsedUrl.protocol === 'https:' ? https : await import('http');
|
|
313
|
-
return new Promise((resolve, reject) => {
|
|
314
|
-
const req = protocol.request(requestOptions, (res) => {
|
|
315
|
-
const chunks = [];
|
|
316
|
-
res.on('data', (chunk) => {
|
|
317
|
-
chunks.push(Buffer.from(chunk));
|
|
318
|
-
});
|
|
319
|
-
res.on('end', () => {
|
|
320
|
-
resolve({
|
|
321
|
-
statusCode: res.statusCode,
|
|
322
|
-
statusMessage: res.statusMessage,
|
|
323
|
-
data: Buffer.concat(chunks),
|
|
324
|
-
headers: res.headers
|
|
325
|
-
});
|
|
326
|
-
});
|
|
327
|
-
});
|
|
328
|
-
req.on('error', (error) => {
|
|
329
|
-
reject(error);
|
|
330
|
-
});
|
|
331
|
-
req.on('timeout', () => {
|
|
332
|
-
req.destroy();
|
|
333
|
-
reject(new Error('Request timeout'));
|
|
334
|
-
});
|
|
335
|
-
// Write body for POST/PUT requests
|
|
336
|
-
if (body) {
|
|
337
|
-
req.write(body);
|
|
338
|
-
}
|
|
339
|
-
req.end();
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Find an available port for the gateway server
|
|
344
|
-
*/
|
|
345
|
-
async findAvailablePort(startPort = 3001) {
|
|
346
|
-
return new Promise((resolve, reject) => {
|
|
347
|
-
const server = createServer();
|
|
348
|
-
server.listen(0, 'localhost', () => {
|
|
349
|
-
const address = server.address();
|
|
350
|
-
const port = typeof address === 'object' && address ? address.port : startPort;
|
|
351
|
-
server.close(() => {
|
|
352
|
-
resolve(port);
|
|
353
|
-
});
|
|
354
|
-
});
|
|
355
|
-
server.on('error', (error) => {
|
|
356
|
-
if (error.code === 'EADDRINUSE') {
|
|
357
|
-
resolve(this.findAvailablePort(startPort + 1));
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
reject(error);
|
|
361
|
-
}
|
|
362
|
-
});
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* Initialize debug logging - uses session directory from main logger
|
|
367
|
-
*/
|
|
368
|
-
async initializeDebugLogging() {
|
|
369
|
-
this.sessionStartTime = new Date().toISOString();
|
|
370
|
-
try {
|
|
371
|
-
// Get session directory from main logger
|
|
372
|
-
const sessionDir = logger.getDebugSessionDir();
|
|
373
|
-
if (!sessionDir) {
|
|
374
|
-
logger.error('Debug session directory not available');
|
|
375
|
-
this.debugLogFile = null;
|
|
376
|
-
return;
|
|
377
|
-
}
|
|
378
|
-
// Create requests.jsonl in the same session directory
|
|
379
|
-
const filename = 'requests.jsonl';
|
|
380
|
-
this.debugLogFile = join(sessionDir, filename);
|
|
381
|
-
// Write session header
|
|
382
|
-
const sessionHeader = {
|
|
383
|
-
type: 'session_start',
|
|
384
|
-
timestamp: this.sessionStartTime,
|
|
385
|
-
gatewayConfig: {
|
|
386
|
-
targetApiUrl: this.config.targetApiUrl,
|
|
387
|
-
clientType: this.config.clientType
|
|
388
|
-
}
|
|
389
|
-
};
|
|
390
|
-
await fs.writeFile(this.debugLogFile, JSON.stringify(sessionHeader) + '\n', 'utf-8');
|
|
391
|
-
}
|
|
392
|
-
catch (error) {
|
|
393
|
-
logger.error('Failed to create debug log file:', error);
|
|
394
|
-
this.debugLogFile = null;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
/**
|
|
398
|
-
* Append request details to session debug file
|
|
399
|
-
*/
|
|
400
|
-
async logRequestToFile(requestId, data) {
|
|
401
|
-
if (!this.debugLogFile)
|
|
402
|
-
return;
|
|
403
|
-
try {
|
|
404
|
-
// Sanitize sensitive data
|
|
405
|
-
const sanitizedHeaders = { ...data.headers };
|
|
406
|
-
if (sanitizedHeaders['Cookie']) {
|
|
407
|
-
sanitizedHeaders['Cookie'] = '[REDACTED]';
|
|
408
|
-
}
|
|
409
|
-
if (sanitizedHeaders['Authorization']) {
|
|
410
|
-
sanitizedHeaders['Authorization'] = '[REDACTED]';
|
|
411
|
-
}
|
|
412
|
-
const logEntry = {
|
|
413
|
-
type: 'request',
|
|
414
|
-
requestId,
|
|
415
|
-
timestamp: data.timestamp,
|
|
416
|
-
method: data.method,
|
|
417
|
-
url: data.url,
|
|
418
|
-
targetUrl: data.targetUrl,
|
|
419
|
-
headers: sanitizedHeaders,
|
|
420
|
-
body: data.body
|
|
421
|
-
};
|
|
422
|
-
// Append to file (JSONL format - one JSON object per line)
|
|
423
|
-
await fs.appendFile(this.debugLogFile, JSON.stringify(logEntry) + '\n', 'utf-8');
|
|
424
|
-
}
|
|
425
|
-
catch (error) {
|
|
426
|
-
logger.error('Failed to write request log:', error);
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Append response details to session debug file
|
|
431
|
-
*/
|
|
432
|
-
async logResponseToFile(requestId, data) {
|
|
433
|
-
if (!this.debugLogFile)
|
|
434
|
-
return;
|
|
435
|
-
try {
|
|
436
|
-
const logEntry = {
|
|
437
|
-
type: 'response',
|
|
438
|
-
requestId,
|
|
439
|
-
timestamp: data.timestamp,
|
|
440
|
-
statusCode: data.statusCode,
|
|
441
|
-
statusMessage: data.statusMessage,
|
|
442
|
-
headers: data.headers,
|
|
443
|
-
bodyPreview: data.bodyPreview
|
|
444
|
-
};
|
|
445
|
-
// Append to file (JSONL format - one JSON object per line)
|
|
446
|
-
await fs.appendFile(this.debugLogFile, JSON.stringify(logEntry) + '\n', 'utf-8');
|
|
447
|
-
}
|
|
448
|
-
catch (error) {
|
|
449
|
-
logger.error('Failed to write response log:', error);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
//# sourceMappingURL=sso-gateway.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sso-gateway.js","sourceRoot":"","sources":["../../src/utils/sso-gateway.ts"],"names":[],"mappings":"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"}
|