@chrishdx/llm-dev-server 1.0.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 (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +164 -0
  3. package/backend/bin/llm-dev-server.js +3 -0
  4. package/backend/dist/cli.d.ts +15 -0
  5. package/backend/dist/cli.d.ts.map +1 -0
  6. package/backend/dist/cli.js +326 -0
  7. package/backend/dist/cli.js.map +1 -0
  8. package/backend/dist/config/database.d.ts +10 -0
  9. package/backend/dist/config/database.d.ts.map +1 -0
  10. package/backend/dist/config/database.js +61 -0
  11. package/backend/dist/config/database.js.map +1 -0
  12. package/backend/dist/config/environment.d.ts +20 -0
  13. package/backend/dist/config/environment.d.ts.map +1 -0
  14. package/backend/dist/config/environment.js +77 -0
  15. package/backend/dist/config/environment.js.map +1 -0
  16. package/backend/dist/controllers/AuthController.d.ts +18 -0
  17. package/backend/dist/controllers/AuthController.d.ts.map +1 -0
  18. package/backend/dist/controllers/AuthController.js +282 -0
  19. package/backend/dist/controllers/AuthController.js.map +1 -0
  20. package/backend/dist/controllers/ConversationController.d.ts +44 -0
  21. package/backend/dist/controllers/ConversationController.d.ts.map +1 -0
  22. package/backend/dist/controllers/ConversationController.js +193 -0
  23. package/backend/dist/controllers/ConversationController.js.map +1 -0
  24. package/backend/dist/controllers/JobController.d.ts +49 -0
  25. package/backend/dist/controllers/JobController.d.ts.map +1 -0
  26. package/backend/dist/controllers/JobController.js +227 -0
  27. package/backend/dist/controllers/JobController.js.map +1 -0
  28. package/backend/dist/index.d.ts +2 -0
  29. package/backend/dist/index.d.ts.map +1 -0
  30. package/backend/dist/index.js +160 -0
  31. package/backend/dist/index.js.map +1 -0
  32. package/backend/dist/middleware/auth.middleware.d.ts +25 -0
  33. package/backend/dist/middleware/auth.middleware.d.ts.map +1 -0
  34. package/backend/dist/middleware/auth.middleware.js +116 -0
  35. package/backend/dist/middleware/auth.middleware.js.map +1 -0
  36. package/backend/dist/middleware/authelia.middleware.d.ts +26 -0
  37. package/backend/dist/middleware/authelia.middleware.d.ts.map +1 -0
  38. package/backend/dist/middleware/authelia.middleware.js +165 -0
  39. package/backend/dist/middleware/authelia.middleware.js.map +1 -0
  40. package/backend/dist/middleware/error.middleware.d.ts +23 -0
  41. package/backend/dist/middleware/error.middleware.d.ts.map +1 -0
  42. package/backend/dist/middleware/error.middleware.js +59 -0
  43. package/backend/dist/middleware/error.middleware.js.map +1 -0
  44. package/backend/dist/models/AuthToken.d.ts +42 -0
  45. package/backend/dist/models/AuthToken.d.ts.map +1 -0
  46. package/backend/dist/models/AuthToken.js +97 -0
  47. package/backend/dist/models/AuthToken.js.map +1 -0
  48. package/backend/dist/models/Conversation.d.ts +36 -0
  49. package/backend/dist/models/Conversation.d.ts.map +1 -0
  50. package/backend/dist/models/Conversation.js +100 -0
  51. package/backend/dist/models/Conversation.js.map +1 -0
  52. package/backend/dist/models/FileOperation.d.ts +36 -0
  53. package/backend/dist/models/FileOperation.d.ts.map +1 -0
  54. package/backend/dist/models/FileOperation.js +117 -0
  55. package/backend/dist/models/FileOperation.js.map +1 -0
  56. package/backend/dist/models/Job.d.ts +48 -0
  57. package/backend/dist/models/Job.d.ts.map +1 -0
  58. package/backend/dist/models/Job.js +87 -0
  59. package/backend/dist/models/Job.js.map +1 -0
  60. package/backend/dist/models/Message.d.ts +38 -0
  61. package/backend/dist/models/Message.d.ts.map +1 -0
  62. package/backend/dist/models/Message.js +87 -0
  63. package/backend/dist/models/Message.js.map +1 -0
  64. package/backend/dist/models/User.d.ts +26 -0
  65. package/backend/dist/models/User.d.ts.map +1 -0
  66. package/backend/dist/models/User.js +67 -0
  67. package/backend/dist/models/User.js.map +1 -0
  68. package/backend/dist/models/index.d.ts +13 -0
  69. package/backend/dist/models/index.d.ts.map +1 -0
  70. package/backend/dist/models/index.js +24 -0
  71. package/backend/dist/models/index.js.map +1 -0
  72. package/backend/dist/routes/auth.routes.d.ts +3 -0
  73. package/backend/dist/routes/auth.routes.d.ts.map +1 -0
  74. package/backend/dist/routes/auth.routes.js +27 -0
  75. package/backend/dist/routes/auth.routes.js.map +1 -0
  76. package/backend/dist/routes/conversation.routes.d.ts +3 -0
  77. package/backend/dist/routes/conversation.routes.d.ts.map +1 -0
  78. package/backend/dist/routes/conversation.routes.js +17 -0
  79. package/backend/dist/routes/conversation.routes.js.map +1 -0
  80. package/backend/dist/routes/filesystem.routes.d.ts +3 -0
  81. package/backend/dist/routes/filesystem.routes.d.ts.map +1 -0
  82. package/backend/dist/routes/filesystem.routes.js +64 -0
  83. package/backend/dist/routes/filesystem.routes.js.map +1 -0
  84. package/backend/dist/routes/index.d.ts +3 -0
  85. package/backend/dist/routes/index.d.ts.map +1 -0
  86. package/backend/dist/routes/index.js +27 -0
  87. package/backend/dist/routes/index.js.map +1 -0
  88. package/backend/dist/routes/job.routes.d.ts +3 -0
  89. package/backend/dist/routes/job.routes.d.ts.map +1 -0
  90. package/backend/dist/routes/job.routes.js +18 -0
  91. package/backend/dist/routes/job.routes.js.map +1 -0
  92. package/backend/dist/services/auth/BaseAuthService.d.ts +49 -0
  93. package/backend/dist/services/auth/BaseAuthService.d.ts.map +1 -0
  94. package/backend/dist/services/auth/BaseAuthService.js +97 -0
  95. package/backend/dist/services/auth/BaseAuthService.js.map +1 -0
  96. package/backend/dist/services/auth/ClaudeAuthService.d.ts +69 -0
  97. package/backend/dist/services/auth/ClaudeAuthService.d.ts.map +1 -0
  98. package/backend/dist/services/auth/ClaudeAuthService.js +401 -0
  99. package/backend/dist/services/auth/ClaudeAuthService.js.map +1 -0
  100. package/backend/dist/services/auth/CodexAuthService.d.ts +37 -0
  101. package/backend/dist/services/auth/CodexAuthService.d.ts.map +1 -0
  102. package/backend/dist/services/auth/CodexAuthService.js +186 -0
  103. package/backend/dist/services/auth/CodexAuthService.js.map +1 -0
  104. package/backend/dist/services/auth/GeminiAuthService.d.ts +50 -0
  105. package/backend/dist/services/auth/GeminiAuthService.d.ts.map +1 -0
  106. package/backend/dist/services/auth/GeminiAuthService.js +284 -0
  107. package/backend/dist/services/auth/GeminiAuthService.js.map +1 -0
  108. package/backend/dist/services/auth/JwtService.d.ts +27 -0
  109. package/backend/dist/services/auth/JwtService.d.ts.map +1 -0
  110. package/backend/dist/services/auth/JwtService.js +65 -0
  111. package/backend/dist/services/auth/JwtService.js.map +1 -0
  112. package/backend/dist/services/auth/TokenRefreshService.d.ts +36 -0
  113. package/backend/dist/services/auth/TokenRefreshService.d.ts.map +1 -0
  114. package/backend/dist/services/auth/TokenRefreshService.js +178 -0
  115. package/backend/dist/services/auth/TokenRefreshService.js.map +1 -0
  116. package/backend/dist/services/conversation/ConversationService.d.ts +89 -0
  117. package/backend/dist/services/conversation/ConversationService.d.ts.map +1 -0
  118. package/backend/dist/services/conversation/ConversationService.js +255 -0
  119. package/backend/dist/services/conversation/ConversationService.js.map +1 -0
  120. package/backend/dist/services/job/JobService.d.ts +83 -0
  121. package/backend/dist/services/job/JobService.d.ts.map +1 -0
  122. package/backend/dist/services/job/JobService.js +213 -0
  123. package/backend/dist/services/job/JobService.js.map +1 -0
  124. package/backend/dist/services/job/WorkingDirectoryService.d.ts +73 -0
  125. package/backend/dist/services/job/WorkingDirectoryService.d.ts.map +1 -0
  126. package/backend/dist/services/job/WorkingDirectoryService.js +289 -0
  127. package/backend/dist/services/job/WorkingDirectoryService.js.map +1 -0
  128. package/backend/dist/services/llm/ClaudeProvider.d.ts +16 -0
  129. package/backend/dist/services/llm/ClaudeProvider.d.ts.map +1 -0
  130. package/backend/dist/services/llm/ClaudeProvider.js +229 -0
  131. package/backend/dist/services/llm/ClaudeProvider.js.map +1 -0
  132. package/backend/dist/services/llm/CodexProvider.d.ts +15 -0
  133. package/backend/dist/services/llm/CodexProvider.d.ts.map +1 -0
  134. package/backend/dist/services/llm/CodexProvider.js +301 -0
  135. package/backend/dist/services/llm/CodexProvider.js.map +1 -0
  136. package/backend/dist/services/llm/GeminiProvider.d.ts +17 -0
  137. package/backend/dist/services/llm/GeminiProvider.d.ts.map +1 -0
  138. package/backend/dist/services/llm/GeminiProvider.js +190 -0
  139. package/backend/dist/services/llm/GeminiProvider.js.map +1 -0
  140. package/backend/dist/services/llm/LLMProviderBase.d.ts +76 -0
  141. package/backend/dist/services/llm/LLMProviderBase.d.ts.map +1 -0
  142. package/backend/dist/services/llm/LLMProviderBase.js +34 -0
  143. package/backend/dist/services/llm/LLMProviderBase.js.map +1 -0
  144. package/backend/dist/services/llm/ProviderFactory.d.ts +17 -0
  145. package/backend/dist/services/llm/ProviderFactory.d.ts.map +1 -0
  146. package/backend/dist/services/llm/ProviderFactory.js +58 -0
  147. package/backend/dist/services/llm/ProviderFactory.js.map +1 -0
  148. package/backend/dist/utils/crypto.d.ts +33 -0
  149. package/backend/dist/utils/crypto.d.ts.map +1 -0
  150. package/backend/dist/utils/crypto.js +165 -0
  151. package/backend/dist/utils/crypto.js.map +1 -0
  152. package/backend/dist/utils/logger.d.ts +4 -0
  153. package/backend/dist/utils/logger.d.ts.map +1 -0
  154. package/backend/dist/utils/logger.js +44 -0
  155. package/backend/dist/utils/logger.js.map +1 -0
  156. package/backend/dist/utils/validators.d.ts +22 -0
  157. package/backend/dist/utils/validators.d.ts.map +1 -0
  158. package/backend/dist/utils/validators.js +127 -0
  159. package/backend/dist/utils/validators.js.map +1 -0
  160. package/backend/package.json +45 -0
  161. package/backend/public/assets/index-C207-KqP.js +188 -0
  162. package/backend/public/index.html +12 -0
  163. package/package.json +96 -0
  164. package/shared/dist/index.d.ts +5 -0
  165. package/shared/dist/index.d.ts.map +1 -0
  166. package/shared/dist/index.js +25 -0
  167. package/shared/dist/index.js.map +1 -0
  168. package/shared/dist/types/api.d.ts +27 -0
  169. package/shared/dist/types/api.d.ts.map +1 -0
  170. package/shared/dist/types/api.js +3 -0
  171. package/shared/dist/types/api.js.map +1 -0
  172. package/shared/dist/types/auth.d.ts +62 -0
  173. package/shared/dist/types/auth.d.ts.map +1 -0
  174. package/shared/dist/types/auth.js +3 -0
  175. package/shared/dist/types/auth.js.map +1 -0
  176. package/shared/dist/types/conversation.d.ts +98 -0
  177. package/shared/dist/types/conversation.d.ts.map +1 -0
  178. package/shared/dist/types/conversation.js +3 -0
  179. package/shared/dist/types/conversation.js.map +1 -0
  180. package/shared/dist/types/job.d.ts +93 -0
  181. package/shared/dist/types/job.d.ts.map +1 -0
  182. package/shared/dist/types/job.js +3 -0
  183. package/shared/dist/types/job.js.map +1 -0
  184. package/shared/package.json +15 -0
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ClaudeProvider = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const readline_1 = __importDefault(require("readline"));
9
+ const LLMProviderBase_1 = require("./LLMProviderBase");
10
+ const models_1 = require("../../models");
11
+ const environment_1 = __importDefault(require("../../config/environment"));
12
+ const logger_1 = __importDefault(require("../../utils/logger"));
13
+ class ClaudeProvider extends LLMProviderBase_1.LLMProviderBase {
14
+ constructor(providerConfig) {
15
+ super(providerConfig);
16
+ }
17
+ async initialize() {
18
+ logger_1.default.info(`Initializing Claude provider for working directory: ${this.config.workingDirectory}`);
19
+ // IMPORTANT: Do NOT set CLAUDE_CONFIG_DIR!
20
+ // Claude Code stores OAuth tokens in the macOS Keychain.
21
+ // When CLAUDE_CONFIG_DIR is explicitly set, the Keychain lookup fails.
22
+ // Let Claude use its default config path (~/.claude) automatically.
23
+ logger_1.default.info(`HOME env: ${process.env.HOME}`);
24
+ this.env = {
25
+ ...process.env,
26
+ HOME: process.env.HOME || "",
27
+ // Explicitly remove CLAUDE_CONFIG_DIR if it was set elsewhere
28
+ };
29
+ delete this.env.CLAUDE_CONFIG_DIR;
30
+ // Verify auth token exists
31
+ const token = await models_1.AuthToken.findByPk(this.config.tokenId);
32
+ if (!token || token.provider !== "claude") {
33
+ throw new Error("Invalid Claude auth token");
34
+ }
35
+ // Use session from config if provided
36
+ if (this.config.sessionId) {
37
+ this.currentSessionId = this.config.sessionId;
38
+ }
39
+ logger_1.default.info("Claude provider initialized");
40
+ }
41
+ async sendMessage(params) {
42
+ const { content, systemPrompt, attachments, onChunk } = params;
43
+ // Build CLI arguments - put all options BEFORE the prompt
44
+ const args = [
45
+ "--print",
46
+ "--output-format",
47
+ onChunk ? "stream-json" : "json",
48
+ "--dangerously-skip-permissions", // Skip permission prompts for automation
49
+ ];
50
+ if (this.config.model) {
51
+ args.push("--model", this.config.model);
52
+ }
53
+ if (systemPrompt) {
54
+ args.push("--append-system-prompt", systemPrompt);
55
+ }
56
+ if (this.currentSessionId) {
57
+ args.push("--session-id", this.currentSessionId);
58
+ }
59
+ // Attachments as additional directories
60
+ if (attachments && attachments.length > 0) {
61
+ attachments.forEach((attachment) => {
62
+ args.push("--add-dir", attachment);
63
+ });
64
+ }
65
+ // Add the prompt LAST
66
+ args.push("-p", content);
67
+ // Spawn Claude CLI
68
+ const cliPath = this.resolveClaudeCli();
69
+ logger_1.default.info(`Spawning Claude CLI: ${cliPath}`);
70
+ logger_1.default.info(`Claude CLI args: ${args.join(" ")}`);
71
+ logger_1.default.info(`Claude CLI env CLAUDE_CONFIG_DIR: ${this.env?.CLAUDE_CONFIG_DIR ?? "not set"}`);
72
+ logger_1.default.info(`Claude CLI env HOME: ${this.env?.HOME}`);
73
+ logger_1.default.info(`Claude CLI cwd: ${this.config.workingDirectory}`);
74
+ const child = (0, child_process_1.spawn)(cliPath, args, {
75
+ env: this.env,
76
+ cwd: this.config.workingDirectory,
77
+ stdio: ["ignore", "pipe", "pipe"], // Don't pipe stdin - we use -p flag for prompt
78
+ });
79
+ if (onChunk) {
80
+ return this.handleStreamingResponse(child, onChunk);
81
+ }
82
+ else {
83
+ return this.handleJsonResponse(child);
84
+ }
85
+ }
86
+ async handleJsonResponse(child) {
87
+ let stdout = "";
88
+ let stderr = "";
89
+ child.stdout?.on("data", (data) => {
90
+ const chunk = data.toString();
91
+ stdout += chunk;
92
+ logger_1.default.info(`Claude stdout chunk (${chunk.length} bytes): ${chunk.substring(0, 200)}...`);
93
+ });
94
+ child.stderr?.on("data", (data) => {
95
+ const chunk = data.toString();
96
+ stderr += chunk;
97
+ logger_1.default.info(`Claude stderr chunk: ${chunk}`);
98
+ });
99
+ return new Promise((resolve, reject) => {
100
+ child.on("close", (code) => {
101
+ if (code !== 0) {
102
+ logger_1.default.error("Claude CLI failed with code:", code);
103
+ logger_1.default.error("Claude CLI stderr:", stderr);
104
+ logger_1.default.error("Claude CLI stdout:", stdout);
105
+ reject(new Error(`Claude CLI exited with code ${code}: ${stderr || stdout || "No output"}`));
106
+ return;
107
+ }
108
+ try {
109
+ // Claude returns JSON with result field
110
+ const output = JSON.parse(stdout);
111
+ // Check if Claude returned an error
112
+ if (output.is_error) {
113
+ reject(new Error(output.result?.toString() || "Claude returned an error"));
114
+ return;
115
+ }
116
+ // Extract session ID if present
117
+ if (output.session_id) {
118
+ this.currentSessionId = output.session_id;
119
+ }
120
+ const result = {
121
+ content: typeof output.result === "string"
122
+ ? output.result
123
+ : JSON.stringify(output.result),
124
+ tokenUsage: {
125
+ input: output.usage?.input_tokens || 0,
126
+ output: output.usage?.output_tokens || 0,
127
+ total: (output.usage?.input_tokens || 0) +
128
+ (output.usage?.output_tokens || 0),
129
+ },
130
+ sessionId: this.currentSessionId,
131
+ };
132
+ this.messageCount++;
133
+ resolve(result);
134
+ }
135
+ catch (error) {
136
+ const message = error instanceof Error ? error.message : String(error);
137
+ reject(new Error(`Failed to parse Claude response: ${message}`));
138
+ }
139
+ });
140
+ child.on("error", (error) => {
141
+ const message = error instanceof Error ? error.message : String(error);
142
+ reject(new Error(`Failed to spawn Claude CLI: ${message}`));
143
+ });
144
+ });
145
+ }
146
+ async handleStreamingResponse(child, onChunk) {
147
+ let fullContent = "";
148
+ let sessionId;
149
+ let usage = { input: 0, output: 0, total: 0 };
150
+ const rl = readline_1.default.createInterface({
151
+ input: child.stdout,
152
+ crlfDelay: Infinity,
153
+ });
154
+ for await (const line of rl) {
155
+ try {
156
+ const event = JSON.parse(line);
157
+ if (event.type === "message") {
158
+ const chunk = event.content || "";
159
+ fullContent += chunk;
160
+ onChunk(chunk);
161
+ }
162
+ else if (event.type === "result") {
163
+ if (event.session_id) {
164
+ sessionId = event.session_id;
165
+ this.currentSessionId = sessionId;
166
+ }
167
+ if (event.usage) {
168
+ usage = {
169
+ input: event.usage.input_tokens || 0,
170
+ output: event.usage.output_tokens || 0,
171
+ total: (event.usage.input_tokens || 0) +
172
+ (event.usage.output_tokens || 0),
173
+ };
174
+ }
175
+ }
176
+ }
177
+ catch (error) {
178
+ logger_1.default.warn("Failed to parse streaming event:", line);
179
+ }
180
+ }
181
+ this.messageCount++;
182
+ return {
183
+ content: fullContent,
184
+ tokenUsage: usage,
185
+ sessionId,
186
+ };
187
+ }
188
+ async resumeSession(sessionId) {
189
+ this.currentSessionId = sessionId;
190
+ logger_1.default.info(`Resumed Claude session: ${sessionId}`);
191
+ return true;
192
+ }
193
+ async endSession() {
194
+ this.currentSessionId = undefined;
195
+ logger_1.default.info("Ended Claude session");
196
+ }
197
+ async getStatus() {
198
+ return {
199
+ ready: true,
200
+ sessionId: this.currentSessionId,
201
+ messageCount: this.messageCount,
202
+ };
203
+ }
204
+ async cleanup() {
205
+ this.currentSessionId = undefined;
206
+ this.messageCount = 0;
207
+ }
208
+ resolveClaudeCli() {
209
+ if (environment_1.default.CLAUDE_CLI_PATH) {
210
+ return environment_1.default.CLAUDE_CLI_PATH;
211
+ }
212
+ // Use system-installed claude CLI
213
+ const possiblePaths = [
214
+ "/Users/christianschindler/.local/bin/claude",
215
+ "/usr/local/bin/claude",
216
+ "claude", // Will use PATH
217
+ ];
218
+ const fs = require("fs");
219
+ for (const cliPath of possiblePaths) {
220
+ if (cliPath === "claude" || fs.existsSync(cliPath)) {
221
+ return cliPath;
222
+ }
223
+ }
224
+ throw new Error("Claude CLI not found. Install it from https://claude.ai/download");
225
+ }
226
+ }
227
+ exports.ClaudeProvider = ClaudeProvider;
228
+ exports.default = ClaudeProvider;
229
+ //# sourceMappingURL=ClaudeProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeProvider.js","sourceRoot":"","sources":["../../../src/services/llm/ClaudeProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { LLMProviderBase, LLMProviderConfig, SendMessageParams, SendMessageResult, ProviderStatus } from "./LLMProviderBase";
2
+ export declare class CodexProvider extends LLMProviderBase {
3
+ private currentThreadId?;
4
+ constructor(providerConfig: LLMProviderConfig);
5
+ initialize(): Promise<void>;
6
+ sendMessage(params: SendMessageParams): Promise<SendMessageResult>;
7
+ private handleJSONLResponse;
8
+ resumeSession(sessionId: string): Promise<boolean>;
9
+ endSession(): Promise<void>;
10
+ getStatus(): Promise<ProviderStatus>;
11
+ cleanup(): Promise<void>;
12
+ private resolveCodexBinary;
13
+ }
14
+ export default CodexProvider;
15
+ //# sourceMappingURL=CodexProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodexProvider.d.ts","sourceRoot":"","sources":["../../../src/services/llm/CodexProvider.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAK3B,qBAAa,aAAc,SAAQ,eAAe;IAChD,OAAO,CAAC,eAAe,CAAC,CAAS;gBAErB,cAAc,EAAE,iBAAiB;IAIvC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkC3B,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YA+C1D,mBAAmB;IAyK3B,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMlD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAQpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,OAAO,CAAC,kBAAkB;CAsD3B;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,301 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CodexProvider = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const readline_1 = __importDefault(require("readline"));
11
+ const LLMProviderBase_1 = require("./LLMProviderBase");
12
+ const models_1 = require("../../models");
13
+ const environment_1 = __importDefault(require("../../config/environment"));
14
+ const logger_1 = __importDefault(require("../../utils/logger"));
15
+ class CodexProvider extends LLMProviderBase_1.LLMProviderBase {
16
+ constructor(providerConfig) {
17
+ super(providerConfig);
18
+ }
19
+ async initialize() {
20
+ logger_1.default.info(`Initializing Codex provider for working directory: ${this.config.workingDirectory}`);
21
+ // Set environment for Codex CLI - use absolute path
22
+ const codexHome = path_1.default.resolve(environment_1.default.DATA_DIR, "codex");
23
+ // Ensure codex home directory exists
24
+ const fs = require("fs");
25
+ if (!fs.existsSync(codexHome)) {
26
+ fs.mkdirSync(codexHome, { recursive: true });
27
+ logger_1.default.info(`Created Codex home directory: ${codexHome}`);
28
+ }
29
+ this.env = {
30
+ ...process.env,
31
+ CODEX_HOME: codexHome,
32
+ };
33
+ // Verify auth token exists
34
+ const token = await models_1.AuthToken.findByPk(this.config.tokenId);
35
+ if (!token || token.provider !== "codex") {
36
+ throw new Error("Invalid Codex auth token");
37
+ }
38
+ // Use thread ID from config if provided
39
+ if (this.config.sessionId) {
40
+ this.currentThreadId = this.config.sessionId;
41
+ }
42
+ logger_1.default.info("Codex provider initialized");
43
+ }
44
+ async sendMessage(params) {
45
+ const { content, systemPrompt, onChunk } = params;
46
+ // Build CLI arguments
47
+ const args = ["exec", "--experimental-json", "--skip-git-repo-check"];
48
+ // Only specify model if it's not "default" (ChatGPT accounts may not support custom models)
49
+ if (this.config.model && this.config.model !== "default") {
50
+ args.push("--model", this.config.model);
51
+ }
52
+ if (this.currentThreadId) {
53
+ args.push("resume", this.currentThreadId);
54
+ }
55
+ // Spawn Codex CLI
56
+ const binaryPath = this.resolveCodexBinary();
57
+ // Use absolute path for CODEX_HOME
58
+ const codexHome = path_1.default.resolve(environment_1.default.DATA_DIR, "codex");
59
+ // Build clean env with only CODEX_HOME set explicitly
60
+ const spawnEnv = {
61
+ ...process.env,
62
+ CODEX_HOME: codexHome,
63
+ };
64
+ logger_1.default.info(`Spawning Codex CLI: ${binaryPath} ${args.join(" ")}`, {
65
+ CODEX_HOME: codexHome,
66
+ });
67
+ const child = (0, child_process_1.spawn)(binaryPath, args, {
68
+ env: spawnEnv,
69
+ cwd: this.config.workingDirectory,
70
+ stdio: ["pipe", "pipe", "pipe"], // Need stdin for prompt, stdout/stderr for output
71
+ });
72
+ // Write prompt to stdin
73
+ if (child.stdin) {
74
+ const fullPrompt = systemPrompt
75
+ ? `${systemPrompt}\n\n${content}`
76
+ : content;
77
+ child.stdin.write(fullPrompt);
78
+ child.stdin.end();
79
+ }
80
+ return this.handleJSONLResponse(child, onChunk);
81
+ }
82
+ async handleJSONLResponse(child, onChunk) {
83
+ let fullContent = "";
84
+ let threadId;
85
+ let usage = { input: 0, output: 0, total: 0 };
86
+ let stderrOutput = "";
87
+ // Capture stderr for debugging
88
+ child.stderr?.on("data", (data) => {
89
+ const chunk = data.toString();
90
+ stderrOutput += chunk;
91
+ logger_1.default.info("Codex stderr:", chunk);
92
+ });
93
+ // Log process exit
94
+ child.on("exit", (code, signal) => {
95
+ logger_1.default.info("Codex process exited", {
96
+ code,
97
+ signal,
98
+ stderrLength: stderrOutput.length,
99
+ });
100
+ if (stderrOutput) {
101
+ logger_1.default.info("Codex stderr output:", stderrOutput);
102
+ }
103
+ });
104
+ child.on("error", (error) => {
105
+ logger_1.default.error("Codex spawn error:", error.message);
106
+ });
107
+ const rl = readline_1.default.createInterface({
108
+ input: child.stdout,
109
+ crlfDelay: Infinity,
110
+ });
111
+ for await (const line of rl) {
112
+ logger_1.default.info("Codex JSONL line:", { line });
113
+ try {
114
+ const event = JSON.parse(line);
115
+ logger_1.default.info("Codex parsed event:", {
116
+ type: event.type,
117
+ event: JSON.stringify(event).substring(0, 500),
118
+ });
119
+ if (event.type === "thread.started") {
120
+ threadId = event.thread_id;
121
+ this.currentThreadId = threadId;
122
+ logger_1.default.debug("Codex thread started:", threadId);
123
+ }
124
+ else if (event.type === "item.updated" ||
125
+ event.type === "item.completed") {
126
+ logger_1.default.info("Codex item event:", {
127
+ itemType: event.item?.type,
128
+ hasText: !!event.item?.text,
129
+ textLength: event.item?.text?.length,
130
+ });
131
+ if (event.item?.type === "agent_message" && event.item.text) {
132
+ const chunk = event.item.text;
133
+ fullContent = chunk; // Codex sends full text, not delta
134
+ logger_1.default.info("Codex agent message received:", {
135
+ contentLength: chunk.length,
136
+ });
137
+ if (onChunk) {
138
+ onChunk(chunk);
139
+ }
140
+ }
141
+ else if (event.item?.content) {
142
+ // Alternative format - content array
143
+ const textContent = event.item.content.find((c) => c.type === "text");
144
+ if (textContent?.text) {
145
+ fullContent = textContent.text;
146
+ logger_1.default.info("Codex content array message:", {
147
+ contentLength: fullContent.length,
148
+ });
149
+ if (onChunk) {
150
+ onChunk(fullContent);
151
+ }
152
+ }
153
+ }
154
+ }
155
+ else if (event.type === "message.created" ||
156
+ event.type === "message.completed") {
157
+ // Another possible event format
158
+ logger_1.default.info("Codex message event:", {
159
+ role: event.message?.role,
160
+ hasContent: !!event.message?.content,
161
+ });
162
+ if (event.message?.content) {
163
+ const content = event.message.content;
164
+ if (Array.isArray(content)) {
165
+ const textContent = content.find((c) => c.type === "text" || c.type === "output_text");
166
+ if (textContent?.text) {
167
+ fullContent = textContent.text;
168
+ }
169
+ }
170
+ else if (typeof content === "string") {
171
+ fullContent = content;
172
+ }
173
+ if (fullContent && onChunk) {
174
+ onChunk(fullContent);
175
+ }
176
+ }
177
+ }
178
+ else if (event.type === "turn.completed") {
179
+ if (event.usage) {
180
+ usage = {
181
+ input: event.usage.input_tokens || 0,
182
+ output: event.usage.output_tokens || 0,
183
+ total: (event.usage.input_tokens || 0) +
184
+ (event.usage.output_tokens || 0),
185
+ };
186
+ }
187
+ }
188
+ else if (event.type === "turn.failed" || event.type === "error") {
189
+ let errorMsg = event.error?.message || event.message || "Codex execution failed";
190
+ // Try to parse nested JSON error message
191
+ try {
192
+ if (errorMsg.startsWith("{")) {
193
+ const parsed = JSON.parse(errorMsg);
194
+ errorMsg = parsed.detail || parsed.message || errorMsg;
195
+ }
196
+ }
197
+ catch {
198
+ // Keep original message
199
+ }
200
+ throw new Error(errorMsg);
201
+ }
202
+ }
203
+ catch (error) {
204
+ // Re-throw errors from turn.failed/error events
205
+ if (error instanceof Error) {
206
+ const msg = error.message;
207
+ if (msg.includes("not supported") ||
208
+ msg.includes("failed") ||
209
+ msg.includes("error") ||
210
+ msg.includes("Error")) {
211
+ throw error;
212
+ }
213
+ }
214
+ // Only warn for JSON parsing issues
215
+ if (error instanceof SyntaxError) {
216
+ logger_1.default.warn("Failed to parse Codex JSONL event:", line);
217
+ }
218
+ else {
219
+ throw error;
220
+ }
221
+ }
222
+ }
223
+ this.messageCount++;
224
+ logger_1.default.info("Codex response completed", {
225
+ contentLength: fullContent.length,
226
+ threadId,
227
+ usage,
228
+ });
229
+ return {
230
+ content: fullContent,
231
+ tokenUsage: usage,
232
+ sessionId: threadId,
233
+ };
234
+ }
235
+ async resumeSession(sessionId) {
236
+ this.currentThreadId = sessionId;
237
+ logger_1.default.info(`Resumed Codex thread: ${sessionId}`);
238
+ return true;
239
+ }
240
+ async endSession() {
241
+ this.currentThreadId = undefined;
242
+ logger_1.default.info("Ended Codex thread");
243
+ }
244
+ async getStatus() {
245
+ return {
246
+ ready: true,
247
+ sessionId: this.currentThreadId,
248
+ messageCount: this.messageCount,
249
+ };
250
+ }
251
+ async cleanup() {
252
+ this.currentThreadId = undefined;
253
+ this.messageCount = 0;
254
+ }
255
+ resolveCodexBinary() {
256
+ if (environment_1.default.CODEX_CLI_PATH) {
257
+ return environment_1.default.CODEX_CLI_PATH;
258
+ }
259
+ // Determine platform triple
260
+ const platform = os_1.default.platform();
261
+ const arch = os_1.default.arch();
262
+ let triple;
263
+ if (platform === "linux") {
264
+ triple =
265
+ arch === "arm64"
266
+ ? "aarch64-unknown-linux-musl"
267
+ : "x86_64-unknown-linux-musl";
268
+ }
269
+ else if (platform === "darwin") {
270
+ triple =
271
+ arch === "arm64" ? "aarch64-apple-darwin" : "x86_64-apple-darwin";
272
+ }
273
+ else if (platform === "win32") {
274
+ triple =
275
+ arch === "arm64" ? "aarch64-pc-windows-msvc" : "x86_64-pc-windows-msvc";
276
+ }
277
+ else {
278
+ throw new Error(`Unsupported platform: ${platform}`);
279
+ }
280
+ const fs = require("fs");
281
+ const binaryName = platform === "win32" ? "codex.exe" : "codex";
282
+ // Search for the SDK in node_modules directories relative to working directory
283
+ const searchPaths = [
284
+ // Direct in current working directory (backend/)
285
+ path_1.default.join(process.cwd(), "node_modules", "@openai", "codex-sdk"),
286
+ // Hoisted to workspace root (one level up from backend/)
287
+ path_1.default.join(process.cwd(), "..", "node_modules", "@openai", "codex-sdk"),
288
+ ];
289
+ for (const sdkDir of searchPaths) {
290
+ const binaryPath = path_1.default.join(sdkDir, "vendor", triple, "codex", binaryName);
291
+ if (fs.existsSync(binaryPath)) {
292
+ logger_1.default.debug(`Found Codex binary at: ${binaryPath}`);
293
+ return binaryPath;
294
+ }
295
+ }
296
+ throw new Error(`Codex SDK binary not found. Install it with: npm install @openai/codex-sdk`);
297
+ }
298
+ }
299
+ exports.CodexProvider = CodexProvider;
300
+ exports.default = CodexProvider;
301
+ //# sourceMappingURL=CodexProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodexProvider.js","sourceRoot":"","sources":["../../../src/services/llm/CodexProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { LLMProviderBase, LLMProviderConfig, SendMessageParams, SendMessageResult, ProviderStatus } from "./LLMProviderBase";
2
+ export declare class GeminiProvider extends LLMProviderBase {
3
+ private currentSessionId?;
4
+ private geminiHome;
5
+ constructor(providerConfig: LLMProviderConfig);
6
+ initialize(): Promise<void>;
7
+ sendMessage(params: SendMessageParams): Promise<SendMessageResult>;
8
+ private handleJsonResponse;
9
+ private handleStreamingResponse;
10
+ resumeSession(sessionId: string): Promise<boolean>;
11
+ endSession(): Promise<void>;
12
+ getStatus(): Promise<ProviderStatus>;
13
+ cleanup(): Promise<void>;
14
+ private resolveGeminiCli;
15
+ }
16
+ export default GeminiProvider;
17
+ //# sourceMappingURL=GeminiProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiProvider.d.ts","sourceRoot":"","sources":["../../../src/services/llm/GeminiProvider.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAc3B,qBAAa,cAAe,SAAQ,eAAe;IACjD,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAClC,OAAO,CAAC,UAAU,CAAS;gBAEf,cAAc,EAAE,iBAAiB;IAMvC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B3B,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAsC1D,kBAAkB;YAyDlB,uBAAuB;IA6C/B,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMlD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAQpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,OAAO,CAAC,gBAAgB;CAczB;AAED,eAAe,cAAc,CAAC"}