@kaitranntt/ccs 5.9.0 → 5.10.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/README.md +30 -2
- package/VERSION +1 -1
- package/dist/ccs.js +12 -0
- package/dist/ccs.js.map +1 -1
- package/dist/cliproxy/binary-manager.d.ts +2 -2
- package/dist/cliproxy/binary-manager.js +2 -2
- package/dist/cliproxy/model-catalog.d.ts +12 -0
- package/dist/cliproxy/model-catalog.d.ts.map +1 -1
- package/dist/cliproxy/model-catalog.js +31 -11
- package/dist/cliproxy/model-catalog.js.map +1 -1
- package/dist/cliproxy/model-config.d.ts.map +1 -1
- package/dist/cliproxy/model-config.js +14 -2
- package/dist/cliproxy/model-config.js.map +1 -1
- package/dist/cliproxy/platform-detector.d.ts +2 -2
- package/dist/cliproxy/platform-detector.js +1 -1
- package/dist/commands/cliproxy-command.d.ts.map +1 -1
- package/dist/commands/cliproxy-command.js +92 -54
- package/dist/commands/cliproxy-command.js.map +1 -1
- package/dist/commands/config-command.d.ts +11 -0
- package/dist/commands/config-command.d.ts.map +1 -0
- package/dist/commands/config-command.js +111 -0
- package/dist/commands/config-command.js.map +1 -0
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +4 -1
- package/dist/commands/help-command.js.map +1 -1
- package/dist/glmt/glmt-proxy.d.ts +6 -0
- package/dist/glmt/glmt-proxy.d.ts.map +1 -1
- package/dist/glmt/glmt-proxy.js +23 -2
- package/dist/glmt/glmt-proxy.js.map +1 -1
- package/dist/management/doctor.d.ts.map +1 -1
- package/dist/management/doctor.js +19 -7
- package/dist/management/doctor.js.map +1 -1
- package/dist/ui/assets/form-utils-CE1K85pW.js +20 -0
- package/dist/ui/assets/icons-DJoMkiyK.js +1 -0
- package/dist/ui/assets/index-BxRTPSHw.js +9 -0
- package/dist/ui/assets/index-ks0hk5dc.css +1 -0
- package/dist/ui/assets/radix-ui-Ba6LUgyw.js +51 -0
- package/dist/ui/assets/react-vendor-CW-MU7-e.js +3 -0
- package/dist/ui/assets/tanstack-MD0629v8.js +4 -0
- package/dist/ui/favicon.ico +0 -0
- package/dist/ui/favicons/android-chrome-192x192.png +0 -0
- package/dist/ui/favicons/android-chrome-512x512.png +0 -0
- package/dist/ui/favicons/android-chrome-512x512.webp +0 -0
- package/dist/ui/favicons/apple-touch-icon.png +0 -0
- package/dist/ui/favicons/favicon-16x16.png +0 -0
- package/dist/ui/favicons/favicon-32x32.png +0 -0
- package/dist/ui/favicons/favicon.ico +0 -0
- package/dist/ui/index.html +30 -0
- package/dist/ui/logo/ccs-logo-256.png +0 -0
- package/dist/ui/logo/ccs-logo-zoomed-web.png +0 -0
- package/dist/ui/logo/ccs-social-media.png +0 -0
- package/dist/ui/logo/ccs-social-media.webp +0 -0
- package/dist/utils/port-utils.d.ts +19 -0
- package/dist/utils/port-utils.d.ts.map +1 -0
- package/dist/utils/port-utils.js +113 -0
- package/dist/utils/port-utils.js.map +1 -0
- package/dist/web-server/file-watcher.d.ts +15 -0
- package/dist/web-server/file-watcher.d.ts.map +1 -0
- package/dist/web-server/file-watcher.js +88 -0
- package/dist/web-server/file-watcher.js.map +1 -0
- package/dist/web-server/health-service.d.ts +35 -0
- package/dist/web-server/health-service.d.ts.map +1 -0
- package/dist/web-server/health-service.js +223 -0
- package/dist/web-server/health-service.js.map +1 -0
- package/dist/web-server/index.d.ts +25 -0
- package/dist/web-server/index.d.ts.map +1 -0
- package/dist/web-server/index.js +89 -0
- package/dist/web-server/index.js.map +1 -0
- package/dist/web-server/overview-routes.d.ts +7 -0
- package/dist/web-server/overview-routes.d.ts.map +1 -0
- package/dist/web-server/overview-routes.js +80 -0
- package/dist/web-server/overview-routes.js.map +1 -0
- package/dist/web-server/routes.d.ts +7 -0
- package/dist/web-server/routes.d.ts.map +1 -0
- package/dist/web-server/routes.js +444 -0
- package/dist/web-server/routes.js.map +1 -0
- package/dist/web-server/shared-routes.d.ts +7 -0
- package/dist/web-server/shared-routes.d.ts.map +1 -0
- package/dist/web-server/shared-routes.js +167 -0
- package/dist/web-server/shared-routes.js.map +1 -0
- package/dist/web-server/shutdown.d.ts +14 -0
- package/dist/web-server/shutdown.d.ts.map +1 -0
- package/dist/web-server/shutdown.js +36 -0
- package/dist/web-server/shutdown.js.map +1 -0
- package/dist/web-server/websocket.d.ts +14 -0
- package/dist/web-server/websocket.d.ts.map +1 -0
- package/dist/web-server/websocket.js +82 -0
- package/dist/web-server/websocket.js.map +1 -0
- package/package.json +26 -6
- package/scripts/clean-dist.js +46 -0
- package/scripts/completion/ccs.bash +69 -10
- package/scripts/completion/ccs.fish +128 -47
- package/scripts/completion/ccs.ps1 +179 -14
- package/scripts/completion/ccs.zsh +107 -28
- package/scripts/pre-release.sh +39 -0
- package/scripts/verify-bundle.js +49 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Health Check Service (Phase 06)
|
|
4
|
+
*
|
|
5
|
+
* Runs health checks for CCS dashboard: Claude CLI, config files, CLIProxy binary.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
24
|
+
if (mod && mod.__esModule) return mod;
|
|
25
|
+
var result = {};
|
|
26
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
27
|
+
__setModuleDefault(result, mod);
|
|
28
|
+
return result;
|
|
29
|
+
};
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.fixHealthIssue = exports.runHealthChecks = void 0;
|
|
32
|
+
const fs = __importStar(require("fs"));
|
|
33
|
+
const path = __importStar(require("path"));
|
|
34
|
+
const child_process_1 = require("child_process");
|
|
35
|
+
const config_manager_1 = require("../utils/config-manager");
|
|
36
|
+
const cliproxy_1 = require("../cliproxy");
|
|
37
|
+
/**
|
|
38
|
+
* Run all health checks and return report
|
|
39
|
+
*/
|
|
40
|
+
function runHealthChecks() {
|
|
41
|
+
const checks = [];
|
|
42
|
+
// Check 1: Claude CLI
|
|
43
|
+
checks.push(checkClaudeCli());
|
|
44
|
+
// Check 2: Config file
|
|
45
|
+
checks.push(checkConfigFile());
|
|
46
|
+
// Check 3: Profiles file
|
|
47
|
+
checks.push(checkProfilesFile());
|
|
48
|
+
// Check 4: CLIProxy binary
|
|
49
|
+
checks.push(checkCliproxy());
|
|
50
|
+
// Check 5: CCS directory
|
|
51
|
+
checks.push(checkCcsDirectory());
|
|
52
|
+
// Calculate summary
|
|
53
|
+
const summary = {
|
|
54
|
+
total: checks.length,
|
|
55
|
+
passed: checks.filter((c) => c.status === 'ok').length,
|
|
56
|
+
warnings: checks.filter((c) => c.status === 'warning').length,
|
|
57
|
+
errors: checks.filter((c) => c.status === 'error').length,
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
timestamp: Date.now(),
|
|
61
|
+
checks,
|
|
62
|
+
summary,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
exports.runHealthChecks = runHealthChecks;
|
|
66
|
+
function checkClaudeCli() {
|
|
67
|
+
try {
|
|
68
|
+
const version = (0, child_process_1.execSync)('claude --version', {
|
|
69
|
+
encoding: 'utf8',
|
|
70
|
+
timeout: 5000,
|
|
71
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
72
|
+
}).trim();
|
|
73
|
+
return {
|
|
74
|
+
id: 'claude-cli',
|
|
75
|
+
name: 'Claude CLI',
|
|
76
|
+
status: 'ok',
|
|
77
|
+
message: `Installed: ${version}`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return {
|
|
82
|
+
id: 'claude-cli',
|
|
83
|
+
name: 'Claude CLI',
|
|
84
|
+
status: 'error',
|
|
85
|
+
message: 'Not found in PATH',
|
|
86
|
+
details: 'Install: npm install -g @anthropic-ai/claude-code',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function checkConfigFile() {
|
|
91
|
+
const configPath = (0, config_manager_1.getConfigPath)();
|
|
92
|
+
if (!fs.existsSync(configPath)) {
|
|
93
|
+
return {
|
|
94
|
+
id: 'config-file',
|
|
95
|
+
name: 'Config File',
|
|
96
|
+
status: 'warning',
|
|
97
|
+
message: 'Not found',
|
|
98
|
+
details: configPath,
|
|
99
|
+
fixable: true,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
const content = fs.readFileSync(configPath, 'utf8');
|
|
104
|
+
JSON.parse(content);
|
|
105
|
+
return {
|
|
106
|
+
id: 'config-file',
|
|
107
|
+
name: 'Config File',
|
|
108
|
+
status: 'ok',
|
|
109
|
+
message: 'Valid JSON',
|
|
110
|
+
details: configPath,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return {
|
|
115
|
+
id: 'config-file',
|
|
116
|
+
name: 'Config File',
|
|
117
|
+
status: 'error',
|
|
118
|
+
message: 'Invalid JSON',
|
|
119
|
+
details: configPath,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function checkProfilesFile() {
|
|
124
|
+
const ccsDir = (0, config_manager_1.getCcsDir)();
|
|
125
|
+
const profilesPath = path.join(ccsDir, 'profiles.json');
|
|
126
|
+
if (!fs.existsSync(profilesPath)) {
|
|
127
|
+
return {
|
|
128
|
+
id: 'profiles-file',
|
|
129
|
+
name: 'Profiles Registry',
|
|
130
|
+
status: 'warning',
|
|
131
|
+
message: 'Not found (will be created on first account)',
|
|
132
|
+
details: profilesPath,
|
|
133
|
+
fixable: true,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
const content = fs.readFileSync(profilesPath, 'utf8');
|
|
138
|
+
JSON.parse(content);
|
|
139
|
+
return {
|
|
140
|
+
id: 'profiles-file',
|
|
141
|
+
name: 'Profiles Registry',
|
|
142
|
+
status: 'ok',
|
|
143
|
+
message: 'Valid',
|
|
144
|
+
details: profilesPath,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return {
|
|
149
|
+
id: 'profiles-file',
|
|
150
|
+
name: 'Profiles Registry',
|
|
151
|
+
status: 'error',
|
|
152
|
+
message: 'Invalid JSON',
|
|
153
|
+
details: profilesPath,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function checkCliproxy() {
|
|
158
|
+
if ((0, cliproxy_1.isCLIProxyInstalled)()) {
|
|
159
|
+
const version = (0, cliproxy_1.getInstalledCliproxyVersion)();
|
|
160
|
+
const binaryPath = (0, cliproxy_1.getCLIProxyPath)();
|
|
161
|
+
return {
|
|
162
|
+
id: 'cliproxy',
|
|
163
|
+
name: 'CLIProxy',
|
|
164
|
+
status: 'ok',
|
|
165
|
+
message: `Installed: ${version}`,
|
|
166
|
+
details: binaryPath,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
id: 'cliproxy',
|
|
171
|
+
name: 'CLIProxy',
|
|
172
|
+
status: 'warning',
|
|
173
|
+
message: 'Not installed (optional)',
|
|
174
|
+
details: 'Required for gemini/codex/agy providers. Install: ccs cliproxy --latest',
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function checkCcsDirectory() {
|
|
178
|
+
const ccsDir = (0, config_manager_1.getCcsDir)();
|
|
179
|
+
if (!fs.existsSync(ccsDir)) {
|
|
180
|
+
return {
|
|
181
|
+
id: 'ccs-dir',
|
|
182
|
+
name: 'CCS Directory',
|
|
183
|
+
status: 'warning',
|
|
184
|
+
message: 'Not found',
|
|
185
|
+
details: ccsDir,
|
|
186
|
+
fixable: true,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
id: 'ccs-dir',
|
|
191
|
+
name: 'CCS Directory',
|
|
192
|
+
status: 'ok',
|
|
193
|
+
message: 'Exists',
|
|
194
|
+
details: ccsDir,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Fix a health issue by its check ID
|
|
199
|
+
*/
|
|
200
|
+
function fixHealthIssue(checkId) {
|
|
201
|
+
const ccsDir = (0, config_manager_1.getCcsDir)();
|
|
202
|
+
switch (checkId) {
|
|
203
|
+
case 'ccs-dir':
|
|
204
|
+
fs.mkdirSync(ccsDir, { recursive: true });
|
|
205
|
+
return { success: true, message: 'Created ~/.ccs directory' };
|
|
206
|
+
case 'config-file': {
|
|
207
|
+
const configPath = (0, config_manager_1.getConfigPath)();
|
|
208
|
+
fs.mkdirSync(path.dirname(configPath), { recursive: true });
|
|
209
|
+
fs.writeFileSync(configPath, JSON.stringify({ profiles: {} }, null, 2) + '\n');
|
|
210
|
+
return { success: true, message: 'Created config.json' };
|
|
211
|
+
}
|
|
212
|
+
case 'profiles-file': {
|
|
213
|
+
const profilesPath = path.join(ccsDir, 'profiles.json');
|
|
214
|
+
fs.mkdirSync(ccsDir, { recursive: true });
|
|
215
|
+
fs.writeFileSync(profilesPath, JSON.stringify({ profiles: {} }, null, 2) + '\n');
|
|
216
|
+
return { success: true, message: 'Created profiles.json' };
|
|
217
|
+
}
|
|
218
|
+
default:
|
|
219
|
+
return { success: false, message: 'Cannot auto-fix this issue' };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
exports.fixHealthIssue = fixHealthIssue;
|
|
223
|
+
//# sourceMappingURL=health-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-service.js","sourceRoot":"","sources":["../../src/web-server/health-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CCS Config Dashboard - Web Server
|
|
3
|
+
*
|
|
4
|
+
* Express server with WebSocket support for real-time config management.
|
|
5
|
+
* Single HTTP server handles REST API, static files, and WebSocket connections.
|
|
6
|
+
* In dev mode, integrates Vite for HMR.
|
|
7
|
+
*/
|
|
8
|
+
/// <reference types="node" />
|
|
9
|
+
import http from 'http';
|
|
10
|
+
import { WebSocketServer } from 'ws';
|
|
11
|
+
export interface ServerOptions {
|
|
12
|
+
port: number;
|
|
13
|
+
staticDir?: string;
|
|
14
|
+
dev?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface ServerInstance {
|
|
17
|
+
server: http.Server;
|
|
18
|
+
wss: WebSocketServer;
|
|
19
|
+
cleanup: () => void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Start Express server with WebSocket support
|
|
23
|
+
*/
|
|
24
|
+
export declare function startServer(options: ServerOptions): Promise<ServerInstance>;
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web-server/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;;AAGH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAGrC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,GAAG,EAAE,eAAe,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAiDjF"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CCS Config Dashboard - Web Server
|
|
4
|
+
*
|
|
5
|
+
* Express server with WebSocket support for real-time config management.
|
|
6
|
+
* Single HTTP server handles REST API, static files, and WebSocket connections.
|
|
7
|
+
* In dev mode, integrates Vite for HMR.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
26
|
+
if (mod && mod.__esModule) return mod;
|
|
27
|
+
var result = {};
|
|
28
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
29
|
+
__setModuleDefault(result, mod);
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
33
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
34
|
+
};
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.startServer = void 0;
|
|
37
|
+
const express_1 = __importDefault(require("express"));
|
|
38
|
+
const http_1 = __importDefault(require("http"));
|
|
39
|
+
const path_1 = __importDefault(require("path"));
|
|
40
|
+
const ws_1 = require("ws");
|
|
41
|
+
const websocket_1 = require("./websocket");
|
|
42
|
+
/**
|
|
43
|
+
* Start Express server with WebSocket support
|
|
44
|
+
*/
|
|
45
|
+
async function startServer(options) {
|
|
46
|
+
const app = (0, express_1.default)();
|
|
47
|
+
const server = http_1.default.createServer(app);
|
|
48
|
+
const wss = new ws_1.WebSocketServer({ server });
|
|
49
|
+
// JSON body parsing
|
|
50
|
+
app.use(express_1.default.json());
|
|
51
|
+
// REST API routes (Phase 03)
|
|
52
|
+
const { apiRoutes } = await Promise.resolve().then(() => __importStar(require('./routes')));
|
|
53
|
+
app.use('/api', apiRoutes);
|
|
54
|
+
// Shared data routes (Phase 07)
|
|
55
|
+
const { sharedRoutes } = await Promise.resolve().then(() => __importStar(require('./shared-routes')));
|
|
56
|
+
app.use('/api/shared', sharedRoutes);
|
|
57
|
+
// Overview routes (Phase 07)
|
|
58
|
+
const { overviewRoutes } = await Promise.resolve().then(() => __importStar(require('./overview-routes')));
|
|
59
|
+
app.use('/api/overview', overviewRoutes);
|
|
60
|
+
// Dev mode: use Vite middleware for HMR
|
|
61
|
+
if (options.dev) {
|
|
62
|
+
const { createServer: createViteServer } = await Promise.resolve().then(() => __importStar(require('vite')));
|
|
63
|
+
const vite = await createViteServer({
|
|
64
|
+
root: path_1.default.join(__dirname, '../../ui'),
|
|
65
|
+
server: { middlewareMode: true },
|
|
66
|
+
appType: 'spa',
|
|
67
|
+
});
|
|
68
|
+
app.use(vite.middlewares);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
// Production: serve static files from dist/ui/
|
|
72
|
+
const staticDir = options.staticDir || path_1.default.join(__dirname, '../ui');
|
|
73
|
+
app.use(express_1.default.static(staticDir));
|
|
74
|
+
// SPA fallback - return index.html for all non-API routes
|
|
75
|
+
app.get('*', (_req, res) => {
|
|
76
|
+
res.sendFile(path_1.default.join(staticDir, 'index.html'));
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// WebSocket connection handler + file watcher
|
|
80
|
+
const { cleanup } = (0, websocket_1.setupWebSocket)(wss);
|
|
81
|
+
// Start listening
|
|
82
|
+
return new Promise((resolve) => {
|
|
83
|
+
server.listen(options.port, () => {
|
|
84
|
+
resolve({ server, wss, cleanup });
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
exports.startServer = startServer;
|
|
89
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web-server/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,sDAA8B;AAC9B,gDAAwB;AACxB,gDAAwB;AACxB,2BAAqC;AACrC,2CAA6C;AAc7C;;GAEG;AACI,KAAK,UAAU,WAAW,CAAC,OAAsB;IACtD,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IACtB,MAAM,MAAM,GAAG,cAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,oBAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE5C,oBAAoB;IACpB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,6BAA6B;IAC7B,MAAM,EAAE,SAAS,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;IAC/C,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAE3B,gCAAgC;IAChC,MAAM,EAAE,YAAY,EAAE,GAAG,wDAAa,iBAAiB,GAAC,CAAC;IACzD,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAErC,6BAA6B;IAC7B,MAAM,EAAE,cAAc,EAAE,GAAG,wDAAa,mBAAmB,GAAC,CAAC;IAC7D,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAEzC,wCAAwC;IACxC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,wDAAa,MAAM,GAAC,CAAC;QAChE,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;YAClC,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;YACtC,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;YAChC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,+CAA+C;QAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACrE,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAEnC,0DAA0D;QAC1D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACzB,GAAG,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,8CAA8C;IAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,0BAAc,EAAC,GAAG,CAAC,CAAC;IAExC,kBAAkB;IAClB,OAAO,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,EAAE;QAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE;YAC/B,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAjDD,kCAiDC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview-routes.d.ts","sourceRoot":"","sources":["../../src/web-server/overview-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,eAAO,MAAM,cAAc,4CAAW,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Overview Routes (Phase 07)
|
|
4
|
+
*
|
|
5
|
+
* Dashboard overview API for counts and health summary.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
24
|
+
if (mod && mod.__esModule) return mod;
|
|
25
|
+
var result = {};
|
|
26
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
27
|
+
__setModuleDefault(result, mod);
|
|
28
|
+
return result;
|
|
29
|
+
};
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.overviewRoutes = void 0;
|
|
32
|
+
const express_1 = require("express");
|
|
33
|
+
const fs = __importStar(require("fs"));
|
|
34
|
+
const path = __importStar(require("path"));
|
|
35
|
+
const config_manager_1 = require("../utils/config-manager");
|
|
36
|
+
const health_service_1 = require("./health-service");
|
|
37
|
+
exports.overviewRoutes = (0, express_1.Router)();
|
|
38
|
+
/**
|
|
39
|
+
* GET /api/overview
|
|
40
|
+
*/
|
|
41
|
+
exports.overviewRoutes.get('/', (_req, res) => {
|
|
42
|
+
try {
|
|
43
|
+
const config = (0, config_manager_1.loadConfig)();
|
|
44
|
+
const profileCount = Object.keys(config.profiles).length;
|
|
45
|
+
const cliproxyCount = Object.keys(config.cliproxy || {}).length;
|
|
46
|
+
// Get quick health summary
|
|
47
|
+
const health = (0, health_service_1.runHealthChecks)();
|
|
48
|
+
res.json({
|
|
49
|
+
profiles: profileCount,
|
|
50
|
+
cliproxy: cliproxyCount,
|
|
51
|
+
accounts: getAccountCount(),
|
|
52
|
+
health: {
|
|
53
|
+
status: health.summary.errors > 0 ? 'error' : health.summary.warnings > 0 ? 'warning' : 'ok',
|
|
54
|
+
passed: health.summary.passed,
|
|
55
|
+
total: health.summary.total,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
res.json({
|
|
61
|
+
profiles: 0,
|
|
62
|
+
cliproxy: 0,
|
|
63
|
+
accounts: 0,
|
|
64
|
+
health: { status: 'error', passed: 0, total: 0 },
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
function getAccountCount() {
|
|
69
|
+
try {
|
|
70
|
+
const profilesPath = path.join((0, config_manager_1.getCcsDir)(), 'profiles.json');
|
|
71
|
+
if (!fs.existsSync(profilesPath))
|
|
72
|
+
return 0;
|
|
73
|
+
const data = JSON.parse(fs.readFileSync(profilesPath, 'utf8'));
|
|
74
|
+
return Object.keys(data.profiles || {}).length;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=overview-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview-routes.js","sourceRoot":"","sources":["../../src/web-server/overview-routes.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,qCAAoD;AACpD,uCAAyB;AACzB,2CAA6B;AAC7B,4DAAgE;AAChE,qDAAmD;AAEtC,QAAA,cAAc,GAAG,IAAA,gBAAM,GAAE,CAAC;AAEvC;;GAEG;AACH,sBAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,2BAAU,GAAE,CAAC;QAE5B,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QACzD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAEhE,2BAA2B;QAC3B,MAAM,MAAM,GAAG,IAAA,gCAAe,GAAE,CAAC;QAEjC,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,aAAa;YACvB,QAAQ,EAAE,eAAe,EAAE;YAC3B,MAAM,EAAE;gBACN,MAAM,EACJ,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;gBACtF,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;gBAC7B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;aAC5B;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;SACjD,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAA,0BAAS,GAAE,EAAE,eAAe,CAAC,CAAC;QAE7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO,CAAC,CAAC;QAE3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/web-server/routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,eAAO,MAAM,SAAS,4CAAW,CAAC"}
|