@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,178 @@
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.TokenRefreshService = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const promises_1 = __importDefault(require("fs/promises"));
9
+ const models_1 = require("../../models");
10
+ const ClaudeAuthService_1 = require("./ClaudeAuthService");
11
+ const crypto_1 = require("../../utils/crypto");
12
+ const environment_1 = __importDefault(require("../../config/environment"));
13
+ const logger_1 = __importDefault(require("../../utils/logger"));
14
+ const CHECK_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
15
+ const REFRESH_THRESHOLD_PERCENT = 75; // Refresh at 75% lifetime
16
+ class TokenRefreshService {
17
+ constructor() {
18
+ this.refreshIntervals = new Map();
19
+ }
20
+ static getInstance() {
21
+ if (!TokenRefreshService.instance) {
22
+ TokenRefreshService.instance = new TokenRefreshService();
23
+ }
24
+ return TokenRefreshService.instance;
25
+ }
26
+ /**
27
+ * Start monitoring a token for refresh
28
+ */
29
+ start(tokenId) {
30
+ if (this.refreshIntervals.has(tokenId)) {
31
+ logger_1.default.debug(`Token ${tokenId} already being monitored`);
32
+ return;
33
+ }
34
+ const interval = setInterval(() => {
35
+ this.checkAndRefresh(tokenId).catch((error) => {
36
+ logger_1.default.error(`Error in token refresh check for ${tokenId}:`, error);
37
+ });
38
+ }, CHECK_INTERVAL_MS);
39
+ this.refreshIntervals.set(tokenId, interval);
40
+ // Initial check
41
+ this.checkAndRefresh(tokenId).catch((error) => {
42
+ logger_1.default.error(`Error in initial token refresh check for ${tokenId}:`, error);
43
+ });
44
+ logger_1.default.info(`Started token refresh monitoring for ${tokenId}`);
45
+ }
46
+ /**
47
+ * Stop monitoring a token
48
+ */
49
+ stop(tokenId) {
50
+ const interval = this.refreshIntervals.get(tokenId);
51
+ if (interval) {
52
+ clearInterval(interval);
53
+ this.refreshIntervals.delete(tokenId);
54
+ logger_1.default.info(`Stopped token refresh monitoring for ${tokenId}`);
55
+ }
56
+ }
57
+ /**
58
+ * Stop all token monitoring
59
+ */
60
+ stopAll() {
61
+ this.refreshIntervals.forEach((interval) => clearInterval(interval));
62
+ this.refreshIntervals.clear();
63
+ logger_1.default.info('Stopped all token refresh monitoring');
64
+ }
65
+ /**
66
+ * Check if token needs refresh and refresh if needed
67
+ */
68
+ async checkAndRefresh(tokenId) {
69
+ const token = await models_1.AuthToken.findByPk(tokenId);
70
+ if (!token || !token.isActive) {
71
+ this.stop(tokenId);
72
+ return;
73
+ }
74
+ if (!this.shouldRefresh(token)) {
75
+ return;
76
+ }
77
+ try {
78
+ logger_1.default.info(`Refreshing token ${tokenId} (${token.provider})`);
79
+ const refreshed = await this.refreshToken(token);
80
+ // 1. Update database
81
+ await token.update({
82
+ accessToken: (0, crypto_1.encrypt)(refreshed.accessToken),
83
+ refreshToken: refreshed.refreshToken ? (0, crypto_1.encrypt)(refreshed.refreshToken) : token.refreshToken,
84
+ expiresAt: refreshed.expiresAt,
85
+ lastRefreshed: new Date(),
86
+ });
87
+ // 2. Update credential file (WICHTIG für Persistenz!)
88
+ await this.updateCredentialFile(token.provider, refreshed);
89
+ logger_1.default.info(`Token ${tokenId} refreshed and synced to file successfully`);
90
+ }
91
+ catch (error) {
92
+ logger_1.default.error(`Failed to refresh token ${tokenId}:`, error instanceof Error ? error.message : String(error));
93
+ // Deactivate token if refresh fails critically
94
+ const errorMessage = error instanceof Error ? error.message : String(error);
95
+ if (errorMessage.includes('invalid_grant') || errorMessage.includes('unauthorized')) {
96
+ await token.update({ isActive: false });
97
+ this.stop(tokenId);
98
+ logger_1.default.warn(`Deactivated token ${tokenId} due to refresh failure`);
99
+ }
100
+ }
101
+ }
102
+ /**
103
+ * Determine if token should be refreshed
104
+ */
105
+ shouldRefresh(token) {
106
+ if (!token.expiresAt || !token.issuedAt) {
107
+ return false;
108
+ }
109
+ const now = Date.now();
110
+ const totalLifetime = token.expiresAt.getTime() - token.issuedAt.getTime();
111
+ const elapsed = now - token.issuedAt.getTime();
112
+ const percentElapsed = (elapsed / totalLifetime) * 100;
113
+ return percentElapsed >= REFRESH_THRESHOLD_PERCENT;
114
+ }
115
+ /**
116
+ * Refresh token using provider-specific service
117
+ */
118
+ async refreshToken(token) {
119
+ switch (token.provider) {
120
+ case 'claude': {
121
+ const claudeAuth = new ClaudeAuthService_1.ClaudeAuthService();
122
+ return await claudeAuth.refreshToken(token);
123
+ }
124
+ case 'codex':
125
+ case 'gemini':
126
+ // Codex and Gemini use long-lived tokens, no refresh needed
127
+ throw new Error(`Token refresh not implemented for ${token.provider}`);
128
+ default:
129
+ throw new Error(`Unknown provider: ${token.provider}`);
130
+ }
131
+ }
132
+ /**
133
+ * Update credential file with refreshed tokens
134
+ */
135
+ async updateCredentialFile(provider, refreshed) {
136
+ const dataDir = path_1.default.join(environment_1.default.DATA_DIR, provider);
137
+ try {
138
+ switch (provider) {
139
+ case 'claude': {
140
+ const credPath = path_1.default.join(dataDir, '.credentials.json');
141
+ const existing = JSON.parse(await promises_1.default.readFile(credPath, 'utf8'));
142
+ existing.accessToken = refreshed.accessToken;
143
+ existing.refreshToken = refreshed.refreshToken || existing.refreshToken;
144
+ existing.expiresAt = refreshed.expiresAt.getTime();
145
+ existing.issuedAt = Date.now();
146
+ await promises_1.default.writeFile(credPath, JSON.stringify(existing, null, 2), { mode: 0o600 });
147
+ break;
148
+ }
149
+ case 'codex': {
150
+ const authPath = path_1.default.join(dataDir, 'auth.json');
151
+ const existing = JSON.parse(await promises_1.default.readFile(authPath, 'utf8'));
152
+ existing.tokens.access_token = refreshed.accessToken;
153
+ existing.tokens.refresh_token = refreshed.refreshToken || existing.tokens.refresh_token;
154
+ existing.last_refresh = new Date().toISOString();
155
+ await promises_1.default.writeFile(authPath, JSON.stringify(existing, null, 2), { mode: 0o600 });
156
+ break;
157
+ }
158
+ case 'gemini': {
159
+ const credPath = path_1.default.join(dataDir, 'oauth_creds.json');
160
+ const existing = JSON.parse(await promises_1.default.readFile(credPath, 'utf8'));
161
+ existing.token = refreshed.accessToken;
162
+ existing.refresh_token = refreshed.refreshToken || existing.refresh_token;
163
+ existing.expiry_date = refreshed.expiresAt.getTime();
164
+ await promises_1.default.writeFile(credPath, JSON.stringify(existing, null, 2), { mode: 0o600 });
165
+ break;
166
+ }
167
+ }
168
+ logger_1.default.debug(`Updated ${provider} credential file`);
169
+ }
170
+ catch (error) {
171
+ logger_1.default.error(`Failed to update ${provider} credential file:`, error instanceof Error ? error.message : String(error));
172
+ throw error;
173
+ }
174
+ }
175
+ }
176
+ exports.TokenRefreshService = TokenRefreshService;
177
+ exports.default = TokenRefreshService;
178
+ //# sourceMappingURL=TokenRefreshService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenRefreshService.js","sourceRoot":"","sources":["../../../src/services/auth/TokenRefreshService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { Conversation, Message } from "../../models";
2
+ import { LLMProviderBase } from "../llm/LLMProviderBase";
3
+ import { LLMProvider } from "../../models/AuthToken";
4
+ export interface ConversationCreateParams {
5
+ jobId: string;
6
+ provider: LLMProvider;
7
+ model?: string;
8
+ title?: string;
9
+ systemPrompt?: string;
10
+ }
11
+ export interface ConversationUpdateParams {
12
+ title?: string;
13
+ isActive?: boolean;
14
+ systemPrompt?: string;
15
+ }
16
+ export interface MessageSendParams {
17
+ conversationId: string;
18
+ content: string;
19
+ attachments?: string[];
20
+ onChunk?: (chunk: string) => void;
21
+ }
22
+ export declare class ConversationService {
23
+ /**
24
+ * Create a new conversation
25
+ */
26
+ static createConversation(params: ConversationCreateParams): Promise<{
27
+ conversation: Conversation;
28
+ provider: LLMProviderBase;
29
+ }>;
30
+ /**
31
+ * Get default model for provider
32
+ */
33
+ static getDefaultModel(provider: LLMProvider): string;
34
+ /**
35
+ * Get conversations by job
36
+ */
37
+ static getConversationsByJob(jobId: string, params?: {
38
+ provider?: LLMProvider;
39
+ isActive?: boolean;
40
+ limit?: number;
41
+ offset?: number;
42
+ }): Promise<{
43
+ conversations: Conversation[];
44
+ total: number;
45
+ }>;
46
+ /**
47
+ * Get conversation by ID
48
+ */
49
+ static getConversation(conversationId: string): Promise<Conversation | null>;
50
+ /**
51
+ * Update conversation
52
+ */
53
+ static updateConversation(conversationId: string, params: ConversationUpdateParams): Promise<Conversation>;
54
+ /**
55
+ * Send message in conversation
56
+ */
57
+ static sendMessage(params: MessageSendParams): Promise<{
58
+ userMessage: Message;
59
+ assistantMessage: Message;
60
+ }>;
61
+ /**
62
+ * Get or restore provider for conversation
63
+ */
64
+ static getOrRestoreProvider(conversation: Conversation): Promise<LLMProviderBase>;
65
+ /**
66
+ * Get conversation messages
67
+ */
68
+ static getMessages(conversationId: string, params: {
69
+ limit?: number;
70
+ offset?: number;
71
+ }): Promise<{
72
+ messages: Message[];
73
+ total: number;
74
+ hasMore: boolean;
75
+ }>;
76
+ /**
77
+ * Delete conversation
78
+ */
79
+ static deleteConversation(conversationId: string): Promise<void>;
80
+ /**
81
+ * Get available providers with their auth status
82
+ */
83
+ static getAvailableProviders(): Promise<{
84
+ provider: LLMProvider;
85
+ isAuthenticated: boolean;
86
+ }[]>;
87
+ }
88
+ export default ConversationService;
89
+ //# sourceMappingURL=ConversationService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationService.d.ts","sourceRoot":"","sources":["../../../src/services/conversation/ConversationService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAkB,MAAM,cAAc,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAMrD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,qBAAa,mBAAmB;IAC9B;;OAEG;WACU,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC;QACzE,YAAY,EAAE,YAAY,CAAC;QAC3B,QAAQ,EAAE,eAAe,CAAC;KAC3B,CAAC;IAiDF;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM;IAarD;;OAEG;WACU,qBAAqB,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,GAAE;QACN,QAAQ,CAAC,EAAE,WAAW,CAAC;QACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACZ,GACL,OAAO,CAAC;QAAE,aAAa,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB5D;;OAEG;WACU,eAAe,CAC1B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAI/B;;OAEG;WACU,kBAAkB,CAC7B,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,YAAY,CAAC;IAiBxB;;OAEG;WACU,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAC3D,WAAW,EAAE,OAAO,CAAC;QACrB,gBAAgB,EAAE,OAAO,CAAC;KAC3B,CAAC;IAwDF;;OAEG;WACU,oBAAoB,CAC/B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,eAAe,CAAC;IAwC3B;;OAEG;WACU,WAAW,CACtB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAiBpE;;OAEG;WACU,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBtE;;OAEG;WACU,qBAAqB,IAAI,OAAO,CAC3C;QAAE,QAAQ,EAAE,WAAW,CAAC;QAAC,eAAe,EAAE,OAAO,CAAA;KAAE,EAAE,CACtD;CAgBF;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,255 @@
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.ConversationService = void 0;
7
+ const models_1 = require("../../models");
8
+ const ProviderFactory_1 = require("../llm/ProviderFactory");
9
+ const JobService_1 = require("../job/JobService");
10
+ const logger_1 = __importDefault(require("../../utils/logger"));
11
+ // In-memory cache for active providers
12
+ const providerCache = new Map();
13
+ class ConversationService {
14
+ /**
15
+ * Create a new conversation
16
+ */
17
+ static async createConversation(params) {
18
+ const job = await models_1.Job.findByPk(params.jobId);
19
+ if (!job) {
20
+ throw new Error("Job not found");
21
+ }
22
+ // Get active auth token for the specified provider
23
+ const token = await models_1.AuthToken.findOne({
24
+ where: { provider: params.provider, isActive: true },
25
+ });
26
+ if (!token) {
27
+ throw new Error(`No active ${params.provider} authentication found`);
28
+ }
29
+ // Determine model - use provided, or default based on provider
30
+ const model = params.model || this.getDefaultModel(params.provider);
31
+ // Create conversation
32
+ const conversation = await models_1.Conversation.create({
33
+ jobId: params.jobId,
34
+ provider: params.provider,
35
+ model,
36
+ title: params.title,
37
+ systemPrompt: params.systemPrompt || job.systemPrompt,
38
+ isActive: true,
39
+ messageCount: 0,
40
+ });
41
+ // Initialize LLM provider
42
+ const provider = await ProviderFactory_1.ProviderFactory.create({
43
+ provider: params.provider,
44
+ tokenId: token.id,
45
+ workingDirectory: job.workingDirectory,
46
+ model: conversation.model,
47
+ });
48
+ // Cache provider
49
+ providerCache.set(conversation.id, provider);
50
+ // Update job statistics
51
+ await JobService_1.JobService.updateJobStatistics(params.jobId);
52
+ logger_1.default.info(`Created conversation: ${conversation.id} with provider: ${params.provider}`);
53
+ return { conversation, provider };
54
+ }
55
+ /**
56
+ * Get default model for provider
57
+ */
58
+ static getDefaultModel(provider) {
59
+ switch (provider) {
60
+ case "claude":
61
+ return "claude-sonnet-4-20250514";
62
+ case "codex":
63
+ return "default"; // Codex CLI uses its own default model
64
+ case "gemini":
65
+ return "gemini-2.5-pro";
66
+ default:
67
+ return "default";
68
+ }
69
+ }
70
+ /**
71
+ * Get conversations by job
72
+ */
73
+ static async getConversationsByJob(jobId, params = {}) {
74
+ const { provider, isActive, limit = 50, offset = 0 } = params;
75
+ const where = { jobId };
76
+ if (provider)
77
+ where.provider = provider;
78
+ if (isActive !== undefined)
79
+ where.isActive = isActive;
80
+ const { rows, count } = await models_1.Conversation.findAndCountAll({
81
+ where,
82
+ limit,
83
+ offset,
84
+ order: [["updatedAt", "DESC"]],
85
+ });
86
+ return { conversations: rows, total: count };
87
+ }
88
+ /**
89
+ * Get conversation by ID
90
+ */
91
+ static async getConversation(conversationId) {
92
+ return await models_1.Conversation.findByPk(conversationId);
93
+ }
94
+ /**
95
+ * Update conversation
96
+ */
97
+ static async updateConversation(conversationId, params) {
98
+ const conversation = await models_1.Conversation.findByPk(conversationId);
99
+ if (!conversation) {
100
+ throw new Error("Conversation not found");
101
+ }
102
+ const updates = {};
103
+ if (params.title !== undefined)
104
+ updates.title = params.title;
105
+ if (params.isActive !== undefined)
106
+ updates.isActive = params.isActive;
107
+ if (params.systemPrompt !== undefined)
108
+ updates.systemPrompt = params.systemPrompt;
109
+ await conversation.update(updates);
110
+ logger_1.default.info(`Updated conversation: ${conversationId}`);
111
+ return conversation;
112
+ }
113
+ /**
114
+ * Send message in conversation
115
+ */
116
+ static async sendMessage(params) {
117
+ const conversation = await models_1.Conversation.findByPk(params.conversationId, {
118
+ include: [{ model: models_1.Job, as: "job" }],
119
+ });
120
+ if (!conversation) {
121
+ throw new Error("Conversation not found");
122
+ }
123
+ // Create user message
124
+ const userMessage = await models_1.Message.create({
125
+ conversationId: params.conversationId,
126
+ role: "user",
127
+ content: params.content,
128
+ attachments: params.attachments
129
+ ? { files: params.attachments }
130
+ : undefined,
131
+ });
132
+ // Get or restore provider
133
+ const provider = await this.getOrRestoreProvider(conversation);
134
+ // Send to LLM
135
+ const response = await provider.sendMessage({
136
+ content: params.content,
137
+ systemPrompt: conversation.systemPrompt,
138
+ attachments: params.attachments,
139
+ onChunk: params.onChunk,
140
+ });
141
+ // Create assistant message
142
+ const assistantMessage = await models_1.Message.create({
143
+ conversationId: params.conversationId,
144
+ role: "assistant",
145
+ content: response.content,
146
+ toolCalls: response.toolCalls,
147
+ tokenUsage: response.tokenUsage,
148
+ model: conversation.model,
149
+ });
150
+ // Update conversation
151
+ await conversation.update({
152
+ sessionId: response.sessionId || conversation.sessionId,
153
+ messageCount: conversation.messageCount + 2,
154
+ totalTokens: (conversation.totalTokens || 0) + response.tokenUsage.total,
155
+ lastMessageAt: new Date(),
156
+ });
157
+ // Update job statistics
158
+ await JobService_1.JobService.updateJobStatistics(conversation.jobId);
159
+ logger_1.default.info(`Sent message in conversation: ${params.conversationId}`);
160
+ return { userMessage, assistantMessage };
161
+ }
162
+ /**
163
+ * Get or restore provider for conversation
164
+ */
165
+ static async getOrRestoreProvider(conversation) {
166
+ // Check cache
167
+ let provider = providerCache.get(conversation.id);
168
+ if (provider) {
169
+ return provider;
170
+ }
171
+ // Get auth token
172
+ const token = await models_1.AuthToken.findOne({
173
+ where: { provider: conversation.provider, isActive: true },
174
+ });
175
+ if (!token) {
176
+ throw new Error("No active authentication");
177
+ }
178
+ // Get job for working directory
179
+ const job = await models_1.Job.findByPk(conversation.jobId);
180
+ if (!job) {
181
+ throw new Error("Job not found");
182
+ }
183
+ // Create new provider
184
+ provider = await ProviderFactory_1.ProviderFactory.create({
185
+ provider: conversation.provider,
186
+ tokenId: token.id,
187
+ workingDirectory: job.workingDirectory,
188
+ model: conversation.model,
189
+ sessionId: conversation.sessionId,
190
+ });
191
+ // Restore session if exists
192
+ if (conversation.sessionId) {
193
+ await provider.resumeSession(conversation.sessionId);
194
+ }
195
+ providerCache.set(conversation.id, provider);
196
+ return provider;
197
+ }
198
+ /**
199
+ * Get conversation messages
200
+ */
201
+ static async getMessages(conversationId, params) {
202
+ const { limit = 20, offset = 0 } = params;
203
+ const { rows, count } = await models_1.Message.findAndCountAll({
204
+ where: { conversationId },
205
+ limit,
206
+ offset,
207
+ order: [["createdAt", "ASC"]],
208
+ });
209
+ return {
210
+ messages: rows,
211
+ total: count,
212
+ hasMore: offset + rows.length < count,
213
+ };
214
+ }
215
+ /**
216
+ * Delete conversation
217
+ */
218
+ static async deleteConversation(conversationId) {
219
+ const conversation = await models_1.Conversation.findByPk(conversationId);
220
+ if (!conversation) {
221
+ throw new Error("Conversation not found");
222
+ }
223
+ const jobId = conversation.jobId;
224
+ // Cleanup provider cache
225
+ const provider = providerCache.get(conversationId);
226
+ if (provider) {
227
+ await provider.cleanup();
228
+ providerCache.delete(conversationId);
229
+ }
230
+ await conversation.destroy();
231
+ // Update job statistics
232
+ await JobService_1.JobService.updateJobStatistics(jobId);
233
+ logger_1.default.info(`Deleted conversation: ${conversationId}`);
234
+ }
235
+ /**
236
+ * Get available providers with their auth status
237
+ */
238
+ static async getAvailableProviders() {
239
+ const providers = ["claude", "codex", "gemini"];
240
+ const result = [];
241
+ for (const provider of providers) {
242
+ const token = await models_1.AuthToken.findOne({
243
+ where: { provider, isActive: true },
244
+ });
245
+ result.push({
246
+ provider,
247
+ isAuthenticated: !!token,
248
+ });
249
+ }
250
+ return result;
251
+ }
252
+ }
253
+ exports.ConversationService = ConversationService;
254
+ exports.default = ConversationService;
255
+ //# sourceMappingURL=ConversationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationService.js","sourceRoot":"","sources":["../../../src/services/conversation/ConversationService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { Job, JobStatus, Conversation } from "../../models";
2
+ import { LLMProvider } from "../../models/AuthToken";
3
+ export interface JobCreateParams {
4
+ name: string;
5
+ description?: string;
6
+ workingDirectory: string;
7
+ systemPrompt?: string;
8
+ maxBudgetUsd?: number;
9
+ }
10
+ export interface JobUpdateParams {
11
+ name?: string;
12
+ description?: string;
13
+ status?: JobStatus;
14
+ systemPrompt?: string;
15
+ maxBudgetUsd?: number;
16
+ }
17
+ export interface JobStatistics {
18
+ messageCount: number;
19
+ conversationCount: number;
20
+ tokenUsage: {
21
+ input: number;
22
+ output: number;
23
+ total: number;
24
+ };
25
+ fileOperations: number;
26
+ providerBreakdown: {
27
+ provider: LLMProvider;
28
+ conversationCount: number;
29
+ messageCount: number;
30
+ }[];
31
+ }
32
+ export declare class JobService {
33
+ /**
34
+ * Create a new job
35
+ */
36
+ static createJob(params: JobCreateParams): Promise<Job>;
37
+ /**
38
+ * Get job by ID
39
+ */
40
+ static getJob(jobId: string): Promise<Job | null>;
41
+ /**
42
+ * Get job with conversations
43
+ */
44
+ static getJobWithConversations(jobId: string): Promise<{
45
+ job: Job;
46
+ conversations: Conversation[];
47
+ } | null>;
48
+ /**
49
+ * List jobs
50
+ */
51
+ static listJobs(params: {
52
+ status?: JobStatus;
53
+ provider?: LLMProvider;
54
+ limit?: number;
55
+ offset?: number;
56
+ search?: string;
57
+ }): Promise<{
58
+ jobs: Job[];
59
+ total: number;
60
+ }>;
61
+ /**
62
+ * Update job
63
+ */
64
+ static updateJob(jobId: string, params: JobUpdateParams): Promise<Job>;
65
+ /**
66
+ * Update job statistics (conversation and message counts)
67
+ */
68
+ static updateJobStatistics(jobId: string): Promise<void>;
69
+ /**
70
+ * Delete job
71
+ */
72
+ static deleteJob(jobId: string): Promise<void>;
73
+ /**
74
+ * Get job statistics
75
+ */
76
+ static getJobStatistics(jobId: string): Promise<JobStatistics>;
77
+ /**
78
+ * Cancel job
79
+ */
80
+ static cancelJob(jobId: string): Promise<Job>;
81
+ }
82
+ export default JobService;
83
+ //# sourceMappingURL=JobService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobService.d.ts","sourceRoot":"","sources":["../../../src/services/job/JobService.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EACH,SAAS,EACT,YAAY,EAGb,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE;QACjB,QAAQ,EAAE,WAAW,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,EAAE,CAAC;CACL;AAED,qBAAa,UAAU;IACrB;;OAEG;WACU,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IAsB7D;;OAEG;WACU,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAIvD;;OAEG;WACU,uBAAuB,CAClC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,aAAa,EAAE,YAAY,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAY9D;;OAEG;WACU,QAAQ,CAAC,MAAM,EAAE;QAC5B,MAAM,CAAC,EAAE,SAAS,CAAC;QACnB,QAAQ,CAAC,EAAE,WAAW,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAiC3C;;OAEG;WACU,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC;IAgC5E;;OAEG;WACU,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9D;;OAEG;WACU,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpD;;OAEG;WACU,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA2EpE;;OAEG;WACU,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CAGpD;AAED,eAAe,UAAU,CAAC"}