@chrishdx/llm-dev-server 1.1.5 → 1.1.7

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 (45) hide show
  1. package/backend/bin/wrapper.js +121 -0
  2. package/backend/dist/controllers/AuthController.d.ts +3 -0
  3. package/backend/dist/controllers/AuthController.d.ts.map +1 -1
  4. package/backend/dist/controllers/AuthController.js +40 -0
  5. package/backend/dist/controllers/AuthController.js.map +1 -1
  6. package/backend/dist/routes/auth.routes.d.ts.map +1 -1
  7. package/backend/dist/routes/auth.routes.js +3 -0
  8. package/backend/dist/routes/auth.routes.js.map +1 -1
  9. package/backend/dist/routes/index.d.ts.map +1 -1
  10. package/backend/dist/routes/index.js +4 -0
  11. package/backend/dist/routes/index.js.map +1 -1
  12. package/backend/dist/routes/system.routes.d.ts +15 -0
  13. package/backend/dist/routes/system.routes.d.ts.map +1 -0
  14. package/backend/dist/routes/system.routes.js +152 -0
  15. package/backend/dist/routes/system.routes.js.map +1 -0
  16. package/backend/dist/routes/test.routes.d.ts +3 -0
  17. package/backend/dist/routes/test.routes.d.ts.map +1 -0
  18. package/backend/dist/routes/test.routes.js +211 -0
  19. package/backend/dist/routes/test.routes.js.map +1 -0
  20. package/backend/dist/services/SystemService.d.ts +88 -0
  21. package/backend/dist/services/SystemService.d.ts.map +1 -0
  22. package/backend/dist/services/SystemService.js +299 -0
  23. package/backend/dist/services/SystemService.js.map +1 -0
  24. package/backend/dist/services/auth/TokenRefreshService.d.ts +4 -0
  25. package/backend/dist/services/auth/TokenRefreshService.d.ts.map +1 -1
  26. package/backend/dist/services/auth/TokenRefreshService.js +14 -0
  27. package/backend/dist/services/auth/TokenRefreshService.js.map +1 -1
  28. package/backend/dist/services/conversation/ConversationService.d.ts.map +1 -1
  29. package/backend/dist/services/conversation/ConversationService.js +23 -3
  30. package/backend/dist/services/conversation/ConversationService.js.map +1 -1
  31. package/backend/dist/services/llm/ClaudeProvider.d.ts +10 -8
  32. package/backend/dist/services/llm/ClaudeProvider.d.ts.map +1 -1
  33. package/backend/dist/services/llm/ClaudeProvider.js +103 -303
  34. package/backend/dist/services/llm/ClaudeProvider.js.map +1 -1
  35. package/backend/dist/services/llm/LLMProviderBase.d.ts +5 -0
  36. package/backend/dist/services/llm/LLMProviderBase.d.ts.map +1 -1
  37. package/backend/dist/services/llm/LLMProviderBase.js.map +1 -1
  38. package/backend/package.json +1 -1
  39. package/backend/public/assets/index-CrDmFy4C.js +242 -0
  40. package/backend/public/index.html +1 -1
  41. package/package.json +18 -17
  42. package/shared/dist/types/api.d.ts +38 -2
  43. package/shared/dist/types/api.d.ts.map +1 -1
  44. package/backend/bin/llm-dev-server.js +0 -3
  45. package/backend/public/assets/index-C5FA1UMN.js +0 -189
