@puukis/core 0.1.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/LICENSE +21 -0
- package/dist/brain/Brain.d.ts +39 -0
- package/dist/brain/Brain.d.ts.map +1 -0
- package/dist/brain/Brain.js +284 -0
- package/dist/brain/Brain.js.map +1 -0
- package/dist/brain/index.d.ts +2 -0
- package/dist/brain/index.d.ts.map +1 -0
- package/dist/brain/index.js +2 -0
- package/dist/brain/index.js.map +1 -0
- package/dist/cli/argv.d.ts +8 -0
- package/dist/cli/argv.d.ts.map +1 -0
- package/dist/cli/argv.js +41 -0
- package/dist/cli/argv.js.map +1 -0
- package/dist/cli/codexInstall.d.ts +17 -0
- package/dist/cli/codexInstall.d.ts.map +1 -0
- package/dist/cli/codexInstall.js +106 -0
- package/dist/cli/codexInstall.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +3 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +66 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/install.d.ts +3 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +21 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/onboard.d.ts +3 -0
- package/dist/cli/commands/onboard.d.ts.map +1 -0
- package/dist/cli/commands/onboard.js +43 -0
- package/dist/cli/commands/onboard.js.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +3 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.js +193 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/commands/update.d.ts +3 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +314 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +60 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/codex/CodexRpcClient.d.ts +65 -0
- package/dist/codex/CodexRpcClient.d.ts.map +1 -0
- package/dist/codex/CodexRpcClient.js +395 -0
- package/dist/codex/CodexRpcClient.js.map +1 -0
- package/dist/codex/codexModels.d.ts +33 -0
- package/dist/codex/codexModels.d.ts.map +1 -0
- package/dist/codex/codexModels.js +226 -0
- package/dist/codex/codexModels.js.map +1 -0
- package/dist/codex/index.d.ts +5 -0
- package/dist/codex/index.d.ts.map +1 -0
- package/dist/codex/index.js +3 -0
- package/dist/codex/index.js.map +1 -0
- package/dist/codex/types.d.ts +97 -0
- package/dist/codex/types.d.ts.map +1 -0
- package/dist/codex/types.js +2 -0
- package/dist/codex/types.js.map +1 -0
- package/dist/config/env.d.ts +8 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +130 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/db/index.d.ts +48 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +147 -0
- package/dist/db/index.js.map +1 -0
- package/dist/gateway/Gateway.d.ts +69 -0
- package/dist/gateway/Gateway.d.ts.map +1 -0
- package/dist/gateway/Gateway.js +239 -0
- package/dist/gateway/Gateway.js.map +1 -0
- package/dist/gateway/LaneQueue.d.ts +24 -0
- package/dist/gateway/LaneQueue.d.ts.map +1 -0
- package/dist/gateway/LaneQueue.js +59 -0
- package/dist/gateway/LaneQueue.js.map +1 -0
- package/dist/gateway/index.d.ts +3 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +3 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/GeminiProvider.d.ts +16 -0
- package/dist/llm/GeminiProvider.d.ts.map +1 -0
- package/dist/llm/GeminiProvider.js +172 -0
- package/dist/llm/GeminiProvider.js.map +1 -0
- package/dist/llm/OllamaProvider.d.ts +15 -0
- package/dist/llm/OllamaProvider.d.ts.map +1 -0
- package/dist/llm/OllamaProvider.js +108 -0
- package/dist/llm/OllamaProvider.js.map +1 -0
- package/dist/llm/OpenAICodexProvider.d.ts +51 -0
- package/dist/llm/OpenAICodexProvider.d.ts.map +1 -0
- package/dist/llm/OpenAICodexProvider.js +620 -0
- package/dist/llm/OpenAICodexProvider.js.map +1 -0
- package/dist/llm/OpenAIProvider.d.ts +16 -0
- package/dist/llm/OpenAIProvider.d.ts.map +1 -0
- package/dist/llm/OpenAIProvider.js +134 -0
- package/dist/llm/OpenAIProvider.js.map +1 -0
- package/dist/llm/index.d.ts +10 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +30 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/main.d.ts +7 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +88 -0
- package/dist/main.js.map +1 -0
- package/dist/pipeline/index.d.ts +2 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +2 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/normalize.d.ts +19 -0
- package/dist/pipeline/normalize.d.ts.map +1 -0
- package/dist/pipeline/normalize.js +34 -0
- package/dist/pipeline/normalize.js.map +1 -0
- package/dist/server/index.d.ts +28 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +389 -0
- package/dist/server/index.js.map +1 -0
- package/dist/tools/ToolExecutor.d.ts +68 -0
- package/dist/tools/ToolExecutor.d.ts.map +1 -0
- package/dist/tools/ToolExecutor.js +177 -0
- package/dist/tools/ToolExecutor.js.map +1 -0
- package/dist/tools/builtin/browser.d.ts +27 -0
- package/dist/tools/builtin/browser.d.ts.map +1 -0
- package/dist/tools/builtin/browser.js +222 -0
- package/dist/tools/builtin/browser.js.map +1 -0
- package/dist/tools/builtin/filesystem.d.ts +22 -0
- package/dist/tools/builtin/filesystem.d.ts.map +1 -0
- package/dist/tools/builtin/filesystem.js +151 -0
- package/dist/tools/builtin/filesystem.js.map +1 -0
- package/dist/tools/builtin/index.d.ts +10 -0
- package/dist/tools/builtin/index.d.ts.map +1 -0
- package/dist/tools/builtin/index.js +21 -0
- package/dist/tools/builtin/index.js.map +1 -0
- package/dist/tools/builtin/sandbox.d.ts +11 -0
- package/dist/tools/builtin/sandbox.d.ts.map +1 -0
- package/dist/tools/builtin/sandbox.js +166 -0
- package/dist/tools/builtin/sandbox.js.map +1 -0
- package/dist/tools/builtin/search.d.ts +7 -0
- package/dist/tools/builtin/search.d.ts.map +1 -0
- package/dist/tools/builtin/search.js +76 -0
- package/dist/tools/builtin/search.js.map +1 -0
- package/dist/tools/builtin/shell.d.ts +7 -0
- package/dist/tools/builtin/shell.d.ts.map +1 -0
- package/dist/tools/builtin/shell.js +71 -0
- package/dist/tools/builtin/shell.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +167 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace/agentWorkspace.d.ts +24 -0
- package/dist/workspace/agentWorkspace.d.ts.map +1 -0
- package/dist/workspace/agentWorkspace.js +210 -0
- package/dist/workspace/agentWorkspace.js.map +1 -0
- package/package.json +45 -0
package/dist/db/index.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
/**
|
|
6
|
+
* SQLite Database for Keygate persistence
|
|
7
|
+
*/
|
|
8
|
+
export class KeygateDatabase {
|
|
9
|
+
db;
|
|
10
|
+
constructor(dbPath) {
|
|
11
|
+
const defaultPath = path.join(os.homedir(), '.config', 'keygate', 'keygate.db');
|
|
12
|
+
const targetPath = dbPath ?? defaultPath;
|
|
13
|
+
// Ensure directory exists
|
|
14
|
+
fs.mkdirSync(path.dirname(targetPath), { recursive: true });
|
|
15
|
+
this.db = new Database(targetPath);
|
|
16
|
+
this.initialize();
|
|
17
|
+
}
|
|
18
|
+
initialize() {
|
|
19
|
+
this.db.exec(`
|
|
20
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
21
|
+
id TEXT PRIMARY KEY,
|
|
22
|
+
channel_type TEXT NOT NULL,
|
|
23
|
+
created_at TEXT NOT NULL,
|
|
24
|
+
updated_at TEXT NOT NULL
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
28
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
29
|
+
session_id TEXT NOT NULL,
|
|
30
|
+
role TEXT NOT NULL,
|
|
31
|
+
content TEXT NOT NULL,
|
|
32
|
+
tool_call_id TEXT,
|
|
33
|
+
tool_calls TEXT,
|
|
34
|
+
created_at TEXT NOT NULL,
|
|
35
|
+
FOREIGN KEY (session_id) REFERENCES sessions(id)
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
CREATE TABLE IF NOT EXISTS tool_logs (
|
|
39
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
40
|
+
session_id TEXT NOT NULL,
|
|
41
|
+
tool_name TEXT NOT NULL,
|
|
42
|
+
arguments TEXT NOT NULL,
|
|
43
|
+
result TEXT NOT NULL,
|
|
44
|
+
success INTEGER NOT NULL,
|
|
45
|
+
security_mode TEXT NOT NULL,
|
|
46
|
+
created_at TEXT NOT NULL
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_tool_logs_session ON tool_logs(session_id);
|
|
51
|
+
`);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Save a session to the database
|
|
55
|
+
*/
|
|
56
|
+
saveSession(session) {
|
|
57
|
+
const stmt = this.db.prepare(`
|
|
58
|
+
INSERT OR REPLACE INTO sessions (id, channel_type, created_at, updated_at)
|
|
59
|
+
VALUES (?, ?, ?, ?)
|
|
60
|
+
`);
|
|
61
|
+
stmt.run(session.id, session.channelType, session.createdAt.toISOString(), session.updatedAt.toISOString());
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get a session by ID
|
|
65
|
+
*/
|
|
66
|
+
getSession(sessionId) {
|
|
67
|
+
const stmt = this.db.prepare('SELECT * FROM sessions WHERE id = ?');
|
|
68
|
+
const row = stmt.get(sessionId);
|
|
69
|
+
if (!row)
|
|
70
|
+
return null;
|
|
71
|
+
const messages = this.getMessages(sessionId);
|
|
72
|
+
return {
|
|
73
|
+
id: row.id,
|
|
74
|
+
channelType: row.channel_type,
|
|
75
|
+
messages,
|
|
76
|
+
createdAt: new Date(row.created_at),
|
|
77
|
+
updatedAt: new Date(row.updated_at),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Save a message to the database
|
|
82
|
+
*/
|
|
83
|
+
saveMessage(sessionId, message) {
|
|
84
|
+
const stmt = this.db.prepare(`
|
|
85
|
+
INSERT INTO messages (session_id, role, content, tool_call_id, tool_calls, created_at)
|
|
86
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
87
|
+
`);
|
|
88
|
+
stmt.run(sessionId, message.role, message.content, message.toolCallId ?? null, message.toolCalls ? JSON.stringify(message.toolCalls) : null, new Date().toISOString());
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get all messages for a session
|
|
92
|
+
*/
|
|
93
|
+
getMessages(sessionId) {
|
|
94
|
+
const stmt = this.db.prepare('SELECT * FROM messages WHERE session_id = ? ORDER BY id ASC');
|
|
95
|
+
const rows = stmt.all(sessionId);
|
|
96
|
+
return rows.map(row => ({
|
|
97
|
+
role: row.role,
|
|
98
|
+
content: row.content,
|
|
99
|
+
toolCallId: row.tool_call_id ?? undefined,
|
|
100
|
+
toolCalls: row.tool_calls ? JSON.parse(row.tool_calls) : undefined,
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Log a tool execution
|
|
105
|
+
*/
|
|
106
|
+
logToolExecution(sessionId, toolName, args, result, securityMode) {
|
|
107
|
+
const stmt = this.db.prepare(`
|
|
108
|
+
INSERT INTO tool_logs (session_id, tool_name, arguments, result, success, security_mode, created_at)
|
|
109
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
110
|
+
`);
|
|
111
|
+
stmt.run(sessionId, toolName, JSON.stringify(args), JSON.stringify(result), result.success ? 1 : 0, securityMode, new Date().toISOString());
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get recent tool logs
|
|
115
|
+
*/
|
|
116
|
+
getRecentToolLogs(limit = 50) {
|
|
117
|
+
const stmt = this.db.prepare(`
|
|
118
|
+
SELECT session_id, tool_name, success, created_at
|
|
119
|
+
FROM tool_logs
|
|
120
|
+
ORDER BY id DESC
|
|
121
|
+
LIMIT ?
|
|
122
|
+
`);
|
|
123
|
+
const rows = stmt.all(limit);
|
|
124
|
+
return rows.map(row => ({
|
|
125
|
+
sessionId: row.session_id,
|
|
126
|
+
toolName: row.tool_name,
|
|
127
|
+
success: row.success === 1,
|
|
128
|
+
createdAt: new Date(row.created_at),
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Clear all messages for a session
|
|
133
|
+
*/
|
|
134
|
+
clearSession(sessionId) {
|
|
135
|
+
const stmt = this.db.prepare('DELETE FROM messages WHERE session_id = ?');
|
|
136
|
+
stmt.run(sessionId);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Close the database connection
|
|
140
|
+
*/
|
|
141
|
+
close() {
|
|
142
|
+
this.db.close();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Re-export as Database for simpler imports
|
|
146
|
+
export { KeygateDatabase as Database };
|
|
147
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
import type { CodexReasoningEffort, KeygateConfig, KeygateEvents, NormalizedMessage, ProviderModelOption, SecurityMode, Session } from '../types.js';
|
|
3
|
+
import { Brain } from '../brain/Brain.js';
|
|
4
|
+
import { ToolExecutor } from '../tools/ToolExecutor.js';
|
|
5
|
+
import { Database } from '../db/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Gateway - The central hub of Keygate
|
|
8
|
+
*
|
|
9
|
+
* Singleton managing:
|
|
10
|
+
* - Session state
|
|
11
|
+
* - Lane queues for serial per-session processing
|
|
12
|
+
* - Security mode switching
|
|
13
|
+
* - Event emission for UI updates
|
|
14
|
+
*/
|
|
15
|
+
export declare class Gateway extends EventEmitter<KeygateEvents> {
|
|
16
|
+
private static instance;
|
|
17
|
+
private sessions;
|
|
18
|
+
private laneQueues;
|
|
19
|
+
private securityMode;
|
|
20
|
+
readonly brain: Brain;
|
|
21
|
+
readonly toolExecutor: ToolExecutor;
|
|
22
|
+
readonly db: Database;
|
|
23
|
+
readonly config: KeygateConfig;
|
|
24
|
+
private constructor();
|
|
25
|
+
/**
|
|
26
|
+
* Get or create the Gateway singleton
|
|
27
|
+
*/
|
|
28
|
+
static getInstance(config?: KeygateConfig): Gateway;
|
|
29
|
+
/**
|
|
30
|
+
* Reset the singleton (for testing)
|
|
31
|
+
*/
|
|
32
|
+
static reset(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Process an incoming message from any channel
|
|
35
|
+
*/
|
|
36
|
+
processMessage(message: NormalizedMessage): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Get or create a lane queue for a session
|
|
39
|
+
*/
|
|
40
|
+
private getOrCreateQueue;
|
|
41
|
+
/**
|
|
42
|
+
* Get or create a session
|
|
43
|
+
*/
|
|
44
|
+
private getOrCreateSession;
|
|
45
|
+
/**
|
|
46
|
+
* Get a session by ID
|
|
47
|
+
*/
|
|
48
|
+
getSession(sessionId: string): Session | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Get current security mode
|
|
51
|
+
*/
|
|
52
|
+
getSecurityMode(): SecurityMode;
|
|
53
|
+
getLLMState(): {
|
|
54
|
+
provider: KeygateConfig['llm']['provider'];
|
|
55
|
+
model: string;
|
|
56
|
+
reasoningEffort?: CodexReasoningEffort;
|
|
57
|
+
};
|
|
58
|
+
listAvailableModels(provider?: KeygateConfig['llm']['provider']): Promise<ProviderModelOption[]>;
|
|
59
|
+
setLLMSelection(provider: KeygateConfig['llm']['provider'], model: string, reasoningEffort?: CodexReasoningEffort): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Set security mode (requires spicy mode to be enabled in config)
|
|
62
|
+
*/
|
|
63
|
+
setSecurityMode(mode: SecurityMode): void;
|
|
64
|
+
/**
|
|
65
|
+
* Clear a session's message history
|
|
66
|
+
*/
|
|
67
|
+
clearSession(sessionId: string): void;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=Gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Gateway.d.ts","sourceRoot":"","sources":["../../src/gateway/Gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,OAAO,EACR,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C;;;;;;;;GAQG;AACH,qBAAa,OAAQ,SAAQ,YAAY,CAAC,aAAa,CAAC;IACtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwB;IAE/C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,YAAY,CAAwB;IAE5C,SAAgB,KAAK,EAAE,KAAK,CAAC;IAC7B,SAAgB,YAAY,EAAE,YAAY,CAAC;IAC3C,SAAgB,EAAE,EAAE,QAAQ,CAAC;IAC7B,SAAgB,MAAM,EAAE,aAAa,CAAC;IAEtC,OAAO;IAoBP;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO;IAUnD;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwE/D;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIlD;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B,WAAW,IAAI;QACb,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;QAC3C,KAAK,EAAE,MAAM,CAAC;QACd,eAAe,CAAC,EAAE,oBAAoB,CAAC;KACxC;IAQK,mBAAmB,CACvB,QAAQ,GAAE,aAAa,CAAC,KAAK,CAAC,CAAC,UAAU,CAA4B,GACpE,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAkC3B,eAAe,CACnB,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,EAC1C,KAAK,EAAE,MAAM,EACb,eAAe,CAAC,EAAE,oBAAoB,GACrC,OAAO,CAAC,IAAI,CAAC;IAUhB;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IASzC;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAOtC"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { EventEmitter } from 'eventemitter3';
|
|
2
|
+
import { LaneQueue } from './LaneQueue.js';
|
|
3
|
+
import { Brain } from '../brain/Brain.js';
|
|
4
|
+
import { ToolExecutor } from '../tools/ToolExecutor.js';
|
|
5
|
+
import { Database } from '../db/index.js';
|
|
6
|
+
import { createLLMProvider } from '../llm/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Gateway - The central hub of Keygate
|
|
9
|
+
*
|
|
10
|
+
* Singleton managing:
|
|
11
|
+
* - Session state
|
|
12
|
+
* - Lane queues for serial per-session processing
|
|
13
|
+
* - Security mode switching
|
|
14
|
+
* - Event emission for UI updates
|
|
15
|
+
*/
|
|
16
|
+
export class Gateway extends EventEmitter {
|
|
17
|
+
static instance = null;
|
|
18
|
+
sessions = new Map();
|
|
19
|
+
laneQueues = new Map();
|
|
20
|
+
securityMode = 'safe';
|
|
21
|
+
brain;
|
|
22
|
+
toolExecutor;
|
|
23
|
+
db;
|
|
24
|
+
config;
|
|
25
|
+
constructor(config) {
|
|
26
|
+
super();
|
|
27
|
+
this.config = config;
|
|
28
|
+
this.securityMode = config.security.mode;
|
|
29
|
+
// Initialize database
|
|
30
|
+
this.db = new Database();
|
|
31
|
+
// Initialize tool executor with security settings
|
|
32
|
+
this.toolExecutor = new ToolExecutor(this.securityMode, config.security.workspacePath, config.security.allowedBinaries, this);
|
|
33
|
+
// Initialize brain with LLM provider
|
|
34
|
+
this.brain = new Brain(config, this.toolExecutor, this);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get or create the Gateway singleton
|
|
38
|
+
*/
|
|
39
|
+
static getInstance(config) {
|
|
40
|
+
if (!Gateway.instance) {
|
|
41
|
+
if (!config) {
|
|
42
|
+
throw new Error('Gateway must be initialized with config on first call');
|
|
43
|
+
}
|
|
44
|
+
Gateway.instance = new Gateway(config);
|
|
45
|
+
}
|
|
46
|
+
return Gateway.instance;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Reset the singleton (for testing)
|
|
50
|
+
*/
|
|
51
|
+
static reset() {
|
|
52
|
+
Gateway.instance = null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Process an incoming message from any channel
|
|
56
|
+
*/
|
|
57
|
+
async processMessage(message) {
|
|
58
|
+
const queue = this.getOrCreateQueue(message.sessionId);
|
|
59
|
+
await queue.enqueue(async () => {
|
|
60
|
+
// Get or create session
|
|
61
|
+
const session = this.getOrCreateSession(message);
|
|
62
|
+
// Add user message to history
|
|
63
|
+
session.messages.push({
|
|
64
|
+
role: 'user',
|
|
65
|
+
content: message.content,
|
|
66
|
+
});
|
|
67
|
+
session.updatedAt = new Date();
|
|
68
|
+
// Emit start event
|
|
69
|
+
this.emit('message:start', {
|
|
70
|
+
sessionId: message.sessionId,
|
|
71
|
+
messageId: message.id,
|
|
72
|
+
});
|
|
73
|
+
try {
|
|
74
|
+
// Stream response back to the channel while accumulating final text.
|
|
75
|
+
let response = '';
|
|
76
|
+
const stream = this.brain.runStream(session, message.channel);
|
|
77
|
+
const gateway = this;
|
|
78
|
+
const captureStream = async function* () {
|
|
79
|
+
for await (const chunk of stream) {
|
|
80
|
+
response += chunk;
|
|
81
|
+
gateway.emit('message:chunk', {
|
|
82
|
+
sessionId: message.sessionId,
|
|
83
|
+
content: chunk,
|
|
84
|
+
});
|
|
85
|
+
yield chunk;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
await message.channel.sendStream(captureStream());
|
|
89
|
+
const finalResponse = response || '(No response)';
|
|
90
|
+
// Add assistant response to history
|
|
91
|
+
session.messages.push({
|
|
92
|
+
role: 'assistant',
|
|
93
|
+
content: finalResponse,
|
|
94
|
+
});
|
|
95
|
+
session.updatedAt = new Date();
|
|
96
|
+
// Emit end event
|
|
97
|
+
this.emit('message:end', {
|
|
98
|
+
sessionId: message.sessionId,
|
|
99
|
+
content: finalResponse,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
104
|
+
const errorResponse = `Error: ${errorMessage}`;
|
|
105
|
+
await message.channel.send(errorResponse);
|
|
106
|
+
session.messages.push({
|
|
107
|
+
role: 'assistant',
|
|
108
|
+
content: errorResponse,
|
|
109
|
+
});
|
|
110
|
+
session.updatedAt = new Date();
|
|
111
|
+
this.emit('message:end', {
|
|
112
|
+
sessionId: message.sessionId,
|
|
113
|
+
content: errorResponse,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get or create a lane queue for a session
|
|
120
|
+
*/
|
|
121
|
+
getOrCreateQueue(sessionId) {
|
|
122
|
+
let queue = this.laneQueues.get(sessionId);
|
|
123
|
+
if (!queue) {
|
|
124
|
+
queue = new LaneQueue();
|
|
125
|
+
this.laneQueues.set(sessionId, queue);
|
|
126
|
+
}
|
|
127
|
+
return queue;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get or create a session
|
|
131
|
+
*/
|
|
132
|
+
getOrCreateSession(message) {
|
|
133
|
+
let session = this.sessions.get(message.sessionId);
|
|
134
|
+
if (!session) {
|
|
135
|
+
session = {
|
|
136
|
+
id: message.sessionId,
|
|
137
|
+
channelType: message.channelType,
|
|
138
|
+
messages: [],
|
|
139
|
+
createdAt: new Date(),
|
|
140
|
+
updatedAt: new Date(),
|
|
141
|
+
};
|
|
142
|
+
this.sessions.set(message.sessionId, session);
|
|
143
|
+
}
|
|
144
|
+
return session;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get a session by ID
|
|
148
|
+
*/
|
|
149
|
+
getSession(sessionId) {
|
|
150
|
+
return this.sessions.get(sessionId);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get current security mode
|
|
154
|
+
*/
|
|
155
|
+
getSecurityMode() {
|
|
156
|
+
return this.securityMode;
|
|
157
|
+
}
|
|
158
|
+
getLLMState() {
|
|
159
|
+
return {
|
|
160
|
+
provider: this.config.llm.provider,
|
|
161
|
+
model: this.brain.getLLMModel(),
|
|
162
|
+
reasoningEffort: this.config.llm.reasoningEffort,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
async listAvailableModels(provider = this.config.llm.provider) {
|
|
166
|
+
if (provider === this.config.llm.provider) {
|
|
167
|
+
return this.brain.listModels();
|
|
168
|
+
}
|
|
169
|
+
const tempConfig = {
|
|
170
|
+
...this.config,
|
|
171
|
+
llm: {
|
|
172
|
+
...this.config.llm,
|
|
173
|
+
provider,
|
|
174
|
+
model: getDefaultModelForProvider(provider),
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
const providerInstance = createLLMProvider(tempConfig);
|
|
178
|
+
try {
|
|
179
|
+
if (typeof providerInstance.listModels === 'function') {
|
|
180
|
+
return await providerInstance.listModels();
|
|
181
|
+
}
|
|
182
|
+
return [{
|
|
183
|
+
id: tempConfig.llm.model,
|
|
184
|
+
provider,
|
|
185
|
+
displayName: tempConfig.llm.model,
|
|
186
|
+
isDefault: true,
|
|
187
|
+
}];
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
if (typeof providerInstance.dispose === 'function') {
|
|
191
|
+
await providerInstance.dispose();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async setLLMSelection(provider, model, reasoningEffort) {
|
|
196
|
+
this.config.llm.provider = provider;
|
|
197
|
+
this.config.llm.model = model;
|
|
198
|
+
if (provider === 'openai-codex') {
|
|
199
|
+
this.config.llm.reasoningEffort = reasoningEffort ?? this.config.llm.reasoningEffort ?? 'medium';
|
|
200
|
+
}
|
|
201
|
+
await this.brain.setLLMSelection(provider, model, this.config.llm.reasoningEffort);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Set security mode (requires spicy mode to be enabled in config)
|
|
205
|
+
*/
|
|
206
|
+
setSecurityMode(mode) {
|
|
207
|
+
if (mode === 'spicy' && !this.config.security.spicyModeEnabled) {
|
|
208
|
+
throw new Error('Spicy mode is not enabled. Re-run installer and accept the risk.');
|
|
209
|
+
}
|
|
210
|
+
this.securityMode = mode;
|
|
211
|
+
this.toolExecutor.setMode(mode);
|
|
212
|
+
this.emit('mode:changed', { mode });
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Clear a session's message history
|
|
216
|
+
*/
|
|
217
|
+
clearSession(sessionId) {
|
|
218
|
+
const session = this.sessions.get(sessionId);
|
|
219
|
+
if (session) {
|
|
220
|
+
session.messages = [];
|
|
221
|
+
session.updatedAt = new Date();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function getDefaultModelForProvider(provider) {
|
|
226
|
+
switch (provider) {
|
|
227
|
+
case 'openai':
|
|
228
|
+
return 'gpt-4o';
|
|
229
|
+
case 'gemini':
|
|
230
|
+
return 'gemini-1.5-pro';
|
|
231
|
+
case 'ollama':
|
|
232
|
+
return 'llama3';
|
|
233
|
+
case 'openai-codex':
|
|
234
|
+
return 'openai-codex/gpt-5.3';
|
|
235
|
+
default:
|
|
236
|
+
return 'gpt-4o';
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=Gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Gateway.js","sourceRoot":"","sources":["../../src/gateway/Gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LaneQueue - Ensures serial processing of messages per session
|
|
3
|
+
*
|
|
4
|
+
* Each session gets its own queue. Messages within a session are processed
|
|
5
|
+
* one at a time (FIFO), but different sessions can process in parallel.
|
|
6
|
+
*/
|
|
7
|
+
export declare class LaneQueue {
|
|
8
|
+
private queue;
|
|
9
|
+
private processing;
|
|
10
|
+
/**
|
|
11
|
+
* Enqueue a task to be processed serially
|
|
12
|
+
*/
|
|
13
|
+
enqueue<T>(task: () => Promise<T>): Promise<T>;
|
|
14
|
+
private processNext;
|
|
15
|
+
/**
|
|
16
|
+
* Get the number of pending tasks in the queue
|
|
17
|
+
*/
|
|
18
|
+
get pendingCount(): number;
|
|
19
|
+
/**
|
|
20
|
+
* Check if the queue is currently processing
|
|
21
|
+
*/
|
|
22
|
+
get isProcessing(): boolean;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=LaneQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LaneQueue.d.ts","sourceRoot":"","sources":["../../src/gateway/LaneQueue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,UAAU,CAAS;IAE3B;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;YActC,WAAW;IAoBzB;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAE1B;CACF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LaneQueue - Ensures serial processing of messages per session
|
|
3
|
+
*
|
|
4
|
+
* Each session gets its own queue. Messages within a session are processed
|
|
5
|
+
* one at a time (FIFO), but different sessions can process in parallel.
|
|
6
|
+
*/
|
|
7
|
+
export class LaneQueue {
|
|
8
|
+
queue = [];
|
|
9
|
+
processing = false;
|
|
10
|
+
/**
|
|
11
|
+
* Enqueue a task to be processed serially
|
|
12
|
+
*/
|
|
13
|
+
async enqueue(task) {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
this.queue.push(async () => {
|
|
16
|
+
try {
|
|
17
|
+
const result = await task();
|
|
18
|
+
resolve(result);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
reject(error);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
this.processNext();
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async processNext() {
|
|
28
|
+
if (this.processing || this.queue.length === 0) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.processing = true;
|
|
32
|
+
const task = this.queue.shift();
|
|
33
|
+
if (task) {
|
|
34
|
+
try {
|
|
35
|
+
await task();
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
this.processing = false;
|
|
39
|
+
this.processNext();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.processing = false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get the number of pending tasks in the queue
|
|
48
|
+
*/
|
|
49
|
+
get pendingCount() {
|
|
50
|
+
return this.queue.length;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if the queue is currently processing
|
|
54
|
+
*/
|
|
55
|
+
get isProcessing() {
|
|
56
|
+
return this.processing;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=LaneQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LaneQueue.js","sourceRoot":"","sources":["../../src/gateway/LaneQueue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACZ,KAAK,GAA+B,EAAE,CAAC;IACvC,UAAU,GAAG,KAAK,CAAC;IAE3B;;OAEG;IACH,KAAK,CAAC,OAAO,CAAI,IAAsB;QACrC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBACzB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;oBAC5B,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAEhC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,IAAI,EAAE,CAAC;YACf,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export { Gateway } from './gateway/index.js';
|
|
3
|
+
export { Brain } from './brain/index.js';
|
|
4
|
+
export { ToolExecutor, allBuiltinTools } from './tools/index.js';
|
|
5
|
+
export { createLLMProvider, OpenAIProvider, GeminiProvider, OpenAICodexProvider } from './llm/index.js';
|
|
6
|
+
export * from './codex/index.js';
|
|
7
|
+
export * from './config/index.js';
|
|
8
|
+
export { normalizeDiscordMessage, normalizeWebMessage, BaseChannel } from './pipeline/index.js';
|
|
9
|
+
export { Database } from './db/index.js';
|
|
10
|
+
export { startWebServer, WebSocketChannel } from './server/index.js';
|
|
11
|
+
export { runCli, printHelp } from './cli/index.js';
|
|
12
|
+
export { ensureAgentWorkspaceFiles } from './workspace/agentWorkspace.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACxG,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Keygate Core - Main Entry Point
|
|
2
|
+
export * from './types.js';
|
|
3
|
+
export { Gateway } from './gateway/index.js';
|
|
4
|
+
export { Brain } from './brain/index.js';
|
|
5
|
+
export { ToolExecutor, allBuiltinTools } from './tools/index.js';
|
|
6
|
+
export { createLLMProvider, OpenAIProvider, GeminiProvider, OpenAICodexProvider } from './llm/index.js';
|
|
7
|
+
export * from './codex/index.js';
|
|
8
|
+
export * from './config/index.js';
|
|
9
|
+
export { normalizeDiscordMessage, normalizeWebMessage, BaseChannel } from './pipeline/index.js';
|
|
10
|
+
export { Database } from './db/index.js';
|
|
11
|
+
export { startWebServer, WebSocketChannel } from './server/index.js';
|
|
12
|
+
export { runCli, printHelp } from './cli/index.js';
|
|
13
|
+
export { ensureAgentWorkspaceFiles } from './workspace/agentWorkspace.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACxG,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ChatOptions, LLMChunk, LLMProvider, LLMResponse, Message } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Google Gemini LLM Provider
|
|
4
|
+
*/
|
|
5
|
+
export declare class GeminiProvider implements LLMProvider {
|
|
6
|
+
name: string;
|
|
7
|
+
private client;
|
|
8
|
+
private model;
|
|
9
|
+
constructor(apiKey: string, model: string);
|
|
10
|
+
chat(messages: Message[], options?: ChatOptions): Promise<LLMResponse>;
|
|
11
|
+
stream(messages: Message[], options?: ChatOptions): AsyncIterable<LLMChunk>;
|
|
12
|
+
private withRetry;
|
|
13
|
+
private convertMessages;
|
|
14
|
+
private convertTools;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=GeminiProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeminiProvider.d.ts","sourceRoot":"","sources":["../../src/llm/GeminiProvider.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,WAAW,EACX,WAAW,EACX,OAAO,EAGR,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKnC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAyCrE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC;YAmDpE,SAAS;IAsBvB,OAAO,CAAC,eAAe;IA0DvB,OAAO,CAAC,YAAY;CAWrB"}
|