@codemieai/code 0.0.11 → 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.
Files changed (129) hide show
  1. package/README.md +20 -98
  2. package/dist/agents/codemie-code/agent.d.ts.map +1 -1
  3. package/dist/agents/codemie-code/agent.js +35 -4
  4. package/dist/agents/codemie-code/agent.js.map +1 -1
  5. package/dist/agents/codemie-code/tools/index.d.ts.map +1 -1
  6. package/dist/agents/codemie-code/tools/index.js +5 -3
  7. package/dist/agents/codemie-code/tools/index.js.map +1 -1
  8. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  9. package/dist/agents/core/AgentCLI.js +57 -11
  10. package/dist/agents/core/AgentCLI.js.map +1 -1
  11. package/dist/agents/core/BaseAgentAdapter.d.ts +4 -4
  12. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  13. package/dist/agents/core/BaseAgentAdapter.js +31 -23
  14. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  15. package/dist/agents/plugins/codemie-code.plugin.js +1 -1
  16. package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
  17. package/dist/agents/plugins/gemini.plugin.js +1 -1
  18. package/dist/agents/plugins/gemini.plugin.js.map +1 -1
  19. package/dist/analytics/collector.d.ts +46 -0
  20. package/dist/analytics/collector.d.ts.map +1 -0
  21. package/dist/analytics/collector.js +83 -0
  22. package/dist/analytics/collector.js.map +1 -0
  23. package/dist/analytics/config.d.ts +14 -0
  24. package/dist/analytics/config.d.ts.map +1 -0
  25. package/dist/analytics/config.js +46 -0
  26. package/dist/analytics/config.js.map +1 -0
  27. package/dist/analytics/index.d.ts +108 -0
  28. package/dist/analytics/index.d.ts.map +1 -0
  29. package/dist/analytics/index.js +322 -0
  30. package/dist/analytics/index.js.map +1 -0
  31. package/dist/analytics/plugins/api-metrics.plugin.d.ts +23 -0
  32. package/dist/analytics/plugins/api-metrics.plugin.d.ts.map +1 -0
  33. package/dist/analytics/plugins/api-metrics.plugin.js +113 -0
  34. package/dist/analytics/plugins/api-metrics.plugin.js.map +1 -0
  35. package/dist/analytics/plugins/index.d.ts +15 -0
  36. package/dist/analytics/plugins/index.d.ts.map +1 -0
  37. package/dist/analytics/plugins/index.js +15 -0
  38. package/dist/analytics/plugins/index.js.map +1 -0
  39. package/dist/analytics/plugins/model-metrics.plugin.d.ts +36 -0
  40. package/dist/analytics/plugins/model-metrics.plugin.d.ts.map +1 -0
  41. package/dist/analytics/plugins/model-metrics.plugin.js +115 -0
  42. package/dist/analytics/plugins/model-metrics.plugin.js.map +1 -0
  43. package/dist/analytics/plugins/provider-metrics.plugin.d.ts +38 -0
  44. package/dist/analytics/plugins/provider-metrics.plugin.d.ts.map +1 -0
  45. package/dist/analytics/plugins/provider-metrics.plugin.js +138 -0
  46. package/dist/analytics/plugins/provider-metrics.plugin.js.map +1 -0
  47. package/dist/analytics/plugins/types.d.ts +63 -0
  48. package/dist/analytics/plugins/types.d.ts.map +1 -0
  49. package/dist/analytics/plugins/types.js +54 -0
  50. package/dist/analytics/plugins/types.js.map +1 -0
  51. package/dist/analytics/privacy.d.ts +10 -0
  52. package/dist/analytics/privacy.d.ts.map +1 -0
  53. package/dist/analytics/privacy.js +20 -0
  54. package/dist/analytics/privacy.js.map +1 -0
  55. package/dist/analytics/session.d.ts +56 -0
  56. package/dist/analytics/session.d.ts.map +1 -0
  57. package/dist/analytics/session.js +95 -0
  58. package/dist/analytics/session.js.map +1 -0
  59. package/dist/analytics/types.d.ts +104 -0
  60. package/dist/analytics/types.d.ts.map +1 -0
  61. package/dist/analytics/types.js +15 -0
  62. package/dist/analytics/types.js.map +1 -0
  63. package/dist/analytics/writer.d.ts +18 -0
  64. package/dist/analytics/writer.d.ts.map +1 -0
  65. package/dist/analytics/writer.js +44 -0
  66. package/dist/analytics/writer.js.map +1 -0
  67. package/dist/cli/commands/analytics.d.ts +3 -0
  68. package/dist/cli/commands/analytics.d.ts.map +1 -0
  69. package/dist/cli/commands/analytics.js +319 -0
  70. package/dist/cli/commands/analytics.js.map +1 -0
  71. package/dist/cli/commands/config.d.ts.map +1 -1
  72. package/dist/cli/commands/config.js +14 -0
  73. package/dist/cli/commands/config.js.map +1 -1
  74. package/dist/cli/commands/profile.d.ts.map +1 -1
  75. package/dist/cli/commands/profile.js +41 -0
  76. package/dist/cli/commands/profile.js.map +1 -1
  77. package/dist/cli/index.js +2 -0
  78. package/dist/cli/index.js.map +1 -1
  79. package/dist/env/types.d.ts +2 -0
  80. package/dist/env/types.d.ts.map +1 -1
  81. package/dist/env/types.js.map +1 -1
  82. package/dist/utils/analytics-reader.d.ts +117 -0
  83. package/dist/utils/analytics-reader.d.ts.map +1 -0
  84. package/dist/utils/analytics-reader.js +421 -0
  85. package/dist/utils/analytics-reader.js.map +1 -0
  86. package/dist/utils/codemie-integration-validator.d.ts.map +1 -1
  87. package/dist/utils/codemie-integration-validator.js +3 -16
  88. package/dist/utils/codemie-integration-validator.js.map +1 -1
  89. package/dist/utils/codemie-proxy.d.ts +80 -0
  90. package/dist/utils/codemie-proxy.d.ts.map +1 -0
  91. package/dist/utils/codemie-proxy.js +335 -0
  92. package/dist/utils/codemie-proxy.js.map +1 -0
  93. package/dist/utils/config-loader.d.ts +7 -0
  94. package/dist/utils/config-loader.d.ts.map +1 -1
  95. package/dist/utils/config-loader.js +18 -0
  96. package/dist/utils/config-loader.js.map +1 -1
  97. package/dist/utils/date-formatter.d.ts +88 -0
  98. package/dist/utils/date-formatter.d.ts.map +1 -0
  99. package/dist/utils/date-formatter.js +133 -0
  100. package/dist/utils/date-formatter.js.map +1 -0
  101. package/dist/utils/installation-id.d.ts +10 -0
  102. package/dist/utils/installation-id.d.ts.map +1 -0
  103. package/dist/utils/installation-id.js +30 -0
  104. package/dist/utils/installation-id.js.map +1 -0
  105. package/dist/utils/logger.d.ts +1 -15
  106. package/dist/utils/logger.d.ts.map +1 -1
  107. package/dist/utils/logger.js +5 -86
  108. package/dist/utils/logger.js.map +1 -1
  109. package/dist/utils/proxy/errors.d.ts +45 -0
  110. package/dist/utils/proxy/errors.d.ts.map +1 -0
  111. package/dist/utils/proxy/errors.js +103 -0
  112. package/dist/utils/proxy/errors.js.map +1 -0
  113. package/dist/utils/proxy/http-client.d.ts +46 -0
  114. package/dist/utils/proxy/http-client.d.ts.map +1 -0
  115. package/dist/utils/proxy/http-client.js +133 -0
  116. package/dist/utils/proxy/http-client.js.map +1 -0
  117. package/dist/utils/proxy/interceptors.d.ts +69 -0
  118. package/dist/utils/proxy/interceptors.d.ts.map +1 -0
  119. package/dist/utils/proxy/interceptors.js +319 -0
  120. package/dist/utils/proxy/interceptors.js.map +1 -0
  121. package/dist/utils/proxy/types.d.ts +45 -0
  122. package/dist/utils/proxy/types.d.ts.map +1 -0
  123. package/dist/utils/proxy/types.js +7 -0
  124. package/dist/utils/proxy/types.js.map +1 -0
  125. package/package.json +38 -5
  126. package/dist/utils/sso-gateway.d.ts +0 -75
  127. package/dist/utils/sso-gateway.d.ts.map +0 -1
  128. package/dist/utils/sso-gateway.js +0 -453
  129. 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.11",
4
- "description": "AI/Run CodeMie CLI - Professional CLI wrapper for managing multiple AI coding agents",
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,13 +39,42 @@
39
39
  },
40
40
  "keywords": [
41
41
  "ai",
42
- "coding",
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
- "deepagents",
48
- "wrapper"
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",
@@ -65,7 +94,9 @@
65
94
  "@langchain/openai": "^1.1.0",
66
95
  "chalk": "^5.3.0",
67
96
  "commander": "^11.1.0",
97
+ "cors": "^2.8.5",
68
98
  "dotenv": "^16.3.1",
99
+ "express": "^5.1.0",
69
100
  "inquirer": "^9.2.12",
70
101
  "keytar": "^7.9.0",
71
102
  "open": "^8.4.2",
@@ -74,6 +105,8 @@
74
105
  },
75
106
  "devDependencies": {
76
107
  "@eslint/js": "^9.38.0",
108
+ "@types/cors": "^2.8.19",
109
+ "@types/express": "^5.0.5",
77
110
  "@types/inquirer": "^9.0.7",
78
111
  "@types/node": "^20.10.5",
79
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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"}