@@ -0,0 +1,211 @@
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
+ const express_1 = require("express");
7
+ const ClaudeProvider_1 = require("../services/llm/ClaudeProvider");
8
+ const models_1 = require("../models");
9
+ const logger_1 = __importDefault(require("../utils/logger"));
10
+ const router = (0, express_1.Router)();
11
+ // Simple API key middleware for test endpoints
12
+ const testApiKeyAuth = (req, res, next) => {
13
+ const apiKey = req.headers["x-test-api-key"] || req.query.api_key;
14
+ const validKey = process.env.TEST_API_KEY || "dev-test-key-12345";
15
+ if (apiKey !== validKey) {
16
+ return res.status(401).json({
17
+ error: "Unauthorized",
18
+ message: "Invalid test API key. Set X-Test-API-Key header or api_key query param.",
19
+ });
20
+ }
21
+ next();
22
+ };
23
+ // Apply API key auth to all test routes
24
+ router.use(testApiKeyAuth);
25
+ /**
26
+ * GET /api/test/claude/status
27
+ * Check if Claude is available and configured
28
+ */
29
+ router.get("/claude/status", async (req, res) => {
30
+ try {
31
+ // Check if we have any Claude auth token
32
+ const claudeTokens = await models_1.AuthToken.findAll({
33
+ where: { provider: "claude" },
34
+ limit: 1,
35
+ });
36
+ if (claudeTokens.length === 0) {
37
+ return res.status(404).json({
38
+ error: "No Claude token found",
39
+ message: "Please authenticate with Claude first using /api/auth/claude/login",
40
+ });
41
+ }
42
+ const token = claudeTokens[0];
43
+ res.json({
44
+ data: {
45
+ available: true,
46
+ tokenId: token.id,
47
+ email: token.email,
48
+ expiresAt: token.expiresAt,
49
+ scopes: token.scopes,
50
+ },
51
+ });
52
+ }
53
+ catch (error) {
54
+ logger_1.default.error("Error checking Claude status:", error);
55
+ res.status(500).json({
56
+ error: "Failed to check Claude status",
57
+ message: error instanceof Error ? error.message : String(error),
58
+ });
59
+ }
60
+ });
61
+ /**
62
+ * POST /api/test/claude/chat
63
+ * Send a message to Claude
64
+ *
65
+ * Body:
66
+ * {
67
+ * "message": "Hello, Claude!",
68
+ * "sessionId": "optional-session-id",
69
+ * "systemPrompt": "optional system prompt",
70
+ * "model": "optional model override"
71
+ * }
72
+ */
73
+ router.post("/claude/chat", async (req, res) => {
74
+ try {
75
+ const { message, sessionId, systemPrompt, model } = req.body;
76
+ if (!message) {
77
+ return res.status(400).json({
78
+ error: "Missing message",
79
+ message: "Please provide a 'message' in the request body",
80
+ });
81
+ }
82
+ // Get first available Claude token
83
+ const claudeTokens = await models_1.AuthToken.findAll({
84
+ where: { provider: "claude" },
85
+ limit: 1,
86
+ });
87
+ if (claudeTokens.length === 0) {
88
+ return res.status(404).json({
89
+ error: "No Claude token found",
90
+ message: "Please authenticate with Claude first using /api/auth/claude/login",
91
+ });
92
+ }
93
+ const token = claudeTokens[0];
94
+ // Create provider instance
95
+ const provider = new ClaudeProvider_1.ClaudeProvider({
96
+ provider: "claude",
97
+ tokenId: token.id,
98
+ workingDirectory: process.cwd(),
99
+ model: model || "claude-sonnet-4-5-20250929",
100
+ sessionId: sessionId,
101
+ });
102
+ // Initialize provider
103
+ await provider.initialize();
104
+ logger_1.default.info(`Test: Sending message to Claude (session: ${sessionId || 'new'})`);
105
+ // Send message
106
+ const result = await provider.sendMessage({
107
+ content: message,
108
+ systemPrompt: systemPrompt,
109
+ });
110
+ // Cleanup
111
+ await provider.cleanup();
112
+ res.json({
113
+ data: {
114
+ response: result.content,
115
+ sessionId: result.sessionId,
116
+ tokenUsage: result.tokenUsage,
117
+ },
118
+ });
119
+ }
120
+ catch (error) {
121
+ logger_1.default.error("Error in Claude test chat:", error);
122
+ res.status(500).json({
123
+ error: "Failed to send message",
124
+ message: error instanceof Error ? error.message : String(error),
125
+ });
126
+ }
127
+ });
128
+ /**
129
+ * POST /api/test/claude/conversation
130
+ * Test a multi-turn conversation
131
+ *
132
+ * Body:
133
+ * {
134
+ * "messages": [
135
+ * "What is 2 + 2?",
136
+ * "Now multiply that by 3"
137
+ * ],
138
+ * "systemPrompt": "optional system prompt"
139
+ * }
140
+ */
141
+ router.post("/claude/conversation", async (req, res) => {
142
+ try {
143
+ const { messages, systemPrompt } = req.body;
144
+ if (!messages || !Array.isArray(messages) || messages.length === 0) {
145
+ return res.status(400).json({
146
+ error: "Missing messages",
147
+ message: "Please provide an array of 'messages' in the request body",
148
+ });
149
+ }
150
+ // Get first available Claude token
151
+ const claudeTokens = await models_1.AuthToken.findAll({
152
+ where: { provider: "claude" },
153
+ limit: 1,
154
+ });
155
+ if (claudeTokens.length === 0) {
156
+ return res.status(404).json({
157
+ error: "No Claude token found",
158
+ message: "Please authenticate with Claude first using /api/auth/claude/login",
159
+ });
160
+ }
161
+ const token = claudeTokens[0];
162
+ // Create provider instance
163
+ const provider = new ClaudeProvider_1.ClaudeProvider({
164
+ provider: "claude",
165
+ tokenId: token.id,
166
+ workingDirectory: process.cwd(),
167
+ model: "claude-sonnet-4-5-20250929",
168
+ });
169
+ // Initialize provider
170
+ await provider.initialize();
171
+ const conversationLog = [];
172
+ let currentSessionId;
173
+ // Send messages sequentially
174
+ for (let i = 0; i < messages.length; i++) {
175
+ const message = messages[i];
176
+ logger_1.default.info(`Test conversation: Turn ${i + 1}/${messages.length}`);
177
+ // Resume session if we have one
178
+ if (currentSessionId) {
179
+ await provider.resumeSession(currentSessionId);
180
+ }
181
+ const result = await provider.sendMessage({
182
+ content: message,
183
+ systemPrompt: i === 0 ? systemPrompt : undefined, // Only use system prompt on first message
184
+ });
185
+ conversationLog.push({
186
+ message,
187
+ response: result.content,
188
+ sessionId: result.sessionId,
189
+ });
190
+ // Update session ID for next turn
191
+ currentSessionId = result.sessionId;
192
+ }
193
+ // Cleanup
194
+ await provider.cleanup();
195
+ res.json({
196
+ data: {
197
+ conversation: conversationLog,
198
+ finalSessionId: currentSessionId,
199
+ },
200
+ });
201
+ }
202
+ catch (error) {
203
+ logger_1.default.error("Error in Claude test conversation:", error);
204
+ res.status(500).json({
205
+ error: "Failed to run conversation",
206
+ message: error instanceof Error ? error.message : String(error),
207
+ });
208
+ }
209
+ });
210
+ exports.default = router;
211
+ //# sourceMappingURL=test.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.routes.js","sourceRoot":"","sources":["../../src/routes/test.routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * SystemService
3
+ *
4
+ * Handles system-level operations:
5
+ * - Version checking (current vs. latest npm version)
6
+ * - NPM package updates
7
+ * - Server restart signaling
8
+ * - Update logging
9
+ */
10
+ export interface SystemVersionInfo {
11
+ current: string;
12
+ latest: string;
13
+ updateAvailable: boolean;
14
+ lastChecked: string;
15
+ }
16
+ export interface SystemInfo {
17
+ uptime: number;
18
+ memoryUsage: {
19
+ total: number;
20
+ used: number;
21
+ free: number;
22
+ percentage: number;
23
+ };
24
+ nodeVersion: string;
25
+ platform: string;
26
+ arch: string;
27
+ hostname: string;
28
+ pid: number;
29
+ ppid: number;
30
+ }
31
+ export interface UpdateResponse {
32
+ success: boolean;
33
+ message: string;
34
+ previousVersion?: string;
35
+ newVersion?: string;
36
+ log?: string;
37
+ }
38
+ export declare class SystemService {
39
+ /**
40
+ * Get current installed version from package.json
41
+ */
42
+ static getCurrentVersion(): Promise<string>;
43
+ /**
44
+ * Get latest version from npm registry
45
+ */
46
+ static getLatestVersion(): Promise<string>;
47
+ /**
48
+ * Get full version info including update availability
49
+ */
50
+ static getVersionInfo(): Promise<SystemVersionInfo>;
51
+ /**
52
+ * Compare semantic versions
53
+ */
54
+ static isNewerVersion(latest: string, current: string): boolean;
55
+ /**
56
+ * Get system information
57
+ */
58
+ static getSystemInfo(): SystemInfo;
59
+ /**
60
+ * Execute npm update and restart server
61
+ */
62
+ static executeUpdate(): Promise<UpdateResponse>;
63
+ /**
64
+ * Signal the wrapper process to restart the server
65
+ */
66
+ static signalRestart(): void;
67
+ /**
68
+ * Trigger a server restart without update
69
+ */
70
+ static triggerRestart(): Promise<{
71
+ success: boolean;
72
+ message: string;
73
+ }>;
74
+ /**
75
+ * Save update log to file
76
+ */
77
+ static saveUpdateLog(content: string): Promise<void>;
78
+ /**
79
+ * Get update log content
80
+ */
81
+ static getUpdateLog(): Promise<string>;
82
+ /**
83
+ * Clear update log
84
+ */
85
+ static clearUpdateLog(): Promise<void>;
86
+ }
87
+ export default SystemService;
88
+ //# sourceMappingURL=SystemService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SystemService.d.ts","sourceRoot":"","sources":["../../src/services/SystemService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoBH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,aAAa;IACxB;;OAEG;WACU,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAkCjD;;OAEG;WACU,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAiChD;;OAEG;WACU,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAczD;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAc/D;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,UAAU;IAsBlC;;OAEG;WACU,aAAa,IAAI,OAAO,CAAC,cAAc,CAAC;IAqErD;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAsB5B;;OAEG;WACU,cAAc,IAAI,OAAO,CAAC;QACrC,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAcF;;OAEG;WACU,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1D;;OAEG;WACU,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAyB5C;;OAEG;WACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7C;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ /**
3
+ * SystemService
4
+ *
5
+ * Handles system-level operations:
6
+ * - Version checking (current vs. latest npm version)
7
+ * - NPM package updates
8
+ * - Server restart signaling
9
+ * - Update logging
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SystemService = void 0;
16
+ const child_process_1 = require("child_process");
17
+ const util_1 = require("util");
18
+ const fs_1 = __importDefault(require("fs"));
19
+ const path_1 = __importDefault(require("path"));
20
+ const os_1 = __importDefault(require("os"));
21
+ const https_1 = __importDefault(require("https"));
22
+ const logger_1 = __importDefault(require("../utils/logger"));
23
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
24
+ // Package name on npm registry
25
+ const PACKAGE_NAME = "@chrishdx/llm-dev-server";
26
+ // Update log location
27
+ const DEV_SERVER_HOME = process.env.DEV_SERVER_HOME || path_1.default.join(os_1.default.homedir(), ".dev_server");
28
+ const UPDATE_LOG_PATH = path_1.default.join(DEV_SERVER_HOME, "update.log");
29
+ class SystemService {
30
+ /**
31
+ * Get current installed version from package.json
32
+ */
33
+ static async getCurrentVersion() {
34
+ try {
35
+ // Try to get version from globally installed package
36
+ const { stdout } = await execAsync(`npm list -g ${PACKAGE_NAME} --depth=0 --json 2>/dev/null || true`);
37
+ if (stdout.trim()) {
38
+ try {
39
+ const parsed = JSON.parse(stdout);
40
+ if (parsed.dependencies?.[PACKAGE_NAME]?.version) {
41
+ return parsed.dependencies[PACKAGE_NAME].version;
42
+ }
43
+ }
44
+ catch {
45
+ // JSON parse failed, try alternative method
46
+ }
47
+ }
48
+ // Fallback: Read from local package.json (development mode)
49
+ const packageJsonPath = path_1.default.join(__dirname, "..", "..", "package.json");
50
+ if (fs_1.default.existsSync(packageJsonPath)) {
51
+ const packageJson = JSON.parse(fs_1.default.readFileSync(packageJsonPath, "utf-8"));
52
+ return packageJson.version || "1.0.0";
53
+ }
54
+ return "1.0.0";
55
+ }
56
+ catch (error) {
57
+ logger_1.default.error("Failed to get current version:", error);
58
+ return "1.0.0";
59
+ }
60
+ }
61
+ /**
62
+ * Get latest version from npm registry
63
+ */
64
+ static async getLatestVersion() {
65
+ return new Promise((resolve, reject) => {
66
+ const url = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
67
+ https_1.default
68
+ .get(url, (res) => {
69
+ let data = "";
70
+ res.on("data", (chunk) => {
71
+ data += chunk;
72
+ });
73
+ res.on("end", () => {
74
+ try {
75
+ const parsed = JSON.parse(data);
76
+ resolve(parsed.version || "1.0.0");
77
+ }
78
+ catch (error) {
79
+ // Package might not exist yet
80
+ logger_1.default.warn("Could not parse npm registry response, package may not be published yet");
81
+ resolve("1.0.0");
82
+ }
83
+ });
84
+ })
85
+ .on("error", (error) => {
86
+ logger_1.default.error("Failed to fetch latest version:", error);
87
+ // Don't reject, just return current version indicator
88
+ resolve("1.0.0");
89
+ });
90
+ });
91
+ }
92
+ /**
93
+ * Get full version info including update availability
94
+ */
95
+ static async getVersionInfo() {
96
+ const [current, latest] = await Promise.all([
97
+ this.getCurrentVersion(),
98
+ this.getLatestVersion(),
99
+ ]);
100
+ return {
101
+ current,
102
+ latest,
103
+ updateAvailable: this.isNewerVersion(latest, current),
104
+ lastChecked: new Date().toISOString(),
105
+ };
106
+ }
107
+ /**
108
+ * Compare semantic versions
109
+ */
110
+ static isNewerVersion(latest, current) {
111
+ const latestParts = latest.split(".").map(Number);
112
+ const currentParts = current.split(".").map(Number);
113
+ for (let i = 0; i < 3; i++) {
114
+ const l = latestParts[i] || 0;
115
+ const c = currentParts[i] || 0;
116
+ if (l > c)
117
+ return true;
118
+ if (l < c)
119
+ return false;
120
+ }
121
+ return false;
122
+ }
123
+ /**
124
+ * Get system information
125
+ */
126
+ static getSystemInfo() {
127
+ const totalMem = os_1.default.totalmem();
128
+ const freeMem = os_1.default.freemem();
129
+ const usedMem = totalMem - freeMem;
130
+ return {
131
+ uptime: process.uptime(),
132
+ memoryUsage: {
133
+ total: totalMem,
134
+ used: usedMem,
135
+ free: freeMem,
136
+ percentage: Math.round((usedMem / totalMem) * 100),
137
+ },
138
+ nodeVersion: process.version,
139
+ platform: os_1.default.platform(),
140
+ arch: os_1.default.arch(),
141
+ hostname: os_1.default.hostname(),
142
+ pid: process.pid,
143
+ ppid: process.ppid,
144
+ };
145
+ }
146
+ /**
147
+ * Execute npm update and restart server
148
+ */
149
+ static async executeUpdate() {
150
+ const startTime = new Date();
151
+ let logContent = `=== Update Started: ${startTime.toISOString()} ===\n\n`;
152
+ try {
153
+ // Get current version before update
154
+ const previousVersion = await this.getCurrentVersion();
155
+ logContent += `Current Version: ${previousVersion}\n`;
156
+ // Run npm update
157
+ logContent += `\nExecuting: npm update -g ${PACKAGE_NAME}\n`;
158
+ logContent += "---\n";
159
+ const { stdout, stderr } = await execAsync(`npm update -g ${PACKAGE_NAME} 2>&1`, { timeout: 120000 } // 2 minute timeout
160
+ );
161
+ logContent += stdout || "(no output)\n";
162
+ if (stderr) {
163
+ logContent += `\nStderr:\n${stderr}`;
164
+ }
165
+ // Get new version after update
166
+ const newVersion = await this.getCurrentVersion();
167
+ logContent += `\n---\nNew Version: ${newVersion}\n`;
168
+ const endTime = new Date();
169
+ const duration = (endTime.getTime() - startTime.getTime()) / 1000;
170
+ logContent += `\n=== Update Completed: ${endTime.toISOString()} (${duration}s) ===\n`;
171
+ // Save log
172
+ await this.saveUpdateLog(logContent);
173
+ // Signal wrapper to restart the server
174
+ logger_1.default.info("Update complete, signaling wrapper to restart...");
175
+ // Small delay to ensure response is sent
176
+ setTimeout(() => {
177
+ this.signalRestart();
178
+ }, 500);
179
+ return {
180
+ success: true,
181
+ message: previousVersion === newVersion
182
+ ? "Bereits auf der neuesten Version"
183
+ : "Update erfolgreich, Server wird neu gestartet...",
184
+ previousVersion,
185
+ newVersion,
186
+ log: logContent,
187
+ };
188
+ }
189
+ catch (error) {
190
+ const endTime = new Date();
191
+ logContent += `\n=== Update Failed: ${endTime.toISOString()} ===\n`;
192
+ logContent += `Error: ${error.message}\n`;
193
+ await this.saveUpdateLog(logContent);
194
+ logger_1.default.error("Update failed:", error);
195
+ return {
196
+ success: false,
197
+ message: `Update fehlgeschlagen: ${error.message}`,
198
+ log: logContent,
199
+ };
200
+ }
201
+ }
202
+ /**
203
+ * Signal the wrapper process to restart the server
204
+ */
205
+ static signalRestart() {
206
+ const ppid = process.ppid;
207
+ if (ppid && ppid > 1) {
208
+ logger_1.default.info(`Sending SIGUSR2 to wrapper process (PID: ${ppid})`);
209
+ try {
210
+ process.kill(ppid, "SIGUSR2");
211
+ }
212
+ catch (error) {
213
+ logger_1.default.error("Failed to signal wrapper:", error.message);
214
+ // Fallback: exit process, container will restart
215
+ logger_1.default.info("Falling back to process.exit(0)");
216
+ process.exit(0);
217
+ }
218
+ }
219
+ else {
220
+ // No wrapper (direct start or development) - just exit
221
+ logger_1.default.info("No wrapper detected (ppid=1 or undefined), using process.exit(0)");
222
+ process.exit(0);
223
+ }
224
+ }
225
+ /**
226
+ * Trigger a server restart without update
227
+ */
228
+ static async triggerRestart() {
229
+ logger_1.default.info("Manual restart requested");
230
+ // Small delay to ensure response is sent
231
+ setTimeout(() => {
232
+ this.signalRestart();
233
+ }, 500);
234
+ return {
235
+ success: true,
236
+ message: "Server wird neu gestartet...",
237
+ };
238
+ }
239
+ /**
240
+ * Save update log to file
241
+ */
242
+ static async saveUpdateLog(content) {
243
+ try {
244
+ // Ensure directory exists
245
+ if (!fs_1.default.existsSync(DEV_SERVER_HOME)) {
246
+ fs_1.default.mkdirSync(DEV_SERVER_HOME, { recursive: true });
247
+ }
248
+ // Append to existing log (keep history)
249
+ fs_1.default.appendFileSync(UPDATE_LOG_PATH, content + "\n\n");
250
+ logger_1.default.info(`Update log saved to ${UPDATE_LOG_PATH}`);
251
+ }
252
+ catch (error) {
253
+ logger_1.default.error("Failed to save update log:", error);
254
+ }
255
+ }
256
+ /**
257
+ * Get update log content
258
+ */
259
+ static async getUpdateLog() {
260
+ try {
261
+ if (fs_1.default.existsSync(UPDATE_LOG_PATH)) {
262
+ // Return last 50KB to avoid huge responses
263
+ const stats = fs_1.default.statSync(UPDATE_LOG_PATH);
264
+ const maxSize = 50 * 1024;
265
+ if (stats.size > maxSize) {
266
+ // Read last 50KB
267
+ const fd = fs_1.default.openSync(UPDATE_LOG_PATH, "r");
268
+ const buffer = Buffer.alloc(maxSize);
269
+ fs_1.default.readSync(fd, buffer, 0, maxSize, stats.size - maxSize);
270
+ fs_1.default.closeSync(fd);
271
+ return "... (truncated)\n" + buffer.toString("utf-8");
272
+ }
273
+ return fs_1.default.readFileSync(UPDATE_LOG_PATH, "utf-8");
274
+ }
275
+ return "Kein Update-Log vorhanden";
276
+ }
277
+ catch (error) {
278
+ logger_1.default.error("Failed to read update log:", error);
279
+ return "Fehler beim Lesen des Update-Logs";
280
+ }
281
+ }
282
+ /**
283
+ * Clear update log
284
+ */
285
+ static async clearUpdateLog() {
286
+ try {
287
+ if (fs_1.default.existsSync(UPDATE_LOG_PATH)) {
288
+ fs_1.default.unlinkSync(UPDATE_LOG_PATH);
289
+ logger_1.default.info("Update log cleared");
290
+ }
291
+ }
292
+ catch (error) {
293
+ logger_1.default.error("Failed to clear update log:", error);
294
+ }
295
+ }
296
+ }
297
+ exports.SystemService = SystemService;
298
+ exports.default = SystemService;
299
+ //# sourceMappingURL=SystemService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SystemService.js","sourceRoot":"","sources":["../../src/services/SystemService.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,10 @@ export declare class TokenRefreshService {
11
11
  * Stop monitoring a token
