@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,190 @@
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.GeminiProvider = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const path_1 = __importDefault(require("path"));
9
+ const readline_1 = __importDefault(require("readline"));
10
+ const LLMProviderBase_1 = require("./LLMProviderBase");
11
+ const models_1 = require("../../models");
12
+ const environment_1 = __importDefault(require("../../config/environment"));
13
+ const logger_1 = __importDefault(require("../../utils/logger"));
14
+ class GeminiProvider extends LLMProviderBase_1.LLMProviderBase {
15
+ constructor(providerConfig) {
16
+ super(providerConfig);
17
+ // Use absolute path for gemini home
18
+ this.geminiHome = path_1.default.resolve(environment_1.default.DATA_DIR, "gemini");
19
+ }
20
+ async initialize() {
21
+ logger_1.default.info(`Initializing Gemini provider for working directory: ${this.config.workingDirectory}`);
22
+ // Set environment for Gemini CLI
23
+ // Gemini CLI looks for credentials in HOME/.gemini
24
+ this.env = {
25
+ ...process.env,
26
+ HOME: this.geminiHome,
27
+ };
28
+ // Verify auth token exists
29
+ const token = await models_1.AuthToken.findByPk(this.config.tokenId);
30
+ if (!token || token.provider !== "gemini") {
31
+ throw new Error("Invalid Gemini auth token");
32
+ }
33
+ // Use session ID from config if provided
34
+ if (this.config.sessionId) {
35
+ this.currentSessionId = this.config.sessionId;
36
+ }
37
+ logger_1.default.info("Gemini provider initialized");
38
+ }
39
+ async sendMessage(params) {
40
+ const { content, systemPrompt, onChunk } = params;
41
+ // Build CLI arguments
42
+ const args = ["--output-format", onChunk ? "stream-json" : "json"];
43
+ // Only specify model if it's not "default" - let Gemini use its default
44
+ if (this.config.model && this.config.model !== "default") {
45
+ args.push("--model", this.config.model);
46
+ }
47
+ if (this.currentSessionId) {
48
+ args.push("--resume", this.currentSessionId);
49
+ }
50
+ // Spawn Gemini CLI
51
+ const cliPath = this.resolveGeminiCli();
52
+ const child = (0, child_process_1.spawn)("node", [cliPath, ...args], {
53
+ env: this.env,
54
+ cwd: this.config.workingDirectory,
55
+ });
56
+ // Write prompt to stdin
57
+ if (child.stdin) {
58
+ const fullPrompt = systemPrompt
59
+ ? `${systemPrompt}\n\n${content}`
60
+ : content;
61
+ child.stdin.write(fullPrompt);
62
+ child.stdin.end();
63
+ }
64
+ if (onChunk) {
65
+ return this.handleStreamingResponse(child, onChunk);
66
+ }
67
+ else {
68
+ return this.handleJsonResponse(child);
69
+ }
70
+ }
71
+ async handleJsonResponse(child) {
72
+ let stdout = "";
73
+ let stderr = "";
74
+ child.stdout?.on("data", (data) => {
75
+ stdout += data.toString();
76
+ });
77
+ child.stderr?.on("data", (data) => {
78
+ stderr += data.toString();
79
+ });
80
+ return new Promise((resolve, reject) => {
81
+ child.on("close", (code) => {
82
+ if (code !== 0) {
83
+ logger_1.default.error("Gemini CLI failed:", stderr);
84
+ reject(new Error(`Gemini CLI exited with code ${code}: ${stderr}`));
85
+ return;
86
+ }
87
+ try {
88
+ const output = JSON.parse(stdout);
89
+ if (output.session_id) {
90
+ this.currentSessionId = output.session_id;
91
+ }
92
+ const result = {
93
+ content: output.response || "",
94
+ tokenUsage: {
95
+ input: output.stats?.input_tokens || 0,
96
+ output: output.stats?.output_tokens || 0,
97
+ total: (output.stats?.input_tokens || 0) +
98
+ (output.stats?.output_tokens || 0),
99
+ },
100
+ sessionId: this.currentSessionId,
101
+ };
102
+ this.messageCount++;
103
+ resolve(result);
104
+ }
105
+ catch (error) {
106
+ const message = error instanceof Error ? error.message : String(error);
107
+ reject(new Error(`Failed to parse Gemini response: ${message}`));
108
+ }
109
+ });
110
+ child.on("error", (error) => {
111
+ const message = error instanceof Error ? error.message : String(error);
112
+ reject(new Error(`Failed to spawn Gemini CLI: ${message}`));
113
+ });
114
+ });
115
+ }
116
+ async handleStreamingResponse(child, onChunk) {
117
+ let fullContent = "";
118
+ let sessionId;
119
+ let usage = { input: 0, output: 0, total: 0 };
120
+ const rl = readline_1.default.createInterface({
121
+ input: child.stdout,
122
+ crlfDelay: Infinity,
123
+ });
124
+ for await (const line of rl) {
125
+ try {
126
+ const event = JSON.parse(line);
127
+ if (event.type === "init" && event.session_id) {
128
+ sessionId = event.session_id;
129
+ this.currentSessionId = sessionId;
130
+ }
131
+ else if (event.type === "message") {
132
+ const chunk = event.content || "";
133
+ fullContent += chunk;
134
+ onChunk(chunk);
135
+ }
136
+ else if (event.type === "error") {
137
+ throw new Error(event.message || "Gemini execution failed");
138
+ }
139
+ }
140
+ catch (error) {
141
+ const message = error instanceof Error ? error.message : String(error);
142
+ if (message?.includes("failed")) {
143
+ throw error;
144
+ }
145
+ logger_1.default.warn("Failed to parse Gemini streaming event:", line);
146
+ }
147
+ }
148
+ this.messageCount++;
149
+ return {
150
+ content: fullContent,
151
+ tokenUsage: usage,
152
+ sessionId,
153
+ };
154
+ }
155
+ async resumeSession(sessionId) {
156
+ this.currentSessionId = sessionId;
157
+ logger_1.default.info(`Resumed Gemini session: ${sessionId}`);
158
+ return true;
159
+ }
160
+ async endSession() {
161
+ this.currentSessionId = undefined;
162
+ logger_1.default.info("Ended Gemini session");
163
+ }
164
+ async getStatus() {
165
+ return {
166
+ ready: true,
167
+ sessionId: this.currentSessionId,
168
+ messageCount: this.messageCount,
169
+ };
170
+ }
171
+ async cleanup() {
172
+ this.currentSessionId = undefined;
173
+ this.messageCount = 0;
174
+ }
175
+ resolveGeminiCli() {
176
+ if (environment_1.default.GEMINI_CLI_PATH) {
177
+ return environment_1.default.GEMINI_CLI_PATH;
178
+ }
179
+ try {
180
+ // require.resolve already returns the full path to dist/index.js
181
+ return require.resolve("@google/gemini-cli");
182
+ }
183
+ catch (error) {
184
+ throw new Error("Gemini CLI not found. Install it with: npm install @google/gemini-cli");
185
+ }
186
+ }
187
+ }
188
+ exports.GeminiProvider = GeminiProvider;
189
+ exports.default = GeminiProvider;
190
+ //# sourceMappingURL=GeminiProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiProvider.js","sourceRoot":"","sources":["../../../src/services/llm/GeminiProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { LLMProvider } from '../../models';
2
+ export interface LLMProviderConfig {
3
+ provider: LLMProvider;
4
+ tokenId: string;
5
+ workingDirectory: string;
6
+ model?: string;
7
+ sessionId?: string;
8
+ }
9
+ export interface SendMessageParams {
10
+ content: string;
11
+ systemPrompt?: string;
12
+ attachments?: string[];
13
+ onChunk?: (chunk: string) => void;
14
+ }
15
+ export interface SendMessageResult {
16
+ content: string;
17
+ toolCalls?: any[];
18
+ tokenUsage: {
19
+ input: number;
20
+ output: number;
21
+ total: number;
22
+ };
23
+ sessionId?: string;
24
+ }
25
+ export interface ProviderStatus {
26
+ ready: boolean;
27
+ sessionId?: string;
28
+ messageCount: number;
29
+ }
30
+ /**
31
+ * Base interface for all LLM providers
32
+ */
33
+ export declare abstract class LLMProviderBase {
34
+ protected config: LLMProviderConfig;
35
+ protected env: Record<string, string | undefined>;
36
+ protected messageCount: number;
37
+ constructor(config: LLMProviderConfig);
38
+ /**
39
+ * Initialize the provider
40
+ */
41
+ abstract initialize(): Promise<void>;
42
+ /**
43
+ * Send a message to the LLM
44
+ */
45
+ abstract sendMessage(params: SendMessageParams): Promise<SendMessageResult>;
46
+ /**
47
+ * Resume a previous session
48
+ */
49
+ abstract resumeSession(sessionId: string): Promise<boolean>;
50
+ /**
51
+ * End the current session
52
+ */
53
+ abstract endSession(): Promise<void>;
54
+ /**
55
+ * Get provider status
56
+ */
57
+ abstract getStatus(): Promise<ProviderStatus>;
58
+ /**
59
+ * Cleanup resources
60
+ */
61
+ abstract cleanup(): Promise<void>;
62
+ /**
63
+ * Get provider name
64
+ */
65
+ getProvider(): LLMProvider;
66
+ /**
67
+ * Get working directory
68
+ */
69
+ getWorkingDirectory(): string;
70
+ /**
71
+ * Get model
72
+ */
73
+ getModel(): string | undefined;
74
+ }
75
+ export default LLMProviderBase;
76
+ //# sourceMappingURL=LLMProviderBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LLMProviderBase.d.ts","sourceRoot":"","sources":["../../../src/services/llm/LLMProviderBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,WAAW,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IAClB,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,8BAAsB,eAAe;IACnC,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACpC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAClD,SAAS,CAAC,YAAY,EAAE,MAAM,CAAK;gBAEvB,MAAM,EAAE,iBAAiB;IAKrC;;OAEG;IACH,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAEpC;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAE3E;;OAEG;IACH,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAE3D;;OAEG;IACH,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAEpC;;OAEG;IACH,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAE7C;;OAEG;IACH,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAEjC;;OAEG;IACH,WAAW,IAAI,WAAW;IAI1B;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,QAAQ,IAAI,MAAM,GAAG,SAAS;CAG/B;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LLMProviderBase = void 0;
4
+ /**
5
+ * Base interface for all LLM providers
6
+ */
7
+ class LLMProviderBase {
8
+ constructor(config) {
9
+ this.messageCount = 0;
10
+ this.config = config;
11
+ this.env = { ...process.env };
12
+ }
13
+ /**
14
+ * Get provider name
15
+ */
16
+ getProvider() {
17
+ return this.config.provider;
18
+ }
19
+ /**
20
+ * Get working directory
21
+ */
22
+ getWorkingDirectory() {
23
+ return this.config.workingDirectory;
24
+ }
25
+ /**
26
+ * Get model
27
+ */
28
+ getModel() {
29
+ return this.config.model;
30
+ }
31
+ }
32
+ exports.LLMProviderBase = LLMProviderBase;
33
+ exports.default = LLMProviderBase;
34
+ //# sourceMappingURL=LLMProviderBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LLMProviderBase.js","sourceRoot":"","sources":["../../../src/services/llm/LLMProviderBase.ts"],"names":[],"mappings":";;;AAkCA;;GAEG;AACH,MAAsB,eAAe;IAKnC,YAAY,MAAyB;QAF3B,iBAAY,GAAW,CAAC,CAAC;QAGjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAChC,CAAC;IAgCD;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,CAAC;CACF;AA5DD,0CA4DC;AAED,kBAAe,eAAe,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { LLMProviderBase, LLMProviderConfig } from './LLMProviderBase';
2
+ import { LLMProvider } from '../../models';
3
+ /**
4
+ * Factory for creating LLM provider instances
5
+ */
6
+ export declare class ProviderFactory {
7
+ /**
8
+ * Create and initialize a provider instance
9
+ */
10
+ static create(config: LLMProviderConfig): Promise<LLMProviderBase>;
11
+ /**
12
+ * Check if a provider is available
13
+ */
14
+ static isAvailable(provider: LLMProvider): boolean;
15
+ }
16
+ export default ProviderFactory;
17
+ //# sourceMappingURL=ProviderFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderFactory.d.ts","sourceRoot":"","sources":["../../../src/services/llm/ProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAIvE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,qBAAa,eAAe;IAC1B;;OAEG;WACU,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;IAqBxE;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;CAmBnD;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProviderFactory = void 0;
4
+ const ClaudeProvider_1 = require("./ClaudeProvider");
5
+ const CodexProvider_1 = require("./CodexProvider");
6
+ const GeminiProvider_1 = require("./GeminiProvider");
7
+ /**
8
+ * Factory for creating LLM provider instances
9
+ */
10
+ class ProviderFactory {
11
+ /**
12
+ * Create and initialize a provider instance
13
+ */
14
+ static async create(config) {
15
+ let provider;
16
+ switch (config.provider) {
17
+ case 'claude':
18
+ provider = new ClaudeProvider_1.ClaudeProvider(config);
19
+ break;
20
+ case 'codex':
21
+ provider = new CodexProvider_1.CodexProvider(config);
22
+ break;
23
+ case 'gemini':
24
+ provider = new GeminiProvider_1.GeminiProvider(config);
25
+ break;
26
+ default:
27
+ throw new Error(`Unknown provider: ${config.provider}`);
28
+ }
29
+ await provider.initialize();
30
+ return provider;
31
+ }
32
+ /**
33
+ * Check if a provider is available
34
+ */
35
+ static isAvailable(provider) {
36
+ try {
37
+ switch (provider) {
38
+ case 'claude':
39
+ require.resolve('@anthropic-ai/claude-agent-sdk');
40
+ return true;
41
+ case 'codex':
42
+ require.resolve('@openai/codex-sdk');
43
+ return true;
44
+ case 'gemini':
45
+ require.resolve('@google/gemini-cli');
46
+ return true;
47
+ default:
48
+ return false;
49
+ }
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ }
56
+ exports.ProviderFactory = ProviderFactory;
57
+ exports.default = ProviderFactory;
58
+ //# sourceMappingURL=ProviderFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderFactory.js","sourceRoot":"","sources":["../../../src/services/llm/ProviderFactory.ts"],"names":[],"mappings":";;;AACA,qDAAkD;AAClD,mDAAgD;AAChD,qDAAkD;AAGlD;;GAEG;AACH,MAAa,eAAe;IAC1B;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAyB;QAC3C,IAAI,QAAyB,CAAC;QAE9B,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,QAAQ;gBACX,QAAQ,GAAG,IAAI,+BAAc,CAAC,MAAM,CAAC,CAAC;gBACtC,MAAM;YACR,KAAK,OAAO;gBACV,QAAQ,GAAG,IAAI,6BAAa,CAAC,MAAM,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,QAAQ;gBACX,QAAQ,GAAG,IAAI,+BAAc,CAAC,MAAM,CAAC,CAAC;gBACtC,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAqB;QACtC,IAAI,CAAC;YACH,QAAQ,QAAQ,EAAE,CAAC;gBACjB,KAAK,QAAQ;oBACX,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;oBAClD,OAAO,IAAI,CAAC;gBACd,KAAK,OAAO;oBACV,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;oBACrC,OAAO,IAAI,CAAC;gBACd,KAAK,QAAQ;oBACX,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;oBACtC,OAAO,IAAI,CAAC;gBACd;oBACE,OAAO,KAAK,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AA/CD,0CA+CC;AAED,kBAAe,eAAe,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Encrypt a string using AES-256-GCM
3
+ */
4
+ export declare function encrypt(text: string): string;
5
+ /**
6
+ * Decrypt a string using AES-256-GCM
7
+ */
8
+ export declare function decrypt(encryptedData: string): string;
9
+ /**
10
+ * Generate a random hex string
11
+ */
12
+ export declare function generateRandomHex(bytes?: number): string;
13
+ /**
14
+ * Generate PKCE code verifier (for OAuth)
15
+ */
16
+ export declare function generateCodeVerifier(): string;
17
+ /**
18
+ * Generate PKCE code challenge from verifier
19
+ */
20
+ export declare function generateCodeChallenge(verifier: string): string;
21
+ /**
22
+ * Hash a password using bcrypt (async wrapper)
23
+ */
24
+ export declare function hashPassword(password: string): Promise<string>;
25
+ /**
26
+ * Compare password with hash
27
+ */
28
+ export declare function comparePassword(password: string, hash: string): Promise<boolean>;
29
+ /**
30
+ * Decode JWT without verification (for extracting claims)
31
+ */
32
+ export declare function decodeJWT(token: string): any;
33
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AA4BA;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkB5C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAwBrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,GAAE,MAAW,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIpE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAa5C"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.encrypt = encrypt;
40
+ exports.decrypt = decrypt;
41
+ exports.generateRandomHex = generateRandomHex;
42
+ exports.generateCodeVerifier = generateCodeVerifier;
43
+ exports.generateCodeChallenge = generateCodeChallenge;
44
+ exports.hashPassword = hashPassword;
45
+ exports.comparePassword = comparePassword;
46
+ exports.decodeJWT = decodeJWT;
47
+ const crypto_1 = __importDefault(require("crypto"));
48
+ const ALGORITHM = 'aes-256-gcm';
49
+ const IV_LENGTH = 16;
50
+ const SALT_LENGTH = 64;
51
+ const TAG_LENGTH = 16;
52
+ const KEY_LENGTH = 32;
53
+ /**
54
+ * Get encryption key from environment variable
55
+ */
56
+ function getEncryptionKey() {
57
+ const key = process.env.ENCRYPTION_KEY;
58
+ if (!key) {
59
+ throw new Error('ENCRYPTION_KEY environment variable is not set');
60
+ }
61
+ // If key is hex string, convert to buffer
62
+ if (key.length === KEY_LENGTH * 2) {
63
+ return Buffer.from(key, 'hex');
64
+ }
65
+ // Otherwise, derive key from string using PBKDF2
66
+ const salt = crypto_1.default.createHash('sha256').update(key).digest();
67
+ return crypto_1.default.pbkdf2Sync(key, salt, 100000, KEY_LENGTH, 'sha256');
68
+ }
69
+ /**
70
+ * Encrypt a string using AES-256-GCM
71
+ */
72
+ function encrypt(text) {
73
+ try {
74
+ const key = getEncryptionKey();
75
+ const iv = crypto_1.default.randomBytes(IV_LENGTH);
76
+ const cipher = crypto_1.default.createCipheriv(ALGORITHM, key, iv);
77
+ let encrypted = cipher.update(text, 'utf8', 'hex');
78
+ encrypted += cipher.final('hex');
79
+ const tag = cipher.getAuthTag();
80
+ // Format: iv:tag:encrypted
81
+ return `${iv.toString('hex')}:${tag.toString('hex')}:${encrypted}`;
82
+ }
83
+ catch (error) {
84
+ const message = error instanceof Error ? error.message : String(error);
85
+ throw new Error(`Encryption failed: ${message}`);
86
+ }
87
+ }
88
+ /**
89
+ * Decrypt a string using AES-256-GCM
90
+ */
91
+ function decrypt(encryptedData) {
92
+ try {
93
+ const key = getEncryptionKey();
94
+ const parts = encryptedData.split(':');
95
+ if (parts.length !== 3) {
96
+ throw new Error('Invalid encrypted data format');
97
+ }
98
+ const iv = Buffer.from(parts[0], 'hex');
99
+ const tag = Buffer.from(parts[1], 'hex');
100
+ const encrypted = parts[2];
101
+ const decipher = crypto_1.default.createDecipheriv(ALGORITHM, key, iv);
102
+ decipher.setAuthTag(tag);
103
+ let decrypted = decipher.update(encrypted, 'hex', 'utf8');
104
+ decrypted += decipher.final('utf8');
105
+ return decrypted;
106
+ }
107
+ catch (error) {
108
+ const message = error instanceof Error ? error.message : String(error);
109
+ throw new Error(`Decryption failed: ${message}`);
110
+ }
111
+ }
112
+ /**
113
+ * Generate a random hex string
114
+ */
115
+ function generateRandomHex(bytes = 32) {
116
+ return crypto_1.default.randomBytes(bytes).toString('hex');
117
+ }
118
+ /**
119
+ * Generate PKCE code verifier (for OAuth)
120
+ */
121
+ function generateCodeVerifier() {
122
+ return crypto_1.default.randomBytes(32).toString('base64url');
123
+ }
124
+ /**
125
+ * Generate PKCE code challenge from verifier
126
+ */
127
+ function generateCodeChallenge(verifier) {
128
+ return crypto_1.default
129
+ .createHash('sha256')
130
+ .update(verifier)
131
+ .digest('base64url');
132
+ }
133
+ /**
134
+ * Hash a password using bcrypt (async wrapper)
135
+ */
136
+ async function hashPassword(password) {
137
+ const bcrypt = await Promise.resolve().then(() => __importStar(require('bcrypt')));
138
+ const saltRounds = 10;
139
+ return bcrypt.hash(password, saltRounds);
140
+ }
141
+ /**
142
+ * Compare password with hash
143
+ */
144
+ async function comparePassword(password, hash) {
145
+ const bcrypt = await Promise.resolve().then(() => __importStar(require('bcrypt')));
146
+ return bcrypt.compare(password, hash);
147
+ }
148
+ /**
149
+ * Decode JWT without verification (for extracting claims)
150
+ */
151
+ function decodeJWT(token) {
152
+ try {
153
+ const parts = token.split('.');
154
+ if (parts.length !== 3) {
155
+ throw new Error('Invalid JWT format');
156
+ }
157
+ const payload = Buffer.from(parts[1], 'base64url').toString('utf8');
158
+ return JSON.parse(payload);
159
+ }
160
+ catch (error) {
161
+ const message = error instanceof Error ? error.message : String(error);
162
+ throw new Error(`JWT decode failed: ${message}`);
163
+ }
164
+ }
165
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import winston from 'winston';
2
+ declare const logger: winston.Logger;
3
+ export default logger;
4
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAwB9B,QAAA,MAAM,MAAM,gBAUV,CAAC;AAwBH,eAAe,MAAM,CAAC"}