@chrishdx/llm-dev-server 1.1.6 → 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.
- package/backend/bin/wrapper.js +121 -0
- package/backend/dist/controllers/AuthController.d.ts +3 -0
- package/backend/dist/controllers/AuthController.d.ts.map +1 -1
- package/backend/dist/controllers/AuthController.js +40 -0
- package/backend/dist/controllers/AuthController.js.map +1 -1
- package/backend/dist/routes/auth.routes.d.ts.map +1 -1
- package/backend/dist/routes/auth.routes.js +3 -0
- package/backend/dist/routes/auth.routes.js.map +1 -1
- package/backend/dist/routes/index.d.ts.map +1 -1
- package/backend/dist/routes/index.js +4 -0
- package/backend/dist/routes/index.js.map +1 -1
- package/backend/dist/routes/system.routes.d.ts +15 -0
- package/backend/dist/routes/system.routes.d.ts.map +1 -0
- package/backend/dist/routes/system.routes.js +152 -0
- package/backend/dist/routes/system.routes.js.map +1 -0
- package/backend/dist/routes/test.routes.d.ts +3 -0
- package/backend/dist/routes/test.routes.d.ts.map +1 -0
- package/backend/dist/routes/test.routes.js +211 -0
- package/backend/dist/routes/test.routes.js.map +1 -0
- package/backend/dist/services/SystemService.d.ts +88 -0
- package/backend/dist/services/SystemService.d.ts.map +1 -0
- package/backend/dist/services/SystemService.js +299 -0
- package/backend/dist/services/SystemService.js.map +1 -0
- package/backend/dist/services/auth/TokenRefreshService.d.ts +4 -0
- package/backend/dist/services/auth/TokenRefreshService.d.ts.map +1 -1
- package/backend/dist/services/auth/TokenRefreshService.js +14 -0
- package/backend/dist/services/auth/TokenRefreshService.js.map +1 -1
- package/backend/dist/services/conversation/ConversationService.d.ts.map +1 -1
- package/backend/dist/services/conversation/ConversationService.js +21 -1
- package/backend/dist/services/conversation/ConversationService.js.map +1 -1
- package/backend/dist/services/llm/ClaudeProvider.d.ts +10 -8
- package/backend/dist/services/llm/ClaudeProvider.d.ts.map +1 -1
- package/backend/dist/services/llm/ClaudeProvider.js +104 -304
- package/backend/dist/services/llm/ClaudeProvider.js.map +1 -1
- package/backend/dist/services/llm/LLMProviderBase.d.ts +5 -0
- package/backend/dist/services/llm/LLMProviderBase.d.ts.map +1 -1
- package/backend/dist/services/llm/LLMProviderBase.js.map +1 -1
- package/backend/package.json +1 -1
- package/backend/public/assets/index-CrDmFy4C.js +242 -0
- package/backend/public/index.html +1 -1
- package/package.json +18 -17
- package/shared/dist/types/api.d.ts +38 -2
- package/shared/dist/types/api.d.ts.map +1 -1
- package/backend/bin/llm-dev-server.js +0 -3
- 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
|
*/
|