@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.
Files changed (129) hide show
  1. package/README.md +23 -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 +46 -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
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Simple Streaming HTTP Client
3
+ *
4
+ * KISS: Does one thing well - forwards HTTP requests with streaming.
5
+ * Memory efficient: Returns streams directly, no buffering.
6
+ */
7
+ import { pipeline } from 'stream/promises';
8
+ import https from 'https';
9
+ import http from 'http';
10
+ import { TimeoutError, NetworkError } from './errors.js';
11
+ import { logger } from '../logger.js';
12
+ /**
13
+ * Simple streaming HTTP client for proxy forwarding
14
+ */
15
+ export class ProxyHTTPClient {
16
+ httpsAgent;
17
+ httpAgent;
18
+ timeout;
19
+ constructor(options = {}) {
20
+ this.timeout = options.timeout || 300000; // 5 minutes default
21
+ // Connection pooling with keep-alive
22
+ const agentOptions = {
23
+ rejectUnauthorized: options.rejectUnauthorized ?? false,
24
+ keepAlive: true,
25
+ maxSockets: 50,
26
+ timeout: 30000 // Connection timeout
27
+ };
28
+ this.httpsAgent = new https.Agent(agentOptions);
29
+ this.httpAgent = new http.Agent({
30
+ keepAlive: true,
31
+ maxSockets: 50,
32
+ timeout: 30000
33
+ });
34
+ }
35
+ /**
36
+ * Forward request with streaming - no buffering
37
+ * Returns response stream directly for memory efficiency
38
+ */
39
+ async forward(url, options) {
40
+ const protocol = url.protocol === 'https:' ? https : http;
41
+ const agent = url.protocol === 'https:' ? this.httpsAgent : this.httpAgent;
42
+ return new Promise((resolve, reject) => {
43
+ const requestOptions = {
44
+ hostname: url.hostname,
45
+ port: url.port || (url.protocol === 'https:' ? 443 : 80),
46
+ path: url.pathname + url.search,
47
+ method: options.method,
48
+ headers: options.headers,
49
+ agent,
50
+ timeout: this.timeout
51
+ };
52
+ const req = protocol.request(requestOptions, (res) => {
53
+ resolve(res);
54
+ });
55
+ req.on('error', (error) => {
56
+ // Handle client disconnection (normal behavior when user closes agent)
57
+ if (error.message === 'aborted' || error.code === 'ECONNABORTED' || error.code === 'ERR_STREAM_PREMATURE_CLOSE') {
58
+ // Silent rejection for normal client disconnect - don't log as error
59
+ const abortError = new Error('Client disconnected');
60
+ abortError.isAborted = true;
61
+ reject(abortError);
62
+ return;
63
+ }
64
+ // Convert to proxy error types
65
+ if (error.code === 'ECONNREFUSED' || error.code === 'ENOTFOUND' || error.code === 'ECONNRESET') {
66
+ reject(new NetworkError(`Cannot connect to upstream: ${error.message}`, {
67
+ errorCode: error.code,
68
+ hostname: url.hostname
69
+ }));
70
+ }
71
+ else {
72
+ reject(error);
73
+ }
74
+ });
75
+ req.on('timeout', () => {
76
+ req.destroy();
77
+ reject(new TimeoutError(`Request timeout after ${this.timeout}ms`, {
78
+ timeout: this.timeout,
79
+ url: url.toString()
80
+ }));
81
+ });
82
+ // Write body for POST/PUT/PATCH requests
83
+ if (options.body) {
84
+ req.write(options.body);
85
+ }
86
+ req.end();
87
+ });
88
+ }
89
+ /**
90
+ * Stream response to client with backpressure handling
91
+ * Uses Node.js pipeline for automatic backpressure
92
+ */
93
+ async pipeResponse(upstream, downstream, skipHeaders = ['transfer-encoding', 'connection']) {
94
+ // Copy status code
95
+ downstream.statusCode = upstream.statusCode || 200;
96
+ // Copy headers (skip problematic ones)
97
+ for (const [key, value] of Object.entries(upstream.headers)) {
98
+ if (!skipHeaders.includes(key.toLowerCase()) && value !== undefined) {
99
+ downstream.setHeader(key, value);
100
+ }
101
+ }
102
+ // Stream with automatic backpressure handling
103
+ try {
104
+ await pipeline(upstream, downstream);
105
+ logger.debug('[http-client] Response streamed successfully');
106
+ }
107
+ catch (error) {
108
+ // Pipeline handles cleanup automatically
109
+ logger.error('[http-client] Stream pipeline error:', error);
110
+ throw error;
111
+ }
112
+ }
113
+ /**
114
+ * Read response body into buffer
115
+ * Only use when body is needed (e.g., for analytics)
116
+ * WARNING: Buffers entire response in memory!
117
+ */
118
+ async readResponseBody(response) {
119
+ const chunks = [];
120
+ for await (const chunk of response) {
121
+ chunks.push(Buffer.from(chunk));
122
+ }
123
+ return Buffer.concat(chunks);
124
+ }
125
+ /**
126
+ * Close HTTP client and cleanup agents
127
+ */
128
+ close() {
129
+ this.httpsAgent.destroy();
130
+ this.httpAgent.destroy();
131
+ }
132
+ }
133
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../src/utils/proxy/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Proxy Interceptor System
3
+ *
4
+ * Plugin-based architecture for extending proxy functionality.
5
+ * SOLID: Open/Closed - add features without modifying core proxy.
6
+ */
7
+ import { ProxyContext, UpstreamResponse } from './types.js';
8
+ import { SSOCredentials } from '../../types/sso.js';
9
+ /**
10
+ * Interceptor interface - Optional hooks for request/response/error
11
+ * Interface Segregation: Implement only what you need
12
+ */
13
+ export interface ProxyInterceptor {
14
+ name: string;
15
+ /** Called before forwarding request to upstream */
16
+ onRequest?(context: ProxyContext): Promise<void>;
17
+ /** Called after receiving response from upstream */
18
+ onResponse?(context: ProxyContext, response: UpstreamResponse): Promise<void>;
19
+ /** Called on any error */
20
+ onError?(context: ProxyContext, error: Error): Promise<void>;
21
+ }
22
+ /**
23
+ * SSO Authentication Interceptor
24
+ * Injects authentication cookies into requests
25
+ */
26
+ export declare class SSOAuthInterceptor implements ProxyInterceptor {
27
+ private credentials;
28
+ name: string;
29
+ constructor(credentials: SSOCredentials);
30
+ onRequest(context: ProxyContext): Promise<void>;
31
+ }
32
+ /**
33
+ * Header Injection Interceptor
34
+ * Adds CodeMie-specific headers
35
+ */
36
+ export declare class HeaderInjectionInterceptor implements ProxyInterceptor {
37
+ private config;
38
+ name: string;
39
+ constructor(config: {
40
+ sessionId: string;
41
+ provider?: string;
42
+ integrationId?: string;
43
+ model?: string;
44
+ timeout?: number;
45
+ clientType?: string;
46
+ });
47
+ onRequest(context: ProxyContext): Promise<void>;
48
+ }
49
+ /**
50
+ * Analytics Tracking Interceptor
51
+ * Uses existing Analytics system - DRY principle
52
+ */
53
+ export declare class AnalyticsInterceptor implements ProxyInterceptor {
54
+ name: string;
55
+ onRequest(context: ProxyContext): Promise<void>;
56
+ onResponse(context: ProxyContext, response: UpstreamResponse): Promise<void>;
57
+ onError(context: ProxyContext, error: Error): Promise<void>;
58
+ /**
59
+ * Extract response content from various API formats
60
+ * Reuses logic from original proxy
61
+ */
62
+ private extractResponseContent;
63
+ /**
64
+ * Extract content from SSE stream
65
+ * Simplified from original - focuses on content extraction
66
+ */
67
+ private extractSSEContent;
68
+ }
69
+ //# sourceMappingURL=interceptors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptors.d.ts","sourceRoot":"","sources":["../../../src/utils/proxy/interceptors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IAEb,mDAAmD;IACnD,SAAS,CAAC,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjD,oDAAoD;IACpD,UAAU,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9E,0BAA0B;IAC1B,OAAO,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IAG7C,OAAO,CAAC,WAAW;IAF/B,IAAI,SAAc;gBAEE,WAAW,EAAE,cAAc;IAEzC,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAUtD;AAED;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,gBAAgB;IAI/D,OAAO,CAAC,MAAM;IAHhB,IAAI,SAAsB;gBAGhB,MAAM,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;IAGG,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CA6BtD;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,IAAI,SAAe;IAEb,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA6D/C,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoF5E,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBjE;;;OAGG;YACW,sBAAsB;IA2CpC;;;OAGG;YACW,iBAAiB;CAoDhC"}
@@ -0,0 +1,319 @@
1
+ /**
2
+ * Proxy Interceptor System
3
+ *
4
+ * Plugin-based architecture for extending proxy functionality.
5
+ * SOLID: Open/Closed - add features without modifying core proxy.
6
+ */
7
+ import { getAnalytics } from '../../analytics/index.js';
8
+ import { logger } from '../logger.js';
9
+ /**
10
+ * SSO Authentication Interceptor
11
+ * Injects authentication cookies into requests
12
+ */
13
+ export class SSOAuthInterceptor {
14
+ credentials;
15
+ name = 'sso-auth';
16
+ constructor(credentials) {
17
+ this.credentials = credentials;
18
+ }
19
+ async onRequest(context) {
20
+ // Inject SSO cookies
21
+ const cookieHeader = Object.entries(this.credentials.cookies)
22
+ .map(([key, value]) => `${key}=${value}`)
23
+ .join('; ');
24
+ context.headers['Cookie'] = cookieHeader;
25
+ logger.debug(`[${this.name}] Injected SSO cookies`);
26
+ }
27
+ }
28
+ /**
29
+ * Header Injection Interceptor
30
+ * Adds CodeMie-specific headers
31
+ */
32
+ export class HeaderInjectionInterceptor {
33
+ config;
34
+ name = 'header-injection';
35
+ constructor(config) {
36
+ this.config = config;
37
+ }
38
+ async onRequest(context) {
39
+ // Request ID header
40
+ context.headers['X-CodeMie-Request-ID'] = context.requestId;
41
+ // Session ID header
42
+ context.headers['X-CodeMie-Session-ID'] = this.config.sessionId;
43
+ // Add integration header only for ai-run-sso provider
44
+ if (this.config.provider === 'ai-run-sso' && this.config.integrationId) {
45
+ context.headers['X-CodeMie-Integration'] = this.config.integrationId;
46
+ }
47
+ // Add model header if configured (for all providers)
48
+ if (this.config.model) {
49
+ context.headers['X-CodeMie-CLI-Model'] = this.config.model;
50
+ }
51
+ // Add timeout header if configured (for all providers)
52
+ if (this.config.timeout) {
53
+ context.headers['X-CodeMie-CLI-Timeout'] = String(this.config.timeout);
54
+ }
55
+ // Add client type header
56
+ if (this.config.clientType) {
57
+ context.headers['X-CodeMie-Client'] = this.config.clientType;
58
+ }
59
+ logger.debug(`[${this.name}] Injected CodeMie headers`);
60
+ }
61
+ }
62
+ /**
63
+ * Analytics Tracking Interceptor
64
+ * Uses existing Analytics system - DRY principle
65
+ */
66
+ export class AnalyticsInterceptor {
67
+ name = 'analytics';
68
+ async onRequest(context) {
69
+ try {
70
+ const analytics = getAnalytics();
71
+ if (!analytics.isEnabled) {
72
+ return;
73
+ }
74
+ // Track request start time
75
+ context.requestStartTime = Date.now();
76
+ // Parse request body for analytics
77
+ let requestBodyParsed = null;
78
+ try {
79
+ if (context.requestBody) {
80
+ requestBodyParsed = JSON.parse(context.requestBody);
81
+ }
82
+ }
83
+ catch {
84
+ // Not JSON, skip parsing
85
+ }
86
+ // Truncate large request bodies
87
+ const MAX_BODY_SIZE = 100000; // 100KB limit
88
+ let requestBodyToLog = null;
89
+ let requestBodyTruncated = false;
90
+ const originalRequestBodySize = context.requestBody?.length || 0;
91
+ if (requestBodyParsed) {
92
+ const bodyStr = JSON.stringify(requestBodyParsed);
93
+ if (bodyStr.length > MAX_BODY_SIZE) {
94
+ requestBodyToLog = {
95
+ model: requestBodyParsed.model,
96
+ temperature: requestBodyParsed.temperature,
97
+ max_tokens: requestBodyParsed.max_tokens,
98
+ messageCount: requestBodyParsed.messages?.length || 0,
99
+ contentTruncated: '[Content truncated - exceeded 100KB limit]',
100
+ originalSize: bodyStr.length
101
+ };
102
+ requestBodyTruncated = true;
103
+ }
104
+ else {
105
+ requestBodyToLog = requestBodyParsed;
106
+ }
107
+ }
108
+ await analytics.track('api_request', {
109
+ requestId: context.requestId,
110
+ method: context.method,
111
+ url: context.url,
112
+ targetUrl: context.targetUrl,
113
+ hasBody: !!context.requestBody,
114
+ bodySize: originalRequestBodySize,
115
+ bodyTruncated: requestBodyTruncated,
116
+ ...(requestBodyToLog ? { requestBody: requestBodyToLog } : {})
117
+ });
118
+ logger.debug(`[${this.name}] Tracked API request`);
119
+ }
120
+ catch (error) {
121
+ // Silently fail - analytics should not block requests
122
+ logger.error(`[${this.name}] Error tracking request:`, error);
123
+ }
124
+ }
125
+ async onResponse(context, response) {
126
+ try {
127
+ const analytics = getAnalytics();
128
+ if (!analytics.isEnabled) {
129
+ return;
130
+ }
131
+ const latency = Date.now() - context.requestStartTime;
132
+ let responseBodyParsed = null;
133
+ const MAX_BODY_SIZE = 10000; // 10KB limit
134
+ if (response.body) {
135
+ const contentType = response.headers['content-type'] || '';
136
+ const isStreaming = contentType.includes('text/event-stream');
137
+ if (isStreaming) {
138
+ // Store SSE text for response extraction
139
+ const sseText = response.body.toString('utf-8');
140
+ responseBodyParsed = { _sseContent: sseText, streaming: true };
141
+ }
142
+ else {
143
+ // Standard JSON response
144
+ try {
145
+ responseBodyParsed = JSON.parse(response.body.toString('utf-8'));
146
+ }
147
+ catch {
148
+ // Not JSON, ignore
149
+ }
150
+ }
151
+ }
152
+ // Truncate response body if needed
153
+ let responseBodyToLog = null;
154
+ let bodyTruncated = false;
155
+ const originalBodySize = response.body?.length || 0;
156
+ if (responseBodyParsed) {
157
+ const bodyStr = JSON.stringify(responseBodyParsed);
158
+ if (bodyStr.length > MAX_BODY_SIZE) {
159
+ responseBodyToLog = {
160
+ usage: responseBodyParsed.usage,
161
+ model: responseBodyParsed.model,
162
+ id: responseBodyParsed.id,
163
+ object: responseBodyParsed.object,
164
+ contentTruncated: '[Content truncated - exceeded 10KB limit]',
165
+ originalSize: bodyStr.length
166
+ };
167
+ bodyTruncated = true;
168
+ }
169
+ else {
170
+ responseBodyToLog = responseBodyParsed;
171
+ }
172
+ }
173
+ await analytics.track('api_response', {
174
+ requestId: context.requestId,
175
+ statusCode: response.statusCode,
176
+ statusMessage: response.statusMessage,
177
+ headers: response.headers,
178
+ ...(responseBodyToLog ? { responseBody: responseBodyToLog } : {}),
179
+ bodySize: originalBodySize,
180
+ bodyTruncated
181
+ }, {
182
+ latencyMs: latency
183
+ });
184
+ // Track agent response content
185
+ if (responseBodyParsed) {
186
+ const responseContent = await this.extractResponseContent(responseBodyParsed);
187
+ if (responseContent) {
188
+ await analytics.trackAgentResponse(responseContent, {
189
+ requestId: context.requestId,
190
+ model: responseBodyParsed.model || 'unknown',
191
+ streaming: responseBodyParsed.streaming || false
192
+ });
193
+ }
194
+ }
195
+ logger.debug(`[${this.name}] Tracked API response (${latency}ms)`);
196
+ }
197
+ catch (error) {
198
+ // Silently fail - analytics should not block requests
199
+ logger.error(`[${this.name}] Error tracking response:`, error);
200
+ }
201
+ }
202
+ async onError(context, error) {
203
+ try {
204
+ const analytics = getAnalytics();
205
+ if (!analytics.isEnabled) {
206
+ return;
207
+ }
208
+ await analytics.track('proxy_error', {
209
+ requestId: context.requestId,
210
+ errorType: error.name,
211
+ errorMessage: error.message,
212
+ url: context.url
213
+ });
214
+ logger.debug(`[${this.name}] Tracked error`);
215
+ }
216
+ catch (trackError) {
217
+ logger.error(`[${this.name}] Error tracking error:`, trackError);
218
+ }
219
+ }
220
+ /**
221
+ * Extract response content from various API formats
222
+ * Reuses logic from original proxy
223
+ */
224
+ async extractResponseContent(responseBody) {
225
+ let responseContent = null;
226
+ // SSE streaming content
227
+ if (responseBody._sseContent) {
228
+ responseContent = await this.extractSSEContent(responseBody._sseContent);
229
+ }
230
+ // OpenAI/Claude streaming format (choices array)
231
+ else if (responseBody.choices && Array.isArray(responseBody.choices) && responseBody.choices.length > 0) {
232
+ const choice = responseBody.choices[0];
233
+ if (choice.message?.content) {
234
+ responseContent = choice.message.content;
235
+ }
236
+ else if (choice.delta?.content) {
237
+ responseContent = choice.delta.content;
238
+ }
239
+ }
240
+ // Claude Messages API format (content array)
241
+ else if (responseBody.content && Array.isArray(responseBody.content)) {
242
+ responseContent = responseBody.content
243
+ .filter((c) => c.type === 'text' && c.text)
244
+ .map((c) => c.text)
245
+ .join('\n');
246
+ }
247
+ // Gemini format: candidates with content.parts
248
+ else if (responseBody.candidates && Array.isArray(responseBody.candidates) && responseBody.candidates.length > 0) {
249
+ const candidate = responseBody.candidates[0];
250
+ if (candidate.content?.parts && Array.isArray(candidate.content.parts)) {
251
+ const textParts = candidate.content.parts
252
+ .filter((p) => p.text)
253
+ .map((p) => p.text);
254
+ if (textParts.length > 0) {
255
+ responseContent = textParts.join('');
256
+ }
257
+ }
258
+ }
259
+ // Fallback: check for top-level content field
260
+ else if (responseBody.content && typeof responseBody.content === 'string') {
261
+ responseContent = responseBody.content;
262
+ }
263
+ return responseContent;
264
+ }
265
+ /**
266
+ * Extract content from SSE stream
267
+ * Simplified from original - focuses on content extraction
268
+ */
269
+ async extractSSEContent(sseText) {
270
+ try {
271
+ const lines = sseText.split('\n');
272
+ const contentParts = [];
273
+ for (const line of lines) {
274
+ if (line.startsWith('data: ')) {
275
+ const dataStr = line.slice(6).trim();
276
+ if (!dataStr || dataStr === '[DONE]') {
277
+ continue;
278
+ }
279
+ try {
280
+ const data = JSON.parse(dataStr);
281
+ // Claude streaming format
282
+ if (data.type === 'content_block_delta' && data.delta?.text) {
283
+ contentParts.push(data.delta.text);
284
+ }
285
+ // OpenAI streaming format
286
+ else if (data.choices && Array.isArray(data.choices)) {
287
+ for (const choice of data.choices) {
288
+ if (choice.delta?.content) {
289
+ contentParts.push(choice.delta.content);
290
+ }
291
+ }
292
+ }
293
+ // Gemini streaming format
294
+ else if (data.candidates && Array.isArray(data.candidates)) {
295
+ for (const candidate of data.candidates) {
296
+ if (candidate.content?.parts && Array.isArray(candidate.content.parts)) {
297
+ for (const part of candidate.content.parts) {
298
+ if (part.text) {
299
+ contentParts.push(part.text);
300
+ }
301
+ }
302
+ }
303
+ }
304
+ }
305
+ }
306
+ catch {
307
+ continue;
308
+ }
309
+ }
310
+ }
311
+ return contentParts.length > 0 ? contentParts.join('') : null;
312
+ }
313
+ catch (error) {
314
+ logger.debug('SSE content extraction error:', error);
315
+ return null;
316
+ }
317
+ }
318
+ }
319
+ //# sourceMappingURL=interceptors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptors.js","sourceRoot":"","sources":["../../../src/utils/proxy/interceptors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Proxy Types
3
+ *
4
+ * Type definitions for proxy system.
5
+ */
6
+ import { IncomingHttpHeaders } from 'http';
7
+ /**
8
+ * Proxy configuration
9
+ */
10
+ export interface ProxyConfig {
11
+ targetApiUrl: string;
12
+ port?: number;
13
+ host?: string;
14
+ clientType?: string;
15
+ timeout?: number;
16
+ model?: string;
17
+ provider?: string;
18
+ integrationId?: string;
19
+ sessionId?: string;
20
+ }
21
+ /**
22
+ * Proxy context - shared state across interceptors
23
+ */
24
+ export interface ProxyContext {
25
+ requestId: string;
26
+ sessionId: string;
27
+ agentName: string;
28
+ method: string;
29
+ url: string;
30
+ headers: Record<string, string>;
31
+ requestBody: string | null;
32
+ requestStartTime: number;
33
+ targetUrl?: string;
34
+ metadata: Record<string, unknown>;
35
+ }
36
+ /**
37
+ * Upstream response
38
+ */
39
+ export interface UpstreamResponse {
40
+ statusCode: number;
41
+ statusMessage: string;
42
+ headers: IncomingHttpHeaders;
43
+ body: Buffer | null;
44
+ }
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/proxy/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Proxy Types
3
+ *
4
+ * Type definitions for proxy system.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/proxy/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}