@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.
- package/LICENSE +21 -0
- package/README.md +164 -0
- package/backend/bin/llm-dev-server.js +3 -0
- package/backend/dist/cli.d.ts +15 -0
- package/backend/dist/cli.d.ts.map +1 -0
- package/backend/dist/cli.js +326 -0
- package/backend/dist/cli.js.map +1 -0
- package/backend/dist/config/database.d.ts +10 -0
- package/backend/dist/config/database.d.ts.map +1 -0
- package/backend/dist/config/database.js +61 -0
- package/backend/dist/config/database.js.map +1 -0
- package/backend/dist/config/environment.d.ts +20 -0
- package/backend/dist/config/environment.d.ts.map +1 -0
- package/backend/dist/config/environment.js +77 -0
- package/backend/dist/config/environment.js.map +1 -0
- package/backend/dist/controllers/AuthController.d.ts +18 -0
- package/backend/dist/controllers/AuthController.d.ts.map +1 -0
- package/backend/dist/controllers/AuthController.js +282 -0
- package/backend/dist/controllers/AuthController.js.map +1 -0
- package/backend/dist/controllers/ConversationController.d.ts +44 -0
- package/backend/dist/controllers/ConversationController.d.ts.map +1 -0
- package/backend/dist/controllers/ConversationController.js +193 -0
- package/backend/dist/controllers/ConversationController.js.map +1 -0
- package/backend/dist/controllers/JobController.d.ts +49 -0
- package/backend/dist/controllers/JobController.d.ts.map +1 -0
- package/backend/dist/controllers/JobController.js +227 -0
- package/backend/dist/controllers/JobController.js.map +1 -0
- package/backend/dist/index.d.ts +2 -0
- package/backend/dist/index.d.ts.map +1 -0
- package/backend/dist/index.js +160 -0
- package/backend/dist/index.js.map +1 -0
- package/backend/dist/middleware/auth.middleware.d.ts +25 -0
- package/backend/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/backend/dist/middleware/auth.middleware.js +116 -0
- package/backend/dist/middleware/auth.middleware.js.map +1 -0
- package/backend/dist/middleware/authelia.middleware.d.ts +26 -0
- package/backend/dist/middleware/authelia.middleware.d.ts.map +1 -0
- package/backend/dist/middleware/authelia.middleware.js +165 -0
- package/backend/dist/middleware/authelia.middleware.js.map +1 -0
- package/backend/dist/middleware/error.middleware.d.ts +23 -0
- package/backend/dist/middleware/error.middleware.d.ts.map +1 -0
- package/backend/dist/middleware/error.middleware.js +59 -0
- package/backend/dist/middleware/error.middleware.js.map +1 -0
- package/backend/dist/models/AuthToken.d.ts +42 -0
- package/backend/dist/models/AuthToken.d.ts.map +1 -0
- package/backend/dist/models/AuthToken.js +97 -0
- package/backend/dist/models/AuthToken.js.map +1 -0
- package/backend/dist/models/Conversation.d.ts +36 -0
- package/backend/dist/models/Conversation.d.ts.map +1 -0
- package/backend/dist/models/Conversation.js +100 -0
- package/backend/dist/models/Conversation.js.map +1 -0
- package/backend/dist/models/FileOperation.d.ts +36 -0
- package/backend/dist/models/FileOperation.d.ts.map +1 -0
- package/backend/dist/models/FileOperation.js +117 -0
- package/backend/dist/models/FileOperation.js.map +1 -0
- package/backend/dist/models/Job.d.ts +48 -0
- package/backend/dist/models/Job.d.ts.map +1 -0
- package/backend/dist/models/Job.js +87 -0
- package/backend/dist/models/Job.js.map +1 -0
- package/backend/dist/models/Message.d.ts +38 -0
- package/backend/dist/models/Message.d.ts.map +1 -0
- package/backend/dist/models/Message.js +87 -0
- package/backend/dist/models/Message.js.map +1 -0
- package/backend/dist/models/User.d.ts +26 -0
- package/backend/dist/models/User.d.ts.map +1 -0
- package/backend/dist/models/User.js +67 -0
- package/backend/dist/models/User.js.map +1 -0
- package/backend/dist/models/index.d.ts +13 -0
- package/backend/dist/models/index.d.ts.map +1 -0
- package/backend/dist/models/index.js +24 -0
- package/backend/dist/models/index.js.map +1 -0
- package/backend/dist/routes/auth.routes.d.ts +3 -0
- package/backend/dist/routes/auth.routes.d.ts.map +1 -0
- package/backend/dist/routes/auth.routes.js +27 -0
- package/backend/dist/routes/auth.routes.js.map +1 -0
- package/backend/dist/routes/conversation.routes.d.ts +3 -0
- package/backend/dist/routes/conversation.routes.d.ts.map +1 -0
- package/backend/dist/routes/conversation.routes.js +17 -0
- package/backend/dist/routes/conversation.routes.js.map +1 -0
- package/backend/dist/routes/filesystem.routes.d.ts +3 -0
- package/backend/dist/routes/filesystem.routes.d.ts.map +1 -0
- package/backend/dist/routes/filesystem.routes.js +64 -0
- package/backend/dist/routes/filesystem.routes.js.map +1 -0
- package/backend/dist/routes/index.d.ts +3 -0
- package/backend/dist/routes/index.d.ts.map +1 -0
- package/backend/dist/routes/index.js +27 -0
- package/backend/dist/routes/index.js.map +1 -0
- package/backend/dist/routes/job.routes.d.ts +3 -0
- package/backend/dist/routes/job.routes.d.ts.map +1 -0
- package/backend/dist/routes/job.routes.js +18 -0
- package/backend/dist/routes/job.routes.js.map +1 -0
- package/backend/dist/services/auth/BaseAuthService.d.ts +49 -0
- package/backend/dist/services/auth/BaseAuthService.d.ts.map +1 -0
- package/backend/dist/services/auth/BaseAuthService.js +97 -0
- package/backend/dist/services/auth/BaseAuthService.js.map +1 -0
- package/backend/dist/services/auth/ClaudeAuthService.d.ts +69 -0
- package/backend/dist/services/auth/ClaudeAuthService.d.ts.map +1 -0
- package/backend/dist/services/auth/ClaudeAuthService.js +401 -0
- package/backend/dist/services/auth/ClaudeAuthService.js.map +1 -0
- package/backend/dist/services/auth/CodexAuthService.d.ts +37 -0
- package/backend/dist/services/auth/CodexAuthService.d.ts.map +1 -0
- package/backend/dist/services/auth/CodexAuthService.js +186 -0
- package/backend/dist/services/auth/CodexAuthService.js.map +1 -0
- package/backend/dist/services/auth/GeminiAuthService.d.ts +50 -0
- package/backend/dist/services/auth/GeminiAuthService.d.ts.map +1 -0
- package/backend/dist/services/auth/GeminiAuthService.js +284 -0
- package/backend/dist/services/auth/GeminiAuthService.js.map +1 -0
- package/backend/dist/services/auth/JwtService.d.ts +27 -0
- package/backend/dist/services/auth/JwtService.d.ts.map +1 -0
- package/backend/dist/services/auth/JwtService.js +65 -0
- package/backend/dist/services/auth/JwtService.js.map +1 -0
- package/backend/dist/services/auth/TokenRefreshService.d.ts +36 -0
- package/backend/dist/services/auth/TokenRefreshService.d.ts.map +1 -0
- package/backend/dist/services/auth/TokenRefreshService.js +178 -0
- package/backend/dist/services/auth/TokenRefreshService.js.map +1 -0
- package/backend/dist/services/conversation/ConversationService.d.ts +89 -0
- package/backend/dist/services/conversation/ConversationService.d.ts.map +1 -0
- package/backend/dist/services/conversation/ConversationService.js +255 -0
- package/backend/dist/services/conversation/ConversationService.js.map +1 -0
- package/backend/dist/services/job/JobService.d.ts +83 -0
- package/backend/dist/services/job/JobService.d.ts.map +1 -0
- package/backend/dist/services/job/JobService.js +213 -0
- package/backend/dist/services/job/JobService.js.map +1 -0
- package/backend/dist/services/job/WorkingDirectoryService.d.ts +73 -0
- package/backend/dist/services/job/WorkingDirectoryService.d.ts.map +1 -0
- package/backend/dist/services/job/WorkingDirectoryService.js +289 -0
- package/backend/dist/services/job/WorkingDirectoryService.js.map +1 -0
- package/backend/dist/services/llm/ClaudeProvider.d.ts +16 -0
- package/backend/dist/services/llm/ClaudeProvider.d.ts.map +1 -0
- package/backend/dist/services/llm/ClaudeProvider.js +229 -0
- package/backend/dist/services/llm/ClaudeProvider.js.map +1 -0
- package/backend/dist/services/llm/CodexProvider.d.ts +15 -0
- package/backend/dist/services/llm/CodexProvider.d.ts.map +1 -0
- package/backend/dist/services/llm/CodexProvider.js +301 -0
- package/backend/dist/services/llm/CodexProvider.js.map +1 -0
- package/backend/dist/services/llm/GeminiProvider.d.ts +17 -0
- package/backend/dist/services/llm/GeminiProvider.d.ts.map +1 -0
- package/backend/dist/services/llm/GeminiProvider.js +190 -0
- package/backend/dist/services/llm/GeminiProvider.js.map +1 -0
- package/backend/dist/services/llm/LLMProviderBase.d.ts +76 -0
- package/backend/dist/services/llm/LLMProviderBase.d.ts.map +1 -0
- package/backend/dist/services/llm/LLMProviderBase.js +34 -0
- package/backend/dist/services/llm/LLMProviderBase.js.map +1 -0
- package/backend/dist/services/llm/ProviderFactory.d.ts +17 -0
- package/backend/dist/services/llm/ProviderFactory.d.ts.map +1 -0
- package/backend/dist/services/llm/ProviderFactory.js +58 -0
- package/backend/dist/services/llm/ProviderFactory.js.map +1 -0
- package/backend/dist/utils/crypto.d.ts +33 -0
- package/backend/dist/utils/crypto.d.ts.map +1 -0
- package/backend/dist/utils/crypto.js +165 -0
- package/backend/dist/utils/crypto.js.map +1 -0
- package/backend/dist/utils/logger.d.ts +4 -0
- package/backend/dist/utils/logger.d.ts.map +1 -0
- package/backend/dist/utils/logger.js +44 -0
- package/backend/dist/utils/logger.js.map +1 -0
- package/backend/dist/utils/validators.d.ts +22 -0
- package/backend/dist/utils/validators.d.ts.map +1 -0
- package/backend/dist/utils/validators.js +127 -0
- package/backend/dist/utils/validators.js.map +1 -0
- package/backend/package.json +45 -0
- package/backend/public/assets/index-C207-KqP.js +188 -0
- package/backend/public/index.html +12 -0
- package/package.json +96 -0
- package/shared/dist/index.d.ts +5 -0
- package/shared/dist/index.d.ts.map +1 -0
- package/shared/dist/index.js +25 -0
- package/shared/dist/index.js.map +1 -0
- package/shared/dist/types/api.d.ts +27 -0
- package/shared/dist/types/api.d.ts.map +1 -0
- package/shared/dist/types/api.js +3 -0
- package/shared/dist/types/api.js.map +1 -0
- package/shared/dist/types/auth.d.ts +62 -0
- package/shared/dist/types/auth.d.ts.map +1 -0
- package/shared/dist/types/auth.js +3 -0
- package/shared/dist/types/auth.js.map +1 -0
- package/shared/dist/types/conversation.d.ts +98 -0
- package/shared/dist/types/conversation.d.ts.map +1 -0
- package/shared/dist/types/conversation.js +3 -0
- package/shared/dist/types/conversation.js.map +1 -0
- package/shared/dist/types/job.d.ts +93 -0
- package/shared/dist/types/job.d.ts.map +1 -0
- package/shared/dist/types/job.js +3 -0
- package/shared/dist/types/job.js.map +1 -0
- 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":";;;;;;AAAA,yCAAqE;AACrE,4DAAyD;AAEzD,kDAA+C;AAE/C,gEAAwC;AAExC,uCAAuC;AACvC,MAAM,aAAa,GAAG,IAAI,GAAG,EAA2B,CAAC;AAuBzD,MAAa,mBAAmB;IAC9B;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAgC;QAI9D,MAAM,GAAG,GAAG,MAAM,YAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,mDAAmD;QACnD,MAAM,KAAK,GAAG,MAAM,kBAAS,CAAC,OAAO,CAAC;YACpC,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;SACrD,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,aAAa,MAAM,CAAC,QAAQ,uBAAuB,CAAC,CAAC;QACvE,CAAC;QAED,+DAA+D;QAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEpE,sBAAsB;QACtB,MAAM,YAAY,GAAG,MAAM,qBAAY,CAAC,MAAM,CAAC;YAC7C,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY;YACrD,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,CAAC;SAChB,CAAC,CAAC;QAEH,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,MAAM,iCAAe,CAAC,MAAM,CAAC;YAC5C,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,KAAK,EAAE,YAAY,CAAC,KAAK;SAC1B,CAAC,CAAC;QAEH,iBAAiB;QACjB,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE7C,wBAAwB;QACxB,MAAM,uBAAU,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEnD,gBAAM,CAAC,IAAI,CACT,yBAAyB,YAAY,CAAC,EAAE,mBAAmB,MAAM,CAAC,QAAQ,EAAE,CAC7E,CAAC;QACF,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAqB;QAC1C,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,QAAQ;gBACX,OAAO,0BAA0B,CAAC;YACpC,KAAK,OAAO;gBACV,OAAO,SAAS,CAAC,CAAC,uCAAuC;YAC3D,KAAK,QAAQ;gBACX,OAAO,gBAAgB,CAAC;YAC1B;gBACE,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAChC,KAAa,EACb,SAKI,EAAE;QAEN,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC;QAE9D,MAAM,KAAK,GAAQ,EAAE,KAAK,EAAE,CAAC;QAC7B,IAAI,QAAQ;YAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACxC,IAAI,QAAQ,KAAK,SAAS;YAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEtD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,qBAAY,CAAC,eAAe,CAAC;YACzD,KAAK;YACL,KAAK;YACL,MAAM;YACN,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;SAC/B,CAAC,CAAC;QAEH,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,eAAe,CAC1B,cAAsB;QAEtB,OAAO,MAAM,qBAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAC7B,cAAsB,EACtB,MAAgC;QAEhC,MAAM,YAAY,GAAG,MAAM,qBAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,OAAO,GAA0B,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7D,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACtE,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;YACnC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAE7C,MAAM,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,gBAAM,CAAC,IAAI,CAAC,yBAAyB,cAAc,EAAE,CAAC,CAAC;QACvD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAyB;QAIhD,MAAM,YAAY,GAAG,MAAM,qBAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE;YACtE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,YAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,sBAAsB;QACtB,MAAM,WAAW,GAAG,MAAM,gBAAO,CAAC,MAAM,CAAC;YACvC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC7B,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE;gBAC/B,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;QAEH,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;QAE/D,cAAc;QACd,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC;YAC1C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,YAAY,EAAE,YAAY,CAAC,YAAY;YACvC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QAEH,2BAA2B;QAC3B,MAAM,gBAAgB,GAAG,MAAM,gBAAO,CAAC,MAAM,CAAC;YAC5C,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,KAAK,EAAE,YAAY,CAAC,KAAK;SAC1B,CAAC,CAAC;QAEH,sBAAsB;QACtB,MAAM,YAAY,CAAC,MAAM,CAAC;YACxB,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,YAAY,CAAC,SAAS;YACvD,YAAY,EAAE,YAAY,CAAC,YAAY,GAAG,CAAC;YAC3C,WAAW,EAAE,CAAC,YAAY,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK;YACxE,aAAa,EAAE,IAAI,IAAI,EAAE;SAC1B,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,uBAAU,CAAC,mBAAmB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAEzD,gBAAM,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAEtE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAC/B,YAA0B;QAE1B,cAAc;QACd,IAAI,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,iBAAiB;QACjB,MAAM,KAAK,GAAG,MAAM,kBAAS,CAAC,OAAO,CAAC;YACpC,KAAK,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC3D,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,gCAAgC;QAChC,MAAM,GAAG,GAAG,MAAM,YAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,sBAAsB;QACtB,QAAQ,GAAG,MAAM,iCAAe,CAAC,MAAM,CAAC;YACtC,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,SAAS,EAAE,YAAY,CAAC,SAAS;SAClC,CAAC,CAAC;QAEH,4BAA4B;QAC5B,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YAC3B,MAAM,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QAED,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,CACtB,cAAsB,EACtB,MAA2C;QAE3C,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC;QAE1C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,gBAAO,CAAC,eAAe,CAAC;YACpD,KAAK,EAAE,EAAE,cAAc,EAAE;YACzB,KAAK;YACL,MAAM;YACN,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;SAC9B,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK;SACtC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,cAAsB;QACpD,MAAM,YAAY,GAAG,MAAM,qBAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;QAEjC,yBAAyB;QACzB,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YACzB,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;QAE7B,wBAAwB;QACxB,MAAM,uBAAU,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAE5C,gBAAM,CAAC,IAAI,CAAC,yBAAyB,cAAc,EAAE,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,qBAAqB;QAGhC,MAAM,SAAS,GAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,EAAE,CAAC;QAElB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,MAAM,kBAAS,CAAC,OAAO,CAAC;gBACpC,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;aACpC,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ;gBACR,eAAe,EAAE,CAAC,CAAC,KAAK;aACzB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AArTD,kDAqTC;AAED,kBAAe,mBAAmB,CAAC"}
|
|
@@ -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"}
|