@fentz26/envcp 1.2.0-exp.bafb368 → 1.2.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/README.md +21 -36
- package/VERSION +1 -1
- package/dist/adapters/base.d.ts +25 -2
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/base.js +111 -29
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/gemini.d.ts +6 -4
- package/dist/adapters/gemini.d.ts.map +1 -1
- package/dist/adapters/gemini.js +43 -116
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/openai.d.ts +6 -4
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +54 -131
- package/dist/adapters/openai.js.map +1 -1
- package/dist/adapters/rest.d.ts +1 -0
- package/dist/adapters/rest.d.ts.map +1 -1
- package/dist/adapters/rest.js +14 -6
- package/dist/adapters/rest.js.map +1 -1
- package/dist/cli/index.js +1463 -424
- package/dist/cli/index.js.map +1 -1
- package/dist/config/config-guard.d.ts.map +1 -1
- package/dist/config/config-guard.js +9 -4
- package/dist/config/config-guard.js.map +1 -1
- package/dist/config/config-hmac.d.ts.map +1 -1
- package/dist/config/config-hmac.js +7 -3
- package/dist/config/config-hmac.js.map +1 -1
- package/dist/config/manager.d.ts +12 -2
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +189 -105
- package/dist/config/manager.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/server/unified.d.ts +1 -0
- package/dist/server/unified.d.ts.map +1 -1
- package/dist/server/unified.js +54 -30
- package/dist/server/unified.js.map +1 -1
- package/dist/service/config.d.ts.map +1 -1
- package/dist/service/config.js +5 -10
- package/dist/service/config.js.map +1 -1
- package/dist/service/generators.d.ts.map +1 -1
- package/dist/service/generators.js +6 -8
- package/dist/service/generators.js.map +1 -1
- package/dist/service/index.js +4 -3
- package/dist/service/index.js.map +1 -1
- package/dist/service/platform.js +2 -2
- package/dist/service/platform.js.map +1 -1
- package/dist/storage/index.d.ts +1 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +35 -27
- package/dist/storage/index.js.map +1 -1
- package/dist/types.d.ts +265 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +25 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/crypto.d.ts +5 -3
- package/dist/utils/crypto.d.ts.map +1 -1
- package/dist/utils/crypto.js +7 -8
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/fs.d.ts +11 -1
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +22 -13
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/hsm.d.ts +8 -8
- package/dist/utils/hsm.d.ts.map +1 -1
- package/dist/utils/hsm.js +13 -8
- package/dist/utils/hsm.js.map +1 -1
- package/dist/utils/http.d.ts +1 -1
- package/dist/utils/http.d.ts.map +1 -1
- package/dist/utils/http.js +9 -4
- package/dist/utils/http.js.map +1 -1
- package/dist/utils/keychain.js +4 -4
- package/dist/utils/keychain.js.map +1 -1
- package/dist/utils/lock.d.ts.map +1 -1
- package/dist/utils/lock.js +2 -1
- package/dist/utils/lock.js.map +1 -1
- package/dist/utils/lockout.d.ts +2 -2
- package/dist/utils/lockout.d.ts.map +1 -1
- package/dist/utils/lockout.js +3 -3
- package/dist/utils/lockout.js.map +1 -1
- package/dist/utils/prompt.d.ts +11 -0
- package/dist/utils/prompt.d.ts.map +1 -1
- package/dist/utils/prompt.js +242 -5
- package/dist/utils/prompt.js.map +1 -1
- package/dist/utils/secure-memory.d.ts.map +1 -1
- package/dist/utils/secure-memory.js +6 -3
- package/dist/utils/secure-memory.js.map +1 -1
- package/dist/utils/session.d.ts +3 -1
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +41 -19
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/update-checker.d.ts +3 -0
- package/dist/utils/update-checker.d.ts.map +1 -1
- package/dist/utils/update-checker.js +51 -5
- package/dist/utils/update-checker.js.map +1 -1
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +5 -3
- package/dist/vault/index.js.map +1 -1
- package/dist/version.js +3 -3
- package/dist/version.js.map +1 -1
- package/package.json +2 -2
- package/scripts/sync-version.js +65 -23
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { BaseAdapter } from './base.js';
|
|
2
|
-
import {
|
|
2
|
+
import { GeminiFunctionDeclaration, GeminiFunctionCall, GeminiFunctionResponse, RateLimitConfig } from '../types.js';
|
|
3
3
|
export declare class GeminiAdapter extends BaseAdapter {
|
|
4
4
|
private server;
|
|
5
|
-
private
|
|
6
|
-
constructor(config: EnvCPConfig, projectPath: string, password?: string, vaultPath?: string, sessionPath?: string);
|
|
7
|
-
protected registerTools(): void;
|
|
5
|
+
private static readonly TOOLS_MESSAGE;
|
|
8
6
|
getGeminiFunctionDeclarations(): GeminiFunctionDeclaration[];
|
|
9
7
|
processFunctionCalls(calls: GeminiFunctionCall[]): Promise<GeminiFunctionResponse[]>;
|
|
8
|
+
createGenerateContentResponse(results: GeminiFunctionResponse[]): Record<string, unknown>;
|
|
9
|
+
createAvailableToolsResponse(): Record<string, unknown>;
|
|
10
|
+
createToolsListResponse(): Record<string, unknown>;
|
|
11
|
+
createHealthResponse(): Record<string, unknown>;
|
|
10
12
|
startServer(port: number, host: string, apiKey?: string, rateLimitConfig?: RateLimitConfig): Promise<void>;
|
|
11
13
|
stopServer(): void;
|
|
12
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAKrH,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAyF;IAE9H,6BAA6B,IAAI,yBAAyB,EAAE;IAItD,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAsB1F,6BAA6B,CAAC,OAAO,EAAE,sBAAsB,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAMzF,4BAA4B,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAOvD,uBAAuB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIlD,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IASzC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAsFhH,UAAU,IAAI,IAAI;CAMnB"}
|
package/dist/adapters/gemini.js
CHANGED
|
@@ -1,29 +1,12 @@
|
|
|
1
1
|
import { BaseAdapter } from './base.js';
|
|
2
|
-
import {
|
|
2
|
+
import { sendJson, parseBody } from '../utils/http.js';
|
|
3
3
|
import { VERSION } from '../version.js';
|
|
4
|
-
import * as http from 'http';
|
|
5
4
|
export class GeminiAdapter extends BaseAdapter {
|
|
6
5
|
server = null;
|
|
7
|
-
|
|
8
|
-
constructor(config, projectPath, password, vaultPath, sessionPath) {
|
|
9
|
-
super(config, projectPath, password, vaultPath, sessionPath);
|
|
10
|
-
}
|
|
11
|
-
registerTools() {
|
|
12
|
-
this.registerDefaultTools();
|
|
13
|
-
}
|
|
14
|
-
// Convert tools to Gemini function declaration format
|
|
6
|
+
static TOOLS_MESSAGE = 'EnvCP tools available. Use function calling to interact with environment variables.';
|
|
15
7
|
getGeminiFunctionDeclarations() {
|
|
16
|
-
return this.
|
|
17
|
-
name: tool.name,
|
|
18
|
-
description: tool.description,
|
|
19
|
-
parameters: {
|
|
20
|
-
type: 'object',
|
|
21
|
-
properties: tool.parameters.properties || {},
|
|
22
|
-
required: tool.parameters.required,
|
|
23
|
-
},
|
|
24
|
-
}));
|
|
8
|
+
return this.getStructuredToolDefinitions();
|
|
25
9
|
}
|
|
26
|
-
// Process Gemini function calls
|
|
27
10
|
async processFunctionCalls(calls) {
|
|
28
11
|
const results = [];
|
|
29
12
|
for (const call of calls) {
|
|
@@ -44,40 +27,40 @@ export class GeminiAdapter extends BaseAdapter {
|
|
|
44
27
|
}
|
|
45
28
|
return results;
|
|
46
29
|
}
|
|
30
|
+
createGenerateContentResponse(results) {
|
|
31
|
+
return {
|
|
32
|
+
candidates: [{ content: { parts: results.map(r => ({ functionResponse: r })), role: 'model' }, finishReason: 'STOP' }],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
createAvailableToolsResponse() {
|
|
36
|
+
return {
|
|
37
|
+
candidates: [{ content: { parts: [{ text: GeminiAdapter.TOOLS_MESSAGE }], role: 'model' }, finishReason: 'STOP' }],
|
|
38
|
+
availableTools: [{ functionDeclarations: this.getGeminiFunctionDeclarations() }],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
createToolsListResponse() {
|
|
42
|
+
return { tools: [{ functionDeclarations: this.getGeminiFunctionDeclarations() }] };
|
|
43
|
+
}
|
|
44
|
+
createHealthResponse() {
|
|
45
|
+
return {
|
|
46
|
+
status: 'ok',
|
|
47
|
+
version: VERSION,
|
|
48
|
+
mode: 'gemini',
|
|
49
|
+
endpoints: ['/v1/models', '/v1/tools', '/v1/functions/call', '/v1/function_calls', '/v1/models/envcp:generateContent'],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
47
52
|
async startServer(port, host, apiKey, rateLimitConfig) {
|
|
48
53
|
await this.init();
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
res.end();
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
if (rateLimitEnabled && !rateLimitMiddleware(this.rateLimiter, req, res, whitelist)) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
// API key validation
|
|
66
|
-
if (apiKey) {
|
|
67
|
-
const providedKey = (req.headers['x-goog-api-key'] || req.headers['authorization']?.replace(/^Bearer\s+/i, ''));
|
|
68
|
-
if (!validateApiKey(providedKey, apiKey)) {
|
|
69
|
-
await this.logs.log({ timestamp: new Date().toISOString(), operation: 'auth_failure', variable: '', source: 'api', success: false, message: `Invalid API key from ${req.socket.remoteAddress || 'unknown'}` });
|
|
70
|
-
sendJson(res, 401, { error: { code: 401, message: 'Invalid API key', status: 'UNAUTHENTICATED' } });
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
const parsedUrl = new URL(req.url || '/', `http://${req.headers.host ?? 'localhost'}`);
|
|
75
|
-
const pathname = parsedUrl.pathname;
|
|
76
|
-
const clientIdHeader = req.headers['x-envcp-client-id'];
|
|
77
|
-
const clientId = (Array.isArray(clientIdHeader) ? clientIdHeader[0] : clientIdHeader) || 'gemini';
|
|
78
|
-
try {
|
|
79
|
-
// Gemini-compatible endpoints
|
|
80
|
-
// GET /v1/models - List models
|
|
54
|
+
this.server = await this.createHttpServer({
|
|
55
|
+
port,
|
|
56
|
+
host,
|
|
57
|
+
apiKey,
|
|
58
|
+
rateLimitConfig,
|
|
59
|
+
defaultClientId: 'gemini',
|
|
60
|
+
authHeaderFn: (req) => (req.headers['x-goog-api-key'] || req.headers['authorization']?.replace(/^Bearer\s+/i, '')),
|
|
61
|
+
healthEndpoints: ['/v1/health', '/'],
|
|
62
|
+
mode: 'gemini',
|
|
63
|
+
onRequest: async (req, res, pathname, clientId) => {
|
|
81
64
|
if (pathname === '/v1/models' && req.method === 'GET') {
|
|
82
65
|
sendJson(res, 200, {
|
|
83
66
|
models: [{
|
|
@@ -89,16 +72,10 @@ export class GeminiAdapter extends BaseAdapter {
|
|
|
89
72
|
});
|
|
90
73
|
return;
|
|
91
74
|
}
|
|
92
|
-
// GET /v1/tools - List available tools/functions
|
|
93
75
|
if (pathname === '/v1/tools' && req.method === 'GET') {
|
|
94
|
-
sendJson(res, 200,
|
|
95
|
-
tools: [{
|
|
96
|
-
functionDeclarations: this.getGeminiFunctionDeclarations(),
|
|
97
|
-
}],
|
|
98
|
-
});
|
|
76
|
+
sendJson(res, 200, this.createToolsListResponse());
|
|
99
77
|
return;
|
|
100
78
|
}
|
|
101
|
-
// POST /v1/functions/call - Call a function directly
|
|
102
79
|
if (pathname === '/v1/functions/call' && req.method === 'POST') {
|
|
103
80
|
const body = await parseBody(req);
|
|
104
81
|
const { name, args } = body;
|
|
@@ -107,13 +84,9 @@ export class GeminiAdapter extends BaseAdapter {
|
|
|
107
84
|
return;
|
|
108
85
|
}
|
|
109
86
|
const result = await this.callTool(name, args || {}, clientId);
|
|
110
|
-
sendJson(res, 200, {
|
|
111
|
-
name,
|
|
112
|
-
response: { result },
|
|
113
|
-
});
|
|
87
|
+
sendJson(res, 200, { name, response: { result } });
|
|
114
88
|
return;
|
|
115
89
|
}
|
|
116
|
-
// POST /v1/function_calls - Process function calls (batch)
|
|
117
90
|
if (pathname === '/v1/function_calls' && req.method === 'POST') {
|
|
118
91
|
const body = await parseBody(req);
|
|
119
92
|
const { functionCalls } = body;
|
|
@@ -122,80 +95,35 @@ export class GeminiAdapter extends BaseAdapter {
|
|
|
122
95
|
return;
|
|
123
96
|
}
|
|
124
97
|
const results = await this.processFunctionCalls(functionCalls);
|
|
125
|
-
sendJson(res, 200, {
|
|
126
|
-
functionResponses: results,
|
|
127
|
-
});
|
|
98
|
+
sendJson(res, 200, { functionResponses: results });
|
|
128
99
|
return;
|
|
129
100
|
}
|
|
130
|
-
// POST /v1/models/envcp:generateContent - Gemini-style content generation
|
|
131
101
|
if ((pathname === '/v1/models/envcp:generateContent' || pathname === '/v1beta/models/envcp:generateContent') && req.method === 'POST') {
|
|
132
102
|
const body = await parseBody(req);
|
|
133
103
|
const contents = body.contents;
|
|
134
|
-
// Look for function calls in the content
|
|
135
104
|
const functionCalls = [];
|
|
136
105
|
if (contents) {
|
|
137
106
|
for (const content of contents) {
|
|
138
107
|
for (const part of content.parts || []) {
|
|
139
|
-
if (part.functionCall)
|
|
108
|
+
if (part.functionCall)
|
|
140
109
|
functionCalls.push(part.functionCall);
|
|
141
|
-
}
|
|
142
110
|
}
|
|
143
111
|
}
|
|
144
112
|
}
|
|
145
113
|
if (functionCalls.length > 0) {
|
|
146
114
|
const results = await this.processFunctionCalls(functionCalls);
|
|
147
|
-
sendJson(res, 200,
|
|
148
|
-
candidates: [{
|
|
149
|
-
content: {
|
|
150
|
-
parts: results.map(r => ({
|
|
151
|
-
functionResponse: r,
|
|
152
|
-
})),
|
|
153
|
-
role: 'model',
|
|
154
|
-
},
|
|
155
|
-
finishReason: 'STOP',
|
|
156
|
-
}],
|
|
157
|
-
});
|
|
115
|
+
sendJson(res, 200, this.createGenerateContentResponse(results));
|
|
158
116
|
return;
|
|
159
117
|
}
|
|
160
|
-
|
|
161
|
-
sendJson(res, 200, {
|
|
162
|
-
candidates: [{
|
|
163
|
-
content: {
|
|
164
|
-
parts: [{
|
|
165
|
-
text: 'EnvCP tools available. Use function calling to interact with environment variables.',
|
|
166
|
-
}],
|
|
167
|
-
role: 'model',
|
|
168
|
-
},
|
|
169
|
-
finishReason: 'STOP',
|
|
170
|
-
}],
|
|
171
|
-
availableTools: [{
|
|
172
|
-
functionDeclarations: this.getGeminiFunctionDeclarations(),
|
|
173
|
-
}],
|
|
174
|
-
});
|
|
118
|
+
sendJson(res, 200, this.createAvailableToolsResponse());
|
|
175
119
|
return;
|
|
176
120
|
}
|
|
177
|
-
// Health check
|
|
178
121
|
if (pathname === '/v1/health' || pathname === '/') {
|
|
179
|
-
sendJson(res, 200,
|
|
180
|
-
status: 'ok',
|
|
181
|
-
version: VERSION,
|
|
182
|
-
mode: 'gemini',
|
|
183
|
-
endpoints: ['/v1/models', '/v1/tools', '/v1/functions/call', '/v1/function_calls', '/v1/models/envcp:generateContent'],
|
|
184
|
-
});
|
|
122
|
+
sendJson(res, 200, this.createHealthResponse());
|
|
185
123
|
return;
|
|
186
124
|
}
|
|
187
|
-
// 404
|
|
188
125
|
sendJson(res, 404, { error: { code: 404, message: 'Not found', status: 'NOT_FOUND' } });
|
|
189
|
-
}
|
|
190
|
-
catch (error) {
|
|
191
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
192
|
-
sendJson(res, 500, { error: { code: 500, message, status: 'INTERNAL' } });
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
return new Promise((resolve) => {
|
|
196
|
-
this.server.listen(port, host, () => {
|
|
197
|
-
resolve();
|
|
198
|
-
});
|
|
126
|
+
},
|
|
199
127
|
});
|
|
200
128
|
}
|
|
201
129
|
stopServer() {
|
|
@@ -203,7 +131,6 @@ export class GeminiAdapter extends BaseAdapter {
|
|
|
203
131
|
this.server.close();
|
|
204
132
|
this.server = null;
|
|
205
133
|
}
|
|
206
|
-
this.rateLimiter?.destroy();
|
|
207
134
|
}
|
|
208
135
|
}
|
|
209
136
|
//# sourceMappingURL=gemini.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAGxC,MAAM,OAAO,aAAc,SAAQ,WAAW;IACpC,MAAM,GAAuB,IAAI,CAAC;IAClC,MAAM,CAAU,aAAa,GAAG,qFAAqF,CAAC;IAE9H,6BAA6B;QAC3B,OAAO,IAAI,CAAC,4BAA4B,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,KAA2B;QACpD,MAAM,OAAO,GAA6B,EAAE,CAAC;QAE7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,EAAE,MAAM,EAAE;iBACrB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;iBAC7B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,6BAA6B,CAAC,OAAiC;QAC7D,OAAO;YACL,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;SACvH,CAAC;IACJ,CAAC;IAED,4BAA4B;QAC1B,OAAO;YACL,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;YAClH,cAAc,EAAE,CAAC,EAAE,oBAAoB,EAAE,IAAI,CAAC,6BAA6B,EAAE,EAAE,CAAC;SACjF,CAAC;IACJ,CAAC;IAED,uBAAuB;QACrB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,oBAAoB,EAAE,IAAI,CAAC,6BAA6B,EAAE,EAAE,CAAC,EAAE,CAAC;IACrF,CAAC;IAED,oBAAoB;QAClB,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,kCAAkC,CAAC;SACvH,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,IAAY,EAAE,MAAe,EAAE,eAAiC;QAC9F,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAElB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC;YACxC,IAAI;YACJ,IAAI;YACJ,MAAM;YACN,eAAe;YACf,eAAe,EAAE,QAAQ;YACzB,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAuB;YACxI,eAAe,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC;YACpC,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;gBAChD,IAAI,QAAQ,KAAK,YAAY,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;oBACtD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE;wBACjB,MAAM,EAAE,CAAC;gCACP,IAAI,EAAE,gBAAgB,OAAO,EAAE;gCAC/B,WAAW,EAAE,mBAAmB;gCAChC,WAAW,EAAE,uCAAuC;gCACpD,0BAA0B,EAAE,CAAC,iBAAiB,CAAC;6BAChD,CAAC;qBACH,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,IAAI,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;oBACrD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC;oBACnD,OAAO;gBACT,CAAC;gBAED,IAAI,QAAQ,KAAK,oBAAoB,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC/D,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;oBAClC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAuD,CAAC;oBAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;wBAC5G,OAAO;oBACT,CAAC;oBACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;oBAC/D,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;oBACnD,OAAO;gBACT,CAAC;gBAED,IAAI,QAAQ,KAAK,oBAAoB,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC/D,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;oBAClC,MAAM,EAAE,aAAa,EAAE,GAAG,IAA+C,CAAC;oBAC1E,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;wBACpD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,8BAA8B,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;wBAClH,OAAO;oBACT,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;oBAC/D,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;oBACnD,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,QAAQ,KAAK,kCAAkC,IAAI,QAAQ,KAAK,sCAAsC,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtI,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;oBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAsF,CAAC;oBAC7G,MAAM,aAAa,GAAyB,EAAE,CAAC;oBAC/C,IAAI,QAAQ,EAAE,CAAC;wBACb,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;4BAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;gCACvC,IAAI,IAAI,CAAC,YAAY;oCAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;4BAC/D,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;wBAC/D,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC,CAAC;wBAChE,OAAO;oBACT,CAAC;oBAED,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,4BAA4B,EAAE,CAAC,CAAC;oBACxD,OAAO;gBACT,CAAC;gBAED,IAAI,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;oBAClD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC;oBAChD,OAAO;gBACT,CAAC;gBAED,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAC1F,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { BaseAdapter } from './base.js';
|
|
2
|
-
import {
|
|
2
|
+
import { OpenAIFunction, OpenAIToolCall, OpenAIMessage, RateLimitConfig } from '../types.js';
|
|
3
3
|
export declare class OpenAIAdapter extends BaseAdapter {
|
|
4
4
|
private server;
|
|
5
|
-
private
|
|
6
|
-
constructor(config: EnvCPConfig, projectPath: string, password?: string, vaultPath?: string, sessionPath?: string);
|
|
7
|
-
protected registerTools(): void;
|
|
5
|
+
private static readonly TOOLS_MESSAGE;
|
|
8
6
|
getOpenAIFunctions(): OpenAIFunction[];
|
|
9
7
|
processToolCalls(toolCalls: OpenAIToolCall[]): Promise<OpenAIMessage[]>;
|
|
8
|
+
createToolResultsCompletion(results: OpenAIMessage[]): Record<string, unknown>;
|
|
9
|
+
createAvailableToolsCompletion(): Record<string, unknown>;
|
|
10
|
+
createFunctionsListResponse(): Record<string, unknown>;
|
|
11
|
+
createHealthResponse(): Record<string, unknown>;
|
|
10
12
|
startServer(port: number, host: string, apiKey?: string, rateLimitConfig?: RateLimitConfig): Promise<void>;
|
|
11
13
|
stopServer(): void;
|
|
12
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAK7F,qBAAa,aAAc,SAAQ,WAAW;IAC5C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAyF;IAE9H,kBAAkB,IAAI,cAAc,EAAE;IAIhC,gBAAgB,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAyB7E,2BAA2B,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAW9E,8BAA8B,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAWzD,2BAA2B,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAItD,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IASzC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAiFhH,UAAU,IAAI,IAAI;CAMnB"}
|
package/dist/adapters/openai.js
CHANGED
|
@@ -1,29 +1,12 @@
|
|
|
1
1
|
import { BaseAdapter } from './base.js';
|
|
2
|
-
import {
|
|
2
|
+
import { sendJson, parseBody } from '../utils/http.js';
|
|
3
3
|
import { VERSION } from '../version.js';
|
|
4
|
-
import * as http from 'http';
|
|
5
4
|
export class OpenAIAdapter extends BaseAdapter {
|
|
6
5
|
server = null;
|
|
7
|
-
|
|
8
|
-
constructor(config, projectPath, password, vaultPath, sessionPath) {
|
|
9
|
-
super(config, projectPath, password, vaultPath, sessionPath);
|
|
10
|
-
}
|
|
11
|
-
registerTools() {
|
|
12
|
-
this.registerDefaultTools();
|
|
13
|
-
}
|
|
14
|
-
// Convert tools to OpenAI function format
|
|
6
|
+
static TOOLS_MESSAGE = 'EnvCP tools available. Use function calling to interact with environment variables.';
|
|
15
7
|
getOpenAIFunctions() {
|
|
16
|
-
return this.
|
|
17
|
-
name: tool.name,
|
|
18
|
-
description: tool.description,
|
|
19
|
-
parameters: {
|
|
20
|
-
type: 'object',
|
|
21
|
-
properties: tool.parameters.properties || {},
|
|
22
|
-
required: tool.parameters.required,
|
|
23
|
-
},
|
|
24
|
-
}));
|
|
8
|
+
return this.getStructuredToolDefinitions();
|
|
25
9
|
}
|
|
26
|
-
// Process OpenAI tool calls
|
|
27
10
|
async processToolCalls(toolCalls) {
|
|
28
11
|
const results = [];
|
|
29
12
|
for (const call of toolCalls) {
|
|
@@ -47,61 +30,62 @@ export class OpenAIAdapter extends BaseAdapter {
|
|
|
47
30
|
}
|
|
48
31
|
return results;
|
|
49
32
|
}
|
|
33
|
+
createToolResultsCompletion(results) {
|
|
34
|
+
return {
|
|
35
|
+
id: `chatcmpl-${Date.now()}`,
|
|
36
|
+
object: 'chat.completion',
|
|
37
|
+
created: Math.floor(Date.now() / 1000),
|
|
38
|
+
model: `envcp-${VERSION}`,
|
|
39
|
+
choices: [{ index: 0, message: { role: 'assistant', content: null, tool_calls: null }, finish_reason: 'tool_calls' }],
|
|
40
|
+
tool_results: results,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
createAvailableToolsCompletion() {
|
|
44
|
+
return {
|
|
45
|
+
id: `chatcmpl-${Date.now()}`,
|
|
46
|
+
object: 'chat.completion',
|
|
47
|
+
created: Math.floor(Date.now() / 1000),
|
|
48
|
+
model: `envcp-${VERSION}`,
|
|
49
|
+
choices: [{ index: 0, message: { role: 'assistant', content: OpenAIAdapter.TOOLS_MESSAGE }, finish_reason: 'stop' }],
|
|
50
|
+
available_tools: this.getOpenAIFunctions().map(f => ({ type: 'function', function: f })),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
createFunctionsListResponse() {
|
|
54
|
+
return { object: 'list', data: this.getOpenAIFunctions() };
|
|
55
|
+
}
|
|
56
|
+
createHealthResponse() {
|
|
57
|
+
return {
|
|
58
|
+
status: 'ok',
|
|
59
|
+
version: VERSION,
|
|
60
|
+
mode: 'openai',
|
|
61
|
+
endpoints: ['/v1/models', '/v1/functions', '/v1/functions/call', '/v1/tool_calls', '/v1/chat/completions'],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
50
64
|
async startServer(port, host, apiKey, rateLimitConfig) {
|
|
51
65
|
await this.init();
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
if (rateLimitEnabled && !rateLimitMiddleware(this.rateLimiter, req, res, whitelist)) {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
// API key validation
|
|
69
|
-
if (apiKey) {
|
|
70
|
-
const providedKey = req.headers['authorization']?.replace(/^Bearer\s+/i, '');
|
|
71
|
-
if (!validateApiKey(providedKey, apiKey)) {
|
|
72
|
-
await this.logs.log({ timestamp: new Date().toISOString(), operation: 'auth_failure', variable: '', source: 'api', success: false, message: `Invalid API key from ${req.socket.remoteAddress || 'unknown'}` });
|
|
73
|
-
sendJson(res, 401, { error: { message: 'Invalid API key', type: 'invalid_api_key' } });
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
const parsedUrl = new URL(req.url || '/', `http://${req.headers.host ?? 'localhost'}`);
|
|
78
|
-
const pathname = parsedUrl.pathname;
|
|
79
|
-
const clientIdHeader = req.headers['x-envcp-client-id'];
|
|
80
|
-
const clientId = (Array.isArray(clientIdHeader) ? clientIdHeader[0] : clientIdHeader) || 'openai';
|
|
81
|
-
try {
|
|
82
|
-
// OpenAI-compatible endpoints
|
|
83
|
-
// GET /v1/models - List models (for compatibility)
|
|
66
|
+
this.server = await this.createHttpServer({
|
|
67
|
+
port,
|
|
68
|
+
host,
|
|
69
|
+
apiKey,
|
|
70
|
+
rateLimitConfig,
|
|
71
|
+
defaultClientId: 'openai',
|
|
72
|
+
authHeaderFn: (req) => req.headers['authorization']?.replace(/^Bearer\s+/i, ''),
|
|
73
|
+
authFailureResponse: (message) => ({ error: { message, type: 'invalid_api_key' } }),
|
|
74
|
+
internalErrorResponse: (message) => ({ error: { message, type: 'internal_error' } }),
|
|
75
|
+
healthEndpoints: ['/v1/health', '/'],
|
|
76
|
+
mode: 'openai',
|
|
77
|
+
onRequest: async (req, res, pathname, clientId) => {
|
|
84
78
|
if (pathname === '/v1/models' && req.method === 'GET') {
|
|
85
79
|
sendJson(res, 200, {
|
|
86
80
|
object: 'list',
|
|
87
|
-
data: [{
|
|
88
|
-
id: `envcp-${VERSION}`,
|
|
89
|
-
object: 'model',
|
|
90
|
-
created: Date.now(),
|
|
91
|
-
owned_by: 'envcp',
|
|
92
|
-
}],
|
|
81
|
+
data: [{ id: `envcp-${VERSION}`, object: 'model', created: Date.now(), owned_by: 'envcp' }],
|
|
93
82
|
});
|
|
94
83
|
return;
|
|
95
84
|
}
|
|
96
|
-
// GET /v1/functions - List available functions
|
|
97
85
|
if (pathname === '/v1/functions' && req.method === 'GET') {
|
|
98
|
-
sendJson(res, 200,
|
|
99
|
-
object: 'list',
|
|
100
|
-
data: this.getOpenAIFunctions(),
|
|
101
|
-
});
|
|
86
|
+
sendJson(res, 200, this.createFunctionsListResponse());
|
|
102
87
|
return;
|
|
103
88
|
}
|
|
104
|
-
// POST /v1/functions/call - Call a function directly
|
|
105
89
|
if (pathname === '/v1/functions/call' && req.method === 'POST') {
|
|
106
90
|
const body = await parseBody(req);
|
|
107
91
|
const { name, arguments: args } = body;
|
|
@@ -110,14 +94,9 @@ export class OpenAIAdapter extends BaseAdapter {
|
|
|
110
94
|
return;
|
|
111
95
|
}
|
|
112
96
|
const result = await this.callTool(name, args || {}, clientId);
|
|
113
|
-
sendJson(res, 200, {
|
|
114
|
-
object: 'function_result',
|
|
115
|
-
name,
|
|
116
|
-
result,
|
|
117
|
-
});
|
|
97
|
+
sendJson(res, 200, { object: 'function_result', name, result });
|
|
118
98
|
return;
|
|
119
99
|
}
|
|
120
|
-
// POST /v1/tool_calls - Process tool calls (batch)
|
|
121
100
|
if (pathname === '/v1/tool_calls' && req.method === 'POST') {
|
|
122
101
|
const body = await parseBody(req);
|
|
123
102
|
const { tool_calls } = body;
|
|
@@ -126,14 +105,9 @@ export class OpenAIAdapter extends BaseAdapter {
|
|
|
126
105
|
return;
|
|
127
106
|
}
|
|
128
107
|
const results = await this.processToolCalls(tool_calls);
|
|
129
|
-
sendJson(res, 200, {
|
|
130
|
-
object: 'list',
|
|
131
|
-
data: results,
|
|
132
|
-
});
|
|
108
|
+
sendJson(res, 200, { object: 'list', data: results });
|
|
133
109
|
return;
|
|
134
110
|
}
|
|
135
|
-
// POST /v1/chat/completions - For integration with proxies
|
|
136
|
-
// This allows tools to be called through a chat completion-like interface
|
|
137
111
|
if (pathname === '/v1/chat/completions' && req.method === 'POST') {
|
|
138
112
|
const body = await parseBody(req);
|
|
139
113
|
const messages = body.messages;
|
|
@@ -141,71 +115,21 @@ export class OpenAIAdapter extends BaseAdapter {
|
|
|
141
115
|
sendJson(res, 400, { error: { message: 'messages array required', type: 'invalid_request_error' } });
|
|
142
116
|
return;
|
|
143
117
|
}
|
|
144
|
-
// Check if last message has tool_calls to process
|
|
145
118
|
const lastMessage = messages[messages.length - 1];
|
|
146
119
|
if (lastMessage?.tool_calls) {
|
|
147
120
|
const results = await this.processToolCalls(lastMessage.tool_calls);
|
|
148
|
-
sendJson(res, 200,
|
|
149
|
-
id: `chatcmpl-${Date.now()}`,
|
|
150
|
-
object: 'chat.completion',
|
|
151
|
-
created: Math.floor(Date.now() / 1000),
|
|
152
|
-
model: `envcp-${VERSION}`,
|
|
153
|
-
choices: [{
|
|
154
|
-
index: 0,
|
|
155
|
-
message: {
|
|
156
|
-
role: 'assistant',
|
|
157
|
-
content: null,
|
|
158
|
-
tool_calls: null,
|
|
159
|
-
},
|
|
160
|
-
finish_reason: 'tool_calls',
|
|
161
|
-
}],
|
|
162
|
-
tool_results: results,
|
|
163
|
-
});
|
|
121
|
+
sendJson(res, 200, this.createToolResultsCompletion(results));
|
|
164
122
|
return;
|
|
165
123
|
}
|
|
166
|
-
|
|
167
|
-
sendJson(res, 200, {
|
|
168
|
-
id: `chatcmpl-${Date.now()}`,
|
|
169
|
-
object: 'chat.completion',
|
|
170
|
-
created: Math.floor(Date.now() / 1000),
|
|
171
|
-
model: `envcp-${VERSION}`,
|
|
172
|
-
choices: [{
|
|
173
|
-
index: 0,
|
|
174
|
-
message: {
|
|
175
|
-
role: 'assistant',
|
|
176
|
-
content: 'EnvCP tools available. Use function calling to interact with environment variables.',
|
|
177
|
-
},
|
|
178
|
-
finish_reason: 'stop',
|
|
179
|
-
}],
|
|
180
|
-
available_tools: this.getOpenAIFunctions().map(f => ({
|
|
181
|
-
type: 'function',
|
|
182
|
-
function: f,
|
|
183
|
-
})),
|
|
184
|
-
});
|
|
124
|
+
sendJson(res, 200, this.createAvailableToolsCompletion());
|
|
185
125
|
return;
|
|
186
126
|
}
|
|
187
|
-
// Health check
|
|
188
127
|
if (pathname === '/v1/health' || pathname === '/') {
|
|
189
|
-
sendJson(res, 200,
|
|
190
|
-
status: 'ok',
|
|
191
|
-
version: VERSION,
|
|
192
|
-
mode: 'openai',
|
|
193
|
-
endpoints: ['/v1/models', '/v1/functions', '/v1/functions/call', '/v1/tool_calls', '/v1/chat/completions'],
|
|
194
|
-
});
|
|
128
|
+
sendJson(res, 200, this.createHealthResponse());
|
|
195
129
|
return;
|
|
196
130
|
}
|
|
197
|
-
// 404
|
|
198
131
|
sendJson(res, 404, { error: { message: 'Not found', type: 'not_found' } });
|
|
199
|
-
}
|
|
200
|
-
catch (error) {
|
|
201
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
202
|
-
sendJson(res, 500, { error: { message, type: 'internal_error' } });
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
return new Promise((resolve) => {
|
|
206
|
-
this.server.listen(port, host, () => {
|
|
207
|
-
resolve();
|
|
208
|
-
});
|
|
132
|
+
},
|
|
209
133
|
});
|
|
210
134
|
}
|
|
211
135
|
stopServer() {
|
|
@@ -213,7 +137,6 @@ export class OpenAIAdapter extends BaseAdapter {
|
|
|
213
137
|
this.server.close();
|
|
214
138
|
this.server = null;
|
|
215
139
|
}
|
|
216
|
-
this.rateLimiter?.destroy();
|
|
217
140
|
}
|
|
218
141
|
}
|
|
219
142
|
//# sourceMappingURL=openai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/rest.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare class RESTAdapter extends BaseAdapter {
|
|
|
5
5
|
private rateLimiter;
|
|
6
6
|
private lockoutManager?;
|
|
7
7
|
constructor(config: EnvCPConfig, projectPath: string, password?: string, vaultPath?: string, sessionPath?: string);
|
|
8
|
+
private scheduleApiKeyLockoutClear;
|
|
8
9
|
private clearApiKeyLockout;
|
|
9
10
|
protected registerTools(): void;
|
|
10
11
|
private createResponse;
|