@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.
Files changed (162) hide show
  1. package/LICENSE +21 -0
  2. package/dist/brain/Brain.d.ts +39 -0
  3. package/dist/brain/Brain.d.ts.map +1 -0
  4. package/dist/brain/Brain.js +284 -0
  5. package/dist/brain/Brain.js.map +1 -0
  6. package/dist/brain/index.d.ts +2 -0
  7. package/dist/brain/index.d.ts.map +1 -0
  8. package/dist/brain/index.js +2 -0
  9. package/dist/brain/index.js.map +1 -0
  10. package/dist/cli/argv.d.ts +8 -0
  11. package/dist/cli/argv.d.ts.map +1 -0
  12. package/dist/cli/argv.js +41 -0
  13. package/dist/cli/argv.js.map +1 -0
  14. package/dist/cli/codexInstall.d.ts +17 -0
  15. package/dist/cli/codexInstall.d.ts.map +1 -0
  16. package/dist/cli/codexInstall.js +106 -0
  17. package/dist/cli/codexInstall.js.map +1 -0
  18. package/dist/cli/commands/auth.d.ts +3 -0
  19. package/dist/cli/commands/auth.d.ts.map +1 -0
  20. package/dist/cli/commands/auth.js +66 -0
  21. package/dist/cli/commands/auth.js.map +1 -0
  22. package/dist/cli/commands/install.d.ts +3 -0
  23. package/dist/cli/commands/install.d.ts.map +1 -0
  24. package/dist/cli/commands/install.js +21 -0
  25. package/dist/cli/commands/install.js.map +1 -0
  26. package/dist/cli/commands/onboard.d.ts +3 -0
  27. package/dist/cli/commands/onboard.d.ts.map +1 -0
  28. package/dist/cli/commands/onboard.js +43 -0
  29. package/dist/cli/commands/onboard.js.map +1 -0
  30. package/dist/cli/commands/uninstall.d.ts +3 -0
  31. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  32. package/dist/cli/commands/uninstall.js +193 -0
  33. package/dist/cli/commands/uninstall.js.map +1 -0
  34. package/dist/cli/commands/update.d.ts +3 -0
  35. package/dist/cli/commands/update.d.ts.map +1 -0
  36. package/dist/cli/commands/update.js +314 -0
  37. package/dist/cli/commands/update.js.map +1 -0
  38. package/dist/cli/index.d.ts +3 -0
  39. package/dist/cli/index.d.ts.map +1 -0
  40. package/dist/cli/index.js +60 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/codex/CodexRpcClient.d.ts +65 -0
  43. package/dist/codex/CodexRpcClient.d.ts.map +1 -0
  44. package/dist/codex/CodexRpcClient.js +395 -0
  45. package/dist/codex/CodexRpcClient.js.map +1 -0
  46. package/dist/codex/codexModels.d.ts +33 -0
  47. package/dist/codex/codexModels.d.ts.map +1 -0
  48. package/dist/codex/codexModels.js +226 -0
  49. package/dist/codex/codexModels.js.map +1 -0
  50. package/dist/codex/index.d.ts +5 -0
  51. package/dist/codex/index.d.ts.map +1 -0
  52. package/dist/codex/index.js +3 -0
  53. package/dist/codex/index.js.map +1 -0
  54. package/dist/codex/types.d.ts +97 -0
  55. package/dist/codex/types.d.ts.map +1 -0
  56. package/dist/codex/types.js +2 -0
  57. package/dist/codex/types.js.map +1 -0
  58. package/dist/config/env.d.ts +8 -0
  59. package/dist/config/env.d.ts.map +1 -0
  60. package/dist/config/env.js +130 -0
  61. package/dist/config/env.js.map +1 -0
  62. package/dist/config/index.d.ts +2 -0
  63. package/dist/config/index.d.ts.map +1 -0
  64. package/dist/config/index.js +2 -0
  65. package/dist/config/index.js.map +1 -0
  66. package/dist/db/index.d.ts +48 -0
  67. package/dist/db/index.d.ts.map +1 -0
  68. package/dist/db/index.js +147 -0
  69. package/dist/db/index.js.map +1 -0
  70. package/dist/gateway/Gateway.d.ts +69 -0
  71. package/dist/gateway/Gateway.d.ts.map +1 -0
  72. package/dist/gateway/Gateway.js +239 -0
  73. package/dist/gateway/Gateway.js.map +1 -0
  74. package/dist/gateway/LaneQueue.d.ts +24 -0
  75. package/dist/gateway/LaneQueue.d.ts.map +1 -0
  76. package/dist/gateway/LaneQueue.js +59 -0
  77. package/dist/gateway/LaneQueue.js.map +1 -0
  78. package/dist/gateway/index.d.ts +3 -0
  79. package/dist/gateway/index.d.ts.map +1 -0
  80. package/dist/gateway/index.js +3 -0
  81. package/dist/gateway/index.js.map +1 -0
  82. package/dist/index.d.ts +13 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +14 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/llm/GeminiProvider.d.ts +16 -0
  87. package/dist/llm/GeminiProvider.d.ts.map +1 -0
  88. package/dist/llm/GeminiProvider.js +172 -0
  89. package/dist/llm/GeminiProvider.js.map +1 -0
  90. package/dist/llm/OllamaProvider.d.ts +15 -0
  91. package/dist/llm/OllamaProvider.d.ts.map +1 -0
  92. package/dist/llm/OllamaProvider.js +108 -0
  93. package/dist/llm/OllamaProvider.js.map +1 -0
  94. package/dist/llm/OpenAICodexProvider.d.ts +51 -0
  95. package/dist/llm/OpenAICodexProvider.d.ts.map +1 -0
  96. package/dist/llm/OpenAICodexProvider.js +620 -0
  97. package/dist/llm/OpenAICodexProvider.js.map +1 -0
  98. package/dist/llm/OpenAIProvider.d.ts +16 -0
  99. package/dist/llm/OpenAIProvider.d.ts.map +1 -0
  100. package/dist/llm/OpenAIProvider.js +134 -0
  101. package/dist/llm/OpenAIProvider.js.map +1 -0
  102. package/dist/llm/index.d.ts +10 -0
  103. package/dist/llm/index.d.ts.map +1 -0
  104. package/dist/llm/index.js +30 -0
  105. package/dist/llm/index.js.map +1 -0
  106. package/dist/main.d.ts +7 -0
  107. package/dist/main.d.ts.map +1 -0
  108. package/dist/main.js +88 -0
  109. package/dist/main.js.map +1 -0
  110. package/dist/pipeline/index.d.ts +2 -0
  111. package/dist/pipeline/index.d.ts.map +1 -0
  112. package/dist/pipeline/index.js +2 -0
  113. package/dist/pipeline/index.js.map +1 -0
  114. package/dist/pipeline/normalize.d.ts +19 -0
  115. package/dist/pipeline/normalize.d.ts.map +1 -0
  116. package/dist/pipeline/normalize.js +34 -0
  117. package/dist/pipeline/normalize.js.map +1 -0
  118. package/dist/server/index.d.ts +28 -0
  119. package/dist/server/index.d.ts.map +1 -0
  120. package/dist/server/index.js +389 -0
  121. package/dist/server/index.js.map +1 -0
  122. package/dist/tools/ToolExecutor.d.ts +68 -0
  123. package/dist/tools/ToolExecutor.d.ts.map +1 -0
  124. package/dist/tools/ToolExecutor.js +177 -0
  125. package/dist/tools/ToolExecutor.js.map +1 -0
  126. package/dist/tools/builtin/browser.d.ts +27 -0
  127. package/dist/tools/builtin/browser.d.ts.map +1 -0
  128. package/dist/tools/builtin/browser.js +222 -0
  129. package/dist/tools/builtin/browser.js.map +1 -0
  130. package/dist/tools/builtin/filesystem.d.ts +22 -0
  131. package/dist/tools/builtin/filesystem.d.ts.map +1 -0
  132. package/dist/tools/builtin/filesystem.js +151 -0
  133. package/dist/tools/builtin/filesystem.js.map +1 -0
  134. package/dist/tools/builtin/index.d.ts +10 -0
  135. package/dist/tools/builtin/index.d.ts.map +1 -0
  136. package/dist/tools/builtin/index.js +21 -0
  137. package/dist/tools/builtin/index.js.map +1 -0
  138. package/dist/tools/builtin/sandbox.d.ts +11 -0
  139. package/dist/tools/builtin/sandbox.d.ts.map +1 -0
  140. package/dist/tools/builtin/sandbox.js +166 -0
  141. package/dist/tools/builtin/sandbox.js.map +1 -0
  142. package/dist/tools/builtin/search.d.ts +7 -0
  143. package/dist/tools/builtin/search.d.ts.map +1 -0
  144. package/dist/tools/builtin/search.js +76 -0
  145. package/dist/tools/builtin/search.js.map +1 -0
  146. package/dist/tools/builtin/shell.d.ts +7 -0
  147. package/dist/tools/builtin/shell.d.ts.map +1 -0
  148. package/dist/tools/builtin/shell.js +71 -0
  149. package/dist/tools/builtin/shell.js.map +1 -0
  150. package/dist/tools/index.d.ts +3 -0
  151. package/dist/tools/index.d.ts.map +1 -0
  152. package/dist/tools/index.js +3 -0
  153. package/dist/tools/index.js.map +1 -0
  154. package/dist/types.d.ts +167 -0
  155. package/dist/types.d.ts.map +1 -0
  156. package/dist/types.js +3 -0
  157. package/dist/types.js.map +1 -0
  158. package/dist/workspace/agentWorkspace.d.ts +24 -0
  159. package/dist/workspace/agentWorkspace.d.ts.map +1 -0
  160. package/dist/workspace/agentWorkspace.js +210 -0
  161. package/dist/workspace/agentWorkspace.js.map +1 -0
  162. package/package.json +45 -0
@@ -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,3 @@
1
+ export { Gateway } from './Gateway.js';
2
+ export { LaneQueue } from './LaneQueue.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export { Gateway } from './Gateway.js';
2
+ export { LaneQueue } from './LaneQueue.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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"}