12
12
  */
13
13
  stop(tokenId: string): void;
14
+ /**
15
+ * Stop monitoring all tokens for a specific provider
16
+ */
17
+ stopForProvider(provider: 'claude' | 'codex' | 'gemini'): Promise<void>;
14
18
  /**
15
19
  * Stop all token monitoring
16
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"TokenRefreshService.d.ts","sourceRoot":"","sources":["../../../src/services/auth/TokenRefreshService.ts"],"names":[],"mappings":"AAWA,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,OAAO,CAAC,gBAAgB,CAAqC;IAE7D,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAsB5B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS3B;;OAEG;IACH,OAAO,IAAI,IAAI;IAMf;;OAEG;YACW,eAAe;IA0C7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;YACW,YAAY;IAmB1B;;OAEG;YACW,oBAAoB;CAkDnC;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"TokenRefreshService.d.ts","sourceRoot":"","sources":["../../../src/services/auth/TokenRefreshService.ts"],"names":[],"mappings":"AAWA,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,OAAO,CAAC,gBAAgB,CAAqC;IAE7D,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAsB5B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAS3B;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAc7E;;OAEG;IACH,OAAO,IAAI,IAAI;IAMf;;OAEG;YACW,eAAe;IA0C7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;YACW,YAAY;IAmB1B;;OAEG;YACW,oBAAoB;CAkDnC;AAED,eAAe,mBAAmB,CAAC"}
@@ -54,6 +54,20 @@ class TokenRefreshService {
54
54
  logger_1.default.info(`Stopped token refresh monitoring for ${tokenId}`);
55
55
  }
56
56
  }
57
+ /**
58
+ * Stop monitoring all tokens for a specific provider
59
+ */
60
+ async stopForProvider(provider) {
61
+ // Find all tokens for this provider
62
+ const tokens = await models_1.AuthToken.findAll({
63
+ where: { provider }
64
+ });
65
+ // Stop monitoring for each token
66
+ tokens.forEach(token => {
67
+ this.stop(token.id);
68
+ });
69
+ logger_1.default.info(`Stopped token refresh monitoring for all ${provider} tokens`);
70
+ }
57
71
  /**
58
72
  * Stop all token monitoring
59
73
  */